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 { }} |