public static void Add(string languageTag, ILanguageTag languageTagInstance)
        {
            if (languageTag.IsNullOrWhiteSpace())
            {
                return;
            }

            if (languageTagInstance == null)
            {
                return;
            }

            var hashOfLanguageTag = languageTag.GetHashCode();

            if (Contains(hashOfLanguageTag))
            {
                return;
            }

            lock (_lockObj) {
                if (Contains(hashOfLanguageTag))
                {
                    return;
                }

                _languageTags.Add(hashOfLanguageTag, languageTagInstance);
            }
        }
示例#2
0
 /// <summary>
 /// Create
 /// </summary>
 /// <param name="text"></param>
 /// <param name="packageKey"></param>
 /// <param name="formatProvider"></param>
 /// <param name="languageTag"></param>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public IText Create(string text, string packageKey,
                     Func <string, ILanguageTag, string, object[], string> formatProvider,
                     ILanguageTag languageTag, params object[] parameters)
 {
     return(new Text(_translationProcessor, text, packageKey, languageTag, parameters)
     {
         CustomFormatProvider = formatProvider
     });
 }
 public static bool TryGet(string languageTag, out ILanguageTag result)
 {
     result = null;
     if (Contains(languageTag))
     {
         return(_languageTags.TryGetValue(languageTag.GetHashCode(), out result));
     }
     return(false);
 }
示例#4
0
 // Con
 public LanguageItem(
     ILanguageTag i_LanguageTag,
     float i_Quality,
     int i_Ordinal)
 {
     LanguageTag = i_LanguageTag;
     Quality     = i_Quality;
     Ordinal     = i_Ordinal;
     UseCount    = 0;
 }
示例#5
0
        /// <summary>
        /// Create a new instance of <see cref="Text"/>.
        /// </summary>
        /// <param name="text"></param>
        /// <param name="packageKey"></param>
        /// <param name="languageTag"></param>
        /// <param name="parameters"></param>
        public Text(string text, string packageKey, ILanguageTag languageTag, params object[] parameters)
        {
            LanguageTag         = languageTag as LanguageTag ?? LanguageTag.Current;
            PackageKey          = packageKey;
            OriginText          = text;
            FormatingParameters = parameters;

            _translationProcessor = StaticInstanceForILanguageServiceProvider.Instance.GetTranslationProcessor();
            CustomFormatProvider  = (packageKeyArg, languageTagArg, textArg, parametersArg) => string.Format(textArg, parametersArg);
        }
示例#6
0
        /// <summary>
        /// Create a new instance of <see cref="Text"/>.
        /// </summary>
        /// <param name="processor"></param>
        /// <param name="text"></param>
        /// <param name="packageKey"></param>
        /// <param name="languageTag"></param>
        /// <param name="parameters"></param>
        public Text(TranslationProcessor processor, string text, string packageKey, ILanguageTag languageTag, params object[] parameters)
        {
            LanguageTag         = languageTag as LanguageTag ?? LanguageTag.Current;
            PackageKey          = packageKey;
            OriginText          = text;
            FormatingParameters = parameters;

            _translationProcessor = processor ?? throw new ArgumentNullException(nameof(processor));
            CustomFormatProvider  = (packageKeyArg, languageTagArg, textArg, parametersArg) => string.Format(textArg, parametersArg);
        }
示例#7
0
        public static ILanguageTag GetPrincipalAppLanguageForRequest(this HttpContextBase context)
        {
            // The PAL is stored as the first item in the UserLanguages array (with Quality set to 2).
            //
            ILanguageTag langtag = GetRequestUserLanguages(context)[0].LanguageTag;

            if (langtag == null)
            {
                langtag = LocalizedApplication.Current.DefaultLanguageTag;
            }
            return(langtag);
        }
