Skip to content
Content
Skill

/blog-locale-audit

Audit a directory of multilingual blog content for completeness, consistency, hreflang correctness, meta-tag parity, and freshness. Builds a translation coverage matrix, flags stale translations, validates hreflang and schema, and emits a prioritized report with runnable fix

From plugin
claude-blog
1.6k32 skills20 agents
Install
$ npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/blog-locale-audit

Context preview

The summary Claude sees to decide when to auto-load this skill.

Audit a directory of multilingual blog content for completeness, consistency, hreflang correctness, meta-tag parity, and freshness. Builds a translation coverage matrix, flags stale translations, validates hreflang and schema, and emits a prioritized report with runnable fix

SKILL.md

blog-locale-audit.SKILL.md
name: blog-locale-audit
description: >
  Audit a directory of multilingual blog content for completeness, consistency,
  hreflang correctness, meta-tag parity, and freshness. Builds a translation
  coverage matrix, flags stale translations, validates hreflang and schema,
  and emits a prioritized report with runnable fix commands.
  Use when user says "locale audit", "blog locale-audit", "check translations",
  "multilingual audit", "translation check", "hreflang check",
  "Uebersetzungen pruefen".
user-invokable: true
argument-hint: "<directory>"
license: MIT
compatibility: Standalone within claude-blog. Optional richer hreflang validation via claude-seo seo-hreflang.
metadata:
  author: AgriciDaniel
  version: "2.1.1"
  category: blog

Blog Locale Audit, Multilingual Quality Control

Audits a directory of multilingual blog content to ensure every language version is complete, consistent, correctly tagged, and SEO-optimized. Catches international content issues before they hurt rankings.

> Adapted from `claude-blog-multilingual` by Chris Mueller (Pro Hub Challenge, > March 2026). Original: https://github.com/Chriss54/multilingual-int

Workflow

Phase 1: Discovery

1. Resolve the target directory inside the project root/current working directory. Reject symlinked directories and traversal outside the root, then scan blog content and group posts by language using:

  • Subdirectory names (`en/`, `de/`, `fr/`).
  • Frontmatter `lang` and `translatedFrom` fields.
  • `hreflang-map.json` if present.

2. Normalize detected language codes with the shared multilingual locale rules used by `blog-translate`, `blog-localize`, and `blog-multilingual`: ISO 639-1 language in lowercase, optional ISO 15924 script in title case, optional ISO 3166-1 Alpha-2 region in uppercase. Flag ambiguous language-only codes such as `es`, `pt`, and `zh` unless the content declares an explicit neutral mode. 3. Build a content matrix mapping which post exists in which languages. Use a stable translation-group key before comparing slugs: `translationGroupId`, `sourceSlug`, schema `translationOfWork.url`, or the IDs and URLs in `hreflang-map.json`. Fall back to normalized source slug only when no stable key exists. 4. Detect the source language (most common `translatedFrom` target, or the `sourceLanguage` field in `hreflang-map.json` if present).

Phase 2: Completeness Audit

Show which translations are missing:

### Translation coverage matrix

| Post (EN) | DE | FR | ES | JA |
|-----------|----|----|----|----|
| how-to-avoid-ai-slop | ok | ok | missing | missing |
| content-marketing-2026 | ok | missing | ok | missing |

Coverage: 60% (6 of 10 expected translations present)
Missing: 4 translations needed

Phase 3: Content Parity Audit

For every post that exists in multiple languages:

| Check | What | Severity | |-------|------|----------| | Section count | Same number of H2 and H3 sections | Critical | | FAQ count | Same number of FAQ items | High | | Image count | Same number of images | High | | Chart count | Same number of charts (SVG figures) | High | | Word count ratio | Within expected band for language pair (DE +20% to +30%, JA -20%, ES +10%) | Medium | | Link count | Similar internal and external link counts | Medium | | Evidence-backed claims | Same supported claims and citations across versions | Medium | | Frontmatter parity | All required fields present per version | High |

Flag every significant deviation as an issue.

Phase 4: SEO Parity Audit

For every language version verify:

| Element | Check | Severity | |---------|-------|----------| | Title tag | Present, localized, clear, and appropriate for the page | Critical | | Meta description | Present, localized, accurate, and consistent with visible content | Critical | | `lang` attribute or frontmatter `lang` | Present, valid Google-compatible hreflang or BCP 47 language tag | Critical | | Canonical URL | Points to the same-language page, not the source-language page or x-default | Critical | | Schema `inLanguage` | Matches `lang` | High | | Schema `translationOfWork` | Points to the source URL | High | | Alt text | Translated (no English alt in non-EN posts) | High | | Slug | Localized (no English slug in non-EN posts) | Medium | | Tags | Localized | Medium | | Keywords | Localized | Medium |

Phase 5: Hreflang Audit

If `hreflang-tags.html`, `hreflang-sitemap.xml`, or `hreflang-map.json` exists in the directory:

| Check | What | Severity | |-------|------|----------| | Self-referencing | Each page references itself | Critical | | Return tags | Every relationship is bidirectional | Critical | | Canonical consistency | Every hreflang page canonicalizes to its same-language URL | Critical | | `x-default` | Present, points to the unmatched-language fallback such as a language selector or default market page | Critical | | Language codes | Valid Google-compatible hreflang tags: ISO 639-1 language plus optional ISO 15924 script or ISO 3166-1 Alpha-2 region | High | | URL consistency | Same protocol, same trailing-slash convention | Medium | | Completeness | Every language version represented | High |

If no hreflang files exist, report it as a critical gap and offer: "Run `/blog multilingual <topic> --languages ...` to regenerate, or create hreflang-tags.html manually."

If `seo-hreflang` from claude-seo is installed, suggest running it for deeper validation.

Phase 6: Freshness Audit

For posts with `translatedDate` in frontmatter:

| Check | What | Severity | |-------|------|----------| | Source updated after translation | Source modified after `translatedDate` | Critical | | Source content drift | Stored source hash or source `dateModified` differs from current source | Critical | | Translation drift | Stored translation hash differs from current localized file | Medium | | Translation older than 90 days | May need refresh | Medium | | `lastUpdated` mismatch across vers

Read more
Ships withclaude-blog

claude-blog is a Claude Code skill suite that writes, optimizes, audits, localizes, and refreshes blog content at scale. Every article is evaluated for Google-aligned usefulness and internal AI citation readiness heuristics.

Get the whole plugin

Other skills on claude-blog.