2016-03-04 2 views
0

У меня есть три файла resx, которые я использую в приложении. По умолчанию это английский, но когда я хочу изменить язык приложения, изменится только пользовательский интерфейс. Контроллеры, кажется, остаются на английском, я чего-то не заметил?Невозможно изменить язык приложения

свойства файла ресурсов (набор для общественности)

enter image description here

изменить язык на _ViewStart.cshtml, как это (язык EN или DE)

Culture = UICulture = language; 

Я также попытался изменить язык в контроллере при входе в систему, но он не имеет никакого эффекта (если я прокомментирую код ViewStart, следующие строки ничего не делают, приложение все еще на английском языке)

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); 
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-DE"); 

У меня нет никакого языка, относящегося к web.config atm. Но если я поместил атрибут глобализации на немецкий язык приложения, но мне нужно изменить его изнутри приложения, поэтому я не могу использовать атрибут глобализации. Есть идеи?

В качестве примера, если я использую это в своем представлении @ Resource.Language, я всегда буду правильно выбирать язык пользователя, но если я использую ту же строку в контроллере и отправил строку в мое представление, это всегда на английском языке (игнорирует выбор пользователя)

ответ

1

Я подозреваю, что проблема заключается в том, что вам необходимо реализовать это для каждого запроса, а не только в контроллере входа. Посмотрите на решение здесь: https://stackoverflow.com/a/1561583/201648 (вам также может понравиться читать http://www.ryadel.com/en/setup-a-multi-language-website-using-asp-net-mvc/#Resource_Files_inMVC). Вам нужно будет создать атрибут и украсить ваш класс или действия этим. Если вы не хотите изменять значения маршрута, как они здесь делали, вы можете записать значение «культура-информация» в файл cookie при входе в систему, а затем получить это значение из файла cookie в DataAnnotation, например. в контроллере входа в систему:

HttpCookie iln8Cookie= new HttpCookie("iln8Cookie"); 
iln8Cookie["Language"] = "de"; //Replace with the user's language 
iln8Cookie["Culture"] = "DE"; //Replace with the user's culture 
iln8Cookie.Expires = DateTime.Now.AddDays(90); 
HttpContext.Response.SetCookie(iln8Cookie); 

Затем в аннотации данных прочитайте значение cookie, например.

public class InternationalizationAttribute : ActionFilterAttribute { 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { 

     var cookie = filterContext.HttpContext.Request.Cookies["iln8Cookie"]; 

     string language = cookie != null ? cookie.Values["Language"] : "en"; 
     string culture = cookie != null ? cookie.Values["Culture"] : "AU"; 

     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 

    } 
} 

Затем украсить класс или действие:

[Internationalization] 
public class HomeController : Controller { 

Кроме того, в зависимости от того, как работает Логин для этого приложения, информация о языке и культуре может быть уже доступны из пользовательского объекта, т.е.

filterContext.HttpContext.Request.UserLanguages[0] 

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

https://bitbucket.org/mrblurgle/test-internationalisation

+0

Спасибо, что помогли мне найти решение; –

+0

Без проблем - счастлив, что смогу помочь. –

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