戻る
gt-i18ngt-nodedictionariesgetTranslationsi18n
ブログ変更履歴

gt-i18n 0.9.0: 辞書ベースの翻訳

Ernest McCarter

概要

gt-i18n で、フレームワークインテグレーション向けの辞書ベースの翻訳が提供されるようになりました。Node.js アプリケーションでは、gt-node が公開している getTranslations() を使用してください。gt-i18n@0.9.0 はパッケージルートからこれをエクスポートしていません。

パッケージバージョン
gt-i18n0.9.0
gt-node0.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 つのルールで決まります。

  1. 翻訳がない → デフォルトロケールにフォールバック。 キーがソース辞書に存在していても、現在のロケール向けの翻訳がない場合、t() はソーステキストを返します。
  2. ソースエントリがない → エラー。 キーがソース辞書にまったく存在しない場合、t() は例外をスローします。これは意図的な動作です。キーがソース内で定義されていない場合、それは翻訳漏れではなくバグです。この動作は、今後のリファクタリングで GT のすべてのライブラリに適用される予定です。

2 つ目のルールは、翻訳済み辞書がソース辞書の構造と一致していることを前提としています。GT はこの前提に基づいて翻訳を自動生成します。

リンク