2016-11-17 5 views
2

Я пытаюсь предоставить пользователю возможность изменить язык пользовательского интерфейса моего веб-сайта asp.net mvc. Я планирую предложить 2 языка для пользователя, т.е.: английский и голландскийИспользование нескольких языков в asp.net mvc website

Для этого я редактировал свой файл web.config и добавил:

<globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/> 

Теперь я добавил 2 файлов Resources.resx (файлов по умолчанию) и Resources.nl-NL.resx (файл ресурсов для голландских).

Обращаюсь к файлу ресурсов с моего представления как <title>@WebApplication9.App_GlobalResources.Resources.RequestTitle</title>.

Когда язык меняется, я меняюсь Культура как это:

Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL"); 
Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL"); 

Но даже после изменения языка на голландский и изменять значение культуры для тех, что указан выше, английское значения из Resources.resx является всегда показывать вместо того, чтобы получать значение от Resources.nl-NL.resx.

Не могли бы вы помочь мне узнать, чего я здесь не хватает?

+0

Просто догадка ... попробуйте переименовать файл ресурса в 'Resources.nl.resx ' –

+0

@GeorgPatscheider: Я сам это пробовал, но не работал. – ViVi

+0

Устранение неполадок начального уровня подтвердило, что при изменении языка в браузере язык пользовательского интерфейса меняется. Таким образом, проблема, очевидно, связана с «Thread.CurrentThread.CurrentCulture = new CultureInfo (« nl-NL »);» и/или «Thread.CurrentThread.CurrentUICulture = new CultureInfo (« nl-NL »);« Я думаю, – ViVi

ответ

0

я решил проблему, установив культуру тока каждый раз, в то время как метод действия контроллера называется. Проблема возникает, поскольку, когда я меняю культуру, она устанавливается только для текущего потока. Когда пользователь запрашивает другое представление, поток может отличаться. Поэтому мне нужно установить Культуру для каждого нового запроса/нового потока.

Я даю пользователю иметь только 2 языка, т.е. английский (en-US) и голландский (nl-NL). Поэтому я создал 2 файла resx с именами Resources.resx для английского и Resources.nl.resx для голландцев. Когда пользователь меняет текущий язык, я держу язык в сеансе и сохраняю в базе данных для запоминания его во время последующих логинов.

if(selectedLang == Dutch) 
{ 
    Session["Language"] = "nl-NL"; 
} 
else 
{ 
    Session["Language"] = "en-US"; 
} 

Теперь Session["Language"] имеет предпочтительный язык пользователя. Теперь в каждом методе действия регулятора:

[HttpGet] 
public ActionResult ActionMethodName(DataClass dataObj) 
{ 
    Sessions.ChangeLanguage(Session["Language"].ToString()); 
} 

Sessions.ChangeLanguage(string language) статический метод в классе Sessions, как показано ниже:

public static void ChangeLanguage(string lang) 
{ 
    Thread.CurrentThread.CurrentCulture = new CultureInfo(lang); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang); 
} 
0

Это может помочь;

Ваш метод POST:

public ActionResult SetCultureToNL() 
    { 
     SetCulture("nl-BE"); 

     return View("index"); 
    } 

private void SetCulture(String culture) 
    { 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

     if (httpContext.Request.Cookies["_Culture"] != null) 
     { 
      HttpCookie cultureCookie = new HttpCookie("_Culture", culture); 

      httpContext.Response.SetCookie(cultureCookie); 
     } 
     else 
     { 
      HttpCookie cookie = new HttpCookie("_Culture"); 
      cookie.Value = culture; 

      httpContext.Response.Cookies.Add(cookie); 
     } 
    } 

И метод GET:

public ActionResult Index() 
    { 
     string cultureName = GetCultureCookieValue(this.ControllerContext.HttpContext.ApplicationInstance.Context); 

      // Modify current thread's cultures    
      Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName); 
      Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
     // ... 
    } 

public static String GetCultureCookieValue(HttpContext httpContext) 
    { 
     HttpCookie cultureCookie = httpContext.Request.Cookies["_Culture"]; 

     if (cultureCookie != null) 
     { 
      return CultureHelper.GetImplementedCulture(cultureCookie.Value); 
     } 
     else 
     { 
      return CultureHelper.GetImplementedCulture(httpContext.Request.UserLanguages[0]); // obtain it from HTTP header AcceptLanguages 
     } 
    } 
+0

Когда мы должны были назвать «POST»? – ViVi

+0

Когда вы устанавливаете культуру – Yan

Смежные вопросы