blog-translate について
blog-translateは、既存のブログ記事を対象言語に翻訳し、検索キーワードを現地向けに調整するスキルです。原文の構造や書式を保ちながら翻訳記事を準備するブログ運営者向けです。
主な機能
- 01原文の言語検出
- 02現地向けキーワードの対応付け
- 03フロントマターとメタデータの翻訳
- 04Markdown、MDX、HTML構造の保持
- 05ロケール別の出力ファイル
- 06翻訳品質のチェック
活用シーン
- 01指定ロケール向けの記事翻訳
- 02現地の検索語に合わせたタイトルとメタデータの調整
- 03文書構造を保った翻訳記事の準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agricidaniel/ claude-blog --skill blog-translateインストール後、Claude Code で/blog-translateを入力して読み込まれたか確認します。
同梱ファイルreferences/cultural-adaptation.mdreferences/translation-rules.md
詳細
ブログ翻訳、SEO に最適化されたブログ翻訳
以下のバンドルパスでは、ホスト側の Markdown による ${CLAUDE_SKILL_DIR} の置換を使用します。
これはエクスポートされたシェル変数ではありません。実行前にパスを解決し、パスを引用符で囲み、絶対パスでないオーバーライドは拒否してください。${CLAUDE_SKILL_DIR}/../blog/references から解決した blog_reference_root、${CLAUDE_SKILL_DIR}/../blog/templates から解決した blog_template_root と、必要な兄弟ディレクトリのルートをエージェントに渡してください。
プロジェクトのコンテキストを読み込む前に、メインリファレンスの orchestration-details.md を読み込んでください。下流のエージェントには、ヘルパーで囲まれた出力のみを渡してください。
既存のブログ記事を、1 つ以上の対象言語に翻訳します。一般的な翻訳とは異なり、このスキルでは、ローカライズされたキーワード、メタタグ、文化に適した書式を用いて、SEO に最適化された公開可能なコンテンツを作成します。
Chris Mueller による
claude-blog-multilingualをベースにしています(Pro Hub Challenge、2026 年 3 月)。元のリポジトリ:2026-10-12 時点で利用できません
主なリファレンス
必要に応じて読み込みます。
${CLAUDE_SKILL_DIR}/references/translation-rules.md:形式の保持、ロケールごとの数値・日付・通貨の形式、引用符の扱い、品質基準。${CLAUDE_SKILL_DIR}/references/cultural-adaptation.md:ロケールごとの文化的プロファイル(DACH、フランス語圏、スペイン語圏、日本語、カスタム)。このファイルはblog-localizeと共有されます(重複させないでください)。
ワークフロー
フェーズ 1:入力の解析
- ソースファイル(Markdown、MDX、または HTML)を読み込む前に、プロジェクトルートまたは現在の作業ディレクトリを基準にパスを解決してください。シンボリックリンクのパス、ルート外へのパストラバーサル、10 MB を超えるファイル、バイナリファイルは拒否してください。
- ソース言語を自動検出します。優先順位は次のとおりです。
- Frontmatter の
langフィールド。 - HTML の
lang属性。 - コンテンツ分析(文字体系、一般的なストップワード)。
- Frontmatter の
--toから、Google 互換の hreflang タグをカンマ区切りで解析します(de、fr、es-MX、ja、pt-BR、zh-Hant)。--toが指定されていない場合は、ユーザーに一度だけ尋ねてください。「どの言語に翻訳しますか?de、fr、es-MX、ja、pt-BR などの hreflang タグを指定してください。」blog-multilingual、blog-localize、blog-locale-auditが共通で使用する多言語ロケールルールに従い、すべてのコードを正規化してください。ISO 639-1 の言語コードは小文字、任意の ISO 15924 の文字体系コードはタイトルケース、任意の ISO 3166-1 Alpha-2 の地域コードは大文字にします。不正なコードは候補を提示して拒否してください(jpの場合は「日本語を表すjaのことですか?」と提示)。es、pt、zhのように、言語のみでは対象が曖昧な場合は、地域または明示的な中立モードを必須とします。Google は hreflang として言語コード単独を認めています(https://developers.google.com/search/docs/specialty/international/localized-versions、2026-10-12 閲覧)が、地域コード単独は認めていません。この厳格なルールは翻訳品質のためのものであり、Google が地域コードを必須としているからではありません。対象言語が正規化されたソース言語と一致する場合は、通知のうえでスキップしてください。
フェーズ 2:コンテンツ分析
翻訳対象となる部分を抽出します。
- Frontmatter:
title、description、tags、author(翻訳可能な場合のみ。役職ラベルなどは対象ですが、個人名は対象外です)。 - すべての見出し(H1、H2、H3)。
- 本文の段落。
- 画像の
altテキストと<figcaption>の内容。 - チャートの
<text>と<tspan>の内容。SVG 属性(x、y、font-size、fill、transform)はすべて保持します。 - FAQ の質問と回答。
- 根拠に基づく説明文。
- 要点または要約ボックス。
- CTA テキスト。
- 内部リンク領域のアンカーテキスト。
変更せずに保持するもの:
- Markdown と HTML の構造、タグ、属性。
- 画像 URL、リンク URL、Frontmatter のキー。
- 実行可能なコードフェンスとインラインコード。実行可能なコードの外側にあるコメント、またはユーザーがチュートリアル内のコメントのローカライズを明示的に依頼した場合を除き、コメントは翻訳しません。
- 内部リンク領域のマーカー(
[INTERNAL-LINK: ...])。 - 引用内の出典組織名(Gartner、McKinsey など)。
- 人名。
- Schema JSON-LD ブロック(ユーザー向けの文字列のみ翻訳します。Person、Organization、Brand の名前、URL、ID、
@id、sameAsは翻訳しません)。
フェーズ 3 で使用する主要キーワードと副次キーワードを特定します。
フェーズ 3:キーワードのローカライズ
対象言語ごとに、次の手順を実行します。
- 原文のキーワードが対象市場で定着した用語かどうかを判断します。定着している場合(例:「Content Marketing」はドイツ語でもそのまま使用)、変更せずに使用します。
- 現地語の同等表現に実際の検索需要がある場合は、それに置き換えます。
- 副次キーワードにも同じ方針を適用します。
- 対応関係を記録します。翻訳エージェントはこれを使って、タイトル、メタディスクリプション、H2 見出しを一貫して更新します。
フェーズ 4:翻訳
対象言語ごとに blog-translator エージェントを起動します(Task 経由)。次の情報を渡します。
- 原文コンテンツ。
- フェーズ 3 のキーワードローカライズマップ。
- 対象言語コード。
${CLAUDE_SKILL_DIR}/references/translation-rules.mdへのポインター。- 言語、文体、トピックに即した自然な内容、書式のみを対象とするよう指示します。ブランド、法務、統計、文化に関する置き換えは
blog-localizeで行います。
複数の言語に翻訳する場合は、エージェントを並列で実行します。
blog-multilingual がこのスキルを呼び出す場合、呼び出しは Mode: orchestrated で始まります。出力ルートについてはフェーズ 5、契約についてはフェーズ 7 を参照してください。
エージェントは、入力と同じ形式で翻訳済みの投稿全体を返します。
フェーズ 5:後処理
翻訳版ごとに、次の手順を実行します。
-
ロケールの Frontmatter を追加または更新します。
lang: "de" translatedFrom: "en" translatedDate: "YYYY-MM-DD" slug: "wie-man-ki-slop-vermeidet" -
構造の整合性を確認します。
- H2 セクションと H3 セクションの数が原文と一致していること。
- すべての画像が含まれ、alt テキストが翻訳されていること。
- すべての SVG チャートが含まれ、テキストラベルが翻訳されていること(長さ調整:DE は +30%、FR は +15%、JA は -20%。その他の言語については
${CLAUDE_SKILL_DIR}/references/translation-rules.mdを参照)。 - FAQ の数が一致していること。
- 原文に根拠に基づく説明がある場合、その内容が維持されていること。
-
翻訳済みファイルを保存します。1 回の実行につき、適用される出力ルートは 1 つだけです。
- 単独実行(
/blog translate):現在の作業ディレクトリ配下のtranslations/{lang}/{localized-slug}.{ext}。 - オーケストレーション実行(呼び出しが
Mode: orchestratedで始まる場合):オーケストレーターが作成したディレクトリmultilingual/{lang}/{localized-slug}.{ext}。translations/配下にも書き込んではなりません。
書き込み前に、
{localized-slug}を小文字の ASCII に変換し、a-z、0-9、ハイフンのみを使用する形式にします。空の名前や予約済みの名前は拒否します。正規化された hreflang コードのみを使って言語ディレクトリを作成します。最終パスを解決し、指定された出力ルート内にとどまることを確認します。シンボリックリンクが含まれる出力パスは拒否します。 - 単独実行(
フェーズ 6:翻訳品質のガードレール
完了を報告する前に、機械翻訳特有の不自然な表現がないか出力を確認します。
- 慣用表現の直訳(英語の慣用表現を翻案せずに音訳したもの)。
- 不自然な語順(SOV から SVO へ、またはその逆など、SVO 以外の言語で語順が変わっているもの)。
- 確立された借用語以外の混在言語の文。
- 数値、日付、通貨の表記が原文の形式のまま残っているもの。
- フロントマターの文字列が原文の言語のまま残っているもの。
問題があれば、それぞれインラインで指摘します(ファイルパス、行番号、修正案)。納品前に、翻訳エージェントは指摘された箇所を再翻訳する必要があります。
フェーズ 7:最終成果物の納品契約
翻訳によって、主張、リンク、メタデータ、スキーマ、レンダリング後のレイアウトが変わることがあります。
オーケストレーションモード。
blog-multilingual から呼び出された場合(オーケストレーションモード)は、納品契約を省略します。blog-multilingual が最終テキストを対象に、ロケールごとに一度だけ実行します。
オーケストレーションモードは、呼び出しの先頭に Mode: orchestrated という文字列の行があることで判定します。
このモードでは、各ロケールのステータスを pending (contract deferred to blog-multilingual) として報告し、翻訳が完了または公開準備完了であると決して判断してはいけません。
単独実行。 翻訳済みファイルを完了または公開準備完了とする前に、最終ロケールごとに以下の標準手順を実行します(このスキルがそのロケールに対する最後のテキスト変更です)。
BLOG_SCRIPT_DIR="${CLAUDE_BLOG_SCRIPTS_DIR:-${CLAUDE_SKILL_DIR}/../../scripts}"を解決し、絶対パスでない場合は拒否します。現在のプロジェクトのscripts/ディレクトリからヘルパーを解決してはいけません。- ビジュアル:対象言語の出力先の下にロケールごとの納品ステージングディレクトリを作成し、最終ロケールファイルを小文字のローカライズ済みスラッグでコピーします。すべてのドラフトマーカー(
[INTERNAL-LINK、[IMAGE、[CHART)を解消します。マーカーを残してはいけません。元のヒーロー画像を再利用し、hero.<ext>としてコピーします。新たに有料のヒーロー画像を用意する場合は、blog-imageの費用と同意のゲートが必要です。 - レンダリング:
python3 "$BLOG_SCRIPT_DIR/blog_render.py" --md <locale-file> --out-dir <locale-delivery-dir>を実行します。 - ノンスを初期化:
python3 "$BLOG_SCRIPT_DIR/blog_preflight.py" --draft <locale-delivery-dir> --init-review-nonceを実行します。 - レビュー:表示されたノンスのみを、新しい
blog-reviewerの呼び出しに渡し、レンダリング済みのロケール HTML を対象にレビューします。レビュー担当者が返したテキストを、変更せずに<locale-delivery-dir>/review.mdに保存します。 - ゲート:
python3 "$BLOG_SCRIPT_DIR/blog_preflight.py" --draft <locale-delivery-dir> --strict --slug <localized-slug>を実行します。 - ループ:ファイル、ヒーロー画像、HTML、PDF のいずれかを変更した後は、必ず再レンダリングし、ノンスを再初期化して再レビューします。最大 3 回までです。
90 点以上/100 点、P0 ゼロ、ノンスの一致、最終結果が BLOCKING: false であること、およびその他すべてのゲートの通過を必須とします。ゲートに失敗したロケールは draft-blocked のままとし、診断結果を報告して、完了したと表現してはいけません。
フェーズ 8:納品
## Translation complete: [Original title]
### Source
- Language: [source]
- File: [source path]
### Translations
| Language | File | Keywords adapted | Status |
|----------|------|------------------|--------|
| de | translations/de/{slug}.md | [N] | passed / draft-blocked / pending (orchestrated) |
| fr | translations/fr/{slug}.md | [N] | passed / draft-blocked / pending (orchestrated) |
### Quality checks
- Structural integrity: pass / fail per language
- Meta tags localized: pass / fail per language
- Numbers, dates, currencies formatted per locale: pass / fail
- Keywords localized: [N] keywords adapted
- Machine-translation artifacts flagged: [N] (see notes above)
- Delivery contract: score, P0 status, nonce verification, and preflight report per locale (standalone only; deferred to blog-multilingual in orchestrated mode)
### Next steps
- Run `/blog localize <file> --locale <code>` for cultural deep-adaptation.
- Run `/blog locale-audit translations/` to verify completeness.
- Use `/blog multilingual` to combine write, translate, localize, hreflang
in one command.
エラー処理
| 状況 | 対応 |
|---|---|
| サポートされていない言語コード | Google がサポートする適切な hreflang コードを提案します |
| 原文と翻訳先が同じ | "Source is already in [lang]" としてスキップします |
| ファイルが見つからない | 推奨パスを添えてエラーを報告します |
| 翻訳エージェントがタイムアウト | 1 回再試行し、その後、部分的な結果を報告します |
| バイナリファイルまたは非テキストファイル | エラーを報告し、適切なファイルを提案します |
相互参照
- 次のステップ(文化的な要素の掘り下げ):
/blog localize <file> --locale <code> - すべての言語バージョンを対象とした QA 一括確認:
/blog locale-audit <directory> - ワンコマンドのパイプライン:
/blog multilingual <topic> --languages <codes>