XLIFF
Lingo.dev CLIによるXLIFFファイルのAI翻訳
XLIFFとは?
XLIFF(XML Localization Interchange File Format)は、ローカリゼーションデータを交換するためのXMLベースのフォーマットです。翻訳業界で広く使用されており、バージョン1.2と2.0の仕様をサポートしています。
例えば:
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0"
version="2.0"
srcLang="en">
<file id="messages.properties" original="messages.properties">
<unit id="welcome_message">
<segment>
<source>Hello, world!</source>
</segment>
</unit>
<unit id="button_text">
<segment>
<source>Continue</source>
</segment>
</unit>
<unit id="status_message">
<segment>
<source>Processing your request...</source>
</segment>
</unit>
</file>
</xliff>
Lingo.dev CLIとは?
Lingo.dev CLIは、AIでアプリやコンテンツを翻訳するための無料のオープンソースCLIです。従来の翻訳管理ソフトウェアに代わるものとして設計されており、既存のパイプラインと統合できます。
詳細については、概要をご覧ください。
このガイドについて
このガイドでは、Lingo.dev CLIを使用してXLIFFファイルを翻訳する方法を説明します。
以下の方法を学びます:
- プロジェクトを一から作成する
- 翻訳パイプラインを設定する
- 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つ以上のXLIFFファイルを作成してください。これらのファイルは、パスのどこかにソースロケールを含む場所に配置する必要があります(例:ディレクトリ名としてen/や、ファイル名の一部としてmessages.en.xliffなど)。
ステップ5. バケットの作成
-
i18n.jsonファイルのbucketsオブジェクトに"xliff"オブジェクトを追加します:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "xliff": {} } } -
"xliff"オブジェクト内で、1つ以上のincludeパターンの配列を定義します:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "xliff": { "include": ["./[locale]/example.xliff"] } } }これらのパターンは、翻訳するファイルを定義します。
パターン自体は:
- 設定されたロケールのプレースホルダーとして
[locale]を含む必要があります - ファイルパスを指定できます(例:
"[locale]/strings.xliff") - ワイルドカードプレースホルダーとしてアスタリスクを使用できます(例:
"[locale]/*.xliff")
再帰的なグロブパターン(例:
**/*.xliff)はサポートされていません。 - 設定されたロケールのプレースホルダーとして
ステップ6. LLMの設定
Lingo.dev CLIは、AIでコンテンツを翻訳するために大規模言語モデル(LLM)を使用します。これらのモデルを使用するには、サポートされているプロバイダーからAPIキーが必要です。
可能な限り早く始めるには、毎月10,000トークンの無料使用量を提供する当社独自のホスティングプラットフォームLingo.dev Engineの使用をお勧めします:
-
Lingo.devアカウントにサインアップしてください。
-
次のコマンドを実行します:
npx lingo.dev@latest loginこれによりデフォルトのブラウザが開き、認証を求められます。
-
画面の指示に従ってください。
ステップ 7. 翻訳を生成する
「i18n.json」ファイルが含まれているディレクトリで、次のコマンドを実行します:
npx lingo.dev@latest run
このコマンドは以下を実行します:
- 「i18n.json」ファイルを読み込みます。
- 翻訳が必要なファイルを見つけます。
- ファイルから翻訳可能なコンテンツを抽出します。
- 設定されたLLMを使用して抽出されたコンテンツを翻訳します。
- 翻訳されたコンテンツをファイルシステムに書き戻します。
翻訳が初めて生成されるとき、「i18n.lock」ファイルが作成されます。このファイルは、どのコンテンツが翻訳されたかを追跡し、後続の実行で不要な再翻訳を防ぎます。
例
en/example-v2.xliff
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0"
version="2.0"
srcLang="en">
<file id="messages.properties" original="messages.properties">
<unit id="welcome_message">
<segment>
<source>Hello, world!</source>
</segment>
</unit>
<unit id="button_text">
<segment>
<source>Continue</source>
</segment>
</unit>
<unit id="save_button">
<segment>
<source>Save Changes</source>
</segment>
</unit>
<unit id="status_message">
<segment>
<source>Processing your request...</source>
</segment>
</unit>
</file>
</xliff>
es/example-v2.xliff
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0"
version="2.0"
srcLang="en"
trgLang="es">
<file id="messages.properties" original="messages.properties">
<unit id="welcome_message">
<segment>
<source>Hello, world!</source>
<target>¡Hola, mundo!</target>
</segment>
</unit>
<unit id="button_text">
<segment>
<source>Continue</source>
<target>Continuar</target>
</segment>
</unit>
<unit id="save_button">
<segment>
<source>Save Changes</source>
<target>Guardar Cambios</target>
</segment>
</unit>
<unit id="status_message">
<segment>
<source>Processing your request...</source>
<target>Procesando tu solicitud...</target>
</segment>
</unit>
</file>
</xliff>
i18n.json
{
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {
"xliff": {
"include": ["./[locale]/example.xliff"]
}
},
"$schema": "https://lingo.dev/schema/i18n.json"
}
i18n.lock
version: 1
checksums:
33cb76eb379e7352a70c6dace0ea2c20:
welcome_message: 1308168cca4fa5d8d7a0cf24e55e93fc
error.validation: b538f828ae3306cbe35e3bd4e0103870
button_text: ff2b3010cdfa176f8dceeb1898c428c3