TypeScript
Lingo.dev CLIによるTypeScriptローカライゼーションファイルのAI翻訳
TypeScriptローカライゼーションとは
TypeScriptローカライゼーションファイルは、TypeScript/JavaScriptオブジェクト構文を使用して翻訳文字列を保存します。型安全な国際化のために、最新のWebアプリケーションで一般的に使用されています。
例:
const messages = {
navigation: {
home: "Home",
about: "About Us",
contact: "Contact Us"
},
forms: {
title: "Contact Form",
nameLabel: "Your Name",
submitButton: "Send Message"
},
};
export default messages;
Lingo.dev CLIとは
Lingo.dev CLIは、AIを使用してアプリケーションやコンテンツを翻訳するための無料のオープンソースCLIです。既存のパイプラインと統合しながら、従来の翻訳管理ソフトウェアを置き換えるように設計されています。
詳細については、概要を参照してください。
このガイドについて
このガイドでは、Lingo.dev CLIを使用してTypeScriptローカライゼーションファイルを翻訳する方法を説明します。
以下の内容を学習します:
- ゼロからプロジェクトを作成する
- 翻訳パイプラインを設定する
- 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つ以上のTypeScriptローカライゼーションファイルを作成します。これらのファイルは、パスのどこかにソースロケールを含む場所に配置する必要があります(例:en/のようなディレクトリ名、またはmessages.en.tsのようなファイル名の一部として)。
ステップ 5. バケットの作成
-
i18n.jsonファイルで、bucketsオブジェクトに"typescript"オブジェクトを追加します:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "typescript": {} } } -
"typescript"オブジェクトで、1つ以上のincludeパターンの配列を定義します:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "typescript": { "include": ["./[locale]/example.ts"] } } }これらのパターンは、翻訳するファイルを定義します。
パターン自体は:
- 設定されたロケールのプレースホルダーとして
[locale]を含む必要があります - ファイルパスを指定できます(例:
"[locale]/messages.ts") - ワイルドカードプレースホルダーとしてアスタリスクを使用できます(例:
"[locale]/*.ts")
再帰的なglobパターン(例:
**/*.ts)はサポートされていません。 - 設定されたロケールのプレースホルダーとして
ステップ 6. LLMの設定
Lingo.dev CLIは、大規模言語モデル(LLM)を使用してAIでコンテンツを翻訳します。これらのモデルのいずれかを使用するには、サポートされているプロバイダーからAPIキーが必要です。
できるだけ早く使い始めるために、Lingo.dev Engineの使用をお勧めします。これは、毎月10,000トークンの無料利用を提供する当社独自のホスト型プラットフォームです:
-
次のコマンドを実行します:
npx lingo.dev@latest loginデフォルトのブラウザが開き、認証を求められます。
-
プロンプトに従ってください。
ステップ7. 翻訳を生成する
i18n.jsonファイルが含まれるディレクトリで、次のコマンドを実行します:
npx lingo.dev@latest run
このコマンドは:
i18n.jsonファイルを読み込みます。- 翻訳が必要なファイルを検索します。
- ファイルから翻訳可能なコンテンツを抽出します。
- 設定されたLLMを使用して抽出されたコンテンツを翻訳します。
- 翻訳されたコンテンツをファイルシステムに書き戻します。
翻訳が初めて生成されるとき、i18n.lockファイルが作成されます。このファイルは、どのコンテンツが翻訳されたかを追跡し、後続の実行で不要な再翻訳を防ぎます。
例
en/example.ts
const messages = {
navigation: {
home: "Home",
about: "About Us",
contact: "Contact Us",
services: "Our Services"
},
forms: {
title: "Contact Form",
nameLabel: "Your Name",
emailLabel: "Email Address",
messageLabel: "Your Message",
submitButton: "Send Message",
successMessage: "Thank you for your message!",
locked_key_1: "This value is locked and should not be changed",
ignored_key_1: "This value is ignored and should not be processed"
},
};
export default messages;
es/example.ts
const messages = {
navigation: {
home: "Inicio",
about: "Sobre Nosotros",
contact: "Contáctanos",
services: "Nuestros Servicios"
},
forms: {
title: "Formulario de Contacto",
nameLabel: "Tu Nombre",
emailLabel: "Dirección de Correo Electrónico",
messageLabel: "Tu Mensaje",
submitButton: "Enviar Mensaje",
successMessage: "¡Gracias por tu mensaje!",
locked_key_1: "This value is locked and should not be changed",
},
};
export default messages;
i18n.json
{
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {
"typescript": {
"include": ["./[locale]/example.ts"],
"lockedKeys": ["locked_key_1"],
"ignoredKeys": ["ignored_key_1"]
}
},
"$schema": "https://lingo.dev/schema/i18n.json"
}
i18n.lock
version: 1
checksums:
0cdc4f3ba34edc7f3ba4d996158306ad:
navigation/home: 104a3db3b671c04e167eafbe21e57881
navigation/about: 8f89131a66d4659be07cd5af2c7ea898
navigation/contact: 2a75337dc9603915c4ec1d1905afb7b9
navigation/services: 999f32026e64978cb3ec794a496b0bb8
forms/title: ac85dea7c7f0bf1cd7d48cc1b4da3acc
forms/nameLabel: 03c6ae7996d5841f743cd406b4eff72d
forms/emailLabel: 0ee22bbbe989a0c61a18023407d12dc2
forms/messageLabel: 1e460d0909502d0e94b9be562643af0d
forms/submitButton: 487177489aafc9c0243c57ef3850a2d9
forms/successMessage: a0a7aa980dffa31d4d194af718a917b3
forms/locked_key_1: 73fc105de1aefc3f0a97d187a80cf0a4
forms/ignored_key_1: d88a7aa6c5661ca901ee0f4cb51e3a0d