Blog Multilingual, One-Command International Publishing

One-command multilingual blog creation.

How to use it

  1. Hit Copy the whole skill.
  2. 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.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit AgriciDaniel/claude-blog/skills/blog-multilingual#main ~/.claude/skills/blog-multilingual-2

For 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.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text343 lines
blog-multilingual-2/SKILL.md343 lines13.2 KBpushed 27d agoRawView on GitHub

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-multilingual by 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 original curl | bash installer and credential handling flagged in the audit, integrates as core skills, and uses the shared cultural-adaptation reference under blog-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

  1. Parse arguments. Extract topic, target languages, source, format.
  2. Validate each language code with the shared multilingual locale rules used by blog-translate, blog-localize, and blog-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 as es, pt, and zh.
  3. Detect output format from the project (frontmatter convention, file extensions, framework hints) or use --format.
  4. Resolve source language. If a target language equals --source, drop it from the translation list with a notice.
  5. Create the output directory inside the current working directory:
    multilingual/
      {source-lang}/
      {lang-1}/
      {lang-2}/
      ...
    
    Keep all output inside the project root; do not write outside the cwd.

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, including x-default, is a fully qualified absolute https://... URL.
  • x-default points 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---
2name: blog-multilingual
3description: >
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".
12user-invokable: true
13argument-hint: "<topic> --languages <comma-separated-codes>"
14license: MIT
15compatibility: Requires claude-blog (blog-write). Optional integration with claude-seo (seo-hreflang) for richer hreflang validation.
16metadata:
17 author: AgriciDaniel
18 version: "2.2.0"
19 category: blog
20---
21 
22# Blog Multilingual, One-Command International Publishing
23 
24The flagship multilingual orchestrator. Combines blog writing, translation,
25cultural adaptation, and full international SEO into a single command.
26Produces publication-ready blog posts in every target language with hreflang
27tags, 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 
38Invoked 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 
47If `seo-hreflang` is not installed, the orchestrator emits hreflang tags using
48its own minimal generator (Phase 5 below) and notes the limitation in the
49delivery summary. Hreflang validation in that case is structural only, not the
50deeper 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 
66If `--languages` is missing, ask the user once before running anything:
67"Which languages should the blog be published in? Provide hreflang tags
68separated by commas (e.g., `de,fr,es-MX,ja,pt-BR`). The post will be written
69in `<source>` first, then translated."
70 
71## Workflow
72 
73### Phase 1: Configuration
74 
751. Parse arguments. Extract topic, target languages, source, format.
762. 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`.
823. Detect output format from the project (frontmatter convention, file
83 extensions, framework hints) or use `--format`.
844. Resolve source language. If a target language equals `--source`, drop it
85 from the translation list with a notice.
865. 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 
96Progress: `Phase 1: Configuration complete, [N] languages selected ([codes])`
97 
98### Phase 2: Write Original Blog
99 
100Invoke the `blog-write` sub-skill (route through `/blog write` so all
101existing rules apply: template auto-selection, sourced statistics, citation
102capsules, Article schema priority, FAQPage only as an entity signal when
103visible FAQ content exists, internal-link zones, charts, image embedding). Pass the
104topic and any blog-write parameters surfaced by the user.
105 
106Save the original to `multilingual/{source-lang}/{slug}.{ext}`.
107 
108Progress: `Phase 2: Original written, multilingual/{source-lang}/{slug}.{ext}`
109 
110### Phase 3: Translate to All Target Languages
111 
112For 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 
119Save translations to `multilingual/{lang}/{localized-slug}.{ext}`.
120 
121Progress: `Phase 3: Translating to [lang] ([X]/[N])` per language, then
122`Phase 3: All translations complete`.
123 
124### Phase 4: Cultural Adaptation
125 
126If `--no-localize` is NOT set, invoke `blog-localize` for every translated
127post:
128 
129- Input: the translated blog post.
130- Locale: the target language or region code.
131- Run in parallel.
132 
133Apply the localized output only after resolving the generated path inside
134`multilingual/`, rejecting symlinks, and creating a backup when overwriting.
135The localizer swaps brand examples, adapts CTAs, substitutes legal
136references, and adjusts formality. See
137`../blog-localize/SKILL.md` for the full adaptation pass.
138 
139Progress: `Phase 4: Cultural adaptation complete for [N] languages`.
140 
141### Phase 5: International SEO Generation
142 
143Generate three artifacts plus localized schema. If the `seo-hreflang` skill
144from claude-seo is installed, delegate validation to it. Otherwise use the
145self-contained generator below.
146 
147#### 5a. Hreflang Tags (HTML)
148 
149Copy-paste ready tags for `<head>`:
150 
151```html
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 
159Rules (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 
170Save to `multilingual/hreflang-tags.html`.
171 
172#### 5b. Hreflang Sitemap Fragment
173 
174```xml
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 
202Generate one `<url>` block per locale. Every block must contain the identical
203complete set of `<xhtml:link>` alternates for every locale, plus self and
204optional `x-default`, using fully qualified `https://...` URLs.
205 
206Save to `multilingual/hreflang-sitemap.xml`.
207 
208#### 5c. Hreflang Map (JSON)
209 
210Machine-readable mapping for CMS integration:
211 
212```json
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 
250Save to `multilingual/hreflang-map.json`.
251 
252#### 5d. Localized Article Schema (Required)
253 
254Attach or update Article/BlogPosting JSON-LD on every language version with
255`inLanguage` and `translationOfWork` fields:
256 
257```json
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 
273Use the existing `/blog schema` sub-skill for richer schema on each version.
274Keep Article/BlogPosting, Person, Organization, and BreadcrumbList as the
275priority stack. FAQPage is optional and only for visible FAQ content as an
276entity 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 

Discussion

Alternatives

Also in SEO & keywords