示例#8
0
        public static void SetPrincipalAppLanguageForRequest(this HttpContextBase context, ILanguageTag pal, bool updateThreadCulture = true)
        {
            // The PAL is stored as the first item in the UserLanguages array (with Quality set to 2).
            //
            LanguageItem[] UserLanguages = GetRequestUserLanguages(context);
            UserLanguages[0] = new LanguageItem(pal, LanguageItem.PalQualitySetting, 0);

            // Run through any handlers installed for this event.
            if (LocalizedApplication.Current.SetPrincipalAppLanguageForRequestHandlers != null)
            {
                foreach (LocalizedApplication.SetLanguageHandler handler in LocalizedApplication.Current.SetPrincipalAppLanguageForRequestHandlers.GetInvocationList())
                {
                    handler(context, pal);
                }
            }
        }
示例#9
0
 /// <summary>
 /// Helper for caching a per-request value that identifies the principal language
 /// under which the current request is to be handled.
 /// </summary>
 /// <param name="context">Context of the request.</param>
 /// <param name="pal">Selected AppLanguage aka Principle Application Language (PAL).</param>
 /// <param name="updateThreadCulture">
 /// Indicates whether to also update the thread CurrentCulture/CurrentUICulture settings.
 /// </param>
 public static void SetPrincipalAppLanguageForRequest(this HttpContext context, ILanguageTag pal, bool updateThreadCulture = true)
 {
     context.GetHttpContextBase().SetPrincipalAppLanguageForRequest(pal, updateThreadCulture);
 }
示例#10
0
 public static bool IsValid(this ILanguageTag languageTag) => languageTag != null && languageTag.GetLanguage() != null;
示例#11
0
 // [IComparable<ILanguageTag>]
 /// <summary>
 /// CompareTo
 /// </summary>
 /// <param name="other"></param>
 /// <returns></returns>
 public int CompareTo(ILanguageTag other)
 {
     return(string.Compare(OriginalLanguageTag, other.ToString(), StringComparison.OrdinalIgnoreCase));
 }
示例#12
0
 // [IEquatable<ILanguageTag>]
 /// <summary>
 /// Equals
 /// </summary>
 /// <param name="other"></param>
 /// <returns></returns>
 public bool Equals(ILanguageTag other)
 {
     return(0 == string.Compare(OriginalLanguageTag, other.ToString(), StringComparison.OrdinalIgnoreCase));
 }
示例#13
0
 static string CustomFormatProvider(string packageKey, ILanguageTag languageTag, string text, object[] parameters)
 {
     return($"Custom format result: {string.Format(text, parameters)}, LangTag: {languageTag}");
 }
示例#14
0
 /// <summary>
 /// Create a new instance of <see cref="Text"/>.
 /// </summary>
 /// <param name="text"></param>
 /// <param name="packageKey"></param>
 /// <param name="languageTag"></param>
 public Text(string text, string packageKey, ILanguageTag languageTag)
     : this(text, packageKey, languageTag, null)
 {
 }
示例#15
0
        public static void SetPrincipalAppLanguageForRequest(this System.Web.HttpContextBase context, ILanguageTag pal, bool updateThreadCulture = true)
        {
        // The PAL is stored as the first item in the UserLanguages array (with Quality set to 2).
        //
            LanguageItem[] UserLanguages = GetRequestUserLanguages(context);
            UserLanguages[0] = new LanguageItem(pal, LanguageItem.PalQualitySetting, 0);

            // Run through any handlers installed for this event.
            if (LocalizedApplication.Current.SetPrincipalAppLanguageForRequestHandlers != null) {
                foreach (LocalizedApplication.SetLanguageHandler handler in LocalizedApplication.Current.SetPrincipalAppLanguageForRequestHandlers.GetInvocationList())
                {
                    handler(context, pal);
                }
            }

        }
示例#16
0
 // [IComparable<ILanguageTag>]
 public int CompareTo(ILanguageTag other)
 {
     return(string.Compare(m_langtag, other.ToString(), true));
 }
