ASP.net MVC 5 Multi-Language: языковые ресурсы иногда не работают согласованно - PullRequest
0 голосов
/ 05 декабря 2018

Я использую менеджер ресурсов для загрузки ресурсов на основе культуры threadUI в приложении ASP.NET MVC 5. Я устанавливаю культуру потоков в событии Application_AcquireRequestState, текущая культура сохраняется для каждого пользователя, она загружается веб-сервером в базе данных, как показано ниже.Код:

protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        string languageName = default(string);

        CultureInfo ci = default(CultureInfo);

        if (!User.Identity.IsAuthenticated)
        {
            languageName = Request.RequestContext.HttpContext.Session["_culture"] == null ?
                Helper.ApplicationInformation.AppCulture.Name :
                Request.RequestContext.HttpContext.Session["_culture"].ToString();

            ci = CultureInfo.GetCultureInfo(languageName.ToUpper());
        }
        else
        {
            ci = CultureInfo.GetCultureInfo(Helper.User.Preferences.Language.Name);
        }

        System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
        System.Threading.Thread.CurrentThread.CurrentCulture = ci;

        Bridge.Resources.Global.Culture = ci;
        Bridge.Resources.Login.Culture = ci;
        Bridge.Resources.Search.Culture = ci;
        Bridge.Resources.Workspace.Culture = ci;
    }

это происходит при установке культуры в другом потоке, фактически, когда 2 пользователя или более меняют языки одновременно,

Я думаю, что существует RaceCondition проблема в диспетчере ресурсов, приводящая к загрузке ресурсов с недопустимой культурой интерфейса пользователя для текущего потока

Я провел исследование по этому поводу и нашел следующие соответствующие ссылки:

ASP.NetФайлы ресурсов MVC иногда неправильно загружаются ResouceManager

ASP.NET MVC 5 ресурсы локализации зависают и не меняют язык, несмотря на изменение CurrentThread.CurrentCulture

ASP.NET Resource Manager RaceCondition в многоязычном приложении

Я пытаюсь скачать пример для мультиязычности, но это также случается, я скачиваю по следующей ссылке:

MultiLanguageExample

добавить 'ThreadSleep (4000)' вaction: index control: Домой, чтобы воспроизвести эту проблему.

Я сделал все упомянутое, но ничего не работало.что я могу сделать, чтобы ресурсы работали согласованно?

спасибо.

1 Ответ

0 голосов
/ 06 декабря 2018

Существует несколько способов установить язык каждого пользователя.IIS Server хранит сессии в течение 20 минут.Вам нужно изменить время в файле web.config, добавив строку:

<sessionState timeout="120" cookieless="AutoDetect">
// Change timeout to your preferred value 

Или вам нужно перейти и изменить настройки в пулах приложений.Для моего проекта я использую куки, чтобы сохранить опцию языка пользователя.Файлы cookie должны быть доступны в течение очень очень долгого времени.Например, я использовал в Global.asax Application_BeginRequest

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpCookie cookie = HttpContext.Current.Request.Cookies["NAMEOFCOOKIE"];
            if (cookie != null && cookie.Value != null)
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
            }
            else
            {
               // FIND IN DB YOUR USER'S LANGUAGE AND SET IT 
                        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
                        Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
                        HttpCookie cookieNew = new HttpCookie("NAMEOFCOOKIE");
                        cookieNew.Value = "YOUR USERS'S DB VALUE";
                        Response.Cookies.Add(cookieNew);
                    }
                }
            }
        }

И не забывайте одну вещь, когда вы используете ресурсы, вам нужно поставить в конце имени файла ваше короткое имя языка.Например, у вас есть файл по умолчанию MainPageLang.resx и вам нужен английский и русский, вам нужно добавить файлы MainPageLang.en.resx и MainPageLang.ru.resx.

«ЗНАЧЕНИЕ БД ВАШИХ ПОЛЬЗОВАТЕЛЕЙ» должно быть «en»или "ru".

                    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
                    Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
                    HttpCookie cookieNew = new HttpCookie("NAMEOFCOOKIE");
                    cookieNew.Value = "YOUR USERS'S DB VALUE";
                    Response.Cookies.Add(cookieNew);
...