概要と設計思想
Phraseは、Square社が公開しているローカライゼーション(L10n)および国際化(i18n)ワークフローを最適化するオープンソースライブラリです。従来の手動による翻訳ファイル管理では発生しやすいキーの不一致や更新漏れを防ぎ、開発サイクル内で多言語リソースを構造化して扱うことを可能にします。Web・モバイル・デスクトップ環境問わず、翻訳データのライフサイクルを一元的に制御する基盤として設計されており、CI/CDパイプラインへの組み込みも想定されています。
環境構築と初期設定
実行にはNode.js環境およびパッケージマネージャーの準備が必要です。プロジェクト内に依存モジュールとして追加し、ローカルで管理します。
npm install @square/phrase --save
次に、プロジェクトルートに設定ファイル(例: `i18n-config.js`)を作成し、ソースディレクトリ、コンパイル出力パス、対象ロケール群を定義します。設定値はビルドスクリプトやランタイムエンジンから参照されます。
module.exports = {
srcDir: './lang/source',
distDir: './lang/compiled',
supportedLocales: ['ja', 'en', 'de', 'ko'],
fallbackLocale: 'en'
};
リソースファイルの準備と読み込み
各言語の辞書データはJSON形式で管理します。`ja.json`や`en.json`を作成し、階層構造を持つキーに対して対応するテキストを定義します。ディレクトリ構成は設定ファイルで指定したパスに準拠させます。
アプリケーション側では以下のようにエンジンインスタンスを初期化し、辞書キーに対する文字列解決を行います。
const I18nEngine = require('@square/phrase');
// 設定パスと実行オプションを渡して初期化
I18nEngine.setup({
configFile: './i18n-config.js',
activeLocale: 'ja',
validation: 'strict'
});
// 定義済みキーから翻訳文字列を解決して出力
const welcomeText = I18nEngine.resolve('greeting.welcome');
console.log(welcomeText);
実務での設計指針と運用パターン
- キー構造の厳格な統一: 言語ファイルを追加・更新する際、プロパティパスやデータ型が必ず一致するよう、独自バリデーションスクリプトまたは型定義ファイル(.d.ts)を組み込むことでヒューマンエラーを排除します。
- 動的テンプレート変数の活用: 静的な文字列だけでなく、ユーザー名や数値などを埋め込む場合は、`{{userName}}` や `[count]` といったプレースホルダーを辞書に定義し、文脈に応じた単数・複数形ルールや文法調整を施します。
- 継続的な同期プロセス: 機能追加に伴ってキーが変更されるたびに手動で追従するのではなく、ビルド前後に辞書の整合性チェックや未翻訳キーの抽出を自動化し、外部翻訳サービスとのデータ連携をシームレスに行います。
周辺エコシステムとの連携
Phraseは単独利用よりも、既存のビルドツールやフロントエンドフレームワークと組み合わせることで効率性が最大化します。
- Webpack連携: リソースバンドラーと連動させるプラグインにより、未使用キーの自動削除や環境別での辞書切り替えをビルドフェーズで実行でき、最終パッケージのサイズ最適化に貢献します。
- React・Vue環境: フレームワーク固有のロケールプロバイダーとしてラップすることで、コンポーネントレベルでの即時反映や、ランタイム時のロケール切り替えを状態管理と連動させて実装します。
- i18nextブリッジ: 既存のi18next基盤を採用しているプロジェクトでも、Phraseの辞書管理機能と変換ルールを取り込むためのアダプター層が提供されており、アーキテクチャの移行コストを最小限に抑えられます。