i18n 国際化
NocoBase プラグインは src/locale/ ディレクトリで多言語ファイルを管理します。翻訳ファイルを記述した後、Plugin 内では this.t()、コンポーネント内では useT() hook、FlowModel の定義では tExpr() で翻訳テキストを取得できます。
翻訳ファイル
プラグインの src/locale/ 配下に、言語ごとの JSON ファイルを作成します。key は英語の原文、value は対応する言語の翻訳です:
いくつかの注意事項:
- key は英語の原文を使用します。翻訳が欠落していても英語にフォールバックできます
- 変数は二重波括弧
{{name}}で囲みます。i18next の構文と同じです - 初めて言語ファイルを追加した場合はアプリの再起動が必要です。その後の内容修正はホットリロードで反映されます
- NocoBase はプラグインのパッケージ名を翻訳の名前空間(namespace)として自動的に使用するため、異なるプラグイン間で翻訳が競合しません
Plugin 内での使用:this.t()
Plugin クラス内では、this.t() が自動的に現在のプラグインのパッケージ名を namespace として注入するため、手動で ns を渡す必要はありません:
コンポーネント内での使用:useT()
React コンポーネント内では this.t() を直接使用できませ ん。プラグインのスキャフォールドが自動生成する locale.ts ファイルに、useT() hook が提供されています:
コンポーネント内での使い方:
useT() が返す t 関数にはプラグインの namespace が既にバインドされているので、key を渡すだけで使えます。
FlowModel 内での使用:tExpr()
FlowModel.define() と registerFlow() はモジュール読み込み時に実行されますが、この時点では i18n がまだ初期化されていないため、t() を直接呼び出すことができません。このようなシーンでは tExpr() を使います — 遅延翻訳の式文字列を生成し、ランタイムで解決されます:
簡単に言えば、this.t() と useT() はランタイム翻訳用で、tExpr() は静的定義時の遅延翻訳用です。
tExpr には2つのソースがあります:プラグインが自動生成する locale.ts と @nocobase/flow-engine です。違いは、locale.ts の tExpr にはプラグインのパッケージ名が namespace としてバインドされていますが、@nocobase/flow-engine から直接インポートした tExpr には namespace バインドがありません。プラグインコード内では、常に locale.ts からエクスポートされた tExpr を使用してください。これにより翻訳がプラグイン自身の言語ファイルに正しくマッチします。
3つの使い方チートシート
関連リンク
- Context → 共通機能 → 国際化 — ctx.t、ctx.i18n の完全 API リファレンス
- 言語一覧 — NocoBase がサポートする言語コードの完全なリスト
- Component コンポーネント開発 — コンポーネントでの useFlowContext の使用
- FlowEngine 概要 — FlowModel での tExpr の使い方

