mcpField
B
blog-multilingual

blog-multilingual

github.com/agricidanielマーケティング・グロース2.6k2.5k 回インストール2 週間前に更新
リポジトリ

blog-multilingual について

Claude Blog のスキルとして、ブログ執筆、翻訳、文化的な調整、国際 SEO をまとめて進めます。多言語記事を公開するチーム向けで、各言語の記事に加えて hreflang や構造化データも生成します。

主な機能

  1. 01ブログ執筆と翻訳のオーケストレーション
  2. 02地域に応じた文化的な調整
  3. 03hreflang タグとサイトマップの生成
  4. 04ローカライズした Article JSON-LD
  5. 05Markdown、MDX、HTML の出力

活用シーン

  1. 01選択した複数市場向けの記事公開
  2. 02翻訳記事の現地読者向け調整
  3. 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-writeclaude-blog(このプラグイン)はい
blog-translateclaude-blog(このプラグイン)はい
blog-localizeclaude-blog(このプラグイン)はい(--localize がオンの場合。デフォルト)
seo-hreflangclaude-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:設定
  1. 引数を解析します。トピック、対象言語、ソース、形式を抽出します。
  2. 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 の値は、ユーザーが指定した正規化済みコードと完全に一致します。
  3. プロジェクトから出力形式を検出します(フロントマターの規約、ファイル拡張子、フレームワークのヒント)。または --format を使用します。
  4. ソース言語を解決します。対象言語が --source と一致する場合は、通知を出して翻訳リストから除外します。
  5. 現在の作業ディレクトリ内に出力ディレクトリを作成します。
    multilingual/
      {source-lang}/
      {lang-1}/
      {lang-2}/
      ...
    
    すべての出力をプロジェクトルート内に保持し、cwd の外には書き込まないでください。

進捗: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のレビューを維持します。そのロケールの翻訳またはローカライズに関する最後の変更を保存するまでは、このフェーズを開始しないでください。

対象ロケールごとに、正式なシーケンスを個別に実行します。

  1. BLOG_SCRIPT_DIR="${CLAUDE_BLOG_SCRIPTS_DIR:-${CLAUDE_SKILL_DIR}/../../scripts}" を解決し、絶対パスでない場合は拒否します。現在のプロジェクトのscripts/ディレクトリからヘルパーを解決してはいけません。
  2. ビジュアル:分離された成果物ディレクトリとしてmultilingual/{lang}/delivery/{localized-slug}/を作成し、最終ロケールのソースをその中に小文字のローカライズ済みスラッグでコピーします。すべての下書きマーカー([INTERNAL-LINK、[IMAGE、[CHART)を解決します。残っていてはいけません。ソースのヒーロー画像を再利用する場合は、hero.<ext>としてコピーします。新しいロケール専用のヒーロー画像は有料の呼び出しとなるため、まずblog-imageの費用と同意のゲートを通過する必要があります。
  3. レンダリング:python3 "$BLOG_SCRIPT_DIR/blog_render.py" --md <locale-file> --out-dir <locale-delivery-dir>。
  4. ノンスを初期化:python3 "$BLOG_SCRIPT_DIR/blog_preflight.py" --draft <locale-delivery-dir> --init-review-nonce。
  5. レビュー:出力されたノンスのみを渡し、レンダリング済みのロケールHTMLを対象に、新しいblog-reviewer呼び出しを実行します。レビュアーはテキストを返します。これを<locale-delivery-dir>/review.mdにそのまま保存します。
  6. ゲート:python3 "$BLOG_SCRIPT_DIR/blog_preflight.py" --draft <locale-delivery-dir> --strict --slug <localized-slug>。
  7. ループ:ロケールファイル、ヒーロー画像、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,es1 つのファイルを指定した言語に翻訳します
/blog localize <file> --locale de-DE翻訳済みの 1 つのファイルを文化に合わせて深く適応させます
/blog locale-audit <directory>ディレクトリ全体で多言語の品質保証を行います

コメント