我在我的应用程序中使用 Backbone.js 和 i18next我的应用程序上的语言切换功能插件。当我将一个值传递给 lng
init
中的选项函数调用,然后它会正确翻译我的页面。
现在我想通过语言选择器动态地执行此操作。我有一个 <select>
四种语言,我想将所选语言的值传递给 lng
初始化函数的选项。
这是我的代码:
HTML
<div class="col-xs-6>
<select class="form-control language-selector">
<option value="de">Deutsch</option>
<option value="en">English</option>
<option value="fr">Français</option>
<option value="it">Italiano</option>
</select>
</div>
JavaScript
i18next.init({
debug: true,
languages: ['de','en','fr','it'],
lng: 'de',
fallbackLng: false,
load: 'current',
resources: resBundle
}, function(err, t){
});
'change .language-selector': function(e){
e.preventDefault();
i18next.setLng($(e.target).val(), (err, t) => {
console.log(arguments);
this.render();
});
}
最佳答案
改变语言的函数是i18next.changeLanguage
。您只需调用它,无需再次调用 init
或“更改初始化选项”,因为选项是 i18next 中的属性,它们通过 API 进行管理(功能)。
i18next.init({
lng: 'en',
fallbackLng: ['en', 'de', 'fr', 'it'],
});
// catch the event and make changes accordingly
i18next.on('languageChanged', (lng) => {
// E.g. set the moment locale with the current language
moment.locale(lng);
// then re-render your app
app.render();
});
在带有语言选择器的 View 中:
const LangView = Backbone.View.extend({
events: {
'change .language-selector': 'onLangChange',
},
onLangChange(e) {
// only change the language
i18next.changeLanguage(e.currentTarget.value);
}
});
概念验证
const app = {};
app.translations = {
"fr": {
"translation": {
"label": "Choisir une langue",
"fr": "Français",
"en": "Anglais"
}
},
"en": {
"translation": {
"label": "Choose a language",
"fr": "French",
"en": "English"
}
}
};
i18next.init({
lng: 'en',
fallbackLng: ['en', 'fr'],
resources: app.translations,
});
// catch the event and make changes accordingly
i18next.on('languageChanged', (lng) => {
// then re-render your app
app.view.render();
});
const LangView = Backbone.View.extend({
template: _.template($('#selector').html()),
langTemplate: _.template('<option value="<%= value %>"><%= name %></option>'),
events: {
'change .language-selector': 'onLangChange',
},
render() {
this.$el.html(this.template({
label: i18next.t('label')
}));
// cache the jQuery object of the select
this.$selector = this.$('.language-selector');
// then dynamically populate it
this.populateSelector();
return this;
},
populateSelector() {
// for each languages in i18next, add an option to the select
_.each(i18next.languages, this.addLanguage, this);
},
addLanguage(lang) {
// adding the option with the translated names
this.$selector.append(this.langTemplate({
value: lang,
name: i18next.t(lang),
}));
},
onLangChange(e) {
// change the language
i18next.changeLanguage(e.currentTarget.value);
}
});
app.view = new LangView();
$('#app').html(app.view.render().el);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/4.1.1/i18next.min.js"></script>
<div id="app"></div>
<script type="text/template" id="selector">
<label>
<%=label %>
</label>
<select class="form-control language-selector"></select>
</script>
关于翻译语言名称,看一下Language of language names in the language selector?
关于javascript - 如何使用 i18next 插件切换语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41014776/