2009-09-22 7 views
4

У меня есть мой целевой язык в сеансе ["lang"], который является либо «en», либо «it». Я добавил это к Site.Master:asp.net MVC: локализация

<script runat="server"> 
    void Page_Load(object sender, EventArgs e) { 
    string lang = Session["lang"].ToString(); 
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang); 
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang); 
    } 
</script> 

Тогда я хотел бы, чтобы вызвать строку ресурса, как это:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources:Global, test %>"></asp:Label> 

У меня есть два файла в App_GlobalResources, названные Global.resx и Global.en.resx.

проблема в том, что независимо от того, что находится в переменной LANG, я всегда получает результаты от основного Global.resx, и я никогда не получить английскую версию от Global.en.resx

Я делаю это неправильно?

Я попытался поместить часть System.Threading ... в метод Application_PreRequestHandlerExecute в Global.asax.cs, но результат был тот же.

Благодаря

PS: Я спрашиваю о пути, чтобы сделать эту работу простым способом. Если бы я использовал сложный способ, я бы пошел с этим: http://helios.ca/2009/05/27/aspnet-mvc-and-localization/

ответ

4

У меня была такая же дилемма (как реализовать локализацию) в моем приложении asp.net mvc.

Я следовал инструкциям here, и он работает как шарм.

Итак, я создал папку с именем «Локализация» в разделе «Содержимое», а затем создаю ресурсы resx для каждого языка, который я хочу перевести. Имейте в виду, что существует соглашение для имен файлов resx. т.е.

Resources.resx - это по умолчанию откат для всего.

Resources.en-GB.resx для английского GB

Resources.en-US.resx для английского США

и т.д.

Просто убедитесь, что вы будете следовать инструкциям, размещенные в ссылка встраивать и сделать ресурсы, доступные во всех местах в вашем приложении (просмотр, контроллеры и т.д.)

Edit:

Я хочу добавить, что я ОММ ited эта строка из web.config, так как я хотел вручную установить локальный из моего приложения.

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

Вместо я создал следующий класс:

public class SmartController : Controller 
{ 
    public SmartController() 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
     System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
    } 
} 

Все контроллеры наследуют от этого класса.

Поскольку это административный набор локали, я должен установить его из настроек моих приложений. Вы можете прочитать его из Cookies и установить его или иначе. Это и есть простейшее решение для локализации, с которым я столкнулся до сих пор.

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

<%= Resources.Strings.TranslatedTerm %> 
+0

Не полезно, извините: все, что он говорит, это то, что «Если вам нужно установить культуру в соответствии с предпочтением пользователя или параметром URL, лучше всего написать собственный HTTP-модуль или фильтр действий ». Возможно, тогда нет способа сделать это таким образом? – Palantir

+0

, конечно, есть способ установить культуру .. если пользователь предпочитает ваш сайт, то вы храните его в файле cookie, и вы создаете контроллер, который при создании экземпляра (конструктор) вы читаете cookie и устанавливаете CultureUI/Culture. Тогда все ваши контроллеры должны выйти из этого контроллера. – Konstantinos

+0

, когда вы прочтете свой язык и хотите его установить, вы делаете это так: System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo («en-US»); System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo («en-US»); – Konstantinos

3

Держу пари, что это дубликат.
В любом случае - все, что вам нужно, это here (при условии, что вы используете webforms viewengine (может работать с другими тоже, не исследовали)).

Ну ... вот идет мой «Резюме»:

хелперы только часть. Вы также должны внести некоторые изменения в свой механизм просмотра по умолчанию. В представлении createview/createpartialview он должен возвращать localizationwebformview, который добавляет ключ пути к viewdata, который используется htmlhelper, чтобы найти области resourceexpressionsfield и передать их классу localizationhelpers, который извлекает желаемое значение.

Маленький бонус =>

Это может быть удобно, если вы не хотите, чтобы обновить папки ресурсов для просмотра вложенных папок
(в случае, если вы измените viewengine.view/partialviewlocationformats):

private static string ReformatVirtualPath(string virtualPath) 
     { 
      //This allows NOT to duplicate App_localResources directory 
      // ~/Views/Shared/Partial/Some/BulltihS/_View.ascx 
      // turns into => 
      // ~/Views/Shared/_View.ascx 
      var start = @"(~(/?\w*/?){2})"; 
      var end = @"(\w*.as(c|p)x)"; 

      start = Regex.Match(virtualPath, start).Value; 
      end = Regex.Match(virtualPath, end).Value; 

      return start + end; 
     } 

использование:

internal static ResourceExpressionFields GetResourceFields 
      (string expression, string virtualPath) 
     { 
      virtualPath = ReformatVirtualPath(virtualPath); 

      var context = new ExpressionBuilderContext(virtualPath); 
      var builder = new ResourceExpressionBuilder(); 
      return (ResourceExpressionFields) 
        builder.ParseExpression(expression, typeof(string), context); 
     } 

EDIT:
, но это может быть аг ood идея избежать App_GlobalResources и App_LocalResources, как говорит К. Скотт Аллен (проверьте Константинос).

+0

Я бы поднял это предложение, если бы вы включили сводку информации на сайте. – tvanfosson

+0

Пробовал это уже, он связан повсюду, но он не рассказывает всю историю. Он просто предоставляет помощникам, чтобы получить информацию из файла ресурсов. У меня есть ошибка в моей настройке, и поэтому этот подход не будет работать в любом случае (проверьте первые два абзаца, вызов должен работать в любом случае, тогда статья о том, чтобы отойти от этого синтаксиса, чтобы думать о более стиле MVC). – Palantir

+0

Это ссылка на zip с исходным кодом, который вы должны исследовать => http://www.eworldui.net/files/LocalizationHelpers.zip –

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