国際化ドキュメント - 多言語サポートと設定
概要
このドキュメントは、VJSP Vue3フレームワークの国際化(i18n)サポートメカニズムについて詳しく説明します。多言語設定、言語切り替え、翻訳ファイル管理、および実際の開発での応用を含みます。
国際化アーキテクチャ
コア機能
- モジュール化翻訳管理: 保守と拡張を容易にするためにモジュール方式で翻訳ファイルを整理
- 動的言語切り替え: ページのリフレッシュなしでランタイムでの動的言語切り替えをサポート
- Element Plus統合: Element Plusコンポーネントライブラリとの深い統合によりUIコンポーネントの多言語一貫性を確保
- タイプセーフ: タイプセーフな翻訳関数呼び出しを提供
- 永続的ストレージ: 言語設定をローカルストレージに自動保存
技術スタック
- Vue I18n v11: コア国際化ライブラリ
- Element Plus国際化: UIコンポーネントライブラリの多言語サポート
- Pinia状態管理: 言語状態の永続化
- 動的インポート: オンデマンドでの言語パックローディングによるパフォーマンス最適化
設定メカニズム
言語設定
プロジェクトは3つの言語環境をサポート:
- 簡体字中国語 (zh-CN): デフォルト言語
- 英語 (en): 国際化サポート
- 日本語 (ja): 多言語拡張
言語パックマッピング
Element Plus言語パックとプロジェクト言語設定のマッピング:
zh-CN→ Element Pluszh-cnen→ Element Plusenja→ Element Plusja
ストレージ設定
言語設定はキー名langでlocalStorageを使用して永続的ストレージを行い、ユーザーの設定が異なるセッション間で一貫性を保つようにします。
実装メカニズム
初期化プロセス
- アプリケーション起動: localStorageからユーザーの言語設定を読み取り
- プラグイン初期化: Vue I18nインスタンスを設定
- 言語パックローディング: 対応する言語の翻訳ファイルを動的にインポート
- Element Plus設定: UIコンポーネントライブラリの言語パックを設定
- グローバル登録: 翻訳関数をグローバルプロパティとして登録
言語切り替えメカニズム
- 状態更新: Piniaストアでグローバル言語状態を更新
- DOM更新: HTMLページの
lang属性を設定 - イベント通知: グローバル言語変更イベントをトリガー
- コンポーネント応答: 翻訳を使用する関連コンポーネントが自動的に再レンダリング
翻訳ファイルローディング
動的インポート方式を使用して翻訳ファイルをロードし、オンデマンドローディングとコード分割を実現:
- 基本翻訳ファイル(commonモジュール)
- システムモジュール翻訳ファイル(systemモジュール)
- ビジネスモジュール翻訳ファイル(オンデマンドロード)
翻訳ファイル構造
モジュール化組織
翻訳ファイルは機能モジュールごとに整理され、各モジュールに独立した翻訳リソースを含む:
src/locales/
├── common/ # 共通翻訳
│ ├── zh-CN.ts # 中国語共通翻訳
│ ├── en.ts # 英語共通翻訳
│ └── ja.ts # 日本語共通翻訳
├── system/ # システムモジュール翻訳
│ ├── zh-CN.ts # 中国語システム翻訳
│ ├── en.ts # 英語システム翻訳
│ └── ja.ts # 日本語システム翻訳
└── module/ # ビジネスモジュール翻訳名前空間規約
- common: 共通操作、フォーム、検証などの基本翻訳
- system: システム管理関連モジュールの翻訳
- ビジネスモジュール名: 特定のビジネス機能の翻訳リソース
開発ガイド
コンポーネントでの翻訳使用
コンポジションAPI使用
useI18nフックを使用して翻訳関数を取得:
import { useI18n } from '@/hooks/web/useI18n'
const { t } = useI18n()
// 基本翻訳使用
const title = t('common.add')
// 名前空間付き翻訳
const userTitle = t('system.user.pageTitle')オプションAPI使用
グローバルプロパティを通じて翻訳関数にアクセス:
export default {
computed: {
title() {
return this.$t('common.add')
},
},
}ビジネスモジュール開発例(Productモジュール)
1. 翻訳ファイルの作成
src/locales/module/product/ディレクトリに言語ファイルを作成:
zh-CN.ts
export default {
product: {
pageTitle: '产品管理',
productName: '产品名称',
productCode: '产品编码',
price: '价格',
status: '状态',
addProduct: '新增产品',
editProduct: '编辑产品',
deleteProduct: '删除产品',
deleteConfirm: '确认删除产品"{name}"吗?',
addSuccess: '产品新增成功',
updateSuccess: '产品更新成功',
deleteSuccess: '产品删除成功',
},
}en.ts
export default {
product: {
pageTitle: 'Product Management',
productName: 'Product Name',
productCode: 'Product Code',
price: 'Price',
status: 'Status',
addProduct: 'Add Product',
editProduct: 'Edit Product',
deleteProduct: 'Delete Product',
deleteConfirm: 'Confirm delete product "{name}"?',
addSuccess: 'Product added successfully',
updateSuccess: 'Product updated successfully',
deleteSuccess: 'Product deleted successfully',
},
}2. モジュール翻訳の登録
src/plugins/vueI18n/index.tsにモジュール名を追加:
const otherModules: string[] = ['product']3. コンポーネントでの使用
<template>
<div>
<h2>{{ t('product.pageTitle') }}</h2>
<el-button @click="handleAdd">
{{ t('product.addProduct') }}
</el-button>
</div>
</template>
<script setup lang="ts">
import { useI18n } from '@/hooks/web/useI18n'
const { t } = useI18n()
const handleAdd = () => {
// 製品追加ロジック
}
</script>言語切り替え機能
機能ビュー説明
プロジェクトは直感的な言語切り替えインターフェースを提供し、ユーザーは上部ナビゲーションバーの言語セレクターを通じてアプリケーション言語を素早く切り替えることができます。言語セレクターはドロップダウンメニュー形式を使用し、現在の言語名を表示し、サポートされているすべての言語のオプションリストを提供します。
ツールクラスファイルパス
言語切り替え機能には以下のコアファイルが関与:
- 状態管理:
src/stores/modules/locale.ts- 言語状態と設定管理 - ユーティリティ関数:
src/utils/i18n.ts- 言語切り替えとクエリ機能を提供 - プラグイン設定:
src/plugins/vueI18n/index.ts- 国際化プラグインのコア実装 - コンポーネント統合:
src/layout/components/Navbar.vue- 言語セレクターコンポーネントの位置
切り替えメカニズム
言語切り替えはイベント駆動メカニズムを使用。ユーザーが新しい言語を選択すると:
- 状態更新: Piniaストアを通じてグローバル言語状態を更新
- DOM同期: HTMLページの
lang属性を自動的に更新 - コンポーネント応答: グローバル言語変更イベントをトリガーし、翻訳を使用するすべてのコンポーネントが自動的に再レンダリング
- 永続的ストレージ: ユーザーの言語設定がローカルストレージに自動保存され、次回の訪問時に一貫性を確保
切り替えプロセスはページのリフレッシュを必要とせず、スムーズなユーザー体験を提供しながら、Element Plusコンポーネントライブラリの言語パックが同期されることを保証します。
ベストプラクティス
翻訳キー命名規約
- モジュールプレフィックス: モジュール名を名前空間プレフィックスとして使用
- 意味的命名: キー名はその意味を明確に表現するべき
- 一貫性: 同じ意味のテキストには同じ翻訳キーを使用
動的パラメータ処理
Vue I18nのパラメータ補間機能を使用:
// 翻訳ファイル
deleteConfirm: 'Confirm delete "{name}"?'
// コンポーネントでの使用
const message = t('product.deleteConfirm', { name: productName })複数形処理
複数形を処理する必要があるテキストの場合:
// 翻訳ファイル
itemCount: '{count} item | {count} items'
// コンポーネントでの使用
const message = t('common.itemCount', { count: itemCount }, itemCount)エラーハンドリング
- キーが見つからない場合の処理: デフォルトのフォールバックテキストを提供
- ロード失敗の処理: デフォルト言語への優雅な降格
- タイプセーフ: TypeScriptを使用して翻訳キーの正確性を確保
パフォーマンス最適化
キャッシュ戦略
- ユーザー言語設定のローカルストレージ: localStorageを通じてユーザーが選択した言語設定を永続化
- 重複設定の回避: 言語切り替え時に現在の言語状態をチェックし、不要な更新操作を回避
ビルド最適化
- 翻訳ファイルの圧縮: Viteビルド時にリソースファイルを自動圧縮
- チャンキング戦略: ベンダーチャンキングによるローディングパフォーマンスの最適化
トラブルシューティング
一般的な問題
- 翻訳キーが見つからない: キー名のスペルと名前空間を確認
- 言語切り替えが無効: 言語パックのロード成功を確認
- Element Plus言語の不一致: 言語パックマッピング設定を確認
デバッグのヒント
- Vue Devtoolsを使用して翻訳状態を確認
- ブラウザコンソールで言語パックローディングログを確認
- localStorageの言語設定を検証
拡張ガイド
新しい言語の追加
src/locales/の下に対応する言語ディレクトリを作成- 言語パックマッピング設定を追加
- 言語セレクターサポートを更新
- 新しい言語機能をテスト
カスタム翻訳ローダー
loadModuleMessages関数を修正してカスタム翻訳ローディングロジックを実装し、リモートサーバーやCDNからの翻訳リソースのローディングをサポート。
