# Blog Locale Audit > Audita un directorio de contenido multilingüe: matriz de cobertura de traducciones, paridad de contenido y de SEO, validación de hreflang, frescura frente al original e informe priorizado con comandos de arreglo ejecutables. Fuente: https://skillsagentes.com/skills/agricidaniel/claude-blog/blog-locale-audit Markdown: https://skillsagentes.com/skills/agricidaniel/claude-blog/blog-locale-audit.md Repositorio: https://github.com/AgriciDaniel/claude-blog Autor: AgriciDaniel Licencia: MIT Actualizado: hace 19 días Coste de contexto: 113 tok instalada, 2.1k tok al activarse, 2.1k tok con todos los archivos del bundle Bundle: 1 archivo, 8 KB Permisos que pide: ninguno declarado ## Instalación Un skill son archivos markdown: los mismos archivos valen para cualquier agente y lo único que cambia es el directorio de destino, es decir la bandera `--agent`. Añade `-g` para instalarlo en todos los proyectos de la máquina. ```bash # Claude Code npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent claude-code # Cursor npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent cursor # Codex npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent codex # Gemini CLI npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent gemini # Windsurf npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent windsurf # Cline npx -y skills add AgriciDaniel/claude-blog --skill blog-locale-audit --agent cline ``` ## Qué hace - Agrupa los posts por idioma usando subdirectorios, los campos `lang` y `translatedFrom` del frontmatter y `hreflang-map.json` - Construye la matriz de cobertura con una clave estable de grupo de traducción, no por slug, y calcula el porcentaje presente - Compara paridad de secciones, FAQ, imágenes, gráficos, enlaces y frontmatter, y marca cada desviación con su severidad - Valida hreflang: autorreferencia, retorno bidireccional, canónica del mismo idioma, `x-default` y códigos compatibles con Google - Detecta traducciones obsoletas comparando hashes y fechas del original y emite el comando `/blog translate` concreto para cada archivo ## Cuándo usarla - El usuario dice "locale audit", "comprobar traducciones", "auditoría multilingüe" o "revisar hreflang" ## Qué la activa - "Audita el directorio translations/" - "¿Qué traducciones se han quedado desfasadas?" ## Antes de instalar - Funciona por sí sola dentro de claude-blog; `seo-hreflang` de claude-seo añade una validación de hreflang más profunda si está instalado. ## Archivos - SKILL.md — 8 KB ## SKILL.md Reproducido tal cual desde AgriciDaniel/claude-blog bajo MIT. Esta sección es el documento original y está en inglés. # 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 --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 versions | Versions out of sync | Medium | | Git or file mtime newer than `translatedDate` | Content changed without frontmatter update | Warning | When available, store and compare `sourceHash`, source `dateModified`, `translationHash`, and Git mtime before relying only on `translatedDate`. Emit actionable commands per stale file: ``` 3 translations are stale: - de/ki-trends-2026.md (source updated 2 days ago) -> Run: /blog translate en/ai-trends-2026.md --to de - fr/ki-trends-2026.md (source updated 2 days ago) -> Run: /blog translate en/ai-trends-2026.md --to fr - es/tendencias-ia-2026.md (translation > 90 days old) -> Run: /blog translate en/ai-trends-2026.md --to es ``` ### Phase 7: Report Output as markdown by default. If the user passes `--html`, also write the report to `locale-audit-report.html` only inside the audited project root. Escape all dynamic filenames, titles, URLs, and issue text with `html.escape(value, quote=True)` before rendering HTML, and reject symlinked or outside-root report paths. ``` ## Multilingual content audit report ### Summary - Posts audited: [N] across [N] languages - Overall health: [score] / 100 - Critical issues: [N] - Warnings: [N] ### Translation coverage [Matrix from Phase 2] ### Issues found #### Critical - [Issue with file references] #### Warnings - [Issue with file references] #### Passed - [Checks that passed] ### Prioritized fixes 1. [Highest-impact action] 2. [...] ### Stale-translation alerts [Runnable commands from Phase 6] ### Quick fixes - Run `/blog translate --to ` for [N] missing translations. - Run `/blog multilingual` to regenerate hreflang assets. - Run `/blog localize --locale ` for weak cultural adaptations. ``` ## Error Handling | Scenario | Action | |----------|--------| | Empty directory | "No blog posts found in [path]" | | Only one language present | Report coverage, suggest target languages | | No hreflang files | Flag as critical gap, offer regeneration | | Unrecognized file format | Skip with a warning | ## Cross-References - Fill missing translations: `/blog translate --to ` - Deepen weak adaptations: `/blog localize --locale ` - Regenerate hreflang assets: `/blog multilingual --languages ` ## Dónde encaja - Categoría: [Testing y QA](https://skillsagentes.com/categorias/testing-qa.md) — Flujos de testing unitario, de integración y end-to-end. - Creador: [AgriciDaniel](https://skillsagentes.com/creators/agricidaniel.md) — 80 skills en el directorio - [Todas las skills](https://skillsagentes.com/skills.md) - [Ranking de instalaciones](https://skillsagentes.com/ranking.md) ## Otras skills del mismo repositorio - [Blog](https://skillsagentes.com/skills/agricidaniel/claude-blog/blog.md): Motor de blog de ciclo completo con 31 subskills, 12 plantillas, puntuación sobre 100 y 5 agentes. Enruta cada petición a la subskill correcta: escribir, reescribir, analizar, auditar, schema, clusters y publicación multilingüe. - [Blog Google](https://skillsagentes.com/skills/agricidaniel/claude-blog/blog-google.md): Integración con las APIs de Google para rendimiento de blog: PageSpeed Insights, CrUX con 25 semanas de histórico, Search Console, URL Inspection, Indexing API, GA4, NLP de entidades, YouTube y Keyword Planner. - [Blog Notebooklm](https://skillsagentes.com/skills/agricidaniel/claude-blog/blog-notebooklm.md): Consulta cuadernos de Google NotebookLM para obtener respuestas ancladas en tus propios documentos y con citas: gestiona la biblioteca de cuadernos, la autenticación con Google y el descubrimiento de contenido. - [Blog Audio](https://skillsagentes.com/skills/agricidaniel/claude-blog/blog-audio.md): Genera narración en audio de posts con Google Gemini TTS: resumen hablado, lectura completa o diálogo tipo pódcast a dos voces, con 30 voces y salida MP3 más el código de inserción HTML5. - [Blog Image](https://skillsagentes.com/skills/agricidaniel/claude-blog/blog-image.md): Generación y edición de imágenes con IA para contenido de blog mediante Gemini por MCP: portadas, ilustraciones, tarjetas sociales y OG, con 6 modos de dominio y retorno silencioso si el MCP no está disponible. --- Skills Agentes · [Índice de páginas en markdown](https://skillsagentes.com/sitemap.md) · [Inicio](https://skillsagentes.com/index.md)