2013-08-25 3 views
17

Я создаю новое приложение прямо сейчас, и я хочу сделать все правильно с самого начала, чтобы я мог расти вместе с ним в будущем.Многоязычное приложение MVC 4

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

Некоторые уроки старые, и я не знаю, устарели ли они.

http://www.codeproject.com/Articles/352583/Localization-in-ASP-NET-MVC-with-Griffin-MvcContri http://geekswithblogs.net/shaunxu/archive/2012/09/04/localization-in-asp.net-mvc-ndash-upgraded.aspx http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx http://www.chambaud.com/2013/02/27/localization-in-asp-net-mvc-4/ https://github.com/turquoiseowl/i18n

я обнаружил, что они являются 2 способа хранения данных языка, либо в БД или в файлах ресурсов. Что такое pro/cons? Есть ли другой способ, который предпочтительнее?

Это то, что я хочу:

  1. Простота в обслуживании (Добавить/Изменить/удалить)
  2. Полная поддержка языка. (виды, валюта, время/дата, jQuery, аннотации и т. д.)
  3. Позволяет изменить язык.
  4. Автоматическое определение языка.
  5. Будущее безопасно.

Каков предпочтительный способ сделать это? получил хороший учебник, который лучше всего подходит для 2013 года?

ответ

1

У меня есть подход для себя, основанный на db, однако он может не подходить для приложений большого масштаба.

Я создаю таблицу или объект для хранения названий и текстов, которые должны быть многоязычными.

Таким образом, всякий раз, когда я хочу, чтобы сделать вид, сначала я получить соответствующий перевод из БД и затем передать его в представление в качестве модели:

var t = dbCtx.Translations.Find(langID); 
// ... 
return View(t); 

И в поле зрения, я визуализации контента, как следующее :

<tr> 
    <td>@Html.DisplayFor(m => m.WelcomeMessage)</td> 
    <td>@Url.Action(Model.EnterSite, "Index", "Home")</td> 
</tr> 

И о получении соответствующего ответа, ну, у вас есть несколько способов. Вы можете использовать сеанс:

Session["Lang"] = "en"; 
// ... 
var lang = (string)Session["Lang"] ?? "en"; 

Или путем передачи его через строку запроса или их комбинацию.

Для языка автоматического обнаружения, вы должны решить следующее:

а) Детектирование из браузера

б) Обнаружение от IP пользователя и угадывание гео расположения его/ее и установив соответствующий язык для его/ее

0

Я искал те же источники, что и вам, для тех же нужд, но, как вы говорите, очень сложно найти одно из предпочтительных решений.

Но я решил пойти с решением Майкла Чамбо, которое вы связали в своем вопросе. Причин для этого было то, что его было легко реализовать, дал мне url, которого я хотел, и так как я все еще не уверен на 100% ... легко заменить в будущем.

В дополнение к этому я буду использовать jquery globalize для форматирования на стороне клиента.

Было бы действительно интересно узнать, какое решение вы решили?

1

У меня есть ощущение, что у этого вопроса нет прямого ответа. Для форматирования и того, что вы не должны всегда использовать Culture и UICulture, например, «en-GB» для британского английского и «en-US» для американского английского (да, есть разница). Все .Net построено вокруг него, и таким образом вы можете использовать локальное форматирование, не думая об этом.

Вы должны также проверить пространство имен System.Globalization для более подробной информации: http://msdn.microsoft.com/en-us/library/system.globalization%28v=vs.110%29.aspx

Что касается были культура должна исходить от, то, по крайней мере, в нашей компании политика всегда без исключения из строки запроса. Причиной этого является то, что если вы используете локализацию IP, например, если испанский пользователь смотрит на испанский сайт в Японии, а затем переключается на японскую версию, то не совсем неправильно, но может раздражать, если вы сказали клиент, что это прямая испанская ссылка или что-то в этом роде. Тем не менее, если культура не определена в строке запроса, то использование IP для угадывания с языком, который пользователь хотел бы иметь, не будет плохой идеей, но на самом деле зависит от потребностей ваших клиентов.

Что касается того, чтобы получить переводы, то это действительно зависит, и ресурсы, и БД имеют свои взлеты и падения. Таким образом, основные точки для БД - это то, что их легко распределить между приложениями, и если вам нужно обновить фразу по любой причине, то вы можете обновить их все через одну запись в БД, но это может быть и ошибкой, потому что некоторые фразы имеют двойное значение и могут быть переведены совершенно по-другому на других языках, хотя одно и то же предложение используется на английском языке. Другая большая проблема с БД заключается в том, что до некоторой степени (но это зависит от реализации) вы теряете интеллект в VS для фраз.

