Blog Multilingual, One-Command International Publishing
One-command multilingual blog creation.
How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit AgriciDaniel/claude-blog/skills/blog-multilingual#main ~/.claude/skills/blog-multilingual-2For one project only, change the path to .claude/skills/blog-multilingual-2.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text343 lines
Blog Multilingual, One-Command International Publishing
The flagship multilingual orchestrator. Combines blog writing, translation, cultural adaptation, and full international SEO into a single command. Produces publication-ready blog posts in every target language with hreflang tags, localized JSON-LD schema, and CMS-integration metadata.
Adapted from
claude-blog-multilingualby Chris Mueller (AI Marketing Hub Pro Hub Challenge submission, March 2026, scored 85/100 Proficient). Original: https://github.com/Chriss54/multilingual-int This port removes the originalcurl | bashinstaller and credential handling flagged in the audit, integrates as core skills, and uses the shared cultural-adaptation reference underblog-translate/references/.
Dependencies
Invoked internally by this orchestrator:
| Component | Source | Required |
|---|---|---|
blog-write |
claude-blog (this plugin) | Yes |
blog-translate |
claude-blog (this plugin) | Yes |
blog-localize |
claude-blog (this plugin) | Yes (when --localize is on, default) |
seo-hreflang |
claude-seo (sibling plugin) | No, falls back to a self-contained generator |
If seo-hreflang is not installed, the orchestrator emits hreflang tags using
its own minimal generator (Phase 5 below) and notes the limitation in the
delivery summary. Hreflang validation in that case is structural only, not the
deeper validation seo-hreflang provides.
Command Syntax
/blog multilingual <topic> --languages <lang1,lang2,...> [--source <lang>] [--no-localize] [--format <md|mdx|html>]
| Argument | Required | Default | Description |
|---|---|---|---|
<topic> |
Yes | required | Blog topic or working title |
--languages |
Yes | required | Comma-separated Google-compatible hreflang tags (e.g. de,fr,es-MX,ja,pt-BR) |
--source |
No | en |
Source language to write the original in |
--no-localize |
No | off | Skip cultural adaptation (translation only) |
--format |
No | auto | Output format: md, mdx, or html |
If --languages is missing, ask the user once before running anything:
"Which languages should the blog be published in? Provide hreflang tags
separated by commas (e.g., de,fr,es-MX,ja,pt-BR). The post will be written
in `` first, then translated."
Workflow
Phase 1: Configuration
- Parse arguments. Extract topic, target languages, source, format.
- Validate each language code with the shared multilingual locale rules used
by
blog-translate,blog-localize, andblog-locale-audit: ISO 639-1 language in lowercase, optional ISO 15924 script in title case, optional ISO 3166-1 Alpha-2 region in uppercase. Require a region or explicit neutral mode for ambiguous language-only targets such ases,pt, andzh. - Detect output format from the project (frontmatter convention, file
extensions, framework hints) or use
--format. - Resolve source language. If a target language equals
--source, drop it from the translation list with a notice. - Create the output directory inside the current working directory:
Keep all output inside the project root; do not write outside the cwd.multilingual/ {source-lang}/ {lang-1}/ {lang-2}/ ...
Progress: Phase 1: Configuration complete, [N] languages selected ([codes])
Phase 2: Write Original Blog
Invoke the blog-write sub-skill (route through /blog write so all
existing rules apply: template auto-selection, sourced statistics, citation
capsules, Article schema priority, FAQPage only as an entity signal when
visible FAQ content exists, internal-link zones, charts, image embedding). Pass the
topic and any blog-write parameters surfaced by the user.
Save the original to multilingual/{source-lang}/{slug}.{ext}.
Progress: Phase 2: Original written, multilingual/{source-lang}/{slug}.{ext}
Phase 3: Translate to All Target Languages
For each target language, invoke blog-translate:
- Input: the original blog post produced in Phase 2.
- Target: the specific language code.
- Run targets in parallel where the runtime supports it (one Task per language) to reduce wall-clock time.
Save translations to multilingual/{lang}/{localized-slug}.{ext}.
Progress: Phase 3: Translating to [lang] ([X]/[N]) per language, then
Phase 3: All translations complete.
Phase 4: Cultural Adaptation
If --no-localize is NOT set, invoke blog-localize for every translated
post:
- Input: the translated blog post.
- Locale: the target language or region code.
- Run in parallel.
Apply the localized output only after resolving the generated path inside
multilingual/, rejecting symlinks, and creating a backup when overwriting.
The localizer swaps brand examples, adapts CTAs, substitutes legal
references, and adjusts formality. See
../blog-localize/SKILL.md for the full adaptation pass.
Progress: Phase 4: Cultural adaptation complete for [N] languages.
Phase 5: International SEO Generation
Generate three artifacts plus localized schema. If the seo-hreflang skill
from claude-seo is installed, delegate validation to it. Otherwise use the
self-contained generator below.
5a. Hreflang Tags (HTML)
Copy-paste ready tags for <head>:
<!-- Hreflang tags. Paste into <head> of each language version. -->
<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}" />
Rules (mirrored from seo-hreflang):
- Every page references all alternates including itself (self-referencing).
- Every
href, includingx-default, is a fully qualified absolutehttps://...URL. x-defaultpoints to the unmatched-language fallback, such as a global language selector or default market page. It does not have to be the source language version.- All URLs use the same protocol (HTTPS) and trailing-slash convention.
- Bidirectional: every relationship is reciprocal.
Save to multilingual/hreflang-tags.html.
5b. Hreflang Sitemap Fragment
<?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>
Generate one <url> block per locale. Every block must contain the identical
complete set of <xhtml:link> alternates for every locale, plus self and
optional x-default, using fully qualified https://... URLs.
Save to multilingual/hreflang-sitemap.xml.
5c. Hreflang Map (JSON)
Machine-readable mapping for CMS integration:
{
"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-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/"
}
}
Save to multilingual/hreflang-map.json.
5d. Localized Article Schema (Required)
Attach or update Article/BlogPosting JSON-LD on every language version with
inLanguage and translationOfWork fields:
{
"@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]"
}
}
Use the existing /blog schema sub-skill for richer schema on each version.
Keep Article/BlogPosting, Person, Organization, and BreadcrumbList as the
priority stack. FAQPage is optional and only for visible FAQ content as an
entity and AI-citation signal, not a Google rich result target.
Phase 6: Delivery Summary
## Multilingual blog complete: [Title]
### Original
- Language: [source]
- File: multilingual/{source}/{slug}.{ext}
### Translations
| Language | File | Localized | Keywords adapted |
|----------|------|-----------|------------------|
| de | multilingual/de/{slug}.md | yes | [N] |
| fr | multilingual/fr/{slug}.md | yes | [N] |
| es | multilingual/es/{slug}.md | yes | [N] |
### 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
### 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.
Cross-References
| When | Run |
|---|---|
| To regenerate or reword the source | /blog write <topic> |
| To translate one existing file only | /blog translate <file> --to <codes> |
| To deepen cultural fit on one file | /blog localize <file> --locale <code> |
| To audit a multilingual directory | /blog locale-audit <directory> |
| For deeper hreflang validation | /seo hreflang <directory> (claude-seo, optional) |
Error Handling
| Scenario | Action |
|---|---|
blog-write missing |
Error: "This skill requires blog-write. Reinstall claude-blog." |
| One translation fails | Complete the rest, report partial results, suggest a retry command |
| Source language equals a target | Skip that target, log a notice |
| 10 or more target languages | Stop before writing. Explain scaled-content-abuse risk and require reviewed batches of at most 9 target languages |
seo-hreflang not installed |
Use the self-contained generator, note it in the summary |
Commands Recap
| Command | Purpose |
|---|---|
/blog multilingual <topic> --languages de,fr,es |
Write source, translate, localize, emit hreflang assets |
/blog translate <file> --to de,fr,es |
Translate one file into target languages |
/blog localize <file> --locale de-DE |
Cultural deep-adaptation of one translated file |
/blog locale-audit <directory> |
Multilingual QA across a directory |
| 1 | |
| 2 | name blog-multilingual |
| 3 | description > |
| 4 | One-command multilingual blog creation. Writes a blog post, translates it |
| 5 | into user-specified languages, applies cultural adaptation, and emits |
| 6 | hreflang tags, sitemap entries, and a CMS-ready language map. The complete |
| 7 | write-to-publish pipeline for international content. Orchestrates blog-write, |
| 8 | blog-translate, blog-localize, and (optionally) seo-hreflang. |
| 9 | Use when user says "multilingual blog", "blog multilingual", "write in |
| 10 | multiple languages", "international blog", "mehrsprachiger Blog", "blog |
| 11 | multilingue", "blog multilingue", "create blog in German and French". |
| 12 | user-invokable true |
| 13 | argument-hint "<topic> --languages <comma-separated-codes>" |
| 14 | license MIT |
| 15 | compatibility Requires claude-blog (blog-write). Optional integration with claude-seo (seo-hreflang) for richer hreflang validation. |
| 16 | metadata |
| 17 | author AgriciDaniel |
| 18 | version "2.2.0" |
| 19 | category blog |
| 20 | |
| 21 | |
| 22 | # Blog Multilingual, One-Command International Publishing |
| 23 | |
| 24 | The flagship multilingual orchestrator. Combines blog writing, translation, |
| 25 | cultural adaptation, and full international SEO into a single command. |
| 26 | Produces publication-ready blog posts in every target language with hreflang |
| 27 | tags, localized JSON-LD schema, and CMS-integration metadata. |
| 28 | |
| 29 | > Adapted from `claude-blog-multilingual` by Chris Mueller (AI Marketing Hub |
| 30 | > Pro Hub Challenge submission, March 2026, scored 85/100 Proficient). |
| 31 | > Original: https://github.com/Chriss54/multilingual-int |
| 32 | > This port removes the original `curl | bash` installer and credential |
| 33 | > handling flagged in the audit, integrates as core skills, and uses the |
| 34 | > shared cultural-adaptation reference under `blog-translate/references/`. |
| 35 | |
| 36 | ## Dependencies |
| 37 | |
| 38 | Invoked internally by this orchestrator: |
| 39 | |
| 40 | | Component | Source | Required | |
| 41 | |-----------|--------|----------| |
| 42 | | `blog-write` | claude-blog (this plugin) | Yes | |
| 43 | | `blog-translate` | claude-blog (this plugin) | Yes | |
| 44 | | `blog-localize` | claude-blog (this plugin) | Yes (when `--localize` is on, default) | |
| 45 | | `seo-hreflang` | claude-seo (sibling plugin) | No, falls back to a self-contained generator | |
| 46 | |
| 47 | If `seo-hreflang` is not installed, the orchestrator emits hreflang tags using |
| 48 | its own minimal generator (Phase 5 below) and notes the limitation in the |
| 49 | delivery summary. Hreflang validation in that case is structural only, not the |
| 50 | deeper validation `seo-hreflang` provides. |
| 51 | |
| 52 | ## Command Syntax |
| 53 | |
| 54 | |
| 55 | /blog multilingual <topic> --languages <lang1,lang2,...> [--source <lang>] [--no-localize] [--format <md|mdx|html>] |
| 56 | |
| 57 | |
| 58 | | Argument | Required | Default | Description | |
| 59 | |----------|----------|---------|-------------| |
| 60 | | `<topic>` | Yes | required | Blog topic or working title | |
| 61 | | `--languages` | Yes | required | Comma-separated Google-compatible hreflang tags (e.g. `de,fr,es-MX,ja,pt-BR`) | |
| 62 | | `--source` | No | `en` | Source language to write the original in | |
| 63 | | `--no-localize` | No | off | Skip cultural adaptation (translation only) | |
| 64 | | `--format` | No | auto | Output format: `md`, `mdx`, or `html` | |
| 65 | |
| 66 | If `--languages` is missing, ask the user once before running anything: |
| 67 | "Which languages should the blog be published in? Provide hreflang tags |
| 68 | separated by commas (e.g., `de,fr,es-MX,ja,pt-BR`). The post will be written |
| 69 | in `<source>` first, then translated." |
| 70 | |
| 71 | ## Workflow |
| 72 | |
| 73 | ### Phase 1: Configuration |
| 74 | |
| 75 | Parse arguments. Extract topic, target languages, source, format. |
| 76 | Validate each language code with the shared multilingual locale rules used |
| 77 | by `blog-translate`, `blog-localize`, and `blog-locale-audit`: ISO 639-1 |
| 78 | language in lowercase, optional ISO 15924 script in title case, optional |
| 79 | ISO 3166-1 Alpha-2 region in uppercase. Require a region or explicit |
| 80 | neutral mode for ambiguous language-only targets such as `es`, `pt`, and |
| 81 | `zh`. |
| 82 | Detect output format from the project (frontmatter convention, file |
| 83 | extensions, framework hints) or use `--format`. |
| 84 | Resolve source language. If a target language equals `--source`, drop it |
| 85 | from the translation list with a notice. |
| 86 | Create the output directory inside the current working directory: |
| 87 | |
| 88 | multilingual/ |
| 89 | {source-lang}/ |
| 90 | {lang-1}/ |
| 91 | {lang-2}/ |
| 92 | ... |
| 93 | |
| 94 | Keep all output inside the project root; do not write outside the cwd. |
| 95 | |
| 96 | Progress: `Phase 1: Configuration complete, [N] languages selected ([codes])` |
| 97 | |
| 98 | ### Phase 2: Write Original Blog |
| 99 | |
| 100 | Invoke the `blog-write` sub-skill (route through `/blog write` so all |
| 101 | existing rules apply: template auto-selection, sourced statistics, citation |
| 102 | capsules, Article schema priority, FAQPage only as an entity signal when |
| 103 | visible FAQ content exists, internal-link zones, charts, image embedding). Pass the |
| 104 | topic and any blog-write parameters surfaced by the user. |
| 105 | |
| 106 | Save the original to `multilingual/{source-lang}/{slug}.{ext}`. |
| 107 | |
| 108 | Progress: `Phase 2: Original written, multilingual/{source-lang}/{slug}.{ext}` |
| 109 | |
| 110 | ### Phase 3: Translate to All Target Languages |
| 111 | |
| 112 | For each target language, invoke `blog-translate`: |
| 113 | |
| 114 | Input: the original blog post produced in Phase 2. |
| 115 | Target: the specific language code. |
| 116 | Run targets in parallel where the runtime supports it (one Task per |
| 117 | language) to reduce wall-clock time. |
| 118 | |
| 119 | Save translations to `multilingual/{lang}/{localized-slug}.{ext}`. |
| 120 | |
| 121 | Progress: `Phase 3: Translating to [lang] ([X]/[N])` per language, then |
| 122 | `Phase 3: All translations complete`. |
| 123 | |
| 124 | ### Phase 4: Cultural Adaptation |
| 125 | |
| 126 | If `--no-localize` is NOT set, invoke `blog-localize` for every translated |
| 127 | post: |
| 128 | |
| 129 | Input: the translated blog post. |
| 130 | Locale: the target language or region code. |
| 131 | Run in parallel. |
| 132 | |
| 133 | Apply the localized output only after resolving the generated path inside |
| 134 | `multilingual/`, rejecting symlinks, and creating a backup when overwriting. |
| 135 | The localizer swaps brand examples, adapts CTAs, substitutes legal |
| 136 | references, and adjusts formality. See |
| 137 | `../blog-localize/SKILL.md` for the full adaptation pass. |
| 138 | |
| 139 | Progress: `Phase 4: Cultural adaptation complete for [N] languages`. |
| 140 | |
| 141 | ### Phase 5: International SEO Generation |
| 142 | |
| 143 | Generate three artifacts plus localized schema. If the `seo-hreflang` skill |
| 144 | from claude-seo is installed, delegate validation to it. Otherwise use the |
| 145 | self-contained generator below. |
| 146 | |
| 147 | #### 5a. Hreflang Tags (HTML) |
| 148 | |
| 149 | Copy-paste ready tags for `<head>`: |
| 150 | |
| 151 | |
| 152 | <!-- Hreflang tags. Paste into <head> of each language version. --> |
| 153 | <link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" /> |
| 154 | <link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" /> |
| 155 | <link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" /> |
| 156 | <link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" /> |
| 157 | |
| 158 | |
| 159 | Rules (mirrored from `seo-hreflang`): |
| 160 | |
| 161 | Every page references all alternates including itself (self-referencing). |
| 162 | Every `href`, including `x-default`, is a fully qualified absolute |
| 163 | `https://...` URL. |
| 164 | `x-default` points to the unmatched-language fallback, such as a global |
| 165 | language selector or default market page. It does not have to be the source |
| 166 | language version. |
| 167 | All URLs use the same protocol (HTTPS) and trailing-slash convention. |
| 168 | Bidirectional: every relationship is reciprocal. |
| 169 | |
| 170 | Save to `multilingual/hreflang-tags.html`. |
| 171 | |
| 172 | #### 5b. Hreflang Sitemap Fragment |
| 173 | |
| 174 | |
| 175 | <?xml version="1.0" encoding="UTF-8"?> |
| 176 | <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" |
| 177 | xmlns:xhtml="http://www.w3.org/1999/xhtml"> |
| 178 | <url> |
| 179 | <loc>https://example.com/{source-url}</loc> |
| 180 | <xhtml:link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" /> |
| 181 | <xhtml:link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" /> |
| 182 | <xhtml:link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" /> |
| 183 | <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" /> |
| 184 | </url> |
| 185 | <url> |
| 186 | <loc>https://example.com/{lang-1-url}</loc> |
| 187 | <xhtml:link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" /> |
| 188 | <xhtml:link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" /> |
| 189 | <xhtml:link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" /> |
| 190 | <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" /> |
| 191 | </url> |
| 192 | <url> |
| 193 | <loc>https://example.com/{lang-2-url}</loc> |
| 194 | <xhtml:link rel="alternate" hreflang="{source}" href="https://example.com/{source-url}" /> |
| 195 | <xhtml:link rel="alternate" hreflang="{lang-1}" href="https://example.com/{lang-1-url}" /> |
| 196 | <xhtml:link rel="alternate" hreflang="{lang-2}" href="https://example.com/{lang-2-url}" /> |
| 197 | <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/{fallback-url}" /> |
| 198 | </url> |
| 199 | </urlset> |
| 200 | |
| 201 | |
| 202 | Generate one `<url>` block per locale. Every block must contain the identical |
| 203 | complete set of `<xhtml:link>` alternates for every locale, plus self and |
| 204 | optional `x-default`, using fully qualified `https://...` URLs. |
| 205 | |
| 206 | Save to `multilingual/hreflang-sitemap.xml`. |
| 207 | |
| 208 | #### 5c. Hreflang Map (JSON) |
| 209 | |
| 210 | Machine-readable mapping for CMS integration: |
| 211 | |
| 212 | |
| 213 | { |
| 214 | "sourceSlug": "how-to-avoid-ai-slop", |
| 215 | "sourceLanguage": "en", |
| 216 | "generatedDate": "YYYY-MM-DD", |
| 217 | "versions": [ |
| 218 | { |
| 219 | "lang": "en", |
| 220 | "locale": "en", |
| 221 | "hreflang": "en", |
| 222 | "slug": "how-to-avoid-ai-slop", |
| 223 | "file": "en/how-to-avoid-ai-slop.md", |
| 224 | "url": "https://example.com/en/how-to-avoid-ai-slop/", |
| 225 | "canonical": "https://example.com/en/how-to-avoid-ai-slop/", |
| 226 | "xDefault": true, |
| 227 | "title": "How to Avoid AI Slop in 2026", |
| 228 | "description": "..." |
| 229 | }, |
| 230 | { |
| 231 | "lang": "de", |
| 232 | "locale": "de-DE", |
| 233 | "hreflang": "de-DE", |
| 234 | "slug": "wie-man-ki-slop-vermeidet", |
| 235 | "file": "de/wie-man-ki-slop-vermeidet.md", |
| 236 | "url": "https://example.com/de/wie-man-ki-slop-vermeidet/", |
| 237 | "canonical": "https://example.com/de/wie-man-ki-slop-vermeidet/", |
| 238 | "xDefault": false, |
| 239 | "title": "KI-Slop vermeiden in 2026", |
| 240 | "description": "..." |
| 241 | } |
| 242 | ], |
| 243 | "hreflang": { |
| 244 | "method": "html", |
| 245 | "x-default": "https://example.com/" |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | |
| 250 | Save to `multilingual/hreflang-map.json`. |
| 251 | |
| 252 | #### 5d. Localized Article Schema (Required) |
| 253 | |
| 254 | Attach or update Article/BlogPosting JSON-LD on every language version with |
| 255 | `inLanguage` and `translationOfWork` fields: |
| 256 | |
| 257 | |
| 258 | { |
| 259 | "@context": "https://schema.org", |
| 260 | "@type": "BlogPosting", |
| 261 | "headline": "[Localized title]", |
| 262 | "description": "[Localized description]", |
| 263 | "inLanguage": "[lang-code]", |
| 264 | "isPartOf": { "@type": "Blog", "inLanguage": "[lang-code]" }, |
| 265 | "translationOfWork": { |
| 266 | "@type": "BlogPosting", |
| 267 | "inLanguage": "[source-lang]", |
| 268 | "url": "[source-url]" |
| 269 | } |
| 270 | } |
| 271 | |
| 272 | |
| 273 | Use the existing `/blog schema` sub-skill for richer schema on each version. |
| 274 | Keep Article/BlogPosting, Person, Organization, and BreadcrumbList as the |
| 275 | priority stack. FAQPage is optional and only for visible FAQ content as an |
| 276 | entity and AI-citation signal, not a Google rich result target. |
| 277 | |
| 278 | ### Phase 6: Delivery Summary |
| 279 | |
| 280 | |
| 281 | ## Multilingual blog complete: [Title] |
| 282 | |
| 283 | ### Original |
| 284 | - Language: [source] |
| 285 | - File: multilingual/{source}/{slug}.{ext} |
| 286 | |
| 287 | ### Translations |
| 288 | | Language | File | Localized | Keywords adapted | |
| 289 | |----------|------|-----------|------------------| |
| 290 | | de | multilingual/de/{slug}.md | yes | [N] | |
| 291 | | fr | multilingual/fr/{slug}.md | yes | [N] | |
| 292 | | es | multilingual/es/{slug}.md | yes | [N] | |
| 293 | |
| 294 | ### International SEO assets |
| 295 | - multilingual/hreflang-tags.html |
| 296 | - multilingual/hreflang-sitemap.xml |
| 297 | - multilingual/hreflang-map.json |
| 298 | - Localized Article schema embedded per version |
| 299 | |
| 300 | ### Total |
| 301 | - [N] posts in [N] languages |
| 302 | - [N] SEO assets generated |
| 303 | |
| 304 | ### Next steps |
| 305 | - Replace `{source-url}`, `{lang-1-url}`, `{lang-2-url}`, and |
| 306 | `{fallback-url}` placeholders in hreflang tags with real absolute HTTPS |
| 307 | URLs. |
| 308 | - Merge `hreflang-sitemap.xml` into your existing sitemap. |
| 309 | - Run `/blog locale-audit multilingual/` to verify completeness. |
| 310 | - Resolve `[INTERNAL-LINK]` placeholders with locale-specific URLs. |
| 311 | - If claude-seo is installed, run `/seo hreflang multilingual/` for |
| 312 | deeper validation. |
| 313 | |
| 314 | |
| 315 | ## Cross-References |
| 316 | |
| 317 | | When | Run | |
| 318 | |------|-----| |
| 319 | | To regenerate or reword the source | `/blog write <topic>` | |
| 320 | | To translate one existing file only | `/blog translate <file> --to <codes>` | |
| 321 | | To deepen cultural fit on one file | `/blog localize <file> --locale <code>` | |
| 322 | | To audit a multilingual directory | `/blog locale-audit <directory>` | |
| 323 | | For deeper hreflang validation | `/seo hreflang <directory>` (claude-seo, optional) | |
| 324 | |
| 325 | ## Error Handling |
| 326 | |
| 327 | | Scenario | Action | |
| 328 | |----------|--------| |
| 329 | | `blog-write` missing | Error: "This skill requires `blog-write`. Reinstall claude-blog." | |
| 330 | | One translation fails | Complete the rest, report partial results, suggest a retry command | |
| 331 | | Source language equals a target | Skip that target, log a notice | |
| 332 | | 10 or more target languages | Stop before writing. Explain scaled-content-abuse risk and require reviewed batches of at most 9 target languages | |
| 333 | | `seo-hreflang` not installed | Use the self-contained generator, note it in the summary | |
| 334 | |
| 335 | ## Commands Recap |
| 336 | |
| 337 | | Command | Purpose | |
| 338 | |---------|---------| |
| 339 | | `/blog multilingual <topic> --languages de,fr,es` | Write source, translate, localize, emit hreflang assets | |
| 340 | | `/blog translate <file> --to de,fr,es` | Translate one file into target languages | |
| 341 | | `/blog localize <file> --locale de-DE` | Cultural deep-adaptation of one translated file | |
| 342 | | `/blog locale-audit <directory>` | Multilingual QA across a directory | |
| 343 |