Avalanche.Localization.IFileLocalizer
IFileLocalizer localizes file resources.
/// <summary>Text localizer</summary>
public interface IFileLocalizer : ILocalizer<ILocalizationFile[]> { }
/// <summary>Text localizer</summary>
public interface IFileLocalizer<Namespace> : IFileLocalizer, ILocalizer<ILocalizationFile[], Namespace> { }
/// <summary>Text localizer</summary>
public interface IFileLocalizer<Namespace, CultureProvider> : IFileLocalizer<Namespace>, ILocalizer<ILocalizationFile[], Namespace, CultureProvider> where CultureProvider : ICultureProvider { }
IFileLocalizer service returns file resources for full keys. It uses active culture from Thread.CurrentThread.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["Namespace.Apples.logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
IFileLocalizer<Namespace> uses key that is concatenation of "Namespace.Name". Full type name is used, but unlike with IStringLocalizer, the key is not prefixed with assembly name and resource name from IOptions<LocalizationOptions>.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer<Namespace.Apples>>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
IFileLocalizer<Namespace, CultureProvider> uses active culture from CultureProvider type. It must implement ICultureProvider, and must have a parameterless constructor or have a ServiceDescriptor.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer<Namespace.Apples, CultureProvider.CurrentCulture>>()!;
// Assign active culture to "fi"
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
ICultureProvider can be added to service collection to override the default CultureProvider.CurrentThread.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ICultureProvider), CultureProvider.CurrentCulture.Instance)
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer>()!;
// Assign active culture to "fi"
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["Namespace.Apples.logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
ILogger service is notified on unsuccessful localization.
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddLogging(loggingBuilder => loggingBuilder.SetMinimumLevel(LogLevel.Trace).AddConsole());
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Try get non-existent file
var file = fileLocalizer["NonExistent"];
dbug: Avalanche.Localization.FileLocalizer[-1599422402] Localization file was not found: Key=NonExistent, Culture=fi
ILocalizer
/// <summary>Base interface for localizer.</summary>
public interface ILocalizer
{
/// <summary>Namespace prefix</summary>
string? Namespace { get; set; }
/// <summary>Resource Type</summary>
Type ResourceType { get; }
/// <summary>Applicable actice culture provider</summary>
ICultureProvider CultureProvider { get; set; }
/// <summary>
/// Get localized resource for <paramref name="name"/>.
///
/// If <see cref="ILocalizer.Namespace"/> or <paramref name="name"/> is null, then counter part is used as key without separator '.'.
/// </summary>
ILocalized? this[string? name] { get; }
}
/// <summary><typeparamref name="T"/> localizer.</summary>
/// <typeparam name="T">Resource type</typeparam>
public interface ILocalizer<out T> : ILocalizer
{
/// <summary>
/// Get localized resource for <paramref name="name"/>.
///
/// If <see cref="ILocalizer.Namespace"/> or <paramref name="name"/> is null, then counter part is used as key without separator '.'.
/// </summary>
new ILocalized<T>? this[string? name] { get; }
}
/// <summary><typeparamref name="T"/> for <typeparamref name="Namespace"/>.</summary>
/// <typeparam name="T">Resource type</typeparam>
/// <typeparam name="Namespace">Key namespace</typeparam>
public interface ILocalizer<T, Namespace> : ILocalizer<T> { }
/// <summary><typeparamref name="T"/> localizer for <typeparamref name="Namespace"/> using <typeparamref name="CultureProvider"/>.</summary>
/// <remarks>This interfaces is typically used with dependency injection.</remarks>
/// <typeparam name="T">Resource type</typeparam>
/// <typeparam name="Namespace">Key namespace</typeparam>
/// <typeparam name="CultureProvider">Culture provider type. Type must have a parameterless constructor.</typeparam>
public interface ILocalizer<T, Namespace, CultureProvider> : ILocalizer<T, Namespace> where CultureProvider : ICultureProvider { }
Full Example
Full example
using System.Globalization;
using Avalanche.Localization;
using Avalanche.Utilities;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
using static System.Console;
class filelocalizer
{
public static void Run()
{
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en");
{
// <01>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["Namespace.Apples.logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
// </01>
}
{
// <02>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer<Namespace.Apples>>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
// </02>
}
{
// <03>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer<Namespace.Apples, CultureProvider.CurrentCulture>>()!;
// Assign active culture to "fi"
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
// </03>
}
{
// <04>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddSingleton(typeof(ICultureProvider), CultureProvider.CurrentCulture.Instance)
.AddSingleton(typeof(ILocalizationFilePatterns), new LocalizationFilePatterns("filelocalizer/{Key}", "filelocalizer/{Culture}/{Key}"));
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer>()!;
// Assign active culture to "fi"
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Get file "filelocalizer/fi/Namespace.Apples.logo.svg" or "filelocalizer/Namespace.Apples.logo.svg"
ILocalizationFile file = fileLocalizer["Namespace.Apples.logo"]?.Value[0]!;
// Print filename
WriteLine(file.FileName); // "filelocalizer/fi/Namespace.Apples.logo.svg"
// Read file
byte[] data = file.ReadFully();
// </04>
}
{
// <05>
// Add service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheLocalizationService()
.AddAvalancheLocalizationFileSystemApplicationRoot()
.AddLogging(loggingBuilder => loggingBuilder.SetMinimumLevel(LogLevel.Trace).AddConsole());
// Build service
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get file localizer (Uses Thread.CurrentThread.CurrentUICulture)
IFileLocalizer fileLocalizer = service.GetService<IFileLocalizer>()!;
// Assign active culture to "fi"
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fi");
// Try get non-existent file
var file = fileLocalizer["NonExistent"];
// </05>
}
}
}