关于 blog-multilingual
这是一个 Claude Blog 技能,统筹博客写作、翻译、文化适配和国际 SEO,面向发布多语言内容的团队。除本地化文章外,还生成 hreflang 和结构化数据等文件。
主要功能
- 01统筹博客写作与翻译
- 02按地区进行文化适配
- 03生成 hreflang 标签和站点地图
- 04生成本地化 Article JSON-LD
- 05支持 Markdown、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} 进行替换;
它不是导出的 shell 变量。执行前解析这些路径、为路径加引号,
并拒绝非绝对路径的覆盖值。将从 ${CLAUDE_SKILL_DIR}/../blog/references
解析出的 blog_reference_root、从
${CLAUDE_SKILL_DIR}/../blog/templates 解析出的 blog_template_root,
以及所需的同级目录根路径传递给 Agent。
加载项目上下文前,先阅读主参考文档 orchestration-details.md;
仅将其由辅助程序围栏标记的输出传递给下游 Agent。
旗舰级多语言编排器。将博客撰写、翻译、文化适配和完整的国际 SEO 整合到一条命令中。为每种目标语言生成可直接发布的博客文章,包含 hreflang 标签、本地化 JSON-LD 架构和 CMS 集成元数据。
改编自 Chris Mueller 的
claude-blog-multilingual(AI Marketing Hub Pro Hub Challenge 投稿,2026 年 3 月,熟练级评分 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 值必须与用户提供的标准化代码完全一致。 - 根据项目检测输出格式(frontmatter 约定、文件扩展名、框架提示),或使用
--format。 - 确定源语言。如果目标语言与
--source相同,则将其从翻译列表中移除并告知用户。 - 在当前工作目录内创建输出目录:
所有输出均须保存在项目根目录中;不得写入 cwd 之外的位置。multilingual/ {source-lang}/ {lang-1}/ {lang-2}/ ...
进度:Phase 1: Configuration complete, [N] languages selected ([codes])
阶段 2:撰写原始博客
调用 blog-write 子技能(通过 /blog write 路由,以应用所有现有规则:自动选择模板、引用来源的统计数据、引用胶囊、Article schema 优先级、仅在可见 FAQ 内容存在时将 FAQPage 用作实体信号、内部链接区域、图表、嵌入图片)。传入主题及用户提供的任何 blog-write 参数。
将原文保存到 multilingual/{source-lang}/{slug}.{ext}。
进度:Phase 2: Original written, multilingual/{source-lang}/{slug}.{ext}
阶段 3:翻译为所有目标语言
针对每种目标语言,调用 blog-translate:
- 输入:阶段 2 生成的原始博客文章。
- 目标:特定语言代码。
- 模式:orchestrated。在调用内容顶部放置字面行
Mode: orchestrated。在 orchestrated 模式下,blog-translate会跳过自身的交付约定(见其阶段 7);本编排器将在阶段 6 中执行一次。 - 如果运行环境支持并行处理,则并行运行各目标语言的任务(每种语言一个 Task),以缩短总用时。
将译文保存到 multilingual/{lang}/{localized-slug}.{ext}。
每种语言分别报告进度:Phase 3: Translating to [lang] ([X]/[N]),完成后报告:Phase 3: All translations complete
阶段 4:文化适配
如果未设置 --no-localize,则对每篇译文调用 blog-localize:
- 输入:译文博客文章。
- 区域设置:目标语言或区域代码。
- 模式:orchestrated。在调用内容顶部放置字面行
Mode: orchestrated。在 orchestrated 模式下,blog-localize会跳过自身的交付约定;本编排器将在阶段 6 中执行一次。 - 并行运行。
只有在解析出 multilingual/ 内生成的路径、拒绝符号链接并在覆盖文件时创建备份后,才应用本地化输出。本地化器会替换品牌示例、调整 CTA、替换法律引用并调整正式程度。有关完整的适配流程,请参见 ${CLAUDE_SKILL_DIR}/../blog-localize/SKILL.md。
进度:Phase 4: Cultural adaptation complete for [N] languages。
阶段 5:生成国际 SEO 内容
生成三项内容及本地化 schema。如果已安装 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 保持一致):
- 每个页面都引用所有备用版本,包括自身(自引用)。
- 每个
href(包括x-default)都必须是完整的绝对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> 块。每个块都必须包含适用于所有地区语言版本的相同完整 <xhtml:link> 备用版本集合,以及自身和可选的 x-default,并使用完整的 https://... URL。
保存到 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. 本地化文章 Schema(必需)
在每种语言版本上附加或更新 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 子技能,以提供更丰富的 Schema。
对于内部 Schema 启发式评分,Article 或 BlogPosting 得 2 分,Person 得 1 分,Organization 或 BreadcrumbList 任一得 1 分。这不是 Google 的要求。当可见的网站数据支持时,同时包含 Organization 和 BreadcrumbList。FAQPage 为可选项,仅在存在可见 FAQ 内容时用作实体信号,而非 Google 富媒体搜索结果目标。
阶段 6:最终语言区域交付契约(每种语言区域恰好运行一次)
这是每个目标语言区域唯一一次运行交付契约。blog-translate
和 blog-localize 以编排模式运行并跳过了各自的交付契约(两者都包含句子“When invoked by blog-multilingual (orchestrated mode), skip the delivery contract; blog-multilingual runs it once per locale on the final text.”以及行“Orchestrated mode is signaled by the literal line Mode: orchestrated at the top of the invocation.”),因此,完整的五道关卡流程只会在最终本地化文本上运行一次(如果设置了 --no-localize,则在译文上运行)。源语言区域保留成功的 /blog write 审核结果。请勿在该语言区域最后一次翻译或本地化修改保存前开始此阶段。
针对每个目标语言区域,分别运行规范流程:
- 解析
BLOG_SCRIPT_DIR="${CLAUDE_BLOG_SCRIPTS_DIR:-${CLAUDE_SKILL_DIR}/../../scripts}"并拒绝非绝对路径。切勿从当前项目的scripts/目录解析辅助脚本。 - 视觉素材:创建
multilingual/{lang}/delivery/{localized-slug}/,作为独立的产物目录,并将最终语言区域源文件以其小写本地化 slug 命名后复制到其中。处理所有草稿标记([INTERNAL-LINK、[IMAGE、[CHART):不得残留任何标记。复制源主视觉图并命名为hero.<ext>;新建针对特定语言区域的主视觉图属于付费调用,须先通过blog-image成本与许可关卡。 - 渲染:
python3 "$BLOG_SCRIPT_DIR/blog_render.py" --md <locale-file> --out-dir <locale-delivery-dir>。 - 初始化 nonce:
python3 "$BLOG_SCRIPT_DIR/blog_preflight.py" --draft <locale-delivery-dir> --init-review-nonce。 - 审核:仅将打印出的 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 进行任何更改后,都必须重新渲染、重新初始化 nonce 并重新审核。每个语言区域最多迭代 3 次。
只有在评分达到 90 分及以上、P0 为零、nonce 匹配、最终 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> |
| 仅翻译一个现有文件 | /blog translate <file> --to <codes> |
| 深入调整一个文件的文化适配 | /blog localize <file> --locale <code> |
| 审核多语言目录 | /blog locale-audit <directory> |
| 深入验证 hreflang | /seo hreflang <directory>(claude-seo,可选) |
错误处理
| 情况 | 操作 |
|---|---|
缺少 blog-write | 错误:“此技能需要 blog-write。请重新安装 claude-blog。” |
| 一种语言的翻译失败 | 完成其余翻译,报告部分结果,并建议重试命令 |
| 源语言与某个目标语言相同 | 跳过该目标并记录提示 |
目标仅为 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 | 将一个文件翻译成目标语言 |
/blog localize <file> --locale de-DE | 对一个已翻译文件进行深入的文化适配 |
/blog locale-audit <directory> | 对整个目录进行多语言 QA |