Exemple #1
0
        /// <summary>
        /// Данная функция только инициализирует локализаторы
        /// </summary>
        /// <param name="culture"></param>
        /// <returns></returns>
        private bool TrySetCulture(string culture)
        {
            StringLocalizerWithCache LC = null, L = null;

            if (LocalizerControllerOriginal != null)
            {
                Logger.LogTrace("===================== LocalizerController LoadCulture");
                LC = LocalizerControllerOriginal.LoadCulture(culture, false, Logger);
            }

            if (LocalizerOriginal != null)
            {
                Logger.LogTrace("===================== Localizer LoadCulture");
                L = LocalizerOriginal.LoadCulture(culture, true, Logger);
            }
            // один из локализаторов должен существовать
            if (L != null || LC != null)
            {
                // это влияет тока на параметры форматирования
                var cultureInfo = new CultureInfo(culture);
                CultureInfo.DefaultThreadCurrentCulture   = cultureInfo;
                CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

                CultureInfo.CurrentCulture   = cultureInfo;
                CultureInfo.CurrentUICulture = cultureInfo;
                /**/
                Localizer           = L;
                LocalizerController = LC;
                return(true);
            }

            return(false);
        }
 public static StringLocalizerWithCache Get(IStringLocalizer source, string key)
 {
     if (!cache.ContainsKey(key))
     {
         cache[key] = new StringLocalizerWithCache(source);
     }
     return(cache[key]);
 }
        //public static IStringLocalizer LoadCulture(this IStringLocalizer localizer, string culture, ILogger logger)
        public static StringLocalizerWithCache LoadCulture(this IStringLocalizer localizer, string culture, bool fromLib, ILogger logger)
        {
            try
            {
                var cultureInfo = new CultureInfo(culture);
                var l           = localizer.WithCulture(cultureInfo);
                // проверим культуру
                // если такой кульутры нет, то в этом месте будет эксепшен (при вызове GetAllStrings).
                // причем как я понял это единственный способ узнать есть ли такая культура в ресурсах или нет

                /*var str = string.Join("\n", l.GetAllStrings().Select(i => i.Name + "->" + i.Value).Take(2).ToList());
                 * if (logger != null)
                 * {
                 *  logger.LogTrace("LoadCulture for {0} strings:\n{1}", localizer.GetType().FullName, str);
                 * }
                 * return l;*/
                return(StringLocalizerWithCache.Get(l, culture + "." + (fromLib ? "lib" : "contr")));
            }
            catch (Exception e)
            {
                logger.LogTrace("LoadCulture for {0} fail. {1}", localizer.GetType().FullName, e);
                return(null);
            }
        }
Exemple #4
0
        public void ResolveCulture(string CultureFromRouteData, List <Languages> SiteLanguages, IList <string> CulturalPreferences)
        {
            Logger.LogTrace("============================= ResolveCulture in");
            //using (new BLog(LoggerMEF, "Controller2Garin::ResolveCulture() Languages.GetUnblocked", GetType().FullName))
            //SiteLanguages = Languages.GetUnblocked(Site.Id).ToList();

            //var provider = new AcceptLanguageHeaderRequestCultureProvider();
            //var languagePreferences = provider.DetermineProviderCultureResult(context.HttpContext).Result;

            //var cult = CultureFromRouteData;// context.RouteData.Values["Culture"] as string;
            // приведем к корректному виду (в урле могут быть маленькие буквы во второй части ru-ru)
            if (string.IsNullOrWhiteSpace(CultureFromRouteData) || !CultureFromRouteData.TestCulture())
            {
                // ни в коем случае так не делать! если тут будет послана фигня, то будет сделан редирект на правильный урл => просто игнорируем
                //cult = null;
            }
            else
            {
                CultureFromRouteData = CultureFromRouteData.ToLower();
                if (CultureFromRouteData.Length > 2)
                {
                    // мы прошли проверку TestCulture и значит елси больше 2 букв то етсь 1 дефис
                    var tmp = CultureFromRouteData.Explode("-");
                    CultureFromRouteData = tmp[0] + "-" + tmp[1].ToUpper();
                }
            }
            CultureFromGet = CultureFromRouteData;

            if (!string.IsNullOrWhiteSpace(CultureFromRouteData))
            {
                var l = SiteLanguages.FirstOrDefault(i => i.Lang == CultureFromRouteData);
                if (l != null) // указанный язык есть на сайте все ок
                {
                    SetLang(l);
                    return;
                }
                else
                {
                    // языка указанного в запросе нет на сайте => делаем редирект (постоянный, чтобы выбить из поискового индекса)

                    /*var url = Url.CurrentUrl(new { culture = (string)null });
                     * Logger.LogTrace("ResolveCulture redirect to {0}", url);
                     * context.Result = new RedirectResult(url, true);
                     * return;
                     */
                    throw new CultureException();
                }
            }
            else // культуры в запросе нет, ее надо поискать и установить. Вот тут никаких редиректов быть не должно! Редирект на язык делаем исключительно на js (для кеширования страниц)
            {
                if (CulturalPreferences != null)
                {
                    Logger.LogInformation("AcceptLanguageHeaderRequestCultureProvider Cultures={0}", string.Join(", ", CulturalPreferences));

                    foreach (var c in CulturalPreferences)
                    {
                        // пробуем найти предпочитаемый юзером язык в списке языков сайта
                        var l = SiteLanguages.FirstOrDefault(i => i.Lang == c);
                        if (l != null)
                        {
                            if (l.IsDefault) // если язык по умолчанию, то показываем контент сайта на этом языке. причем без указания культуры в запросе
                            {
                                SetLang(l);
                                return;
                            }
                            else
                            {
                                // редирект тут делать не будем. редирект сделаем на уровне js. (для кеширования страниц)
                                // условие пока оставим иначе захочется пооптимизировать
                                SetLang(l);
                                return;

                                // предпочитаемый юзером язык определен на сайте и так как язык не является дефолтным, то нам надо сделать редирект
                                //currentRV["culture"] = l.Lang;

                                /*var url = Url.CurrentUrl(new { culture = l.Lang });//Url.RouteUrlWithCulture(routeName, currentRV.ToDictionary(i=>i.Key, i=>i.Value)); //new { culture = l.Lang }
                                 * Logger.LogTrace("ResolveCulture redirect to {0}", url);
                                 * context.Result = new RedirectResult(url, true);
                                 * return;
                                 */
                            }
                        }
                    }
                }
            }

            // у юзера нет предпочтений или они полностью не совпадают с языками сайта
            // скорее всего это не юзер, а бот и потому никаких редиректов тут не делаем
            if (SiteLanguages.Any())
            {
                var l = SiteLanguages.FirstOrDefault(i => i.IsDefault);
                if (l == null) // в теории тут ошибка! как минимум один из языков должен быть дефолтным!
                {
                    Logger.LogWarning("Site {0} have not default language.", SiteLanguages[0].SiteId);
                    l = SiteLanguages.First();
                }
                SetLang(l);
                return;
            }
            else // на сайте вообще нет языков
            {
                // надо бы попробовать установить локализацию по предпочтениям юзера.
                // НЕТ! кеширование контента накрывается. Страницы должны выдаваться независимо от предпочтений юзера!

                /*if (languagePreferences != null && languagePreferences.Cultures != null)
                 *  foreach (var c in languagePreferences.Cultures)
                 *  {
                 *      if (TrySetCulture(c)) return;
                 *  }
                 * /**/
                Localizer           = null;
                LocalizerController = null;
            }
        }