/// <summary> /// Scan features from <paramref name="line"/> /// </summary> /// <param name="line"></param> /// <exception cref="LineException">If resolve fails.</exception> public void ScanFeatures(ILine line) { for (ILine l = line; l != null; l = l.GetPreviousPart()) { if (l is ILineCulturePolicy cp && cp != null) { CulturePolicy = cp.CulturePolicy; } if (l is ILineCulture c && c.Culture != null) { Culture = c.Culture; } if (l is ILineInlines inlines) { Inlines.AddIfNew(inlines); } if (l is ILineResource resource && resource.Resource != null) { Resource = resource.Resource; } if (l is ILineLogger ll && ll.Logger != null) { Loggers.AddIfNew(ll.Logger); } if (l is ILineAsset la && la.Asset != null) { Assets.AddIfNew(la.Asset); } if (l is ILineParameterEnumerable lineParameters) { foreach (ILineParameter lineParameter in lineParameters) { string name = lineParameter.ParameterName, value = lineParameter.ParameterValue; if (name == "Culture") { try { Culture = CultureInfo.GetCultureInfo(value); } catch (Exception) { } } } } if (l is ILineParameter parameter) { string name = parameter.ParameterName, value = parameter.ParameterValue; if (name == "Culture") { try { Culture = CultureInfo.GetCultureInfo(value); } catch (Exception) { } } } } }
/// <summary> /// Assign new enumerable /// </summary> /// <param name="culturePolicy"></param> /// <returns>this</returns> public ICulturePolicyAssignable SetSource(ICulturePolicy culturePolicy) { this.source = culturePolicy; return(this); }
/// <summary> /// Create new culture policy with initial cultures <paramref name="initialCultures"/>. /// </summary> /// <param name="initialCultures"></param> public CulturePolicy(params CultureInfo[] initialCultures) { source = new CulturePolicyArray(initialCultures ?? NO_CULTURES); }
/// <summary> /// Create new culture policy with initial cultures <paramref name="initialCultures"/>. /// </summary> /// <param name="initialCultures"></param> public CulturePolicy(IEnumerable <CultureInfo> initialCultures) { source = new CulturePolicyArray(initialCultures?.ToArray() ?? NO_CULTURES); }
/// <summary> /// Create new culture policy. /// The initial configuration returns CultureInfo.ActiveCulture and its fallback cultures. /// </summary> public CulturePolicy() { source = new CulturePolicyFuncWithFallbacks(ICulturePolicyExtensions.FuncCurrentThreadCulture); }
/// <summary> /// Append culture policy /// </summary> /// <param name="lineFactory"></param> /// <param name="culturePolicy"></param> /// <returns></returns> public static ILineCulturePolicy CulturePolicy(this ILineFactory lineFactory, ICulturePolicy culturePolicy) => lineFactory.Create <ILineCulturePolicy, ICulturePolicy>(null, culturePolicy);
/// <summary> /// Append culture policy /// </summary> /// <param name="line"></param> /// <param name="culturePolicy"></param> /// <returns></returns> public static ILineCulturePolicy CulturePolicy(this ILine line, ICulturePolicy culturePolicy) => line.Append <ILineCulturePolicy, ICulturePolicy>(culturePolicy);
/// <summary> /// Assign culture and default fallback cultures. /// </summary> /// <param name="culturePolicy"></param> /// <param name="cultureName"></param> /// <returns></returns> /// <exception cref="ArgumentException">If <paramref name="culturePolicy"/> doesnt implement <see cref="ICulturePolicyAssignable"/></exception> public static ICulturePolicyAssignable SetCultureWithFallbackCultures(this ICulturePolicy culturePolicy, string cultureName) => culturePolicy is ICulturePolicyAssignable assignable?
/// <summary> /// Return an <see cref="ICulturePolicy"/> that doesn't implement <see cref="ICulturePolicyAssignable"/>. /// Returns the same enumerable as in <paramref name="culturePolicy"/>. /// </summary> /// <param name="culturePolicy"></param> /// <returns></returns> public static ICulturePolicy AsReadonly(this ICulturePolicy culturePolicy) => culturePolicy is CulturePolicyImmutable immutable ? immutable : new CulturePolicyImmutable(culturePolicy.Cultures);
/// <summary> /// Culture policy with unmodifiable source. /// </summary> /// <param name="culturePolicy"></param> public CulturePolicyImmutable(ICulturePolicy culturePolicy) { source = culturePolicy; }
/// <summary> /// Scan features from a line /// </summary> /// <param name="line"></param> /// <exception cref="LineException">If resolve fails.</exception> public void ScanFeatures(ILine line) { bool valueSet = false; for (ILine l = line; l != null; l = l.GetPreviousPart()) { if (l is ILineValue fa && fa != null) { ValueArgs = fa.Value; } if (l is ILineCulturePolicy cp && cp != null) { CulturePolicy = cp.CulturePolicy; } if (l is ILineCulture c && c.Culture != null) { Culture = c.Culture; } if (l is ILineFormatProvider fp && fp.FormatProvider != null) { FormatProviders.AddIfNew(fp.FormatProvider); } if (l is ILineFunctions funcs && funcs.Functions != null) { Functions.AddIfNew(funcs.Functions); } if (l is ILineInlines inlines) { Inlines.AddIfNew(inlines); } if (l is ILineLogger ll && ll.Logger is IStringResolverLogger logger) { Loggers.AddIfNew(logger); } if (l is ILinePluralRules pl && pl.PluralRules != null) { PluralRules = pl.PluralRules; } if (l is ILineStringFormat sf && sf.StringFormat != null) { StringFormat = sf.StringFormat; } if (!valueSet && l is ILineString lv && lv.String != null) { String = lv.String; StringText = null; valueSet = true; } if (l is ILineAsset la && la.Asset != null) { Assets.AddIfNew(la.Asset); } if (l is ILineParameterEnumerable lineParameters) { foreach (ILineParameter lineParameter in lineParameters) { string name = lineParameter.ParameterName, value = lineParameter.ParameterValue; if (name == "Culture") { try { Culture = CultureInfo.GetCultureInfo(value); } catch (Exception) { } } else if (name == "FormatProvider" && !(l is ILineFormatProvider fp_ && fp_.FormatProvider != null /*to not add second time*/)) { IFormatProvider _fp; if (Resolvers.TryResolve <IFormatProvider>(value, out _fp)) { FormatProviders.AddIfNew(_fp); } else { Status.UpStringFormat(LineStatus.ResolveErrorFormatProviderResolveFailed); } } else if (name == "Functions" && !(l is ILineFunctions funcs_ && funcs_.Functions != null /*to not add second time*/)) { IFunctions _funcs; if (Resolvers.TryResolve <IFunctions>(value, out _funcs)) { Functions.AddIfNew(_funcs); } else { Status.UpStringFormat(LineStatus.ResolveErrorFunctionsResolveFailed); } }
/// <summary> /// Adds the following Lexical.Localization services: /// <see cref="ILineRoot"/> /// <see cref="ILine{T}"/> /// <see cref="IAssetBuilder"/> /// /// If <paramref name="addCulturePolicyService"/> is true a <see cref="ICulturePolicy"/> is added, /// otherwise <see cref="ICulturePolicy"/> must be added to the service collection. /// /// Further services are needed: /// <see cref="IAssetSource"/> one or more. /// /// If <paramref name="addStringLocalizerService"/> is true, the following services are added: /// <see cref="IStringLocalizerFactory"/> /// <see cref="IStringLocalizer{T}"/> /// /// If <paramref name="useGlobalInstance"/> is true, then uses global <see cref="LineRoot"/>. /// /// /// After this call, the <paramref name="serviceCollection"/> still needs to be populated with /// instances of <see cref="IAssetSource"/>, such as: /// <see cref="ResourceStringDictionary"/> /// <see cref="StringAsset"/> /// /// </summary> /// <param name="serviceCollection"></param> /// <param name="addStringLocalizerService"></param> /// <param name="addCulturePolicyService">Add instance of <see cref="CulturePolicy"/></param> /// <param name="useGlobalInstance"></param> /// <param name="addCache"></param> /// <param name="addLogger">Add adapter for <see cref="ILogger"/></param> /// <returns></returns> public static IServiceCollection AddLexicalLocalization( this IServiceCollection serviceCollection, bool addStringLocalizerService = true, bool addCulturePolicyService = true, bool useGlobalInstance = false, bool addCache = false, bool addLogger = true ) { // ILineRoot if (useGlobalInstance) { // Use StringLocalizerRoot as ILineRoot serviceCollection.TryAdd(ServiceDescriptor.Singleton <ILineRoot>( s => { IAsset asset = s.GetService <IAsset>(); // DO NOT REMOVE ICulturePolicy culturePolicy = s.GetService <ICulturePolicy>(); if (culturePolicy != null) { StringLocalizerRoot.Global.CulturePolicy = culturePolicy; } return(StringLocalizerRoot.Global); } )); } else { serviceCollection.TryAdd(ServiceDescriptor.Singleton <ILineRoot, StringLocalizerRoot>()); } // ILineFactory serviceCollection.TryAdd(ServiceDescriptor.Singleton <ILineFactory>(StringLocalizerAppender.NonResolving)); // ILineAsset serviceCollection.TryAdd(ServiceDescriptor.Singleton <ILineAsset>(s => s.GetService <ILineRoot>() as ILineAsset)); // ICulturePolicy if (addCulturePolicyService) { if (useGlobalInstance) { serviceCollection.TryAdd(ServiceDescriptor.Singleton <ICulturePolicy>(StringLocalizerRoot.Global.CulturePolicy)); } else { serviceCollection.TryAdd(ServiceDescriptor.Singleton <ICulturePolicy>( s => new CulturePolicy().SetToCurrentThreadCulture() )); } } // ILineResolver serviceCollection.TryAdd(ServiceDescriptor.Singleton <IStringResolver>(StringResolver.Default)); // ILogger<ILine> if (addLogger) { serviceCollection.AddLoggerAdapter(); } // IAssetBuilder if (useGlobalInstance) { serviceCollection.TryAdd(ServiceDescriptor.Singleton <IAssetBuilder>(s => { IEnumerable <IAssetSource> assetSources = s.GetServices <IAssetSource>(); IAssetBuilder builder = StringLocalizerRoot.Builder; builder.AddSources(assetSources); return(builder); })); } else { serviceCollection.TryAdd(ServiceDescriptor.Singleton <IAssetBuilder>(s => { // Get IAssetSource services IEnumerable <IAssetSource> assetSources = s.GetServices <IAssetSource>(); // Get IEnumerable<ILibraryAssetSources> services IEnumerable <IAssetSources> libraryAssetSourcesLists = s.GetServices <IAssetSources>(); // Concatenate if (libraryAssetSourcesLists != null) { foreach (IEnumerable <IAssetSource> assetSources_ in libraryAssetSourcesLists) { assetSources = assetSources == null ? assetSources_ : assetSources.Concat(assetSources_); } } // Take distinct if (assetSources != null) { assetSources = assetSources.Distinct(); } // Is it still empty if (assetSources == null) { assetSources = new IAssetSource[0]; } // Create builder AssetBuilder.OneBuildInstance builder = new AssetBuilder.OneBuildInstance(assetSources); return(builder); })); } // IAsset serviceCollection.TryAdd(ServiceDescriptor.Singleton <IAsset>(s => s.GetService <IAssetBuilder>().Build())); // ILine<> serviceCollection.TryAdd(ServiceDescriptor.Singleton(typeof(ILine <>), typeof(StringLocalizerType <>))); // IStringLocalizer<> // IStringLocalizerFactory if (addStringLocalizerService) { // Service request for IStringLocalizer<> instances serviceCollection.TryAdd(ServiceDescriptor.Singleton(typeof(IStringLocalizer <>), typeof(StringLocalizerType <>))); // Service reqeust for IStringLocalizerFactory serviceCollection.TryAdd(ServiceDescriptor.Singleton <IStringLocalizerFactory>(s => { ILineRoot localizationRoot = s.GetService <ILineRoot>(); // Use the StringLocalizerKey or StringLocalizerRoot implementation from th service. if (localizationRoot is IStringLocalizerFactory casted) { return(casted); } // Create new root that implements IStringLocalizerFactory and acquires asset and policy with delegate return(new StringLocalizerRoot.LinkedTo(StringLocalizerAppender.NonResolving, localizationRoot)); })); } // Add cache if (addCache) { // Add cache serviceCollection.AddSingleton <IAssetSource>(new AssetCacheSource(o => o.AddResourceCache().AddStringsCache().AddCulturesCache())); } return(serviceCollection); }
/// <summary> /// Construct root, for subclasses. /// </summary> /// <param name="appender"></param> /// <param name="prevKey"></param> /// <param name="asset"></param> /// <param name="culturePolicy"></param> /// <param name="stringResolver"></param> /// <param name="resourceResolver"></param> /// <param name="stringFormat"></param> /// <param name="formatProvider"></param> /// <param name="logger"></param> /// <param name="functions"></param> public LinkedTo(ILineFactory appender, ILine prevKey, IAsset asset = null, ICulturePolicy culturePolicy = null, IStringResolver stringResolver = null, IResourceResolver resourceResolver = null, IStringFormat stringFormat = null, IFormatProvider formatProvider = null, ILogger logger = null, IFunctions functions = null) : base(appender, prevKey, asset, culturePolicy, stringResolver, resourceResolver, stringFormat, formatProvider, logger, functions) { }