vue-i18n は Vue.js 向けの国際化(多言語化)プラグインです。
今回アプリのアップデート版を作るにあたり、Monaca の Onsen UI + Vue プロジェクトで vue-i18n を使ってみました。
以下に備忘録を兼ねた使用例を記します。
インストール
npm install vue-i18nファイル構成
- 対応する言語は日本語、英語、韓国語、中国語(簡体)、中国語(繁体)、スペイン語です。それぞれ JSON ファイルに分けて記述します。
- i18n.js では vue-i18n のインスタンスを作成します。
- main.js では Vue 本体のインスタンスを作成しています。そこに i18n.js で作成した vue-i18n のインスタンスを追加します。
以下、ファイルごとに説明します。
言語ファイル
日本語用の言語ファイル ja.json の一部を以下に記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | { "cancel" : "キャンセル" , "set" : "設定" , "del" : "削除" , "sound" : { "title" : "通知音" , "type" : [ "バイブレーション" , "鐘(1)" , "鐘(2)" , "鐘(3)" , "お鈴" ] }, ..... "background" : { "title" : "背景" , "type" : [ "森林" , "蓮の花" , "空" , "星" ] }, ..... } |
i18n.js
Vue と vue-i18n プラグインをインポートします。
1 2 | import Vue from 'vue' ; import VueI18n from 'vue-i18n' ; |
ブラウザの言語バージョン(window.navigator.language)からアプリで使用する言語ファイルを決定し、require() で読み込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | let locale = "en" , message = {}; // default: "en" const language = window.navigator.language; if (language) { const lang = language.toLowerCase().split( "-" ); switch (lang[0]) { case "ja" : // 日本語: ja, ja-JP case "es" : // スペイン語: es, es-* case "ko" : // 韓国語 case "zhcn" : // 中国語 (簡体) case "zhtw" : // 中国語 (繁体) locale = lang[0]; break ; case "zh" : // 中国語: zh-* switch (lang[1]) { case "cn" : // 中国 case "sg" : // シンガポール case "hans" : locale = "zhcn" ; // 中国語 (簡体) break ; case "tw" : // 台湾 case "hk" : // 香港 case "mo" : // マカオ case "hant" : locale = "zhtw" ; // 中国語 (繁体) break ; } break ; } } message[locale] = require(`./assets/i18n/${locale}.json`) |
vue-i18n のインストールおよびインスタンスの作成を行います。作成したインスタンスはエクスポートしておきます。
1 2 3 4 5 6 | Vue.use(VueI18n); export const i18n = new VueI18n({ locale, messages: message // 必要な言語ファイルのみ設定する }); |
main.js
Vue と i18n.js からエクスポートされた vue-i18n インスタンスをインポートします。
1 2 | import Vue from 'vue' ; import { i18n } from './i18n.js' |
Vue インスタンスを作成します。このとき Vue のオプションオブジェクトとして vue-i18n インスタンスを渡します。
1 2 3 4 5 6 7 | new Vue({ el: '#app' , i18n, template: '<app></app>' , components: { App }, ..... }); |
Vue ファイル
テンプレートに直接 $t() メソッドを記述することができます。
1 | < v-ons-list-header >{{ $t('sound.title') }}</ v-ons-list-header > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | < v-ons-list-item v-for = "(soundType, $index) in $t('sound.type')" :key = "soundType" tappable > < label class = "left" > < v-ons-radio :input-id = "'radio-sound-' + $index" :value = "$index" v-model = "tmp_soundType" @ click = "clickedSoundType($index)" > </ v-ons-radio > </ label > < label :for = "'radio-sound-' + $index" class = "center" >{{ soundType }}</ label > </ v-ons-list-item > |
$t() メソッドはスクリプトでも使うことができます。
1 2 | const a = this .$t( 'background.type' ) console.log(a) // ["森林","蓮の花","空","星"] |
これを応用して算出プロパティで使ってみました。this.state.backgroundType(文字列の0から3)の値に対応する文字が表示されます。
1 | < div >{{ image }}</ div > |
1 2 3 4 5 | computed: { image () { return this .$t(`background.type[${Number( this .state.backgroundType)}]`) } } |
また、vue-i18n のインスタンス作成時に設定した locale にアクセスすることができます。
1 2 3 4 5 6 7 8 9 10 | onHelp () { }, onPrivacy () { if ( this .$i18n.locale === "ja" ) { } else { } } |