Ms.DependencyInjection
Microsoft has introduced an abstraction to dependency injection in the NuGet package Microsoft.Extensions.DependencyInjection.Abstractions.
The extension method IServiceCollection.AddLexicalLocalization(addStringLocalizerService, addCulturePolicyService, useGlobalInstance, addCache) that adds various localization service implementations. The following services are added:
- ILineRoot. If useGlobalInstance is true, then the root is global static.
- ILine<T>
- IAssetBuilder
- ICulturePolicy, if addCulturePolicyService is set to true.
- IStringLocalizerFactory and IStringLocalizer<T>, if addStringLocalizerService is set to true.
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Configure to use CultureInfo.CurrentUICulture
serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());
// Add localization services: ILineRoot, ILine<T>, IAssetBuilder, ICulturePolicy
serviceCollection.AddLexicalLocalization(
addStringLocalizerService: false,
addCulturePolicyService: false,
useGlobalInstance: false,
addCache: false);
Assets are contributed to the service provider by adding IAssetSources.
// Create localization source
var lines = new List<ILine> {
LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!")
};
// Create asset source
IAssetSource assetSource = new StringAsset(lines).ToSource();
// Add asset source
serviceCollection.AddSingleton<IAssetSource>(assetSource);
Asset, root and keys can be acquired from the service provider.
// Build service provider
using (var serviceProvider = serviceCollection.BuildServiceProvider())
{
// Service can provide the asset
IAsset asset = serviceProvider.GetService<IAsset>();
// Service can provide root
ILineRoot root = serviceProvider.GetService<ILineRoot>();
// Service can provide type key
ILine typeKey = serviceProvider.GetService<ILine<ConsoleApp1.MyController>>();
// Get "Hello World!"
string str = typeKey.Key("Hello").Culture("en").ToString();
}
Example full code.
using Lexical.Localization;
using Lexical.Localization.Asset;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
namespace docs
{
public class Ms_DependencyInjection_Example1
{
public static void Main(string[] args)
{
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Configure to use CultureInfo.CurrentUICulture
serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());
// Add localization services: ILineRoot, ILine<T>, IAssetBuilder
serviceCollection.AddLexicalLocalization(
addStringLocalizerService: false,
addCulturePolicyService: false,
useGlobalInstance: false,
addCache: false);
// Create localization source
var lines = new List<ILine> { LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!") };
// Create asset source
IAssetSource assetSource = new StringAsset(lines).ToSource();
// Add asset source
serviceCollection.AddSingleton<IAssetSource>(assetSource);
// Build service provider
using (var serviceProvider = serviceCollection.BuildServiceProvider())
{
// Service can provide the asset
IAsset asset = serviceProvider.GetService<IAsset>();
// Service can provide root
ILineRoot root = serviceProvider.GetService<ILineRoot>();
// Service can provide type key
ILine typeKey = serviceProvider.GetService<ILine<ConsoleApp1.MyController>>();
// Get "Hello World!"
string str = typeKey.Key("Hello").Culture("en").ToString();
}
}
}
}
String localizer
When the argument addStringLocalizerService is set to true, then the extension method adds implementations to
services IStringLocalizer<T> and IStringLocalizerFactory.
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Configure to use CultureInfo.CurrentUICulture
serviceCollection.AddSingleton<ICulturePolicy>(new CulturePolicy().SetToCurrentThreadUICulture().AsReadonly());
// Add localization services: ILineRoot, ILine<T>, IAssetBuilder,
// IStringLocalizer<T>, IStringLocalizerFactory
serviceCollection.AddLexicalLocalization(
addStringLocalizerService: true, // <- string localizer
addCulturePolicyService: false,
useGlobalInstance: false,
addCache: false);
// Create localization source
var lines = new List<ILine> { LineAppender.Default.Culture("en").Type("ConsoleApp1.MyController").Key("Hello").Format("Hello World!") };
// Create asset source
IAssetSource assetSource = new StringAsset(lines).ToSource();
// Add asset source
serviceCollection.AddSingleton<IAssetSource>(assetSource);
// Build service provider
using (var serviceProvider = serviceCollection.BuildServiceProvider())
{
// Get string localizer for class "ConsoleApp1.MyController".
IStringLocalizer stringLocalizer
= serviceProvider.GetService<IStringLocalizer<ConsoleApp1.MyController>>();
// Narrow scope down to "en" culture
IStringLocalizer stringLocalizerScoped = stringLocalizer.WithCulture(CultureInfo.GetCultureInfo("en"));
// Get "Hello World!"
string str = stringLocalizerScoped.GetString("Hello");
}