Skip to content

スコープとロケール変更

スコープ

Vue I18n は国際化(i18n)機能を提供するためにリソースを管理し、ロケール切り替え、各言語のメッセージ(ロケールメッセージ)、日時および数字の命名形式を含みます。これらは VueI18n インスタンスで管理されています。

Vueアプリケーションはツリー構造のコンポーネントから構築されます。Vue I18n のi18n機能を使って各コンポーネントをローカライズするには、スコープの概念を理解する必要があります。

Vue I18n には以下の2つのスコープがあります:

  • グローバルスコープ
  • ローカルスコープ

scope

グローバルスコープ

Vueにおけるグローバルスコープでは、アプリケーション内のすべてのコンポーネントで国際化(i18n)リソースにアクセスおよび管理できます。これはi18n管理を中央集権化するのに特に役立ちます。

createI18n を使用してi18nインスタンスを作成すると、グローバルスコープが自動的に作成されます。このグローバルスコープは VueI18n インスタンスに関連付けられ、i18n インスタンスのグローバルプロパティを通じてアクセスできます。本質的に、グローバルスコープとは i18n インスタンスのグローバルプロパティを通じてアクセス可能な VueI18n インスタンスを指します。

コンポーネントで i18n オプションが指定されていない場合、そのコンポーネントに対してはグローバルスコープが自動的に有効になります。この場合、コンポーネント内の this.$i18n でアクセスされる VueI18n インスタンスは、i18n インスタンスのグローバルプロパティを通じて利用可能なグローバルインスタンスと同じものです。

ローカルスコープ

Vueにおけるローカルスコープでは、単一ファイルコンポーネントの <style scoped> のように、コンポーネントごとにi18nリソースを管理できます。コンポーネントにローカルスコープがある場合、そのコンポーネントのi18nリソースのみが有効になります。これは各コンポーネント固有のロケールメッセージを管理したいときに特に有用です。

ローカルスコープはコンポーネント内で i18n オプションを指定することで有効になります。これにより、コンポーネントが初期化される際に新しい VueI18n インスタンスが作成されます。結果として、そのコンポーネント内の this.$i18n でアクセスされる VueI18n インスタンスは、i18n インスタンスのグローバルプロパティを通じて利用可能なグローバル VueI18n インスタンスとは異なります。

ロケール変更

これまでスコープの概念について説明しました。スコープを理解すれば、ロケールを変更する方法も簡単に理解できます。

グローバルスコープ

アプリケーション全体のロケールを変更したい場合は、グローバルスコープを使用して各コンポーネントの $i18n.locale を使用できます。

例を示します:

js
const i18n = createI18n({
  locale: 'ja', // 現在のロケールを設定
  messages: {
    en: {
      hello: 'hello!'
    },
    ja: {
      hello: 'こんにちは!'
    }
  },
  // vue-i18n の他のオプションはこちら...
  // ...
})

// Vueアプリケーションインスタンスを作成し、Vue I18nをインストールし、マウントします!
createApp({
  // 他のvueオプションはこちら...
  // ...
}).use(i18n).mount('#app')

コンポーネント:

vue
<template>
  <div class="locale-changer">
    <select v-model="$i18n.locale">
      <option
        v-for="locale in $i18n.availableLocales"
        :key="`locale-${locale}`"
        :value="locale"
      >
        {{ locale }}
      </option>
    </select>
  </div>
</template>

上記の例では、VueI18n インスタンスの availableLocales プロパティを使用して、select要素のオプションとして利用可能なロケールをリストアップしています。$i18n.localev-model でバインドされているため、select要素のオプションを選択することで切り替えることができ、その値が $i18n.locale に設定されます。

ご覧の通り、グローバルスコープは非常に便利です。なぜなら、アプリケーションのすべてのコンポーネントのUIに表示されるメッセージを一度に切り替えられるからです。

ローカルスコープ

ローカルスコープの locale はデフォルトでグローバルスコープから継承されます。そのため、グローバルスコープで locale を変更すると、ローカルスコープの locale も変更されます。

アプリケーション全体のロケールを変更したい場合は、createI18n で作成された i18n インスタンスの global プロパティ経由で変更する必要があります。

注意

グローバルスコープから locale を継承したくない場合は、i18n コンポーネントオプションの syncfalse に設定する必要があります。

例:

js
const i18n = createI18n({
  locale: 'ja', // 現在のロケールを設定
  // vue-i18n の他のオプションはこちら...
  // ...
})

// Vueアプリケーションインスタンスを作成し、Vue I18nをインストールし、マウントします!
createApp({
  // 他のvueオプションはこちら...
  // ...
}).use(i18n).mount('#app')


// `global` プロパティ経由でロケールを変更

// vue-i18n が legacy: false で使用されている場合、i18n.global.locale はrefなので、.value 経由で設定する必要があります:
i18n.global.locale.value = 'en'

// それ以外 - legacy: true を使用する場合、次のように設定します:
i18n.global.locale = 'en'

通知

ローカルスコープの locale を変更しても、グローバルスコープの locale には影響しません。つまり、ローカルスコープコンポーネントの $i18n.locale を変更しても、アプリケーション全体のロケールは変更されず、そのコンポーネントのみが変更されることを意味します。代わりに $root.$i18n.locale を使用してください。