Minimalistic API Example
[FromServices] ILocalization localization binds localization from dependency injection.
WebApplicationBuilder builder = WebApplication.CreateBuilder();
builder.Services
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationEmbeddedResourceProviderDefault()
.AddAvalancheLocalizationResourceManagerProvider()
.AddAvalancheLocalizationAspSupport()
.AddAvalancheStringLocalizer()
.Configure<Microsoft.Extensions.Localization.LocalizationOptions>(options =>
{
options.ResourcesPath = null!;
})
.Configure<RequestLocalizationOptions>(options =>
{
options.AddSupportedCultures("en", "fi", "sv", "fr");
options.AddSupportedUICultures("en", "fi", "sv", "fr");
options.SetDefaultCulture("fi");
options.FallBackToParentCultures = true;
options.FallBackToParentUICultures = true;
});
WebApplication app = builder.Build();
// Workaround to known issue:
// Flushes cache if Assembly is loaded later. Late loaded assembly may supply localization lines that have already been queried and cached.
// This issue will be fixed properly later.
AppDomain.CurrentDomain.AssemblyLoad += (object? sender, AssemblyLoadEventArgs args) =>
(app.Services.GetRequiredService<ILocalization>() as ICached)?.InvalidateCache(true);
RequestLocalizationOptions localizationOptions = app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(localizationOptions);
app.MapGet("/", ([FromServices] ILocalization localization) =>
{
ILocalizableText text = localization.LocalizableTextCached["Namespace.Apples"];
ILocalizedText localizedText = text.Localize(CultureInfo.CurrentUICulture.Name)!.Value;
DisplayText displayText = new DisplayText(localizedText.Culture, localizedText.Text);
Equipment equipment = new Equipment { DisplayText = displayText };
return Results.Ok(equipment);
});
// "{"text":{"locale":"fi","text":"Sinulla on {0} omenaa."}}"
public record Equipment
{
public DisplayText DisplayText { get; set; } = null!;
}
public record DisplayText(string Locale, String Text);
Full example
using System.Collections;
using System.Globalization;
using System.Resources;
using Avalanche.Localization;
using Avalanche.Localization.Pluralization;
using Avalanche.Template;
using Avalanche.Utilities;
using Avalanche.Utilities.Provider;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using static System.Console;
class aspnet_minapi
{
public static void Run()
{
{
// <01>
WebApplicationBuilder builder = WebApplication.CreateBuilder();
builder.Services
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationEmbeddedResourceProviderDefault()
.AddAvalancheLocalizationResourceManagerProvider()
.AddAvalancheLocalizationAspSupport()
.AddAvalancheStringLocalizer()
.Configure<Microsoft.Extensions.Localization.LocalizationOptions>(options =>
{
options.ResourcesPath = null!;
})
.Configure<RequestLocalizationOptions>(options =>
{
options.AddSupportedCultures("en", "fi", "sv", "fr");
options.AddSupportedUICultures("en", "fi", "sv", "fr");
options.SetDefaultCulture("fi");
options.FallBackToParentCultures = true;
options.FallBackToParentUICultures = true;
});
WebApplication app = builder.Build();
// Workaround to known issue:
// Flushes cache if Assembly is loaded later. Late loaded assembly may supply localization lines that have already been queried and cached.
// This issue will be fixed properly later.
AppDomain.CurrentDomain.AssemblyLoad += (object? sender, AssemblyLoadEventArgs args) =>
(app.Services.GetRequiredService<ILocalization>() as ICached)?.InvalidateCache(true);
RequestLocalizationOptions localizationOptions = app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(localizationOptions);
app.MapGet("/", ([FromServices] ILocalization localization) =>
{
ILocalizableText text = localization.LocalizableTextCached["Namespace.Apples"];
ILocalizedText localizedText = text.Localize(CultureInfo.CurrentUICulture.Name)!.Value;
DisplayText displayText = new DisplayText(localizedText.Culture, localizedText.Text);
Equipment equipment = new Equipment { DisplayText = displayText };
return Results.Ok(equipment);
});
// "{"text":{"locale":"fi","text":"Sinulla on {0} omenaa."}}"
// </01>
// Shutdown in 5 seconds ...
Task.Run(async () => {
await Task.Delay(5000);
app.Services.GetService<IHostApplicationLifetime>()!.StopApplication();
});
app.Run();
}
}
// <99>
public record Equipment
{
public DisplayText DisplayText { get; set; } = null!;
}
public record DisplayText(string Locale, String Text);
// </99>
}