Передовая практика локализации и глобализации строк и меток [закрыто]
Я член команды с более чем 20 застройщиками. Каждый разработчик работает над отдельным модулем (что-то около 10 модулей). В каждом модуле мы могли бы иметь по крайней мере 50 CRUD форм, что означает, что в настоящее время у нас есть около 500 добавить кнопки,сохранить кнопки,изменить кнопки и т. д.
однако, поскольку мы хотим глобализовать наше приложение, нам нужно иметь возможность переводить тексты в нашем приложении. Например, везде, слово добавить должны стать ajouter для французских пользователей.
то, что мы делали до сих пор, заключается в том, что для каждого представления в пользовательском интерфейсе или уровне представления у нас есть словарь пар ключ/значение переводов. Затем при визуализации представления мы переводим необходимые тексты и строки с помощью этого словаря. Тем не менее, этот подход, мы пришли, чтобы иметь что-то около 500 добавить в 500 словарей. Это значит, что мы нарушили сухой принцип.
на с другой стороны, если мы централизовать общие строки, как положить добавить в одном месте и попросите разработчиков использовать его везде, мы сталкиваемся с проблемой не быть уверенными, если строка уже определена в централизованном словаре или нет.
еще одним вариантом может быть отсутствие переводческого словаря и использование онлайн-переводческих сервисов, таких как Google Translate, Bing Translator и т. д.
еще одна проблема, с которой мы столкнулись, заключается в том, что некоторые разработчики стресс от доставки проекта вовремя не могу вспомнить ключи перевода. Например, для текста кнопки Добавить разработчик использовал добавить в то время как другой разработчик использовал new и т. д.
каков наилучший или наиболее известный метод глобализации и локализации строковых ресурсов приложения?
3 ответа:
насколько я знаю, есть хорошая библиотека под названием
localeplanet
для локализации и интернационализации в JavaScript. Кроме того, я думаю, что он является родным и не имеет зависимостей от других библиотек (например, jQuery)вот сайт библиотеки:http://www.localeplanet.com/
Также посмотрите на эту статью Mozilla, вы можете найти очень хороший метод и алгоритмы для перевода на стороне клиента: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with-a-little-help-from-json-and-the-server/
общая часть всех этих статей/Библиотеки заключается в том, что они используют
i18n
иget
метод (в некотором смысле также определяет меньшее имя функции, например_
) для получения/преобразованияkey
доvalue
. В моем объясненииkey
означает, что строка, которую вы хотите перевести иvalue
означает в переводе строка.
Затем вам просто нужен документ JSON для храненияkey
иvalue
' s.например:
var _ = document.webL10n.get; alert(_('test'));
и вот JSON:
{ test: "blah blah" }
я считаю, что использование текущих популярных библиотек решений является хорошим подходом.
если вы столкнулись с проблемой решить (и честно говоря, кто не в эти дни?), основная стратегия, обычно принимаемая нами компьютерными людьми называется "разделяй и властвуй.- Это звучит так:
- осмыслить конкретную проблему в виде набора меньших подзадач.
- решить все мелкие проблемы.
- объединить результаты в решение конкретной проблемы.
но "разделяй и властвуй" это не единственная возможная стратегия. Мы также можем принять более общий подход:
- осмыслить конкретную проблему как частный случай более общей проблемы.
- как-то решить общую проблему.
- адаптировать решение общей проблемы к конкретной проблеме.
- Эрик Липперт
Я считаю, что многие решения уже существуют для этой проблемы на серверных языках, таких как ASP.Net/C#.
Я изложил некоторые из основных аспектов проблемы
вопрос: нам нужно загрузить данные только для нужного языка
решение: для этого мы сохраняем данные в отдельные файлы для каждого языка
ex. res.de.js, res.fr.js РЭС.Ан.js, res.js (для языка по умолчанию)
вопрос: Файлы ресурсов для каждой страницы должны быть разделены, поэтому мы получаем только необходимые нам данные
решение: мы можем использовать некоторые инструменты, которые уже существуют как https://github.com/rgrove/lazyload
проблема: нам нужна структура пары ключ/значение для сохранения наших данных
решение: я предлагаю объект javascript вместо string / string air. Мы можем воспользоваться технологией IntelliSense из IDE
вопрос: общие члены должны храниться в общедоступном файле и все страницы должны иметь к ним доступ
решение: для этого я делаю папку в корне веб-приложения под названием Global_Resources и папку для хранения глобального файла для каждой подпапки мы назвали его "Local_Resources"
проблема: каждый член subsystems / subfolders / modules должен переопределять члены Global_Resources на их объем
решение: я рассматривал файл для каждого
Структура Приложения
root/ Global_Resources/ default.js default.fr.js UserManagementSystem/ Local_Resources/ default.js default.fr.js createUser.js Login.htm CreateUser.htm
соответствующий код для файлы:
Global_Resources / default.js
var res = { Create : "Create", Update : "Save Changes", Delete : "Delete" };
Global_Resources/default.fr.js
var res = { Create : "créer", Update : "Enregistrer les modifications", Delete : "effacer" };
файл ресурсов для нужного языка должен быть загружен на страницу, выбранную из Global_Resource - Это должен быть первый файл, который загружается на всех страницах.
UserManagementSystem / Local_Resources / default.js
res.Name = "Name"; res.UserName = "UserName"; res.Password = "Password";
UserManagementSystem/Local_Resources/default.fr.js
res.Name = "nom"; res.UserName = "Nom d'utilisateur"; res.Password = "Mot de passe";
UserManagementSystem / Local_Resources / createUser.js
// Override res.Create on Global_Resources/default.js res.Create = "Create User";
UserManagementSystem/Local_Resources/createUser.fr.js
// Override Global_Resources/default.fr.js res.Create = "Créer un utilisateur";
диспетчер.js файл (этот файл должен быть загружен последним)
res.lang = "fr"; var globalResourcePath = "Global_Resources"; var resourceFiles = []; var currentFile = globalResourcePath + "\default" + res.lang + ".js" ; if(!IsFileExist(currentFile)) currentFile = globalResourcePath + "\default.js" ; if(!IsFileExist(currentFile)) throw new Exception("File Not Found"); resourceFiles.push(currentFile); // Push parent folder on folder into folder foreach(var folder in parent folder of current page) { currentFile = folder + "\Local_Resource\default." + res.lang + ".js"; if(!IsExist(currentFile)) currentFile = folder + "\Local_Resource\default.js"; if(!IsExist(currentFile)) throw new Exception("File Not Found"); resourceFiles.push(currentFile); } for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); } // Get current page name var pageNameWithoutExtension = "SomePage"; currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ; if(!IsExist(currentFile)) currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ; if(!IsExist(currentFile)) throw new Exception("File Not Found");
надеюсь, что это помогает :)
jQuery.i18n это легкий плагин jQuery для включения интернационализации на ваших веб-страницах. Это позволяет упаковать пользовательские строки ресурсов в ‘.файлы свойств, как и в пакетах ресурсов Java. Он загружает и анализирует пакеты ресурсов (.свойства) на основе предоставленного языка или языка, сообщенного браузером.
чтобы узнать больше об этом взгляните на как интернационализировать свои страницы с помощью JQuery?