著者:
    作成:2024-08-11最終更新:2026-08-30

    IntlayerでExpress backendを翻訳する | 国際化(i18n)

    express-intlayer は、Expressアプリケーション向けの強力な国際化 (i18n) ミドルウェアであり、クライアントの好みに基づいてローカライズされたレスポンスを提供することで、バックエンドサービスをグローバルに利用可能にします。

    実用的なユースケース

    • ユーザーの言語でバックエンドエラーを表示する: エラーが発生した場合、ユーザーの母語でメッセージを表示することで、理解が向上し、イライラを軽減できます。これは、トーストやモーダルなどのフロントエンドコンポーネントに表示される可能性のある動的エラーメッセージに特に役立ちます。

    • ユーザーの言語でバックエンドエラーを表示: エラーが発生した際に、ユーザーの母国語でメッセージを表示することで、理解が深まり、フラストレーションが軽減されます。これは、トーストやモーダルのようなフロントエンドコンポーネントに表示される動的なエラーメッセージに特に有用です。

    • 多言語コンテンツの取得: データベースからコンテンツを取得するアプリケーションでは、国際化により複数の言語でコンテンツを提供できます。これは、ユーザーが好む言語で商品説明や記事、その他のコンテンツを表示する必要があるeコマースサイトやコンテンツ管理システムのようなプラットフォームにとって重要です。
    • 多言語メールの送信: トランザクションメール、マーケティングキャンペーン、通知など、受信者の言語でメールを送信することで、エンゲージメントと効果を大幅に向上させることができます。

    • 多言語プッシュ通知: モバイルアプリケーションでは、ユーザーの好みの言語でプッシュ通知を送信することで、インタラクションとリテンションを向上させることができます。このパーソナルなタッチにより、通知がより関連性が高く、行動を促すものになります。

    • その他のコミュニケーション: SMSメッセージ、システムアラート、ユーザーインターフェースの更新など、バックエンドからのあらゆる形式のコミュニケーションは、ユーザーの言語で行うことで明確さが向上し、全体的なユーザーエクスペリエンスが向上します。 バックエンドを国際化することで、アプリケーションは文化的な違いを尊重するだけでなく、グローバル市場のニーズにより適合し、サービスを世界規模で拡大するための重要なステップとなります。

    バックエンドを国際化することで、アプリケーションは文化的な違いを尊重するだけでなく、グローバル市場のニーズとより良く整合し、サービスを世界規模で拡張する上で重要なステップとなります。

    始めるにあたって

    ide.intlayer.org

    See Application Template on GitHub.

    インストール

    express-intlayer を使用するには、npmを使用してパッケージをインストールします:

    bash
    npx intlayer init --interactive
    
    --interactive フラグはオプションです。AI エージェントの場合は intlayer-cli init を使用してください。
    このコマンドは環境を検出し、必要なパッケージをインストールします。例えば:
    bash
    npm install intlayer express-intlayer
    

    セットアップ

    プロジェクトのルートに intlayer.config.ts を作成して国際化設定を構成します:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [
          Locales.ENGLISH,
          Locales.FRENCH,
          Locales.SPANISH_MEXICO,
          Locales.SPANISH_SPAIN,
        ],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    

    コンテンツの宣言

    翻訳を格納するためのコンテンツ宣言を作成および管理します:

    src/index.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const indexContent = {
      key: "index",
      content: {
        exampleOfContent: t({
          en: "Example of returned content in English",
          fr: "Exemple de contenu renvoyé en français",
          "es-ES": "Ejemplo de contenido devuelto en español (España)",
          "es-MX": "Ejemplo de contenido devuelto en español (México)",
        }),
      },
    } satisfies Dictionary;
    
    export default indexContent;
    
    コンテンツ宣言は、contentDir ディレクトリ(デフォルトは ./src)に含まれていれば、アプリケーションのどこにでも定義できます。また、コンテンツ宣言ファイルの拡張子(デフォルトは .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})に一致している必要があります。
    詳細については、コンテンツ宣言のドキュメントを参照してください。

    Express アプリケーションのセットアップ

    express-intlayer を使用するように Express アプリケーションをセットアップします:

    src/index.ts
    import express, { type Express } from "express";
    import { intlayer, t, getDictionary, getIntlayer } from "express-intlayer";
    import dictionaryExample from "./index.content";
    
    const app: Express = express();
    
    // 国際化リクエストハンドラーを読み込む
    app.use(intlayer());
    
    // ルート
    app.get("/t_example", (_req, res) => {
      res.send(
        t({
          en: "Example of returned content in English",
          fr: "Exemple de contenu renvoyé en français",
          "es-ES": "Ejemplo de contenido devuelto en español (España)",
          "es-MX": "Ejemplo de contenido devuelto en español (México)",
        })
      );
    });
    
    app.get("/getIntlayer_example", (_req, res) => {
      res.send(getIntlayer("index").exampleOfContent);
    });
    
    app.get("/getDictionary_example", (_req, res) => {
      res.send(getDictionary(dictionaryExample).exampleOfContent);
    });
    
    // サーバーを起動
    app.listen(3000, () => console.log(`Listening on port 3000`));
    

    互換性

    express-intlayer は以下と完全に互換性があります:

    • Reactアプリケーション向けの react-intlayer
    • Next.jsアプリケーション向けの next-intlayer
    • Viteアプリケーション向けの vite-intlayer さまざまな環境(ブラウザやAPIリクエストを含む)で、あらゆる国際化ソリューションとシームレスに連携します。ミドルウェアをカスタマイズして、ヘッダーやクッキーからロケールを検出することも可能です:

    また、ブラウザや API リクエストなど、様々な環境における国際化ソリューションとシームレスに連携します。ヘッダーやクッキーを通じてロケールを検出するようにミドルウェアをカスタマイズできます:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... その他の設定オプション
      routing: {
        storage: [
          { type: "header", name: "my-locale-header" },
          { type: "cookie", name: "my-locale-cookie" },
        ],
      },
    };
    
    export default config;
    

    デフォルトでは、express-intlayerAccept-Language ヘッダーを解釈してクライアントの優先言語を判別します。

    設定や高度なトピックの詳細については、ドキュメントをご覧ください。

    TypeScript の設定

    express-intlayer は、TypeScript の強力な機能を活用して国際化プロセスを強化します。TypeScript の静的型付けにより、すべての翻訳キーが網羅されていることが保証され、翻訳漏れのリスクを減らし、保守性を向上させます。

    Autocompletion

    Translation error

    自動生成された型定義ファイル(デフォルトでは ./types/intlayer.d.ts)が tsconfig.json ファイルに含まれていることを確認してください。

    tsconfig.json
    {
      // ... 既存の TypeScript 設定
      "include": [
        // ... 既存の TypeScript 設定
        ".intlayer/**/*.ts", // 自動生成された型定義を含める
      ],
    }
    

    VS Code 拡張機能

    Intlayer の開発体験を向上させるために、公式の Intlayer VS Code 拡張機能 をインストールできます。

    VS Code Marketplace からインストール

    この拡張機能は以下を提供します:

    • 翻訳キーの オートコンプリート
    • 欠落している翻訳の リアルタイムエラー検出
    • 翻訳済みコンテンツの インラインプレビュー
    • 翻訳を簡単に作成・更新できる クイックアクション

    拡張機能の使い方の詳細については、Intlayer VS Code 拡張機能のドキュメントを参照してください。

    Git 設定

    Intlayer によって生成されたファイルは無視することを推奨します。これにより、Git リポジトリへのコミットを避けることができます。

    これを行うには、以下の指示を .gitignore ファイルに追加してください。

    .gitignore
    # Intlayer によって生成されたファイルを無視する
    .intlayer
    

    よくある質問

    従来の選択肢は、i18nexti18next-http-middlewareを組み合わせる方法で、名前空間ごとにJSONカタログをロードし、リクエストにロケールを保存します。もう一つの選択肢は、express-intlayerを介したIntlayerです。これは、フロントエンドと共有される型付きファイルでコンテンツを宣言し、リクエストごとにロケールを解決し、AI翻訳とCMSを追加します。

    バックエンドを国際化する理由は、ユーザーが読むテキストの大部分がフロントエンドを通過しないためです。例えば、APIエラーメッセージ、トランザクションメール、プッシュ通知、SMS、PDFエクスポートなどです。これらはセッションごとではなく、リクエストごとに解決される受信者の言語を必要とします。

    Intlayerを選ぶ理由をご覧ください。

    ごくわずかです。辞書は事前にコンパイルされ、宣言したロケールのみが含まれるため、起動時のカタログロードやリクエストパスでのファイル読み込みは発生しません。これは、bundleサイズがコールドスタート時間に影響するサーバーレスおよびエッジデプロイメントで特に重要です。 bundle最適化をご覧ください。

    はい、2つの方法があります。i18next移行ガイドに従って、コンテンツを段階的に移行できます。または、既存のAPIを完全に維持することも可能です。compat adaptersi18nextとまったく同じAPIを公開しますが、Intlayerの辞書によって提供されるため、インポートは変更されますが、ハンドラーコードは変更されません。

    はい、可能です。sync JSON pluginは、/messages/{locale}/{namespace}.jsonファイルを信頼できる情報源として保持し、そこからIntlayer辞書を双方向に生成します。 sync PO pluginはgettextカタログに対しても同様の機能を提供し、per locale filesを使用すると、ロケールを1つのファイルにまとめるのではなく、言語ごとにコンテンツを分割できます。

    いいえ、必要ありません。npx intlayer extractを実行すると、Intlayerがソースファイルを読み込み、ユーザー向けの文字列を抽出し、それぞれの隣に.contentファイルを書き込みます。これにより、文字列をカタログに1つずつコピーする代わりに、差分を確認するだけで済みます。 extractコマンドをご覧ください。

    同じプロジェクトのフロントエンド側では、Intlayer Compilerがさらに進んで、ビルド時にJSX、TSX、Vue、またはSvelteのソースから辞書を生成します。これにより、アプリの両半分が手動でキーを管理することなく、1つのコンテンツレイヤーを共有できます。

    以下の5つのツールがあり、すべてオプションです。

    • VS Code extension: useIntlayerキーからそれを宣言するコンテンツファイルにジャンプしたり、コンポーネントからコンテンツを抽出したり、コマンドパレットまたは専用のIntlayerタブからビルド、フィル、テスト、プッシュ、プルを実行したりできます。
    • LSP server: LSPをサポートする任意のエディターで、定義へのジャンプ、すべての参照の検索、翻訳された値のホバープレビュー、キーとフィールドのオートコンプリート、どこにも宣言されていないキーに対する警告など、同様の認識機能を提供します。また、i18nextreact-i18nextnext-intluse-intlの呼び出しも解決するため、移行中に役立ちます。
    • MCP server: IntlayerのドキュメントとCLIをCursor、VS Code、Claude Desktop、Claude Code、ChatGPTに公開します。これにより、アシスタントは推測ではなく現在のドキュメントから回答し、intlayer fillなどのコマンドを自分で実行できます。
    • Agent skills: intlayer-configintlayer-cliintlayer-contentなどの特化したスキルに加え、フレームワークごとのスキルがあり、エージェントにルーティング設定とコンテンツノードタイプを教えます。
    • ESLint plugin: no-raw-textはハードコードされた文字列を検出し、静的辞書キーや未使用コンテンツに対する追加のルールも提供します。