Я недавно боролся с той же проблемой.
Найти чистый способ сделать это было довольно сложной задачей - большинство альтернатив были либо ..
1) Дублируйте базу кода для каждой локали (WTH)
2) Загрузите локализованные файлы, переопределяющие каждый из ваших компонентов (Ад обслуживания? Как насчет плохих переводчиков?)
3) Использовать / генерировать статический файл, содержащий переводы и ссылаться на него (все языки загружены? Дополнительный этап сборки для его генерации? Как их синхронизировать?)
Я пытался получить лучшее из всех миров и в итоге получил служебный класс, отвечающий за:
1) Загрузка файлов перевода ExtJS (которые в основном применяют переопределения к базовым компонентам extjs)
2) Загрузка набора ресурсов для конкретного языка (с указанием выбранного языка) с сервера.
3) Прототипирование строки с помощью метода translate (), который запрашивает загруженное хранилище (содержащее пакет сообщений с сервера) и возвращает перевод на основе значения строки.
Это суть вещей:
Комплектация и прототипирование:
localeStore.load({
callback : function(records, operation, success) {
// Define translation function (NB! Must be defined before any components which want to use it.)
function translate() {
var record = localeStore.getById(this.valueOf()) ;
if(record === null) {
alert('Missing translation for: ' + this.valueOf()); // Key is not found in the corresponding messages_<locale>.properties file.
return this.valueOf(); // Return key name as placeholder
} else {
var value = record.get('value');
}
return value;
}
String.prototype.translate = translate;
callback.call(); // call back to caller(app.js / Ext.Application), loading rest of application
}
});
Как пример из вида:
this.copyButton = Ext.create('Ext.button.Button', {
disabled: true,
text: 'DOCUMENT_LIBRARY_MENU_COPYTO_BUTTON'.translate(),
action: 'openCopyDialog'
});
Пакет на сервере (mesages_en.properties):
DOCUMENT_LIBRARY_MENU_COPYTO_BUTTON = Копировать файл
и т.д ..
Плюсы:
- Код без суеты, Your_key'.translate () облегчает чтение и понимание того, что это локализованная строка
- Нет / небольшие накладные расходы на обслуживание (Сохранение файла переопределения для каждой локали? Иисус ..)
- Вы загружаете только нужный вам язык, а не весь шабан.
- Если вы действительно хотите, вы можете даже иметь свой собственный перевод для файлов локали ExtJS в том же комплекте.
- Вы можете написать модульные тесты, чтобы гарантировать, что все пакеты содержат одинаковые ключи, что позволит избежать трансляций с потерями позже
Минусы:
- Синхронный - магазин должен быть загружен до запуска вашего основного приложения. Я решил эту проблему, добавив обратный вызов из служебного класса, который вызывался после загрузки всех текстов.
- Нет текстового наполнения в реальном времени ... хотя я не хотел, чтобы мои пользователи также перегружали сервер: P
Пока что мой подход довольно хорошо сработал для моих требований.
Загрузка сайта не становится заметно медленнее, и пакеты (содержащие ~ 200 ключей / значений в каждом пакете) во время загрузки имеют размер около 10 КБ.