{"id":"8452c804-f0db-49b1-b607-82528c7abbee","shortId":"3pjEaW","kind":"skill","title":"blog-locale-audit","tagline":"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 comm","description":"# Blog Locale Audit, Multilingual Quality Control\n\nAudits a directory of multilingual blog content to ensure every language\nversion is complete, consistent, correctly tagged, and SEO-optimized.\nCatches international content issues before they hurt rankings.\n\n> Adapted from `claude-blog-multilingual` by Chris Mueller (Pro Hub Challenge,\n> March 2026). Original: https://github.com/Chriss54/multilingual-int\n\n## Workflow\n\n### Phase 1: Discovery\n\n1. Scan the target directory. Group blog posts by language using:\n   - Subdirectory names (`en/`, `de/`, `fr/`).\n   - Frontmatter `lang` and `translatedFrom` fields.\n   - `hreflang-map.json` if present.\n2. Build a content matrix mapping which post exists in which languages.\n3. Detect the source language (most common `translatedFrom` target, or the\n   `sourceLanguage` field in `hreflang-map.json` if present).\n\n### Phase 2: Completeness Audit\n\nShow which translations are missing:\n\n```\n### Translation coverage matrix\n\n| Post (EN) | DE | FR | ES | JA |\n|-----------|----|----|----|----|\n| how-to-avoid-ai-slop | ok | ok | missing | missing |\n| content-marketing-2026 | ok | missing | ok | missing |\n\nCoverage: 60% (6 of 10 expected translations present)\nMissing: 4 translations needed\n```\n\n### Phase 3: Content Parity Audit\n\nFor every post that exists in multiple languages:\n\n| Check | What | Severity |\n|-------|------|----------|\n| Section count | Same number of H2 and H3 sections | Critical |\n| FAQ count | Same number of FAQ items | High |\n| Image count | Same number of images | High |\n| Chart count | Same number of charts (SVG figures) | High |\n| Word count ratio | Within expected band for language pair (DE +20% to +30%, JA -20%, ES +10%) | Medium |\n| Link count | Similar internal and external link counts | Medium |\n| Citation capsule count | Same number per H2 across versions | Medium |\n| Frontmatter parity | All required fields present per version | High |\n\nFlag every significant deviation as an issue.\n\n### Phase 4: SEO Parity Audit\n\nFor every language version verify:\n\n| Element | Check | Severity |\n|---------|-------|----------|\n| Title tag | Present, correct length for the language | Critical |\n| Meta description | Present, correct length, contains a stat | Critical |\n| `lang` attribute or frontmatter `lang` | Present, valid ISO 639-1 | Critical |\n| Schema `inLanguage` | Matches `lang` | High |\n| Schema `translationOfWork` | Points to the source URL | High |\n| Alt text | Translated (no English alt in non-EN posts) | High |\n| Slug | Localized (no English slug in non-EN posts) | Medium |\n| Tags | Localized | Medium |\n| Keywords | Localized | Medium |\n\n### Phase 5: Hreflang Audit\n\nIf `hreflang-tags.html`, `hreflang-sitemap.xml`, or `hreflang-map.json`\nexists in the directory:\n\n| Check | What | Severity |\n|-------|------|----------|\n| Self-referencing | Each page references itself | Critical |\n| Return tags | Every relationship is bidirectional | Critical |\n| `x-default` | Present, points to source language | Critical |\n| Language codes | Valid ISO 639-1 (with optional region) | High |\n| URL consistency | Same protocol, same trailing-slash convention | Medium |\n| Completeness | Every language version represented | High |\n\nIf no hreflang files exist, report it as a critical gap and offer:\n\"Run `/blog multilingual <topic> --languages ...` to regenerate, or create\nhreflang-tags.html manually.\"\n\nIf `seo-hreflang` from claude-seo is installed, suggest running it for\ndeeper validation.\n\n### Phase 6: Freshness Audit\n\nFor posts with `translatedDate` in frontmatter:\n\n| Check | What | Severity |\n|-------|------|----------|\n| Source updated after translation | Source modified after `translatedDate` | Critical |\n| Translation older than 90 days | May need refresh | Medium |\n| `lastUpdated` mismatch across versions | Versions out of sync | Medium |\n| File mtime newer than `translatedDate` | Content changed without frontmatter update | Warning |\n\nEmit actionable commands per stale file:\n\n```\n3 translations are stale:\n- de/ki-trends-2026.md (source updated 2 days ago)\n  -> Run: /blog translate en/ai-trends-2026.md --to de\n- fr/ki-trends-2026.md (source updated 2 days ago)\n  -> Run: /blog translate en/ai-trends-2026.md --to fr\n- es/tendencias-ia-2026.md (translation > 90 days old)\n  -> Run: /blog translate en/ai-trends-2026.md --to es\n```\n\n### Phase 7: Report\n\nOutput as markdown by default. If the user passes `--html`, also write the\nreport to `locale-audit-report.html` with the same content.\n\n```\n## Multilingual content audit report\n\n### Summary\n- Posts audited: [N] across [N] languages\n- Overall health: [score] / 100\n- Critical issues: [N]\n- Warnings: [N]\n\n### Translation coverage\n[Matrix from Phase 2]\n\n### Issues found\n#### Critical\n- [Issue with file references]\n\n#### Warnings\n- [Issue with file references]\n\n#### Passed\n- [Checks that passed]\n\n### Prioritized fixes\n1. [Highest-impact action]\n2. [...]\n\n### Stale-translation alerts\n[Runnable commands from Phase 6]\n\n### Quick fixes\n- Run `/blog translate <file> --to <missing-langs>` for [N] missing translations.\n- Run `/blog multilingual` to regenerate hreflang assets.\n- Run `/blog localize <file> --locale <code>` for weak cultural adaptations.\n```\n\n## Error Handling\n\n| Scenario | Action |\n|----------|--------|\n| Empty directory | \"No blog posts found in [path]\" |\n| Only one language present | Report coverage, suggest target languages |\n| No hreflang files | Flag as critical gap, offer regeneration |\n| Unrecognized file format | Skip with a warning |\n\n## Cross-References\n\n- Fill missing translations: `/blog translate <file> --to <missing-codes>`\n- Deepen weak adaptations: `/blog localize <file> --locale <code>`\n- Regenerate hreflang assets: `/blog multilingual <topic> --languages <codes>`","tags":["blog","locale","audit","claude","agricidaniel","agent-skills","ai-citations","ai-content","ai-marketing","ai-marketing-hub","blog-writing","claude-code"],"capabilities":["skill","source-agricidaniel","skill-blog-locale-audit","topic-agent-skills","topic-ai-citations","topic-ai-content","topic-ai-marketing","topic-ai-marketing-hub","topic-blog","topic-blog-writing","topic-claude-code","topic-claude-code-skill","topic-claude-plugin","topic-claude-skill","topic-content-creation"],"categories":["claude-blog"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AgriciDaniel/claude-blog/blog-locale-audit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AgriciDaniel/claude-blog","source_repo":"https://github.com/AgriciDaniel/claude-blog","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 753 github stars · SKILL.md body (5,761 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:30.467Z","embedding":null,"createdAt":"2026-05-18T12:54:53.375Z","updatedAt":"2026-05-18T18:53:30.467Z","lastSeenAt":"2026-05-18T18:53:30.467Z","tsv":"'+10':268 '+20':262 '+30':264 '-1':345,434 '-20':266 '/blog':469,562,574,585,675,683,690,740,746,752 '/chriss54/multilingual-int':96 '1':99,101,657 '10':194 '100':627 '2':125,155,558,570,638,662 '2026':92,185 '3':137,203,551 '4':199,306 '5':390 '6':192,495,671 '60':191 '639':344,433 '7':591 '90':519,581 'across':286,527,621 'action':546,661,700 'adapt':79,696,745 'ago':560,572 'ai':176 'alert':666 'also':603 'alt':360,365 'asset':688,751 'attribut':337 'audit':4,5,46,50,157,206,309,392,497,615,619 'avoid':175 'band':257 'bidirect':418 'blog':2,10,44,55,83,107,704 'blog-locale-audit':1 'build':23,126 'capsul':280 'catch':71 'challeng':90 'chang':540 'chart':243,248 'check':215,316,402,504,652 'chris':86 'citat':279 'claud':82,484 'claude-blog-multilingu':81 'claude-seo':483 'code':430 'comm':43 'command':547,668 'common':143 'complet':13,63,156,449 'consist':14,64,440 'contain':332 'content':11,56,73,128,183,204,539,612,614 'content-market':182 'control':49 'convent':447 'correct':16,65,321,330 'count':219,229,237,244,253,271,277,281 'coverag':26,164,190,634,714 'creat':475 'critic':227,326,335,346,412,419,428,464,515,628,641,723 'cross':735 'cross-refer':734 'cultur':695 'day':520,559,571,582 'de':115,168,261,566 'de/ki-trends-2026.md':555 'deepen':743 'deeper':492 'default':422,597 'descript':328 'detect':138 'deviat':301 'directori':7,52,105,401,702 'discoveri':100 'element':315 'emit':36,545 'empti':701 'en':114,167,369,380 'en/ai-trends-2026.md':564,576,587 'english':364,375 'ensur':58 'error':697 'es':170,267,589 'es/tendencias-ia-2026.md':579 'everi':59,208,299,311,415,450 'exist':133,211,398,459 'expect':195,256 'extern':275 'faq':228,233 'field':121,149,293 'figur':250 'file':458,534,550,644,649,720,728 'fill':737 'fix':42,656,673 'flag':28,298,721 'format':729 'found':640,706 'fr':116,169,578 'fr/ki-trends-2026.md':567 'fresh':22,496 'frontmatt':117,289,339,503,542 'gap':465,724 'github.com':95 'github.com/chriss54/multilingual-int':94 'group':106 'h2':223,285 'h3':225 'handl':698 'health':625 'high':235,242,251,297,351,359,371,438,454 'highest':659 'highest-impact':658 'how-to-avoid-ai-slop':172 'hreflang':15,32,391,457,481,687,719,750 'hreflang-map.json':122,151,397 'hreflang-sitemap.xml':395 'hreflang-tags.html':394,476 'html':602 'hub':89 'hurt':77 'imag':236,241 'impact':660 'inlanguag':348 'instal':487 'intern':72,273 'iso':343,432 'issu':74,304,629,639,642,647 'item':234 'ja':171,265 'keyword':386 'lang':118,336,340,350 'languag':60,110,136,141,214,259,312,325,427,429,451,471,623,711,717,754 'lastupd':525 'length':322,331 'link':270,276 'local':3,45,373,384,387,691,692,747,748 'locale-audit-report.html':608 'manual':477 'map':130 'march':91 'markdown':595 'market':184 'match':349 'matrix':27,129,165,635 'may':521 'medium':269,278,288,382,385,388,448,524,533 'meta':18,327 'meta-tag':17 'mismatch':526 'miss':162,180,181,187,189,198,680,738 'modifi':512 'mtime':535 'mueller':87 'multilingu':9,47,54,84,470,613,684,753 'multipl':213 'n':620,622,630,632,679 'name':113 'need':201,522 'newer':536 'non':368,379 'non-en':367,378 'number':221,231,239,246,283 'offer':467,725 'ok':178,179,186,188 'old':583 'older':517 'one':710 'optim':70 'option':436 'origin':93 'output':593 'overal':624 'page':409 'pair':260 'pariti':20,205,290,308 'pass':601,651,654 'path':708 'per':284,295,548 'phase':98,154,202,305,389,494,590,637,670 'point':354,424 'post':108,132,166,209,370,381,499,618,705 'present':124,153,197,294,320,329,341,423,712 'priorit':38,655 'pro':88 'protocol':442 'qualiti':48 'quick':672 'rank':78 'ratio':254 'refer':410,645,650,736 'referenc':407 'refresh':523 'regener':473,686,726,749 'region':437 'relationship':416 'report':39,460,592,606,616,713 'repres':453 'requir':292 'return':413 'run':468,489,561,573,584,674,682,689 'runnabl':41,667 'scan':102 'scenario':699 'schema':34,347,352 'score':626 'section':218,226 'self':406 'self-referenc':405 'seo':69,307,480,485 'seo-hreflang':479 'seo-optim':68 'sever':217,317,404,506 'show':158 'signific':300 'similar':272 'skill' 'skill-blog-locale-audit' 'skip':730 'slash':446 'slop':177 'slug':372,376 'sourc':140,357,426,507,511,556,568 'source-agricidaniel' 'sourcelanguag':148 'stale':29,549,554,664 'stale-transl':663 'stat':334 'subdirectori':112 'suggest':488,715 'summari':617 'svg':249 'sync':532 'tag':19,66,319,383,414 'target':104,145,716 'text':361 'titl':318 'topic-agent-skills' 'topic-ai-citations' 'topic-ai-content' 'topic-ai-marketing' 'topic-ai-marketing-hub' 'topic-blog' 'topic-blog-writing' 'topic-claude-code' 'topic-claude-code-skill' 'topic-claude-plugin' 'topic-claude-skill' 'topic-content-creation' 'trail':445 'trailing-slash':444 'translat':25,30,160,163,196,200,362,510,516,552,563,575,580,586,633,665,676,681,739,741 'translatedd':501,514,538 'translatedfrom':120,144 'translationofwork':353 'unrecogn':727 'updat':508,543,557,569 'url':358,439 'use':111 'user':600 'valid':31,342,431,493 'verifi':314 'version':61,287,296,313,452,528,529 'warn':544,631,646,733 'weak':694,744 'within':255 'without':541 'word':252 'workflow':97 'write':604 'x':421 'x-default':420","prices":[{"id":"a7fafb6b-f1b8-4348-89c7-6851e11aaf4e","listingId":"8452c804-f0db-49b1-b607-82528c7abbee","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AgriciDaniel","category":"claude-blog","install_from":"skills.sh"},"createdAt":"2026-05-18T12:54:53.375Z"}],"sources":[{"listingId":"8452c804-f0db-49b1-b607-82528c7abbee","source":"github","sourceId":"AgriciDaniel/claude-blog/blog-locale-audit","sourceUrl":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-locale-audit","isPrimary":false,"firstSeenAt":"2026-05-18T12:54:53.375Z","lastSeenAt":"2026-05-18T18:53:30.467Z"}],"details":{"listingId":"8452c804-f0db-49b1-b607-82528c7abbee","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AgriciDaniel","slug":"blog-locale-audit","github":{"repo":"AgriciDaniel/claude-blog","stars":753,"topics":["agent-skills","ai","ai-citations","ai-content","ai-marketing","ai-marketing-hub","blog","blog-writing","claude-code","claude-code-skill","claude-plugin","claude-skill","content-creation","content-optimization","content-strategy","eeat","geo","multilingual","open-source","seo"],"license":"mit","html_url":"https://github.com/AgriciDaniel/claude-blog","pushed_at":"2026-05-15T04:45:18Z","description":"Claude Code blog skill suite: 30 sub-skills, 5 agents, 5-gate v1.9.0 Blog Delivery Contract, dual-optimized for Google rankings and AI citations. Active development at AI-Marketing-Hub/claude-blog (AI Marketing Hub Pro community); public releases ship here.","skill_md_sha":"728c443dfddb44e986e9bed5d6bd431e7654439d","skill_md_path":"skills/blog-locale-audit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-locale-audit"},"layout":"multi","source":"github","category":"claude-blog","frontmatter":{"name":"blog-locale-audit","license":"MIT","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\".","compatibility":"Standalone within claude-blog. Optional richer hreflang validation via claude-seo seo-hreflang."},"skills_sh_url":"https://skills.sh/AgriciDaniel/claude-blog/blog-locale-audit"},"updatedAt":"2026-05-18T18:53:30.467Z"}}