示例#17
0
        // Static helpers
        /// <summary>
        /// Parses an HTTP Accept-Language or Content-Language header value, returning
        /// a representative ordered array of LanguageItem instances, sorted in order of
        /// language preference.
        /// E.g. "de;q=0.5, en;q=1, fr-FR;q=0,ga;q=0.5".
        /// Notably, is able to re-order elements based on quality.
        /// </summary>
        /// <remarks>
        /// The first element position in the returned array is reserved for an item that
        /// describes the Principal Application Language (PAL) for the request. If/when the PAL
        /// is not set, that element will be a null item (LanguageItem.LanguageTag == null).
        ///
        /// This method is designed to be as efficient as possible, typically requiring
        /// only a single heap alloc, for the returned array object itself.
        /// </remarks>
        /// <param name="headerval">
        /// HTTP Accept-Language header value.
        /// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html.
        /// May be null or empty string for zero languages.
        /// </param>
        /// <param name="pal">
        /// Optional language to store at the first element position in the array, which is reserved
        /// for the Principal Application Language (PAL). Any such LanguageItem stored that has a quality
        /// value of 2 (LanguageItem.PalQualitySetting). Null if no such language to be stored there and the
        /// item to be set as null (LanguageItem.LanguageTag == null).
        /// </param>
        /// <returns>
        /// Array of languages items (with possibly null LanguageTag members) sorted in order or language preference.
        /// </returns>
        public static       LanguageItem[] ParseHttpLanguageHeader(string headerval, ILanguageTag pal = null)
        {
            // This method is designed to be as efficient as possible (avoiding string allocations where possible).
            //
            int begin, end, pos1;
            int len     = headerval != null ? headerval.Length : 0;
            int ordinal = 0;
            // Init array with enough elements for each language entry in the header.
            var LanguageItems = new LanguageItem[(len > 0 ? headerval.CountOfChar(',') + 1 : 0) + 1];

            // First element position is reserved for any PAL.
            LanguageItems[ordinal] = new LanguageItem(pal, PalQualitySetting, ordinal);
            ++ordinal;
            // For each language component of the header (delimited by comma)
            for (begin = 0; begin < len; begin = end + 1)
            {
                end = headerval.IndexOf(',', begin);
                if (-1 == end)
                {
                    end = len;
                }
                float qvalue = 1;
                pos1 = headerval.IndexOf(';', begin);
                if (-1 != pos1 &&
                    pos1 < end)
                {
                    // pos1 -> ";q=n"
                    if (pos1 - begin < 2 || // room for valid langtag
                        pos1 + 3 >= headerval.Length ||
                        headerval[pos1 + 1] != 'q' ||
                        headerval[pos1 + 2] != '=')
                    {
                        continue;
                    }
                    if (!ParseHelpers.TryParseDecimal(headerval, pos1 + 3, -1, out qvalue))
                    {
                        continue;
                    }
                    if (qvalue < 0f || qvalue > 1.0f)
                    {
                        continue;
                    }
                }
                else
                {
                    pos1 = end;
                }
                // Skip over any whitespace. We expect this to make the following Trim redundant,
                // thus saving on an alloc.
                while (headerval[begin] == ' ')
                {
                    ++begin;
                }
                // Extract language subtag e.g. "fr-FR".
                // NB: we expect this to be efficient and not allocate a new string as
                // a string matching the trimmed value is most likely already Intern (held by
                // the LanguageTag cache as a key value). Only first time here for a particular
                // value will a new string possibly be allocated.
                string langtag = headerval.Substring(begin, pos1 - begin).Trim();
                // Wrap langtag.
                LanguageTag lt = i18n.LanguageTag.GetCachedInstance(langtag);
                if (lt == null || !lt.Language.IsSet())
                {
                    continue;
                }
                // Ignore the langtag if already added.
                //if (pal.IsValid() && pal.Equals(lt)) {
                //    continue; }
                // NB: the above check disabled as it can cause the first lang in the header,
                // where it matches the PAL intially, to be lost if/when the PAL is later changed
                // to something else.
                // Store a new representative item.
                // NB: LanguageItem is a value type so no alloc done here.
                LanguageItems[ordinal] = new LanguageItem(lt, qvalue, ordinal);
                ++ordinal;
            }
            // Truncate any extra elements from end of array.
            if (ordinal != LanguageItems.Length)
            {
                LanguageItems = LanguageItems.Where(x => x.LanguageTag.IsValid()).ToArray();
            }
            // If there was no PAL, and the header value was invalid then we will have no language items, so add the default
            if (LanguageItems.Length == 0)
            {
                LanguageItems = new LanguageItem[] { new LanguageItem(LocalizedApplication.Current.DefaultLanguageTag, PalQualitySetting, 0) }
            }
            ;
            // Rearrange items into order of precedence. This is facilitated by LanguageItem's
            // impl. of IComparable.
            Array.Sort(LanguageItems);
            // Done.
            return(LanguageItems);
        }
    }
