/// <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); } }
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; } }