[{"data":1,"prerenderedAt":2662},["ShallowReactive",2],{"navigation":3,"v3-navigation":411,"\u002Fguide\u002Fperformance":738,"\u002Fguide\u002Fperformance-surround":2657},[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":94,"body":740,"description":2648,"extension":2649,"lastUpdated":2650,"links":2651,"meta":2652,"navigation":2654,"path":95,"seo":2655,"stem":96,"__hash__":2656},"docs\u002Fguide\u002Fperformance.md",{"type":741,"value":742,"toc":2629},"minimark",[743,747,761,766,822,826,835,838,978,994,998,1085,1091,1095,1102,1105,1135,1175,1178,1185,1210,1214,1228,1239,1248,1251,1323,1328,1335,1514,1518,1540,1671,1674,1684,1829,1836,1840,1855,2031,2137,2144,2147,2158,2287,2291,2297,2470,2474,2485,2525,2529,2536,2549,2597,2600,2610,2614,2625],[744,745,94],"h1",{"id":746},"performance-tuning",[748,749,750,751,755,756,760],"p",{},"The defaults are tuned for a typical app: one JSON payload per page and locale, translations kept off the HTML, bounded caches on the server. This page lists the few settings worth changing when a catalog is large, the server is memory-constrained, or payloads come from another host. For measured numbers against ",[752,753,754],"code",{},"@nuxtjs\u002Fi18n"," and plain Nuxt, see ",[757,758,759],"a",{"href":100},"Benchmarks",".",[762,763,765],"h2",{"id":764},"what-the-defaults-already-do","What the defaults already do",[767,768,769,785,794,816],"ul",{},[770,771,772,776,777,780,781,784],"li",{},[773,774,775],"strong",{},"One payload per page."," The build merges root, page and fallback-locale keys into ",[752,778,779],{},"\u002F_locales\u002F\u003Cpage>\u002F\u003Clocale>\u002Fdata.json",", so a page loads one file and ",[752,782,783],{},"$t"," is a single lookup.",[770,786,787,790,791,760],{},[773,788,789],{},"No dictionary in the HTML."," SSR keeps translations in server memory; the browser fetches the payload instead of parsing it from ",[752,792,793],{},"__NUXT_DATA__",[770,795,796,799,800,803,804,807,808,811,812,815],{},[773,797,798],{},"Browser cache."," ",[752,801,802],{},"?v="," changes only when translations do, so a browser keeps its payloads across deploys that did not touch them. A host's static copy is fresh for 60 seconds and revalidates after that: a repeat load waits for one ",[752,805,806],{},"304",". The server route answers ",[752,809,810],{},"immutable"," for a year (",[757,813,88],{"href":814},"\u002Fguide\u002Fdeployment#cache-headers-and-datebuild",").",[770,817,818,821],{},[773,819,820],{},"Bounded server memory."," The server caches at most 1000 payloads by default and drops the least recently used.",[762,823,825],{"id":824},"split-translations-by-page","Split translations by page",[748,827,828,829,832,833,760],{},"Keys used on one page belong in ",[752,830,831],{},"locales\u002Fpages\u002F\u003Cpage>\u002F\u003Clocale>.json",", not in the root files: root keys are part of every page's payload. See ",[757,834,30],{"href":31},[748,836,837],{},"Two settings change this split:",[839,840,845],"pre",{"className":841,"code":842,"language":843,"meta":844,"style":844},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-i18n-micro'],\n  i18n: {\n    \u002F\u002F pages that show the same keys share one payload: \u002Fde\u002Fproducts\u002F123 loads the products payload\n    routesLocaleLinks: { 'products-id': 'products' },\n    \u002F\u002F or: no page files at all, every page loads only the root dictionary\n    \u002F\u002F disablePageLocales: true,\n  },\n})\n","ts","",[752,846,847,855,877,905,916,922,953,959,965,970],{"__ignoreMap":844},[848,849,851],"span",{"class":850,"line":353},"line",[848,852,854],{"class":853},"sHwdD","\u002F\u002F nuxt.config.ts\n",[848,856,858,862,865,869,873],{"class":850,"line":857},2,[848,859,861],{"class":860},"s7zQu","export",[848,863,864],{"class":860}," default",[848,866,868],{"class":867},"s2Zo4"," defineNuxtConfig",[848,870,872],{"class":871},"sTEyZ","(",[848,874,876],{"class":875},"sMK4o","{\n",[848,878,880,884,887,890,893,897,899,902],{"class":850,"line":879},3,[848,881,883],{"class":882},"swJcz","  modules",[848,885,886],{"class":875},":",[848,888,889],{"class":871}," [",[848,891,892],{"class":875},"'",[848,894,896],{"class":895},"sfazB","nuxt-i18n-micro",[848,898,892],{"class":875},[848,900,901],{"class":871},"]",[848,903,904],{"class":875},",\n",[848,906,908,911,913],{"class":850,"line":907},4,[848,909,910],{"class":882},"  i18n",[848,912,886],{"class":875},[848,914,915],{"class":875}," {\n",[848,917,919],{"class":850,"line":918},5,[848,920,921],{"class":853},"    \u002F\u002F pages that show the same keys share one payload: \u002Fde\u002Fproducts\u002F123 loads the products payload\n",[848,923,925,928,930,933,936,939,941,943,945,948,950],{"class":850,"line":924},6,[848,926,927],{"class":882},"    routesLocaleLinks",[848,929,886],{"class":875},[848,931,932],{"class":875}," {",[848,934,935],{"class":875}," '",[848,937,938],{"class":882},"products-id",[848,940,892],{"class":875},[848,942,886],{"class":875},[848,944,935],{"class":875},[848,946,947],{"class":895},"products",[848,949,892],{"class":875},[848,951,952],{"class":875}," },\n",[848,954,956],{"class":850,"line":955},7,[848,957,958],{"class":853},"    \u002F\u002F or: no page files at all, every page loads only the root dictionary\n",[848,960,962],{"class":850,"line":961},8,[848,963,964],{"class":853},"    \u002F\u002F disablePageLocales: true,\n",[848,966,967],{"class":850,"line":358},[848,968,969],{"class":875},"  },\n",[848,971,972,975],{"class":850,"line":6},[848,973,974],{"class":875},"}",[848,976,977],{"class":871},")\n",[748,979,980,986,987,993],{},[757,981,983],{"href":982},"\u002Fapi\u002Fmodule-options#routeslocalelinks",[752,984,985],{},"routesLocaleLinks"," cuts duplicate payloads for related routes. ",[757,988,990],{"href":989},"\u002Fapi\u002Fmodule-options#disablepagelocales",[752,991,992],{},"disablePageLocales"," suits small apps where one dictionary per locale is simpler.",[762,995,997],{"id":996},"server-caches","Server caches",[999,1000,1001,1017],"table",{},[1002,1003,1004],"thead",{},[1005,1006,1007,1011,1014],"tr",{},[1008,1009,1010],"th",{},"Setting",[1008,1012,1013],{},"Default",[1008,1015,1016],{},"Effect",[1018,1019,1020,1042,1066],"tbody",{},[1005,1021,1022,1031,1036],{},[1023,1024,1025],"td",{},[757,1026,1028],{"href":1027},"\u002Fapi\u002Fmodule-options#cachemaxsize",[752,1029,1030],{},"cacheMaxSize",[1023,1032,1033],{},[752,1034,1035],{},"0",[1023,1037,1038,1039,1041],{},"Max entries in the payload caches. ",[752,1040,1035],{}," = no limit in the browser, 1000 on the server.",[1005,1043,1044,1052,1056],{},[1023,1045,1046],{},[757,1047,1049],{"href":1048},"\u002Fapi\u002Fmodule-options#cachettl",[752,1050,1051],{},"cacheTtl",[1023,1053,1054],{},[752,1055,1035],{},[1023,1057,1058,1059,1061,1062,1065],{},"Seconds before a cached entry is reloaded. ",[752,1060,1035],{}," = never; set it when payloads come from ",[752,1063,1064],{},"apiBaseServerHost"," and change without a redeploy.",[1005,1067,1068,1073,1078],{},[1023,1069,1070],{},[752,1071,1072],{},"serverTranslationPreload",[1023,1074,1075],{},[752,1076,1077],{},"false",[1023,1079,1080,1081,1084],{},"Load the ",[752,1082,1083],{},"index"," payload in the Nitro middleware for every page request, so server helpers and the home page reuse it.",[748,1086,1087,1088,1090],{},"Lower ",[752,1089,1030],{}," on a small instance with many pages × locales. Locally edited translations never need a TTL: dev reads files live, production payloads change only with a deploy.",[762,1092,1094],{"id":1093},"memory-on-a-node-server","Memory on a Node server",[748,1096,1097,1098,1101],{},"Under steady load a Node server can sit at about 12 times its live heap and stay there. On a stress test of 100k keys per page, a live heap of 90 MB ran at about 1.1 GB of RSS. This is not a leak. After one oversized GC cycle V8 raises its heap limit, and it keeps the freed pages in a pool for reuse while load lasts. About 8 seconds after load stops the pool empties and RSS falls to about 160 MB. ",[752,1099,1100],{},"global.gc()"," does not return this memory. Plain Nuxt without the module does the same, scaled to its smaller heap.",[748,1103,1104],{},"It costs headroom: with a memory limit below that level and no heap cap, the process can be killed. Set a cap that fits your limit and sits well above the live heap:",[839,1106,1110],{"className":1107,"code":1108,"language":1109,"meta":844,"style":844},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","NODE_OPTIONS=--max-old-space-size=512 node .output\u002Fserver\u002Findex.mjs\n","bash",[752,1111,1112],{"__ignoreMap":844},[848,1113,1114,1117,1120,1123,1125,1128,1132],{"class":850,"line":353},[848,1115,1116],{"class":871},"NODE_OPTIONS",[848,1118,1119],{"class":875},"=",[848,1121,1122],{"class":871},"--max-old-space-size",[848,1124,1119],{"class":875},[848,1126,1127],{"class":895},"512",[848,1129,1131],{"class":1130},"sBMFI"," node",[848,1133,1134],{"class":895}," .output\u002Fserver\u002Findex.mjs\n",[999,1136,1137,1151],{},[1002,1138,1139],{},[1005,1140,1141,1144,1146],{},[1008,1142,1143],{},"100k keys, 12 locales, 5 to 30 minutes of load",[1008,1145,1013],{},[1008,1147,1148],{},[752,1149,1150],{},"--max-old-space-size=512",[1018,1152,1153,1164],{},[1005,1154,1155,1158,1161],{},[1023,1156,1157],{},"RSS under load",[1023,1159,1160],{},"about 1,150 MB",[1023,1162,1163],{},"254-287 MB",[1005,1165,1166,1169,1172],{},[1023,1167,1168],{},"Requests per second",[1023,1170,1171],{},"624",[1023,1173,1174],{},"517-572",[748,1176,1177],{},"So the cap trades 8 to 10 % of throughput for the memory. A catalog of ordinary size has a smaller heap and a smaller step. These runs were on macOS with Node 22, not in a container.",[762,1179,1181,1182],{"id":1180},"parse-time-and-dir","Parse time and ",[752,1183,1184],{},"dir",[748,1186,1187,1190,1191,1194,1195,1197,1198,1201,1202,1205,1206,815],{},[752,1188,1189],{},"dir: 'auto'"," on a locale makes the browser work out the direction from the content while it parses. In Chromium, DOMContentLoaded at 20,000 elements was about 1.1 s with ",[752,1192,1193],{},"dir=\"auto\""," and 0.1 s without it, and at 5,000 elements about 130 ms against 45 ms. Leave ",[752,1196,1184],{}," unset or set it to ",[752,1199,1200],{},"ltr"," or ",[752,1203,1204],{},"rtl"," (",[757,1207,1209],{"href":1208},"\u002Fguide\u002Fseo#text-direction","Text direction",[762,1211,1213],{"id":1212},"shared-cache-for-several-instances","Shared cache for several instances",[748,1215,1216,1217,1223,1224,1227],{},"With several instances of one build, ",[757,1218,1220],{"href":1219},"\u002Fapi\u002Fmodule-options#cachestorage",[752,1221,1222],{},"cacheStorage"," gives them one dictionary cache in any Nitro storage, on the connection your app configures in ",[752,1225,1226],{},"nitro.storage",". The module adds no connector and no dependency.",[748,1229,1230,1233,1234,1236,1237,760],{},[773,1231,1232],{},"It is a cache, not a source."," Translations come from the embedded or public payloads, or from ",[752,1235,1064],{},". Only what came from the source is written, and keys carry the build, so a store you fill by hand is not read. To serve translations from KV or a database, put a small route that reads it at ",[752,1238,1064],{},[748,1240,1241,1244,1245,1247],{},[773,1242,1243],{},"When it helps."," Only with a remote ",[752,1246,1064],{},". Three instances walking 39 dictionaries made 117 requests to the host without it and 48 with it. With files on disk a store hit is no faster than the file, and a first pass over 12 pages took 280-296 ms without the option and 308-325 ms with a filled Redis, so leave it unset. On a preset that embeds dictionaries it does nothing without a host, and the build says so.",[748,1249,1250],{},"A cold dictionary, one client, one walk each, so rough, and most of it is the distance to the host:",[999,1252,1253,1266],{},[1002,1254,1255],{},[1005,1256,1257,1260,1263],{},[1008,1258,1259],{},"Store",[1008,1261,1262],{},"From the host",[1008,1264,1265],{},"From the store",[1018,1267,1268,1279,1290,1301,1312],{},[1005,1269,1270,1273,1276],{},[1023,1271,1272],{},"Cloudflare KV",[1023,1274,1275],{},"about 300 ms",[1023,1277,1278],{},"about 110 ms",[1005,1280,1281,1284,1287],{},[1023,1282,1283],{},"D1",[1023,1285,1286],{},"about 230 ms",[1023,1288,1289],{},"about 115 ms",[1005,1291,1292,1295,1298],{},[1023,1293,1294],{},"Deno KV",[1023,1296,1297],{},"about 430 ms",[1023,1299,1300],{},"about 100 ms",[1005,1302,1303,1306,1309],{},[1023,1304,1305],{},"Upstash, Vercel serverless",[1023,1307,1308],{},"about 445 ms",[1023,1310,1311],{},"about 245 ms",[1005,1313,1314,1317,1320],{},[1023,1315,1316],{},"Upstash, Vercel Edge",[1023,1318,1319],{},"about 505 ms",[1023,1321,1322],{},"about 235 ms",[1324,1325,1327],"h3",{"id":1326},"redis","Redis",[748,1329,1330,1331,1334],{},"Needs ",[752,1332,1333],{},"ioredis"," in your project.",[839,1336,1338],{"className":841,"code":1337,"language":843,"meta":844,"style":844},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-i18n-micro'],\n  nitro: {\n    storage: {\n      redis: { driver: 'redis', url: process.env.REDIS_URL },\n    },\n  },\n  i18n: {\n    cacheStorage: 'redis', \u002F\u002F the mount name\n    apiBaseServerHost: 'https:\u002F\u002Ftranslations.internal',\n    cacheTtl: 300,\n  },\n})\n",[752,1339,1340,1344,1356,1374,1383,1392,1436,1441,1445,1453,1471,1488,1502,1507],{"__ignoreMap":844},[848,1341,1342],{"class":850,"line":353},[848,1343,854],{"class":853},[848,1345,1346,1348,1350,1352,1354],{"class":850,"line":857},[848,1347,861],{"class":860},[848,1349,864],{"class":860},[848,1351,868],{"class":867},[848,1353,872],{"class":871},[848,1355,876],{"class":875},[848,1357,1358,1360,1362,1364,1366,1368,1370,1372],{"class":850,"line":879},[848,1359,883],{"class":882},[848,1361,886],{"class":875},[848,1363,889],{"class":871},[848,1365,892],{"class":875},[848,1367,896],{"class":895},[848,1369,892],{"class":875},[848,1371,901],{"class":871},[848,1373,904],{"class":875},[848,1375,1376,1379,1381],{"class":850,"line":907},[848,1377,1378],{"class":882},"  nitro",[848,1380,886],{"class":875},[848,1382,915],{"class":875},[848,1384,1385,1388,1390],{"class":850,"line":918},[848,1386,1387],{"class":882},"    storage",[848,1389,886],{"class":875},[848,1391,915],{"class":875},[848,1393,1394,1397,1399,1401,1404,1406,1408,1410,1412,1415,1418,1420,1423,1425,1428,1430,1433],{"class":850,"line":924},[848,1395,1396],{"class":882},"      redis",[848,1398,886],{"class":875},[848,1400,932],{"class":875},[848,1402,1403],{"class":882}," driver",[848,1405,886],{"class":875},[848,1407,935],{"class":875},[848,1409,1326],{"class":895},[848,1411,892],{"class":875},[848,1413,1414],{"class":875},",",[848,1416,1417],{"class":882}," url",[848,1419,886],{"class":875},[848,1421,1422],{"class":871}," process",[848,1424,760],{"class":875},[848,1426,1427],{"class":871},"env",[848,1429,760],{"class":875},[848,1431,1432],{"class":871},"REDIS_URL ",[848,1434,1435],{"class":875},"},\n",[848,1437,1438],{"class":850,"line":955},[848,1439,1440],{"class":875},"    },\n",[848,1442,1443],{"class":850,"line":961},[848,1444,969],{"class":875},[848,1446,1447,1449,1451],{"class":850,"line":358},[848,1448,910],{"class":882},[848,1450,886],{"class":875},[848,1452,915],{"class":875},[848,1454,1455,1458,1460,1462,1464,1466,1468],{"class":850,"line":6},[848,1456,1457],{"class":882},"    cacheStorage",[848,1459,886],{"class":875},[848,1461,935],{"class":875},[848,1463,1326],{"class":895},[848,1465,892],{"class":875},[848,1467,1414],{"class":875},[848,1469,1470],{"class":853}," \u002F\u002F the mount name\n",[848,1472,1474,1477,1479,1481,1484,1486],{"class":850,"line":1473},11,[848,1475,1476],{"class":882},"    apiBaseServerHost",[848,1478,886],{"class":875},[848,1480,935],{"class":875},[848,1482,1483],{"class":895},"https:\u002F\u002Ftranslations.internal",[848,1485,892],{"class":875},[848,1487,904],{"class":875},[848,1489,1491,1494,1496,1500],{"class":850,"line":1490},12,[848,1492,1493],{"class":882},"    cacheTtl",[848,1495,886],{"class":875},[848,1497,1499],{"class":1498},"sbssI"," 300",[848,1501,904],{"class":875},[848,1503,1505],{"class":850,"line":1504},13,[848,1506,969],{"class":875},[848,1508,1510,1512],{"class":850,"line":1509},14,[848,1511,974],{"class":875},[848,1513,977],{"class":871},[1324,1515,1517],{"id":1516},"upstash-on-vercel-and-vercel-edge","Upstash on Vercel and Vercel Edge",[748,1519,1520,1521,1524,1525,1527,1528,1531,1532,1535,1536,1539],{},"Use the ",[752,1522,1523],{},"upstash"," driver on both: it talks REST, where the ",[752,1526,1326],{}," driver needs TCP. It needs ",[752,1529,1530],{},"@upstash\u002Fredis"," in your project, and reads ",[752,1533,1534],{},"UPSTASH_REDIS_REST_URL"," and ",[752,1537,1538],{},"UPSTASH_REDIS_REST_TOKEN"," from the environment.",[839,1541,1543],{"className":841,"code":1542,"language":843,"meta":844,"style":844},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-i18n-micro'],\n  nitro: {\n    storage: {\n      upstash: { driver: 'upstash' },\n    },\n  },\n  i18n: {\n    cacheStorage: 'upstash',\n    apiBaseServerHost: 'https:\u002F\u002Ftranslations.example.com',\n  },\n})\n",[752,1544,1545,1549,1561,1579,1587,1595,1616,1620,1624,1632,1646,1661,1665],{"__ignoreMap":844},[848,1546,1547],{"class":850,"line":353},[848,1548,854],{"class":853},[848,1550,1551,1553,1555,1557,1559],{"class":850,"line":857},[848,1552,861],{"class":860},[848,1554,864],{"class":860},[848,1556,868],{"class":867},[848,1558,872],{"class":871},[848,1560,876],{"class":875},[848,1562,1563,1565,1567,1569,1571,1573,1575,1577],{"class":850,"line":879},[848,1564,883],{"class":882},[848,1566,886],{"class":875},[848,1568,889],{"class":871},[848,1570,892],{"class":875},[848,1572,896],{"class":895},[848,1574,892],{"class":875},[848,1576,901],{"class":871},[848,1578,904],{"class":875},[848,1580,1581,1583,1585],{"class":850,"line":907},[848,1582,1378],{"class":882},[848,1584,886],{"class":875},[848,1586,915],{"class":875},[848,1588,1589,1591,1593],{"class":850,"line":918},[848,1590,1387],{"class":882},[848,1592,886],{"class":875},[848,1594,915],{"class":875},[848,1596,1597,1600,1602,1604,1606,1608,1610,1612,1614],{"class":850,"line":924},[848,1598,1599],{"class":882},"      upstash",[848,1601,886],{"class":875},[848,1603,932],{"class":875},[848,1605,1403],{"class":882},[848,1607,886],{"class":875},[848,1609,935],{"class":875},[848,1611,1523],{"class":895},[848,1613,892],{"class":875},[848,1615,952],{"class":875},[848,1617,1618],{"class":850,"line":955},[848,1619,1440],{"class":875},[848,1621,1622],{"class":850,"line":961},[848,1623,969],{"class":875},[848,1625,1626,1628,1630],{"class":850,"line":358},[848,1627,910],{"class":882},[848,1629,886],{"class":875},[848,1631,915],{"class":875},[848,1633,1634,1636,1638,1640,1642,1644],{"class":850,"line":6},[848,1635,1457],{"class":882},[848,1637,886],{"class":875},[848,1639,935],{"class":875},[848,1641,1523],{"class":895},[848,1643,892],{"class":875},[848,1645,904],{"class":875},[848,1647,1648,1650,1652,1654,1657,1659],{"class":850,"line":1473},[848,1649,1476],{"class":882},[848,1651,886],{"class":875},[848,1653,935],{"class":875},[848,1655,1656],{"class":895},"https:\u002F\u002Ftranslations.example.com",[848,1658,892],{"class":875},[848,1660,904],{"class":875},[848,1662,1663],{"class":850,"line":1490},[848,1664,969],{"class":875},[848,1666,1667,1669],{"class":850,"line":1504},[848,1668,974],{"class":875},[848,1670,977],{"class":871},[1324,1672,1272],{"id":1673},"cloudflare-kv",[748,1675,1676,1677,1205,1680,1683],{},"Bind a namespace to the Worker as ",[752,1678,1679],{},"I18N_KV",[752,1681,1682],{},"kv_namespaces"," in its wrangler config).",[839,1685,1687],{"className":841,"code":1686,"language":843,"meta":844,"style":844},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-i18n-micro'],\n  nitro: {\n    storage: {\n      kv: { driver: 'cloudflare-kv-binding', binding: 'I18N_KV' },\n    },\n  },\n  i18n: {\n    cacheStorage: 'kv',\n    apiBaseServerHost: 'https:\u002F\u002Ftranslations.example.com',\n  },\n})\n",[752,1688,1689,1693,1705,1723,1731,1739,1774,1778,1782,1790,1805,1819,1823],{"__ignoreMap":844},[848,1690,1691],{"class":850,"line":353},[848,1692,854],{"class":853},[848,1694,1695,1697,1699,1701,1703],{"class":850,"line":857},[848,1696,861],{"class":860},[848,1698,864],{"class":860},[848,1700,868],{"class":867},[848,1702,872],{"class":871},[848,1704,876],{"class":875},[848,1706,1707,1709,1711,1713,1715,1717,1719,1721],{"class":850,"line":879},[848,1708,883],{"class":882},[848,1710,886],{"class":875},[848,1712,889],{"class":871},[848,1714,892],{"class":875},[848,1716,896],{"class":895},[848,1718,892],{"class":875},[848,1720,901],{"class":871},[848,1722,904],{"class":875},[848,1724,1725,1727,1729],{"class":850,"line":907},[848,1726,1378],{"class":882},[848,1728,886],{"class":875},[848,1730,915],{"class":875},[848,1732,1733,1735,1737],{"class":850,"line":918},[848,1734,1387],{"class":882},[848,1736,886],{"class":875},[848,1738,915],{"class":875},[848,1740,1741,1744,1746,1748,1750,1752,1754,1757,1759,1761,1764,1766,1768,1770,1772],{"class":850,"line":924},[848,1742,1743],{"class":882},"      kv",[848,1745,886],{"class":875},[848,1747,932],{"class":875},[848,1749,1403],{"class":882},[848,1751,886],{"class":875},[848,1753,935],{"class":875},[848,1755,1756],{"class":895},"cloudflare-kv-binding",[848,1758,892],{"class":875},[848,1760,1414],{"class":875},[848,1762,1763],{"class":882}," binding",[848,1765,886],{"class":875},[848,1767,935],{"class":875},[848,1769,1679],{"class":895},[848,1771,892],{"class":875},[848,1773,952],{"class":875},[848,1775,1776],{"class":850,"line":955},[848,1777,1440],{"class":875},[848,1779,1780],{"class":850,"line":961},[848,1781,969],{"class":875},[848,1783,1784,1786,1788],{"class":850,"line":358},[848,1785,910],{"class":882},[848,1787,886],{"class":875},[848,1789,915],{"class":875},[848,1791,1792,1794,1796,1798,1801,1803],{"class":850,"line":6},[848,1793,1457],{"class":882},[848,1795,886],{"class":875},[848,1797,935],{"class":875},[848,1799,1800],{"class":895},"kv",[848,1802,892],{"class":875},[848,1804,904],{"class":875},[848,1806,1807,1809,1811,1813,1815,1817],{"class":850,"line":1473},[848,1808,1476],{"class":882},[848,1810,886],{"class":875},[848,1812,935],{"class":875},[848,1814,1656],{"class":895},[848,1816,892],{"class":875},[848,1818,904],{"class":875},[848,1820,1821],{"class":850,"line":1490},[848,1822,969],{"class":875},[848,1824,1825,1827],{"class":850,"line":1504},[848,1826,974],{"class":875},[848,1828,977],{"class":871},[748,1830,1831,1832,1835],{},"A host that is another Worker on the same account needs the ",[752,1833,1834],{},"global_fetch_strictly_public"," compatibility flag, or the fetch does not reach it.",[1324,1837,1839],{"id":1838},"cloudflare-d1","Cloudflare D1",[748,1841,1842,1844,1845,1205,1848,1851,1852,1334],{},[752,1843,1226],{}," cannot hold a database object, so a Nitro plugin mounts the driver. The mount is checked on first use, so that is early enough. Bind the database as ",[752,1846,1847],{},"I18N_DB",[752,1849,1850],{},"d1_databases",") and have ",[752,1853,1854],{},"unstorage",[839,1856,1858],{"className":841,"code":1857,"language":843,"meta":844,"style":844},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-i18n-micro'],\n  nitro: {\n    experimental: { database: true },\n    database: {\n      default: { connector: 'cloudflare-d1', options: { bindingName: 'I18N_DB' } },\n    },\n  },\n  i18n: {\n    cacheStorage: 'd1',\n    apiBaseServerHost: 'https:\u002F\u002Ftranslations.example.com',\n  },\n})\n",[752,1859,1860,1864,1876,1894,1902,1922,1931,1976,1980,1984,1992,2007,2021,2025],{"__ignoreMap":844},[848,1861,1862],{"class":850,"line":353},[848,1863,854],{"class":853},[848,1865,1866,1868,1870,1872,1874],{"class":850,"line":857},[848,1867,861],{"class":860},[848,1869,864],{"class":860},[848,1871,868],{"class":867},[848,1873,872],{"class":871},[848,1875,876],{"class":875},[848,1877,1878,1880,1882,1884,1886,1888,1890,1892],{"class":850,"line":879},[848,1879,883],{"class":882},[848,1881,886],{"class":875},[848,1883,889],{"class":871},[848,1885,892],{"class":875},[848,1887,896],{"class":895},[848,1889,892],{"class":875},[848,1891,901],{"class":871},[848,1893,904],{"class":875},[848,1895,1896,1898,1900],{"class":850,"line":907},[848,1897,1378],{"class":882},[848,1899,886],{"class":875},[848,1901,915],{"class":875},[848,1903,1904,1907,1909,1911,1914,1916,1920],{"class":850,"line":918},[848,1905,1906],{"class":882},"    experimental",[848,1908,886],{"class":875},[848,1910,932],{"class":875},[848,1912,1913],{"class":882}," database",[848,1915,886],{"class":875},[848,1917,1919],{"class":1918},"sfNiH"," true",[848,1921,952],{"class":875},[848,1923,1924,1927,1929],{"class":850,"line":924},[848,1925,1926],{"class":882},"    database",[848,1928,886],{"class":875},[848,1930,915],{"class":875},[848,1932,1933,1936,1938,1940,1943,1945,1947,1949,1951,1953,1956,1958,1960,1963,1965,1967,1969,1971,1974],{"class":850,"line":955},[848,1934,1935],{"class":882},"      default",[848,1937,886],{"class":875},[848,1939,932],{"class":875},[848,1941,1942],{"class":882}," connector",[848,1944,886],{"class":875},[848,1946,935],{"class":875},[848,1948,1838],{"class":895},[848,1950,892],{"class":875},[848,1952,1414],{"class":875},[848,1954,1955],{"class":882}," options",[848,1957,886],{"class":875},[848,1959,932],{"class":875},[848,1961,1962],{"class":882}," bindingName",[848,1964,886],{"class":875},[848,1966,935],{"class":875},[848,1968,1847],{"class":895},[848,1970,892],{"class":875},[848,1972,1973],{"class":875}," }",[848,1975,952],{"class":875},[848,1977,1978],{"class":850,"line":961},[848,1979,1440],{"class":875},[848,1981,1982],{"class":850,"line":358},[848,1983,969],{"class":875},[848,1985,1986,1988,1990],{"class":850,"line":6},[848,1987,910],{"class":882},[848,1989,886],{"class":875},[848,1991,915],{"class":875},[848,1993,1994,1996,1998,2000,2003,2005],{"class":850,"line":1473},[848,1995,1457],{"class":882},[848,1997,886],{"class":875},[848,1999,935],{"class":875},[848,2001,2002],{"class":895},"d1",[848,2004,892],{"class":875},[848,2006,904],{"class":875},[848,2008,2009,2011,2013,2015,2017,2019],{"class":850,"line":1490},[848,2010,1476],{"class":882},[848,2012,886],{"class":875},[848,2014,935],{"class":875},[848,2016,1656],{"class":895},[848,2018,892],{"class":875},[848,2020,904],{"class":875},[848,2022,2023],{"class":850,"line":1504},[848,2024,969],{"class":875},[848,2026,2027,2029],{"class":850,"line":1509},[848,2028,974],{"class":875},[848,2030,977],{"class":871},[839,2032,2034],{"className":841,"code":2033,"language":843,"meta":844,"style":844},"\u002F\u002F server\u002Fplugins\u002Fi18n-storage.ts\nimport dbDriver from 'unstorage\u002Fdrivers\u002Fdb0'\n\nexport default defineNitroPlugin(() => {\n  useStorage().mount('d1', dbDriver({ database: useDatabase() }))\n})\n",[752,2035,2036,2041,2060,2066,2086,2131],{"__ignoreMap":844},[848,2037,2038],{"class":850,"line":353},[848,2039,2040],{"class":853},"\u002F\u002F server\u002Fplugins\u002Fi18n-storage.ts\n",[848,2042,2043,2046,2049,2052,2054,2057],{"class":850,"line":857},[848,2044,2045],{"class":860},"import",[848,2047,2048],{"class":871}," dbDriver ",[848,2050,2051],{"class":860},"from",[848,2053,935],{"class":875},[848,2055,2056],{"class":895},"unstorage\u002Fdrivers\u002Fdb0",[848,2058,2059],{"class":875},"'\n",[848,2061,2062],{"class":850,"line":879},[848,2063,2065],{"emptyLinePlaceholder":2064},true,"\n",[848,2067,2068,2070,2072,2075,2077,2080,2084],{"class":850,"line":907},[848,2069,861],{"class":860},[848,2071,864],{"class":860},[848,2073,2074],{"class":867}," defineNitroPlugin",[848,2076,872],{"class":871},[848,2078,2079],{"class":875},"()",[848,2081,2083],{"class":2082},"spNyl"," =>",[848,2085,915],{"class":875},[848,2087,2088,2091,2093,2095,2098,2100,2102,2104,2106,2108,2111,2113,2116,2118,2120,2123,2126,2128],{"class":850,"line":918},[848,2089,2090],{"class":867},"  useStorage",[848,2092,2079],{"class":882},[848,2094,760],{"class":875},[848,2096,2097],{"class":867},"mount",[848,2099,872],{"class":882},[848,2101,892],{"class":875},[848,2103,2002],{"class":895},[848,2105,892],{"class":875},[848,2107,1414],{"class":875},[848,2109,2110],{"class":867}," dbDriver",[848,2112,872],{"class":882},[848,2114,2115],{"class":875},"{",[848,2117,1913],{"class":882},[848,2119,886],{"class":875},[848,2121,2122],{"class":867}," useDatabase",[848,2124,2125],{"class":882},"() ",[848,2127,974],{"class":875},[848,2129,2130],{"class":882},"))\n",[848,2132,2133,2135],{"class":850,"line":924},[848,2134,974],{"class":875},[848,2136,977],{"class":871},[748,2138,2139,2140,2143],{},"The ",[752,2141,2142],{},"db0"," driver is marked experimental and ignores the TTL: rows of old builds stay until you delete them.",[1324,2145,1294],{"id":2146},"deno-kv",[748,2148,2149,2150,2153,2154,2157],{},"On Deno Deploy, provision a database (",[752,2151,2152],{},"deno deploy database provision \u003Cname> --kind denokv","), assign it to the app (",[752,2155,2156],{},"deno deploy database assign","), and use the driver:",[839,2159,2161],{"className":841,"code":2160,"language":843,"meta":844,"style":844},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-i18n-micro'],\n  nitro: {\n    storage: {\n      kv: { driver: 'deno-kv' },\n    },\n  },\n  i18n: {\n    cacheStorage: 'kv',\n    apiBaseServerHost: 'https:\u002F\u002Ftranslations.example.com',\n  },\n})\n",[752,2162,2163,2167,2179,2197,2205,2213,2233,2237,2241,2249,2263,2277,2281],{"__ignoreMap":844},[848,2164,2165],{"class":850,"line":353},[848,2166,854],{"class":853},[848,2168,2169,2171,2173,2175,2177],{"class":850,"line":857},[848,2170,861],{"class":860},[848,2172,864],{"class":860},[848,2174,868],{"class":867},[848,2176,872],{"class":871},[848,2178,876],{"class":875},[848,2180,2181,2183,2185,2187,2189,2191,2193,2195],{"class":850,"line":879},[848,2182,883],{"class":882},[848,2184,886],{"class":875},[848,2186,889],{"class":871},[848,2188,892],{"class":875},[848,2190,896],{"class":895},[848,2192,892],{"class":875},[848,2194,901],{"class":871},[848,2196,904],{"class":875},[848,2198,2199,2201,2203],{"class":850,"line":907},[848,2200,1378],{"class":882},[848,2202,886],{"class":875},[848,2204,915],{"class":875},[848,2206,2207,2209,2211],{"class":850,"line":918},[848,2208,1387],{"class":882},[848,2210,886],{"class":875},[848,2212,915],{"class":875},[848,2214,2215,2217,2219,2221,2223,2225,2227,2229,2231],{"class":850,"line":924},[848,2216,1743],{"class":882},[848,2218,886],{"class":875},[848,2220,932],{"class":875},[848,2222,1403],{"class":882},[848,2224,886],{"class":875},[848,2226,935],{"class":875},[848,2228,2146],{"class":895},[848,2230,892],{"class":875},[848,2232,952],{"class":875},[848,2234,2235],{"class":850,"line":955},[848,2236,1440],{"class":875},[848,2238,2239],{"class":850,"line":961},[848,2240,969],{"class":875},[848,2242,2243,2245,2247],{"class":850,"line":358},[848,2244,910],{"class":882},[848,2246,886],{"class":875},[848,2248,915],{"class":875},[848,2250,2251,2253,2255,2257,2259,2261],{"class":850,"line":6},[848,2252,1457],{"class":882},[848,2254,886],{"class":875},[848,2256,935],{"class":875},[848,2258,1800],{"class":895},[848,2260,892],{"class":875},[848,2262,904],{"class":875},[848,2264,2265,2267,2269,2271,2273,2275],{"class":850,"line":1473},[848,2266,1476],{"class":882},[848,2268,886],{"class":875},[848,2270,935],{"class":875},[848,2272,1656],{"class":895},[848,2274,892],{"class":875},[848,2276,904],{"class":875},[848,2278,2279],{"class":850,"line":1490},[848,2280,969],{"class":875},[848,2282,2283,2285],{"class":850,"line":1504},[848,2284,974],{"class":875},[848,2286,977],{"class":871},[1324,2288,2290],{"id":2289},"how-it-behaves","How it behaves",[748,2292,2293,2294,2296],{},"A dictionary is looked up in the instance's own cache, then in the shared storage, then at its source. The instance's own cache stays, because ",[752,2295,783],{}," is synchronous and needs the tree in memory: this separates who fetches from who serves, it does not save memory.",[767,2298,2299,2305,2311,2337,2354,2379,2401,2425,2431,2439,2445,2459],{},[770,2300,2301,2304],{},[773,2302,2303],{},"Who fetches."," With a remote host, one fetch from the backend per dictionary instead of one per instance. Instances that miss at the same moment each fetch it, because there is no lock.",[770,2306,2307,2310],{},[773,2308,2309],{},"Pages without their own dictionary"," are not stored, so that made-up page names cannot add keys. Each instance fetches such a page from the host once, and on Workers, where isolates come and go, that is a steady trickle.",[770,2312,2313,2316,2317,2325,2326,2329,2330,2332,2333,2336],{},[773,2314,2315],{},"The host is down."," Pages with a stored dictionary work. A page with none renders from the stored root dictionary, its own keys raw, with ",[757,2318,2320,2321,2324],{"href":2319},"\u002Fguide\u002Fdeployment#when-a-dictionary-cannot-be-read","a ",[752,2322,2323],{},"503"," no cache keeps",", and ",[752,2327,2328],{},"\u002F_locales"," answers ",[752,2331,2323],{}," for it until the host is back. ",[752,2334,2335],{},"useTranslationServerMiddleware"," answers keys for a dictionary it cannot read.",[770,2338,2339,2342,2343,2346,2347,2349,2350,2353],{},[773,2340,2341],{},"The host"," is ",[752,2344,2345],{},"NUXT_I18N_APP_BASE_SERVER_HOST"," at runtime, or else ",[752,2348,1064],{}," from the build, the same as without the option. On a preset that embeds dictionaries (Cloudflare, Vercel, Netlify, see ",[757,2351,88],{"href":2352},"\u002Fguide\u002Fdeployment#serverless-and-edge",") the layer applies only with a host: the data is already in the bundle, and a copy in KV would be a network read for what memory holds.",[770,2355,2356,2359,2360,2363,2364,2372,2373,1535,2375,2378],{},[773,2357,2358],{},"Keys"," are ",[752,2361,2362],{},"i18n-micro:\u003CbuildId>~\u003CdateBuild>~\u003CfallbackLocale>~\u003Chost>:\u003Clocale>:\u003Cpage>",", so two builds in a rolling deploy never read each other, and neither do two backends of one artifact. Each instance must come from one build (one artifact, or a pinned Nuxt ",[757,2365,2369],{"href":2366,"rel":2367},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fnuxt-config#buildid",[2368],"nofollow",[752,2370,2371],{},"buildId","); instances built separately simply do not share. With a pinned ",[752,2374,2371],{},[752,2376,2377],{},"dateBuild: 0",", two different builds do share keys. Only enabled locales are looked up, and page names over 200 characters skip the layer.",[770,2380,2381,2384,2385,2388,2389,2391,2392,2394,2395,2397,2398,2400],{},[773,2382,2383],{},"What is stored."," A dictionary is compared with the root one (",[752,2386,2387],{},"__root",") before it is written, and goes in only when it holds every root key and differs from the root. So a made-up page answered with the root adds no key, and neither does a 200 error body on a page. Each instance reads such a page from the source once. A host must answer unknown pages with the root, an empty object or a 404, and serve ",[752,2390,2387],{},". A host without ",[752,2393,2387],{},", or one that serves pages without the root keys, shares nothing. If the host answers ",[752,2396,2387],{}," itself with a well-formed error, that is stored: keep ",[752,2399,1051],{}," short when the backend can do that.",[770,2402,2403,2406,2407,2409,2410,2342,2412,2414,2415,2417,2418,2420,2421,2424],{},[773,2404,2405],{},"Expiry."," An entry expires ",[752,2408,1051],{}," seconds after it was written, or after one day when ",[752,2411,1051],{},[752,2413,1035],{},", so keys of old builds cannot pile up. A value can stay in an instance's own cache for another ",[752,2416,1051],{},", and in the render's chunk cache for one more: backend changes show within three times ",[752,2419,1051],{},". Drivers without expiry (",[752,2422,2423],{},"fs",") keep old keys until you remove them.",[770,2426,2427,2430],{},[773,2428,2429],{},"When the storage fails"," the page does not. A read may take 1 second, which covers a connection handshake and a Cloudflare KV key that is cold at that location. After a failure the limit is 250 ms until the store answers again. Three failures in a row close the layer for 5 seconds. While it is closed, and while a read has just failed, nothing is written. A failed write closes nothing, so a read-only replica keeps serving reads. A store whose answers take longer than these limits counts as failing: a miss, and the dictionary comes from its source. With ioredis that starts near 400 ms per command, because its handshake takes three round trips. The module logs one warning per minute; ioredis prints its own errors on top of that. A value that is not a dictionary counts as a miss and is overwritten. An unknown mount name warns once on first use; the app then runs without the layer.",[770,2432,2433,2436,2437,760],{},[773,2434,2435],{},"When the source fails"," nothing keeps the failure. A failed fetch or an unreadable file reaches no cache, this one or the instance's own, and the next request reads again. See ",[757,2438,88],{"href":2319},[770,2440,2441,2444],{},[773,2442,2443],{},"Off in dev and in prerender",", which read their files and must not need your production Redis.",[770,2446,2447,2450,2451,2454,2455,2458],{},[773,2448,2449],{},"Invalidation."," There is no purge call: a new build uses new keys. To refresh a running build at once, remove the ",[752,2452,2453],{},"i18n-micro:"," keys from the storage and restart the instances. ",[752,2456,2457],{},"clearCache"," and HMR only touch process state.",[770,2460,2461,2462,2465,2466,2469],{},"Runtime changes (",[752,2463,2464],{},"$mergeTranslations",", ",[752,2467,2468],{},"$defineI18nRoute",") stay in the render or the browser that made them and are never written to the storage.",[762,2471,2473],{"id":2472},"payload-size","Payload size",[748,2475,2476,2477,2480,2481,2484],{},"The build warns when the payload output passes ",[752,2478,2479],{},"translationPayloads.warnFileCount"," (500 files) or ",[752,2482,2483],{},"warnSizeBytes"," (10 MB). When it does:",[767,2486,2487,2490,2496,2510],{},[770,2488,2489],{},"move page-only keys out of the root files;",[770,2491,2492,2493,2495],{},"link routes that show the same keys (",[752,2494,985],{},");",[770,2497,2498,2499,2502,2503,2505,2506,2495],{},"on serverless or Edge, use ",[752,2500,2501],{},"translationPayloads.mode: 'source'"," so the server bundle embeds compact sources instead of every page × locale (",[757,2504,88],{"href":2352},"). An Edge build warns on its own past the platform's limit (",[757,2507,2509],{"href":2508},"\u002Fguide\u002Fdeployment#bundle-limits-on-edge","Bundle limits",[770,2511,2512,2513,2516,2517,2520,2521,2524],{},"enable ",[752,2514,2515],{},"nitro.compressPublicAssets"," for ",[752,2518,2519],{},".gz"," \u002F ",[752,2522,2523],{},".br"," copies of the static payloads.",[762,2526,2528],{"id":2527},"measuring","Measuring",[748,2530,2531,2532,2535],{},"The repository tracks what the playground ships with ",[752,2533,2534],{},"pnpm run budget:payload","; the current numbers:",[748,2537,2538,2539,2542,2543,2465,2546,886],{},"Measured on ",[752,2540,2541],{},"playground"," across ",[752,2544,2545],{},"\u002F",[752,2547,2548],{},"\u002Fde",[999,2550,2551,2561],{},[1002,2552,2553],{},[1005,2554,2555,2558],{},[1008,2556,2557],{},"Measurement",[1008,2559,2560],{},"Size",[1018,2562,2563,2571,2579,2589],{},[1005,2564,2565,2568],{},[1023,2566,2567],{},"Translation sources on disk",[1023,2569,2570],{},"7.8 MB",[1005,2572,2573,2576],{},[1023,2574,2575],{},"Served as separate payload files",[1023,2577,2578],{},"23.9 MB",[1005,2580,2581,2586],{},[1023,2582,2583,2584],{},"Largest inline ",[752,2585,793],{},[1023,2587,2588],{},"0.4 KB",[1005,2590,2591,2594],{},[1023,2592,2593],{},"Client assets",[1023,2595,2596],{},"624.4 KB",[748,2598,2599],{},"The playground is a test bench with generated dictionaries of up to 100k keys, so these are not figures to expect from a real\napplication — they are a fixed point to measure against. The budget fails when they grow unexpectedly,\nwhich is how an accidental change to what the payload carries gets noticed.",[748,2601,2602,2603,2606,2607,760],{},"Run the benchmark suite yourself with ",[752,2604,2605],{},"pnpm test:performance","; how it works is in the ",[757,2608,2609],{"href":344},"benchmark methodology",[762,2611,2613],{"id":2612},"related","Related",[2615,2616,2617,2621,2623],"card-group",{},[2618,2619],"card",{"icon":2620,"title":759,"to":100},"i-lucide-book-open",[2618,2622],{"icon":2620,"title":88,"to":89},[2618,2624],{"icon":2620,"title":30,"to":31},[2626,2627,2628],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":844,"searchDepth":857,"depth":857,"links":2630},[2631,2632,2633,2634,2635,2637,2645,2646,2647],{"id":764,"depth":857,"text":765},{"id":824,"depth":857,"text":825},{"id":996,"depth":857,"text":997},{"id":1093,"depth":857,"text":1094},{"id":1180,"depth":857,"text":2636},"Parse time and dir",{"id":1212,"depth":857,"text":1213,"children":2638},[2639,2640,2641,2642,2643,2644],{"id":1326,"depth":879,"text":1327},{"id":1516,"depth":879,"text":1517},{"id":1673,"depth":879,"text":1272},{"id":1838,"depth":879,"text":1839},{"id":2146,"depth":879,"text":1294},{"id":2289,"depth":879,"text":2290},{"id":2472,"depth":857,"text":2473},{"id":2527,"depth":857,"text":2528},{"id":2612,"depth":857,"text":2613},"The settings that change memory, payload size and caching, and how to measure what your app ships.","md","2026-11-04T19:28:55+05:00",null,{"outline":2653},[857,879],{"order":97,"group":92},{"title":94,"description":2648},"wahG4Qik1SLReG4kGTlEojpnsYHuo0ElrtW9_7Y99B4",[2658,2660],{"title":88,"path":89,"description":2659},"Deploy to a Node server, serverless or Edge, or as a static site — where translation payloads go, what each platform needs, proxies, and caching.",{"title":99,"path":100,"description":2661},"Benchmarks vs nuxt-i18n on real fixtures.",1794131153978]