POファイル

Lingo.dev CLIによるPOファイルのAI翻訳

POファイルとは?

PO(Portable Object)ファイルは、GNU gettextがソフトウェアの国際化に使用するテキストベースのファイル形式です。元の文字列とその翻訳を保存し、オープンソースソフトウェアプロジェクトで広く使用されています。

例:

msgid ""
msgstr ""
"Project-Id-Version: Example Project 1.0\n"
"Language: en\n"

msgid "Welcome"
msgstr "Welcome"

msgctxt "navigation"
msgid "Home"
msgstr "Home"

msgid "You have %d message"
msgid_plural "You have %d messages"
msgstr[0] "You have %d message"
msgstr[1] "You have %d messages"

Lingo.dev CLIとは?

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

詳細については、概要を参照してください。

このガイドについて

このガイドでは、Lingo.dev CLIを使用してPOファイルを翻訳する方法を説明します。

以下の内容を学習します:

  • ゼロからプロジェクトを作成する
  • 翻訳パイプラインを設定する
  • 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. ソースコンテンツの作成

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

ステップ 5. バケットの作成

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

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

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

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

    パターン自体は:

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

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

ステップ 6. LLMの設定

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

できるだけ早く使い始めるために、Lingo.dev Engineの使用をお勧めします。これは、毎月10,000トークンの無料利用を提供する当社独自のホスト型プラットフォームです:

  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.po

msgid ""
msgstr ""
"Project-Id-Version: Example Project 1.0\n"
"Language: en\n"

msgid "Welcome"
msgstr "Welcome"

msgctxt "navigation"
msgid "Home"
msgstr "Home"

msgid "You have %d message"
msgid_plural "You have %d messages"
msgstr[0] "You have %d message"
msgstr[1] "You have %d messages"

msgid "Save"
msgstr "Save"

es/example.po

msgid ""
msgstr ""
"Project-Id-Version: Example Project 1.0\n"
"Language: es\n"

msgid "Welcome"
msgstr "Bienvenido"

msgctxt "navigation"
msgid "Home"
msgstr "Inicio"

msgid "You have %d message"
msgid_plural "You have %d messages"
msgstr[0] "Tienes %d mensaje"
msgstr[1] "Tienes %d mensajes"

msgid "Save"
msgstr "Guardar"

i18n.json

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

i18n.lock

version: 1
checksums:
  cdba37b4ade3da08cf12eccfde49d625:
    Welcome/singular: 3180ad6b8de344b781637750259e0f53
    Home/singular: 104a3db3b671c04e167eafbe21e57881
    You%20have%20%25d%20message/singular: 1691abfe2c5d017cda86e298d34f3524
    You%20have%20%25d%20message/plural: 2d37831bf51cc2cf75e812c0e61c6861
    Save/singular: f7a2929f33bc420195e59ac5a8bcd454
    Cancel/singular: 2e2a849c2223911717de8caa2c71bade
    Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9
    Name/singular: 9368b5a047572b6051f334af5aa76819
    Email%20Address/singular: 0ee22bbbe989a0c61a18023407d12dc2
    Message/singular: f2f72126bd244cfc534eab395e054362
    Loading.../singular: 82b4ea7ed1439094d7c4be13aaba9a66
    Success!%20Changes%20saved./singular: 906371aaeec474803e22ae959605dad8
    Error%3A%20Request%20failed./singular: cdeaab2374e34c0e396cdb2596a9824e
    Add%20to%20Cart/singular: c93a29ccf502ff71bf08924dcdea9179
    Out%20of%20Stock/singular: 6673fc95c2cee3c713e0d60c8184e289
    Price%3A%20%24%25s/singular: a860f7b395e4a9d916a48717f9f8837a