Найкраща практика локалізації та глобалізації рядків та міток [закрито]


124

Я член команди з більш ніж 20 розробниками. Кожен розробник працює над окремим модулем (щось близько 10 модулів). У кожному модулі у нас може бути принаймні 50 форм CRUD, це означає, що в даний час у нас є близько 500 кнопок додавання , збереження кнопок , кнопок редагування тощо.

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

Ми зробили до цього, що для кожного перегляду в інтерфейсі користувача або шару презентації ми маємо словник пар перекладів ключових / значущих. Потім, надаючи перегляд, ми перекладаємо потрібні тексти та рядки за допомогою цього словника. Однак, за цим підходом у нас з’явилося щось близько 500, що додається в 500 словниках. Це означає, що ми порушили принципи DRY.

З іншого боку, якщо ми централізуємо загальні рядки, як-от поставити додавання в одне місце, і попросимо розробників використовувати його скрізь, ми стикаємося з проблемою не бути впевненою, чи рядок уже визначений в централізованому словнику чи ні.

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

Ще одна проблема, з якою ми стикаємось, полягає в тому, що деякі розробники під час стресової доставки проекту не можуть запам'ятати ключі перекладу . Наприклад, для тексту кнопки додавання розробник використовував додавання, тоді як інший розробник використовував новий і т.д.

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


2
Розмова по Alex Sexton на тему стороні клієнта Інтернаціоналізація з конференції JS ЄС є хорошим початком.
Мінько Гечев

Відповіді:


51

Наскільки я знаю, є хороша бібліотека, яка закликає 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і.

Наприклад:

var _ = document.webL10n.get;
alert(_('test'));

І ось JSON:

{ test: "blah blah" }

Я вважаю, що використання сучасних популярних бібліотечних рішень - це хороший підхід.


1
Без образи, але чи не це те, що Афшин вже намагався? Його проблема полягає в тому, що різним розробникам важко запам'ятати, які ключі використовувати. Я згоден з тим, що ваш описаний метод - це шлях. Я не бачу, як може бути інакше. Дякуємо за чудові посилання btw.
Спок

47

Коли ви стикаєтеся з проблемою вирішити (і, чесно кажучи, хто цього дня не буває?), Основна стратегія, яку зазвичай приймають ми, комп'ютерні люди, називається "розділити і перемогти". Виходить так:

  • Концептуалізуйте конкретну проблему як сукупність менших підзадач.
  • Вирішіть кожну меншу задачу.
  • Об’єднайте результати в вирішення конкретної проблеми.

Але "розділити і перемогти" - це не єдина можлива стратегія. Ми можемо також скористатися більш загальним підходом:

  • Концептуйте конкретну проблему як особливий випадок більш загальної проблеми.
  • Якось вирішити загальну проблему.
  • Пристосувати рішення загальної задачі до конкретної проблеми.

- Ерік Ліпперт

Я вважаю, що для вирішення цієї проблеми існує вже багато рішень у мовах на стороні сервера, таких як ASP.Net/C#.

Я окреслив деякі основні аспекти проблеми

  • Проблема : нам потрібно завантажити дані лише для потрібної мови

    Рішення : Для цього ми зберігаємо дані в окремі файли для кожної мови

колишній res.de.js, res.fr.js, res.en.js, res.js (для мови за замовчуванням)

  • Проблема: Файли ресурсів для кожної сторінки повинні бути розділені, щоб ми отримали лише потрібні нам дані

    Рішення : Ми можемо використовувати деякі інструменти, які вже існують, як-от https://github.com/rgrove/lazyload

  • Проблема: нам потрібна структура пари / значення пари, щоб зберегти наші дані

    Рішення : Я пропоную об’єкт javascript замість string / string air. Ми можемо отримати користь від інтелігенції від IDE

  • Випуск: Загальні члени повинні зберігатися в загальнодоступному файлі, і всі сторінки мають доступ до них

    Рішення : Для цього я роблю папку в корені веб-програми під назвою Global_Resources і папку для зберігання глобального файлу для кожної підпапки, яку ми назвали її "Local_Resources"

  • Проблема: Кожен член підсистем / підпапок / модулів повинен перекривати членів 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";

файл manager.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");

Сподіваюся, це допомагає :)


7
Єдине, що мені не подобається в цьому підході, це те, що локалізація та розробка є щільно пов'язаними ... Тож коли додається англійська (яка б не була за замовчуванням) рядок, решта Мов повинні бути оновлені за допомогою коду. Я вважаю за краще створити JSON за допомогою інструменту з певного типу файлів перекладів. Все-таки гарне представництво!
Нейт-Вілкінс

зробили так само, як і для локалізації, ви можете бачити це в цьому запиті: stackoverflow.com/q/53864279/4061006 . Єдине, як ви перекладаєте Global_Resources / default.js на Global_Resources / default.fr.js? Який інструмент / комплект ви використовуєте для перетворення цих файлів на потрібні мови. Оскільки мені це теж потрібно
Jayavel

Ви повинні зберігати читаний людиною коментар поруч із кожною клавішею, де описується, куди йде рядок і що це означає, щоб ви могли передати перекладачеві (або собі) більше контексту, коли ви збираєтесь додати нову мову, і ви забули, що деякі з рядків означає. Наприклад, зробіть щось подібне "Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"}до локалізації розширень Chrome . Або створити окремий файл із цими коментарями.
Борис

13

jQuery.i18n - це легкий плагін jQuery для вмикання інтернаціоналізації у ваших веб-сторінках. Це дозволяє упакувати власні рядки ресурсів у файли '.properties', як і в пакети ресурсів Java. Він завантажує та аналізує набори ресурсів (. Властивості) на основі наданої мови або мови, про яку повідомляє браузер.

Щоб дізнатися більше про це, подивіться, як інтернаціоналізувати ваші сторінки за допомогою JQuery?


Посилання
Олександр Фарбер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.