blog-multilingual について
Claude Blog のスキルとして、ブログ執筆、翻訳、文化的な調整、国際 SEO をまとめて進めます。多言語記事を公開するチーム向けで、各言語の記事に加えて hreflang や構造化データも生成します。
主な機能
- 01ブログ執筆と翻訳のオーケストレーション
- 02地域に応じた文化的な調整
- 03hreflang タグとサイトマップの生成
- 04ローカライズした Article JSON-LD
- 05Markdown、MDX、HTML の出力
活用シーン
- 01選択した複数市場向けの記事公開
- 02翻訳記事の現地読者向け調整
- 03多言語サイト用 hreflang ファイルの準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agricidaniel/ claude-blog --skill blog-multilingualインストール後、Claude Code で/blog-multilingualを入力して読み込まれたか確認します。
詳細
ブログの多言語化とワンコマンドでの国際公開
以下の同梱パスでは、ホスト側の Markdown による ${CLAUDE_SKILL_DIR} の置換を使用しています。これはエクスポートされたシェル変数ではありません。実行前にパスを解決し、パスを引用符で囲み、絶対パスでないオーバーライドは拒否してください。${CLAUDE_SKILL_DIR}/../blog/references から解決した blog_reference_root、${CLAUDE_SKILL_DIR}/../blog/templates から解決した blog_template_root と、必要な兄弟ルートをエージェントに渡してください。プロジェクトのコンテキストを読み込む前に、メインリファレンスの orchestration-details.md を読み、ヘルパー用フェンスで囲まれた出力だけを下流エージェントに渡してください。
主力となる多言語オーケストレーターです。ブログの執筆、翻訳、文化的適応、国際 SEO 全体を単一のコマンドに統合します。hreflang タグ、ローカライズされた JSON-LD スキーマ、CMS 統合用メタデータを含む、公開可能なブログ記事をすべての対象言語で生成します。
Chris Mueller による
claude-blog-multilingualを基に改変(AI Marketing Hub Pro Hub Challenge 提出作品、2026 年 3 月、Proficient の評価で 85/100)。 元のリポジトリ:2026-10-12 時点で利用不可 この移植版では、監査で指摘された元のcurl | bashインストーラーと認証情報の処理を削除し、コアスキルとして統合し、blog-translate/references/の共有文化的適応リファレンスを使用します。
依存関係
このオーケストレーターから内部的に呼び出されます。
| コンポーネント | ソース | 必須 |
|---|---|---|
blog-write | claude-blog(このプラグイン) | はい |
blog-translate | claude-blog(このプラグイン) | はい |
blog-localize | claude-blog(このプラグイン) | はい(--localize がオンの場合。デフォルト) |
seo-hreflang | claude-seo(兄弟プラグイン) | いいえ。自己完結型ジェネレーターにフォールバックします |
seo-hreflang がインストールされていない場合、オーケストレーターは独自の最小限のジェネレーター(以下のフェーズ 5)を使って hreflang タグを出力し、納品サマリーに制限事項を記載します。この場合、hreflang の検証は構造のみが対象となり、seo-hreflang が提供する詳細な検証は行われません。
コマンド構文
/blog multilingual <topic> --languages <lang1,lang2,...> [--source <lang>] [--no-localize] [--format <md|mdx|html>]
| 引数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
<topic> | はい | 必須 | ブログのトピックまたは仮タイトル |
--languages | はい | 必須 | Google 互換の hreflang タグをカンマ区切りで指定します(例:de,fr,es-MX,ja,pt-BR。フェーズ 1 のコード規則を参照) |
--source | いいえ | en | 原文を執筆する言語 |
--no-localize | いいえ | オフ | 文化的適応を省略します(翻訳のみ) |
--format | いいえ | 自動 | 出力形式:md、mdx、または html |
--languages が指定されていない場合は、何も実行する前にユーザーに一度だけ尋ねます。
「ブログを公開する言語を指定してください。カンマ区切りで hreflang タグを入力してください(例:de,fr,es-MX,ja,pt-BR)。まず <source> で記事を執筆し、その後に翻訳します。」
ワークフロー
フェーズ 1:設定
- 引数を解析します。トピック、対象言語、ソース、形式を抽出します。
blog-translate、blog-localize、blog-locale-auditが使用する共通の多言語ロケールルールに従って、各言語コードを検証します。ISO 639-1 の言語コードは小文字、ISO 15924 のスクリプトコードは任意で先頭を大文字、ISO 3166-1 Alpha-2 の地域コードは任意で大文字にします。Google のローカライズ版に関するドキュメント(https://developers.google.com/search/docs/specialty/international/localized-versions、2026-10-12 読み込み)では、言語コード単独(deは有効な hreflang)を認めていますが、地域コード単独は認めていません。このパイプラインでは翻訳品質を高めるため、言語のみのコードは、編集上の市場が明確な場合(de、fr、ja、およびソース言語)に限り受け付けます。es、pt、zh(および市場やスクリプトが実質的に異なる言語)には、地域コードまたはスクリプトコード(es-ES、es-MX、pt-BR、pt-PT、zh-Hans、zh-Hant)、あるいはユーザーが指定する明示的な中立モードが必要です。ユーザーがes、pt、zhのいずれかを単独で指定した場合は、どの市場を意味するのか一度だけ確認します。フェーズ 5 で出力する hreflang の値は、ユーザーが指定した正規化済みコードと完全に一致します。- プロジェクトから出力形式を検出します(フロントマターの規約、ファイル拡張子、フレームワークのヒント)。または
--formatを使用します。 - ソース言語を解決します。対象言語が
--sourceと一致する場合は、通知を出して翻訳リストから除外します。 - 現在の作業ディレクトリ内に出力ディレクトリを作成します。
すべての出力をプロジェクトルート内に保持し、cwd の外には書き込まないでください。multilingual/ {source-lang}/ {lang-1}/ {lang-2}/ ...
進捗:Phase 1: Configuration complete, [N] languages selected ([codes])
フェーズ 2:元のブログを作成
blog-write サブスキルを呼び出します(/blog write 経由で実行し、テンプレートの自動選択、出典付き統計、引用カプセル、Article スキーマの優先、表示される FAQ コンテンツがある場合のみエンティティシグナルとしての FAQPage、内部リンクゾーン、グラフ、画像の埋め込みなど、既存のすべてのルールを適用します)。トピックと、ユーザーが提示したブログ作成パラメーターを渡します。
元の記事を multilingual/{source-lang}/{slug}.{ext} に保存します。
進捗:Phase 2: Original written, multilingual/{source-lang}/{slug}.{ext}
フェーズ 3:すべての対象言語に翻訳
対象言語ごとに blog-translate を呼び出します。
- 入力:フェーズ 2 で作成した元のブログ記事。
- 対象:特定の言語コード。
- モード:オーケストレーション。呼び出しの先頭にリテラル行
Mode: orchestratedを記述します。オーケストレーションモードでは、blog-translateは独自の納品要件(フェーズ 7 を参照)を省略します。このオーケストレーターがフェーズ 6 で一度実行します。 - 実行環境が対応している場合は、所要時間を短縮するため、対象言語ごとに 1 つのタスクを割り当てて並列実行します。
翻訳を multilingual/{lang}/{localized-slug}.{ext} に保存します。
言語ごとに進捗を表示します:Phase 3: Translating to [lang] ([X]/[N])。その後、Phase 3: All translations complete を表示します。
フェーズ 4:文化的適応
--no-localize が設定されていない場合は、翻訳した記事ごとに blog-localize を呼び出します。
- 入力:翻訳済みのブログ記事。
- ロケール:対象言語または地域コード。
- モード:オーケストレーション。呼び出しの先頭にリテラル行
Mode: orchestratedを記述します。オーケストレーションモードでは、blog-localizeは独自の納品要件を省略します。このオーケストレーターがフェーズ 6 で一度実行します。 - 並列実行します。
生成されたパスが multilingual/ 内にあることを確認し、シンボリックリンクを拒否して、上書き前にバックアップを作成してから、ローカライズされた出力を適用します。ローカライザーはブランド例を置き換え、CTA を調整し、法的な参照を差し替え、文体の丁寧さを調整します。適応処理の全容については ${CLAUDE_SKILL_DIR}/../blog-localize/SKILL.md を参照してください。
進捗:Phase 4: Cultural adaptation complete for [N] languages
フェーズ 5:国際 SEO の生成
3 つのアーティファクトとローカライズ済みスキーマを生成します。claude-seo の seo-hreflang スキルがインストールされている場合は、検証を委任します。インストールされていない場合は、以下の自己完結型ジェネレーターを使用します。
5a. Hreflang タグ(HTML)
<head> にコピーして貼り付けられるタグです。
<link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" />
<link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" />
<link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" />
<link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" />
ルール(seo-hreflang を踏襲):
- すべてのページで、自分自身を含むすべての代替ページを参照します(自己参照)。
x-defaultを含むすべてのhrefは、完全修飾された絶対https://...URL です。x-defaultは、言語が一致しない場合のフォールバック先(グローバルな言語セレクターやデフォルトの市場ページなど)を指定します。ソース言語版である必要はありません。- すべての URL で、同じプロトコル(HTTPS)と末尾のスラッシュの形式を使用します。
- 双方向性:すべての関連付けは相互に対応します。
multilingual/hreflang-tags.html に保存します。
5b. Hreflang サイトマップの断片
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/{source-url}</loc>
<xhtml:link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" />
<xhtml:link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" />
<xhtml:link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" />
</url>
<url>
<loc>https://example.com/{lang-1-url}</loc>
<xhtml:link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" />
<xhtml:link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" />
<xhtml:link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" />
</url>
<url>
<loc>https://example.com/{lang-2-url}</loc>
<xhtml:link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" />
<xhtml:link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" />
<xhtml:link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" />
</url>
</urlset>
ロケールごとに <url> ブロックを 1 つ生成します。すべてのブロックには、完全修飾された https://... URL を使い、各ロケールのすべての代替ページ(自分自身と、任意の x-default を含む)を示す同一の完全な <xhtml:link> セットを含める必要があります。
multilingual/hreflang-sitemap.xml に保存します。
5c. Hreflang マップ(JSON)
CMS 統合のための機械可読マッピングです。
{
"sourceSlug": "how-to-avoid-ai-slop",
"sourceLanguage": "en",
"generatedDate": "YYYY-MM-DD",
"versions": [
{
"lang": "en",
"locale": "en",
"hreflang": "en",
"slug": "how-to-avoid-ai-slop",
"file": "en/how-to-avoid-ai-slop.md",
"url": "https://example.com/en/how-to-avoid-ai-slop/",
"canonical": "https://example.com/en/how-to-avoid-ai-slop/",
"xDefault": true,
"title": "How to Avoid AI Slop in 2026",
"description": "..."
},
{
"lang": "de",
"locale": "de-DE",
"hreflang": "de",
"slug": "wie-man-ki-slop-vermeidet",
"file": "de/wie-man-ki-slop-vermeidet.md",
"url": "https://example.com/de/wie-man-ki-slop-vermeidet/",
"canonical": "https://example.com/de/wie-man-ki-slop-vermeidet/",
"xDefault": false,
"title": "KI-Slop vermeiden in 2026",
"description": "..."
}
],
"hreflang": {
"method": "html",
"x-default": "https://example.com/"
}
}
hreflang はユーザーが指定した正規化済みコードと完全に一致します(ここでは de)。locale には使用した文化的プロファイルを記録します。こちらは、より詳細な指定になる場合があります。
multilingual/hreflang-map.json に保存します。
5d. ローカライズされた記事スキーマ(必須)
すべての言語版の Article/BlogPosting JSON-LD に inLanguage フィールドと translationOfWork フィールドを追加するか、更新します。
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "[Localized title]",
"description": "[Localized description]",
"inLanguage": "[lang-code]",
"isPartOf": { "@type": "Blog", "inLanguage": "[lang-code]" },
"translationOfWork": {
"@type": "BlogPosting",
"inLanguage": "[source-lang]",
"url": "[source-url]"
}
}
各バージョンのより詳細なスキーマには、既存の /blog schema サブスキルを使用します。内部スキーマのヒューリスティックでは、Article または BlogPosting に 2 ポイント、Person に 1 ポイント、Organization または BreadcrumbList のいずれかに 1 ポイントを付与します。これは Google の要件ではありません。表示されているサイトのデータが対応している場合は、Organization と BreadcrumbList の両方を含めます。FAQPage は任意であり、Google のリッチリザルトを目的としたものではなく、表示されている FAQ コンテンツのエンティティシグナルとしてのみ使用します。
フェーズ 6:最終ロケール納品契約(ロケールごとにちょうど1回)
これは、各対象ロケールに対して実行する唯一の納品契約です。blog-translate
とblog-localizeはオーケストレーションモードで実行され、それぞれ納品契約をスキップしました(どちらにも「blog-multilingual(オーケストレーションモード)から呼び出された場合は納品契約をスキップしてください。blog-multilingualが最終テキストに対してロケールごとに1回実行します。」という文と、「オーケストレーションモードは、呼び出しの先頭にあるリテラル行Mode: orchestratedで示されます。」という行が含まれています)。そのため、完全な5段階のゲートシーケンスは、最終ローカライズ済みテキスト(または--no-localizeが設定されている場合は翻訳)に対して1回だけ実行します。ソースロケールでは、正常に完了した/blog writeのレビューを維持します。そのロケールの翻訳またはローカライズに関する最後の変更を保存するまでは、このフェーズを開始しないでください。
対象ロケールごとに、正式なシーケンスを個別に実行します。
BLOG_SCRIPT_DIR="${CLAUDE_BLOG_SCRIPTS_DIR:-${CLAUDE_SKILL_DIR}/../../scripts}"を解決し、絶対パスでない場合は拒否します。現在のプロジェクトのscripts/ディレクトリからヘルパーを解決してはいけません。- ビジュアル:分離された成果物ディレクトリとして
multilingual/{lang}/delivery/{localized-slug}/を作成し、最終ロケールのソースをその中に小文字のローカライズ済みスラッグでコピーします。すべての下書きマーカー([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。 - レビュー:出力されたノンスのみを渡し、レンダリング済みのロケールHTMLを対象に、新しい
blog-reviewer呼び出しを実行します。レビュアーはテキストを返します。これを<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が0件、ノンスが一致し、最終結果がBLOCKING: falseで、その他すべてのゲートにも合格した場合にのみ、そのロケールを合格とします。不合格のロケールはdraft-blockedのままにします。合格したロケールはそのまま維持し、不合格ロケールの診断結果を報告します。全体を完了したと報告してはいけません。
フェーズ 7:納品の概要
## Multilingual blog [complete / partially blocked]: [Title]
### Original
- Language: [source]
- File: multilingual/{source}/{slug}.{ext}
### Translations
| Language | File | Localized | Keywords adapted | Delivery review |
|----------|------|-----------|------------------|-----------------|
| de | multilingual/de/{slug}.md | yes | [N] | passed / draft-blocked |
| fr | multilingual/fr/{slug}.md | yes | [N] | passed / draft-blocked |
| es-MX | multilingual/es-MX/{slug}.md | yes | [N] | passed / draft-blocked |
### International SEO assets
- multilingual/hreflang-tags.html
- multilingual/hreflang-sitemap.xml
- multilingual/hreflang-map.json
- Localized Article schema embedded per version
### Total
- [N] posts in [N] languages
- [N] SEO assets generated
- [N] locale artifact sets passed 90+, zero P0, and nonce verification
### Next steps
- Replace `{source-url}`, `{lang-1-url}`, `{lang-2-url}`, and
`{fallback-url}` placeholders in hreflang tags with real absolute HTTPS
URLs.
- Merge `hreflang-sitemap.xml` into your existing sitemap.
- Run `/blog locale-audit multilingual/` to verify completeness.
- Resolve `[INTERNAL-LINK]` placeholders with locale-specific URLs.
- If claude-seo is installed, run `/seo hreflang multilingual/` for
deeper validation.
相互参照
| 条件 | 実行するコマンド |
|---|---|
| ソースを再生成または書き換える場合 | /blog write <topic> |
| 既存ファイルを1つだけ翻訳する場合 | /blog translate <file> --to <codes> |
| 1つのファイルの文化的適合性を高める場合 | /blog localize <file> --locale <code> |
| 多言語ディレクトリを監査する場合 | /blog locale-audit <directory> |
| hreflangの検証をさらに詳しく行う場合 | /seo hreflang <directory>(claude-seo、任意) |
エラー処理
| 状況 | 対応 |
|---|---|
blog-writeが見つからない | エラー:「このスキルにはblog-writeが必要です。claude-blogを再インストールしてください。」 |
| 翻訳の1つが失敗 | 残りの翻訳を完了し、部分的な結果を報告して、再試行コマンドを提案します |
| ソース言語が対象言語と同じ | その対象をスキップし、通知を記録します |
es、pt、zhのみの対象指定 | 対象市場(es-ES、es-MX、pt-BR、pt-PT、zh-Hans、zh-Hant)を確認するか、明示的な中立モードを指定するよう求めます |
| 対象言語が10以上 | 書き込み前に停止します。スケールドコンテンツ悪用のリスクを説明し、レビュー済みの対象言語を最大9つずつまとめたバッチを必須とします |
seo-hreflangがインストールされていない | 自己完結型ジェネレーターを使用し、その旨を概要に記載します |
コマンドのまとめ
| コマンド | 目的 |
|---|---|
/blog multilingual <topic> --languages de,fr,es-MX | 原文を作成し、翻訳・ローカライズして、hreflang アセットを生成します |
/blog translate <file> --to de,fr,es | 1 つのファイルを指定した言語に翻訳します |
/blog localize <file> --locale de-DE | 翻訳済みの 1 つのファイルを文化に合わせて深く適応させます |
/blog locale-audit <directory> | ディレクトリ全体で多言語の品質保証を行います |