概要
gt-i18n で、フレームワークインテグレーション向けの辞書ベースの翻訳が提供されるようになりました。Node.js アプリケーションでは、gt-node が公開している getTranslations() を使用してください。gt-i18n@0.9.0 はパッケージルートからこれをエクスポートしていません。
| パッケージ | バージョン |
|---|---|
gt-i18n | 0.9.0 |
gt-node | 0.7.0 |
セットアップ
プロジェクトのルートに、ソース言語 (英語) の文字列を含む dictionary.json ファイルを作成します。
{
"greeting": {
"hello": "Hello!"
},
"user": {
"welcome": "Welcome, {name}!"
},
"errors": {
"notFound": "Page not found",
"unauthorized": "Access denied"
}
}CLI (npx gt translate) を実行すると、プロジェクトルートにある dictionary.json を検出し、設定されたロケール向けに翻訳します。
Node.js ランタイムを initializeGT で設定します。
import { initializeGT } from 'gt-node';
import dictionary from './dictionary.json';
initializeGT({
defaultLocale: 'en',
locales: ['en', 'es'],
dictionary,
});使用方法
上記のソース辞書がある場合は、getTranslations() を呼び出して、辞書内のエントリを参照する t 関数を取得します。
import { getTranslations, withGT } from 'gt-node';
await withGT('en', async () => {
const t = await getTranslations();
t('greeting.hello'); // "Hello!"
t('user.welcome', { name: 'Alice' }); // "Welcome, Alice!"
});t.obj() によるサブ辞書
t() は 1 つの文字列を返します。t.obj() は辞書のサブツリー全体をオブジェクトとして返します。
// 上記の withGT コールバック内:
t('errors.notFound'); // "ページが見つかりません"
const errors = t.obj('errors');
// { notFound: "ページが見つかりません", unauthorized: "アクセスが拒否されました" }翻訳された辞書にキーがない場合、不足しているエントリはソース辞書から補われます。つまり、翻訳が一部しかなくても実行時エラーは発生せず、未翻訳のキーはソーステキストにフォールバックします。
ルックアップの動作
ルックアップがどのように解決されるかは、次の 2 つのルールで決まります。
- 翻訳がない → デフォルトロケールにフォールバック。 キーがソース辞書に存在していても、現在のロケール向けの翻訳がない場合、
t()はソーステキストを返します。 - ソースエントリがない → エラー。 キーがソース辞書にまったく存在しない場合、
t()は例外をスローします。これは意図的な動作です。キーがソース内で定義されていない場合、それは翻訳漏れではなくバグです。この動作は、今後のリファクタリングで GT のすべてのライブラリに適用される予定です。
2 つ目のルールは、翻訳済み辞書がソース辞書の構造と一致していることを前提としています。GT はこの前提に基づいて翻訳を自動生成します。