辞書

辞書の使い方

概要

このガイドでは、辞書についてご紹介します。 必要に応じて、このページ内を自由に読み進めてください。 以下の内容を扱います:

辞書とは何か?

辞書の使い方

他の言語の辞書を読み込む方法

辞書の利用

本番環境での考慮事項

注意: gt-next をご利用の場合、辞書の使用は推奨していません。代わりに、<T> コンポーネントをご確認ください。

このガイドは、すでに辞書に慣れていて gt-next での使い方を学びたい方、または他の i18n ライブラリから gt-next への移行を検討している方を対象としています。


辞書とは何ですか?

辞書とは、翻訳可能なコンテンツを保存するために使用できる、文字列値を持つネストされたオブジェクトです。 これらは .ts.js、または .json ファイルに保存できます。

gt-next では、辞書を単独で使用することも、<T> コンポーネントと組み合わせて使用することもできます。

辞書と <T> コンポーネントの比較

辞書パターンには、<T> コンポーネントに対していくつかの利点があります。

  1. 集中管理: 辞書はすべての翻訳可能なコンテンツを1つのファイルにまとめて保存します。
  2. 歴史的な前例: 辞書パターンは業界で一般的なデザインパターンであり、多くの他のi18nライブラリでも使用されています。

同時に、いくつかの大きな欠点もあります。

  1. 複雑さ: 辞書は <T> コンポーネントよりもセットアップや利用が複雑です。
  2. 可読性: 辞書は <T> コンポーネントよりも可読性が低く、コンテンツがインラインで記述されていないためです。
  3. 保守性: 辞書は <T> コンポーネントよりも保守が難しく、コンテンツがインラインではなく別ファイルに保存されているため、翻訳の管理や更新がより困難になります。
  4. デバッグのしやすさ: 同じ理由で、辞書は <T> コンポーネントよりもデバッグが難しくなります。 Reactコンポーネントをデバッグしようとする際、コードベースを直接検索するのではなく、辞書内のどこでそのコンテンツが使われているかを追跡する必要があります。

どちらのデザインパターンも当ライブラリでサポートされており、排他的なものではありません。 辞書と <T> コンポーネントを併用することも可能です。

私たちのアドバイス

特に国際化(i18n)が初めての方には、そのシンプルさから <T> コンポーネントの使用をおすすめします。 過去の経験からこのデザインパターンを好む方や、既存のコードベースとの統合を容易にしたい方のために、辞書のサポートも提供しています。


辞書の使用方法

このセクションでは、Next.jsアプリケーションで基本的な辞書実装をセットアップする方法を説明します。 以下の手順を順番に説明します:

辞書を作成する

辞書を参照する

ステップ1:辞書を作成する

最初のステップは辞書を作成することです。 これは翻訳したいすべてのコンテンツを含むdictionary.[js|ts|json]ファイルです。

dictionaryファイルに以下の内容を追加してください:

src/dictionary.ts
const dictionary = {
  greetings: {
    hello: 'Hello, world!'
  },
}

export default dictionary;

辞書を保存するためにdictionary.jsonファイルを使用することもできます。これは別のライブラリから移行する場合や、JSONファイルを使用することを好む場合に便利です。 以下はdictionary.jsonファイルの例です:

src/dictionary.json
{
  "greetings": {
    "hello": "Hello, world!"
  }
}

withGTConfig()関数は、プロジェクトルートまたはsrcディレクトリ内の辞書ファイルを自動的に検出します。

ステップ2:辞書を参照する

辞書エントリにはuseTranslations()フックまたはgetTranslations()関数でアクセスできます。 フックから返される関数を使用して、キーで辞書エントリにアクセスするだけです。

注意: useTranslations()は同期コンポーネントでのみ使用してください。非同期コンポーネントでは、代わりにgetTranslations()関数を使用してください。

src/components/MyComponent.tsx
import { useTranslations } from 'gt-next';

export default function MyComponent() {
  const d = useTranslations();
  return (
    <div>
      {d('greetings.hello')}
    </div>
  );
}
src/components/MyComponent.tsx
import { getTranslations } from 'gt-next/server';

