Где я помещаю переводы для Ember-I18n в Ember-CLI?
Я новичок в ember, и ember-cli, и я все еще узнаю, где все идет. Я пытаюсь добавить многоязычную поддержку с помощью ember-i18n.
У меня есть зависимости, установленные с bower
bower install cldr ember-i18n --save
И у меня есть импорт в Brocfile.js
app.import('vendor/cldr/plurals.js');
app.import('vendor/ember-i18n/lib/i18n.js');
В моем приложении помощник руля i18n работает
{{t hello}}
дает мне "Missing translation: hello"
Я не знаю, куда помещать или ссылаться на файл в структуре папок ember-cli, которая содержит переводы.
В документе ember-i18n он выглядел бы как-то вроде этого
Ember.I18n.translations = {
hello: "Hello World",
}
Я попытался вставить его в app.js
, чтобы увидеть, как он работает, но получил ошибку:
Uncaught TypeError: Cannot set property 'translations' of undefined
Ответы
Ответ 1
Вы можете добавить свои переводы в initializer
(docs здесь).
С ember-cli вы можете сгенерировать его, выполнив ember generate initializer i18n
в командной строке.
Внутри инициализатора вы можете установить переводы:
var TRANSLATIONS = {
'user.edit.title': 'Edit User',
'user.followers.title.one': 'One Follower',
'user.followers.title.other': 'All {{count}} Followers',
'button.add_user.title': 'Add a user',
'button.add_user.text': 'Add',
'button.add_user.disabled': 'Saving...'
};
var i18nInitializer = {
name: 'i18n',
initialize: function() {
Ember.I18n.translations = TRANSLATIONS;
}
};
export default i18nInitializer;
Если вы хотите получить данные языка через ajax в файле java-properties
, вы можете получить его с помощью ajax и проанализировать его с помощью java-properties.js. Он также доступен через Bower
Ответ 2
У меня были те же проблемы, что и Уэстон, и после некоторых исследований я реализовал решение для этого, которое может динамически загружать язык, указанный пользователем. Это, вероятно, слишком поздно для OP, но я помещаю его здесь для будущих справок для всех, у кого могут возникнуть вопросы об этом процессе.
Мое решение не может быть идеальным способом справиться с этим, но, похоже, он хорошо работает с моим сайтом.
Я использую Ember-cli и включаю ember-i18n для интернационализации, а также CLDR для обработки множественных чисел. Мой сайт использует файл cookie для хранения пользовательского языка, который используется для загрузки соответствующего языкового файла при загрузке сайта. Печенье также передается вместе с службой REST (некоторые API возвращают объекты, которые могут содержать переведенный текст). Я использую jQuery-cookie для обработки файлов cookie.
Сначала я создал свои файлы переводов, по одному для каждого языка, которые являются только файлами javascript, которые я буду загружать с использованием $.getScript. Я сохранил их в папке "переводы" в общедоступной /javascript папке Ember-cli.
переводческая en.js
Ember.I18n.translations = {
'hello' : 'Hello World!',
...
}
переводческая fr.js
Ember.I18n.translations = {
'hello' : 'Bonjour Monde!',
...
}
Затем я устанавливаю инициализатор для CLDR, который устанавливает язык по умолчанию на основе пользовательского файла cookie, используемого моим сайтом - если cookie еще не существует, он по умолчанию имеет значение "en" и создает файл cookie.
\приложение\Инициализаторы\cldr.js
export default {
name: 'cldr',
initialize: function() {
var lang = $.cookie('user-lang');
if (lang === undefined) { // no cookie exists yet
lang = 'en';
$.cookie('user-lang', lang, {expires:365, path:'/'});
}
CLDR.defaultLanguage = lang;
}
};
Теперь в функции Application Route beforeModel я захватываю файл переводов на основе значения, хранящегося в CLDR.defaultLanguage.
\приложение\маршруты\application.js
export default Ember.Route.extend({
beforeModel: function() {
$.getScript('./javascript/translations/translations-' + CLDR.defaultLanguage + '.js')
.fail(function(jqxhr, reason, exception) {
// handle failure
});
}
});
Если на вашем сайте большое количество строк перевода или на многих языках, вы можете не захотеть, чтобы ваши файлы переводов были включены каждый раз, когда кто-то загружает ваше приложение, или может потребоваться некоторое время для загрузки. В этом случае вы можете заменить этот getScript на вызов ajax и получить файл, обслуживаемый вашим бэкэнд. В моем случае не так много строк перевода, так что это нормально.
В любое время, когда пользователь хочет изменить язык, все, что мне нужно сделать, это обновить значение моего файла cookie user-lang, а затем перезагрузить сайт, который снова пройдет через функции initializer и beforeModel и загрузит соответствующий языковой файл.
export default Ember.Controller.extend({
actions: {
changeLanguage: function(lang) {
$.cookie('user-lang', lang);
window.location.reload();
}
}
});
Каждый раз, когда пользователь перезагружает страницу или возвращается на сайт, их последний выбранный язык будет загружен из файла cookie по умолчанию. Конечно, пользователь может удалить свой файл cookie или войти в другой браузер, и в этом случае сайт вернется к стандарту "en". Чтобы обойти это, выбор языка пользователя должен будет сохраняться где-то в фоновом режиме и загружаться при загрузке приложения - но это другая задача.
Ответ 3
Пространство имен неверно.
Вам нужно Em.I18n.translations
.
Пробовал. Работает.
Я не знаю, куда помещать или ссылаться на файл в структуре папок ember-cli, которая содержит переводы.
Я тоже. Конечно, app.js
работает, но, возможно, кто-то может дать хороший намек. Я новичок во всех материалах ember-cli...