EJS
Lingo.dev CLIを使用したEJSテンプレートのAI翻訳
EJSとは?
EJS(Embedded JavaScript)は、プレーンなJavaScriptでHTMLマークアップを生成できるシンプルなテンプレート言語です。Node.jsアプリケーションでサーバーサイドレンダリングに一般的に使用されます。
Lingo.dev CLIとは?
Lingo.dev CLIは、AIを使用してアプリやコンテンツを翻訳するための無料のオープンソースCLIです。従来の翻訳管理ソフトウェアを置き換えながら、既存のパイプラインと統合できるように設計されています。
詳細については、概要を参照してください。
このガイドについて
このガイドでは、Lingo.dev CLIを使用してEJSテンプレートを翻訳する方法を説明します。
以下の方法を学習します:
- ゼロからプロジェクトを作成する
- 翻訳パイプラインを設定する
- 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つ以上のEJSテンプレートファイルを作成します。これらのファイルは、パスのどこかにソースロケールを含む場所に配置する必要があります(例:en/のようなディレクトリ名、またはmessages.en.ejsのようなファイル名の一部として)。
EJSテンプレートの場合、翻訳可能なコンテンツには以下が含まれます:
- HTML要素内のテキストコンテンツ
- 属性値(altテキスト、タイトル、ラベル、プレースホルダー、ボタンの値)
- JavaScript alert()内のテキストまたはその他の文字列リテラル
EJSテンプレートタグ(<%= %>、<%- %>、<% %>)と変数名は、翻訳中に保持されます。
例:
<!DOCTYPE html>
<html lang="en">
<head>
<title><%= pageTitle %></title>
</head>
<body>
<h1>Welcome back!</h1>
<p>Hello, <%= user.name %>! You have <%= messageCount %> new messages.</p>
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" id="username" placeholder="Enter username">
</form>
</body>
</html>
ステップ5. バケットを作成する
-
i18n.jsonファイルで、bucketsオブジェクトに"ejs"オブジェクトを追加します:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "ejs": {} } } -
"ejs"オブジェクトで、1つ以上のincludeパターンの配列を定義します:{ "$schema": "https://lingo.dev/schema/i18n.json", "version": "1.10", "locale": { "source": "en", "targets": ["es"] }, "buckets": { "ejs": { "include": ["./[locale]/example.ejs"] } } }これらのパターンは、翻訳するファイルを定義します。
パターン自体は:
- 設定されたロケールのプレースホルダーとして
[locale]を含む必要があります - ファイルパスを指定できます(例:
"[locale]/config.ejs") - ワイルドカードプレースホルダーとしてアスタリスクを使用できます(例:
"[locale]/*.ejs")
再帰的なglobパターン(例:
**/*.ejs)はサポートされていません。 - 設定されたロケールのプレースホルダーとして
ステップ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.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<title><%= pageTitle %></title>
</head>
<body>
<% if (user) { %>
<h1>Welcome back!</h1>
<p>Hello, <%= user.name %>! You have <%= messageCount %> new messages.</p>
<% } else { %>
<h1>Please log in</h1>
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" id="username" placeholder="Enter username">
<button type="submit">Sign In</button>
</form>
<% } %>
</body>
</html>
es/example.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<title><%= pageTitle %></title>
</head>
<body>
<% if (user) { %>
<h1>¡Bienvenido de nuevo!</h1>
<p>Hola, <%= user.name %>! Tienes <%= messageCount %> nuevos mensajes.</p>
<% } else { %>
<h1>Por favor, inicia sesión</h1>
<form action="/login" method="post">
<label for="username">Nombre de usuario:</label>
<input type="text" id="username" placeholder="Enter username">
<button type="submit">Iniciar sesión</button>
</form>
<% } %>
</body>
</html>
i18n.json
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es"]
},
"buckets": {
"ejs": {
"include": ["./[locale]/example.ejs"]
}
}
}
i18n.lock
version: 1
checksums:
21b99a2aea148b309f95ec2c966d326c:
text_0: e4d2da607604b3fda41eef5e0dd35faa
text_1: 69eb28c44f7168b1df0455ad2a62588c
text_2: bff335b01588a8db802bd193c725ec11
text_3: 0744639a7ac440afe0d792ea79c54512
text_4: b4cc462fb3a00d2f60deefe548c10a33
text_5: d0fd310aef9cf3c5827f1db4b0c098a1
text_6: 85bb1f6fb66b5ab65a9c61469183236e
text_7: bdbc827b3d224e03394dfd56304500f2
text_8: 5e8497af456decf6cf716c0a23f1dbc2
text_9: d572e25ed81420669e65c03925da1001
text_10: 2cf6537fb69cdd2eb030e55bf4223b93
text_11: ec7b8f314fe9bc6591006707484ede61
text_12: c2460fb2a7887fdf2d68db2b553a4338
text_13: 3abe623951250bd24a9d7799415761ab
text_14: 988be328b82702586f2cd541858710fe
text_15: b2328773b0ef0699fd5791055c5cf9e2
text_16: 92acabd12cd9b63c825294c54fcbc806