Microsoft.Extensions.Localization
.AddAvalancheStringLocalizer() adds support for IStringLocalizer, IStringLocalizer<T>, and IStringLocalizerFactory services.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddAvalancheStringLocalizer()
.AddSingleton<IProvider<string, string[]>>(FallbackCultureProvider.En);
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
Note
Do not use together with Microsoft's .AddLocalization(), which adds different service implementations for for IStringLocalizer, IStringLocalizer<T>, and IStringLocalizerFactory services.
IStringLocalizer<T> service queries ILocalization for keys with namespace "Assembly[.Resources].Namespace.Key". Thread.CurrentThread.CurrentUICulture is used as active culture.
// Get string localizer for key "Assembly[.Resources].Namespace.Type."
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print a string for "docs.Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "Sinulla on 2 omenaa."
IStringLocalizer.GetAllStrings(includeParentCultures) returns strings for that service. This excludes the localization.FallbackCultureProvider policy, but uses CultureInfo.Parent if available.
// Get string localizer for key "Assembly[.Resources].Namespace.".
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print all strings for "docs.Namespace." for "" culture.
foreach (var line in stringLocalizer.GetAllStrings(includeParentCultures: true)) WriteLine($"{line.Name} = {line.Value}");
IStringLocalizerFactory.Create(resourcePath, namespace) creates string localizer.
// Get string localizer factory
IStringLocalizerFactory stringLocalizerFactory = service.GetService<IStringLocalizerFactory>()!;
// Assign active culture to ""
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
// Create string localizer for key "Namespace".
IStringLocalizer stringLocalizer = stringLocalizerFactory.Create("", "docs.Namespace.Apples");
// Print a string for "Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "You've got 2 apples."
IOptions<Microsoft.Extensions.Localization.LocalizationOptions> modifies the key IStringLocalizer, IViewLocalizer and IHtmlLocalizer query for as "Assembly[.Resources].Namespace.Key".
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddAvalancheStringLocalizer()
.Configure<Microsoft.Extensions.Localization.LocalizationOptions>(a => a.ResourcesPath = "Resources");
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get string localizer for key "Assembly.Resources.Namespace.Type."
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to ""
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print a string for "docs.Resources.Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "Sinulla on 2 omenaa."
Note
.AddAvalancheLocalizationResourceManagerProvider() adds providers that read resources from ResourceManagers.
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddAvalancheLocalizationResourceManagerProvider()
.AddAvalancheStringLocalizer()
.Configure<Microsoft.Extensions.Localization.LocalizationOptions>(a => a.ResourcesPath = "Resources");
ILogger service is notified on unsuccessful localization.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddLogging(loggingBuilder => loggingBuilder.SetMinimumLevel(LogLevel.Trace).AddConsole())
.AddAvalancheStringLocalizer();
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get string localizer
IStringLocalizer stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Try get non-existent string
var text = stringLocalizer["NonExistent"];
dbug: Avalanche.Localization.Internal.DI.StringLocalizer[-1599422402] Localization file was not found: Key=NonExistent, Culture=fi
Warning
IStringLocalizer support is experimental.
Full Example
Full example
using System.Globalization;
using Avalanche.Localization;
using Avalanche.Utilities.Provider;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using static System.Console;
class microsoft_extensions_localization
{
public static void Run()
{
{
// <01>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddAvalancheStringLocalizer()
.AddSingleton<IProvider<string, string[]>>(FallbackCultureProvider.En);
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// </01>
{
// <02>
// Get string localizer for key "Assembly[.Resources].Namespace.Type."
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print a string for "docs.Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "Sinulla on 2 omenaa."
// </02>
}
{
// <03>
// Get string localizer for key "Assembly[.Resources].Namespace.".
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print all strings for "docs.Namespace." for "" culture.
foreach (var line in stringLocalizer.GetAllStrings(includeParentCultures: true)) WriteLine($"{line.Name} = {line.Value}");
// </03>
}
{
// <04>
// Get string localizer factory
IStringLocalizerFactory stringLocalizerFactory = service.GetService<IStringLocalizerFactory>()!;
// Assign active culture to ""
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
// Create string localizer for key "Namespace".
IStringLocalizer stringLocalizer = stringLocalizerFactory.Create("", "docs.Namespace.Apples");
// Print a string for "Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "You've got 2 apples."
// </04>
}
}
{
// <05>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddAvalancheStringLocalizer()
.Configure<Microsoft.Extensions.Localization.LocalizationOptions>(a => a.ResourcesPath = "Resources");
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get string localizer for key "Assembly.Resources.Namespace.Type."
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to ""
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print a string for "docs.Resources.Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "Sinulla on 2 omenaa."
// </05>
}
{
// Add service descriptors
// <06>
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddAvalancheLocalizationResourceManagerProvider()
.AddAvalancheStringLocalizer()
.Configure<Microsoft.Extensions.Localization.LocalizationOptions>(a => a.ResourcesPath = "Resources");
// </06>
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get string localizer for key "Assembly.Resources.Namespace.Type."
IStringLocalizer<Namespace.Apples> stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Assign active culture to ""
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fi");
// Print a string for "docs.Resources.Namespace.Apples.Count"
WriteLine(stringLocalizer["Count", 2]); // "Sinulla on 2 omenaa."
}
{
// <07>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddLogging(loggingBuilder => loggingBuilder.SetMinimumLevel(LogLevel.Trace).AddConsole())
.AddAvalancheStringLocalizer();
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get string localizer
IStringLocalizer stringLocalizer = service.GetService<IStringLocalizer<Namespace.Apples>>()!;
// Try get non-existent string
var text = stringLocalizer["NonExistent"];
// </07>
// Get string localizer
stringLocalizer = service.GetService<IStringLocalizer>()!;
// Try get non-existent string
text = stringLocalizer["NonExistent"];
}
}
}