Ресурсы, конечно, имеют соответствующий интеллект, но они довольно статичны для используемого вами веб-приложения, вы не можете делиться ресурсами между приложениями ... ну не совсем верно, но более или менее вы не можете. Хотя этот статический характер также является плюсом, потому что все ресурсы содержатся в приложении, и вы знаете, что никакой внешний эффект не может повлиять на него.

В действительности это действительно зависит от проекта в руке. вам просто нужно сделать свои собственные плюсы и минусы и решить для себя ... извините. Но если это вообще поможет, я могу рассказать вам, как обстоят дела в моей компании. Мы делаем несколько приложений, которые используют одни и те же фразы в разных веб-приложениях. Раньше у нас это было в БД, но произошло то, что переводы продолжали идти массивом, то есть клиент попросил улучшить перевод на испанском языке для одного приложения, но это не имело никакого смысла, что когда-либо было на других. Это произошло больше, чем вы могли подумать. Затем мы перешли к ресурсам, но произошло то, что когда обновление одного приложения было обновлено, никто не помнил, чтобы обновлять другие приложения, и на самом деле случилось, что 3 разных приложения перевели один и тот же термин тремя разными способами. В конце концов мы решили вернуться к БД, потому что способность менять все переводы сразу означала для нас больше, а затем тот факт, что внешнее влияние не может повлиять на нее.

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

Сказано, что если DB и вызовы БД разработаны плохо, то добавление новых языков может быть проще с ресурсами, просто скопируйте файл ресурсов, добавьте расширение культуры к имени и добавьте перевод на ресурс, и вы выполняются, но опять же, полностью вплоть до проектирования БД, так что это нужно иметь в виду при разработке БД и ничего не говорит о проведении переводов в БД.

В целом я бы сказал, что ресурсы проще в использовании и очень удобны в обслуживании и расширении (и они уже встроены в .NET), хотя у DB есть явное преимущество, если вам нужно делиться переводами. Поэтому, если бы я сказал, что рекомендую использовать ресурсы, но у БД есть место, и это действительно зависит от проекта.

12

Я written a blog post convering следующий аспект многоязычном ASP.NET MVC приложение:

База данных: Я разделить таблицу на две части, одна содержит непереводимых полей другой содержит поля, которые необходимо перевести ,

Url Routes: Я обычно поддерживаю культуру в URL-адресе таким образом, что вы получаете хорошо проиндексированный сайт ML.

routes.MapRoute(
    name: "ML", 
    url: "{lang}/{controller}/{action}/{id}", 
    defaults: new { lang = "en-CA", controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Из класса базового контроллера вы можете сделать параметры {lang} доступными для вашего контроллера. См. Запись в блоге для всех деталей.

Выполнение запроса данных: Вы просто передадите Культуру в свой репозиторий или контекст базы данных. Идея заключается в создании модели представления, которая объединяет две таблицы, которые вы разделили для перевода.

public ActionResult Index(string id) 
{ 
    var vm = pages.Get(id, Language); // Language is the {lang} from the route 
    return View(vm); 
} 

Ваши Просмотров: С помощью .NET ресурсов файл с общим кодом языка из двух букв, например: HomePage.en.resx, HomePage.fr.resx. Языковой ан * -US *, еп * -ca * полезен для форматирования валюты, даты, номера и т.д. Ваш файл ресурсов будет в основном, вероятно, будет то же самое для английского языка США, Канады и т.д.

Используйте такой формат, как imagename-en.png, imagename-fr.png. Из ваших просмотров сделать {Ланг} Параметр маршрут доступен через метод расширения и отображения изображения, как это:

<img src="/content/logos/[email protected]()" /> 

Вы также можете иметь полную отдельную папку для вашего языка, поддерживаемого. Пример: /content/en/imagename.png, /content/fr/imagename.png.

JavaScript:: Обычно я создаю имя папки LanguagePacks и JS-файлов, называемых Lang-en.js, Lang-fr.js.Идея заключается в том, чтобы создать «статический» класс, который можно использовать во всем других ваших JS файлов:

// lang-en.js 
var Lang = { 
    globalDateFormat = 'mm-dd-yy'; 
    greeting: 'Hello' 
}; 

На Фототуров, вы загружаете правильный язык файл

<script type="text/javascript" src="/content/js/languagepacks/[email protected](this.CurrentLanguage()).js"></script> 

из модуля JavaScript

// UI Module 
var UI = function() { 

    function notify() { 
    alert(Lang.greeting); 
    } 
    return { 
    notify: notify 
    } 
}; 

Нет никакого способа сделать многоязычное веб-приложение. Используйте ресурсы для перевода текста, они могут быть быстро заменены во время выполнения. У вас есть несколько редакторов, которые могут открывать те, которые вы можете передать переводчику и т. Д.

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

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