[{"data":1,"prerenderedAt":1141},["ShallowReactive",2],{"navigation_docs":3,"-ci-cd-github-actions":357,"-ci-cd-github-actions-surround":1138},[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},"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},"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},"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":160,"body":359,"description":398,"extension":1132,"links":1133,"meta":1134,"navigation":423,"path":161,"seo":1135,"stem":162,"__hash__":1137},"docs\u002F7.ci-cd\u002F1.github-actions.md",{"type":360,"value":361,"toc":1124},"minimark",[362,386,391,622,625,684,691,695,698,829,843,847,857,938,945,955,962,966,973,1072,1081,1090,1094,1103,1107,1120],[363,364,365,366,370,371,377,378,381,382,385],"p",{},"The action is a composite action: it installs ",[367,368,369],"code",{},"@the-i18n-kit\u002Fcli"," on the runner,\nruns ",[372,373,374],"a",{"href":247},[367,375,376],{},"the-i18n-cli translate",", and opens a pull\nrequest with whatever the run wrote. Every input and output is generated from\n",[367,379,380],{},"action.yml"," in the ",[372,383,384],{"href":341},"action reference",".",[387,388,390],"h2",{"id":389},"a-minimal-workflow","A Minimal Workflow",[392,393,399],"pre",{"className":394,"code":395,"filename":396,"language":397,"meta":398,"style":398},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: i18n\n\non:\n  pull_request:\n    paths:\n      - 'i18n\u002Flocales\u002Fen.json'\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  translate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - uses: fabkho\u002Fthe-i18n-kit@main\n        with:\n          provider: google\n          model: gemini-2.5-flash\n          api_key: ${{ secrets.GEMINI_API_KEY }}\n          layer: common\n",".github\u002Fworkflows\u002Fi18n.yml","yaml","",[367,400,401,418,425,435,443,451,466,471,479,490,500,505,513,521,532,540,553,558,570,578,589,600,611],{"__ignoreMap":398},[402,403,406,410,414],"span",{"class":404,"line":405},"line",1,[402,407,409],{"class":408},"swJcz","name",[402,411,413],{"class":412},"sMK4o",":",[402,415,417],{"class":416},"sfazB"," i18n\n",[402,419,421],{"class":404,"line":420},2,[402,422,424],{"emptyLinePlaceholder":423},true,"\n",[402,426,428,432],{"class":404,"line":427},3,[402,429,431],{"class":430},"sfNiH","on",[402,433,434],{"class":412},":\n",[402,436,438,441],{"class":404,"line":437},4,[402,439,440],{"class":408},"  pull_request",[402,442,434],{"class":412},[402,444,446,449],{"class":404,"line":445},5,[402,447,448],{"class":408},"    paths",[402,450,434],{"class":412},[402,452,454,457,460,463],{"class":404,"line":453},6,[402,455,456],{"class":412},"      -",[402,458,459],{"class":412}," '",[402,461,462],{"class":416},"i18n\u002Flocales\u002Fen.json",[402,464,465],{"class":412},"'\n",[402,467,469],{"class":404,"line":468},7,[402,470,424],{"emptyLinePlaceholder":423},[402,472,474,477],{"class":404,"line":473},8,[402,475,476],{"class":408},"permissions",[402,478,434],{"class":412},[402,480,482,485,487],{"class":404,"line":481},9,[402,483,484],{"class":408},"  contents",[402,486,413],{"class":412},[402,488,489],{"class":416}," write\n",[402,491,493,496,498],{"class":404,"line":492},10,[402,494,495],{"class":408},"  pull-requests",[402,497,413],{"class":412},[402,499,489],{"class":416},[402,501,503],{"class":404,"line":502},11,[402,504,424],{"emptyLinePlaceholder":423},[402,506,508,511],{"class":404,"line":507},12,[402,509,510],{"class":408},"jobs",[402,512,434],{"class":412},[402,514,516,519],{"class":404,"line":515},13,[402,517,518],{"class":408},"  translate",[402,520,434],{"class":412},[402,522,524,527,529],{"class":404,"line":523},14,[402,525,526],{"class":408},"    runs-on",[402,528,413],{"class":412},[402,530,531],{"class":416}," ubuntu-latest\n",[402,533,535,538],{"class":404,"line":534},15,[402,536,537],{"class":408},"    steps",[402,539,434],{"class":412},[402,541,543,545,548,550],{"class":404,"line":542},16,[402,544,456],{"class":412},[402,546,547],{"class":408}," uses",[402,549,413],{"class":412},[402,551,552],{"class":416}," actions\u002Fcheckout@v4\n",[402,554,556],{"class":404,"line":555},17,[402,557,424],{"emptyLinePlaceholder":423},[402,559,561,563,565,567],{"class":404,"line":560},18,[402,562,456],{"class":412},[402,564,547],{"class":408},[402,566,413],{"class":412},[402,568,569],{"class":416}," fabkho\u002Fthe-i18n-kit@main\n",[402,571,573,576],{"class":404,"line":572},19,[402,574,575],{"class":408},"        with",[402,577,434],{"class":412},[402,579,581,584,586],{"class":404,"line":580},20,[402,582,583],{"class":408},"          provider",[402,585,413],{"class":412},[402,587,588],{"class":416}," google\n",[402,590,592,595,597],{"class":404,"line":591},21,[402,593,594],{"class":408},"          model",[402,596,413],{"class":412},[402,598,599],{"class":416}," gemini-2.5-flash\n",[402,601,603,606,608],{"class":404,"line":602},22,[402,604,605],{"class":408},"          api_key",[402,607,413],{"class":412},[402,609,610],{"class":416}," ${{ secrets.GEMINI_API_KEY }}\n",[402,612,614,617,619],{"class":404,"line":613},23,[402,615,616],{"class":408},"          layer",[402,618,413],{"class":412},[402,620,621],{"class":416}," common\n",[363,623,624],{},"Three things in that workflow are load-bearing:",[626,627,628,639,659],"ul",{},[629,630,631,638],"li",{},[632,633,634,637],"strong",{},[367,635,636],{},"actions\u002Fcheckout@v4"," first."," The action runs the CLI against the working\ndirectory and commits from it. Without a checkout there is no repository to\nscan and no repository to commit to.",[629,640,641,650,651,654,655,658],{},[632,642,643,646,647,385],{},[367,644,645],{},"contents: write"," and ",[367,648,649],{},"pull-requests: write"," The default ",[367,652,653],{},"GITHUB_TOKEN","\nis read-only in many repositories. The action pushes a branch and calls\n",[367,656,657],{},"gh pr create"," with that token, and both calls need those scopes. Repositories\nand organizations can also disable pull request creation by Actions entirely,\nunder Settings → Actions → General → \"Allow GitHub Actions to create and\napprove pull requests\"; with it off, the pull request step fails however the\ntoken is scoped.",[629,660,661,666,667,670,671,673,674,677,678,680,681,385],{},[632,662,663,385],{},[367,664,665],{},"layer"," The action requires a layer name and always passes ",[367,668,669],{},"--layer"," to\nthe CLI. A ",[632,672,665],{}," is a scoped locale directory together with the code that\nowns it — a Nuxt layer, a workspace package, a shared UI library, or an app in\na monorepo. Run ",[367,675,676],{},"the-i18n-cli status"," locally to see the names your project\nresolves, or read ",[372,679,59],{"href":60},". Projects with one locale\ndirectory usually have one layer named ",[367,682,683],{},"root",[363,685,686,687,690],{},"Pin the action to a tag rather than ",[367,688,689],{},"@main"," once you have a version you trust.",[387,692,694],{"id":693},"what-the-action-runs","What the Action Runs",[363,696,697],{},"Five steps, in order:",[699,700,701,711,744,804,823],"ol",{},[629,702,703,706,707,710],{},[632,704,705],{},"Node.js setup"," via ",[367,708,709],{},"actions\u002Fsetup-node@v4",", pinned to Node 22.",[629,712,713,716,717,720,721,724,725,728,729,732,733,736,737,740,741,385],{},[632,714,715],{},"Install."," ",[367,718,719],{},"npm install -g the-i18n-cli@\u003Ccli_version>"," plus the SDK for the\nchosen provider — ",[367,722,723],{},"openai",", ",[367,726,727],{},"@anthropic-ai\u002Fsdk"," or ",[367,730,731],{},"@google\u002Fgenai",". The SDKs\nare optional peer dependencies of the CLI, so only the one you use gets\ninstalled. An unrecognized ",[367,734,735],{},"provider"," fails here. Set ",[367,738,739],{},"cli_version: skip"," to\nskip this step when a build earlier in the job already put the CLI on the\n",[367,742,743],{},"PATH",[629,745,746,716,749,752,753,756,757,760,761,724,764,728,767,770,771,774,775,724,778,774,781,784,785,774,788,724,791,774,794,797,798,646,801,385],{},[632,747,748],{},"Translate.",[367,750,751],{},"the-i18n-cli translate --json"," in ",[367,754,755],{},"working_directory",", with\n",[367,758,759],{},"api_key"," routed into the provider's own environment variable\n(",[367,762,763],{},"OPENAI_API_KEY",[367,765,766],{},"ANTHROPIC_API_KEY",[367,768,769],{},"GEMINI_API_KEY","). The optional\ninputs map onto flags: ",[367,772,773],{},"locales"," to ",[367,776,777],{},"--targets",[367,779,780],{},"source_locale",[367,782,783],{},"--ref",",\n",[367,786,787],{},"keys",[367,789,790],{},"--keys",[367,792,793],{},"batch_size",[367,795,796],{},"--batch-size",", and the two booleans to\n",[367,799,800],{},"--dry-run",[367,802,803],{},"--fail-on-failed",[629,805,806,809,810,813,814,728,817,813,820,385],{},[632,807,808],{},"Pull request",", unless ",[367,811,812],{},"dry_run"," is ",[367,815,816],{},"true",[367,818,819],{},"create_pr",[367,821,822],{},"false",[629,824,825,828],{},[632,826,827],{},"Gate check",", last, which fails the job if step 3 tripped a gate.",[363,830,831,832,646,835,838,839,385],{},"The step outputs ",[367,833,834],{},"translated_count",[367,836,837],{},"failed_count"," are read out of the JSON\nresult for the log and for downstream steps. They never decide whether the job\npasses — that comes from the CLI's ",[372,840,842],{"href":841},"\u002Freference\u002Fcli#exit-codes","exit code",[387,844,846],{"id":845},"the-pull-request-it-opens","The Pull Request It Opens",[363,848,849,850,853,854,413],{},"The action commits on a new branch and opens the pull request with the ",[367,851,852],{},"gh"," CLI.\nDefaults, all overridable through the ",[372,855,856],{"href":341},"inputs",[858,859,860,873],"table",{},[861,862,863],"thead",{},[864,865,866,870],"tr",{},[867,868,869],"th",{},"Part",[867,871,872],{},"Default",[874,875,876,887,898,908,918,926],"tbody",{},[864,877,878,882],{},[879,880,881],"td",{},"Branch",[879,883,884],{},[367,885,886],{},"i18n\u002Ftranslate-missing-\u003Cunix-timestamp>",[864,888,889,892],{},[879,890,891],{},"Base",[879,893,894,897],{},[367,895,896],{},"base_branch",", else the pull request's base ref, else the branch that triggered the workflow",[864,899,900,903],{},[879,901,902],{},"Commit message",[879,904,905],{},[367,906,907],{},"chore(i18n): translate missing keys via \u003Cprovider>",[864,909,910,913],{},[879,911,912],{},"Title",[879,914,915],{},[367,916,917],{},"chore(i18n): translate missing keys (\u003Clayer>)",[864,919,920,923],{},[879,921,922],{},"Body",[879,924,925],{},"A table naming the provider, the model, the layer and the number of keys translated",[864,927,928,931],{},[879,929,930],{},"Author",[879,932,933,934,937],{},"The workflow actor, with their ",[367,935,936],{},"users.noreply.github.com"," address",[363,939,940,941,944],{},"When the run wrote nothing — every key already translated — the step reports\n\"No translation changes to commit\", leaves the ",[367,942,943],{},"pr_url"," output empty, and exits\n0. No empty pull request is opened.",[946,947,948,949,952,953,385],"warning",{},"The commit stages the whole working directory (",[367,950,951],{},"git add .","), not only locale\nfiles. If an earlier step in the same job builds, formats or otherwise writes to\nthe checkout, those changes land in the translation pull request too. Give the\naction its own job, or its own checkout via ",[367,954,755],{},[363,956,957,958,961],{},"With ",[367,959,960],{},"dry_run: true"," no files are written and no pull request is opened; the run\nreports what it would have translated as a workflow notice.",[387,963,965],{"id":964},"when-the-job-fails","When the Job Fails",[363,967,968,969,972],{},"The CLI reports three outcomes as exit codes, and the action treats them\ndifferently. A ",[632,970,971],{},"gate"," tripping means the run did its job and found something\nyou asked to be told about; a failed run means the tool fell over and its counts\nsay nothing about your project.",[858,974,975,988],{},[861,976,977],{},[864,978,979,982,985],{},[867,980,981],{},"Situation",[867,983,984],{},"Exit",[867,986,987],{},"What the action does",[874,989,990,1001,1015,1035,1046,1058],{},[864,991,992,995,998],{},[879,993,994],{},"Everything translated, no gate requested",[879,996,997],{},"0",[879,999,1000],{},"Opens the pull request, job green",[864,1002,1003,1010,1012],{},[879,1004,1005,1006,1009],{},"Some keys failed, ",[367,1007,1008],{},"fail_on_failed"," off (the default)",[879,1011,997],{},[879,1013,1014],{},"Opens the pull request, emits a warning annotation naming the count, job green",[864,1016,1017,1022,1025],{},[879,1018,1005,1019],{},[367,1020,1021],{},"fail_on_failed: true",[879,1023,1024],{},"2",[879,1026,1027,1028,724,1031,1034],{},"Records ",[367,1029,1030],{},"gate_tripped",[632,1032,1033],{},"still opens the pull request",", then fails the job in the final step",[864,1036,1037,1040,1043],{},[879,1038,1039],{},"Nothing translated at all — unusable API key, unreadable project",[879,1041,1042],{},"1",[879,1044,1045],{},"Fails the translate step immediately, no pull request",[864,1047,1048,1053,1055],{},[879,1049,1050,1051],{},"Unknown ",[367,1052,735],{},[879,1054,1042],{},[879,1056,1057],{},"Fails during install or translate with an error annotation",[864,1059,1060,1066,1069],{},[879,1061,1062,1063,1065],{},"Branch push or ",[367,1064,657],{}," rejected",[879,1067,1068],{},"non-zero",[879,1070,1071],{},"Fails the pull request step — check the token permissions above",[363,1073,1074,1077,1078,1080],{},[632,1075,1076],{},"A tripped gate does not cost you the translations."," The gate is recorded in\nthe ",[367,1079,1030],{}," output, the pull request is opened, and only then does a\nfinal step exit 2.",[363,1082,1083,1086,1087,1089],{},[632,1084,1085],{},"Partial failures are not a gate by default."," A run that wrote 795 keys and\nlost 141 opens the pull request with the 795; the 141 stay missing, so the next\nrun retries them. Set ",[367,1088,1021],{}," when you would rather see that as a\nred job than as a warning in a log nobody reads.",[387,1091,1093],{"id":1092},"inputs-and-outputs","Inputs and Outputs",[363,1095,1096,1097,1099,1100,1102],{},"The full table — every input with its required status and default, and every\noutput — is generated from ",[367,1098,380],{}," and lives in the\n",[372,1101,384],{"href":341},". It is regenerated in CI, so an input\nlisted there is an input the action accepts.",[387,1104,1106],{"id":1105},"next","Next",[626,1108,1109,1114],{},[629,1110,1111,1113],{},[372,1112,164],{"href":165}," for the equivalent on GitLab, including the two\nscanning jobs the action has no counterpart for.",[629,1115,1116,1119],{},[372,1117,1118],{"href":841},"Exit codes and CI gates"," for the full gate list\nacross all commands.",[1121,1122,1123],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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":398,"searchDepth":427,"depth":427,"links":1125},[1126,1127,1128,1129,1130,1131],{"id":389,"depth":420,"text":390},{"id":693,"depth":420,"text":694},{"id":845,"depth":420,"text":846},{"id":964,"depth":420,"text":965},{"id":1092,"depth":420,"text":1093},{"id":1105,"depth":420,"text":1106},"md",null,{},{"description":1136,"title":160},"What the composite action runs, the pull request it opens with the translated files, and which failures turn the job red.","pL3ax0DKdDEH0EN67AdzvpL7bYXl_t_eDz2taI-6aAE",[1139,1140],{"title":150,"path":151,"stem":152,"description":398,"children":-1},{"title":164,"path":165,"stem":166,"description":398,"children":-1},1787604652111]