[{"data":1,"prerenderedAt":1118},["ShallowReactive",2],{"navigation_docs":3,"-monorepos-layers":357,"-monorepos-layers-surround":1115},[4,22,40,53,78,107,132,153,167,176,347],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Introduction","\u002Fintroduction","1.introduction",[9,13,17],{"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",{"title":18,"path":19,"stem":20},"Built for Agents","\u002Fintroduction\u002Fbuilt-for-agents","1.introduction\u002F3.built-for-agents",false,{"title":23,"icon":24,"path":25,"stem":26,"children":27,"page":21},"ESLint Plugin","i-lucide-shield-check","\u002Feslint-plugin","10.eslint-plugin",[28,32,36],{"title":29,"path":30,"stem":31},"Install and Presets","\u002Feslint-plugin\u002Finstall","10.eslint-plugin\u002F1.install",{"title":33,"path":34,"stem":35},"The Rules","\u002Feslint-plugin\u002Frules","10.eslint-plugin\u002F2.rules",{"title":37,"path":38,"stem":39},"Layer-Aware Missing Keys","\u002Feslint-plugin\u002Flayer-aware","10.eslint-plugin\u002F3.layer-aware",{"title":41,"path":42,"stem":43,"children":44,"page":21},"Getting Started","\u002Fgetting-started","2.getting-started",[45,49],{"title":46,"path":47,"stem":48},"Set Up the MCP Server","\u002Fgetting-started\u002Fagent-setup","2.getting-started\u002F1.agent-setup",{"title":50,"path":51,"stem":52},"From an Unconfigured Repository to a Gated CI Job","\u002Fgetting-started\u002Fcold-start","2.getting-started\u002F2.cold-start",{"title":54,"path":55,"stem":56,"children":57,"page":21},"Monorepos","\u002Fmonorepos","3.monorepos",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Layers","\u002Fmonorepos\u002Flayers","3.monorepos\u002F1.layers",{"title":63,"path":64,"stem":65},"The Consumer Graph","\u002Fmonorepos\u002Fconsumer-graph","3.monorepos\u002F2.consumer-graph",{"title":67,"path":68,"stem":69},"The Shared Library Scenario","\u002Fmonorepos\u002Fshared-libraries","3.monorepos\u002F3.shared-libraries",{"title":71,"path":72,"stem":73},"Duplicates and Divergence","\u002Fmonorepos\u002Fduplicates-and-divergence","3.monorepos\u002F4.duplicates-and-divergence",{"title":75,"path":76,"stem":77},"Misplaced Usages","\u002Fmonorepos\u002Fmisplaced-usages","3.monorepos\u002F5.misplaced-usages",{"title":79,"path":80,"stem":81,"children":82,"page":21},"Frameworks","\u002Fframeworks","4.frameworks",[83,87,91,95,99,103],{"title":84,"path":85,"stem":86},"Detection","\u002Fframeworks\u002Fdetection","4.frameworks\u002F1.detection",{"title":88,"path":89,"stem":90},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F2.nuxt",{"title":92,"path":93,"stem":94},"Laravel","\u002Fframeworks\u002Flaravel","4.frameworks\u002F3.laravel",{"title":96,"path":97,"stem":98},"Vue","\u002Fframeworks\u002Fvue","4.frameworks\u002F4.vue",{"title":100,"path":101,"stem":102},"React \u002F Next.js","\u002Fframeworks\u002Freact-next","4.frameworks\u002F5.react-next",{"title":104,"path":105,"stem":106},"Generic","\u002Fframeworks\u002Fgeneric","4.frameworks\u002F6.generic",{"title":108,"path":109,"stem":110,"children":111,"page":21},"Configuration","\u002Fconfiguration","5.configuration",[112,116,120,124,128],{"title":113,"path":114,"stem":115},"Where Configuration Lives","\u002Fconfiguration\u002Fwhere-config-lives","5.configuration\u002F1.where-config-lives",{"title":117,"path":118,"stem":119},"Precedence and Conflicts","\u002Fconfiguration\u002Fprecedence","5.configuration\u002F2.precedence",{"title":121,"path":122,"stem":123},"Declared vs. Derived Configuration","\u002Fconfiguration\u002Fdeclared-vs-derived","5.configuration\u002F3.declared-vs-derived",{"title":125,"path":126,"stem":127},"Configuration Fields","\u002Fconfiguration\u002Freference","5.configuration\u002F4.reference",{"title":129,"path":130,"stem":131},"Referring to Locales","\u002Fconfiguration\u002Flocale-refs","5.configuration\u002F5.locale-refs",{"title":133,"path":134,"stem":135,"children":136,"page":21},"Nuxt Module","\u002Fnuxt-module","6.nuxt-module",[137,141,145,149],{"title":138,"path":139,"stem":140},"Install and Setup","\u002Fnuxt-module\u002Finstall","6.nuxt-module\u002F1.install",{"title":142,"path":143,"stem":144},"What It Publishes","\u002Fnuxt-module\u002Fwhat-it-publishes","6.nuxt-module\u002F2.what-it-publishes",{"title":146,"path":147,"stem":148},"What It Validates","\u002Fnuxt-module\u002Fvalidation","6.nuxt-module\u002F3.validation",{"title":150,"path":151,"stem":152},"Options and Limits","\u002Fnuxt-module\u002Foptions-and-limits","6.nuxt-module\u002F4.options-and-limits",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":21},"CI\u002FCD","i-lucide-git-pull-request","\u002Fci-cd","7.ci-cd",[159,163],{"title":160,"path":161,"stem":162},"GitHub Actions","\u002Fci-cd\u002Fgithub-actions","7.ci-cd\u002F1.github-actions",{"title":164,"path":165,"stem":166},"GitLab CI","\u002Fci-cd\u002Fgitlab-ci","7.ci-cd\u002F2.gitlab-ci",{"title":168,"path":169,"stem":170,"children":171,"page":21},"Concepts","\u002Fconcepts","8.concepts",[172],{"title":173,"path":174,"stem":175},"Translation Modes","\u002Fconcepts\u002Ftranslation-modes","8.concepts\u002F1.translation-modes",{"title":177,"path":178,"stem":179,"children":180,"page":-1},"Reference","\u002Freference","9.reference",[181,183,261,339,343],{"title":177,"path":178,"stem":182},"9.reference\u002Findex",{"title":184,"path":185,"stem":186,"children":187,"page":-1},"CLI Commands","\u002Freference\u002Fcli","9.reference\u002F1.cli\u002Findex",[188,189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257],{"title":184,"path":185,"stem":186},{"title":190,"path":191,"stem":192},"add","\u002Freference\u002Fcli\u002Fadd","9.reference\u002F1.cli\u002Fadd",{"title":194,"path":195,"stem":196},"check","\u002Freference\u002Fcli\u002Fcheck","9.reference\u002F1.cli\u002Fcheck",{"title":198,"path":199,"stem":200},"find-duplicates","\u002Freference\u002Fcli\u002Ffind-duplicates","9.reference\u002F1.cli\u002Ffind-duplicates",{"title":202,"path":203,"stem":204},"get","\u002Freference\u002Fcli\u002Fget","9.reference\u002F1.cli\u002Fget",{"title":206,"path":207,"stem":208},"init","\u002Freference\u002Fcli\u002Finit","9.reference\u002F1.cli\u002Finit",{"title":210,"path":211,"stem":212},"missing","\u002Freference\u002Fcli\u002Fmissing","9.reference\u002F1.cli\u002Fmissing",{"title":214,"path":215,"stem":216},"move","\u002Freference\u002Fcli\u002Fmove","9.reference\u002F1.cli\u002Fmove",{"title":218,"path":219,"stem":220},"remove","\u002Freference\u002Fcli\u002Fremove","9.reference\u002F1.cli\u002Fremove",{"title":222,"path":223,"stem":224},"remove-orphans","\u002Freference\u002Fcli\u002Fremove-orphans","9.reference\u002F1.cli\u002Fremove-orphans",{"title":226,"path":227,"stem":228},"rename","\u002Freference\u002Fcli\u002Frename","9.reference\u002F1.cli\u002Frename",{"title":230,"path":231,"stem":232},"scaffold","\u002Freference\u002Fcli\u002Fscaffold","9.reference\u002F1.cli\u002Fscaffold",{"title":234,"path":235,"stem":236},"scan","\u002Freference\u002Fcli\u002Fscan","9.reference\u002F1.cli\u002Fscan",{"title":238,"path":239,"stem":240},"search","\u002Freference\u002Fcli\u002Fsearch","9.reference\u002F1.cli\u002Fsearch",{"title":242,"path":243,"stem":244},"status","\u002Freference\u002Fcli\u002Fstatus","9.reference\u002F1.cli\u002Fstatus",{"title":246,"path":247,"stem":248},"translate","\u002Freference\u002Fcli\u002Ftranslate","9.reference\u002F1.cli\u002Ftranslate",{"title":250,"path":251,"stem":252},"translate-key","\u002Freference\u002Fcli\u002Ftranslate-key","9.reference\u002F1.cli\u002Ftranslate-key",{"title":254,"path":255,"stem":256},"update","\u002Freference\u002Fcli\u002Fupdate","9.reference\u002F1.cli\u002Fupdate",{"title":258,"path":259,"stem":260},"write","\u002Freference\u002Fcli\u002Fwrite","9.reference\u002F1.cli\u002Fwrite",{"title":262,"path":263,"stem":264,"children":265,"page":-1},"MCP Tools","\u002Freference\u002Fmcp","9.reference\u002F2.mcp\u002Findex",[266,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335],{"title":262,"path":263,"stem":264},{"title":268,"path":269,"stem":270},"discover","\u002Freference\u002Fmcp\u002Fdiscover","9.reference\u002F2.mcp\u002Fdiscover",{"title":272,"path":273,"stem":274},"find_duplicate_keys","\u002Freference\u002Fmcp\u002Ffind_duplicate_keys","9.reference\u002F2.mcp\u002Ffind_duplicate_keys",{"title":276,"path":277,"stem":278},"find_empty_translations","\u002Freference\u002Fmcp\u002Ffind_empty_translations","9.reference\u002F2.mcp\u002Ffind_empty_translations",{"title":280,"path":281,"stem":282},"find_orphan_keys","\u002Freference\u002Fmcp\u002Ffind_orphan_keys","9.reference\u002F2.mcp\u002Ffind_orphan_keys",{"title":284,"path":285,"stem":286},"find_undefined_keys","\u002Freference\u002Fmcp\u002Ffind_undefined_keys","9.reference\u002F2.mcp\u002Ffind_undefined_keys",{"title":288,"path":289,"stem":290},"get_missing_translations","\u002Freference\u002Fmcp\u002Fget_missing_translations","9.reference\u002F2.mcp\u002Fget_missing_translations",{"title":292,"path":293,"stem":294},"get_translation_status","\u002Freference\u002Fmcp\u002Fget_translation_status","9.reference\u002F2.mcp\u002Fget_translation_status",{"title":296,"path":297,"stem":298},"get_translations","\u002Freference\u002Fmcp\u002Fget_translations","9.reference\u002F2.mcp\u002Fget_translations",{"title":300,"path":301,"stem":302},"list_namespaces","\u002Freference\u002Fmcp\u002Flist_namespaces","9.reference\u002F2.mcp\u002Flist_namespaces",{"title":304,"path":305,"stem":306},"move_translation_key","\u002Freference\u002Fmcp\u002Fmove_translation_key","9.reference\u002F2.mcp\u002Fmove_translation_key",{"title":308,"path":309,"stem":310},"remove_orphan_keys","\u002Freference\u002Fmcp\u002Fremove_orphan_keys","9.reference\u002F2.mcp\u002Fremove_orphan_keys",{"title":312,"path":313,"stem":314},"remove_translations","\u002Freference\u002Fmcp\u002Fremove_translations","9.reference\u002F2.mcp\u002Fremove_translations",{"title":316,"path":317,"stem":318},"rename_translation_key","\u002Freference\u002Fmcp\u002Frename_translation_key","9.reference\u002F2.mcp\u002Frename_translation_key",{"title":320,"path":321,"stem":322},"scaffold_locale","\u002Freference\u002Fmcp\u002Fscaffold_locale","9.reference\u002F2.mcp\u002Fscaffold_locale",{"title":324,"path":325,"stem":326},"search_translations","\u002Freference\u002Fmcp\u002Fsearch_translations","9.reference\u002F2.mcp\u002Fsearch_translations",{"title":328,"path":329,"stem":330},"translate_key","\u002Freference\u002Fmcp\u002Ftranslate_key","9.reference\u002F2.mcp\u002Ftranslate_key",{"title":332,"path":333,"stem":334},"translate_missing","\u002Freference\u002Fmcp\u002Ftranslate_missing","9.reference\u002F2.mcp\u002Ftranslate_missing",{"title":336,"path":337,"stem":338},"write_translations","\u002Freference\u002Fmcp\u002Fwrite_translations","9.reference\u002F2.mcp\u002Fwrite_translations",{"title":340,"path":341,"stem":342},"GitHub Action","\u002Freference\u002Faction","9.reference\u002F3.action",{"title":344,"path":345,"stem":346},"Programmatic API","\u002Freference\u002Fprogrammatic-api","9.reference\u002F4.programmatic-api",{"title":348,"icon":349,"path":350,"stem":351,"children":352,"page":21},"Extra Topics","i-lucide-microscope","\u002Fextra-topics","91.extra-topics",[353],{"title":354,"path":355,"stem":356},"How Detection Scores Adapters","\u002Fextra-topics\u002Fdetection-scoring","91.extra-topics\u002F1.detection-scoring",{"id":358,"title":59,"body":359,"description":552,"extension":1109,"links":1110,"meta":1111,"navigation":593,"path":60,"seo":1112,"stem":61,"__hash__":1114},"docs\u002F3.monorepos\u002F1.layers.md",{"type":360,"value":361,"toc":1101},"minimark",[362,367,376,408,411,464,469,473,476,542,545,760,763,767,770,786,789,801,810,814,825,835,839,846,1021,1042,1058,1062,1089,1097],[363,364,366],"h2",{"id":365},"what-a-layer-is","What a Layer Is",[368,369,370,371,375],"p",{},"A ",[372,373,374],"strong",{},"layer"," is a scoped locale directory together with the code that owns it. It\nis the unit everything else in this section is built on, and it is not a\nframework-specific idea:",[377,378,379,388,391,394,397],"ul",{},[380,381,382,383,387],"li",{},"a workspace package that ships its own ",[384,385,386],"code",{},"locales\u002F"," folder",[380,389,390],{},"a shared UI library with translations for its own components",[380,392,393],{},"an app in a monorepo, with translations only that app uses",[380,395,396],{},"a Nuxt layer that other Nuxt apps extend",[380,398,399,400,403,404,407],{},"a Laravel ",[384,401,402],{},"lang\u002F"," directory, or a single ",[384,405,406],{},"messages\u002F"," folder in a one-app\nReact or Vue project — one layer, which is the common case",[368,409,410],{},"Every layer the tool resolves has three parts:",[412,413,414,427],"table",{},[415,416,417],"thead",{},[418,419,420,424],"tr",{},[421,422,423],"th",{},"Part",[421,425,426],{},"Means",[428,429,430,441,454],"tbody",{},[418,431,432,438],{},[433,434,435],"td",{},[384,436,437],{},"path",[433,439,440],{},"The locale directory itself — where the JSON or PHP files live",[418,442,443,447],{},[433,444,445],{},[384,446,374],{},[433,448,449,450,453],{},"The layer's name, used by every ",[384,451,452],{},"--layer"," flag and in every report",[418,455,456,461],{},[433,457,458],{},[384,459,460],{},"layerRootDir",[433,462,463],{},"The code root that owns the directory — the subtree scanned for usages of its keys",[368,465,466,468],{},[384,467,460],{}," is what turns a folder of JSON into a layer. It is the reason a\nkey defined in a shared library can be checked against the library's own code\nplus the apps that consume it, rather than against the whole repository.",[363,470,472],{"id":471},"where-layer-names-come-from","Where Layer Names Come From",[368,474,475],{},"Layer names are derived config: read out of the framework's own setup on every\nrun rather than written down twice. What each adapter derives:",[412,477,478,487],{},[415,479,480],{},[418,481,482,485],{},[421,483,484],{},"Framework",[421,486,59],{},[428,488,489,496,507,515,523],{},[418,490,491,493],{},[433,492,88],{},[433,494,495],{},"One layer per entry in Nuxt's resolved layer list that has a locale directory, for every app found. Names come from the directory path relative to the project root",[418,497,498,500],{},[433,499,92],{},[433,501,502,503,506],{},"One layer, named ",[384,504,505],{},"root",", rooted at the project directory",[418,508,509,511],{},[433,510,96],{},[433,512,502,513],{},[384,514,505],{},[418,516,517,519],{},[433,518,100],{},[433,520,502,521],{},[384,522,505],{},[418,524,525,527],{},[433,526,104],{},[433,528,529,530,533,534,537,538,541],{},"One layer per entry in ",[384,531,532],{},"localeDirs",". A string entry is named ",[384,535,536],{},"default","; an object entry ",[384,539,540],{},"{ path, layer }"," carries the name you give it",[368,543,544],{},"So a multi-layer project is derived automatically on Nuxt, and declared by hand\nelsewhere. To split a non-Nuxt monorepo into named layers, list the directories\nyourself:",[546,547,553],"pre",{"className":548,"code":549,"filename":550,"language":551,"meta":552,"style":552},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineI18nKitConfig } from '@the-i18n-kit\u002Fcli\u002Fconfig'\n\nexport default defineI18nKitConfig({\n  defaultLocale: 'en',\n  localeDirs: [\n    { path: 'packages\u002Fui\u002Flocales', layer: 'ui' },\n    { path: 'apps\u002Fcheckout\u002Flocales', layer: 'checkout' },\n    { path: 'apps\u002Fadmin\u002Flocales', layer: 'admin' },\n  ],\n})\n","i18n-kit.config.ts","ts","",[384,554,555,588,595,613,634,645,681,712,743,751],{"__ignoreMap":552},[556,557,560,564,568,572,575,578,581,585],"span",{"class":558,"line":559},"line",1,[556,561,563],{"class":562},"s7zQu","import",[556,565,567],{"class":566},"sMK4o"," {",[556,569,571],{"class":570},"sTEyZ"," defineI18nKitConfig",[556,573,574],{"class":566}," }",[556,576,577],{"class":562}," from",[556,579,580],{"class":566}," '",[556,582,584],{"class":583},"sfazB","@the-i18n-kit\u002Fcli\u002Fconfig",[556,586,587],{"class":566},"'\n",[556,589,591],{"class":558,"line":590},2,[556,592,594],{"emptyLinePlaceholder":593},true,"\n",[556,596,598,601,604,607,610],{"class":558,"line":597},3,[556,599,600],{"class":562},"export",[556,602,603],{"class":562}," default",[556,605,571],{"class":606},"s2Zo4",[556,608,609],{"class":570},"(",[556,611,612],{"class":566},"{\n",[556,614,616,620,623,625,628,631],{"class":558,"line":615},4,[556,617,619],{"class":618},"swJcz","  defaultLocale",[556,621,622],{"class":566},":",[556,624,580],{"class":566},[556,626,627],{"class":583},"en",[556,629,630],{"class":566},"'",[556,632,633],{"class":566},",\n",[556,635,637,640,642],{"class":558,"line":636},5,[556,638,639],{"class":618},"  localeDirs",[556,641,622],{"class":566},[556,643,644],{"class":570}," [\n",[556,646,648,651,654,656,658,661,663,666,669,671,673,676,678],{"class":558,"line":647},6,[556,649,650],{"class":566},"    {",[556,652,653],{"class":618}," path",[556,655,622],{"class":566},[556,657,580],{"class":566},[556,659,660],{"class":583},"packages\u002Fui\u002Flocales",[556,662,630],{"class":566},[556,664,665],{"class":566},",",[556,667,668],{"class":618}," layer",[556,670,622],{"class":566},[556,672,580],{"class":566},[556,674,675],{"class":583},"ui",[556,677,630],{"class":566},[556,679,680],{"class":566}," },\n",[556,682,684,686,688,690,692,695,697,699,701,703,705,708,710],{"class":558,"line":683},7,[556,685,650],{"class":566},[556,687,653],{"class":618},[556,689,622],{"class":566},[556,691,580],{"class":566},[556,693,694],{"class":583},"apps\u002Fcheckout\u002Flocales",[556,696,630],{"class":566},[556,698,665],{"class":566},[556,700,668],{"class":618},[556,702,622],{"class":566},[556,704,580],{"class":566},[556,706,707],{"class":583},"checkout",[556,709,630],{"class":566},[556,711,680],{"class":566},[556,713,715,717,719,721,723,726,728,730,732,734,736,739,741],{"class":558,"line":714},8,[556,716,650],{"class":566},[556,718,653],{"class":618},[556,720,622],{"class":566},[556,722,580],{"class":566},[556,724,725],{"class":583},"apps\u002Fadmin\u002Flocales",[556,727,630],{"class":566},[556,729,665],{"class":566},[556,731,668],{"class":618},[556,733,622],{"class":566},[556,735,580],{"class":566},[556,737,738],{"class":583},"admin",[556,740,630],{"class":566},[556,742,680],{"class":566},[556,744,746,749],{"class":558,"line":745},9,[556,747,748],{"class":570},"  ]",[556,750,633],{"class":566},[556,752,754,757],{"class":558,"line":753},10,[556,755,756],{"class":566},"}",[556,758,759],{"class":570},")\n",[368,761,762],{},"Every path must exist when the tool runs; a missing one is a configuration\nerror rather than an empty layer.",[363,764,766],{"id":765},"inspecting-the-layers-you-have","Inspecting the Layers You Have",[368,768,769],{},"Two commands answer \"what did it actually find\":",[546,771,775],{"className":772,"code":773,"language":774,"meta":552,"style":552},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","the-i18n-cli list-dirs\n","bash",[384,776,777],{"__ignoreMap":552},[556,778,779,783],{"class":558,"line":559},[556,780,782],{"class":781},"sBMFI","the-i18n-cli",[556,784,785],{"class":583}," list-dirs\n",[368,787,788],{},"Lists each locale directory with its layer name, file count and top-level key\nnamespaces — and marks alias entries with the layer they belong to.",[546,790,792],{"className":772,"code":791,"language":774,"meta":552,"style":552},"the-i18n-cli detect\n",[384,793,794],{"__ignoreMap":552},[556,795,796,798],{"class":558,"line":559},[556,797,782],{"class":781},[556,799,800],{"class":583}," detect\n",[368,802,803,804,633,806,809],{},"Prints the whole resolved configuration: locales, default locale, ",[384,805,532],{},[384,807,808],{},"apps"," and the project config that was loaded. This is the input to everything\non the following pages, so when a report surprises you, start here.",[363,811,813],{"id":812},"aliases-two-names-one-directory","Aliases: Two Names, One Directory",[368,815,816,817,820,821,824],{},"In a monorepo the same locale directory is often reachable under more than one\nname — an app extends a package that another app also extends, and each app\nreports the directory in its own terms. The tool deduplicates by real path:\none entry becomes the ",[372,818,819],{},"owner",", the others become aliases carrying ",[384,822,823],{},"aliasOf",".",[368,826,827,828,830,831,834],{},"Aliases are excluded from operations that run over all layers, so a directory\nis never scanned, translated or written twice. Reads resolve through an alias to\nthe owner's files, so ",[384,829,202],{}," and ",[384,832,833],{},"list-dirs"," still answer for the alias name.\nAnything that writes — or that could delete, like orphan removal — rejects an\nalias name with an error naming the source layer to use instead.",[363,836,838],{"id":837},"telling-an-agent-where-keys-belong","Telling an Agent Where Keys Belong",[368,840,841,842,845],{},"Layer names are only half the problem: an agent adding a feature has to pick\none. ",[384,843,844],{},"layerRules"," in the project config is where you write that decision down\nonce, in prose, instead of restating it in every prompt:",[546,847,849],{"className":548,"code":848,"filename":550,"language":551,"meta":552,"style":552},"import { defineI18nKitConfig } from '@the-i18n-kit\u002Fcli\u002Fconfig'\n\nexport default defineI18nKitConfig({\n  layerRules: [\n    {\n      layer: 'ui',\n      description: 'Design-system strings shared by every app',\n      when: 'The string belongs to a component in packages\u002Fui',\n    },\n    {\n      layer: 'checkout',\n      description: 'Checkout-only copy',\n      when: 'The string appears only in apps\u002Fcheckout',\n    },\n  ],\n})\n",[384,850,851,869,873,885,894,899,914,930,946,951,955,970,986,1002,1007,1014],{"__ignoreMap":552},[556,852,853,855,857,859,861,863,865,867],{"class":558,"line":559},[556,854,563],{"class":562},[556,856,567],{"class":566},[556,858,571],{"class":570},[556,860,574],{"class":566},[556,862,577],{"class":562},[556,864,580],{"class":566},[556,866,584],{"class":583},[556,868,587],{"class":566},[556,870,871],{"class":558,"line":590},[556,872,594],{"emptyLinePlaceholder":593},[556,874,875,877,879,881,883],{"class":558,"line":597},[556,876,600],{"class":562},[556,878,603],{"class":562},[556,880,571],{"class":606},[556,882,609],{"class":570},[556,884,612],{"class":566},[556,886,887,890,892],{"class":558,"line":615},[556,888,889],{"class":618},"  layerRules",[556,891,622],{"class":566},[556,893,644],{"class":570},[556,895,896],{"class":558,"line":636},[556,897,898],{"class":566},"    {\n",[556,900,901,904,906,908,910,912],{"class":558,"line":647},[556,902,903],{"class":618},"      layer",[556,905,622],{"class":566},[556,907,580],{"class":566},[556,909,675],{"class":583},[556,911,630],{"class":566},[556,913,633],{"class":566},[556,915,916,919,921,923,926,928],{"class":558,"line":683},[556,917,918],{"class":618},"      description",[556,920,622],{"class":566},[556,922,580],{"class":566},[556,924,925],{"class":583},"Design-system strings shared by every app",[556,927,630],{"class":566},[556,929,633],{"class":566},[556,931,932,935,937,939,942,944],{"class":558,"line":714},[556,933,934],{"class":618},"      when",[556,936,622],{"class":566},[556,938,580],{"class":566},[556,940,941],{"class":583},"The string belongs to a component in packages\u002Fui",[556,943,630],{"class":566},[556,945,633],{"class":566},[556,947,948],{"class":558,"line":745},[556,949,950],{"class":566},"    },\n",[556,952,953],{"class":558,"line":753},[556,954,898],{"class":566},[556,956,958,960,962,964,966,968],{"class":558,"line":957},11,[556,959,903],{"class":618},[556,961,622],{"class":566},[556,963,580],{"class":566},[556,965,707],{"class":583},[556,967,630],{"class":566},[556,969,633],{"class":566},[556,971,973,975,977,979,982,984],{"class":558,"line":972},12,[556,974,918],{"class":618},[556,976,622],{"class":566},[556,978,580],{"class":566},[556,980,981],{"class":583},"Checkout-only copy",[556,983,630],{"class":566},[556,985,633],{"class":566},[556,987,989,991,993,995,998,1000],{"class":558,"line":988},13,[556,990,934],{"class":618},[556,992,622],{"class":566},[556,994,580],{"class":566},[556,996,997],{"class":583},"The string appears only in apps\u002Fcheckout",[556,999,630],{"class":566},[556,1001,633],{"class":566},[556,1003,1005],{"class":558,"line":1004},14,[556,1006,950],{"class":566},[556,1008,1010,1012],{"class":558,"line":1009},15,[556,1011,748],{"class":570},[556,1013,633],{"class":566},[556,1015,1017,1019],{"class":558,"line":1016},16,[556,1018,756],{"class":566},[556,1020,759],{"class":570},[368,1022,1023,1024,1026,1027,1030,1031,1034,1035,1037,1038,1041],{},"Each rule is a ",[384,1025,374],{},", a ",[384,1028,1029],{},"description"," and a ",[384,1032,1033],{},"when",". The rules are handed to\nthe agent in two places: the resolved project config that ",[384,1036,268],{}," returns,\nand the ",[384,1039,1040],{},"add-feature-translations"," prompt, which renders them as a LAYER RULES\nblock and tells the agent to pick a layer from them when the caller did not\nname one.",[1043,1044,1045,1047,1048,1050,1051,1053,1054,1057],"note",{},[384,1046,844],{}," is guidance an agent reads, not routing the tool performs. Writes\nstill name their target layer explicitly — ",[384,1049,336],{}," requires\n",[384,1052,374],{},", and so does ",[384,1055,1056],{},"the-i18n-cli write",". A rule for a layer name that does\nnot exist is not an error; it never matches anything.",[363,1059,1061],{"id":1060},"limits","Limits",[377,1063,1064,1067,1083],{},[380,1065,1066],{},"One layer is one locale directory. A package with two locale directories is\ntwo layers, and there is no grouping above the layer.",[380,1068,1069,1070,1072,1073,1076,1077,1079,1080,1082],{},"Layer names are derived from directory names on every framework except\ngeneric, so renaming a directory renames the layer — and any ",[384,1071,844],{}," or\n",[384,1074,1075],{},"orphanScan"," entry keyed by the old name stops matching. ",[384,1078,1075],{}," warns on\nstderr when a key matches no detected layer; ",[384,1081,844],{}," does not.",[380,1084,1085,1086,1088],{},"A layer with no locale directory (a Nuxt layer that ships code but no\ntranslations) never appears in ",[384,1087,532],{},". It still contributes to the\nconsumer graph, which the next page covers.",[368,1090,1091,1092,1096],{},"Next: ",[1093,1094,1095],"a",{"href":64},"the consumer graph"," — which apps consume\nwhich layers, and why that decides whether a key counts as used.",[1098,1099,1100],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":552,"searchDepth":597,"depth":597,"links":1102},[1103,1104,1105,1106,1107,1108],{"id":365,"depth":590,"text":366},{"id":471,"depth":590,"text":472},{"id":765,"depth":590,"text":766},{"id":812,"depth":590,"text":813},{"id":837,"depth":590,"text":838},{"id":1060,"depth":590,"text":1061},"md",null,{},{"description":1113,"title":59},"What a layer is in the-i18n-kit, where layer names come from in each framework, and how to tell the tool which layer a new key belongs in.","GDHl-xGBhL7UQhXxKEK01jPYfXrJMvsfmzLzvIfRH00",[1116,1117],{"title":50,"path":51,"stem":52,"description":552,"children":-1},{"title":63,"path":64,"stem":65,"description":552,"children":-1},1787604647516]