示例#18
0
 /// <summary>
 /// Create
 /// </summary>
 /// <param name="text"></param>
 /// <param name="packageKey"></param>
 /// <param name="languageTag"></param>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public IText Create(string text, string packageKey, ILanguageTag languageTag, params object[] parameters)
 {
     return(new Text(_translationProcessor, text, packageKey, languageTag, parameters));
 }
示例#19
0
 /// <summary>
 /// Create
 /// </summary>
 /// <param name="text"></param>
 /// <param name="packageKey"></param>
 /// <param name="languageTag"></param>
 /// <returns></returns>
 public IText Create(string text, string packageKey, ILanguageTag languageTag)
 {
     return(new Text(_translationProcessor, text, packageKey, languageTag));
 }
示例#20
0
 /// <summary>
 /// Create
 /// </summary>
 /// <param name="text"></param>
 /// <param name="formatProvider"></param>
 /// <param name="languageTag"></param>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public IText Anonymous(string text, Func <string, ILanguageTag, string, object[], string> formatProvider, ILanguageTag languageTag, params object[] parameters)
 {
     return(new Text(_translationProcessor, text, TranslationManager.ANONYMOUS_PACKAGE_KEY, languageTag, parameters)
     {
         CustomFormatProvider = formatProvider
     });
 }
示例#21
0
 /// <summary>
 /// Create
 /// </summary>
 /// <param name="text"></param>
 /// <param name="languageTag"></param>
 /// <param name="parameters"></param>
 /// <returns></returns>
 public IText Anonymous(string text, ILanguageTag languageTag, params object[] parameters)
 {
     return(new Text(_translationProcessor, text, TranslationManager.ANONYMOUS_PACKAGE_KEY, languageTag, parameters));
 }
示例#22
0
 // [IEquatable<ILanguageTag>]
 public bool Equals(ILanguageTag other)
 {
     return(0 == string.Compare(m_langtag, other.ToString(), true));
 }
示例#23
0
 /// <summary>
 /// Create a new instance of <see cref="Text"/>.
 /// </summary>
 /// <param name="processor"></param>
 /// <param name="text"></param>
 /// <param name="packageKey"></param>
 /// <param name="languageTag"></param>
 public Text(TranslationProcessor processor, string text, string packageKey, ILanguageTag languageTag)
     : this(processor, text, packageKey, languageTag, null)
 {
 }
示例#24
0
 public static bool IsValid(
     this ILanguageTag lt)
 {
     return(lt != null && lt.GetLanguage() != null);
 }
示例#25
0
 /// <summary>
 /// Helper for caching a per-request value that identifies the principal language
 /// under which the current request is to be handled.
 /// </summary>
 /// <param name="context">Context of the request.</param>
 /// <param name="pal">Selected AppLanguage aka Principle Application Language (PAL).</param>
 /// <param name="updateThreadCulture">
 /// Indicates whether to also update the thread CurrentCulture/CurrentUICulture settings.
 /// </param>
 public static void SetPrincipalAppLanguageForRequest(this System.Web.HttpContext context, ILanguageTag pal, bool updateThreadCulture = true)
 {
     context.GetHttpContextBase().SetPrincipalAppLanguageForRequest(pal, updateThreadCulture);
 }