[{"data":1,"prerenderedAt":751},["ShallowReactive",2],{"navigation_docs":3,"-configuration-precedence-and-locale-refs":302,"-configuration-precedence-and-locale-refs-surround":748},[4,18,32,53,74,103,120,133,147,156],{"title":5,"path":6,"stem":7,"children":8,"page":17},"Introduction","\u002Fintroduction","1.introduction",[9,13],{"title":10,"path":11,"stem":12},"Why the-i18n-kit","\u002Fintroduction\u002Fwhy","1.introduction\u002F1.why",{"title":14,"path":15,"stem":16},"Architecture","\u002Fintroduction\u002Farchitecture","1.introduction\u002F2.architecture",false,{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":17},"ESLint Plugin","i-lucide-shield-check","\u002Feslint-plugin","10.eslint-plugin",[24,28],{"title":25,"path":26,"stem":27},"Install and Rules","\u002Feslint-plugin\u002Finstall-and-rules","10.eslint-plugin\u002F1.install-and-rules",{"title":29,"path":30,"stem":31},"Layer-Aware Missing Keys","\u002Feslint-plugin\u002Flayer-aware","10.eslint-plugin\u002F2.layer-aware",{"title":33,"path":34,"stem":35,"children":36,"page":17},"Getting Started","\u002Fgetting-started","2.getting-started",[37,41,45,49],{"title":38,"path":39,"stem":40},"Set Up the MCP Server","\u002Fgetting-started\u002Fagent-setup","2.getting-started\u002F1.agent-setup",{"title":42,"path":43,"stem":44},"From an Unconfigured Repository to a Translated One","\u002Fgetting-started\u002Fcold-start","2.getting-started\u002F2.cold-start",{"title":46,"path":47,"stem":48},"Agent Contract","\u002Fgetting-started\u002Fagent-contract","2.getting-started\u002F3.agent-contract",{"title":50,"path":51,"stem":52},"Harness Integrations","\u002Fgetting-started\u002Fharness-integrations","2.getting-started\u002F4.harness-integrations",{"title":54,"path":55,"stem":56,"children":57,"page":17},"Monorepos","\u002Fmonorepos","3.monorepos",[58,62,66,70],{"title":59,"path":60,"stem":61},"Layers and the Consumer Graph","\u002Fmonorepos\u002Flayers-and-consumer-graph","3.monorepos\u002F1.layers-and-consumer-graph",{"title":63,"path":64,"stem":65},"Shared Layers and Duplicates","\u002Fmonorepos\u002Fduplicates-and-shared-layers","3.monorepos\u002F2.duplicates-and-shared-layers",{"title":67,"path":68,"stem":69},"Misplaced Usages","\u002Fmonorepos\u002Fmisplaced-usages","3.monorepos\u002F3.misplaced-usages",{"title":71,"path":72,"stem":73},"Orphan Detection","\u002Fmonorepos\u002Forphan-detection","3.monorepos\u002F4.orphan-detection",{"title":75,"path":76,"stem":77,"children":78,"page":17},"Frameworks","\u002Fframeworks","4.frameworks",[79,83,87,91,95,99],{"title":80,"path":81,"stem":82},"Detection","\u002Fframeworks\u002Fdetection","4.frameworks\u002F1.detection",{"title":84,"path":85,"stem":86},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F2.nuxt",{"title":88,"path":89,"stem":90},"Laravel","\u002Fframeworks\u002Flaravel","4.frameworks\u002F3.laravel",{"title":92,"path":93,"stem":94},"Vue","\u002Fframeworks\u002Fvue","4.frameworks\u002F4.vue",{"title":96,"path":97,"stem":98},"React \u002F Next.js","\u002Fframeworks\u002Freact-next","4.frameworks\u002F5.react-next",{"title":100,"path":101,"stem":102},"Generic","\u002Fframeworks\u002Fgeneric","4.frameworks\u002F6.generic",{"title":104,"path":105,"stem":106,"children":107,"page":17},"Configuration","\u002Fconfiguration","5.configuration",[108,112,116],{"title":109,"path":110,"stem":111},"Where Configuration Lives","\u002Fconfiguration\u002Fwhere-config-lives","5.configuration\u002F1.where-config-lives",{"title":113,"path":114,"stem":115},"Precedence and Locale References","\u002Fconfiguration\u002Fprecedence-and-locale-refs","5.configuration\u002F2.precedence-and-locale-refs",{"title":117,"path":118,"stem":119},"Configuration Fields","\u002Fconfiguration\u002Freference","5.configuration\u002F4.reference",{"title":121,"path":122,"stem":123,"children":124,"page":17},"Nuxt Module","\u002Fnuxt-module","6.nuxt-module",[125,129],{"title":126,"path":127,"stem":128},"Install and Setup","\u002Fnuxt-module\u002Finstall","6.nuxt-module\u002F1.install",{"title":130,"path":131,"stem":132},"The Artifact and Options","\u002Fnuxt-module\u002Fartifact-and-options","6.nuxt-module\u002F2.artifact-and-options",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":17},"CI\u002FCD","i-lucide-git-pull-request","\u002Fci-cd","7.ci-cd",[139,143],{"title":140,"path":141,"stem":142},"GitHub Actions","\u002Fci-cd\u002Fgithub-actions","7.ci-cd\u002F1.github-actions",{"title":144,"path":145,"stem":146},"GitLab CI","\u002Fci-cd\u002Fgitlab-ci","7.ci-cd\u002F2.gitlab-ci",{"title":148,"path":149,"stem":150,"children":151,"page":17},"Concepts","\u002Fconcepts","8.concepts",[152],{"title":153,"path":154,"stem":155},"Translation Modes","\u002Fconcepts\u002Ftranslation-modes","8.concepts\u002F1.translation-modes",{"title":157,"path":158,"stem":159,"children":160},"Reference","\u002Freference","9.reference",[161,163,229,294,298],{"title":157,"path":158,"stem":162},"9.reference\u002Findex",{"title":164,"path":165,"stem":166,"children":167},"CLI Commands","\u002Freference\u002Fcli","9.reference\u002F1.cli\u002Findex",[168,169,173,177,181,185,189,193,197,201,205,209,213,217,221,225],{"title":164,"path":165,"stem":166},{"title":170,"path":171,"stem":172},"check","\u002Freference\u002Fcli\u002Fcheck","9.reference\u002F1.cli\u002Fcheck",{"title":174,"path":175,"stem":176},"discover","\u002Freference\u002Fcli\u002Fdiscover","9.reference\u002F1.cli\u002Fdiscover",{"title":178,"path":179,"stem":180},"find-duplicates","\u002Freference\u002Fcli\u002Ffind-duplicates","9.reference\u002F1.cli\u002Ffind-duplicates",{"title":182,"path":183,"stem":184},"get","\u002Freference\u002Fcli\u002Fget","9.reference\u002F1.cli\u002Fget",{"title":186,"path":187,"stem":188},"init","\u002Freference\u002Fcli\u002Finit","9.reference\u002F1.cli\u002Finit",{"title":190,"path":191,"stem":192},"missing","\u002Freference\u002Fcli\u002Fmissing","9.reference\u002F1.cli\u002Fmissing",{"title":194,"path":195,"stem":196},"move","\u002Freference\u002Fcli\u002Fmove","9.reference\u002F1.cli\u002Fmove",{"title":198,"path":199,"stem":200},"orphans","\u002Freference\u002Fcli\u002Forphans","9.reference\u002F1.cli\u002Forphans",{"title":202,"path":203,"stem":204},"remove","\u002Freference\u002Fcli\u002Fremove","9.reference\u002F1.cli\u002Fremove",{"title":206,"path":207,"stem":208},"scaffold","\u002Freference\u002Fcli\u002Fscaffold","9.reference\u002F1.cli\u002Fscaffold",{"title":210,"path":211,"stem":212},"search","\u002Freference\u002Fcli\u002Fsearch","9.reference\u002F1.cli\u002Fsearch",{"title":214,"path":215,"stem":216},"status","\u002Freference\u002Fcli\u002Fstatus","9.reference\u002F1.cli\u002Fstatus",{"title":218,"path":219,"stem":220},"translate","\u002Freference\u002Fcli\u002Ftranslate","9.reference\u002F1.cli\u002Ftranslate",{"title":222,"path":223,"stem":224},"translate-key","\u002Freference\u002Fcli\u002Ftranslate-key","9.reference\u002F1.cli\u002Ftranslate-key",{"title":226,"path":227,"stem":228},"write","\u002Freference\u002Fcli\u002Fwrite","9.reference\u002F1.cli\u002Fwrite",{"title":230,"path":231,"stem":232,"children":233},"MCP Tools","\u002Freference\u002Fmcp","9.reference\u002F2.mcp\u002Findex",[234,235,238,242,246,250,254,258,262,266,270,274,278,282,286,290],{"title":230,"path":231,"stem":232},{"title":174,"path":236,"stem":237},"\u002Freference\u002Fmcp\u002Fdiscover","9.reference\u002F2.mcp\u002Fdiscover",{"title":239,"path":240,"stem":241},"find_duplicate_keys","\u002Freference\u002Fmcp\u002Ffind_duplicate_keys","9.reference\u002F2.mcp\u002Ffind_duplicate_keys",{"title":243,"path":244,"stem":245},"find_orphan_keys","\u002Freference\u002Fmcp\u002Ffind_orphan_keys","9.reference\u002F2.mcp\u002Ffind_orphan_keys",{"title":247,"path":248,"stem":249},"find_undefined_keys","\u002Freference\u002Fmcp\u002Ffind_undefined_keys","9.reference\u002F2.mcp\u002Ffind_undefined_keys",{"title":251,"path":252,"stem":253},"get_missing_translations","\u002Freference\u002Fmcp\u002Fget_missing_translations","9.reference\u002F2.mcp\u002Fget_missing_translations",{"title":255,"path":256,"stem":257},"get_translation_status","\u002Freference\u002Fmcp\u002Fget_translation_status","9.reference\u002F2.mcp\u002Fget_translation_status",{"title":259,"path":260,"stem":261},"get_translations","\u002Freference\u002Fmcp\u002Fget_translations","9.reference\u002F2.mcp\u002Fget_translations",{"title":263,"path":264,"stem":265},"list_namespaces","\u002Freference\u002Fmcp\u002Flist_namespaces","9.reference\u002F2.mcp\u002Flist_namespaces",{"title":267,"path":268,"stem":269},"move_translation_key","\u002Freference\u002Fmcp\u002Fmove_translation_key","9.reference\u002F2.mcp\u002Fmove_translation_key",{"title":271,"path":272,"stem":273},"remove_translations","\u002Freference\u002Fmcp\u002Fremove_translations","9.reference\u002F2.mcp\u002Fremove_translations",{"title":275,"path":276,"stem":277},"scaffold_locale","\u002Freference\u002Fmcp\u002Fscaffold_locale","9.reference\u002F2.mcp\u002Fscaffold_locale",{"title":279,"path":280,"stem":281},"search_translations","\u002Freference\u002Fmcp\u002Fsearch_translations","9.reference\u002F2.mcp\u002Fsearch_translations",{"title":283,"path":284,"stem":285},"translate_key","\u002Freference\u002Fmcp\u002Ftranslate_key","9.reference\u002F2.mcp\u002Ftranslate_key",{"title":287,"path":288,"stem":289},"translate_missing","\u002Freference\u002Fmcp\u002Ftranslate_missing","9.reference\u002F2.mcp\u002Ftranslate_missing",{"title":291,"path":292,"stem":293},"write_translations","\u002Freference\u002Fmcp\u002Fwrite_translations","9.reference\u002F2.mcp\u002Fwrite_translations",{"title":295,"path":296,"stem":297},"GitHub Action","\u002Freference\u002Faction","9.reference\u002F3.action",{"title":299,"path":300,"stem":301},"Programmatic API","\u002Freference\u002Fprogrammatic-api","9.reference\u002F4.programmatic-api",{"id":303,"title":113,"body":304,"description":323,"extension":741,"links":742,"meta":743,"navigation":744,"path":114,"seo":745,"stem":115,"__hash__":747},"docs\u002F5.configuration\u002F2.precedence-and-locale-refs.md",{"type":305,"value":306,"toc":735},"minimark",[307,312,316,327,350,356,360,423,426,451,455,478,482,506,528,531,699,717,731],[308,309,311],"h2",{"id":310},"the-same-key-in-both-files","The Same Key in Both Files",[313,314,315],"p",{},"Declare one key in both config files and the kit stops and names them rather than\npicking a winner:",[317,318,324],"pre",{"className":319,"code":321,"language":322,"meta":323},[320],"language-text"," ERROR  defaultLocale is declared in both\n  \u002Fapp\u002Fi18n-kit.config.ts\n  \u002Fapp\u002F.i18n-mcp.json\nNeither wins — a reader cannot tell which one took effect. Delete the duplicate from one of them.\n","text","",[325,326,321],"code",{"__ignoreMap":323},[313,328,329,330,333,334,337,338,341,342,345,346,349],{},"The command exits ",[325,331,332],{},"1"," without doing any work, and the same message comes back as\nan error object carrying the code ",[325,335,336],{},"CONFIG_ERROR",". Both files may exist: what is\nrejected is the same key in each, ignoring the JSON-only ",[325,339,340],{},"$schema",". ",[325,343,344],{},"glossary"," in\none and ",[325,347,348],{},"protectedLocales"," in the other is fine.",[313,351,352,353,355],{},"The check is per key, not per subkey — ",[325,354,344],{}," in both files is an error even\nwhen the two objects hold different terms. It does not cross directories: a config\nin an app directory means the root one is never read at all.",[308,357,359],{"id":358},"where-precedence-is-resolved","Where Precedence Is Resolved",[361,362,363,376],"table",{},[364,365,366],"thead",{},[367,368,369,373],"tr",{},[370,371,372],"th",{},"Sources",[370,374,375],{},"Winner",[377,378,379,399,407,415],"tbody",{},[367,380,381,396],{},[382,383,384,387,388,391,392,395],"td",{},[325,385,386],{},"--baseUrl"," flag, ",[325,389,390],{},"I18N_BASE_URL",", ",[325,393,394],{},"providerBaseUrl"," in config",[382,397,398],{},"Flag, then environment, then config",[367,400,401,404],{},[382,402,403],{},"Declared config vs. a value read out of a framework's own config file",[382,405,406],{},"Declared",[367,408,409,412],{},[382,410,411],{},"A config in an app directory vs. one in the repository root",[382,413,414],{},"The nearest one, outright",[367,416,417,420],{},[382,418,419],{},"Locale directory probing vs. a directory named in a framework config",[382,421,422],{},"The framework config",[313,424,425],{},"Blank values count as unset in the base URL chain, so an unset shell variable\nexpanding to an empty string does not shadow the config below it.",[313,427,428,432,433,436,437,440,441,391,444,447,448,450],{},[429,430,431],"strong",{},"Declared beats derived."," Where your config and your framework's config both\nhave an opinion, yours wins — declaring ",[325,434,435],{},"defaultLocale"," also removes the last\nfallback, which is a guess about directory order. Nuxt inverts this for the three\nkeys it answers itself: ",[325,438,439],{},"@the-i18n-kit\u002Fnuxt"," rejects ",[325,442,443],{},"locales",[325,445,446],{},"localeDirs"," and\n",[325,449,435],{}," in a hand-written kit config with a build error.",[308,452,454],{"id":453},"when-a-config-cannot-be-read","When a Config Cannot Be Read",[456,457,458,469],"ul",{},[459,460,461,464,465,468],"li",{},[429,462,463],{},"A framework config that cannot be executed is a warning."," The command\ncontinues on directory probing and tells you to declare the value to be sure of\nit. A ",[325,466,467],{},"next.config.js"," wrapped in a plugin that is not installed is the common\ncase in CI.",[459,470,471,474,475,477],{},[429,472,473],{},"A kit config that cannot be loaded fails the command",", naming the file.\nNothing else reads it, so there is no fallback that preserves its meaning. A\nconfig that loads but is invalid — an unknown key, a non-object default export\n— exits ",[325,476,332],{}," rather than proceeding with half of it.",[308,479,481],{"id":480},"referring-to-a-locale","Referring to a Locale",[313,483,484,485,391,488,491,492,494,495,497,498,501,502,505],{},"Anywhere a locale is named — ",[325,486,487],{},"--referenceLocale",[325,489,490],{},"--targetLocales",",\n",[325,493,348],{},", the keys of a write payload — you may use the locale's\n",[429,496,325],{},", its ",[429,499,500],{},"language tag",", or its ",[429,503,504],{},"file name with extension",". They are\ntried in that order.",[313,507,508,511,512,515,516,519,520,523,524,527],{},[429,509,510],{},"Prefer the code."," Codes are unique by construction; language tags are not. Two\nGerman locales can both carry ",[325,513,514],{},"language: \"de-DE\"",", and which one ",[325,517,518],{},"de-DE"," resolves\nto depends on the order of your framework's locale array. A file name needs its\nextension — ",[325,521,522],{},"de-DE-formal.json",", not ",[325,525,526],{},"de-DE-formal",".",[313,529,530],{},"A reference matching nothing is reported, not dropped:",[317,532,536],{"className":533,"code":534,"language":535,"meta":323,"style":323},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"written\": [\"common.save\"],\n  \"filesWritten\": 2,\n  \"unresolvedLocales\": [\n    { \"ref\": \"de-DE-formal\", \"keys\": [\"common.save\"], \"suggestion\": \"Did you mean \\\"de-formal\\\"?\" }\n  ]\n}\n","json",[325,537,538,547,577,595,610,687,693],{"__ignoreMap":323},[539,540,543],"span",{"class":541,"line":542},"line",1,[539,544,546],{"class":545},"sMK4o","{\n",[539,548,550,553,557,560,563,566,568,572,574],{"class":541,"line":549},2,[539,551,552],{"class":545},"  \"",[539,554,556],{"class":555},"spNyl","written",[539,558,559],{"class":545},"\"",[539,561,562],{"class":545},":",[539,564,565],{"class":545}," [",[539,567,559],{"class":545},[539,569,571],{"class":570},"sfazB","common.save",[539,573,559],{"class":545},[539,575,576],{"class":545},"],\n",[539,578,580,582,585,587,589,593],{"class":541,"line":579},3,[539,581,552],{"class":545},[539,583,584],{"class":555},"filesWritten",[539,586,559],{"class":545},[539,588,562],{"class":545},[539,590,592],{"class":591},"sbssI"," 2",[539,594,491],{"class":545},[539,596,598,600,603,605,607],{"class":541,"line":597},4,[539,599,552],{"class":545},[539,601,602],{"class":555},"unresolvedLocales",[539,604,559],{"class":545},[539,606,562],{"class":545},[539,608,609],{"class":545}," [\n",[539,611,613,616,619,623,625,627,629,631,633,636,638,641,643,645,647,649,651,653,656,658,661,663,665,667,670,674,677,679,682,684],{"class":541,"line":612},5,[539,614,615],{"class":545},"    {",[539,617,618],{"class":545}," \"",[539,620,622],{"class":621},"sBMFI","ref",[539,624,559],{"class":545},[539,626,562],{"class":545},[539,628,618],{"class":545},[539,630,526],{"class":570},[539,632,559],{"class":545},[539,634,635],{"class":545},",",[539,637,618],{"class":545},[539,639,640],{"class":621},"keys",[539,642,559],{"class":545},[539,644,562],{"class":545},[539,646,565],{"class":545},[539,648,559],{"class":545},[539,650,571],{"class":570},[539,652,559],{"class":545},[539,654,655],{"class":545},"],",[539,657,618],{"class":545},[539,659,660],{"class":621},"suggestion",[539,662,559],{"class":545},[539,664,562],{"class":545},[539,666,618],{"class":545},[539,668,669],{"class":570},"Did you mean ",[539,671,673],{"class":672},"sTEyZ","\\\"",[539,675,676],{"class":570},"de-formal",[539,678,673],{"class":672},[539,680,681],{"class":570},"?",[539,683,559],{"class":545},[539,685,686],{"class":545}," }\n",[539,688,690],{"class":541,"line":689},6,[539,691,692],{"class":545},"  ]\n",[539,694,696],{"class":541,"line":695},7,[539,697,698],{"class":545},"}\n",[313,700,701,706,707,709,710,712,713,716],{},[429,702,703,705],{},[325,704,602],{}," is the only reliable signal that a write did less than you\nasked."," The key still appears in ",[325,708,556],{},", because the other locales succeeded,\nand ",[325,711,584],{}," is short by one. A reference matching several locales is\nreported under ",[325,714,715],{},"ambiguousLocales",". Both fields are absent when every reference\nresolves uniquely.",[718,719,720,721,723,724,728,729,527],"warning",{},"A ",[325,722,348],{}," entry that resolves to nothing protects nothing, and the run\nthat machine-translates the locale you meant to protect looks exactly like a\nsuccessful one. On Nuxt, ",[725,726,727],"a",{"href":131},"the module"," fails the\nbuild on that; elsewhere, check the codes in ",[325,730,174],{},[732,733,734],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":323,"searchDepth":579,"depth":579,"links":736},[737,738,739,740],{"id":310,"depth":549,"text":311},{"id":358,"depth":549,"text":359},{"id":453,"depth":549,"text":454},{"id":480,"depth":549,"text":481},"md",null,{},true,{"description":746,"title":113},"A key declared in two places is an error naming both, where the kit does resolve precedence, and how a locale reference is matched and reported.","FbCJZFTtJyBxT72lU1WWjCQBW6b4VVD79hiaT_tBFKY",[749,750],{"title":109,"path":110,"stem":111,"description":323,"children":-1},{"title":117,"path":118,"stem":119,"description":323,"children":-1},1789062608879]