コード例 #1
0
        /// <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) { }
                    }
                }
            }
        }
コード例 #2
0
 /// <summary>
 /// Assign new enumerable
 /// </summary>
 /// <param name="culturePolicy"></param>
 /// <returns>this</returns>
 public ICulturePolicyAssignable SetSource(ICulturePolicy culturePolicy)
 {
     this.source = culturePolicy;
     return(this);
 }
コード例 #3
0
 /// <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);
 }
コード例 #4
0
 /// <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);
 }
コード例 #5
0
 /// <summary>
 /// Create new culture policy.
 /// The initial configuration returns CultureInfo.ActiveCulture and its fallback cultures.
 /// </summary>
 public CulturePolicy()
 {
     source = new CulturePolicyFuncWithFallbacks(ICulturePolicyExtensions.FuncCurrentThreadCulture);
 }
コード例 #6
0
 /// <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);
コード例 #7
0
 /// <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);
コード例 #8
0
 /// <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?
コード例 #9
0
 /// <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);
コード例 #10
0
 /// <summary>
 /// Culture policy with unmodifiable source.
 /// </summary>
 /// <param name="culturePolicy"></param>
 public CulturePolicyImmutable(ICulturePolicy culturePolicy)
 {
     source = culturePolicy;
 }
コード例 #11
0
        /// <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);
                            }
                        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
 /// <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)
 {
 }