2013-04-09 2 views
0

Основано на this tutorial Я пытаюсь иметь возможность интернационализации в своем проекте. У меня есть эти файлы ресурсов для сохранения слов на разных языках:asp.net исходные файлы MVC для интернационализации

Resources.resx -> для языка по умолчанию (EN-US)

resources.fa.resx -> для языка фарси

resources.es.resx -> для испанского языка

слова, подобные fa и es показаны культуры.

в views я заменил слова с их равными в файлах ресурсов таким образом:

<a href="#" >@Resources.IranNewsStand</a> 

Edit: Я реализовал всю логику на основе tutorial.but У меня есть один вид для все языки и в этом представлении я использую resources.resx. Это правильная логика?

Мой вопрос в том, как мой проект знает, для загрузки какого файла ресурсов на основе значения Thread.CurrentThread.CurrentCulture? Что я упустил?

Edit: Я реализовал эти шаги:

1-я есть Class Library Project имени Resources, содержащий три упомянутых Resx файлов (Resources.resx, resources.fa.resx, resources.es.resx).

2- Resource project добавлен в мое приложение mvc в качестве ссылки.

3-контроллеры наследует этот базовый контроллер:

public class BaseController : Controller 
{ 
    protected override void ExecuteCore() 
    { 
     string cultureName; 
     HttpCookie cultureCookie = Request.Cookies["_culture"]; 
     if (cultureCookie != null) 
      cultureName = cultureCookie.Value; 
     else 
      cultureName = Request.UserLanguages[0]; 
     cultureName = utilities.CultureHelper.GetValidCulture(cultureName); 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
     base.ExecuteCore(); 
    } 
} 

4-я сказал в view я использовал строку ресурсов из resource.resx файла, содержащего язык по умолчанию (EN-US) строки:

<p>@Resources.Resources.Home</p> 

5-в виду у меня есть ссылка, что при нажатии на нее, это JQuery код запуска:

<script type="text/javascript"> 
     $("#btnChangeLanguage").click(function() { 
      $.cookie("_culture", "fa-IR", { expires: 365, path: '/' }); 
      window.location.reload(); // reload 
     }) 
    </script> 

fa-IR - культура, выбранная пользователем. Но при нажатии на эту ссылку язык не изменяется.

Edit: Решение

Я нашел 2 проблемы в моем проекте, решая их сделал все в порядке:

1-JQuery печенье плагин должен иметь Jquery код работать correctely:

<script type="text/javascript" src="~/Scripts/jquery.cookie.js" ></script> 

2-Событие ExecuteCore в BaseController не срабатывало, и это звучит так, как будто это было проблемой в asp.net MVC 4. Так на основе this question Я попытался вместо этого вместо OnActionExecuted.

+1

Вы говорите, что интернационализация не работает? Загруженный ресурс будет выбран на основе строки культуры, предоставляемой вашим браузером. –

+0

, но я использую строки в resources.resx в представлениях, это означает язык по умолчанию. Правильно ли это? –

+0

Можете ли вы проверить, просматривается ли файл cookie сервером? Кроме того, на странице просмотра попробуйте выполнить рендеринг @ System.Diagnostics.Thread.CurrentThread.CurrentCulture, чтобы проверить, не установлен ли он там. – Eilon

ответ

2

Логика вытягивания ресурса на основе текущей культуры встроена в сам .NET.

Есть два шага к этому:

  1. Текущая культура должна быть установлена ​​соответствующим образом в запросе. ASP.NET имеет некоторые встроенные механизмы для этого, например, то, что описано в статье, к которой вы привязались.
  2. После того, как это установлено, .NET Framework будет использовать текущую культуру запроса для загрузки соответствующего ресурса. Если запрошенный языковой стандарт недоступен, будет загружен нейтральный ресурс культуры («резервный»).
+0

Я отредактировал question.take a look plz –

+1

@asma ничего не выглядит неправильно в том, что вы делаете. Если что-то не работает, отредактируйте вопрос, чтобы точно указать, что не работает. – Eilon

+0

вопрос был отредактирован. –

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