Передовая практика локализации и глобализации строк и меток [закрыто]


Я член команды с более чем 20 застройщиками. Каждый разработчик работает над отдельным модулем (что-то около 10 модулей). В каждом модуле мы могли бы иметь по крайней мере 50 CRUD форм, что означает, что в настоящее время у нас есть около 500 добавить кнопки,сохранить кнопки,изменить кнопки и т. д.

однако, поскольку мы хотим глобализовать наше приложение, нам нужно иметь возможность переводить тексты в нашем приложении. Например, везде, слово добавить должны стать ajouter для французских пользователей.

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

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

еще одним вариантом может быть отсутствие переводческого словаря и использование онлайн-переводческих сервисов, таких как Google Translate, Bing Translator и т. д.

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

каков наилучший или наиболее известный метод глобализации и локализации строковых ресурсов приложения?

3 98

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?