[{"data":1,"prerenderedAt":4432},["ShallowReactive",2],{"navigation":3,"v3-navigation":411,"\u002Fnews\u002Fv4.0.0":738,"\u002Fnews\u002Fv4.0.0-surround":4427},[4,130,180,277,298,319,346],{"title":5,"order":6,"path":7,"stem":8,"children":9,"page":129},"Guide",10,"\u002Fguide","guide",[10,14,19,24,29,35,40,45,50,56,61,66,71,76,82,87,93,98,103,109,114,119,124],{"title":11,"path":12,"stem":13,"order":6,"group":11},"Getting started","\u002Fguide\u002Fgetting-started","guide\u002Fgetting-started",{"title":15,"path":16,"stem":17,"order":18,"group":11},"Migrating from @nuxtjs\u002Fi18n","\u002Fguide\u002Fmigration","guide\u002Fmigration",20,{"title":20,"path":21,"stem":22,"order":23,"group":11},"Upgrading","\u002Fguide\u002Fupgrade","guide\u002Fupgrade",30,{"title":25,"path":26,"stem":27,"order":28,"group":11},"FAQ","\u002Fguide\u002Ffaq","guide\u002Ffaq",40,{"title":30,"path":31,"stem":32,"order":33,"group":34},"Translation files","\u002Fguide\u002Ftranslations","guide\u002Ftranslations",50,"Core concepts",{"title":36,"path":37,"stem":38,"order":39,"group":34},"Page config","\u002Fguide\u002Fper-component-translations","guide\u002Fper-component-translations",60,{"title":41,"path":42,"stem":43,"order":44,"group":34},"Runtime overrides","\u002Fguide\u002Fruntime-overrides","guide\u002Fruntime-overrides",70,{"title":46,"path":47,"stem":48,"order":49,"group":34},"Server routes and API","\u002Fguide\u002Fserver-side-translations","guide\u002Fserver-side-translations",80,{"title":51,"path":52,"stem":53,"order":54,"group":55},"Routing strategies","\u002Fguide\u002Fstrategy","guide\u002Fstrategy",90,"Routing",{"title":57,"path":58,"stem":59,"order":60,"group":55},"Locale detection","\u002Fguide\u002Flocale-detection","guide\u002Flocale-detection",100,{"title":62,"path":63,"stem":64,"order":65,"group":55},"Localized paths","\u002Fguide\u002Fcustom-locale-routes","guide\u002Fcustom-locale-routes",110,{"title":67,"path":68,"stem":69,"order":70,"group":55},"Custom locale detection","\u002Fguide\u002Fcustom-auto-detect","guide\u002Fcustom-auto-detect",120,{"title":72,"path":73,"stem":74,"order":75,"group":55},"Excluding paths","\u002Fguide\u002Fexcluding-static-files","guide\u002Fexcluding-static-files",130,{"title":77,"path":78,"stem":79,"order":80,"group":81},"SEO","\u002Fguide\u002Fseo","guide\u002Fseo",140,"SEO and domains",{"title":83,"path":84,"stem":85,"order":86,"group":81},"Layers and domains","\u002Fguide\u002Flayers","guide\u002Flayers",150,{"title":88,"path":89,"stem":90,"order":91,"group":92},"Deployment","\u002Fguide\u002Fdeployment","guide\u002Fdeployment",160,"Production",{"title":94,"path":95,"stem":96,"order":97,"group":92},"Performance tuning","\u002Fguide\u002Fperformance","guide\u002Fperformance",170,{"title":99,"path":100,"stem":101,"order":102,"group":92},"Performance Test Results","\u002Fguide\u002Fperformance-results","guide\u002Fperformance-results",180,{"title":104,"path":105,"stem":106,"order":107,"group":108},"DevTools","\u002Fguide\u002Fdevtools","guide\u002Fdevtools",190,"Tooling",{"title":110,"path":111,"stem":112,"order":113,"group":108},"CLI","\u002Fguide\u002Fcli","guide\u002Fcli",200,{"title":115,"path":116,"stem":117,"order":118,"group":108},"Testing your app","\u002Fguide\u002Ftesting","guide\u002Ftesting",210,{"title":120,"path":121,"stem":122,"order":123,"group":108},"Storybook","\u002Fguide\u002Fstorybook","guide\u002Fstorybook",220,{"title":125,"path":126,"stem":127,"order":128,"group":108},"Crowdin","\u002Fguide\u002Fcrowdin","guide\u002Fcrowdin",230,false,{"title":131,"order":18,"path":132,"stem":133,"children":134},"Frameworks","\u002Fintegrations","integrations",[135,138,143,147,151,155,159,163,168,172,176],{"title":136,"path":132,"stem":137,"order":6},"Overview","integrations\u002Findex",{"title":139,"path":140,"stem":141,"order":18,"group":142},"Vue","\u002Fintegrations\u002Fvue-package","integrations\u002Fvue-package","UI frameworks",{"title":144,"path":145,"stem":146,"order":23,"group":142},"React and Preact","\u002Fintegrations\u002Freact-package","integrations\u002Freact-package",{"title":148,"path":149,"stem":150,"order":28,"group":142},"Solid","\u002Fintegrations\u002Fsolid-package","integrations\u002Fsolid-package",{"title":152,"path":153,"stem":154,"order":33,"group":142},"Astro","\u002Fintegrations\u002Fastro-package","integrations\u002Fastro-package",{"title":156,"path":157,"stem":158,"order":39,"group":142},"Astro islands","\u002Fintegrations\u002Fastro-islands","integrations\u002Fastro-islands",{"title":160,"path":161,"stem":162,"order":44,"group":142},"VitePress","\u002Fintegrations\u002Fvitepress-package","integrations\u002Fvitepress-package",{"title":164,"path":165,"stem":166,"order":49,"group":167},"Runtime","\u002Fintegrations\u002Fruntime-package","integrations\u002Fruntime-package","Runtimes",{"title":169,"path":170,"stem":171,"order":54,"group":167},"Node.js","\u002Fintegrations\u002Fnodejs-package","integrations\u002Fnodejs-package",{"title":173,"path":174,"stem":175,"order":60,"group":108},"Types generator","\u002Fintegrations\u002Ftypes-generator","integrations\u002Ftypes-generator",{"title":177,"path":178,"stem":179,"order":65,"group":108},"DevTools UI","\u002Fintegrations\u002Fdevtools-ui-package","integrations\u002Fdevtools-ui-package",{"title":181,"order":23,"path":182,"stem":183,"children":184},"API","\u002Fapi","api",[185,188,192,196,200,204],{"title":186,"path":182,"stem":187,"order":6},"API reference","api\u002Findex",{"title":189,"path":190,"stem":191,"order":18},"Module options","\u002Fapi\u002Fmodule-options","api\u002Fmodule-options",{"title":193,"path":194,"stem":195,"order":23},"CLI commands","\u002Fapi\u002Fcli","api\u002Fcli",{"title":197,"path":198,"stem":199,"order":28},"Helpers","\u002Fapi\u002Fmethods","api\u002Fmethods",{"title":201,"path":202,"stem":203,"order":33},"Hooks","\u002Fapi\u002Fevents","api\u002Fevents",{"title":205,"path":206,"stem":207,"children":208,"order":39},"Package APIs","\u002Fapi\u002Fpackages","api\u002Fpackages",[209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269,273],{"title":210,"path":211,"stem":212},"astro","\u002Fapi\u002Fpackages\u002Fastro","api\u002Fpackages\u002Fastro",{"title":214,"path":215,"stem":216},"cli","\u002Fapi\u002Fpackages\u002Fcli","api\u002Fpackages\u002Fcli",{"title":218,"path":219,"stem":220},"core","\u002Fapi\u002Fpackages\u002Fcore","api\u002Fpackages\u002Fcore",{"title":222,"path":223,"stem":224},"devtools-ui","\u002Fapi\u002Fpackages\u002Fdevtools-ui","api\u002Fpackages\u002Fdevtools-ui",{"title":226,"path":227,"stem":228},"node","\u002Fapi\u002Fpackages\u002Fnode","api\u002Fpackages\u002Fnode",{"title":230,"path":231,"stem":232},"path-strategy","\u002Fapi\u002Fpackages\u002Fpath-strategy","api\u002Fpackages\u002Fpath-strategy",{"title":234,"path":235,"stem":236},"preact","\u002Fapi\u002Fpackages\u002Fpreact","api\u002Fpackages\u002Fpreact",{"title":238,"path":239,"stem":240},"react","\u002Fapi\u002Fpackages\u002Freact","api\u002Fpackages\u002Freact",{"title":242,"path":243,"stem":244},"route-strategy","\u002Fapi\u002Fpackages\u002Froute-strategy","api\u002Fpackages\u002Froute-strategy",{"title":246,"path":247,"stem":248},"runtime","\u002Fapi\u002Fpackages\u002Fruntime","api\u002Fpackages\u002Fruntime",{"title":250,"path":251,"stem":252},"solid","\u002Fapi\u002Fpackages\u002Fsolid","api\u002Fpackages\u002Fsolid",{"title":254,"path":255,"stem":256},"test-utils","\u002Fapi\u002Fpackages\u002Ftest-utils","api\u002Fpackages\u002Ftest-utils",{"title":258,"path":259,"stem":260},"types","\u002Fapi\u002Fpackages\u002Ftypes","api\u002Fpackages\u002Ftypes",{"title":262,"path":263,"stem":264},"types-generator","\u002Fapi\u002Fpackages\u002Ftypes-generator","api\u002Fpackages\u002Ftypes-generator",{"title":266,"path":267,"stem":268},"utils","\u002Fapi\u002Fpackages\u002Futils","api\u002Fpackages\u002Futils",{"title":270,"path":271,"stem":272},"vitepress","\u002Fapi\u002Fpackages\u002Fvitepress","api\u002Fpackages\u002Fvitepress",{"title":274,"path":275,"stem":276},"vue","\u002Fapi\u002Fpackages\u002Fvue","api\u002Fpackages\u002Fvue",{"title":278,"order":28,"path":279,"stem":280,"children":281,"page":129},"Composables","\u002Fcomposables","composables",[282,286,290,294],{"title":283,"path":284,"stem":285,"order":6},"useI18n","\u002Fcomposables\u002FuseI18n","composables\u002FuseI18n",{"title":287,"path":288,"stem":289,"order":18},"useI18nLocale","\u002Fcomposables\u002FuseI18nLocale","composables\u002FuseI18nLocale",{"title":291,"path":292,"stem":293,"order":23},"useI18nHead","\u002Fcomposables\u002FuseI18nHead","composables\u002FuseI18nHead",{"title":295,"path":296,"stem":297,"order":28},"useLocaleHead","\u002Fcomposables\u002FuseLocaleHead","composables\u002FuseLocaleHead",{"title":299,"order":33,"path":300,"stem":301,"children":302,"page":129},"Components","\u002Fcomponents","components",[303,307,311,315],{"title":304,"path":305,"stem":306,"order":6},"\u003Ci18n-t>","\u002Fcomponents\u002Fi18n-t","components\u002Fi18n-t",{"title":308,"path":309,"stem":310,"order":18},"\u003Ci18n-link>","\u002Fcomponents\u002Fi18n-link","components\u002Fi18n-link",{"title":312,"path":313,"stem":314,"order":23},"\u003Ci18n-switcher>","\u002Fcomponents\u002Fi18n-switcher","components\u002Fi18n-switcher",{"title":316,"path":317,"stem":318,"order":28},"\u003Ci18n-group>","\u002Fcomponents\u002Fi18n-group","components\u002Fi18n-group",{"title":320,"order":39,"path":321,"stem":322,"children":323},"Contributing","\u002Fcontributing","contributing",[324,326,330,334,338,342],{"title":320,"path":321,"stem":325,"order":6},"contributing\u002Findex",{"title":327,"path":328,"stem":329,"order":18},"Architecture","\u002Fcontributing\u002Farchitecture","contributing\u002Farchitecture",{"title":331,"path":332,"stem":333,"order":23},"Testing the module","\u002Fcontributing\u002Ftesting","contributing\u002Ftesting",{"title":335,"path":336,"stem":337,"order":28},"Maintenance commands","\u002Fcontributing\u002Fmaintenance-commands","contributing\u002Fmaintenance-commands",{"title":339,"path":340,"stem":341,"order":33},"Release smoke checks","\u002Fcontributing\u002Frelease-smoke","contributing\u002Frelease-smoke",{"title":343,"path":344,"stem":345,"order":39},"Benchmark methodology","\u002Fcontributing\u002Fperformance-methodology","contributing\u002Fperformance-methodology",{"title":347,"path":348,"stem":349,"children":350,"order":44},"News","\u002Fnews","news\u002Findex",[351,354,359,363,367,371,375,379,383,387,391,395,399,403,407],{"title":352,"path":348,"stem":349,"order":353},"News & Releases",1,{"title":355,"path":356,"stem":357,"order":358},"v4.1.0","\u002Fnews\u002Fv4.1.0","news\u002Fv4.1.0",9,{"title":360,"path":361,"stem":362,"order":6},"v4.0.0","\u002Fnews\u002Fv4.0.0","news\u002Fv4.0.0",{"title":364,"path":365,"stem":366,"order":18},"v3.24.0","\u002Fnews\u002Fv3.24.0","news\u002Fv3.24.0",{"title":368,"path":369,"stem":370,"order":23},"v3.22.0","\u002Fnews\u002Fv3.22.0","news\u002Fv3.22.0",{"title":372,"path":373,"stem":374,"order":28},"v3.21.0","\u002Fnews\u002Fv3.21.0","news\u002Fv3.21.0",{"title":376,"path":377,"stem":378,"order":33},"v3.20.0","\u002Fnews\u002Fv3.20.0","news\u002Fv3.20.0",{"title":380,"path":381,"stem":382,"order":39},"v3.19.0","\u002Fnews\u002Fv3.19.0","news\u002Fv3.19.0",{"title":384,"path":385,"stem":386,"order":44},"v3.0.0","\u002Fnews\u002Fv3.0.0","news\u002Fv3.0.0",{"title":388,"path":389,"stem":390,"order":49},"v2.14.1","\u002Fnews\u002Fv2.14.1","news\u002Fv2.14.1",{"title":392,"path":393,"stem":394,"order":54},"v2.0.0","\u002Fnews\u002Fv2.0.0","news\u002Fv2.0.0",{"title":396,"path":397,"stem":398,"order":60},"v1.73.0","\u002Fnews\u002Fv1.73.0","news\u002Fv1.73.0",{"title":400,"path":401,"stem":402,"order":65},"v1.65.0","\u002Fnews\u002Fv1.65.0","news\u002Fv1.65.0",{"title":404,"path":405,"stem":406,"order":70},"v1.58.0","\u002Fnews\u002Fv1.58.0","news\u002Fv1.58.0",{"title":408,"path":409,"stem":410,"order":75},"v1.1.0","\u002Fnews\u002Fv1.1.0","news\u002Fv1.1.0",[412],{"title":413,"path":414,"stem":415,"children":416},"V3","\u002Fv3","v3",[417,420,557,603,696,717,734],{"title":136,"path":414,"stem":418,"order":419},"v3\u002Findex",0,{"title":5,"order":6,"path":421,"stem":422,"children":423,"page":129},"\u002Fv3\u002Fguide","v3\u002Fguide",[424,429,433,437,441,446,450,454,458,462,466,470,474,478,483,487,492,496,500,504,508,512,516,519,523,527,532,538,543,547,552],{"title":425,"path":426,"stem":427,"order":6,"group":428},"Getting Started","\u002Fv3\u002Fguide\u002Fgetting-started","v3\u002Fguide\u002Fgetting-started","Basics",{"title":430,"path":431,"stem":432,"order":18,"group":428},"Configuration","\u002Fv3\u002Fguide\u002Fconfiguration","v3\u002Fguide\u002Fconfiguration",{"title":434,"path":435,"stem":436,"order":23,"group":428},"Folder Structure","\u002Fv3\u002Fguide\u002Ffolder-structure","v3\u002Fguide\u002Ffolder-structure",{"title":438,"path":439,"stem":440,"order":28,"group":428},"Routing Strategy","\u002Fv3\u002Fguide\u002Fstrategy","v3\u002Fguide\u002Fstrategy",{"title":442,"path":443,"stem":444,"order":33,"group":445},"Translating Content","\u002Fv3\u002Fguide\u002Fusing","v3\u002Fguide\u002Fusing","Usage",{"title":447,"path":448,"stem":449,"order":39,"group":445},"Per Component Translations","\u002Fv3\u002Fguide\u002Fper-component-translations","v3\u002Fguide\u002Fper-component-translations",{"title":451,"path":452,"stem":453,"order":44,"group":445},"Custom Localized Routes","\u002Fv3\u002Fguide\u002Fcustom-locale-routes","v3\u002Fguide\u002Fcustom-locale-routes",{"title":455,"path":456,"stem":457,"order":49,"group":445},"Custom Auto Detect","\u002Fv3\u002Fguide\u002Fcustom-auto-detect","v3\u002Fguide\u002Fcustom-auto-detect",{"title":459,"path":460,"stem":461,"order":54,"group":445},"Runtime Overrides","\u002Fv3\u002Fguide\u002Fruntime-overrides","v3\u002Fguide\u002Fruntime-overrides",{"title":463,"path":464,"stem":465,"order":60,"group":445},"Layers","\u002Fv3\u002Fguide\u002Flayers","v3\u002Fguide\u002Flayers",{"title":77,"path":467,"stem":468,"order":65,"group":469},"\u002Fv3\u002Fguide\u002Fseo","v3\u002Fguide\u002Fseo","SEO & URLs",{"title":471,"path":472,"stem":473,"order":70,"group":469},"Multi Domain Locales","\u002Fv3\u002Fguide\u002Fmulti-domain-locales","v3\u002Fguide\u002Fmulti-domain-locales",{"title":475,"path":476,"stem":477,"order":75,"group":469},"Excluding Static Files","\u002Fv3\u002Fguide\u002Fexcluding-static-files","v3\u002Fguide\u002Fexcluding-static-files",{"title":479,"path":480,"stem":481,"order":80,"group":482},"Performance","\u002Fv3\u002Fguide\u002Fperformance","v3\u002Fguide\u002Fperformance","Performance & Deployment",{"title":484,"path":485,"stem":486,"order":86,"group":482},"Benchmark Results","\u002Fv3\u002Fguide\u002Fperformance-results","v3\u002Fguide\u002Fperformance-results",{"title":488,"path":489,"stem":490,"order":491,"group":482},"Performance methodology","\u002Fv3\u002Fguide\u002Fperformance-methodology","v3\u002Fguide\u002Fperformance-methodology",155,{"title":493,"path":494,"stem":495,"order":91,"group":482},"Server Side Translations","\u002Fv3\u002Fguide\u002Fserver-side-translations","v3\u002Fguide\u002Fserver-side-translations",{"title":497,"path":498,"stem":499,"order":97,"group":482},"Firebase Deployment","\u002Fv3\u002Fguide\u002Ffirebase","v3\u002Fguide\u002Ffirebase",{"title":501,"path":502,"stem":503,"order":102,"group":482},"Release Smoke Checks","\u002Fv3\u002Fguide\u002Frelease-smoke","v3\u002Fguide\u002Frelease-smoke",{"title":505,"path":506,"stem":507,"order":107,"group":482},"Preset local testing","\u002Fv3\u002Fguide\u002Fpreset-local-testing","v3\u002Fguide\u002Fpreset-local-testing",{"title":509,"path":510,"stem":511,"order":113,"group":482},"Maintenance Commands","\u002Fv3\u002Fguide\u002Fmaintenance-commands","v3\u002Fguide\u002Fmaintenance-commands",{"title":513,"path":514,"stem":515,"order":118,"group":108},"CLI Tool","\u002Fv3\u002Fguide\u002Fcli","v3\u002Fguide\u002Fcli",{"title":104,"path":517,"stem":518,"order":123,"group":108},"\u002Fv3\u002Fguide\u002Fdevtools","v3\u002Fguide\u002Fdevtools",{"title":520,"path":521,"stem":522,"order":128,"group":108},"Testing Your App","\u002Fv3\u002Fguide\u002Ftesting","v3\u002Fguide\u002Ftesting",{"title":120,"path":524,"stem":525,"order":526,"group":108},"\u002Fv3\u002Fguide\u002Fstorybook","v3\u002Fguide\u002Fstorybook",240,{"title":528,"path":529,"stem":530,"order":531,"group":108},"Crowdin Integration","\u002Fv3\u002Fguide\u002Fcrowdin","v3\u002Fguide\u002Fcrowdin",250,{"title":533,"path":534,"stem":535,"order":536,"group":537},"Migration from nuxt-i18n","\u002Fv3\u002Fguide\u002Fmigration","v3\u002Fguide\u002Fmigration",260,"Migration & Help",{"title":539,"path":540,"stem":541,"order":542,"group":537},"Upgrade to v3","\u002Fv3\u002Fguide\u002Fv3-upgrade","v3\u002Fguide\u002Fv3-upgrade",270,{"title":25,"path":544,"stem":545,"order":546,"group":537},"\u002Fv3\u002Fguide\u002Ffaq","v3\u002Fguide\u002Ffaq",280,{"title":548,"path":549,"stem":550,"order":551,"group":537},"Contribution","\u002Fv3\u002Fguide\u002Fcontribution","v3\u002Fguide\u002Fcontribution",290,{"title":553,"path":554,"stem":555,"order":556,"group":537},"Testing the Module","\u002Fv3\u002Fguide\u002Ftesting-strategies","v3\u002Fguide\u002Ftesting-strategies",300,{"title":558,"order":18,"path":559,"stem":560,"children":561},"Integrations","\u002Fv3\u002Fintegrations","v3\u002Fintegrations\u002Findex",[562,563,567,571,575,579,583,587,591,595,599],{"title":136,"path":559,"stem":560,"order":6},{"title":564,"path":565,"stem":566,"order":18},"Vue Package","\u002Fv3\u002Fintegrations\u002Fvue-package","v3\u002Fintegrations\u002Fvue-package",{"title":568,"path":569,"stem":570,"order":23},"React Package","\u002Fv3\u002Fintegrations\u002Freact-package","v3\u002Fintegrations\u002Freact-package",{"title":572,"path":573,"stem":574,"order":28},"Preact Package","\u002Fv3\u002Fintegrations\u002Fpreact-package","v3\u002Fintegrations\u002Fpreact-package",{"title":576,"path":577,"stem":578,"order":33},"Solid Package","\u002Fv3\u002Fintegrations\u002Fsolid-package","v3\u002Fintegrations\u002Fsolid-package",{"title":580,"path":581,"stem":582,"order":39},"Astro Package","\u002Fv3\u002Fintegrations\u002Fastro-package","v3\u002Fintegrations\u002Fastro-package",{"title":584,"path":585,"stem":586,"order":44},"VitePress Package","\u002Fv3\u002Fintegrations\u002Fvitepress-package","v3\u002Fintegrations\u002Fvitepress-package",{"title":588,"path":589,"stem":590,"order":49},"Runtime Package","\u002Fv3\u002Fintegrations\u002Fruntime-package","v3\u002Fintegrations\u002Fruntime-package",{"title":592,"path":593,"stem":594,"order":54},"Node.js Package","\u002Fv3\u002Fintegrations\u002Fnodejs-package","v3\u002Fintegrations\u002Fnodejs-package",{"title":596,"path":597,"stem":598,"order":60},"Types Generator","\u002Fv3\u002Fintegrations\u002Ftypes-generator","v3\u002Fintegrations\u002Ftypes-generator",{"title":600,"path":601,"stem":602,"order":65},"Devtools Package","\u002Fv3\u002Fintegrations\u002Fdevtools-ui-package","v3\u002Fintegrations\u002Fdevtools-ui-package",{"title":181,"order":23,"path":604,"stem":605,"children":606},"\u002Fv3\u002Fapi","v3\u002Fapi\u002Findex",[607,608,612,616,620,624],{"title":136,"path":604,"stem":605,"order":6},{"title":609,"path":610,"stem":611,"order":18},"Methods","\u002Fv3\u002Fapi\u002Fmethods","v3\u002Fapi\u002Fmethods",{"title":613,"path":614,"stem":615,"order":23},"Events","\u002Fv3\u002Fapi\u002Fevents","v3\u002Fapi\u002Fevents",{"title":617,"path":618,"stem":619,"order":28},"Translations and Cache","\u002Fv3\u002Fapi\u002Fi18n-cache-api","v3\u002Fapi\u002Fi18n-cache-api",{"title":621,"path":622,"stem":623,"order":33},"Module Options","\u002Fv3\u002Fapi\u002Fmodule-options","v3\u002Fapi\u002Fmodule-options",{"title":205,"path":625,"stem":626,"children":627,"order":39},"\u002Fv3\u002Fapi\u002Fpackages","v3\u002Fapi\u002Fpackages",[628,632,636,640,644,648,652,656,660,664,668,672,676,680,684,688,692],{"title":629,"path":630,"stem":631},"@i18n-micro\u002Fastro","\u002Fv3\u002Fapi\u002Fpackages\u002Fastro","v3\u002Fapi\u002Fpackages\u002Fastro",{"title":633,"path":634,"stem":635},"@i18n-micro\u002Fcore","\u002Fv3\u002Fapi\u002Fpackages\u002Fcore","v3\u002Fapi\u002Fpackages\u002Fcore",{"title":637,"path":638,"stem":639},"@i18n-micro\u002Fdevtools-ui","\u002Fv3\u002Fapi\u002Fpackages\u002Fdevtools-ui","v3\u002Fapi\u002Fpackages\u002Fdevtools-ui",{"title":641,"path":642,"stem":643},"@i18n-micro\u002Fhmr","\u002Fv3\u002Fapi\u002Fpackages\u002Fhmr","v3\u002Fapi\u002Fpackages\u002Fhmr",{"title":645,"path":646,"stem":647},"@i18n-micro\u002Fnode","\u002Fv3\u002Fapi\u002Fpackages\u002Fnode","v3\u002Fapi\u002Fpackages\u002Fnode",{"title":649,"path":650,"stem":651},"@i18n-micro\u002Fpath-strategy","\u002Fv3\u002Fapi\u002Fpackages\u002Fpath-strategy","v3\u002Fapi\u002Fpackages\u002Fpath-strategy",{"title":653,"path":654,"stem":655},"@i18n-micro\u002Fpreact","\u002Fv3\u002Fapi\u002Fpackages\u002Fpreact","v3\u002Fapi\u002Fpackages\u002Fpreact",{"title":657,"path":658,"stem":659},"@i18n-micro\u002Freact","\u002Fv3\u002Fapi\u002Fpackages\u002Freact","v3\u002Fapi\u002Fpackages\u002Freact",{"title":661,"path":662,"stem":663},"@i18n-micro\u002Froute-strategy","\u002Fv3\u002Fapi\u002Fpackages\u002Froute-strategy","v3\u002Fapi\u002Fpackages\u002Froute-strategy",{"title":665,"path":666,"stem":667},"@i18n-micro\u002Fruntime","\u002Fv3\u002Fapi\u002Fpackages\u002Fruntime","v3\u002Fapi\u002Fpackages\u002Fruntime",{"title":669,"path":670,"stem":671},"@i18n-micro\u002Fsolid","\u002Fv3\u002Fapi\u002Fpackages\u002Fsolid","v3\u002Fapi\u002Fpackages\u002Fsolid",{"title":673,"path":674,"stem":675},"@i18n-micro\u002Ftest-utils","\u002Fv3\u002Fapi\u002Fpackages\u002Ftest-utils","v3\u002Fapi\u002Fpackages\u002Ftest-utils",{"title":677,"path":678,"stem":679},"@i18n-micro\u002Ftypes","\u002Fv3\u002Fapi\u002Fpackages\u002Ftypes","v3\u002Fapi\u002Fpackages\u002Ftypes",{"title":681,"path":682,"stem":683},"@i18n-micro\u002Ftypes-generator","\u002Fv3\u002Fapi\u002Fpackages\u002Ftypes-generator","v3\u002Fapi\u002Fpackages\u002Ftypes-generator",{"title":685,"path":686,"stem":687},"@i18n-micro\u002Futils","\u002Fv3\u002Fapi\u002Fpackages\u002Futils","v3\u002Fapi\u002Fpackages\u002Futils",{"title":689,"path":690,"stem":691},"@i18n-micro\u002Fvitepress","\u002Fv3\u002Fapi\u002Fpackages\u002Fvitepress","v3\u002Fapi\u002Fpackages\u002Fvitepress",{"title":693,"path":694,"stem":695},"@i18n-micro\u002Fvue","\u002Fv3\u002Fapi\u002Fpackages\u002Fvue","v3\u002Fapi\u002Fpackages\u002Fvue",{"title":299,"order":28,"path":697,"stem":698,"children":699},"\u002Fv3\u002Fcomponents","v3\u002Fcomponents\u002Findex",[700,701,705,709,713],{"title":136,"path":697,"stem":698,"order":6},{"title":702,"path":703,"stem":704,"order":18},"i18n-t","\u002Fv3\u002Fcomponents\u002Fi18n-t","v3\u002Fcomponents\u002Fi18n-t",{"title":706,"path":707,"stem":708,"order":23},"i18n-switcher","\u002Fv3\u002Fcomponents\u002Fi18n-switcher","v3\u002Fcomponents\u002Fi18n-switcher",{"title":710,"path":711,"stem":712,"order":28},"i18n-link","\u002Fv3\u002Fcomponents\u002Fi18n-link","v3\u002Fcomponents\u002Fi18n-link",{"title":714,"path":715,"stem":716,"order":33},"i18n-group","\u002Fv3\u002Fcomponents\u002Fi18n-group","v3\u002Fcomponents\u002Fi18n-group",{"title":278,"path":718,"stem":719,"children":720,"order":33},"\u002Fv3\u002Fcomposables","v3\u002Fcomposables\u002Findex",[721,722,725,728,731],{"title":136,"path":718,"stem":719,"order":6},{"title":283,"path":723,"stem":724,"order":18},"\u002Fv3\u002Fcomposables\u002FuseI18n","v3\u002Fcomposables\u002FuseI18n",{"title":295,"path":726,"stem":727,"order":23},"\u002Fv3\u002Fcomposables\u002FuseLocaleHead","v3\u002Fcomposables\u002FuseLocaleHead",{"title":291,"path":729,"stem":730,"order":28},"\u002Fv3\u002Fcomposables\u002FuseI18nHead","v3\u002Fcomposables\u002FuseI18nHead",{"title":287,"path":732,"stem":733,"order":33},"\u002Fv3\u002Fcomposables\u002FuseI18nLocale","v3\u002Fcomposables\u002FuseI18nLocale",{"title":735,"path":736,"stem":737,"order":39},"Examples","\u002Fv3\u002Fexamples","v3\u002Fexamples",{"id":739,"title":360,"body":740,"description":4419,"extension":4420,"lastUpdated":4421,"links":4422,"meta":4423,"navigation":4424,"path":361,"seo":4425,"stem":362,"__hash__":4426},"docs\u002Fnews\u002Fv4.0.0.md",{"type":741,"value":742,"toc":4386},"minimark",[743,748,756,765,772,797,802,807,821,1018,1051,1060,1064,1071,1117,1121,1146,1150,1157,1182,1186,1220,1227,1324,1328,1360,1364,1464,1470,1500,1504,1510,1514,1547,1561,1686,1689,1695,1787,1793,1799,1805,1808,1812,1854,1858,2060,2068,2342,2346,2394,2396,2402,2524,2530,2589,2595,2627,2631,2667,2671,2997,3001,3112,3116,3261,3265,3294,3301,3313,3323,3484,3492,3568,3574,3839,3847,3877,3883,3913,3919,3962,3968,3993,4005,4008,4157,4161,4327,4332,4336,4368,4380,4383],[744,745,747],"h1",{"id":746},"nuxt-i18n-micro-v400-one-route-model-one-build-for-every-domain","Nuxt I18n Micro v4.0.0 — One Route Model, One Build for Every Domain",[749,750,751,755],"p",{},[752,753,754],"strong",{},"Date",": 2026-11-03",[749,757,758,761,762],{},[752,759,760],{},"Version",": ",[763,764,360],"code",{},[749,766,767],{},[768,769],"img",{"alt":770,"src":771},"v4.0.0 release","\u002F4.0.0.png",[749,773,774,776,777,780,781,780,784,787,788,793,794,796],{},[752,775,360],{}," is out. Routing, the translation core, dictionary files, locale detection and every framework package were rewritten. Options, ",[763,778,779],{},"$t",", ",[763,782,783],{},"$localePath",[763,785,786],{},"$switchLocale",", the components and the composables keep their names. What changes is behaviour, and most of those changes are bugs that are gone. Most apps need few code changes, but read ",[789,790,792],"a",{"href":791},"#breaking-changes","Breaking Changes"," before you upgrade: URLs, SEO tags and framework package APIs moved in places. ",[789,795,20],{"href":21}," has every detail.",[798,799,801],"h2",{"id":800},"whats-new","What's New?",[803,804,806],"h3",{"id":805},"one-build-for-every-domain","One Build for Every Domain",[749,808,809,812,813,816,817,820],{},[763,810,811],{},"locales[].baseUrl"," and ",[763,814,815],{},"baseDefault"," used to shape links only. Now they route requests too, under all four strategies and in ",[763,818,819],{},"nuxt generate",":",[822,823,828],"pre",{"className":824,"code":825,"language":826,"meta":827,"style":827},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  i18n: {\n    locales: [\n      { code: 'en', baseUrl: 'https:\u002F\u002Fexample.com', baseDefault: true },\n      { code: 'fr', baseUrl: 'https:\u002F\u002Fexample.com' },\n      { code: 'de', baseUrl: 'https:\u002F\u002Fexample.de', baseDefault: true },\n    ],\n  },\n})\n","ts","",[763,829,830,853,865,876,926,956,995,1004,1010],{"__ignoreMap":827},[831,832,834,838,841,845,849],"span",{"class":833,"line":353},"line",[831,835,837],{"class":836},"s7zQu","export",[831,839,840],{"class":836}," default",[831,842,844],{"class":843},"s2Zo4"," defineNuxtConfig",[831,846,848],{"class":847},"sTEyZ","(",[831,850,852],{"class":851},"sMK4o","{\n",[831,854,856,860,862],{"class":833,"line":855},2,[831,857,859],{"class":858},"swJcz","  i18n",[831,861,820],{"class":851},[831,863,864],{"class":851}," {\n",[831,866,868,871,873],{"class":833,"line":867},3,[831,869,870],{"class":858},"    locales",[831,872,820],{"class":851},[831,874,875],{"class":847}," [\n",[831,877,879,882,885,887,890,894,897,900,903,905,907,910,912,914,917,919,923],{"class":833,"line":878},4,[831,880,881],{"class":851},"      {",[831,883,884],{"class":858}," code",[831,886,820],{"class":851},[831,888,889],{"class":851}," '",[831,891,893],{"class":892},"sfazB","en",[831,895,896],{"class":851},"'",[831,898,899],{"class":851},",",[831,901,902],{"class":858}," baseUrl",[831,904,820],{"class":851},[831,906,889],{"class":851},[831,908,909],{"class":892},"https:\u002F\u002Fexample.com",[831,911,896],{"class":851},[831,913,899],{"class":851},[831,915,916],{"class":858}," baseDefault",[831,918,820],{"class":851},[831,920,922],{"class":921},"sfNiH"," true",[831,924,925],{"class":851}," },\n",[831,927,929,931,933,935,937,940,942,944,946,948,950,952,954],{"class":833,"line":928},5,[831,930,881],{"class":851},[831,932,884],{"class":858},[831,934,820],{"class":851},[831,936,889],{"class":851},[831,938,939],{"class":892},"fr",[831,941,896],{"class":851},[831,943,899],{"class":851},[831,945,902],{"class":858},[831,947,820],{"class":851},[831,949,889],{"class":851},[831,951,909],{"class":892},[831,953,896],{"class":851},[831,955,925],{"class":851},[831,957,959,961,963,965,967,970,972,974,976,978,980,983,985,987,989,991,993],{"class":833,"line":958},6,[831,960,881],{"class":851},[831,962,884],{"class":858},[831,964,820],{"class":851},[831,966,889],{"class":851},[831,968,969],{"class":892},"de",[831,971,896],{"class":851},[831,973,899],{"class":851},[831,975,902],{"class":858},[831,977,820],{"class":851},[831,979,889],{"class":851},[831,981,982],{"class":892},"https:\u002F\u002Fexample.de",[831,984,896],{"class":851},[831,986,899],{"class":851},[831,988,916],{"class":858},[831,990,820],{"class":851},[831,992,922],{"class":921},[831,994,925],{"class":851},[831,996,998,1001],{"class":833,"line":997},7,[831,999,1000],{"class":847},"    ]",[831,1002,1003],{"class":851},",\n",[831,1005,1007],{"class":833,"line":1006},8,[831,1008,1009],{"class":851},"  },\n",[831,1011,1012,1015],{"class":833,"line":358},[831,1013,1014],{"class":851},"}",[831,1016,1017],{"class":847},")\n",[1019,1020,1021,1025,1035,1044],"ul",{},[1022,1023,1024],"li",{},"A host serves its own locales. Links to another domain's locale become absolute URLs on that domain, and switching to it navigates there.",[1022,1026,1027,1030,1031,1034],{},[763,1028,1029],{},"trustForwardedHost"," picks the domain from ",[763,1032,1033],{},"X-Forwarded-Host"," behind a proxy that overwrites it. Off by default.",[1022,1036,1037,1040,1041,1043],{},[763,1038,1039],{},"NUXT_I18N_DOMAIN"," gives ",[763,1042,819],{}," its host: run it once per domain, and each output holds only that domain's pages and dictionaries.",[1022,1045,1046,1047,1050],{},"An app without ",[763,1048,1049],{},"baseUrl"," ships none of this code.",[749,1052,1053,1054,812,1057,1059],{},"See ",[789,1055,83],{"href":1056},"\u002Fguide\u002Flayers#multiple-domains",[789,1058,88],{"href":89},".",[803,1061,1063],{"id":1062},"routing-that-agrees-with-the-router","Routing That Agrees With the Router",[749,1065,1066,1067,1070],{},"The build and the runtime no longer work out localized URLs separately. Every answer comes from the routes the build generated, so a link, a switcher, ",[763,1068,1069],{},"hreflang"," and a redirect can't point at a page that doesn't exist.",[1019,1072,1073,1076,1081,1094,1102,1105,1111],{},[1022,1074,1075],{},"A locale that doesn't serve a page links to its home, never to another locale's page.",[1022,1077,1078,1080],{},[763,1079,1069],{}," lists only the locales that serve the page.",[1022,1082,1083,1085,1086,1089,1090,1093],{},[763,1084,786],{}," resolves ",[763,1087,1088],{},"true"," or ",[763,1091,1092],{},"false",", so you can tell when a dictionary failed to load. A repeat call retries.",[1022,1095,1096,812,1099,1101],{},[763,1097,1098],{},"$setI18nRouteParams",[763,1100,291],{}," set during SSR survive hydration. The switcher links to the translated slug, in the server HTML too.",[1022,1103,1104],{},"A navigation takes effect when it commits: a cancelled or blocked one changes nothing.",[1022,1106,1107,1108,1059],{},"Hash mode works under ",[763,1109,1110],{},"prefix",[1022,1112,1113,1116],{},[763,1114,1115],{},"\u003CGreeting :locale=\"$getLocale()\" \u002F>"," on a server component sets its render locale.",[803,1118,1120],{"id":1119},"one-locale-detection","One Locale Detection",[749,1122,1123,1124,1127,1128,1131,1132,1135,1136,1139,1140,1143,1144,1059],{},"One order everywhere, on the server, in the browser, in server API helpers and in Astro. ",[763,1125,1126],{},"Accept-Language"," honours ",[763,1129,1130],{},"q"," values, regional matching no longer depends on the order of ",[763,1133,1134],{},"locales",", and it never crosses Chinese scripts. Runtime overrides now reach routing: ",[763,1137,1138],{},"NUXT_I18N_DEFAULT_LOCALE"," and runtime ",[763,1141,1142],{},"disabledLocales"," change what is actually served. See ",[789,1145,57],{"href":58},[803,1147,1149],{"id":1148},"one-dictionary-in-every-mode","One Dictionary in Every Mode",[749,1151,1152,1153,1156],{},"Premerged builds, ",[763,1154,1155],{},"mode: 'source'"," and dev used to disagree on many pages. They now give the same dictionary.",[1019,1158,1159,1170,1173,1179],{},[1022,1160,1161,1162,1164,1165,1164,1167,1169],{},"Merges are deep at every level, and fallback chains (",[763,1163,939],{}," → ",[763,1166,969],{},[763,1168,893],{},") are followed to their end.",[1022,1171,1172],{},"Translation edits in dev apply in place, without a page reload. Removed keys disappear, and a root file edit reaches every page.",[1022,1174,1175,1178],{},[763,1176,1177],{},"$clearCache()"," reloads the current page and keeps the old text on screen until the new text lands.",[1022,1180,1181],{},"A failed chunk keeps the current dictionary instead of showing raw keys.",[803,1183,1185],{"id":1184},"smaller-dictionary-files","Smaller Dictionary Files",[1019,1187,1188,1195,1210,1213],{},[1022,1189,1190,1191,1194],{},"A page's file now holds only what differs from the locale's root, in ",[763,1192,1193],{},"__root\u002F\u003Clocale>\u002Fdata.json",". The browser loads the root once and merges each page over it, so disk use falls and the next page costs a fraction of the first.",[1022,1196,1197,1198,1201,1202,1205,1206,1059],{},"Dictionary URLs carry a version. A URL with the current ",[763,1199,1200],{},"?v="," is pinned for a year on a Node server, and a host's static copy answers ",[763,1203,1204],{},"max-age=60",". See ",[789,1207,1209],{"href":1208},"\u002Fguide\u002Fdeployment#cache-headers-and-datebuild","Cache headers",[1022,1211,1212],{},"Every SSR page preloads its dictionary files, so they start with the HTML.",[1022,1214,1215,1216,1059],{},"A failed read no longer sticks: the next request reads again. See ",[789,1217,1219],{"href":1218},"\u002Fguide\u002Fdeployment#when-a-dictionary-cannot-be-read","When a dictionary cannot be read",[803,1221,1223,1224,1226],{"id":1222},"better-i18n-t-plurals-and-formats","Better ",[763,1225,304],{},", Plurals and Formats",[1019,1228,1229,1249,1254,1273,1280,1292,1308],{},[1022,1230,1231,1232,780,1235,780,1238,812,1241,1244,1245,1248],{},"Slots work with ",[763,1233,1234],{},"plural",[763,1236,1237],{},"number",[763,1239,1240],{},"date",[763,1242,1243],{},"relativeDate",", and every ",[763,1246,1247],{},"{name}"," is filled, not only the first.",[1022,1250,1251,1253],{},[763,1252,304],{}," is one renderer across Nuxt, Vue, React, Preact, Solid and Astro.",[1022,1255,1256,1257,1260,1261,761,1264,1205,1267,1059],{},"A first form starting with ",[763,1258,1259],{},"=0 "," is an explicit zero form, and the rest go by ",[763,1262,1263],{},"Intl.PluralRules",[763,1265,1266],{},"=0 no apples | one apple | {count} apples",[789,1268,1270],{"href":1269},"\u002Fapi\u002Fmethods#tc",[763,1271,1272],{},"$tc",[1022,1274,1275,1276,1279],{},"New ",[763,1277,1278],{},"timeZone"," option: one calendar date on the server and in every browser.",[1022,1281,1282,780,1285,812,1288,1291],{},[763,1283,1284],{},"{firstName}",[763,1286,1287],{},"{first-name}",[763,1289,1290],{},"{user.name}"," are valid placeholders.",[1022,1293,1294,780,1297,812,1300,1303,1304,1307],{},[763,1295,1296],{},"$tn",[763,1298,1299],{},"$td",[763,1301,1302],{},"$tdr"," follow ",[763,1305,1306],{},"iso",", as plurals do.",[1022,1309,1310,1312,1313,1316,1317,1320,1321,1059],{},[763,1311,1302],{}," gives real future dates: ",[763,1314,1315],{},"in 3 days",", or ",[763,1318,1319],{},"tomorrow"," with ",[763,1322,1323],{},"numeric: 'auto'",[803,1325,1327],{"id":1326},"safer-by-default","Safer by Default",[1019,1329,1330,1340,1350,1353],{},[1022,1331,1332,1335,1336,1339],{},[763,1333,1334],{},"\u003Ci18n-t html>"," escapes ",[763,1337,1338],{},"params",". Only the translation is trusted markup.",[1022,1341,1342,1343,780,1346,1349],{},"No link leaves the origin by accident: ",[763,1344,1345],{},"\u002F\u002Fhost",[763,1347,1348],{},"\u002F\\host"," and blanks stay on this site.",[1022,1351,1352],{},"The server translation cache is bounded, so URLs with made-up page names can't grow memory.",[1022,1354,1355,1356,1359],{},"The DevTools save endpoints accept only existing ",[763,1357,1358],{},".json"," files inside your translation directories, and refuse cross-site requests.",[803,1361,1363],{"id":1362},"framework-packages-at-20","Framework Packages at 2.0",[1019,1365,1366,1396,1418,1434,1450,1457],{},[1022,1367,1368,1371,1372,1375,1376,1378,1379,812,1382,1385,1386,812,1389,1392,1393,1059],{},[752,1369,1370],{},"React, Preact, Solid:"," ",[763,1373,1374],{},"I18nT"," takes a ",[763,1377,301],{}," prop for rich text. New ",[763,1380,1381],{},"useT",[763,1383,1384],{},"useLocaleSwitch",", and React Server Components support through ",[763,1387,1388],{},"@i18n-micro\u002Freact\u002Fserver",[763,1390,1391],{},"\u002Fclient",". Preact no longer needs ",[763,1394,1395],{},"preact\u002Fcompat",[1022,1397,1398,1371,1401,1404,1405,780,1408,812,1411,1414,1415,1059],{},[752,1399,1400],{},"Vue and VitePress:",[763,1402,1403],{},"I18nLink"," keeps ",[763,1406,1407],{},"name",[763,1409,1410],{},"query",[763,1412,1413],{},"hash",", and VitePress respects ",[763,1416,1417],{},"base",[1022,1419,1420,1371,1423,1426,1427,1430,1431,1433],{},[752,1421,1422],{},"Astro:",[763,1424,1425],{},"i18nIntegration"," bundles your dictionaries and installs the middleware. The main entry has no ",[763,1428,1429],{},"node:*"," import, so it runs on the edge. ",[763,1432,1417],{}," works.",[1022,1435,1436,1371,1439,1442,1443,1446,1447,1449],{},[752,1437,1438],{},"Node and runtime:",[763,1440,1441],{},"fork(locale)"," gives a cheap per-request instance, and ",[763,1444,1445],{},"run(locale, fn)"," on ",[763,1448,645],{}," scopes one to a request.",[1022,1451,1452,1456],{},[752,1453,1454,820],{},[763,1455,681],{}," no third-party dependencies, and a plain Vite and Rollup plugin.",[1022,1458,1459,1463],{},[752,1460,1461,820],{},[763,1462,637],{}," live updates over Vite's socket, and an Astro toolbar app.",[803,1465,1467],{"id":1466},"i18n-microcli",[763,1468,1469],{},"@i18n-micro\u002Fcli",[749,1471,1472,1473,1475,1476,1479,1480,780,1483,812,1486,1489,1490,1493,1494,1497,1498,1059],{},"The CLI now lives in the monorepo as ",[763,1474,1469],{},", rewritten with 16 commands instead of 28 and far fewer dependencies. ",[763,1477,1478],{},"check"," replaces ",[763,1481,1482],{},"validate",[763,1484,1485],{},"diff",[763,1487,1488],{},"check-duplicates",", with ",[763,1491,1492],{},"--json"," and exit codes for CI. When it can't prove a key is unused, ",[763,1495,1496],{},"clean"," writes nothing. See ",[789,1499,110],{"href":111},[803,1501,1503],{"id":1502},"documentation","Documentation",[749,1505,1506,1507,1509],{},"The docs were rewritten from the code around one reading path: install, first translated page, translation files, routing, detection, then task guides. Old URLs redirect. ",[789,1508,20],{"href":21}," lists every change in detail.",[798,1511,1513],{"id":1512},"speed-and-size","Speed and Size",[1019,1515,1516,1519,1528,1537],{},[1022,1517,1518],{},"A server render reads dictionaries directly, with no local HTTP request and no re-parsing.",[1022,1520,1521,1524,1525,1527],{},[763,1522,1523],{},"dir=\"auto\""," is no longer the default. Browsers spend a long time on it on large pages: with 20,000 ",[763,1526,779],{}," elements, DOMContentLoaded in Chromium went from about 980 ms to about 115 ms.",[1022,1529,1530,812,1533,1536],{},[763,1531,1532],{},"serverTranslationPreload",[763,1534,1535],{},"i18n:register"," no longer slow every request.",[1022,1538,1539,1540,1543,1544,1546],{},"The client bundle drops ",[763,1541,1542],{},"useCookie"," when no cookie is configured, and ",[763,1545,649],{}," is a fraction of its old size.",[749,1548,1549,1552,1553,1556,1557,1560],{},[752,1550,1551],{},"Test app against v3.30.3."," A generated Nuxt app on one Node server, on one Mac, ",[763,1554,1555],{},"wrk"," with 24 connections for 20 s, three rotated rounds, on a pre-release build. Rows come from separate runs, so compare within a row. Hydration uses ",[763,1558,1559],{},"dir: 'ltr'"," on both sides.",[1562,1563,1564,1580],"table",{},[1565,1566,1567],"thead",{},[1568,1569,1570,1574,1578],"tr",{},[1571,1572,1573],"th",{},"Measure",[1571,1575,1577],{"align":1576},"right","v3.30.3",[1571,1579,360],{"align":1576},[1581,1582,1583,1595,1606,1617,1628,1639,1650,1661,1672],"tbody",{},[1568,1584,1585,1589,1592],{},[1586,1587,1588],"td",{},"4 locales, 10k catalog: requests per second",[1586,1590,1591],{"align":1576},"384-395",[1586,1593,1594],{"align":1576},"585-591",[1568,1596,1597,1600,1603],{},[1586,1598,1599],{},"4 locales, 10k catalog: p95 latency",[1586,1601,1602],{"align":1576},"106-110 ms",[1586,1604,1605],{"align":1576},"70-72 ms",[1568,1607,1608,1611,1614],{},[1586,1609,1610],{},"4 locales, 10k catalog: server CPU per request",[1586,1612,1613],{"align":1576},"2.92-3.00 ms",[1586,1615,1616],{"align":1576},"2.01-2.02 ms",[1568,1618,1619,1622,1625],{},[1586,1620,1621],{},"12 locales, 100k catalog: requests per second",[1586,1623,1624],{"align":1576},"362-370",[1586,1626,1627],{"align":1576},"578-580",[1568,1629,1630,1633,1636],{},[1586,1631,1632],{},"12 locales, 100k catalog: p95 latency",[1586,1634,1635],{"align":1576},"115-117 ms",[1586,1637,1638],{"align":1576},"72-73 ms",[1568,1640,1641,1644,1647],{},[1586,1642,1643],{},"12 locales, 100k catalog: server CPU per request",[1586,1645,1646],{"align":1576},"3.11-3.17 ms",[1586,1648,1649],{"align":1576},"2.02-2.03 ms",[1568,1651,1652,1655,1658],{},[1586,1653,1654],{},"Hydration, 100k page",[1586,1656,1657],{"align":1576},"86-92 ms",[1586,1659,1660],{"align":1576},"77-81 ms",[1568,1662,1663,1666,1669],{},[1586,1664,1665],{},"Client JS of this app, gzip",[1586,1667,1668],{"align":1576},"105.1 KB",[1586,1670,1671],{"align":1576},"93.9 KB",[1568,1673,1674,1680,1683],{},[1586,1675,1676,1677,1679],{},"Request time with an ",[763,1678,1535],{}," subscriber, 100k chunk",[1586,1681,1682],{"align":1576},"96-108 ms",[1586,1684,1685],{"align":1576},"1.7 ms",[749,1687,1688],{},"A 30-minute run on the 100k catalog, on an earlier pre-release build, served 1.13 million requests with no errors, and the live heap stayed flat.",[749,1690,1691,1694],{},[752,1692,1693],{},"Three production apps against v3.29.5,"," the version they ran, on a pre-release build. Two are SSR sites and one is a SPA. Each ran on one Node server, 60 s, 8 connections, GET only, two rounds. Build time is one run each.",[1562,1696,1697,1712],{},[1565,1698,1699],{},[1568,1700,1701,1703,1706,1709],{},[1571,1702,1573],{},[1571,1704,1705],{"align":1576},"SSR app 1",[1571,1707,1708],{"align":1576},"SSR app 2",[1571,1710,1711],{"align":1576},"SPA app",[1581,1713,1714,1728,1745,1759,1773],{},[1568,1715,1716,1719,1722,1725],{},[1586,1717,1718],{},"Dictionary bytes on disk",[1586,1720,1721],{"align":1576},"6.37 MB to 1.52 MB (-76%)",[1586,1723,1724],{"align":1576},"4.43 MB to 1.52 MB (-66%)",[1586,1726,1727],{"align":1576},"15.40 MB to 1.69 MB (-89%)",[1568,1729,1730,1736,1739,1742],{},[1586,1731,1732,1735],{},[763,1733,1734],{},".output"," size",[1586,1737,1738],{"align":1576},"-22%",[1586,1740,1741],{"align":1576},"-14%",[1586,1743,1744],{"align":1576},"-29%",[1568,1746,1747,1750,1753,1756],{},[1586,1748,1749],{},"Build time",[1586,1751,1752],{"align":1576},"27 s to 22 s",[1586,1754,1755],{"align":1576},"23 s to 19 s",[1586,1757,1758],{"align":1576},"41 s to 28 s",[1568,1760,1761,1764,1767,1770],{},[1586,1762,1763],{},"Client JS, gzip",[1586,1765,1766],{"align":1576},"+1.7%",[1586,1768,1769],{"align":1576},"+0.9%",[1586,1771,1772],{"align":1576},"+0.5%",[1568,1774,1775,1778,1781,1784],{},[1586,1776,1777],{},"Requests per second",[1586,1779,1780],{"align":1576},"82 to 88",[1586,1782,1783],{"align":1576},"237 to 240, within noise",[1586,1785,1786],{"align":1576},"233 to 404, SPA shell only",[749,1788,1789,1792],{},[752,1790,1791],{},"Client JS."," A real app with its own code gains a little, as above. Shared fixes grew the framework packages too, measured with Vue, React, Preact and Solid apps of minimal size on another pre-release build: about 1.4 KB to 2.5 KB gzip more. React, Preact and Solid also carry the shared rich text renderer.",[749,1794,1795,1798],{},[752,1796,1797],{},"Dictionary requests."," A first load now takes two files, the root and the page. Its bytes stay the same (+0.3% over 103 and 89 first loads on the two SSR apps). The next page in the same document takes one small file: 4.7 KB to 1.5 KB gzip and 5.9 KB to 0.5 KB gzip on the two pages measured. Over a logged-in walk of the SPA, dictionary bytes fell 21%.",[749,1800,1801,1804],{},[752,1802,1803],{},"Edge."," On a small demo app, the Cloudflare Worker upload went from 241.5 KiB to 250.3 KiB gzip, on a pre-release build. Dictionaries embedded in an Edge bundle use the same root and page files, but we have not measured that embed on a large catalog.",[798,1806,792],{"id":1807},"breaking-changes",[803,1809,1811],{"id":1810},"requirements","Requirements",[1019,1813,1814,1823,1830,1837,1844],{},[1022,1815,1816,1819,1820,1059],{},[752,1817,1818],{},"Nuxt 3.18 or newer",", and ",[752,1821,1822],{},"Node 20 or newer",[1022,1824,1825,1829],{},[752,1826,1827],{},[763,1828,673],{}," is no longer installed with the module. Add it yourself if your tests import it.",[1022,1831,1832,1836],{},[752,1833,1834],{},[763,1835,641],{}," is gone: translation HMR is built in. Remove the package if you installed it.",[1022,1838,1839,1843],{},[752,1840,1841],{},[763,1842,657],{}," needs React 18 or newer.",[1022,1845,1846,1851,1852,1059],{},[752,1847,1848],{},[763,1849,1850],{},"nuxt-i18n-micro-cli"," is replaced by ",[763,1853,1469],{},[803,1855,1857],{"id":1856},"options-and-config","Options and Config",[1019,1859,1860,1876,1892,1917,1945,1958,1973,1991,2001,2016,2033,2049,2052],{},[1022,1861,1862,812,1865,1868,1869,1872,1873,1059],{},[763,1863,1864],{},"i18n-plugin-hooks",[763,1866,1867],{},"i18n-plugin-define"," in a ",[763,1870,1871],{},"dependsOn"," no longer wait for anything, with no error. Use ",[763,1874,1875],{},"i18n-plugin-loader",[1022,1877,1878,1879,780,1882,780,1885,812,1888,1891],{},"Server auto-imports are ",[763,1880,1881],{},"useLocaleServerMiddleware",[763,1883,1884],{},"useTranslationServerMiddleware",[763,1886,1887],{},"loadTranslationsFromServer",[763,1889,1890],{},"detectCurrentLocale",". Others no longer auto-import.",[1022,1893,1894,1897,1898,1901,1902,1905,1906,812,1909,1912,1913,1916],{},[763,1895,1896],{},"resolveTranslationPayloadMode"," and the other ",[763,1899,1900],{},"resolveTranslationPayload*"," helpers are gone from ",[763,1903,1904],{},"nuxt-i18n-micro",", along with ",[763,1907,1908],{},"shouldCopyTranslationPayloadsToPublic",[763,1910,1911],{},"shouldRegisterNitroServerAssets",". The ",[763,1914,1915],{},"TranslationPayloadMode"," type stays.",[1022,1918,1919,1922,1923,780,1926,780,1929,780,1932,780,1935,780,1938,1089,1941,1944],{},[763,1920,1921],{},"$getI18nConfig()"," no longer has ",[763,1924,1925],{},"isSSG",[763,1927,1928],{},"hmr",[763,1930,1931],{},"hooks",[763,1933,1934],{},"noPrefixRedirect",[763,1936,1937],{},"routeLocales",[763,1939,1940],{},"routeDisableMeta",[763,1942,1943],{},"globalLocaleRoutes",". The options themselves are unchanged.",[1022,1946,1947,1949,1950,1953,1954,1957],{},[763,1948,811],{}," now routes requests: a locale of another domain is a 404 on this host, and links on the same host are relative. On such a build ",[763,1951,1952],{},"$getI18nConfig().locales"," holds what the host serves, and ",[763,1955,1956],{},"linkLocales"," holds them all.",[1022,1959,1960,1962,1963,1965,1966,1969,1970,1972],{},[763,1961,1049],{}," also sets the origin on any other host: canonical and ",[763,1964,1069],{}," use ",[763,1967,1968],{},"metaBaseUrl"," if set, else the default locale's ",[763,1971,1049],{},", not the request's origin.",[1022,1974,1975,1978,1979,1982,1983,1986,1987,1990],{},[763,1976,1977],{},"excludePatterns"," match whole segments (",[763,1980,1981],{},"'\u002Fadmin'"," no longer matches ",[763,1984,1985],{},"\u002Fadministrator","), globs are anchored, and ",[763,1988,1989],{},"RegExp"," patterns now reach the runtime.",[1022,1992,1993,1996,1997,2000],{},[763,1994,1995],{},"cacheMaxSize"," unset means at most 1000 entries on the server. ",[763,1998,1999],{},"cacheTtl"," counts from when an entry was stored, and reads no longer extend it.",[1022,2002,2003,2004,2007,2008,2011,2012,2015],{},"Under ",[763,2005,2006],{},"no_prefix"," an explicit ",[763,2009,2010],{},"localeCookie: null"," in the ",[763,2013,2014],{},"i18n"," config stays off.",[1022,2017,2003,2018,812,2021,2024,2025,2028,2029,2032],{},[763,2019,2020],{},"prefix_except_default",[763,2022,2023],{},"prefix_and_default"," a runtime ",[763,2026,2027],{},"defaultLocale"," is ignored with a warning. A runtime ",[763,2030,2031],{},"fallbackLocale"," must be an enabled locale.",[1022,2034,2035,2037,2038,2041,2042,2044,2045,2048],{},[763,2036,1940],{}," in ",[763,2039,2040],{},"nuxt.config"," is honoured, and a ",[763,2043,2040],{}," entry beats ",[763,2046,2047],{},"$defineI18nRoute"," under any key form.",[1022,2050,2051],{},"On a server in dev, the resolved config is frozen: a write to it throws.",[1022,2053,2054,2055,2057,2058,1059],{},"A project's ",[763,2056,1134],{}," entry beats a layer's for the same ",[763,2059,763],{},[803,2061,2063,2064,2067],{"id":2062},"composables-and-methods","Composables and ",[763,2065,2066],{},"$"," Methods",[1019,2069,2070,2086,2095,2127,2154,2166,2186,2195,2210,2218,2224,2235,2240,2259,2265,2270,2281,2290,2301,2334],{},[1022,2071,2072,1085,2074,1089,2076,2078,2079,2082,2083,1059],{},[763,2073,786],{},[763,2075,1088],{},[763,2077,1092],{},", it resolved nothing. ",[763,2080,2081],{},"$switchRoute"," is typed ",[763,2084,2085],{},"Promise\u003Cvoid>",[1022,2087,2088,780,2091,2094],{},[763,2089,2090],{},"$localeRoute",[763,2092,2093],{},"$switchLocalePath"," and the switcher link a locale that doesn't serve a page to that locale's home.",[1022,2096,2097,2099,2100,780,2103,1089,2106,2109,2110,2112,2113,812,2116,2119,2120,2122,2123,2126],{},[763,2098,783],{}," returns a string with an ",[763,2101,2102],{},"http(s):",[763,2104,2105],{},"mailto:",[763,2107,2108],{},"tel:"," scheme as is, and ",[763,2111,2090],{}," carries it in ",[763,2114,2115],{},"path",[763,2117,2118],{},"fullPath",". Don't pass an unchecked value to them as a link target. ",[763,2121,1345],{}," and bare names like ",[763,2124,2125],{},"x.com"," stay paths on this origin.",[1022,2128,2129,2130,780,2133,780,2136,812,2139,2142,2143,2146,2147,2150,2151,1059],{},"A link with no path stays on the current page: ",[763,2131,2132],{},"$localePath('#top')",[763,2134,2135],{},"'?p=2'",[763,2137,2138],{},"''",[763,2140,2141],{},"{ query }",". ",[763,2144,2145],{},"'#top'"," used to read from the site root. A bare ",[763,2148,2149],{},"'about'"," still means ",[763,2152,2153],{},"\u002Fabout",[1022,2155,2156,2158,2159,780,2161,812,2163,2165],{},[763,2157,2081],{}," stays in the app. Only a locale's own ",[763,2160,1049],{},[763,2162,2105],{},[763,2164,2108],{}," leave it.",[1022,2167,2168,2169,2171,2172,1089,2174,2142,2176,812,2179,2182,2183,1059],{},"A link to a locale with a ",[763,2170,1049],{}," goes through ",[763,2173,783],{},[763,2175,308],{},[763,2177,2178],{},"\u003CNuxtLink :to=\"$localeRoute(x, 'fr')\">",[763,2180,2181],{},"router.push($localeRoute(x, 'fr'))"," stay paths of this app. In code use ",[763,2184,2185],{},"navigateTo($localePath(x, 'fr'), { external: true })",[1022,2187,2188,2191,2192,1059],{},[763,2189,2190],{},"$switchLocaleRoute"," and redirects follow ",[763,2193,2194],{},"trailingSlash",[1022,2196,2197,812,2199,2201,2202,2205,2206,2209],{},[763,2198,1098],{},[763,2200,291],{}," set on the server are dropped when a navigation changes the path, including ",[763,2203,2204],{},"\u002Fnews\u002F1"," to ",[763,2207,2208],{},"\u002Fnews\u002F4",": set them again on the new page.",[1022,2211,2212,2214,2215,2217],{},[763,2213,1098],{}," read in setup is bound to that page: a late call from a page already left does nothing. It has no setter, so stub ",[763,2216,283],{}," itself in tests.",[1022,2219,2220,2223],{},[763,2221,2222],{},"useI18n()"," returns one object per app. Writing to it reaches every caller.",[1022,2225,2226,2227,2230,2231,2234],{},"The dictionary, locale, params and head change when a navigation commits. A ",[763,2228,2229],{},"beforeResolve",", a ",[763,2232,2233],{},"beforeRouteEnter"," or a later global guard sees the old ones. Route middleware is unaffected.",[1022,2236,2237,2239],{},[763,2238,786],{}," restores the stored locale when its navigation is cancelled, under the URL strategies.",[1022,2241,2242,2244,2245,761,2248,1040,2251,2142,2254,2256,2257,1059],{},[763,2243,779],{}," interpolates a ",[763,2246,2247],{},"defaultValue",[763,2249,2250],{},"$t('missing', { n: 1 }, 'Got {n}')",[763,2252,2253],{},"Got 1",[763,2255,1272],{}," does too, and on an empty translation it answers ",[763,2258,2138],{},[1022,2260,2261,2264],{},[763,2262,2263],{},"$has(key, route)"," honours the route.",[1022,2266,2267,2269],{},[763,2268,1177],{}," reloads the current page's dictionary.",[1022,2271,2272,2273,2276,2277,2280],{},"A ",[763,2274,2275],{},"{param}"," placeholder reads only the params you pass: ",[763,2278,2279],{},"{constructor}"," stays as written.",[1022,2282,2283,2285,2286,2289],{},[763,2284,1272],{}," with a negative, fractional or huge count takes the last form with the real count. ",[763,2287,2288],{},"{ count: null }"," no longer throws, and a missing plural key reaches the missing handler.",[1022,2291,2292,1040,2294,2297,2298,1059],{},[763,2293,1302],{},[763,2295,2296],{},"Invalid Date"," for an invalid input. Under a second in the past is ",[763,2299,2300],{},"0 seconds ago",[1022,2302,2303,780,2305,812,2307,2309,2310,761,2312,2315,2316,2319,2320,2323,2324,2326,2327,2329,2330,2333],{},[763,2304,1296],{},[763,2306,1299],{},[763,2308,1302],{}," go by ",[763,2311,1306],{},[763,2313,2314],{},"{ code: 'en', iso: 'en-GB' }"," formats dates as ",[763,2317,2318],{},"31\u002F10\u002F2026",". A code ",[763,2321,2322],{},"Intl"," doesn't know formats as ",[763,2325,893],{},", and plurals by the index rule: set ",[763,2328,1306],{}," (",[763,2331,2332],{},"{ code: 'ua', iso: 'uk-UA' }",").",[1022,2335,2336,2338,2339,1059],{},[763,2337,1890],{}," is deprecated: use ",[763,2340,2341],{},"useLocaleServerMiddleware(event).current",[803,2343,2345],{"id":2344},"plurals","Plurals",[749,2347,2348,2349,2352,2353,780,2356,780,2359,780,2362,780,2365,2368,2369,1040,2372,812,2375,2037,2378,2380,2381,2383,2384,2386,2387,2389,2390,1059],{},"Templates keep their meaning, with one exception. A zero form with no placeholder, then one form per category, with ",[763,2350,2351],{},"{count}"," in each form several counts share, now goes by category in locales with three or more categories (",[763,2354,2355],{},"ru",[763,2357,2358],{},"uk",[763,2360,2361],{},"pl",[763,2363,2364],{},"cs",[763,2366,2367],{},"ar"," and others): ",[763,2370,2371],{},"none | {count} one | {count} few | {count} many",[763,2373,2374],{},"3 few",[763,2376,2377],{},"21 one",[763,2379,2358],{},". To use categories in any other template, add the ",[763,2382,1259],{}," marker. A custom ",[763,2385,1234],{}," rule reads the raw value, so a marked template reaches it with ",[763,2388,1259],{}," in place. See ",[789,2391,2393],{"href":2392},"\u002Fguide\u002Fupgrade#plurals-and-formatting","the table in Upgrading",[803,2395,299],{"id":301},[749,2397,2398],{},[752,2399,2400],{},[763,2401,304],{},[1019,2403,2404,2412,2415,2429,2458,2469,2478,2484,2498,2507,2514],{},[1022,2405,2406,1335,2409,2411],{},[763,2407,2408],{},"html",[763,2410,1338],{}," in every case and ignores all slots.",[1022,2413,2414],{},"A slot beats a param of the same name.",[1022,2416,2417,2420,2421,780,2423,780,2425,812,2427,1059],{},[763,2418,2419],{},"null"," means not set for ",[763,2422,1234],{},[763,2424,1237],{},[763,2426,1240],{},[763,2428,1243],{},[1022,2430,2431,2433,2434,1489,2436,761,2439,2442,2443,780,2445,2448,2449,780,2452,2448,2455,1059],{},[763,2432,1234],{}," counts like ",[763,2435,1272],{},[763,2437,2438],{},"Number",[763,2440,2441],{},"1.5"," stays ",[763,2444,2441],{},[763,2446,2447],{},"\"2 items\""," is ",[763,2450,2451],{},"NaN",[763,2453,2454],{},"\"\"",[763,2456,2457],{},"0",[1022,2459,2460,780,2462,812,2464,2466,2467,1059],{},[763,2461,1237],{},[763,2463,1240],{},[763,2465,1243],{}," keep ",[763,2468,1338],{},[1022,2470,2471,2474,2475,2477],{},[763,2472,2473],{},"hideIfEmpty"," applies in every branch, and ",[763,2476,2247],{}," stands in for a missing key in every branch.",[1022,2479,2480,2481,2483],{},"A missing key under ",[763,2482,2408],{}," is escaped text.",[1022,2485,2486,812,2488,2490,2491,2494,2495,1059],{},[763,2487,1240],{},[763,2489,1243],{}," output carries ",[763,2492,2493],{},"data-allow-mismatch=\"text\"",", and beside a named slot the text sits in its own ",[763,2496,2497],{},"\u003Cspan>",[1022,2499,2500,812,2503,2506],{},[763,2501,2502],{},".innerHTML",[763,2504,2505],{},"textContent"," attributes are dropped.",[1022,2508,2509,2510,2513],{},"It is a functional component: a ",[763,2511,2512],{},"ref"," on it gives no instance.",[1022,2515,2516,812,2518,2520,2521,2523],{},[763,2517,304],{},[763,2519,316],{}," read the active dictionary, as ",[763,2522,779],{}," does.",[749,2525,2526],{},[752,2527,2528],{},[763,2529,312],{},[1019,2531,2532,2546,2556,2576,2583],{},[1022,2533,2534,2535,2538,2539,2541,2542,2545],{},"A link is a plain ",[763,2536,2537],{},"\u003Ca>"," calling ",[763,2540,786],{},", so ",[763,2543,2544],{},"router-link-active"," classes are gone.",[1022,2547,2548,2549,1320,2552,2555],{},"The button is ",[763,2550,2551],{},"type=\"button\"",[763,2553,2554],{},"aria-expanded",". Escape and a click outside close the dropdown.",[1022,2557,2558,2559,780,2562,812,2565,2568,2569,1819,2572,2575],{},"New classes ",[763,2560,2561],{},"i18n-switcher-wrapper",[763,2563,2564],{},"i18n-switcher-dropdown",[763,2566,2567],{},"i18n-switcher-button",". Each link has ",[763,2570,2571],{},"lang",[763,2573,2574],{},"dir"," when the locale sets it.",[1022,2577,2578,2579,2582],{},"Default styles use logical CSS properties, and the dropdown has a larger ",[763,2580,2581],{},"z-index",", a minimum width and a shadow.",[1022,2584,2585,2586,2588],{},"The server rewrites its links when the render ends, on pages with params. A hand-written ",[763,2587,2093],{}," link isn't rewritten.",[749,2590,2591],{},[752,2592,2593],{},[763,2594,308],{},[1019,2596,2597,2621],{},[1022,2598,2599,780,2602,812,2604,2606,2607,2610,2611,2614,2615,2618,2619,1059],{},[763,2600,2601],{},"https:\u002F\u002F",[763,2603,2105],{},[763,2605,2108],{}," match in any case. A bare ",[763,2608,2609],{},"report.pdf"," is a route, and ",[763,2612,2613],{},"example.com"," stays external. A file ending that is also a TLD (",[763,2616,2617],{},"example.md",") counts as a file: write ",[763,2620,2601],{},[1022,2622,2623,2626],{},[763,2624,2625],{},"activeStyle"," ignores a trailing slash, the query and the hash.",[803,2628,2630],{"id":2629},"hooks-and-types","Hooks and Types",[1019,2632,2633,2642,2652,2661],{},[1022,2634,2635,2637,2638,2641],{},[763,2636,1535],{}," is a runtime hook: ",[763,2639,2640],{},"nuxtApp.hook('i18n:register', …)"," in a plugin.",[1022,2643,2644,2645,2648,2649,1059],{},"The exported type ",[763,2646,2647],{},"ModuleHooks"," is renamed ",[763,2650,2651],{},"ModuleRuntimeHooks",[1022,2653,2654,812,2657,2660],{},[763,2655,2656],{},"i18n:beforeLocaleSwitch",[763,2658,2659],{},"i18n:afterLocaleSwitch"," were never emitted and are no longer documented.",[1022,2662,2663,2666],{},[763,2664,2665],{},"ModuleOptionsExtend.isSSG"," is optional and deprecated: nothing sets it.",[803,2668,2670],{"id":2669},"urls-and-redirects","URLs and Redirects",[1019,2672,2673,2690,2713,2731,2750,2760,2770,2781,2788,2795,2808,2824,2833,2848,2859,2874,2892,2900,2917,2927,2943,2952,2960,2966,2983],{},[1022,2674,2675,2684,2685,1489,2687,2689],{},[752,2676,2677,812,2680,2683],{},[763,2678,2679],{},"\u002Fen",[763,2681,2682],{},"\u002Fen\u002F..."," are a 404"," under ",[763,2686,2020],{},[763,2688,893],{}," as the default.",[1022,2691,2692,2329,2695,2698,2699,2684,2702,812,2705,2708,2709,2712],{},[752,2693,2694],{},"A locale prefix in another case or spelling is a 404",[763,2696,2697],{},"\u002FDE\u002Fabout","). So are ",[763,2700,2701],{},"\u002FDE\u002Fx",[763,2703,2704],{},"[...slug]",[763,2706,2707],{},"\u002FDE"," beside ",[763,2710,2711],{},"[slug]",", so a CMS slug equal to a locale code in another case loses its page.",[1022,2714,2715,1320,2718,1089,2721,2142,2724,2726,2727,2730],{},[752,2716,2717],{},"An unknown URL stays a 404",[763,2719,2720],{},"autoDetectPath: '*'",[763,2722,2723],{},"'no_prefix'",[763,2725,1110],{}," keeps the redirect, as does ",[763,2728,2729],{},"\u002F"," everywhere.",[1022,2732,2733,2736,2737,2740,2741,2743,2744,2746,2747,2749],{},[752,2734,2735],{},"Another locale's custom path, unprefixed,"," is a ",[763,2738,2739],{},"302"," to the default locale's URL under ",[763,2742,2020],{},". Under ",[763,2745,1110],{}," the redirect now reaches a live page. ",[763,2748,2023],{}," stays a 404.",[1022,2751,2752,2759],{},[752,2753,2754,1320,2756],{},[763,2755,1110],{},[763,2757,2758],{},"redirects: false"," answers 404 on an unprefixed URL, including the original URL of a page with a custom default path.",[1022,2761,2762,2766,2767,2769],{},[752,2763,2764],{},[763,2765,2720],{}," applies the cookie and ",[763,2768,1126],{}," to unprefixed paths too.",[1022,2771,2772,2776,2777,2780],{},[752,2773,2003,2774],{},[763,2775,1110],{}," an unprefixed URL keeps the visitor's locale, on every path, whatever ",[763,2778,2779],{},"autoDetectPath"," says.",[1022,2782,2783,2787],{},[752,2784,2003,2785],{},[763,2786,2023],{}," an unprefixed URL is the default locale.",[1022,2789,2790,2794],{},[752,2791,2003,2792],{},[763,2793,2006],{}," a custom path renders its own locale, a restricted page renders in a locale it serves, and locales that share a path share one record.",[1022,2796,2797,2803,2804,2807],{},[752,2798,2272,2799,2802],{},[763,2800,2801],{},"routeRules"," redirect without a page"," is not localized: ",[763,2805,2806],{},"\u002Fde\u002Fold"," is a 404, it was an empty 200.",[1022,2809,2810,2813,2814,2816,2817,2820,2821,1059],{},[752,2811,2812],{},"Route rules reach custom paths,"," and are copied under ",[763,2815,2006],{}," too. A static sibling such as ",[763,2818,2819],{},"\u002Fde\u002Fartikel\u002Fnews"," matches ",[763,2822,2823],{},"\u002Fde\u002Fartikel\u002F:slug",[1022,2825,2826,2832],{},[752,2827,2828,2829],{},"A locale with ",[763,2830,2831],{},"disabled: true"," answers 404 on its prefix at once, and links to it stay on the page.",[1022,2834,2835,2736,2838,2840,2841,2844,2845,1059],{},[752,2836,2837],{},"A page path in another case",[763,2839,2739],{}," to its own spelling: ",[763,2842,2843],{},"\u002FT\u002FBASIC"," goes to ",[763,2846,2847],{},"\u002Ft\u002Fbasic",[1022,2849,2850,2736,2853,2855,2856,2858],{},[752,2851,2852],{},"The original URL of a page with a custom default path",[763,2854,2739],{}," to that path under ",[763,2857,2020],{},". It was a 404.",[1022,2860,2861,2865,2866,780,2868,2844,2870,2873],{},[752,2862,2863],{},[763,2864,1934],{}," goes by the visitor's locale: with cookie ",[763,2867,969],{},[763,2869,2153],{},[763,2871,2872],{},"\u002Fueber-uns",", not to the default locale's path.",[1022,2875,2876,2879,2880,2882,2883,761,2885,2888,2889,2891],{},[752,2877,2878],{},"A host's own prefix"," is a 404 on its ",[763,2881,815],{}," host under ",[763,2884,2020],{},[763,2886,2887],{},"\u002Fde\u002Fx"," on the ",[763,2890,969],{}," host was a 200.",[1022,2893,2894,2899],{},[752,2895,2896],{},[763,2897,2898],{},"customRegexMatcher"," no longer 404s a real page whose first segment looks like a locale.",[1022,2901,2902,2907,2908,2911,2912,2914,2915,1059],{},[752,2903,2904],{},[763,2905,2906],{},"nuxi generate"," prerenders every static page in each locale that serves it, unless a route rule sets ",[763,2909,2910],{},"prerender: false",": more files in the output. With ",[763,2913,1049],{},", run it once per domain with ",[763,2916,1039],{},[1022,2918,2919,2922,2923,2926],{},[752,2920,2921],{},"A client redirect keeps the mode of its navigation:"," a plain ",[763,2924,2925],{},"\u003CNuxtLink>"," adds a history entry.",[1022,2928,2929,2932,2933,2936,2937,2940,2941,1059],{},[752,2930,2931],{},"Localized route names are consistent."," Only code hard-coding ",[763,2934,2935],{},"localized-…"," names in ",[763,2938,2939],{},"router.push({ name })"," is affected: pass the page's own name to ",[763,2942,2090],{},[1022,2944,2945,2951],{},[752,2946,2947,2948],{},"Unnamed pages from ",[763,2949,2950],{},"extendPages"," are localized and get a name.",[1022,2953,2954,2959],{},[752,2955,2003,2956,2958],{},[763,2957,1110],{},", a link to another domain"," keeps the locale prefix.",[1022,2961,2962,2965],{},[752,2963,2964],{},"The home of a domain"," is written without a trailing slash everywhere.",[1022,2967,2968,2973,2974,2142,2976,2979,2980,1059],{},[752,2969,2970],{},[763,2971,2972],{},"?locale="," counts on pages only under ",[763,2975,2006],{},[763,2977,2978],{},"\u002Fabout?locale=de"," no longer renders German under ",[763,2981,2982],{},"lang=\"en\"",[1022,2984,2985,1446,2991,2993,2994,2996],{},[752,2986,2987,2988],{},"A plugin's ",[763,2989,2990],{},"setLocale('de')",[763,2992,2682],{}," no longer loads the ",[763,2995,969],{}," dictionary.",[803,2998,3000],{"id":2999},"seo-and-html-output","SEO and HTML Output",[1019,3002,3003,3023,3040,3049,3057,3066,3079,3089,3100,3109],{},[1022,3004,3005,3007,3008,3011,3012,3014,3015,3018,3019,1059],{},[763,3006,1523],{}," is no longer the default. A known RTL language gets ",[763,3009,3010],{},"dir=\"rtl\"",", and any other locale without ",[763,3013,2574],{}," gets no attribute. To keep the old output set ",[763,3016,3017],{},"dir: 'auto'",", at a parsing cost on large pages. See ",[789,3020,3022],{"href":3021},"\u002Fguide\u002Fseo#text-direction","Text direction",[1022,3024,3025,3028,3029,3031,3032,2142,3035,812,3037,3039],{},[763,3026,3027],{},"disableMeta"," now works: the page has no ",[763,3030,1069],{},", canonical or ",[763,3033,3034],{},"og:locale",[763,3036,2571],{},[763,3038,2574],{}," stay.",[1022,3041,3042,3044,3045,3048],{},[763,3043,1069],{}," lists only the locales that serve the page. ",[763,3046,3047],{},"x-default"," appears only when the default locale serves it.",[1022,3050,3051,3052,1089,3054,1059],{},"An unlocalized page has no ",[763,3053,1069],{},[763,3055,3056],{},"og:locale:alternate",[1022,3058,3059,3060,3063,3064,1059],{},"404 pages carry ",[763,3061,3062],{},"\u003Chtml lang dir>"," in the locale of the URL, and no canonical or ",[763,3065,1069],{},[1022,3067,3068,3069,812,3072,3074,3075,3078],{},"Canonical, ",[763,3070,3071],{},"og:url",[763,3073,1069],{}," keep a whitelisted query (",[763,3076,3077],{},"\u002Fabout?page=2","), on the server too.",[1022,3080,3081,3082,3084,3085,3088],{},"Canonical and ",[763,3083,1069],{}," include ",[763,3086,3087],{},"app.baseURL"," when the origin comes from the request.",[1022,3090,3091,3092,3095,3096,3099],{},"Every SSR page has ",[763,3093,3094],{},"\u003Clink rel=\"preload\" as=\"fetch\" crossorigin=\"anonymous\">"," for its dictionary files, 404 pages too. Allow it in a strict CSP. With ",[763,3097,3098],{},"apiBaseClientHost"," that host needs CORS.",[1022,3101,3102,3105,3106,3108],{},[763,3103,3104],{},"Vary"," is set on every page under ",[763,3107,2006],{},", and on the locale redirects of the other strategies. Check your CDN's cache key.",[1022,3110,3111],{},"The locale cookie is written only by a served page.",[803,3113,3115],{"id":3114},"detection-and-server","Detection and Server",[1019,3117,3118,3129,3149,3152,3163,3170,3185,3209,3220,3233,3240,3250],{},[1022,3119,3120,1127,3122,3124,3125,3128],{},[763,3121,1126],{},[763,3123,1130],{}," values, and ",[763,3126,3127],{},"q=0"," excludes a language.",[1022,3130,3131,812,3133,3135,3136,780,3139,3142,3143,812,3145,3148],{},[763,3132,1881],{},[763,3134,1884],{}," use one order on every route (",[763,3137,3138],{},"?locale",[763,3140,3141],{},"[locale]"," param or prefix, cookie, header, default), respect ",[763,3144,2010],{},[763,3146,3147],{},"autoDetectLanguage: false",", and cache a dictionary per locale.",[1022,3150,3151],{},"A malformed locale cookie is ignored and left as it is, instead of failing SSR.",[1022,3153,3154,3155,3158,3159,3162],{},"Hash mode reads only the ",[763,3156,3157],{},"hash-locale"," cookie. A lone ",[763,3160,3161],{},"user-locale=de"," no longer counts.",[1022,3164,3165,1139,3167,3169],{},[763,3166,1138],{},[763,3168,1142],{}," change routing.",[1022,3171,3172,1371,3178,3181,3182,3184],{},[752,3173,3174,3177],{},[763,3175,3176],{},"premerged"," output changed.",[763,3179,3180],{},"\u002F{apiBaseUrl}\u002F\u003Cpage>\u002F\u003Clocale>\u002Fdata.json"," holds only what differs from ",[763,3183,1193],{},". Anything that reads those files directly must merge the two. A full dictionary is still a valid file.",[1022,3186,3187,3193,3194,3197,3198,3200,3201,3204,3205,1059],{},[752,3188,3189,3190,1059],{},"Dictionaries follow ",[763,3191,3192],{},"app.cdnURL"," The browser fetches them from ",[763,3195,3196],{},"\u003CcdnURL>\u002F_locales\u002F...",", where it used ",[763,3199,3087],{},". The CDN must hold ",[763,3202,3203],{},"_locales\u002F"," and allow your site's origin. See ",[789,3206,3208],{"href":3207},"\u002Fguide\u002Fdeployment#app-baseurl-and-payload-hosts","App baseURL and payload hosts",[1022,3210,3211,3212,3215,3216,3219],{},"No Nitro route cache on ",[763,3213,3214],{},"\u002F{apiBaseUrl}\u002F**",", and the ",[763,3217,3218],{},"s-maxage=60, stale-while-revalidate"," header is gone. If you relied on that cache, put a CDN in front of the payload route.",[1022,3221,3222,3225,3226,3229,3230,1059],{},[763,3223,3224],{},"\u002F{apiBaseUrl}\u002F\u003Cpage without a folder>\u002F\u003Clocale>\u002Fdata.json"," answers with the root dictionary, it was ",[763,3227,3228],{},"{}",". A host's 404 now passes through as a 404, where it answered ",[763,3231,3232],{},"200 {}",[1022,3234,3235,3236,3239],{},"A prerender that cannot load its dictionary fails with a 500 and a warning, and with Nuxt's default ",[763,3237,3238],{},"failOnError"," the build exits 1.",[1022,3241,3242,3243,3246,3247,1059],{},"A changed translation without a rebuild reaches a browser only when ",[763,3244,3245],{},"v"," moves: set ",[763,3248,3249],{},"NUXT_I18N_DATE_BUILD",[1022,3251,3252,3253,3256,3257,3260],{},"SSR no longer requests ",[763,3254,3255],{},"\u002F{apiBaseUrl}"," over HTTP, unless ",[763,3258,3259],{},"apiBaseServerHost"," is set.",[803,3262,3264],{"id":3263},"translations","Translations",[1019,3266,3267,3270,3273,3282,3288,3291],{},[1022,3268,3269],{},"Merges are deep at every level, and fallback chains are followed to their end.",[1022,3271,3272],{},"Merging goes by locale: the active locale's root file beats a fallback locale's page file.",[1022,3274,3275,3276,3279,3280,1059],{},"A page without its own ",[763,3277,3278],{},"pages\u002F\u003Cname>\u002F"," folder reads the root dictionary in production. It used to get ",[763,3281,3228],{},[1022,3283,3284,3287],{},[763,3285,3286],{},"disablePageLocales: true"," reads the root files only.",[1022,3289,3290],{},"The leaving page's keys stop resolving after navigation. If a layout used keys only the previous page's file had, move them to the root file.",[1022,3292,3293],{},"A broken locale file warns once with its path in every mode. Dev used to throw.",[803,3295,3297,3300],{"id":3296},"i18n-micro-packages",[763,3298,3299],{},"@i18n-micro\u002F*"," Packages",[749,3302,3303,3304,3306,3307,3309,3310,3312],{},"Every ",[763,3305,3299],{}," package is at 2.0.0, ",[763,3308,677],{}," and the new ",[763,3311,1469],{}," included.",[749,3314,3315],{},[752,3316,3317,780,3319,780,3321],{},[763,3318,657],{},[763,3320,234],{},[763,3322,250],{},[1019,3324,3325,3345,3361,3391,3397,3409,3433,3443,3453,3461,3473],{},[1022,3326,3327,3328,761,3331,780,3334,3337,3338,2142,3341,3344],{},"Router adapters moved to ",[763,3329,3330],{},"\u002Frouter",[763,3332,3333],{},"createReactRouterAdapter",[763,3335,3336],{},"createSolidRouterAdapter",", and Preact's ",[763,3339,3340],{},"createBrowserHistoryAdapter",[763,3342,3343],{},"createPreactRouterAdapter"," is removed.",[1022,3346,3347,3349,3350,3352,3353,780,3356,812,3359,2506],{},[763,3348,1374],{}," follows ",[763,3351,304],{}," above. ",[763,3354,3355],{},"dangerouslySetInnerHTML",[763,3357,3358],{},"innerHTML",[763,3360,2505],{},[1022,3362,3363,3366,3367,3370,3371,780,3374,3377,3378,3381,3382,2142,3385,3388,3389,1059],{},[763,3364,3365],{},"I18nSwitcher"," renders ",[763,3368,3369],{},"\u003Ca href>"," items with ",[763,3372,3373],{},"aria-current=\"page\"",[763,3375,3376],{},"▾",", logical CSS and ",[763,3379,3380],{},"language-switcher"," on the button. No ",[763,3383,3384],{},"aria-haspopup",[763,3386,3387],{},"className"," adds to ",[763,3390,2561],{},[1022,3392,3393,3394,3396],{},"A link to ",[763,3395,2729],{}," or a locale root is active on an exact match only (React, Preact).",[1022,3398,3399,3401,3402,812,3405,3408],{},[763,3400,1403],{}," keeps a user ",[763,3403,3404],{},"onClick",[763,3406,3407],{},"style",", and leaves a modified click to the browser. Query and hash don't count for the active check. Without a router, no link is active.",[1022,3410,3411,3412,780,3415,812,3418,3421,3422,3425,3426,3429,3430,1059],{},"React and Preact: ",[763,3413,3414],{},"I18nLocalesContext",[763,3416,3417],{},"I18nDefaultLocaleContext",[763,3419,3420],{},"I18nRouterContext"," are one ",[763,3423,3424],{},"I18nConfigContext",". Solid: one ",[763,3427,3428],{},"I18nContext"," holds ",[763,3431,3432],{},"{ i18n, locales, defaultLocale, router }",[1022,3434,3435,3438,3439,3442],{},[763,3436,3437],{},"getCurrentPath"," of the adapters includes the query and hash, and a repeated key in ",[763,3440,3441],{},"getRoute().query"," is an array.",[1022,3444,3445,3446,3449,3450,3452],{},"A nested ",[763,3447,3448],{},"I18nProvider"," without ",[763,3451,2014],{}," keeps the outer instance, and a provider with no instance at all throws.",[1022,3454,3455,3458,3459,1059],{},[763,3456,3457],{},"defaultLocale()"," without a value is ",[763,3460,2031],{},[1022,3462,3463,3464,3467,3468,3470,3471,1059],{},"Solid: ",[763,3465,3466],{},"getCurrentPathAccessor"," is removed. ",[763,3469,2222],{}," no longer throws without ",[763,3472,1134],{},[1022,3474,3475,3476,3479,3480,3483],{},"React: ",[763,3477,3478],{},"use-sync-external-store"," is no longer a dependency, and ",[763,3481,3482],{},"react-dom"," is an optional peer.",[749,3485,3486],{},[752,3487,3488,780,3490],{},[763,3489,693],{},[763,3491,270],{},[1019,3493,3494,3499,3509,3530,3546,3555],{},[1022,3495,3496,3498],{},[763,3497,1374],{}," is a functional component.",[1022,3500,3501,812,3503,3505,3506,3508],{},[763,3502,3365],{},[763,3504,1403],{}," follow the sections above. ",[763,3507,3384],{}," is gone.",[1022,3510,3511,812,3513,3516,3517,780,3519,812,3521,3523,3524,3526,3527,2523],{},[763,3512,1403],{},[763,3514,3515],{},"createVueRouterAdapter"," resolve ",[763,3518,1407],{},[763,3520,1410],{},[763,3522,1413],{},". An unknown ",[763,3525,1407],{}," throws, as ",[763,3528,3529],{},"RouterLink",[1022,3531,3532,3534,3535,3538,3539,3541,3542,3545],{},[763,3533,295],{}," no longer builds ",[763,3536,3537],{},"\u002F\u002Fde\u002F",". Canonical and ",[763,3540,1069],{}," of one page agree (",[763,3543,3544],{},"\u002Fde","), and whitelisted query params reach them.",[1022,3547,3548,3551,3552,1059],{},[763,3549,3550],{},"I18nRoutingStrategy.resolvePath"," may get a location object and a path with a query and hash. New optional ",[763,3553,3554],{},"toHref",[1022,3556,3557,3558,812,3561,3564,3565,1059],{},"VitePress: links, the switcher, ",[763,3559,3560],{},"push",[763,3562,3563],{},"replace"," carry ",[763,3566,3567],{},"site.base",[749,3569,3570],{},[752,3571,3572],{},[763,3573,629],{},[1019,3575,3576,3599,3625,3638,3653,3665,3690,3708,3714,3724,3734,3748,3756,3772,3782,3814,3830],{},[1022,3577,3578,3580,3581,3584,3585,3588,3589,3592,3593,3595,3596,1059],{},[763,3579,1425],{}," bundles ",[763,3582,3583],{},"translationDir"," and installs the middleware: delete a ",[763,3586,3587],{},"src\u002Fmiddleware.ts"," that only copies the setup, or pass ",[763,3590,3591],{},"middleware: false",". A ",[763,3594,3587],{}," of your own passes ",[763,3597,3598],{},"base: config.base",[1022,3600,3601,3603,3604,780,3607,780,3609,812,3612,3615,3616,1089,3619,1489,3622,3624],{},[763,3602,1425],{}," throws on ",[763,3605,3606],{},"messages",[763,3608,1234],{},[763,3610,3611],{},"missingHandler",[763,3613,3614],{},"routingStrategy",": pass them to ",[763,3617,3618],{},"createI18n",[763,3620,3621],{},"createI18nMiddleware",[763,3623,3591],{},". Options that never did anything are off its type.",[1022,3626,3627,812,3630,3633,3634,3637],{},[763,3628,3629],{},"loadTranslationsFromDir",[763,3631,3632],{},"loadTranslationsIntoI18n"," moved to ",[763,3635,3636],{},"@i18n-micro\u002Fastro\u002Fnode",", which is ESM only.",[1022,3639,3640,780,3643,812,3646,3649,3650,1059],{},[763,3641,3642],{},"getGlobalRoutingStrategy",[763,3644,3645],{},"setGlobalRoutingStrategy",[763,3647,3648],{},"runWithRoutingStrategy"," are removed: read ",[763,3651,3652],{},"Astro.locals.routingStrategy",[1022,3654,3655,2448,3658,3215,3661,3664],{},[763,3656,3657],{},"clone()",[763,3659,3660],{},"fork()",[763,3662,3663],{},"_storage"," option is gone.",[1022,3666,3667,3668,2448,3671,3674,3675,3678,3679,2205,3682,3685,3686,3689],{},"Dynamic pages are one route: ",[763,3669,3670],{},"\u002Fblog\u002Fhello",[763,3672,3673],{},"blog-slug",", it was ",[763,3676,3677],{},"blog-hello",". Move ",[763,3680,3681],{},"pages\u002Fblog-hello\u002F",[763,3683,3684],{},"pages\u002Fblog-slug\u002F",". A custom ",[763,3687,3688],{},"getRouteName"," gets the pattern as a third argument.",[1022,3691,3692,3693,3696,3697,3699,3700,3703,3704,3707],{},"The URL decides the page locale. ",[763,3694,3695],{},"autoDetect"," is a 302 from ",[763,3698,2729],{}," to the preferred locale's home. New ",[763,3701,3702],{},"localeCookie"," option, and ",[763,3705,3706],{},"redirectToDefault"," is implemented.",[1022,3709,3710,3711,1059],{},"A page view from a same-origin page of another locale writes the locale cookie and doesn't redirect. Server islands and actions never redirect and carry ",[763,3712,3713],{},"Vary: Referer",[1022,3715,3716,3719,3720,3723],{},[763,3717,3718],{},"config.localeCodes"," leaves disabled locales out, and ",[763,3721,3722],{},"prepareLocaleRewrite"," answers 404 for them.",[1022,3725,3726,3729,3730,3733],{},[763,3727,3728],{},"getI18nProps()"," without keys sends everything ",[763,3731,3732],{},"t()"," can answer on the page, with a dev warning above 20 KB. Pass the keys the island uses.",[1022,3735,3736,3738,3739,2448,3741,3744,3745,1059],{},[763,3737,295],{},": default ",[763,3740,1049],{},[763,3742,3743],{},"site",", else root-relative. Links and metas carry ",[763,3746,3747],{},"id",[1022,3749,3750,1335,3753,3755],{},[763,3751,3752],{},"\u003CI18nT html>",[763,3754,1338],{},", and an empty translation renders empty.",[1022,3757,3758,812,3761,3764,3765,812,3768,3771],{},[763,3759,3760],{},"\u003CI18nLink>",[763,3762,3763],{},"localizePath"," leave external URLs, ",[763,3766,3767],{},"#hash",[763,3769,3770],{},"?query"," alone and keep a trailing slash.",[1022,3773,3774,3777,3778,3781],{},[763,3775,3776],{},"\u003CI18nSwitcher>"," keeps the query and uses ",[763,3779,3780],{},"data-i18n-switcher"," instead of generated ids.",[1022,3783,3784,3787,3788,812,3791,3794,3795,780,3798,780,3801,812,3804,2142,3807,3810,3811,3813],{},[763,3785,3786],{},"@i18n-micro\u002Fastro\u002Fclient"," only has ",[763,3789,3790],{},"translate",[763,3792,3793],{},"hasTranslation",": import adapters from ",[763,3796,3797],{},"\u002Fclient\u002Fvue",[763,3799,3800],{},"\u002Fclient\u002Freact",[763,3802,3803],{},"\u002Fclient\u002Fpreact",[763,3805,3806],{},"\u002Fclient\u002Fsvelte",[763,3808,3809],{},"client\u002Fvue"," needs ",[763,3812,274],{}," installed.",[1022,3815,3816,3817,3820,3821,2448,3824,2142,3826,3829],{},"Islands: ",[763,3818,3819],{},"has()"," is true for a subtree, ",[763,3822,3823],{},"t('')",[763,3825,2138],{},[763,3827,3828],{},"provideI18n"," takes a getter to follow new props.",[1022,3831,3832,812,3835,3838],{},[763,3833,3834],{},"getLocale",[763,3836,3837],{},"getDefaultLocale"," throw without the middleware.",[749,3840,3841],{},[752,3842,3843,780,3845],{},[763,3844,665],{},[763,3846,226],{},[1019,3848,3849,3852,3858,3864,3871],{},[1022,3850,3851],{},"A write to a locale that is neither active nor fallback doesn't notify subscribers.",[1022,3853,3854,3857],{},[763,3855,3856],{},"addRouteTranslations(locale, route, messages, false)"," replaces the chunk.",[1022,3859,3860,3863],{},[763,3861,3862],{},"loadFromUrls"," fetches in parallel and writes nothing if one fails.",[1022,3865,3866,3867,3870],{},"Node: ",[763,3868,3869],{},"reload()"," swaps dictionaries instead of emptying them first, and logs no success message. A directory that is gone keeps the old ones.",[1022,3872,3873,3874,1059],{},"Node, Astro, VitePress: one reader of a locales folder. A missing folder warns, a file that isn't a JSON object is reported and skipped, and messages start with ",[763,3875,3876],{},"[i18n]",[749,3878,3879],{},[752,3880,3881],{},[763,3882,673],{},[1019,3884,3885,3901],{},[1022,3886,3887,3888,3891,3892,2448,3895,780,3897,3900],{},"The mock follows the real translation rules: ",[763,3889,3890],{},"tc('a', 1.5)"," takes the last form, ",[763,3893,3894],{},"td('nope')",[763,3896,2296],{},[763,3898,3899],{},"t(miss, undefined, '')"," is the key, and a miss no longer logs.",[1022,3902,3903,3906,3907,1819,3910,3344],{},[763,3904,3905],{},"isolated"," is gone from ",[763,3908,3909],{},"createI18nTestContext",[763,3911,3912],{},".\u002Fpublish-smoke",[749,3914,3915],{},[752,3916,3917],{},[763,3918,681],{},[1019,3920,3921,3941,3956],{},[1022,3922,3923,3926,3927,780,3930,1089,3933,3936,3937,3940],{},[763,3924,3925],{},"I18nTypesPlugin(options)"," is a plain Vite and Rollup plugin: no ",[763,3928,3929],{},".vite()",[763,3931,3932],{},".webpack()",[763,3934,3935],{},".esbuild()",". For webpack or esbuild, call ",[763,3938,3939],{},"generateTypes"," in a script.",[1022,3942,3943,812,3946,3948,3949,812,3952,3955],{},[763,3944,3945],{},"getTypesString",[763,3947,3939],{}," are sync. ",[763,3950,3951],{},"flattenKeys",[763,3953,3954],{},"isPlainTranslationObject"," are removed.",[1022,3957,3958,3959,3961],{},"Keys are what ",[763,3960,3732],{}," reads: object paths are added, and files outside the locale layout are dropped.",[749,3963,3964],{},[752,3965,3966],{},[763,3967,637],{},[1019,3969,3970,3979,3982],{},[1022,3971,3972,3973,3975,3976,3978],{},"Saving accepts only an existing ",[763,3974,1358],{}," inside ",[763,3977,3583],{},", and no longer creates files. A cross-site request is a 403.",[1022,3980,3981],{},"A failed save to a reachable endpoint throws and rolls back.",[1022,3983,3984,1375,3987,3989,3990,1059],{},[763,3985,3986],{},"createBridge",[763,3988,1417],{}," option. Astro uses ",[763,3991,3992],{},"i18nDevToolsIntegration",[749,3994,3995],{},[752,3996,3997,780,3999,780,4001,780,4003],{},[763,3998,685],{},[763,4000,218],{},[763,4002,230],{},[763,4004,242],{},[749,4006,4007],{},"For custom adapters and tooling only.",[1019,4009,4010,4051,4089,4142],{},[1022,4011,4012,4014,4015,780,4018,780,4021,780,4024,812,4027,4030,4031,812,4034,4037,4038,2142,4041,812,4044,4047,4048,1059],{},[763,4013,266],{},": subpaths ",[763,4016,4017],{},".\u002Froute",[763,4019,4020],{},".\u002Froute-pattern",[763,4022,4023],{},".\u002Fbuild",[763,4025,4026],{},".\u002Fpayload-stats",[763,4028,4029],{},".\u002Fpayload-config"," are removed, along with ",[763,4032,4033],{},"resolveServerLocale",[763,4035,4036],{},"resolvePreferredLocale",": call ",[763,4039,4040],{},"resolveLocale",[763,4042,4043],{},"deepMergeTranslations",[763,4045,4046],{},"mergeRouteTranslationsWithRoot"," are gone: use ",[763,4049,4050],{},"deepMergeTranslationsRecursive",[1022,4052,4053,761,4055,4058,4059,780,4062,812,4065,4068,4069,4072,4073,4058,4076,812,4079,2142,4082,4085,4086,1059],{},[763,4054,218],{},[763,4056,4057],{},"TranslationHelper"," drops ",[763,4060,4061],{},"setCache",[763,4063,4064],{},"getGeneration",[763,4066,4067],{},"lookupIn"," (use ",[763,4070,4071],{},"lookup(chunkKey, key)","). ",[763,4074,4075],{},"BaseI18n",[763,4077,4078],{},"ensurePinnedChunk",[763,4080,4081],{},"invalidatePin",[763,4083,4084],{},"useTranslationHelper(storage)"," is gone: use ",[763,4087,4088],{},"new TranslationHelper(storage)",[1022,4090,4091,761,4093,4103,4104,4106,4107,780,4110,780,4113,812,4116,4119,4120,812,4123,2142,4126,3810,4129,2142,4132,4135,4136,4139,4140,1059],{},[763,4092,230],{},[752,4094,4095,4098,4099,4102],{},[763,4096,4097],{},"switchLocaleRoute(fromLocale, toLocale, route, options)"," is now ",[763,4100,4101],{},"switchLocaleRoute(toLocale, route, options)",". An old JavaScript call returns a wrong result with no error."," Nuxt's ",[763,4105,2190],{}," is not affected. The ",[763,4108,4109],{},"\u002Fprefix",[763,4111,4112],{},"\u002Fno-prefix",[763,4114,4115],{},"\u002Fprefix-except-default",[763,4117,4118],{},"\u002Fprefix-and-default"," entries are gone, as are ",[763,4121,4122],{},"getRedirect",[763,4124,4125],{},"getCanonicalPath",[763,4127,4128],{},"RouterAdapter",[763,4130,4131],{},"getRoutes",[763,4133,4134],{},"createPathStrategy"," builds no absolute URLs: use ",[763,4137,4138],{},"new DomainPathStrategy(ctx)"," when locales have ",[763,4141,1049],{},[1022,4143,4144,4146,4147,780,4150,780,4153,4156],{},[763,4145,242],{},": only ",[763,4148,4149],{},"RouteGenerator",[763,4151,4152],{},"generateRoutes",[763,4154,4155],{},"Rules"," and the path helpers are exported.",[798,4158,4160],{"id":4159},"migration","Migration",[4162,4163,4164,4169,4193,4221,4227,4244,4257,4269,4278,4281,4292,4306,4315],"ol",{},[1022,4165,4166,4167,1059],{},"Check the requirements: Nuxt 3.18, Node 20, and React 18 if you use ",[763,4168,657],{},[1022,4170,4171,4172,4174,4175,4177,4178,4180,4181,4183,4184,1320,4186,4188,4189,1059],{},"Update ",[763,4173,1904],{}," and every ",[763,4176,3299],{}," package together. Remove ",[763,4179,641],{},". Add ",[763,4182,673],{}," as a dev dependency if your tests import it. Replace ",[763,4185,1850],{},[763,4187,1469],{}," and follow ",[789,4190,4192],{"href":4191},"\u002Fguide\u002Fcli#moving-from-nuxt-i18n-micro-cli","its command table",[1022,4194,4195,4196,4199,4200,780,4202,780,4204,780,4206,4209,4210,4213,4214,1819,4216,1446,4219,1059],{},"Search your code for ",[763,4197,4198],{},"switchLocaleRoute("," from ",[763,4201,649],{},[763,4203,1864],{},[763,4205,1867],{},[763,4207,4208],{},"localized-"," route names, ",[763,4211,4212],{},"$getI18nConfig().globalLocaleRoutes"," and the other removed config keys, ",[763,4215,2647],{},[763,4217,4218],{},"@ts-expect-error",[763,4220,1535],{},[1022,4222,4223,4224,4226],{},"Move markup out of ",[763,4225,1334],{}," params into the translation, and pass data as params.",[1022,4228,4229,4230,4232,4233,4235,4236,4238,4239,4241,4242,1059],{},"If you set ",[763,4231,1049],{},": review links built with ",[763,4234,2090],{},", set ",[763,4237,1029],{}," behind a proxy, and run ",[763,4240,2906],{}," once per domain with ",[763,4243,1039],{},[1022,4245,4246,4247,2684,4249,4251,4252,4254,4255,1059],{},"Check your URLs against your strategy: ",[763,4248,2679],{},[763,4250,2020],{},", locale-like CMS slugs, ",[763,4253,2801],{}," redirects, and ",[763,4256,1977],{},[1022,4258,4259,4260,4262,4263,4265,4266,4268],{},"Check your CDN cache key for ",[763,4261,3104],{},", and allow the preload link in a strict CSP. With ",[763,4264,3192],{},", put ",[763,4267,3203],{}," on the CDN and allow CORS.",[1022,4270,4271,4272,4275,4276,1059],{},"If a tool reads ",[763,4273,4274],{},"\u002F_locales\u002F..."," files directly, merge the page file over ",[763,4277,1193],{},[1022,4279,4280],{},"If a global guard reads the locale or dictionary, confirm it can run before the navigation commits. Move keys that a layout took from the previous page's file into the root file.",[1022,4282,4283,4284,4286,4287,780,4289,4291],{},"Compare a ",[763,4285,2906],{}," output or a sitemap crawl before and after: ",[763,4288,1069],{},[763,4290,3047],{},", canonical and the page list change by design.",[1022,4293,4294,4295,4297,4298,4301,4302,4305],{},"Update imports for framework packages: ",[763,4296,3330],{}," for React, Solid and Preact adapters, ",[763,4299,4300],{},"\u002Fnode"," for Astro's loaders, and ",[763,4303,4304],{},"I18nTypesPlugin(o)"," for the types plugin.",[1022,4307,4308,4309,4311,4312,4314],{},"For Astro, delete a ",[763,4310,3587],{}," that only copies the setup, and rename ",[763,4313,3681],{}," style dictionaries to their pattern.",[1022,4316,4317,4318,780,4320,780,4323,4326],{},"Update tests that pinned ",[763,4319,2544],{},[763,4321,4322],{},"li button",[763,4324,4325],{},"▼",", or old mock behaviour.",[749,4328,4329,4330,1059],{},"Details and every edge case: ",[789,4331,20],{"href":21},[798,4333,4335],{"id":4334},"why-it-matters","Why It Matters",[1019,4337,4338,4344,4350,4356,4362],{},[1022,4339,4340,4343],{},[752,4341,4342],{},"Correct by construction:"," links, redirects and SEO tags come from the routes the app really has.",[1022,4345,4346,4349],{},[752,4347,4348],{},"One answer everywhere:"," a build, source mode and dev give the same dictionary, and every caller uses one detection order.",[1022,4351,4352,4355],{},[752,4353,4354],{},"Domains:"," one deployment for every locale domain, with no second build.",[1022,4357,4358,4361],{},[752,4359,4360],{},"Safer defaults:"," escaped params, bounded caches, links that stay on your origin.",[1022,4363,4364,4367],{},[752,4365,4366],{},"Less to ship:"," smaller dictionary files, smaller routing packages, and shared logic in one place.",[749,4369,4370,4371,4373,4374,1059],{},"For the full list of changes, see ",[789,4372,20],{"href":21}," and the ",[789,4375,4379],{"href":4376,"rel":4377},"https:\u002F\u002Fgithub.com\u002Fs00d\u002Fnuxt-i18n-micro\u002Fblob\u002Fmain\u002FCHANGELOG.md",[4378],"nofollow","changelog",[4381,4382],"hr",{},[3407,4384,4385],{},"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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":827,"searchDepth":855,"depth":855,"links":4387},[4388,4401,4402,4417,4418],{"id":800,"depth":855,"text":801,"children":4389},[4390,4391,4392,4393,4394,4395,4397,4398,4399,4400],{"id":805,"depth":867,"text":806},{"id":1062,"depth":867,"text":1063},{"id":1119,"depth":867,"text":1120},{"id":1148,"depth":867,"text":1149},{"id":1184,"depth":867,"text":1185},{"id":1222,"depth":867,"text":4396},"Better \u003Ci18n-t>, Plurals and Formats",{"id":1326,"depth":867,"text":1327},{"id":1362,"depth":867,"text":1363},{"id":1466,"depth":867,"text":1469},{"id":1502,"depth":867,"text":1503},{"id":1512,"depth":855,"text":1513},{"id":1807,"depth":855,"text":792,"children":4403},[4404,4405,4406,4408,4409,4410,4411,4412,4413,4414,4415],{"id":1810,"depth":867,"text":1811},{"id":1856,"depth":867,"text":1857},{"id":2062,"depth":867,"text":4407},"Composables and $ Methods",{"id":2344,"depth":867,"text":2345},{"id":301,"depth":867,"text":299},{"id":2629,"depth":867,"text":2630},{"id":2669,"depth":867,"text":2670},{"id":2999,"depth":867,"text":3000},{"id":3114,"depth":867,"text":3115},{"id":3263,"depth":867,"text":3264},{"id":3296,"depth":867,"text":4416},"@i18n-micro\u002F* Packages",{"id":4159,"depth":855,"text":4160},{"id":4334,"depth":855,"text":4335},"Release notes: v4.0.0 — One route model, one build for every domain, rewritten packages","md","2026-11-04T02:21:06+05:00",null,{},{"order":6},{"title":360,"description":4419},"JY2xCzH3i9Zmdvb_PUKqxS4Hu_csRrf_7s--EIowO2k",[4428,4430],{"title":355,"path":356,"description":4429},"Release notes: v4.1.0 — linked messages, a locale switch hook, runtime origins, server plurals and formats",{"title":364,"path":365,"description":4431},"Release notes: v3.24.0 — Node SSR from public\u002F, no Rollup raw:",1794131140519]