export default async function MyComponent() {
  const d = await getTranslations();
  return (
    <div>
      {d('greetings.hello')}
    </div>
  );
}

他の言語の辞書の読み込み

デフォルトでは、開発者はデフォルト言語の辞書のみを提供します。

General Translationは他の言語の辞書を自動的に生成し、loadTranslations関数でそれらを読み込みます。

ただし、他のi18nライブラリから移行する場合や、すでに他の言語の辞書を持っている場合は、それらをloadDictionary関数に渡すことができます。

gt-nextは、useTranslations()フックやgetTranslations()関数を使用する際に、リクエストされたロケールに対応する辞書を自動的に読み込みます。

詳細については、APIリファレンスを参照してください。


辞書の使用

変数

{variable} 構文を使用して辞書に変数を追加できます:

src/dictionary.ts
const dictionary = {
  greetings: {
    hello: 'Hello, {name}!',    // -> Hello, Alice!
    goodbye: 'Goodbye, {name}!' // -> Goodbye, Bob!
  },
}
export default dictionary;
src/components/MyComponent.tsx
import { useTranslations } from 'gt-next';

export default function MyComponent() {
  const d = useTranslations();
  return (
    <div>
      {d('greetings.hello', { variables: { name: 'Alice' }})}
      {d('greetings.goodbye', { variables: { name: 'Bob' }})}
    </div>
  );
}

辞書への変数の追加について詳しくは、DictionaryTranslationOptionsをご覧ください。

プレフィックス

さらに、useTranslations()では、関数にプレフィックスを渡して辞書内の共有パスを指定できます。 これは、複数のコンポーネントで使用したい辞書内の共有パスがある場合に便利です。

src/dictionary.js
const dictionary = {
  greetings: {
    common: {
      hello: 'Hello, world!',
      goodbye: 'Goodbye, World!'
    },
  },
}
export default dictionary;
src/components/MyComponent.js
import { useTranslations } from 'gt-next';

export default function MyComponent() {
  // 'hello' などのすべての翻訳パスは 'greetings.common.' でプレフィックスされます
  const d = useTranslations('greetings.common'); 

  return (
    <div>
      {d('hello')} {/* hello -> greetings.common.hello */}
      {d('goodbye')} {/* goodbye -> greetings.common.goodbye */}
    </div>
  );
}

本番環境での考慮事項

本番環境へのデプロイ

本番環境にデプロイする前に、必ずtranslateコマンドを実行して、すべての翻訳が実行時に利用可能になるようにしてください。 CDパイプラインまたはビルドスクリプトの一部として追加することをお勧めします。

package.json
{
  "scripts": {
    "build": "npx gtx-cli translate && <YOUR_BUILD_COMMAND>",
  }
}

アプリケーションのデプロイに関するより詳細なガイドについては、Deploymentガイドを参照してください。 コマンドの詳細については、CLI Toolリファレンスガイドを参照してください。

動作:開発環境 vs 本番環境

開発環境では、useTranslations()フックから返される関数は、辞書エントリをオンデマンドで翻訳します。 これは、コンポーネントがレンダリングされるときに、即座に翻訳を実行することを意味します。 これは他の言語での開発を容易にするための便利機能として行っています。

この動作を有効にするには、環境にDev API keyを追加するだけです。

本番環境では、d()関数はビルド時にコンテンツを翻訳します。 これは、アプリケーションをデプロイする前に翻訳コマンドを実行する必要があることを意味します。

ヒント: 開発環境で本番環境の動作をシミュレートしたい場合は、開発ビルドで本番環境のAPIキーを使用してください。


注意事項

  • 辞書は <T> コンポーネントの代替手段です。<T> コンポーネントと併用することも、単独で使用することもできます。
  • 辞書の翻訳はビルド時に行われるため、ビルドプロセスに translate コマンドを追加する必要があります。
  • 辞書はプレフィックスと組み合わせて使用し、辞書の一部のみを指定することもできます。

次のステップ

このガイドはいかがですか?