ルートキーを持つYAML

Lingo.dev CLIによるロケールルートキーを持つYAMLファイルのAI翻訳

ルートキーを持つYAMLとは何か?

ルートキーを持つYAMLは、各ロケールの翻訳がロケールコードにちなんで名付けられたルートレベルのキーの下に整理されるローカリゼーション形式です。この形式により、複数のロケールを同じディレクトリ構造に保存しながら、言語ごとに整理することができます。

例えば:

en:
  navigation:
    home: "Home"
    about: "About Us"
    contact: "Contact"
  forms:
    title: "Contact Form"
    name_label: "Your Name"
    submit_button: "Send Message"

Lingo.dev CLIとは何か?

Lingo.dev CLIは、AIでアプリやコンテンツを翻訳するための無料のオープンソースCLIです。従来の翻訳管理ソフトウェアに代わるものとして設計されており、既存のパイプラインと統合できます。

詳細については、概要をご覧ください。

このガイドについて

このガイドでは、Lingo.dev CLIを使用してロケールルートキーを持つYAMLファイルを翻訳する方法を説明します。

以下の方法を学びます:

  • ゼロからプロジェクトを作成する
  • 翻訳パイプラインを設定する
  • AIで翻訳を生成する

前提条件

Lingo.dev CLIを使用するには、Node.js v18以上がインストールされていることを確認してください:

❯ node -v
v22.17.0

ステップ1. プロジェクトのセットアップ

プロジェクトのディレクトリにi18n.jsonファイルを作成します:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

このファイルは、翻訳パイプラインの動作を定義し、どの言語間で翻訳するか、ローカライズ可能なコンテンツがファイルシステム上のどこに存在するかを含みます。

利用可能なプロパティの詳細については、i18n.jsonをご覧ください。

ステップ2. ソースロケールの設定

「ソースロケール」は、コンテンツが最初に書かれた元の言語と地域です。ソースロケールを設定するには、i18n.jsonファイルのlocale.sourceプロパティを設定します:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

ソースロケールはBCP 47言語タグとして提供する必要があります。

Lingo.dev CLIがサポートするロケールコードの完全なリストについては、サポートされているロケールコードをご覧ください。

ステップ 3. ターゲットロケールを設定する

_ターゲットロケール_とは、コンテンツを翻訳したい言語や地域のことです。ターゲットロケールを設定するには、i18n.jsonファイルのlocale.targetsプロパティを設定します:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

ステップ 4. ソースコンテンツを作成する

まだ作成していない場合は、翻訳するコンテンツを含むロケールルートキーを持つYAMLファイルを1つ以上作成します。これらのファイルは、パスのどこかにソースロケールを含むパスに配置する必要があります(例:ディレクトリ名としてen/や、ファイル名の一部としてmessages.en.ymlなど)。

ステップ 5. バケットを作成する

  1. i18n.jsonファイルで、bucketsオブジェクトに"yaml-root-key"オブジェクトを追加します:

    {
      "$schema": "https://lingo.dev/schema/i18n.json",
      "version": "1.10",
      "locale": {
        "source": "en",
        "targets": ["es"]
      },
      "buckets": {
        "yaml-root-key": {}
      }
    }
    
  2. "yaml-root-key"オブジェクト内で、1つ以上のincludeパターンの配列を定義します:

    {
      "$schema": "https://lingo.dev/schema/i18n.json",
      "version": "1.10",
      "locale": {
        "source": "en",
        "targets": ["es"]
      },
      "buckets": {
        "yaml-root-key": {
          "include": ["./[locale]/example.yml"]
        }
      }
    }
    

    これらのパターンは、翻訳するファイルを定義します。

    パターン自体は:

    • 設定されたロケールのプレースホルダーとして[locale]を含む必要があります
    • ファイルパスを指定できます(例:"[locale]/translations.yml"
    • ワイルドカードプレースホルダーとしてアスタリスクを使用できます(例:"[locale]/*.yml"

    再帰的なグロブパターン(例:**/*.yml)はサポートされていません。

ステップ 6. LLMを設定する

Lingo.dev CLIは、AIでコンテンツを翻訳するために大規模言語モデル(LLM)を使用します。これらのモデルを使用するには、サポートされているプロバイダーからAPIキーが必要です。

できるだけ早く始めるために、月間10,000トークンの無料使用量を提供する独自のホスティングプラットフォームLingo.dev Engineの使用をお勧めします:

  1. Lingo.devアカウントにサインアップする

  2. 次のコマンドを実行します:

    npx lingo.dev@latest login
    

    これにより、デフォルトのブラウザが開き、認証を求められます。

  3. 画面の指示に従ってください。

ステップ 7. 翻訳を生成する

i18n.jsonファイルを含むディレクトリで、次のコマンドを実行します:

npx lingo.dev@latest run

このコマンドは:

  1. i18n.jsonファイルを読み込みます。
  2. 翻訳が必要なファイルを見つけます。
  3. ファイルから翻訳可能なコンテンツを抽出します。
  4. 設定されたLLMを使用して抽出されたコンテンツを翻訳します。
  5. 翻訳されたコンテンツをファイルシステムに書き戻します。

翻訳が初めて生成されるとき、i18n.lockファイルが作成されます。このファイルは、どのコンテンツが翻訳されたかを追跡し、後続の実行で不要な再翻訳を防ぎます。

en/example.yml

en:
  navigation:
    home: "Home"
    about: "About Us"
    contact: "Contact"
    services: "Services"
  forms:
    title: "Contact Form"
    name_label: "Your Name"
    email_label: "Email Address"
    message_label: "Message"
    submit_button: "Send Message"
    success_message: "Thank you for your message!"

es/example.yml

es:
  navigation:
    home: "Inicio"
    about: "Sobre Nosotros"
    contact: "Contacto"
    services: "Servicios"
  forms:
    title: "Formulario de Contacto"
    name_label: "Su Nombre"
    email_label: "Dirección de Correo Electrónico"
    message_label: "Mensaje"
    submit_button: "Enviar Mensaje"
    success_message: "¡Gracias por su mensaje!"

i18n.json

{
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {
    "yaml-root-key": {
      "include": ["./[locale]/example.yml"]
    }
  },
  "$schema": "https://lingo.dev/schema/i18n.json"
}

i18n.lock

version: 1
checksums:
  1b0d7c9f07dcc31a978bc337763270ea: {}
  87b1c33c3f85415e0906ece6cfed17c5:
    navigation/home: 104a3db3b671c04e167eafbe21e57881
    navigation/about: 8f89131a66d4659be07cd5af2c7ea898
    navigation/contact: 9afa39bc47019ee6dec6c74b6273967c
    navigation/services: 8ea10b45b9abab2a3bfc3c07e1c9cdc6
    forms/title: ac85dea7c7f0bf1cd7d48cc1b4da3acc
    forms/name_label: 03c6ae7996d5841f743cd406b4eff72d
    forms/email_label: 0ee22bbbe989a0c61a18023407d12dc2
    forms/message_label: f2f72126bd244cfc534eab395e054362
    forms/submit_button: 487177489aafc9c0243c57ef3850a2d9
    forms/success_message: a0a7aa980dffa31d4d194af718a917b3