アプリケーションでBackbone.jsを使用しており、アプリケーションの言語切り替え機能に i18next プラグインを使用しています。 lng
関数呼び出しでinit
オプションに値を渡すと、ページが正しく変換されます。
ここで、言語セレクターを介してこれを動的に実行したいと思います。私は<select>
4つの言語で、選択した言語の値をinit関数の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', function(lng) {
// E.g. set the moment locale with the current language
moment.locale(lng);
// then re-render your app
app.render();
});
言語セレクターのあるビュー:
var LangView = Backbone.View.extend({
events: {
'change .language-selector': 'onLangChange',
},
onLangChange: function(e) {
// only change the language
i18next.changeLanguage(e.currentTarget.value);
}
});
var 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', function(lng) {
// then re-render your app
app.view.render();
});
var LangView = Backbone.View.extend({
template: _.template($('#selector').html()),
langTemplate: _.template('<option value="<%= value %>"><%= name %></option>'),
events: {
'change .language-selector': 'onLangChange',
},
render: function() {
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: function() {
// for each languages in i18next, add an option to the select
_.each(i18next.languages, this.addLanguage, this);
},
addLanguage: function(lang) {
// adding the option with the translated names
this.$selector.append(this.langTemplate({
value: lang,
name: i18next.t(lang),
}));
},
onLangChange: function(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>
言語名の翻訳については、 言語セレクターの言語名の言語? をご覧ください。
$(document).ready(function () {
i18n.init({
"lng": 'en',
"resStore": resources,
"fallbackLng" : 'en'
}, function (t) {
$(document).i18n();
});
'change .language-selector': function(e){
e.preventDefault();
i18n.init({
lng: $(e.target).val()}, (err, t) => {
console.log(arguments);
$(document).i18n();
});
}
}
私はbackbone.jsを知りません。 通常のJavaScriptでの実用的なソリューションはこちら