[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-homepage":3,"footer-settings":84,"main-navigation":220,"footer-integrations":903,"blog-post-nav-nav":1816,"blog-post-nav-[USE LATEST FEATURED]":1838,"blog-localize-nextjs-app-next-intl-localazy":1860},{"status":4,"header_badges":5,"footer_badges":27,"footer_secured_badges":34,"slider_badges":48},"published",[6,15,21],{"id":7,"status":4,"sort":8,"link":9,"title":10,"badgeType":11,"badgeName":12,"metadata":8,"image":13},1,null,"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Flocalazy\u002Freviews","Best meets requirements","Other","G2-winter-24-best-meets-requirments",{"id":14},"8d5dd6fd-6995-4c92-8219-a6ed5ba6acdc",{"id":16,"status":4,"sort":8,"link":9,"title":17,"badgeType":11,"badgeName":18,"metadata":8,"image":19},2,"Best support","G2-winter-24-best-support",{"id":20},"e59dd465-84d9-45c7-987d-dd4048fd6992",{"id":22,"status":4,"sort":8,"link":9,"title":23,"badgeType":11,"badgeName":24,"metadata":8,"image":25},3,"Easiest admin","G2-winter-24-easiest-admin",{"id":26},"5f12c4c8-bec0-47cf-87b4-a4502e9f1bd2",[28],{"id":29,"status":4,"sort":8,"link":9,"title":30,"badgeType":11,"badgeName":31,"metadata":8,"image":32},12,"Users love us","Users love us 25",{"id":33},"232416a5-86ba-4be6-85a5-b88802003d53",[35,42],{"id":36,"status":4,"sort":8,"link":37,"title":38,"badgeType":11,"badgeName":39,"metadata":8,"image":40},11,"https:\u002F\u002Fsprinto.com\u002Fget-iso-27001\u002F","Sprinto ISO 27001","Sprinto ISO 27001 certificate",{"id":41},"c1c6c06c-6caf-4b78-8a7e-9606c395eb61",{"id":43,"status":4,"sort":8,"link":44,"title":45,"badgeType":11,"badgeName":45,"metadata":8,"image":46},13,"https:\u002F\u002Fwww.aicpa.org\u002Fsoc4so","SOC certificate",{"id":47},"4f4bc0a6-09a0-41df-8295-8f990d96d941",[49,56,61,66,71,76,82],{"id":50,"status":4,"sort":8,"link":9,"title":51,"badgeType":11,"badgeName":52,"metadata":53,"image":54},5,"Most likely to recommend","a","",{"id":55},"da055731-3f11-4fc7-96f2-c11c0b84c831",{"id":57,"status":4,"sort":8,"link":9,"title":58,"badgeType":11,"badgeName":8,"metadata":8,"image":59},6,"EMEA High Performer",{"id":60},"586fb488-81f2-41db-a4e8-ef309e50c0e6",{"id":62,"status":4,"sort":8,"link":9,"title":63,"badgeType":11,"badgeName":8,"metadata":8,"image":64},7,"Ease of Doing Business With",{"id":65},"bfa26865-430e-463d-9886-cb56a8a8ecf6",{"id":67,"status":4,"sort":8,"link":9,"title":68,"badgeType":11,"badgeName":8,"metadata":8,"image":69},8,"High Performer",{"id":70},"2cc1ba0f-c23a-4c97-ad4a-a655c97466fe",{"id":72,"status":4,"sort":8,"link":9,"title":73,"badgeType":11,"badgeName":8,"metadata":8,"image":74},9,"Fastest Implementation",{"id":75},"6f297758-1c95-45f4-a6e9-528319897132",{"id":77,"status":4,"sort":8,"link":78,"title":79,"badgeType":11,"badgeName":8,"metadata":8,"image":80},10,"https:\u002F\u002Fwww.intercert.com\u002Fservices\u002Fgovernance-risk-compliance\u002Fiso-iec-27001","Intercert ISO 27001",{"id":81},"0521a5f1-e1f2-4da6-a2bc-dc92773f2a7b",{"id":36,"status":4,"sort":8,"link":37,"title":38,"badgeType":11,"badgeName":39,"metadata":8,"image":83},{"id":41},{"id":7,"status":4,"security_section_title":85,"loved_section_title":86,"columns":87,"social_links":180,"policy_links":210},"Secured & trusted","Loved by users",[88,102,119,141,145],{"id":7,"status":4,"sort":8,"title":89,"column_key":90,"links":91},"Localazy","connect",[92,95,98],{"id":36,"status":4,"sort":7,"title":93,"url":94},"Book a demo","___LOCALAZY_MEETING_URL___",{"id":29,"status":4,"sort":16,"title":96,"url":97},"Contact","\u002Fcontact",{"id":99,"status":4,"sort":22,"title":100,"url":101},21,"About us","\u002Fabout-us",{"id":16,"status":4,"sort":8,"title":103,"column_key":104,"links":105},"Programs","programs",[106,110,113,116],{"id":7,"status":4,"sort":107,"title":108,"url":109},4,"Partner Program","\u002Fpartnership",{"id":16,"status":4,"sort":50,"title":111,"url":112},"Ambassador Program","\u002Fambassador",{"id":22,"status":4,"sort":57,"title":114,"url":115},"Startup Program","\u002Ffor\u002Fstartups",{"id":107,"status":4,"sort":62,"title":117,"url":118},"Nonprofits","\u002Ffor\u002Fnonprofit",{"id":22,"status":4,"sort":8,"title":120,"column_key":121,"links":122},"Use Cases","use_cases",[123,126,129,132,135,138],{"id":50,"status":4,"sort":67,"title":124,"url":125},"Software Localization","\u002Fterm\u002Fsoftware-localization",{"id":57,"status":4,"sort":72,"title":127,"url":128},"Machine Translation Services","\u002Ffeatures\u002Fmachine-translation",{"id":62,"status":4,"sort":77,"title":130,"url":131},"Translation API","\u002Ffeatures\u002Ftranslation-api",{"id":67,"status":4,"sort":36,"title":133,"url":134},"Crowdsourced Translations","\u002Ffeatures\u002Fshare-tm",{"id":72,"status":4,"sort":29,"title":136,"url":137},"Figma i18n & localization","\u002Ffeatures\u002Ffigma-localization-plugin",{"id":77,"status":4,"sort":43,"title":139,"url":140},"Translation as a Service","\u002Fterm\u002Ftranslation-service",{"id":107,"status":4,"sort":8,"title":142,"column_key":143,"links":144},"Integrations","integrations",[],{"id":50,"status":4,"sort":8,"title":146,"column_key":147,"links":148},"Resources","resources",[149,153,157,161,165,169,173,177],{"id":43,"status":4,"sort":150,"title":151,"url":152},14,"Documentation","\u002Fdocs",{"id":150,"status":4,"sort":154,"title":155,"url":156},15,"Dictionary","\u002Fdictionary",{"id":154,"status":4,"sort":158,"title":159,"url":160},16,"Case Studies","\u002Fcase-study",{"id":158,"status":4,"sort":162,"title":163,"url":164},17,"Discussion forum","___DISCUSS_URL___",{"id":162,"status":4,"sort":166,"title":167,"url":168},18,"Localization Blog","\u002Fblog",{"id":166,"status":4,"sort":170,"title":171,"url":172},19,"FAQ","\u002Ffaq",{"id":170,"status":4,"sort":174,"title":175,"url":176},20,"Pricing","\u002Fpricing",{"id":174,"status":4,"sort":99,"title":178,"url":179},"Brand assets","https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1tZqsZHBlGelz7A2FwTsiwrs4j3sd9HTk",[181,186,191,196,201,206],{"id":7,"status":4,"sort":8,"platform":182,"icon":183,"url":184,"label":185},"feed","rss","\u002Ffeed.xml","Localazy RSS Feed",{"id":16,"status":4,"sort":8,"platform":187,"icon":188,"url":189,"label":190},"facebook","fb-logo","https:\u002F\u002Fwww.facebook.com\u002Flocalazy\u002F","Localazy facebook",{"id":22,"status":4,"sort":8,"platform":192,"icon":193,"url":194,"label":195},"github","github-logo","https:\u002F\u002Fgithub.com\u002Flocalazy","Localazy GitHub",{"id":107,"status":4,"sort":8,"platform":197,"icon":198,"url":199,"label":200},"x","x-twitter","https:\u002F\u002Fx.com\u002Flocalazy","Localazy X",{"id":50,"status":4,"sort":8,"platform":202,"icon":203,"url":204,"label":205},"linkedin","linkedin-logo","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002F37836599\u002F","Localazy LinkedIn",{"id":57,"status":4,"sort":8,"platform":207,"icon":208,"url":164,"label":209},"discourse","discourse-logo","Localazy Discourse",[211,214,217],{"id":7,"status":4,"sort":8,"title":212,"url":213,"action":8},"Privacy policy","\u002Fprivacy-policy",{"id":16,"status":4,"sort":8,"title":215,"url":216,"action":8},"Terms & Conditions","\u002Fterms-and-conditions",{"id":22,"status":4,"sort":8,"title":218,"url":8,"action":219},"Cookies","cookie-consent",[221,414,647,775,898,900],{"id":16,"name":222,"url":8,"url_text":8,"status":4,"groups":223},"Solutions",[224,235,306,341],{"navigation_items_group_id":225},{"id":22,"sort":50,"status":4,"name":226,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":229,"show_all_url":8,"represent_as_tile":227,"items":230},"Featured Article",false,"top",true,[231],{"collection":232,"item":233},"blog_post_navigation_item_type",{"id":107,"status":4,"sort":8,"show_author_img":229,"blog_post_tag":234,"description":8},"nav",{"navigation_items_group_id":236},{"id":50,"sort":7,"status":4,"name":237,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":238,"represent_as_tile":229,"items":239},"Your Role","\u002Froles",[240,252,262,272,283,295],{"collection":241,"item":242},"relation_navigation_item_type",{"id":7,"status":4,"sort":8,"name":243,"item":244},"CMO",[245],{"collection":246,"item":247},"personas",{"id":7,"status":4,"sort":8,"slug":248,"icon":249},"chief-marketing-officers",{"id":250,"title":251},"526097d8-176f-48e5-83d3-2fc4d77061f9","La Mail Bulk",{"collection":241,"item":253},{"id":22,"status":4,"sort":8,"name":254,"item":255},"CTO",[256],{"collection":246,"item":257},{"id":107,"status":4,"sort":8,"slug":258,"icon":259},"chief-technical-officers",{"id":260,"title":261},"f808fdf0-c78b-4294-ba59-fe25f46fe825","La Mechanic",{"collection":241,"item":263},{"id":174,"status":4,"sort":8,"name":264,"item":265},"Product Manager",[266],{"collection":246,"item":267},{"id":166,"status":4,"sort":8,"slug":268,"icon":269},"product-managers",{"id":270,"title":271},"ea39586a-21fc-4b34-ba87-496028e5198f","La Worker",{"collection":241,"item":273},{"id":274,"status":4,"sort":8,"name":275,"item":276},37,"Translator",[277],{"collection":246,"item":278},{"id":174,"status":4,"sort":8,"slug":279,"icon":280},"professional-translators",{"id":281,"title":282},"07945171-d51d-4ca8-96c0-21cde9db258f","La Chat",{"collection":241,"item":284},{"id":285,"status":4,"sort":8,"name":286,"item":287},38,"Developer",[288],{"collection":246,"item":289},{"id":290,"status":4,"sort":8,"slug":291,"icon":292},30,"software-developers",{"id":293,"title":294},"1806e46d-c551-4845-bf42-4407344d229e","La Terminal",{"collection":241,"item":296},{"id":297,"status":4,"sort":8,"name":298,"item":299},27,"Localization Manager",[300],{"collection":246,"item":301},{"id":57,"status":4,"sort":8,"slug":302,"icon":303},"localization-managers",{"id":304,"title":305},"dac69bd1-bf5d-41d0-87d4-dd13e314698a","La Language",{"navigation_items_group_id":307},{"id":72,"sort":22,"status":4,"name":308,"render_show_all_url":227,"show_all_url_position":309,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":310},"Use cases","bottom",[311,317,322,327,331,336],{"collection":312,"item":313},"simple_link_navigation_item_type",{"id":314,"status":4,"sort":8,"url":315,"url_text":316,"show_favorite_icon":227},24,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fsoftware-localization","Software localization",{"collection":312,"item":318},{"id":319,"status":4,"sort":8,"url":320,"url_text":321,"show_favorite_icon":227},26,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fmobile-app-localization","Mobile app localization",{"collection":312,"item":323},{"id":324,"status":4,"sort":8,"url":325,"url_text":326,"show_favorite_icon":227},25,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fwebsite-localization","Website localization",{"collection":312,"item":328},{"id":297,"status":4,"sort":8,"url":329,"url_text":330,"show_favorite_icon":227},"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fdesign-localization","Design localization",{"collection":312,"item":332},{"id":333,"status":4,"sort":8,"url":334,"url_text":335,"show_favorite_icon":227},28,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fgame-localization","Game localization",{"collection":312,"item":337},{"id":338,"status":4,"sort":8,"url":339,"url_text":340,"show_favorite_icon":227},29,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fhelp-and-docs-localization","Help & docs localization",{"navigation_items_group_id":342},{"id":67,"sort":16,"status":4,"name":343,"render_show_all_url":227,"show_all_url_position":309,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":344},"Industry",[345,356,367,377,387,396,407],{"collection":241,"item":346},{"id":347,"status":4,"sort":8,"name":348,"item":349},23,"Digital Agencies",[350],{"collection":246,"item":351},{"id":62,"status":4,"sort":8,"slug":352,"icon":353},"digital-agencies",{"id":354,"title":355},"547f5619-b21d-4b29-86f1-8b2200313cde","La Digi Agency",{"collection":241,"item":357},{"id":358,"status":4,"sort":8,"name":359,"item":360},39,"Startups & SaaS",[361],{"collection":246,"item":362},{"id":16,"status":4,"sort":8,"slug":363,"icon":364},"startups",{"id":365,"title":366},"da1516e2-4afc-40a2-bcbf-a8161e2d610d","La Saa S",{"collection":241,"item":368},{"id":16,"status":4,"sort":8,"name":369,"item":370},"E-commerce",[371],{"collection":246,"item":372},{"id":50,"status":4,"sort":8,"slug":373,"icon":374},"e-commerce",{"id":375,"title":376},"a3d09cd2-054f-4bb5-a0a2-d3d207db65df","La Ecommerce",{"collection":241,"item":378},{"id":170,"status":4,"sort":8,"name":379,"item":380},"FinTech Platforms",[381],{"collection":246,"item":382},{"id":297,"status":4,"sort":8,"slug":383,"icon":384},"fintech",{"id":385,"title":386},"147339ba-07d1-4e5e-baad-23d27e60c919","La Money",{"collection":241,"item":388},{"id":314,"status":4,"sort":8,"name":389,"item":390},"Translation Agencies",[391],{"collection":246,"item":392},{"id":314,"status":4,"sort":8,"slug":393,"icon":394},"translation-agencies",{"id":395,"title":305},"15d6fe33-2af8-4d6e-933d-5caa64394511",{"collection":241,"item":397},{"id":398,"status":4,"sort":8,"name":399,"item":400},22,"Travel & Tourism",[401],{"collection":246,"item":402},{"id":22,"status":4,"sort":8,"slug":403,"icon":404},"tourism",{"id":405,"title":406},"23a785e8-0ae5-4c4b-8452-aab1b58182a6","La Travel",{"collection":241,"item":408},{"id":324,"status":4,"sort":8,"name":409,"item":410},"Nonprofit Causes",[411],{"collection":246,"item":412},{"id":333,"status":4,"sort":8,"slug":413,"icon":8},"nonprofit",{"id":50,"name":415,"url":8,"url_text":8,"status":4,"groups":416},"Features",[417,484,541,590],{"navigation_items_group_id":418},{"id":36,"sort":57,"status":4,"name":419,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":420},"Localization",[421,430,439,447,455,459,467,476],{"collection":241,"item":422},{"id":423,"status":4,"sort":8,"name":424,"item":425},44,"Human translation services",[426],{"collection":427,"item":428},"products",{"id":72,"status":4,"slug":429},"human-translation-services",{"collection":241,"item":431},{"id":432,"status":4,"sort":8,"name":433,"item":434},45,"Translation management",[435],{"collection":436,"item":437},"term_landing_page",{"id":338,"status":4,"slug":438},"translation-management-system",{"collection":241,"item":440},{"id":441,"status":4,"sort":8,"name":442,"item":443},46,"Context Screenshots",[444],{"collection":427,"item":445},{"id":43,"status":4,"slug":446},"context-screenshots-ocr",{"collection":241,"item":448},{"id":449,"status":4,"sort":8,"name":450,"item":451},47,"Translation Glossary",[452],{"collection":427,"item":453},{"id":162,"status":4,"slug":454},"glossary",{"collection":312,"item":456},{"id":107,"status":4,"sort":8,"url":457,"url_text":458,"show_favorite_icon":227},"\u002Fdocs\u002Fgeneral\u002Freviewing-translations","Quality control",{"collection":241,"item":460},{"id":461,"status":4,"sort":8,"name":462,"item":463},34,"Connected Projects",[464],{"collection":427,"item":465},{"id":7,"status":4,"slug":466},"connected-projects",{"collection":241,"item":468},{"id":469,"status":4,"sort":8,"name":470,"item":471},64,"Plural handling",[472],{"collection":427,"item":473},{"id":474,"status":4,"slug":475},32,"plurals",{"collection":241,"item":477},{"id":478,"status":4,"sort":8,"name":479,"item":480},65,"Style guides",[481],{"collection":427,"item":482},{"id":285,"status":4,"slug":483},"style-guide",{"navigation_items_group_id":485},{"id":29,"sort":62,"status":4,"name":486,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":487},"Translation",[488,496,504,508,516,524,533],{"collection":241,"item":489},{"id":490,"status":4,"sort":8,"name":491,"item":492},36,"Professional translations",[493],{"collection":436,"item":494},{"id":290,"status":4,"slug":495},"professional-translation-services",{"collection":241,"item":497},{"id":498,"status":4,"sort":8,"name":499,"item":500},48,"Crowdsourced translations",[501],{"collection":427,"item":502},{"id":67,"status":4,"slug":503},"share-tm",{"collection":312,"item":505},{"id":50,"status":4,"sort":8,"url":506,"url_text":507,"show_favorite_icon":227},"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings","Translation interface",{"collection":241,"item":509},{"id":510,"status":4,"sort":8,"name":511,"item":512},55,"Machine translations",[513],{"collection":427,"item":514},{"id":50,"status":4,"slug":515},"machine-translation",{"collection":241,"item":517},{"id":518,"status":4,"sort":8,"name":519,"item":520},60,"Localazy AI translation",[521],{"collection":427,"item":522},{"id":338,"status":4,"slug":523},"localazy-ai",{"collection":241,"item":525},{"id":526,"status":4,"sort":8,"name":527,"item":528},61,"Translation Memory",[529],{"collection":427,"item":530},{"id":531,"status":4,"slug":532},35,"translation-memory",{"collection":241,"item":534},{"id":535,"status":4,"sort":8,"name":536,"item":537},63,"Code & placeholders",[538],{"collection":427,"item":539},{"id":290,"status":4,"slug":540},"code-and-placeholders",{"navigation_items_group_id":542},{"id":43,"sort":67,"status":4,"name":543,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":544},"Management",[545,549,557,565,574,582,586],{"collection":312,"item":546},{"id":67,"status":4,"sort":8,"url":547,"url_text":548,"show_favorite_icon":227},"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles","User roles",{"collection":241,"item":550},{"id":551,"status":4,"sort":8,"name":552,"item":553},51,"Duplicity Linking",[554],{"collection":427,"item":555},{"id":170,"status":4,"slug":556},"duplicity-linking",{"collection":241,"item":558},{"id":559,"status":4,"sort":8,"name":560,"item":561},52,"Language Permissions",[562],{"collection":427,"item":563},{"id":99,"status":4,"slug":564},"language-permissions",{"collection":241,"item":566},{"id":567,"status":568,"sort":8,"name":569,"item":570},53,"draft","Automations",[571],{"collection":427,"item":572},{"id":174,"status":4,"slug":573},"automations",{"collection":241,"item":575},{"id":576,"status":4,"sort":8,"name":577,"item":578},58,"Branching",[579],{"collection":427,"item":580},{"id":297,"status":4,"slug":581},"branching",{"collection":312,"item":583},{"id":99,"status":568,"sort":8,"url":584,"url_text":585,"show_favorite_icon":227},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fsso-configuration","SSO",{"collection":312,"item":587},{"id":398,"status":568,"sort":8,"url":588,"url_text":589,"show_favorite_icon":227},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics","Reporting",{"navigation_items_group_id":591},{"id":150,"sort":72,"status":4,"name":592,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":593},"Development",[594,600,608,615,622,630,639],{"collection":241,"item":595},{"id":338,"status":4,"sort":8,"name":130,"item":596},[597],{"collection":427,"item":598},{"id":36,"status":4,"slug":599},"translation-api",{"collection":241,"item":601},{"id":602,"status":4,"sort":8,"name":603,"item":604},33,"Localazy CLI",[605],{"collection":427,"item":606},{"id":62,"status":4,"slug":607},"cli",{"collection":241,"item":609},{"id":474,"status":4,"sort":8,"name":610,"item":611},"Language CDN",[612],{"collection":427,"item":613},{"id":107,"status":4,"slug":614},"language-cdn",{"collection":241,"item":616},{"id":333,"status":4,"sort":8,"name":617,"item":618},"Releases",[619],{"collection":427,"item":620},{"id":57,"status":4,"slug":621},"releases",{"collection":241,"item":623},{"id":624,"status":568,"sort":8,"name":625,"item":626},57,"Format Conversions",[627],{"collection":427,"item":628},{"id":16,"status":4,"slug":629},"format-conversions",{"collection":241,"item":631},{"id":632,"status":4,"sort":8,"name":633,"item":634},59,"Webhooks",[635],{"collection":427,"item":636},{"id":637,"status":4,"slug":638},31,"webhooks",{"collection":241,"item":640},{"id":641,"status":4,"sort":8,"name":642,"item":643},62,"Export Aliases",[644],{"collection":427,"item":645},{"id":602,"status":4,"slug":646},"export-aliases",{"id":107,"name":142,"url":8,"url_text":8,"status":4,"groups":648},[649,765],{"navigation_items_group_id":650},{"id":62,"sort":77,"status":4,"name":651,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":652},"Most popular",[653],{"collection":241,"item":654},{"id":29,"status":4,"sort":8,"name":142,"item":655},[656,664,671,678,685,691,698,705,712,719,726,735,742,749,757],{"collection":657,"item":658},"platforms",{"id":57,"status":4,"sort":7,"slug":659,"name":660,"icon":661},"android","Android",{"id":662,"title":663},"ff965add-53b0-44ad-b27c-ea4ef641d384","Ic Outline Android",{"collection":657,"item":665},{"id":62,"status":4,"sort":16,"slug":666,"name":667,"icon":668},"ios","iOS",{"id":669,"title":670},"886285d7-816a-4430-b5a5-edfe307b238e","Ios",{"collection":657,"item":672},{"id":602,"status":4,"sort":22,"slug":673,"name":674,"icon":675},"react","React",{"id":676,"title":677},"26757a90-88a3-4a94-b587-9f38614ed3bd","Logos React",{"collection":657,"item":679},{"id":170,"status":4,"sort":107,"slug":680,"name":681,"icon":682},"vuejs","Vue.js",{"id":683,"title":684},"6180b41f-3249-47d3-adcd-50fe1cf11bf1","Vue",{"collection":657,"item":686},{"id":158,"status":4,"sort":50,"slug":687,"name":688,"icon":689},"angular","Angular",{"id":690,"title":688},"2a31a97a-48c5-4531-aa36-41c9dd0bdbef",{"collection":657,"item":692},{"id":7,"status":4,"sort":57,"slug":693,"name":694,"icon":695},"flutter","Flutter",{"id":696,"title":697},"b9f13a11-9328-4a03-86cf-b20de0685606","Logos Flutter",{"collection":657,"item":699},{"id":22,"status":4,"sort":36,"slug":700,"name":701,"icon":702},"typescript","TypeScript",{"id":703,"title":704},"8d1319b5-8a96-4199-8407-00add3418b1f","Logos Typescript Icon",{"collection":657,"item":706},{"id":637,"status":4,"sort":29,"slug":707,"name":708,"icon":709},"javascript","JavaScript",{"id":710,"title":711},"4218d0c9-7e6b-494d-9663-37ceaf93ee8c","Logos Javascript",{"collection":657,"item":713},{"id":29,"status":4,"sort":174,"slug":714,"name":715,"icon":716},"json","JSON",{"id":717,"title":718},"99ac3b7c-dba5-4693-a4f4-1f27a6d7782d","Logos Json",{"collection":657,"item":720},{"id":99,"status":4,"sort":99,"slug":721,"name":722,"icon":723},"xliff","XLIFF",{"id":724,"title":725},"ca424cc8-e8a7-4aef-8dca-ef4a4d1334fc","Format",{"collection":657,"item":727},{"id":728,"status":4,"sort":729,"slug":730,"name":731,"icon":732},72,54,"strapi","Strapi",{"id":733,"title":734},"cde7f1d0-f2e0-4243-929e-a3f8f9146e69","Strapi Logo Purple",{"collection":657,"item":736},{"id":518,"status":4,"sort":510,"slug":737,"name":738,"icon":739},"figma","Figma",{"id":740,"title":741},"813745a4-a77d-4735-93b7-e0dd731b2304","Figma Icon",{"collection":657,"item":743},{"id":551,"status":4,"sort":449,"slug":744,"name":745,"icon":746},"microsoft-excel","Microsoft Excel",{"id":747,"title":748},"7a175955-7b96-4561-939f-a0e1924faa40","Excel",{"collection":657,"item":750},{"id":751,"status":4,"sort":526,"slug":752,"name":753,"icon":754},66,"github-actions","GitHub Actions",{"id":755,"title":756},"da17554f-ac6d-443d-9bac-1f29645ec1c6","Github Icon",{"collection":657,"item":758},{"id":759,"status":4,"sort":760,"slug":761,"name":762,"icon":763},97,999,"webflow","Webflow",{"id":764,"title":762},"ff43a386-52f8-499f-b77c-ab9a30f4a77e",{"navigation_items_group_id":766},{"id":107,"sort":36,"status":4,"name":767,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":768},"Explore more",[769],{"collection":770,"item":771},"text_link_navigation_item_type",{"id":7,"status":4,"sort":8,"text":772,"url":773,"url_text":774},"Localazy is a technology-agnostic platform supporting 50+ frameworks, file formats & popular tools.","\u002Fintegrations","See all integrations",{"id":7,"name":146,"url":8,"url_text":8,"status":4,"groups":776},[777,801,807],{"navigation_items_group_id":778},{"id":7,"sort":29,"status":4,"name":779,"render_show_all_url":227,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":8,"represent_as_tile":227,"items":780},"Helpful Links",[781,784,786,790,792,795,797],{"collection":312,"item":782},{"id":43,"status":4,"sort":8,"url":168,"url_text":783,"show_favorite_icon":229},"Localazy Blog",{"collection":312,"item":785},{"id":150,"status":4,"sort":8,"url":152,"url_text":151,"show_favorite_icon":229},{"collection":312,"item":787},{"id":7,"status":4,"sort":8,"url":788,"url_text":789,"show_favorite_icon":227},"https:\u002F\u002Fdiscuss.localazy.com\u002F","Discussion Forum",{"collection":312,"item":791},{"id":29,"status":4,"sort":8,"url":160,"url_text":159,"show_favorite_icon":227},{"collection":312,"item":793},{"id":22,"status":4,"sort":8,"url":109,"url_text":794,"show_favorite_icon":227},"Become a Partner",{"collection":312,"item":796},{"id":154,"status":4,"sort":8,"url":172,"url_text":171,"show_favorite_icon":227},{"collection":312,"item":798},{"id":162,"status":4,"sort":8,"url":799,"url_text":800,"show_favorite_icon":227},"\u002Ftags\u002Frelease-update","Release Updates",{"navigation_items_group_id":802},{"id":16,"sort":150,"status":4,"name":783,"render_show_all_url":229,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":168,"represent_as_tile":227,"items":803},[804],{"collection":232,"item":805},{"id":22,"status":4,"sort":8,"show_author_img":227,"blog_post_tag":806,"description":8},"[USE LATEST FEATURED]",{"navigation_items_group_id":808},{"id":57,"sort":43,"status":4,"name":151,"render_show_all_url":229,"show_all_url_position":228,"show_favorite_icon":227,"show_all_url":152,"represent_as_tile":227,"items":809},[810,824,836,847,859,869,880,888],{"collection":241,"item":811},{"id":107,"status":4,"sort":8,"name":812,"item":813},"General",[814],{"collection":815,"item":816},"docs_section",{"id":16,"status":4,"sort":7,"slug":817,"name":812,"icon":818,"featured_icon":821},"general",{"id":819,"title":820},"423101f1-308c-42f1-8dfe-53272019e7cb","Global",{"id":822,"title":823},"0f7ca4cb-dc3b-4f62-b476-132ed5c4931f","General Doc",{"collection":241,"item":825},{"id":50,"status":4,"sort":8,"name":826,"item":827},"CLI",[828],{"collection":815,"item":829},{"id":22,"status":4,"sort":16,"slug":607,"name":826,"icon":830,"featured_icon":833},{"id":831,"title":832},"2f7a4573-8265-4d76-8d55-ce0cc79b8983","Cli",{"id":834,"title":835},"3f76ff7b-0e74-4046-bb03-4ca99c3b66d5","Doc Cat Cli",{"collection":241,"item":837},{"id":67,"status":4,"sort":8,"name":838,"item":839},"API",[840],{"collection":815,"item":841},{"id":174,"status":4,"sort":22,"slug":842,"name":838,"icon":843,"featured_icon":844},"api",{"id":831,"title":832},{"id":845,"title":846},"20866781-e69b-4e01-9456-05437487b75c","API Doc",{"collection":241,"item":848},{"id":849,"status":4,"sort":8,"name":850,"item":851},50,"CDN",[852],{"collection":815,"item":853},{"id":319,"status":4,"sort":107,"slug":854,"name":850,"icon":855,"featured_icon":856},"cdn",{"id":819,"title":820},{"id":857,"title":858},"a8ee9cb7-4e02-41f0-b595-eb518c3085b6","Doc Cat Cdn",{"collection":241,"item":860},{"id":57,"status":4,"sort":8,"name":660,"item":861},[862],{"collection":815,"item":863},{"id":7,"status":4,"sort":50,"slug":659,"name":660,"icon":864,"featured_icon":866},{"id":865,"title":660},"fb8329ae-0c0c-4fbc-bcdc-83f2eeda1039",{"id":867,"title":868},"f7c0dec8-5b42-4943-ab3a-e3665723ad6f","Doc Cat Android",{"collection":241,"item":870},{"id":62,"status":4,"sort":8,"name":667,"item":871},[872],{"collection":815,"item":873},{"id":107,"status":4,"sort":57,"slug":666,"name":667,"icon":874,"featured_icon":877},{"id":875,"title":876},"289e136c-55df-4d51-847b-1782a2308ee4","Ios Blue",{"id":878,"title":879},"2968d3f0-14b5-4427-82e7-f1ea2de17846","Doc Cat Ios",{"collection":241,"item":881},{"id":72,"status":4,"sort":8,"name":738,"item":882},[883],{"collection":815,"item":884},{"id":99,"status":4,"sort":62,"slug":737,"name":738,"icon":885,"featured_icon":886},{"id":831,"title":832},{"id":887,"title":738},"f5e66b5b-a439-47f6-af4a-6ad261de2e87",{"collection":241,"item":889},{"id":77,"status":4,"sort":8,"name":731,"item":890},[891],{"collection":815,"item":892},{"id":347,"status":4,"sort":67,"slug":730,"name":731,"icon":893,"featured_icon":895},{"id":894,"title":731},"3b4b03c7-e131-49e6-a014-c8c2c8a2751e",{"id":896,"title":897},"1dd05c76-e517-4aea-a3d8-49cfddb40056","Strapi Doc",{"id":22,"name":175,"url":176,"url_text":175,"status":4,"groups":899},[],{"id":57,"name":93,"url":901,"url_text":93,"status":4,"groups":902},"\u002Fbook-demo",[],[904,1048,1128,1236,1323,1404,1479,1572,1661,1760],{"id":602,"status":4,"created_on":905,"modified_on":906,"name":674,"slug":673,"description":907,"docs_link":908,"priority":8,"has_sdk":227,"sort":22,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":909,"show_in_spa":229,"is_file_format":227,"meta_title":910,"meta_description":911,"featured_on_web":229,"marketing_subtitle":912,"tile_subtitle":913,"tile_description":914,"is_enterprise":227,"is_popular":227,"primary_use_case":8,"hierarchy_handling":8,"best_for":8,"file_extension":8,"format_code_example":8,"format_to_extension":915,"upload_features":916,"icon":917,"meta_image":918,"primary_tag":920,"tags":936,"integration_methods":954,"recommended_methods":1032,"default_integration_method":1033,"faq_categories":1040,"translations":1046,"platforms_id":602},"2026-07-22T09:47:16.000Z","2026-07-22T09:47:17.000Z","Manage your React app translations with Localazy, a continuous localization tool. React i18n done right. ","\u002Fdocs\u002Fcli\u002Fjson-format","JSON format support","React localization – translate JSON files | Localazy","Translate React JSON files with Localazy. Works with react-i18next, react-intl, and LinguiJS, with placeholder protection and CLI automation.","CLI support","react-i18next and more","Use Localazy to translate your React projects with your favorite i18n library.",{"json":714},[],{"id":676},{"id":919},"a97492ec-ee8d-429c-bf66-d0fe59b6e5c9",{"id":50,"status":4,"sort":16,"created_on":921,"label":922,"hidden":227,"icon":923,"translations":925},"2022-03-17T12:23:44.000Z","Web apps",{"id":924},"c9e70e4f-8136-432a-8d82-53c3501a9eb4",[926,928,931,934],{"id":50,"languages_code":927,"label":922},"xxa",{"id":432,"languages_code":929,"label":930},"es","Aplicaciones web",{"id":849,"languages_code":932,"label":933},"cs","Webové aplikace",{"id":632,"languages_code":935,"label":922},"en",[937,944],{"id":50,"status":4,"sort":16,"label":922,"hidden":227,"created_on":921,"icon":938,"translations":939},{"id":924},[940,941,942,943],{"id":50,"languages_code":927,"label":922},{"id":432,"languages_code":929,"label":930},{"id":849,"languages_code":932,"label":933},{"id":632,"languages_code":935,"label":922},{"id":67,"status":4,"sort":72,"label":945,"hidden":227,"created_on":946,"icon":8,"translations":947},"Framework","2022-03-17T12:23:45.000Z",[948,949,951,952],{"id":67,"languages_code":927,"label":945},{"id":567,"languages_code":929,"label":950},"Marco",{"id":518,"languages_code":932,"label":945},{"id":953,"languages_code":935,"label":945},67,[955,970,994,1015],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":958},"Translate strings directly or upload them into your Localazy project.","\u002Fdocs\u002Fapi\u002Fintroduction",[959,960,963,965,967],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},40,"Utilice la API para exportar traducciones e importar contenido de\u002Fa Localazy mediante programación.",{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},"Use the API to export translations and import content from\u002Fto Localazy programmatically.",{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},"Překládejte řetězce přímo nebo je nahrajte do svého projektu Localazy.",{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},109,"de",{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":976},"Create source keys online","add-keys-manually","Add source keys via the web interface online and sync them into your project later.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#add-new-keys-in-ui","vpn-key-outline",[977,978,981,982,985,988,989,990],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},"Cree claves fuente en línea","Añada claves fuente a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},"Vytvářejte zdrojové klíče online","Přidejte zdrojové klíče přes webové rozhraní online a synchronizujte je do svého projektu později.",{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},"Cree claves de origen en línea","Añada claves de origen a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},88,"Erstellen Sie Quellschlüssel online","Fügen Sie Quellschlüssel über die Weboberfläche online hinzu und synchronisieren Sie sie später mit Ihrem Projekt.",{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1001},"Direct file upload","File upload","web-upload","Upload your texts and existing translations in any format directly to start quickly.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files","file-upload",[1002,1003,1006,1007,1011],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},"Carga directa de archivos","Cargue sus textos y traducciones existentes en cualquier formato directamente para empezar rápidamente.",{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},56,"Přímé nahrávání souborů","Nahrajte přímo své texty a stávající překlady v libovolném formátu a začněte pracovat ihned.",{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},85,"Direkter Datei-Upload","Laden Sie Ihre Texte und vorhandenen Übersetzungen in einem beliebigen Format direkt hoch, um schnell loszulegen.",{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1019},"Command Line Interface","The best option for developers that want to make localization an automated part of their workflow.","\u002Fdocs\u002Fcli\u002Fthe-basics",[1020,1021,1024,1025,1028],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},"Interfaz de Línea de Comandos","La mejor opción para los desarrolladores que deseen hacer de la localización una parte automatizada de su flujo de trabajo.",{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},"Rozhraní Příkazového Řádku","Nejlepší volba pro vývojáře, kteří chtějí, aby se lokalizace stala automatizovanou součástí jejich pracovních postupů.",{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},87,"Befehlszeilenschnittstelle","Die beste Option für Entwickler, die die Lokalisierung zu einem automatisierten Teil ihres Arbeitsablaufs machen möchten.",[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1034},[1035,1036,1037,1038,1039],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[1041],{"id":1042,"status":4,"created_on":1043,"sort":8,"slug":1044,"label":1045,"on_faq_index":8},76,"2025-02-26T12:44:29.000Z","front-end-common","Front-end Common",[1047],{"languages_code":927,"name":674,"slug":673,"description":907,"support_type":909,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":913,"tile_description":914,"id":602,"platforms_id":602,"docs_link":908},{"id":170,"status":4,"created_on":905,"modified_on":906,"name":681,"slug":680,"description":1049,"docs_link":908,"priority":8,"has_sdk":227,"sort":107,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":909,"show_in_spa":229,"is_file_format":227,"meta_title":1050,"meta_description":1051,"featured_on_web":229,"marketing_subtitle":912,"tile_subtitle":1052,"tile_description":1053,"is_enterprise":227,"is_popular":227,"primary_use_case":8,"hierarchy_handling":8,"best_for":8,"file_extension":8,"format_code_example":8,"format_to_extension":1054,"upload_features":1055,"icon":1056,"meta_image":1057,"primary_tag":1059,"tags":1066,"integration_methods":1080,"recommended_methods":1112,"default_integration_method":1113,"faq_categories":1120,"translations":1126,"platforms_id":170},"Online Vue.js project localization tool for your translation management. Enjoy true continuous localization with Localazy & translate your JSON files automatically.","Vue.js localization – translate JSON files | Localazy","Translate Vue.js JSON files with Localazy. Full vue-i18n support with interpolation protection, plural validation, and CLI automation.","Vue.js & JSON","Enjoy true continuous localization with Localazy & translate your Vue projects automatically.",{"json":714},[],{"id":683},{"id":1058},"8171b836-d6b8-4354-8db3-34ccd384970d",{"id":50,"status":4,"sort":16,"created_on":921,"label":922,"hidden":227,"icon":1060,"translations":1061},{"id":924},[1062,1063,1064,1065],{"id":50,"languages_code":927,"label":922},{"id":432,"languages_code":929,"label":930},{"id":849,"languages_code":932,"label":933},{"id":632,"languages_code":935,"label":922},[1067,1074],{"id":50,"status":4,"sort":16,"label":922,"hidden":227,"created_on":921,"icon":1068,"translations":1069},{"id":924},[1070,1071,1072,1073],{"id":50,"languages_code":927,"label":922},{"id":432,"languages_code":929,"label":930},{"id":849,"languages_code":932,"label":933},{"id":632,"languages_code":935,"label":922},{"id":67,"status":4,"sort":72,"label":945,"hidden":227,"created_on":946,"icon":8,"translations":1075},[1076,1077,1078,1079],{"id":67,"languages_code":927,"label":945},{"id":567,"languages_code":929,"label":950},{"id":518,"languages_code":932,"label":945},{"id":953,"languages_code":935,"label":945},[1081,1088,1098,1105],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1082},[1083,1084,1085,1086,1087],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1089},[1090,1091,1092,1093,1094,1095,1096,1097],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1099},[1100,1101,1102,1103,1104],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1106},[1107,1108,1109,1110,1111],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1114},[1115,1116,1117,1118,1119],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[1121,1125],{"id":1008,"status":4,"created_on":1122,"sort":8,"slug":1123,"label":1124,"on_faq_index":8},"2023-03-01T11:21:41.000Z","vue-localization","Vue.js Localization",{"id":1042,"status":4,"created_on":1043,"sort":8,"slug":1044,"label":1045,"on_faq_index":8},[1127],{"languages_code":927,"name":681,"slug":680,"description":1049,"support_type":909,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1052,"tile_description":1053,"id":170,"platforms_id":170,"docs_link":908},{"id":7,"status":4,"created_on":905,"modified_on":906,"name":694,"slug":693,"description":1129,"docs_link":1130,"priority":8,"has_sdk":227,"sort":57,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1131,"show_in_spa":229,"is_file_format":227,"meta_title":1132,"meta_description":1133,"featured_on_web":227,"marketing_subtitle":912,"tile_subtitle":1131,"tile_description":1134,"is_enterprise":227,"is_popular":227,"primary_use_case":1135,"hierarchy_handling":1136,"best_for":1137,"file_extension":1138,"format_code_example":1139,"format_to_extension":1140,"upload_features":1142,"icon":1143,"meta_image":1144,"primary_tag":1146,"tags":1157,"integration_methods":1193,"recommended_methods":1225,"default_integration_method":1226,"faq_categories":1233,"translations":1234,"platforms_id":7},"Learn how to use Localazy CLI for localization of Flutter app. Flutter’s ARB format is fully supported including arrays, plurals, and selected context information. No extra configuration is necessary, but you can enable certain features if you want to.","\u002Fdocs\u002Fcli\u002Fflutter-format","ARB format support","Flutter localization – translate ARB files | Localazy","Translate Flutter ARB files with Localazy. Placeholders, plurals, and metadata fully supported, with CLI automation that fits your existing workflow.","Use the Localazy CLI for localization of Flutter projects. Flutter’s ARB format is fully supported.","Supports metadata like placeholders","JSON-like key-value","Flutter apps",".arb","```\n{\n  \"localazy_message\": \"Go international, today. With Localazy.\"\n}\n```",{"arb":1141},"arb",[],{"id":696},{"id":1145},"c2674666-4371-4aa4-9a65-438c7363fafe",{"id":57,"status":4,"sort":67,"created_on":946,"label":1147,"hidden":227,"icon":1148,"translations":1150},"Mobile apps",{"id":1149},"c9c7e1f5-8b59-4016-ae0c-6fba9469cd55",[1151,1152,1154,1156],{"id":57,"languages_code":927,"label":1147},{"id":441,"languages_code":929,"label":1153},"Aplicaciones móviles",{"id":510,"languages_code":932,"label":1155},"Mobilní aplikace",{"id":478,"languages_code":935,"label":1147},[1158,1169,1176,1183],{"id":62,"status":4,"sort":170,"label":1159,"hidden":227,"created_on":946,"icon":1160,"translations":1162},"Desktop & Games",{"id":1161},"65b04533-5b4c-430c-b8a4-ecce84754200",[1163,1164,1166,1168],{"id":62,"languages_code":927,"label":1159},{"id":449,"languages_code":929,"label":1165},"Escritorio y Juegos",{"id":1008,"languages_code":932,"label":1167},"Stolní počítače & Hry",{"id":751,"languages_code":935,"label":1159},{"id":50,"status":4,"sort":16,"label":922,"hidden":227,"created_on":921,"icon":1170,"translations":1171},{"id":924},[1172,1173,1174,1175],{"id":50,"languages_code":927,"label":922},{"id":432,"languages_code":929,"label":930},{"id":849,"languages_code":932,"label":933},{"id":632,"languages_code":935,"label":922},{"id":57,"status":4,"sort":67,"label":1147,"hidden":227,"created_on":946,"icon":1177,"translations":1178},{"id":1149},[1179,1180,1181,1182],{"id":57,"languages_code":927,"label":1147},{"id":441,"languages_code":929,"label":1153},{"id":510,"languages_code":932,"label":1155},{"id":478,"languages_code":935,"label":1147},{"id":290,"status":4,"sort":474,"label":1184,"hidden":229,"created_on":946,"icon":8,"translations":1185},"ARB",[1186,1187,1189,1191],{"id":290,"languages_code":927,"label":1184},{"id":1188,"languages_code":929,"label":1184},120,{"id":1190,"languages_code":932,"label":1184},125,{"id":1192,"languages_code":935,"label":1184},130,[1194,1201,1211,1218],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1195},[1196,1197,1198,1199,1200],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1202},[1203,1204,1205,1206,1207,1208,1209,1210],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1212},[1213,1214,1215,1216,1217],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1219},[1220,1221,1222,1223,1224],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1227},[1228,1229,1230,1231,1232],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],[1235],{"languages_code":927,"name":694,"slug":693,"description":1129,"support_type":1131,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1131,"tile_description":1134,"id":7,"platforms_id":7,"docs_link":1130},{"id":637,"status":4,"created_on":905,"modified_on":906,"name":708,"slug":707,"description":1237,"docs_link":1238,"priority":8,"has_sdk":227,"sort":29,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1239,"show_in_spa":229,"is_file_format":227,"meta_title":1240,"meta_description":1241,"featured_on_web":229,"marketing_subtitle":912,"tile_subtitle":1239,"tile_description":1242,"is_enterprise":227,"is_popular":227,"primary_use_case":8,"hierarchy_handling":8,"best_for":8,"file_extension":8,"format_code_example":8,"format_to_extension":1243,"upload_features":1245,"icon":1246,"meta_image":1247,"primary_tag":1249,"tags":1262,"integration_methods":1277,"recommended_methods":1309,"default_integration_method":1310,"faq_categories":1317,"translations":1321,"platforms_id":637},"Localize your app with JavaScript localizations and Localazy CLI.\nUpload JavaScript files with strings to Localazy and manage your translations easily. Download translated files back.","\u002Fdocs\u002Fcli\u002Fjavascript-format","JS file support","JavaScript localization – translate JS files | Localazy","Translate JavaScript files with Localazy. ES6 modules, CommonJS, and plain objects parsed, plurals converted, and placeholders validated.","Translating JS files is easy as a pie with Localazy!",{"js":1244},"js",[],{"id":710},{"id":1248},"2c6699eb-1d80-4772-8268-5597dbcead8c",{"id":77,"status":4,"sort":77,"created_on":946,"label":1250,"hidden":227,"icon":1251,"translations":1253},"Programming Languages",{"id":1252},"8c5836bb-1fbe-49c5-9330-8f931838c457",[1254,1255,1257,1260],{"id":77,"languages_code":927,"label":1250},{"id":535,"languages_code":929,"label":1256},"Lenguajes de Programación",{"id":1258,"languages_code":932,"label":1259},68,"Programovací Jazyky",{"id":1261,"languages_code":935,"label":1250},70,[1263,1270],{"id":50,"status":4,"sort":16,"label":922,"hidden":227,"created_on":921,"icon":1264,"translations":1265},{"id":924},[1266,1267,1268,1269],{"id":50,"languages_code":927,"label":922},{"id":432,"languages_code":929,"label":930},{"id":849,"languages_code":932,"label":933},{"id":632,"languages_code":935,"label":922},{"id":77,"status":4,"sort":77,"label":1250,"hidden":227,"created_on":946,"icon":1271,"translations":1272},{"id":1252},[1273,1274,1275,1276],{"id":77,"languages_code":927,"label":1250},{"id":535,"languages_code":929,"label":1256},{"id":1258,"languages_code":932,"label":1259},{"id":1261,"languages_code":935,"label":1250},[1278,1285,1295,1302],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1279},[1280,1281,1282,1283,1284],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1286},[1287,1288,1289,1290,1291,1292,1293,1294],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1296},[1297,1298,1299,1300,1301],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1303},[1304,1305,1306,1307,1308],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1311},[1312,1313,1314,1315,1316],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[1318],{"id":531,"status":4,"created_on":1319,"sort":8,"slug":1320,"label":708,"on_faq_index":227},"2022-06-10T09:49:33.000Z","javascript-i18n-localization",[1322],{"languages_code":927,"name":708,"slug":707,"description":1237,"support_type":1239,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1239,"tile_description":1242,"id":637,"platforms_id":637,"docs_link":1238},{"id":29,"status":4,"created_on":905,"modified_on":906,"name":715,"slug":714,"description":1324,"docs_link":908,"priority":8,"has_sdk":227,"sort":174,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1325,"show_in_spa":229,"is_file_format":229,"meta_title":1326,"meta_description":1327,"featured_on_web":229,"marketing_subtitle":912,"tile_subtitle":1328,"tile_description":1329,"is_enterprise":227,"is_popular":229,"primary_use_case":1330,"hierarchy_handling":1331,"best_for":1332,"file_extension":1333,"format_code_example":1334,"format_to_extension":1335,"upload_features":1336,"icon":1337,"meta_image":1338,"primary_tag":1340,"tags":1351,"integration_methods":1359,"recommended_methods":1391,"default_integration_method":1392,"faq_categories":1399,"translations":1402,"platforms_id":29},"Online JSON translator you will love. Comfortable JSON language files editor with powerful CLI under your fingers for continuous localization.","Advanced format support","JSON localization – translate JSON files | Localazy","Translate JSON files with Localazy. Nested keys, arrays, and ICU plurals supported, structure preserved in every language, CLI for automation.","{Objectively the best}","Translate any JSON files with Localazy, with the best in class plural and array support.","Used for structured data storage and APIs","Uses key-value pairs","Web & mobile apps, APIs",".json","```\n{\n  \"parent\": {\n    \"child\": {\n      \"another_nested_level\": \"All is supported.\"\n    }\n  }\n}\n```",{"json":714},[],{"id":717},{"id":1339},"8d614c20-667e-4bee-a64d-7d7ce9c0ee0a",{"id":107,"status":4,"sort":50,"created_on":946,"label":1341,"hidden":227,"icon":1342,"translations":1344},"File formats",{"id":1343},"ab7c8f89-dcce-45ab-9e21-8605aef289c3",[1345,1346,1348,1350],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},"Formatos de archivo",{"id":551,"languages_code":932,"label":1349},"Formáty souborů",{"id":641,"languages_code":935,"label":1341},[1352],{"id":107,"status":4,"sort":50,"label":1341,"hidden":227,"created_on":946,"icon":1353,"translations":1354},{"id":1343},[1355,1356,1357,1358],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},{"id":551,"languages_code":932,"label":1349},{"id":641,"languages_code":935,"label":1341},[1360,1367,1377,1384],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1361},[1362,1363,1364,1365,1366],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1368},[1369,1370,1371,1372,1373,1374,1375,1376],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1378},[1379,1380,1381,1382,1383],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1385},[1386,1387,1388,1389,1390],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1393},[1394,1395,1396,1397,1398],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[1400],{"id":490,"status":4,"created_on":1401,"sort":8,"slug":714,"label":715,"on_faq_index":227},"2022-06-10T10:49:07.000Z",[1403],{"languages_code":927,"name":715,"slug":714,"description":1324,"support_type":1325,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1328,"tile_description":1329,"id":29,"platforms_id":29,"docs_link":908},{"id":99,"status":4,"created_on":905,"modified_on":906,"name":722,"slug":721,"description":1405,"docs_link":1406,"priority":8,"has_sdk":227,"sort":99,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1407,"show_in_spa":227,"is_file_format":229,"meta_title":1408,"meta_description":1409,"featured_on_web":229,"marketing_subtitle":912,"tile_subtitle":1410,"tile_description":1411,"is_enterprise":227,"is_popular":229,"primary_use_case":1412,"hierarchy_handling":1413,"best_for":1414,"file_extension":1415,"format_code_example":1416,"format_to_extension":1417,"upload_features":1419,"icon":1420,"meta_image":1421,"primary_tag":1423,"tags":1430,"integration_methods":1431,"recommended_methods":1463,"default_integration_method":1464,"faq_categories":1471,"translations":1477,"platforms_id":99},"XLIFF is meant for localization. Enjoy Localazy - an online XLIFF editor for your translation management. Integrate your XLIFF files with Localazy to achieve true continuous localization and translate XLIFF files on autopilot.","\u002Fdocs\u002Fcli\u002Fxliff-12-format","File format support","XLIFF localization – translate XLIFF files | Localazy","Translate XLIFF files with Localazy. XLIFF 1.2 and 2.0 supported, translator notes preserved, and CLI sync for vendor-neutral localization.","Meant for localization","XLIFF stands for XML Localization Interchange File Format - and Localazy is the best way to manage XLIFF files.","Used in translation pipelines","XML-based exchange format","Translation & software",".xliff","```\n\u003Ctrans-unit id=\"localazy_message\">\n    \u003Csource>Go international, today. With Localazy.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```",{"xliff":1418},"xlf",[],{"id":724},{"id":1422},"889970a6-cce8-4055-b96a-9c3f292aa67f",{"id":107,"status":4,"sort":50,"created_on":946,"label":1341,"hidden":227,"icon":1424,"translations":1425},{"id":1343},[1426,1427,1428,1429],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},{"id":551,"languages_code":932,"label":1349},{"id":641,"languages_code":935,"label":1341},[],[1432,1439,1449,1456],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1433},[1434,1435,1436,1437,1438],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1440},[1441,1442,1443,1444,1445,1446,1447,1448],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1450},[1451,1452,1453,1454,1455],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1457},[1458,1459,1460,1461,1462],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1465},[1466,1467,1468,1469,1470],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[1472],{"id":1473,"status":4,"created_on":1474,"sort":8,"slug":1475,"label":1476,"on_faq_index":8},100,"2026-07-21T20:46:42.000Z","xliff-localization","XLIFF file format",[1478],{"languages_code":927,"name":722,"slug":721,"description":1405,"support_type":1407,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1410,"tile_description":1411,"id":99,"platforms_id":99,"docs_link":1406},{"id":174,"status":4,"created_on":905,"modified_on":906,"name":1480,"slug":1481,"description":1482,"docs_link":1483,"priority":8,"has_sdk":227,"sort":314,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1407,"show_in_spa":229,"is_file_format":229,"meta_title":1484,"meta_description":1485,"featured_on_web":227,"marketing_subtitle":912,"tile_subtitle":1486,"tile_description":1487,"is_enterprise":227,"is_popular":229,"primary_use_case":8,"hierarchy_handling":8,"best_for":8,"file_extension":8,"format_code_example":8,"format_to_extension":1488,"upload_features":1489,"icon":1490,"meta_image":1492,"primary_tag":1494,"tags":1501,"integration_methods":1529,"recommended_methods":1561,"default_integration_method":1562,"faq_categories":1569,"translations":1570,"platforms_id":174},"PO","po","Edit .po and .pot files with your team, automate translation with AI, and ship faster.","\u002Fdocs\u002Fcli\u002Fpo-format","PO localization – translate gettext PO files | Localazy","Translate gettext PO files with Localazy. Plural forms, headers, and format flags handled automatically. Download compilation-ready files.","Seamless integration","Upload, edit and translate PO files with Localazy.",{"po":1481},[],{"id":1491},"25f317fe-0c10-4f0b-92cd-f80d1f3c6a67",{"id":1493},"490022f9-d91a-4e1a-9e79-db374ec997c2",{"id":107,"status":4,"sort":50,"created_on":946,"label":1341,"hidden":227,"icon":1495,"translations":1496},{"id":1343},[1497,1498,1499,1500],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},{"id":551,"languages_code":932,"label":1349},{"id":641,"languages_code":935,"label":1341},[1502,1509,1519],{"id":107,"status":4,"sort":50,"label":1341,"hidden":227,"created_on":946,"icon":1503,"translations":1504},{"id":1343},[1505,1506,1507,1508],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},{"id":551,"languages_code":932,"label":1349},{"id":641,"languages_code":935,"label":1341},{"id":461,"status":4,"sort":461,"label":1510,"hidden":229,"created_on":946,"icon":8,"translations":1511},"C++",[1512,1513,1515,1517],{"id":461,"languages_code":927,"label":1510},{"id":1514,"languages_code":929,"label":1510},135,{"id":1516,"languages_code":932,"label":1510},140,{"id":1518,"languages_code":935,"label":1510},144,{"id":99,"status":4,"sort":314,"label":1520,"hidden":229,"created_on":946,"icon":8,"translations":1521},"Gettext",[1522,1523,1525,1527],{"id":99,"languages_code":927,"label":1520},{"id":1524,"languages_code":929,"label":1520},101,{"id":1526,"languages_code":932,"label":1520},106,{"id":1528,"languages_code":935,"label":1520},111,[1530,1537,1547,1554],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1531},[1532,1533,1534,1535,1536],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1538},[1539,1540,1541,1542,1543,1544,1545,1546],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1548},[1549,1550,1551,1552,1553],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1555},[1556,1557,1558,1559,1560],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1563},[1564,1565,1566,1567,1568],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],[1571],{"languages_code":927,"name":1480,"slug":1481,"description":1482,"support_type":1407,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1486,"tile_description":1487,"id":174,"platforms_id":174,"docs_link":1483},{"id":319,"status":4,"created_on":905,"modified_on":906,"name":1573,"slug":1574,"description":1575,"docs_link":1576,"priority":8,"has_sdk":227,"sort":297,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1407,"show_in_spa":229,"is_file_format":229,"meta_title":1577,"meta_description":1578,"featured_on_web":227,"marketing_subtitle":912,"tile_subtitle":1579,"tile_description":1580,"is_enterprise":227,"is_popular":227,"primary_use_case":1581,"hierarchy_handling":1582,"best_for":1583,"file_extension":1584,"format_code_example":1585,"format_to_extension":1586,"upload_features":1587,"icon":1588,"meta_image":1589,"primary_tag":1591,"tags":1598,"integration_methods":1616,"recommended_methods":1648,"default_integration_method":1649,"faq_categories":1656,"translations":1659,"platforms_id":319},"RESX","resx","Quickly translate and manage your RESX files with Localazy or integrate Localazy with your .NET project and enjoy a fully automated localization process. ","\u002Fdocs\u002Fcli\u002Fresx-format","RESX localization – translate .NET RESX files | Localazy","Translate RESX files with Localazy. .NET resource structure, comments, and type info preserved, ready for satellite assembly compilation.",".NET localization","Translate .NET projects using RESX files and Localazy.","Standard format for Windows\u002F.NET localization","Flat key-value structure",".NET applications",".resx","```\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Croot>\n  \u003Cdata name=\"localazy_message\" xml:space=\"preserve\">\n    \u003Cvalue>Go international, today. With Localazy.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\u003C\u002Froot>\n```",{"resx":1574},[],{"id":1491},{"id":1590},"1f07bf83-9363-47d6-b21b-a5121c0efaf6",{"id":107,"status":4,"sort":50,"created_on":946,"label":1341,"hidden":227,"icon":1592,"translations":1593},{"id":1343},[1594,1595,1596,1597],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},{"id":551,"languages_code":932,"label":1349},{"id":641,"languages_code":935,"label":1341},[1599,1606],{"id":107,"status":4,"sort":50,"label":1341,"hidden":227,"created_on":946,"icon":1600,"translations":1601},{"id":1343},[1602,1603,1604,1605],{"id":107,"languages_code":927,"label":1341},{"id":423,"languages_code":929,"label":1347},{"id":551,"languages_code":932,"label":1349},{"id":641,"languages_code":935,"label":1341},{"id":314,"status":4,"sort":319,"label":1607,"hidden":229,"created_on":946,"icon":8,"translations":1608},"C#",[1609,1610,1612,1614],{"id":314,"languages_code":927,"label":1607},{"id":1611,"languages_code":929,"label":1607},103,{"id":1613,"languages_code":932,"label":1607},108,{"id":1615,"languages_code":935,"label":1607},113,[1617,1624,1634,1641],{"id":107,"status":4,"sort":57,"label":838,"alternative_label":8,"slug":842,"description":956,"documentation_link":957,"loc_icon":842,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1618},[1619,1620,1621,1622,1623],{"id":107,"languages_code":927,"label":838,"description":956,"slug":842},{"id":961,"languages_code":929,"label":838,"description":962,"slug":842},{"id":849,"languages_code":935,"label":838,"description":964,"slug":842},{"id":632,"languages_code":932,"label":838,"description":966,"slug":842},{"id":968,"languages_code":969,"label":838,"description":8,"slug":8},{"id":22,"status":4,"sort":50,"label":971,"alternative_label":8,"slug":972,"description":973,"documentation_link":974,"loc_icon":975,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1625},[1626,1627,1628,1629,1630,1631,1632,1633],{"id":22,"languages_code":927,"label":971,"description":973,"slug":972},{"id":358,"languages_code":929,"label":979,"description":980,"slug":8},{"id":551,"languages_code":935,"label":971,"description":973,"slug":972},{"id":518,"languages_code":932,"label":983,"description":984,"slug":8},{"id":469,"languages_code":929,"label":986,"description":987,"slug":972},{"id":478,"languages_code":935,"label":971,"description":973,"slug":972},{"id":751,"languages_code":932,"label":983,"description":984,"slug":972},{"id":991,"languages_code":969,"label":992,"description":993,"slug":8},{"id":16,"status":4,"sort":107,"label":995,"alternative_label":996,"slug":997,"description":998,"documentation_link":999,"loc_icon":1000,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1635},[1636,1637,1638,1639,1640],{"id":16,"languages_code":927,"label":995,"description":998,"slug":997},{"id":285,"languages_code":929,"label":1004,"description":1005,"slug":8},{"id":449,"languages_code":935,"label":995,"description":998,"slug":997},{"id":1008,"languages_code":932,"label":1009,"description":1010,"slug":8},{"id":1012,"languages_code":969,"label":1013,"description":1014,"slug":8},{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1642},[1643,1644,1645,1646,1647],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[],{"id":7,"status":4,"sort":22,"label":1016,"alternative_label":826,"slug":607,"description":1017,"documentation_link":1018,"loc_icon":607,"is_official_plugin":227,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1650},[1651,1652,1653,1654,1655],{"id":7,"languages_code":927,"label":1016,"description":1017,"slug":607},{"id":274,"languages_code":929,"label":1022,"description":1023,"slug":607},{"id":441,"languages_code":935,"label":1016,"description":1017,"slug":607},{"id":510,"languages_code":932,"label":1026,"description":1027,"slug":607},{"id":1029,"languages_code":969,"label":1030,"description":1031,"slug":8},[1657],{"id":423,"status":4,"created_on":1658,"sort":8,"slug":1574,"label":1573,"on_faq_index":8},"2022-08-01T16:44:06.000Z",[1660],{"languages_code":927,"name":1573,"slug":1574,"description":1575,"support_type":1407,"meta_title":8,"meta_description":8,"marketing_subtitle":912,"tile_subtitle":1579,"tile_description":1580,"id":319,"platforms_id":319,"docs_link":1576},{"id":728,"status":4,"created_on":905,"modified_on":906,"name":731,"slug":730,"description":1662,"docs_link":1663,"priority":8,"has_sdk":8,"sort":729,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1664,"show_in_spa":229,"is_file_format":8,"meta_title":1665,"meta_description":1666,"featured_on_web":229,"marketing_subtitle":1664,"tile_subtitle":1664,"tile_description":1667,"is_enterprise":227,"is_popular":229,"primary_use_case":8,"hierarchy_handling":8,"best_for":8,"file_extension":8,"format_code_example":8,"format_to_extension":8,"upload_features":8,"icon":1668,"meta_image":1669,"primary_tag":1671,"tags":1683,"integration_methods":1727,"recommended_methods":1747,"default_integration_method":1748,"faq_categories":1755,"translations":1758,"platforms_id":728},"Enjoy seamless integration of Strapi & Localazy and translate your website efficiently. Download the official Localazy plugin in the Strapi Marketplace to get started!","\u002Fdocs\u002Fstrapi\u002Fstrapi-plugin-introduction","Localization Plugin","Strapi localization – official plugin | Localazy","Localize your Strapi project with the official Localazy plugin from the Strapi Marketplace. Easy setup, efficient translation of your content.","Localize your Strapi website with our official localization plugin. Easy setup and installation.",{"id":733},{"id":1670},"5995b721-a2ea-487e-ad4b-298a489bbd24",{"id":29,"status":4,"sort":36,"created_on":946,"label":1672,"hidden":227,"icon":1673,"translations":1675},"CMS",{"id":1674},"1172a655-928c-4594-9263-d8afdfd9cd79",[1676,1677,1679,1681],{"id":29,"languages_code":927,"label":1672},{"id":1678,"languages_code":929,"label":1672},73,{"id":1680,"languages_code":932,"label":1672},81,{"id":1682,"languages_code":935,"label":1672},84,[1684,1696,1708,1715],{"id":166,"status":4,"sort":162,"label":1685,"hidden":227,"created_on":946,"icon":8,"translations":1686},"Multilingual SEO",[1687,1688,1691,1694],{"id":166,"languages_code":927,"label":1685},{"id":1689,"languages_code":929,"label":1690},89,"SEO multilingüe",{"id":1692,"languages_code":932,"label":1693},94,"Vícejazyčné SEO",{"id":1695,"languages_code":935,"label":1685},99,{"id":602,"status":4,"sort":602,"label":369,"hidden":227,"created_on":946,"icon":1697,"translations":1699},{"id":1698},"e782ed3f-d954-45ca-8b17-5bf5fe95f30a",[1700,1701,1704,1706],{"id":602,"languages_code":927,"label":369},{"id":1702,"languages_code":929,"label":1703},132,"Comercio electrónico",{"id":1705,"languages_code":932,"label":369},137,{"id":1707,"languages_code":935,"label":369},142,{"id":29,"status":4,"sort":36,"label":1672,"hidden":227,"created_on":946,"icon":1709,"translations":1710},{"id":1674},[1711,1712,1713,1714],{"id":29,"languages_code":927,"label":1672},{"id":1678,"languages_code":929,"label":1672},{"id":1680,"languages_code":932,"label":1672},{"id":1682,"languages_code":935,"label":1672},{"id":16,"status":4,"sort":57,"label":1716,"hidden":227,"created_on":946,"icon":1717,"translations":1719},"Marketing tools",{"id":1718},"098fe6a4-dd2e-42d8-937e-2d8121e6e266",[1720,1721,1724,1726],{"id":16,"languages_code":927,"label":1716},{"id":1722,"languages_code":929,"label":1723},43,"Herramientas de marketing",{"id":498,"languages_code":932,"label":1725},"Marketingové nástroje",{"id":576,"languages_code":935,"label":1716},[1728],{"id":67,"status":4,"sort":8,"label":1729,"alternative_label":1730,"slug":1731,"description":1732,"documentation_link":1733,"loc_icon":1734,"is_official_plugin":229,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1735},"Official Strapi Plugin","Official Plugin","official-strapi-plugin","Our developers maintain an official Strapi localization plugin. Start in a few clicks!","\u002Fdocs\u002Fstrapi","localazy-box",[1736,1737,1740,1741,1744],{"id":67,"languages_code":927,"label":1729,"description":1732,"slug":1731},{"id":1722,"languages_code":929,"label":1738,"description":1739,"slug":8},"Complemento Oficial de Strapi","Nuestros desarrolladores mantienen un complemento oficial de localización de Strapi. ¡Empiece en unos pocos clics!",{"id":567,"languages_code":935,"label":1729,"description":1732,"slug":1731},{"id":641,"languages_code":932,"label":1742,"description":1743,"slug":8},"Oficiál Plugin Strapi","Naši vývojáři udržují a neustále vylepšují oficiální lokalizační plugin Strapi. Začněte několika kliknutími!",{"id":1689,"languages_code":969,"label":1745,"description":1746,"slug":8},"Offizielles Strapi-Plugin","Unsere Entwickler pflegen ein offizielles Strapi-Lokalisierungs-Plugin. Starten Sie mit ein paar Klicks!",[],{"id":67,"status":4,"sort":8,"label":1729,"alternative_label":1730,"slug":1731,"description":1732,"documentation_link":1733,"loc_icon":1734,"is_official_plugin":229,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1749},[1750,1751,1752,1753,1754],{"id":67,"languages_code":927,"label":1729,"description":1732,"slug":1731},{"id":1722,"languages_code":929,"label":1738,"description":1739,"slug":8},{"id":567,"languages_code":935,"label":1729,"description":1732,"slug":1731},{"id":641,"languages_code":932,"label":1742,"description":1743,"slug":8},{"id":1689,"languages_code":969,"label":1745,"description":1746,"slug":8},[1756],{"id":274,"status":4,"created_on":1757,"sort":8,"slug":730,"label":731,"on_faq_index":8},"2022-06-16T09:24:13.000Z",[1759],{"languages_code":927,"name":731,"slug":730,"description":1662,"support_type":1664,"meta_title":8,"meta_description":8,"marketing_subtitle":1664,"tile_subtitle":1664,"tile_description":1667,"id":728,"platforms_id":728,"docs_link":1663},{"id":518,"status":4,"created_on":905,"modified_on":906,"name":738,"slug":737,"description":8,"docs_link":1761,"priority":8,"has_sdk":227,"sort":510,"highlighted":227,"in_menu":229,"changefreq":8,"support_type":1762,"show_in_spa":229,"is_file_format":227,"meta_title":1763,"meta_description":1764,"featured_on_web":229,"marketing_subtitle":1765,"tile_subtitle":1766,"tile_description":1767,"is_enterprise":227,"is_popular":229,"primary_use_case":8,"hierarchy_handling":8,"best_for":8,"file_extension":8,"format_code_example":8,"format_to_extension":8,"upload_features":1768,"icon":1769,"meta_image":1770,"primary_tag":1772,"tags":1785,"integration_methods":1793,"recommended_methods":1806,"default_integration_method":1807,"faq_categories":1813,"translations":1814,"platforms_id":518},"\u002Fdocs\u002Fintegrations\u002Fquick-start-figma","plugin","Figma integration – translate your designs | Localazy","Translate Figma designs with the Localazy plugin. Preview layouts in every language before development and reuse the translations in your product.","Figma plugin","Localization plugin","Quickly translate your Figma designs and seamlessly reuse the translations during the development of your project.",[],{"id":740},{"id":1771},"7573fed6-8817-4cb4-84d2-be327e6c4891",{"id":22,"status":4,"sort":62,"created_on":946,"label":1773,"hidden":227,"icon":1774,"translations":1776},"Design tools",{"id":1775},"1053d863-b690-4fbd-aadf-dbf2ba282768",[1777,1778,1781,1784],{"id":22,"languages_code":927,"label":1773},{"id":1779,"languages_code":929,"label":1780},42,"Herramientas de diseño",{"id":1782,"languages_code":932,"label":1783},49,"Nástroje pro návrh",{"id":624,"languages_code":935,"label":1773},[1786],{"id":22,"status":4,"sort":62,"label":1773,"hidden":227,"created_on":946,"icon":1787,"translations":1788},{"id":1775},[1789,1790,1791,1792],{"id":22,"languages_code":927,"label":1773},{"id":1779,"languages_code":929,"label":1780},{"id":1782,"languages_code":932,"label":1783},{"id":624,"languages_code":935,"label":1773},[1794],{"id":62,"status":4,"sort":8,"label":1730,"alternative_label":1730,"slug":1795,"description":1796,"documentation_link":152,"loc_icon":1734,"is_official_plugin":229,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1797},"official-plugin","Our developers maintain an official plugin for this integration. Start in a few clicks!",[1798,1799,1802,1803],{"id":62,"languages_code":927,"label":1730,"description":1796,"slug":1795},{"id":347,"languages_code":929,"label":1800,"description":1801,"slug":8},"Plugin Oficial","Nuestros desarrolladores mantienen un plugin oficial para esta integración. ¡Empiece con unos pocos clics!",{"id":338,"languages_code":935,"label":1730,"description":1796,"slug":1795},{"id":531,"languages_code":932,"label":1804,"description":1805,"slug":8},"Oficiální Plugin","Naši vývojáři udržují a neustále vylepšují oficiální plugin pro tuto integraci. Začněte několika kliknutími!",[],{"id":62,"status":4,"sort":8,"label":1730,"alternative_label":1730,"slug":1795,"description":1796,"documentation_link":152,"loc_icon":1734,"is_official_plugin":229,"is_universal_plugin":227,"universal_plugin_vendor":8,"translations":1808},[1809,1810,1811,1812],{"id":62,"languages_code":927,"label":1730,"description":1796,"slug":1795},{"id":347,"languages_code":929,"label":1800,"description":1801,"slug":8},{"id":338,"languages_code":935,"label":1730,"description":1796,"slug":1795},{"id":531,"languages_code":932,"label":1804,"description":1805,"slug":8},[],[1815],{"languages_code":927,"name":738,"slug":737,"description":8,"support_type":1762,"meta_title":8,"meta_description":8,"marketing_subtitle":1765,"tile_subtitle":1766,"tile_description":1767,"id":518,"platforms_id":518,"docs_link":1761},{"id":1817,"owner":1818,"created_by":8,"sort":8,"title":1823,"slug":1824,"modified_on":53,"created_on":1825,"pinned":227,"badge":8,"priority":1826,"main_image":1827,"status":4,"tags":1828,"dictionary":1836,"reading_time":1837,"excerpt":-1,"og_title":53,"og_description":53,"og_image":53},"69d78a237ab1270001eddabf",{"id":1819,"first_name":1820,"last_name":53,"slug":1821,"avatar":1822},"606c233dcf7b6a0001d1da93","Petr Hodný","petr-hodny","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fpetr.png","Translation API: Translate your content on the fly with Localazy AI!","translation-api-translate-your-content-on-the-fly-with-localazy-ai","2026-04-24T09:27:26.000+02:00","0.7","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F04\u002FLocalazy-AI-translation-api.png",[1829,1831,1834],{"id":518,"created_on":1830,"status":4,"label":838,"slug":842,"on_index_page":227},"2026-08-28 13:30:50",{"id":469,"created_on":1830,"status":4,"label":1832,"slug":1833,"on_index_page":229},"AI","ai",{"id":518,"created_on":1830,"status":4,"label":419,"slug":1835,"on_index_page":229},"localization",[],0,{"id":1839,"owner":1840,"created_by":8,"sort":8,"title":1845,"slug":1846,"modified_on":53,"created_on":1847,"pinned":227,"badge":8,"priority":1826,"main_image":1848,"status":4,"tags":1849,"dictionary":1859,"reading_time":1837,"excerpt":-1,"og_title":53,"og_description":53,"og_image":53},"6a773d768550a30001409dc2",{"id":1841,"first_name":1842,"last_name":53,"slug":1843,"avatar":1844},"6824a22d63350c0001d5a5cb","Kevine Nzapdi","kevine-nzapdi","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002FKevine.png","How to localize a Next.js app with next-intl and Localazy","localize-nextjs-app-next-intl-localazy","2026-08-28T15:29:22.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fnext.png",[1850,1853,1855],{"id":478,"created_on":1830,"status":4,"label":1851,"slug":1852,"on_index_page":227},"Next.js","next-js",{"id":518,"created_on":1830,"status":4,"label":1854,"slug":1854,"on_index_page":229},"i18n",{"id":1856,"created_on":1830,"status":4,"label":1857,"slug":1858,"on_index_page":227},6556628,"Tutorial","tutorial",[],{"post":1861,"relatedPosts":1952,"banner":2012},{"id":1839,"owner":1862,"created_by":8,"sort":8,"title":1845,"slug":1846,"modified_on":1847,"created_on":1847,"pinned":229,"badge":8,"priority":1826,"main_image":1848,"status":4,"tags":1863,"dictionary":1867,"reading_time":154,"excerpt":1895,"og_title":53,"og_description":53,"og_image":53,"content":1896,"meta_title":1897,"meta_description":1898,"canonical":53,"cta":1899,"fullGhostPost":1907},{"id":1841,"first_name":1842,"last_name":53,"slug":1843,"avatar":1844},[1864,1865,1866],{"id":478,"created_on":1830,"status":4,"label":1851,"slug":1852,"on_index_page":227},{"id":518,"created_on":1830,"status":4,"label":1854,"slug":1854,"on_index_page":229},{"id":1856,"created_on":1830,"status":4,"label":1857,"slug":1858,"on_index_page":227},[1868,1876],{"id":1869,"status":4,"owner":1870,"created_on":1871,"title":1851,"excerpt":1872,"content":1873,"slug":1874,"meta_title":8,"meta_description":8,"canonical":8,"related_terms":1875},156,"562275e3-c1f6-48fa-ae16-dc81789ee6e0","2024-01-25T14:00:08.000Z","Next.js is a web development framework for React applications created by Vercel. It is written in JavaScript, TypeScript, and Rust.","[This framework](https:\u002F\u002Fnextjs.org) allows you to create full-stack web applications that include the latest React features.\n\nIt offers:\n- Server and client-side rendering.\n- Dynamic HTML streaming.\n- CSS support.\n- Advanced routing and nested layouts for your UI.\n- Serverless and data fetching functions.","next.js",[],{"id":1877,"status":4,"owner":1878,"created_on":1879,"title":1880,"excerpt":1881,"content":1882,"slug":1883,"meta_title":53,"meta_description":53,"canonical":53,"related_terms":1884},410,"a5e46ee7-1f50-4f81-ae2d-68a664c76aa2","2026-05-12T07:09:27.000Z","Git-based localization","A localization approach where translation files are stored, versioned, and managed directly in a Git repository alongside the source code.","In Git-based localization, translation files live in the same repository as the codebase. Developers commit string files in formats like JSON, YAML, or XLIFF, and changes to translatable content are tracked through pull requests and branches, just like any other code change. This keeps localization tightly coupled with the development cycle and removes the need for manual file handoffs between developers and translators.\n\nThe main appeal is consistency. When a new feature ships, the strings for it can be reviewed, approved, and merged as part of the same workflow the team already uses. There is no separate process to manage, and translation history follows the same audit trail as the rest of the codebase.\n\n### ⚙️ How it fits into localization workflows\n\nIn practice, Git-based localization often connects to a translation management system (TMS) through an integration or CLI tool. Developers push updated source files to the repository, the TMS picks them up automatically, translations are completed, and the results are committed back. This creates a loop where localization happens in parallel with development rather than after it.\n\nThis approach works well with continuous localization, where strings are translated incrementally as they are written rather than in large batches before a release.\n\n### 🔁 Key points about Git-based localization\n\n* Translation files are versioned alongside code, so rollbacks and history are straightforward.\n* Developers work with familiar tools and don't need to learn a separate file exchange process.\n* [Branching](https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fbranching \"https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fbranching\") allows teams to test localized versions in staging before merging to production.\n* Pull requests give reviewers visibility into what changed and why, including string updates.\n* Automation through CI\u002FCD pipelines can trigger translation updates on every commit or merge.\n\n### What to watch out for\n\nGit-based localization can create friction when translators are not comfortable working in a developer environment. Conflicts can also arise if translated files are edited both in the repository and in an external tool at the same time. A clear source of truth and a well-configured sync process between the repo and the TMS are important to avoid overwrites.\n\n### How Localazy supports Git-based workflows\n\nLocalazy integrates with [GitHub](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fintegrations\u002Fquick-start-github-actions \"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fintegrations\u002Fquick-start-github-actions\"), [GitLab](https:\u002F\u002Flocalazy.com\u002Fblog\u002Fautomated-localization-gitlab-cicd-localazy \"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fautomated-localization-gitlab-cicd-localazy\"), and [Bitbucket](https:\u002F\u002Flocalazy.com\u002Fblog\u002Fautomated-localization-bitbucket-pipelines-localazy \"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fautomated-localization-bitbucket-pipelines-localazy\"), allowing teams to automate the full localization loop from code push to translated file delivery. You can configure the CLI to upload new source strings and download translations as part of your existing CI\u002FCD pipeline, keeping developers out of the day-to-day translation process after the initial setup.\n\n> *See how to connect your repository in the [Localazy CLI documentation](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fthe-basics \"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fthe-basics\").*","git-based-localization",[1885,1888,1890,1893],{"id":1886,"slug":1887},210,"source-of-truth",{"id":1008,"slug":1889},"ci",{"id":1891,"slug":1892},222,"gitops",{"id":1894,"slug":581},403,"Routing breaks and metadata stays in English when you add a third language to a Next.js app. Learn how to avoid that with a full setup for four locales, next-intl for i18n, and Localazy to easily translate, manage and maintain the files.","\u003Cp>Internationalizing routes in \u003Ca href=\"https:\u002F\u002Fnextjs.org\u002F\">Next.js\u003C\u002Fa> is straightforward. What usually breaks setups is what comes next: keeping locale-aware routing, metadata, UI copy, and generated translation files coherent as the app grows.\u003C\u002Fp>\u003Cp>In this guide, we will build \u003Cstrong>a cleaner localization workflow for the Next.js App Router using \u003Ccode>next-intl\u003C\u002Fcode> and Localazy\u003C\u002Fstrong>. The result is a setup that handles runtime translation properly and gives you a practical way to add languages without turning localization into a maintenance problem.\u003C\u002Fp>\u003Ch2 id=\"what-youll-build\">🎯 What you’ll build \u003Ca class=\"markdownit-header-anchor\" href=\"#what-youll-build\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>We'll use \u003Cstrong>a small Next.js profile page \u003C\u002Fstrong>as our sample project. Using an existing structure, we'll work on the internationalization layer: routing, message loading, locale-aware navigation, metadata translation, and the Localazy upload\u002Fdownload workflow. By the end, you should have:\u003C\u002Fp>\u003Cul>\u003Cli>Locale-based routing (\u003Ccode>\u002Fen\u003C\u002Fcode>, \u003Ccode>\u002Ffr\u003C\u002Fcode>, \u003Ccode>\u002Fde\u003C\u002Fcode>, \u003Ccode>\u002Fja\u003C\u002Fcode>)\u003C\u002Fli>\u003Cli>A profile UI on the main page using server and client components with translations\u003C\u002Fli>\u003Cli>Localized metadata on the root route\u003C\u002Fli>\u003Cli>A language switcher that persists selection via URL\u003C\u002Fli>\u003Cli>A full Localazy integration for uploading source strings and downloading translations\u003C\u002Fli>\u003C\u002Ful>\u003Cp>You can view a working demo of the final result here:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776766874175_localazy-next-app.gif\" class=\"kg-image\" alt loading=\"lazy\">\u003C\u002Ffigure>\u003Cp>The example page includes three components:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>ProfileCard\u003C\u002Fcode>, which renders static labels and interpolated values such as the user’s name and role\u003C\u002Fli>\u003Cli>\u003Ccode>AgeCounter\u003C\u002Fcode>, which demonstrates ICU pluralization\u003C\u002Fli>\u003Cli>\u003Ccode>StatusForm\u003C\u002Fcode>, which uses translated form labels, dropdown options, buttons, and confirmation messages\u003C\u002Fli>\u003C\u002Ful>\u003Cp>This gives us enough surface area to cover common i18n patterns with Localazy.\u003C\u002Fp>\u003Ch2 id=\"project-structure\">🗂️ Project structure \u003Ca class=\"markdownit-header-anchor\" href=\"#project-structure\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>This is the structure we'll work with after downloading translations from Localazy:\u003C\u002Fp>\u003Cpre>\u003Ccode>localazy-nextjs\u002F\n├── messages\u002F\n│   ├── de.json\n│   ├── en.json\n│   ├── fr.json\n│   └── ja.json\n├── src\u002F\n│   ├── app\u002F\n│   │   └── [locale]\u002F\n│   │       ├── layout.tsx\n│   │       └── page.tsx\n│   ├── components\u002F\n│   │   ├── AgeCounter.tsx\n│   │   ├── LanguageSwitcher.tsx\n│   │   ├── ProfileCard.tsx\n│   │   └── StatusForm.tsx\n│   ├── i18n\u002F\n│   │   ├── navigation.ts\n│   │   ├── request.ts\n│   │   └── routing.ts\n│   └── proxy.ts\n├── localazy.json\n├── localazy.keys.json\n├── next.config.ts\n└── package.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The \u003Ccode>messages\u002F\u003C\u002Fcode> directory is at the project root. It contains the JSON message files used by \u003Ccode>next-intl\u003C\u002Fcode>. At the start of the workflow, only \u003Ccode>en.json\u003C\u002Fcode> needs to exist because English is the source language. Translated files such as \u003Ccode>fr.json\u003C\u002Fcode>, \u003Ccode>de.json\u003C\u002Fcode>, and \u003Ccode>ja.json\u003C\u002Fcode> will be generated later when you download translations from Localazy. The \u003Ccode>src\u002Fapp\u002F[locale]\u002F\u003C\u002Fcode> directory contains the locale-based route segment. This allows the same page to render under routes such as \u003Ccode>\u002Fen\u003C\u002Fcode>, \u003Ccode>\u002Ffr\u003C\u002Fcode>, \u003Ccode>\u002Fde\u003C\u002Fcode>, and \u003Ccode>\u002Fja\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>The \u003Ccode>src\u002Fi18n\u002F\u003C\u002Fcode> directory contains the shared internationalization configuration. \u003Ccode>routing.ts\u003C\u002Fcode> defines supported locales, \u003Ccode>request.ts\u003C\u002Fcode> loads the correct message file for each request, and \u003Ccode>navigation.ts\u003C\u002Fcode> provides locale-aware navigation helpers.\u003C\u002Fp>\u003Ch2 id=\"prerequisites\">📋 Prerequisites \u003Ca class=\"markdownit-header-anchor\" href=\"#prerequisites\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Before starting, make sure you have:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fnodejs.org\u002Fen\">Node.js\u003C\u002Fa> 24 or later\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fregister\">A Localazy account\u003C\u002Fa> (free tier is enough to follow this guide)\u003C\u002Fli>\u003Cli>Familiarity with Next.js App Router, TypeScript, and React Server Components\u003C\u002Fli>\u003Cli>The \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Finstallation\">Localazy CLI\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"1-step-1-install-next-intl\">1️⃣ Step 1: Install next-intl \u003Ca class=\"markdownit-header-anchor\" href=\"#1-step-1-install-next-intl\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Install \u003Ccode>next-intl\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">yarn add next-intl\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You can also use \u003Ccode>npm\u003C\u002Fcode>, \u003Ccode>pnpm\u003C\u002Fcode>, or \u003Ccode>bun\u003C\u002Fcode> depending on the package manager used in your project.\u003C\u002Fp>\u003Ch2 id=\"2-step-2-configure-the-next-intl-plugin\">2️⃣ Step 2: Configure the next-intl plugin \u003Ca class=\"markdownit-header-anchor\" href=\"#2-step-2-configure-the-next-intl-plugin\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>In your \u003Ccode>next.config.ts\u003C\u002Fcode>, wrap the Next.js config with the \u003Ccode>next-intl\u003C\u002Fcode> plugin:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import type { NextConfig } from 'next';\nimport createNextIntlPlugin from 'next-intl\u002Fplugin';\n\nconst withNextIntl = createNextIntlPlugin('.\u002Fsrc\u002Fi18n\u002Frequest.ts');\n\nconst nextConfig: NextConfig = {};\n\nexport default withNextIntl(nextConfig);\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The plugin points to \u003Ccode>src\u002Fi18n\u002Frequest.ts\u003C\u002Fcode>, which is where the app will load messages for each request. This keeps message loading on the server side and gives \u003Ccode>next-intl\u003C\u002Fcode> the configuration it needs during the build and request lifecycle.\u003C\u002Fp>\u003Ch2 id=\"3-step-3-define-the-routing-configuration\">3️⃣ Step 3: Define the routing configuration \u003Ca class=\"markdownit-header-anchor\" href=\"#3-step-3-define-the-routing-configuration\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Create \u003Ccode>\u003Cstrong>src\u002Fi18n\u002Frouting.ts\u003C\u002Fstrong>\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { defineRouting } from 'next-intl\u002Frouting';\n\nexport const routing = defineRouting({\n  locales: ['en'],\n  defaultLocale: 'en'\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>This file is the source of truth for the supported locales\u003C\u002Fstrong>. For now, only English is active because it's the only message file available. Later, after downloading translations, you can extend the list as you wish:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">locales: ['en', 'fr', 'de', 'ja']\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Do not add a locale here until the matching message file exists in \u003Ccode>messages\u002F\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"4-step-4-load-messages-per-request\">4️⃣ Step 4: Load messages per request \u003Ca class=\"markdownit-header-anchor\" href=\"#4-step-4-load-messages-per-request\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Make sure your \u003Ccode>src\u002Fi18n\u002Frequest.ts\u003C\u002Fcode> looks like this:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { getRequestConfig } from 'next-intl\u002Fserver';\nimport { hasLocale } from 'next-intl';\nimport { routing } from '.\u002Frouting';\n\nexport default getRequestConfig(async ({ requestLocale }) =&gt; {\n  const requested = await requestLocale;\n\n  const locale = hasLocale(routing.locales, requested)\n    ? requested\n    : routing.defaultLocale;\n\n  return {\n    locale,\n    messages: (await import(`..\u002F..\u002Fmessages\u002F${locale}.json`)).default\n  };\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This does two things: it validates the incoming locale against your supported list, and it loads the correct JSON file for that locale. next-intl allows you to define messages with arbitrary async logic in getRequestConfig, including dynamic imports like this one.\u003C\u002Fp>\u003Ch2 id=\"5-step-5-add-locale-aware-request-handling\">5️⃣ Step 5: Add locale-aware request handling \u003Ca class=\"markdownit-header-anchor\" href=\"#5-step-5-add-locale-aware-request-handling\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Create \u003Ccode>\u003Cstrong>src\u002Fproxy.ts\u003C\u002Fstrong>\u003C\u002Fcode> to run locale-aware request handling. As of Next.js 16, \u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fgetting-started\u002Fproxy\">middleware was renamed\u003C\u002Fa>; the behavior stays the same, but \u003Cstrong>proxy.ts\u003C\u002Fstrong> is now the current file convention:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import createMiddleware from 'next-intl\u002Fmiddleware';\nimport { routing } from '.\u002Fi18n\u002Frouting';\n\nexport default createMiddleware(routing);\n\nexport const config = {\n  matcher: '\u002F((?!api|trpc|_next|_vercel|.*\\\\..*).*)'\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The matcher excludes API routes, framework internals, Vercel system paths, and static files.\u003C\u002Fp>\u003Ch2 id=\"6-step-6-add-translations\">6️⃣ Step 6: Add translations \u003Ca class=\"markdownit-header-anchor\" href=\"#6-step-6-add-translations\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Create your source locale file at \u003Ccode>\u003Cstrong>messages\u002Fen.json\u003C\u002Fstrong>\u003C\u002Fcode>. \u003C\u002Fp>\u003Cp>Structure your source file to mirror the three component boundaries:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"ProfileCard\": {\n    \"greeting\": \"Welcome back, {name}\",\n    \"role_admin\": \"Administrator\",\n    \"role_member\": \"Member\"\n  },\n  \"AgeCounter\": {\n    \"age_label\": \"You are {count, plural, one {# year old} other {# years old}}\"\n  },\n  \"StatusForm\": {\n    \"status_available\": \"Available\",\n    \"status_busy\": \"Busy\",\n    \"status_away\": \"Away\",\n    \"save_button\": \"Save changes\",\n    \"save_confirm\": \"Your changes have been saved\"\n  },\n  \"nav\": {\n    \"switchLanguage\": \"Language\"\n  },\n  \"metadata\": {\n    \"profileTitle\": \"Profile | My App\",\n    \"profileDescription\": \"View and manage your profile details.\"\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The namespace layout is deliberate. Aligning namespaces with component boundaries keeps translation ownership clear, reduces lookup friction, and makes refactors safer as the UI grows. The \u003Ccode>age_label\u003C\u002Fcode> entry uses ICU plural syntax to ensure that singular and plural rendering stay in the message layer, avoiding leaking conditional logic into the component. Store the status labels as separate keys so they're easy to reference in the UI and simpler to manage in Localazy. \u003C\u002Fp>\u003Cp>With the dev server running, open \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Fen\u003C\u002Fcode> to verify the page. Once additional locale files are available, the same route will resolve under \u003Ccode>\u002Ffr\u003C\u002Fcode>, \u003Ccode>\u002Fde\u003C\u002Fcode>, and \u003Ccode>\u002Fja\u003C\u002Fcode> with the translated UI.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776763024061_profile.jpg\" class=\"kg-image\" alt=\"Screenshot of the sample project we'll be working on.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch2 id=\"7-step-7-add-language-switching\">7️⃣ Step 7: Add language switching \u003Ca class=\"markdownit-header-anchor\" href=\"#7-step-7-add-language-switching\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>A language switcher needs locale-aware navigation to build on, so start with the navigation helpers.\u003C\u002Fp>\u003Ch3 id=\"create-the-navigation-helpers\">Create the navigation helpers \u003Ca class=\"markdownit-header-anchor\" href=\"#create-the-navigation-helpers\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>In next-intl, \u003Ca href=\"https:\u002F\u002Fnext-intl.dev\u002Fdocs\u002Frouting\u002Fnavigation\">locale-aware navigation APIs\u003C\u002Fa> are created by calling \u003Ccode>createNavigation\u003C\u002Fcode> with your routing config. This returns wrappers such as \u003Ccode>Link\u003C\u002Fcode>, \u003Ccode>useRouter\u003C\u002Fcode>, and \u003Ccode>usePathname\u003C\u002Fcode> that integrate locale handling into navigation automatically.\u003C\u002Fp>\u003Cp> Create \u003Ccode>\u003Cstrong>src\u002Fi18n\u002Fnavigation.ts\u003C\u002Fstrong>\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { createNavigation } from 'next-intl\u002Fnavigation';\nimport { routing } from '.\u002Frouting';\n\nexport const { Link, redirect, usePathname, useRouter } = createNavigation(routing);\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Import these navigation helpers from your local \u003Ccode>navigation.ts\u003C\u002Fcode> file, not from \u003Ccode>next-intl\u002Fnavigation\u003C\u002Fcode> or \u003Ccode>next\u002Fnavigation\u003C\u002Fcode> directly. They behave like the standard Next.js navigation APIs, but are already wired to your \u003Ccode>routing\u003C\u002Fcode> config, so locale handling is built in. \u003Ccode>usePathname\u003C\u002Fcode> also returns the pathname without the locale prefix.\u003C\u002Fp>\u003Cp>At this point, \u003Ccode>src\u002Fi18n\u002F\u003C\u002Fcode> contains three files: \u003Ccode>routing.ts\u003C\u002Fcode>, \u003Ccode>request.ts\u003C\u002Fcode>, and \u003Ccode>navigation.ts\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch3 id=\"switch-locale\">Switch locale \u003Ca class=\"markdownit-header-anchor\" href=\"#switch-locale\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>\u003Cstrong>Create the language switcher as a client component\u003C\u002Fstrong>. It reads the active locale, gets the current pathname from your locale-aware navigation helpers, and replaces the URL with the same route under the newly selected locale. \u003Ccode>usePathname\u003C\u002Fcode> returns the current pathname without the locale prefix, and \u003Ccode>router.replace(pathname, {locale})\u003C\u002Fcode> switches locales on the current page.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">'use client';\n\nimport { useLocale, useTranslations } from 'next-intl';\nimport { usePathname, useRouter } from '@\u002Fi18n\u002Fnavigation';\nimport { routing } from '@\u002Fi18n\u002Frouting';\n\nexport default function LanguageSwitcher() {\n  const locale = useLocale();\n  const pathname = usePathname();\n  const router = useRouter();\n  const t = useTranslations('nav');\n\n  function handleChange(event: React.ChangeEvent&lt;HTMLSelectElement&gt;) {\n    router.replace(pathname, { locale: event.target.value });\n  }\n\n  return (\n    &lt;div&gt;\n      &lt;label htmlFor=\"locale-select\"&gt;{t('switchLanguage')}: &lt;\u002Flabel&gt;\n      &lt;select id=\"locale-select\" value={locale} onChange={handleChange}&gt;\n        {routing.locales.map((loc) =&gt; (\n          &lt;option key={loc} value={loc}&gt;\n            {loc.toUpperCase()}\n          &lt;\u002Foption&gt;\n        ))}\n      &lt;\u002Fselect&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>usePathname\u003C\u002Fcode> and \u003Ccode>useRouter\u003C\u002Fcode> come from the locale-aware helpers you created earlier.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776763742442_language-switch.jpg\" class=\"kg-image\" alt=\"Sample UI: language selector has been added on the top right.\" loading=\"lazy\">\u003Cfigcaption>Language selector has been added on the top right.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch3 id=\"persist-selection-via-url\">Persist selection via URL \u003Ca class=\"markdownit-header-anchor\" href=\"#persist-selection-via-url\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Since the locale is part of the \u003Ccode>pathname\u003C\u002Fcode>, the current language already persists across navigation. If you later add localized \u003Ccode>pathnames\u003C\u002Fcode>, you may also need to forward route \u003Ccode>params\u003C\u002Fcode> when switching locales. \u003C\u002Fp>\u003Cp>\u003Cstrong>Add the switcher to the layout\u003C\u002Fstrong> so it appears on every page. In this layout, \u003Ccode>messages\u003C\u002Fcode> comes from \u003Ccode>getMessages()\u003C\u002Fcode> and is passed to \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>, which makes translations available to client components such as \u003Ccode>LanguageSwitcher\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { getMessages } from \"next-intl\u002Fserver\";\nimport LanguageSwitcher from '@\u002Fcomponents\u002FLanguageSwitcher';\n\n...\n\nconst messages = await getMessages();\nreturn (    \n&lt;html lang={locale} className={poppins.variable}&gt; \n\t&lt;body&gt;\n\t    &lt;NextIntlClientProvider messages={messages}&gt;\n\t      &lt;header\n\t        style={{\n\t          padding: \"1rem\",\n\t          borderBottom: \"1px solid #eee\",\n\t          display: \"flex\",\n\t          justifyContent: \"space-between\",\n\t          alignItems: \"center\",\n\t      }}\n\t    &gt;\n\t      &lt;div style={{fontWeight: \"bold\", fontSize: 20}}&gt;Nextjs-Localazy&lt;\u002Fdiv&gt;\n\t        &lt;LanguageSwitcher \u002F&gt;\n\t    &lt;\u002Fheader&gt;\n\t      {children}\n\t  &lt;\u002FNextIntlClientProvider&gt;\n\t&lt;\u002Fbody&gt;\n&lt;\u002Fhtml&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"use-generatemetadata-with-translations\">Use generateMetadata with translations \u003Ca class=\"markdownit-header-anchor\" href=\"#use-generatemetadata-with-translations\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Search engines and social previews read whatever the metadata says, so it needs to match the active locale.\u003C\u002Fp>\u003Cp>Next.js generates route-level metadata through \u003Ccode>generateMetadata\u003C\u002Fcode>. To localize it, load translations inside that function with \u003Ccode>getTranslations\u003C\u002Fcode> from \u003Ccode>next-intl\u002Fserver\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { getTranslations } from 'next-intl\u002Fserver';\nimport type { Metadata } from 'next';\n\ntype Props = {\n  params: Promise&lt;{ locale: string }&gt;;\n};\n\nexport async function generateMetadata({ params }: Props): Promise&lt;Metadata&gt; {\n  const { locale } = await params;\n  const t = await getTranslations({ locale, namespace: 'metadata' });\n\n  return {\n    title: t('profileTitle'),\n    description: t('profileDescription'),\n  };\n}\n\n...\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>getTranslations\u003C\u002Fcode> is the async server-side translation API. Use it in places where hooks are not available, such as \u003Ccode>generateMetadata\u003C\u002Fcode>, route handlers, server actions, and async server components. It accepts \u003Ccode>locale\u003C\u002Fcode> explicitly. Here, the locale is read from the route params and passed to \u003Ccode>getTranslations\u003C\u002Fcode>, so the metadata is generated for the active locale.\u003C\u002Fp>\u003Cp>With this in place, visiting \u003Ccode>\u002Ffr\u003C\u002Fcode> can produce French \u003Ccode>&lt;title&gt;\u003C\u002Fcode> and \u003Ccode>&lt;meta name=\"description\"&gt;\u003C\u002Fcode> tags for that route, which is important for both users and locale-aware indexing.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776966208849_meta-data-translation.gif\" class=\"kg-image\" alt loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"server-vs-client-translation\">Server vs client translation \u003Ca class=\"markdownit-header-anchor\" href=\"#server-vs-client-translation\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>In the App Router, the rule is straightforward: \u003C\u002Fp>\u003Cul>\u003Cli>Use \u003Ccode>getTranslations\u003C\u002Fcode> in async server contexts\u003C\u002Fli>\u003Cli>Use \u003Ccode>useTranslations\u003C\u002Fcode> in components\u003C\u002Fli>\u003C\u002Ful>\u003Cp>In practice, that means async server components, \u003Ccode>generateMetadata\u003C\u002Fcode>, route handlers, and server actions should use \u003Ccode>getTranslations\u003C\u002Fcode>, while non-async shared components and client components can use \u003Ccode>useTranslations\u003C\u002Fcode>. \u003Ccode>next-intl\u003C\u002Fcode> explicitly distinguishes between \u003Ca href=\"https:\u002F\u002Fnext-intl.dev\u002Fdocs\u002Fenvironments\u002Fserver-client-components\">async and non-async server components\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Client components can only read translations through \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>. Server components read their configuration from \u003Ccode>i18n\u002Frequest.ts\u003C\u002Fcode>, while client components receive inherited props such as \u003Ccode>locale\u003C\u002Fcode> and \u003Ccode>messages\u003C\u002Fcode> from the provider rendered in the layout.\u003C\u002Fp>\u003Cp>The common mistakes are mixing those APIs across boundaries: calling \u003Ccode>useTranslations\u003C\u002Fcode> inside an async server component, or trying to use \u003Ccode>getTranslations\u003C\u002Fcode> inside a client component. Keeping that split clear avoids most \u003Ccode>next-intl\u003C\u002Fcode> runtime issues.\u003C\u002Fp>\u003Cp>One more detail matters for message delivery. \u003Cstrong>\u003Ccode>next-intl\u003C\u002Fcode> does not automatically send all messages to the client\u003C\u002Fstrong>. If you call \u003Ccode>getMessages()\u003C\u002Fcode> in the layout and pass the result to \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>, you are explicitly sending that message set to client components. That is fine for small apps. If your message payload grows, you can narrow what you pass to the provider.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">\u002F\u002F Full message set\nconst messages = await getMessages();\n\u002F\u002F Or selectively:\n\u002F\u002F messages={{ profile: (await import(`..\u002F..\u002Fmessages\u002F${locale}.json`)).default.profile }}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>For most apps, the full message object is acceptable at first. Start narrowing it only when the translation payload becomes large enough to matter.\u003C\u002Fp>\u003Ch3 id=\"when-manual-translation-stops-scaling\">When manual translation stops scaling \u003Ca class=\"markdownit-header-anchor\" href=\"#when-manual-translation-stops-scaling\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Rendering multiple locales correctly is only one part of localization. The harder problem starts when source strings change, new languages enter the workflow, and translated files aren't accurate across the codebase. \u003C\u002Fp>\u003Cp>Without dedicated translation infrastructure, the process usually degrades into file passing: someone exports \u003Ccode>en.json\u003C\u002Fcode>, sends it to a translator, receives edited files back, and merges changes by hand. New keys appear in the source file with no reliable way to detect gaps across \u003Ccode>fr\u003C\u002Fcode>, \u003Ccode>de\u003C\u002Fcode>, or \u003Ccode>ja\u003C\u002Fcode>. \u003Cstrong>Renamed keys leave stale entries behind and, as the number of locales grows, so does the risk of drift between source and translated files\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>At that point, translation management becomes operational overhead. That is the point where a translation platform like Localazy becomes useful. The same pattern applies in other frontend stacks too. For a useful comparison, see \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-foundations\">our guide to localizing an Angular app with Localazy\u003C\u002Fa>, which follows a similar translation workflow with different framework wiring.\u003C\u002Fp>\u003Cblockquote>\u003Cem>\u003Cstrong>📘 Related read\u003C\u002Fstrong>: \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Ftranslation-api-translate-your-content-on-the-fly-with-localazy-ai\">Translation API: Translate your content on the fly with Localazy AI!\u003C\u002Fa>\u003C\u002Fem>\u003C\u002Fblockquote>\u003Ch2 id=\"8-step-8-integrating-localazy-into-nextjs\">8️⃣ Step 8: Integrating Localazy into Next.js \u003Ca class=\"markdownit-header-anchor\" href=\"#8-step-8-integrating-localazy-into-nextjs\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Now it's time to install the CLI, connect it to a Localazy project, and wire uploads and downloads into your regular workflow.\u003C\u002Fp>\u003Ch3 id=\"install-the-cli\">Install the CLI \u003Ca class=\"markdownit-header-anchor\" href=\"#install-the-cli\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Finstallation\">Install the Localazy CLI\u003C\u002Fa> as a development dependency so everyone on the project uses the same version.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">yarn add -D @localazy\u002Fcli\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"create-a-localazy-project\">Create a Localazy project \u003Ca class=\"markdownit-header-anchor\" href=\"#create-a-localazy-project\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Go to Localazy, create a new project, and note your project token from the project settings:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776764730552_create+project.jpg\" class=\"kg-image\" alt=\"Screenshot of the next-js project creation in Localazy.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Cp>In the next step, select Next.js, then copy and store the CLI keys. These keys are used to authenticate upload and download operations.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776765082481_nextjs-api-keys.jpg\" class=\"kg-image\" alt=\"Screenshot of the Next.js integration inside Localazy.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"configure-localazyjson\">Configure localazy.json \u003Ca class=\"markdownit-header-anchor\" href=\"#configure-localazyjson\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Create \u003Ccode>\u003Cstrong>localazy.json\u003C\u002Fstrong>\u003C\u002Fcode> at the project root and paste this inside:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"upload\": {\n    \"files\": [\n      {\n        \"pattern\": \"messages\u002Fen.json\",\n        \"path\": \"${path}\",\n        \"type\": \"json\"\n      }\n    ]\n  },\n  \"download\": {\n    \"files\": [\n      {\n        \"output\": \"${path}\u002F${lang}.json\"\n      }\n    ]\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This file defines what gets uploaded and where translated files are written on download. The upload block uses \u003Ccode>\"path\": \"${path}\"\u003C\u002Fcode> so the CLI preserves the source file path. The download block uses \u003Ccode>${lang}\u003C\u002Fcode> so generated filenames keep the full locale code, including region or script variants when needed.\u003C\u002Fp>\u003Ch3 id=\"store-the-keys-separately\">Store the keys separately \u003Ca class=\"markdownit-header-anchor\" href=\"#store-the-keys-separately\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Keep the Localazy credentials in a separate \u003Ccode>localazy.keys.json\u003C\u002Fcode> file next to \u003Ccode>localazy.json\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"writeKey\": \"YOUR_WRITE_KEY\",\n  \"readKey\": \"YOUR_READ_KEY\"\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>Do not commit real keys to version control\u003C\u002Fstrong>. Add \u003Ccode>localazy.keys.json\u003C\u002Fcode> to \u003Ccode>.gitignore\u003C\u002Fcode> so the file stays local to your environment.\u003C\u002Fp>\u003Ch3 id=\"automate-uploads-and-downloads-in-cicd\">Automate uploads and downloads in CI\u002FCD \u003Ca class=\"markdownit-header-anchor\" href=\"#automate-uploads-and-downloads-in-cicd\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Running \u003Ccode>localazy upload\u003C\u002Fcode> and \u003Ccode>localazy download\u003C\u002Fcode> manually is fine while you are validating the workflow locally. In a team setup, those steps belong in CI\u002FCD. \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fhow-to-automate-your-localization-in-ci-cd-pipelines\">Localazy offers CLI-based automation for build pipelines\u003C\u002Fa> and provides guidance and examples for GitHub Actions and other CI systems. \u003C\u002Fp>\u003Cp>A practical pattern is to upload source strings when the source locale changes, manage translations in Localazy, then download the latest translated files as part of the build or release workflow so the deployed app includes the current locale set.\u003C\u002Fp>\u003Ch2 id=\"9-step-9-add-a-new-language-and-test\">9️⃣ Step 9: Add a new language and test \u003Ca class=\"markdownit-header-anchor\" href=\"#9-step-9-add-a-new-language-and-test\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>From here, adding a language takes barely any effort.\u003C\u002Fp>\u003Ch3 id=\"upload-source-strings\">Upload source strings \u003Ca class=\"markdownit-header-anchor\" href=\"#upload-source-strings\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Run the upload command:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">localazy upload\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This pushes \u003Ccode>messages\u002Fen.json\u003C\u002Fcode> to your Localazy project as the source locale. Once uploaded, the keys become available in the dashboard for translation.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776765767241_english+upload.jpg\" class=\"kg-image\" alt=\"Uploading the English source keys to the next-js project in Localazy.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"add-target-languages-in-localazy\">Add target languages in Localazy \u003Ca class=\"markdownit-header-anchor\" href=\"#add-target-languages-in-localazy\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>In the Localazy dashboard, add the target languages you want to support, for example here I added: French (\u003Ccode>fr\u003C\u002Fcode>), German (\u003Ccode>de\u003C\u002Fcode>), and Japanese (\u003Ccode>ja\u003C\u002Fcode>). You can use \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flocalazy-ai\">Localazy AI\u003C\u002Fa> to pre-translate the new locales (or choose from Localazy’s available \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fmachine-translations\">machine translation engines\u003C\u002Fa>) then download the completed files back into the project.\u003C\u002Fp>\u003Cp>For example, this is how I completed the Japanese translations using Localazy AI. In your project page, add a new language and select your provider:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png\" class=\"kg-image\" alt=\"Adding a new language to the next-js project using Localazy AI.\" loading=\"lazy\" width=\"1051\" height=\"607\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png 1051w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>After adding the language, click the \u003Cstrong>Translate\u003C\u002Fstrong> button next to it. \u003C\u002Fp>\u003Cp>In the \u003Cstrong>Suggestions\u003C\u002Fstrong> panel, under \u003Cstrong>AI Translation\u003C\u002Fstrong>, click \u003Cstrong>Generate\u003C\u002Fstrong> to create a Localazy AI suggestion for the selected string:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png\" class=\"kg-image\" alt=\"Generating a Localazy AI suggestion for a string.\" loading=\"lazy\" width=\"1581\" height=\"745\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png 1581w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Review the suggestion. If it fits your app’s context, click \u003Cstrong>Use this\u003C\u002Fstrong> to add it to the translation field.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg\" class=\"kg-image\" alt=\"Using a Localazy AI suggestion for a string.\" loading=\"lazy\" width=\"1591\" height=\"760\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg 1591w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>For each generated translation, review it in context and choose the necessary action: save it, send it for review, or mark it as needing improvements.\u003C\u002Fp>\u003Cp>Once the target languages are translated, they will appear in your Localazy project with their translation progress. Just confirm that every target language has a full progress bar before downloading the files and shipping them to production:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776765774233_translated+langs.jpg\" class=\"kg-image\" alt=\"Translation progress on the Localazy dashboard (all locales completed).\" loading=\"lazy\">\u003C\u002Ffigure>\u003Cblockquote>👀 Localazy’s \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics\">language statistics\u003C\u002Fa> view gives you a broader overview of translation progress, review status, and incomplete content across languages\u003C\u002Fblockquote>\u003Ch3 id=\"download-translations\">Download translations \u003Ca class=\"markdownit-header-anchor\" href=\"#download-translations\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Next, pull the translated files into your project with:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">localazy download\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>With the \u003Ccode>download\u003C\u002Fcode> mapping you configured earlier, this writes locale files under \u003Ccode>messages\u002F\u003C\u002Fcode> (for example, \u003Ccode>messages\u002Ffr.json\u003C\u002Fcode>, \u003Ccode>messages\u002Fde.json\u003C\u002Fcode>, and \u003Ccode>messages\u002Fja.json\u003C\u002Fcode>) using the same key structure as the source file.\u003C\u002Fp>\u003Ch3 id=\"update-the-routing-config\">Update the routing config \u003Ca class=\"markdownit-header-anchor\" href=\"#update-the-routing-config\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Once a new locale file exists, add that locale to \u003Ccode>\u003Cstrong>src\u002Fi18n\u002Frouting.ts\u003C\u002Fstrong>\u003C\u002Fcode>\u003Cstrong> \u003C\u002Fstrong>so it becomes part of your routing configuration:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export const routing = defineRouting({\n  locales: ['en', 'fr', 'de', 'ja'],\n  defaultLocale: 'en',\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"step-10-verify-in-the-ui\">🔟 Step 10: Verify in the UI \u003Ca class=\"markdownit-header-anchor\" href=\"#step-10-verify-in-the-ui\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Start the development server:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">yarn dev\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then open \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Ffr\u003C\u002Fcode>, \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Fde\u003C\u002Fcode> or \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Fja\u003C\u002Fcode>, or switch languages directly in the UI. As long as the corresponding message files exist and the locales are registered in \u003Ccode>routing.ts\u003C\u002Fcode>, the page will render in that locale using the same locale-aware navigation setup you already configured.\u003C\u002Fp>\u003Cp>For example, opening \u003Ccode>\u002Ffr\u003C\u002Fcode> should render the page in French, including the welcome message, age counter, status options, and localized metadata. The language switcher updates the URL and re-renders the page in the selected locale without a full reload:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776766856130_meta-data-translation.gif\" class=\"kg-image\" alt loading=\"lazy\">\u003C\u002Ffigure>\u003Ch2 id=\"troubleshooting\">🛠️ Troubleshooting \u003Ca class=\"markdownit-header-anchor\" href=\"#troubleshooting\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Ch3 id=\"what-does-lesscodegreatermissingmessagelesscodegreater-error-in-the-console-mean\">What does \u003Ccode>MISSING_MESSAGE\u003C\u002Fcode> error in the console mean? \u003Ca class=\"markdownit-header-anchor\" href=\"#what-does-lesscodegreatermissingmessagelesscodegreater-error-in-the-console-mean\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>A key exists in \u003Ccode>en.json\u003C\u002Fcode> but is missing from another locale file. Run \u003Ccode>localazy download\u003C\u002Fcode> to refresh generated locale files, then verify that the missing key exists in the target locale. By default, when a message fails to resolve, \u003Ccode>next-intl\u003C\u002Fcode> logs an error and renders the fallback \u003Ccode>${namespace}.${key}\u003C\u002Fcode> instead.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_B7403BF61DCC8397992BF80314AE66EF05E00ED94F28BA73D1E239B95B5522F4_1776972041770_image.png\" class=\"kg-image\" alt=\"MISSING_MESSAGE error in the console.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"how-do-i-fix-a-locale-stuck-in-a-redirect-loop\">How do I fix a locale stuck in a redirect loop? \u003Ca class=\"markdownit-header-anchor\" href=\"#how-do-i-fix-a-locale-stuck-in-a-redirect-loop\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>This is usually a routing mismatch. Make sure \u003Ccode>src\u002Fproxy.ts\u003C\u002Fcode> and the rest of the app all use the same \u003Ccode>routing\u003C\u002Fcode> object. \u003Ccode>createMiddleware(routing)\u003C\u002Fcode> handles locale negotiation, redirects, rewrites, and alternate links. Also note that in current Next.js, the file convention is \u003Ccode>proxy.ts\u003C\u002Fcode>. Older references to \u003Ccode>middleware.ts\u003C\u002Fcode> are outdated for this setup.\u003C\u002Fp>\u003Ch3 id=\"why-does-metadata-stay-in-english-after-switching-locale\">Why does metadata stay in English after switching locale? \u003Ca class=\"markdownit-header-anchor\" href=\"#why-does-metadata-stay-in-english-after-switching-locale\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Check that \u003Ccode>generateMetadata\u003C\u002Fcode> is using the active locale from the route params. A common mistake is hardcoding the source locale (eg. \u003Ccode>locale: 'en'\u003C\u002Fcode>), which forces the metadata to resolve in English every time.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export async function generateMetadata({ params }: Props): Promise&lt;Metadata&gt; {\n  const t = await getTranslations({ locale: 'en', namespace: 'metadata' });\n\n  return {\n    title: t('profileTitle'),\n    description: t('profileDescription')\n  };\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Instead, read the locale from \u003Ccode>params\u003C\u002Fcode> and pass it to \u003Ccode>getTranslations\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export async function generateMetadata({ params }:Props):Promise&lt;Metadata&gt; {\nconst { locale } = await params;\nconst t = await getTranslations({ locale, namespace:'metadata' });\n\nreturn {\n    title:t('profileTitle'),\n    description:t('profileDescription')\n  };\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>If the metadata key is missing from the target locale, you may also see a \u003Ccode>MISSING_MESSAGE\u003C\u002Fcode> error. In that case, run \u003Ccode>localazy download\u003C\u002Fcode> again and verify that the translated locale file contains the keys under the \u003Ccode>metadata\u003C\u002Fcode> namespace.\u003C\u002Fp>\u003Ch3 id=\"why-does-lesscodegreaterusetranslationslesscodegreater-work-in-server-components-but-not-in-client-components\">Why does \u003Ccode>useTranslations\u003C\u002Fcode> work in server components but not in client components? \u003Ca class=\"markdownit-header-anchor\" href=\"#why-does-lesscodegreaterusetranslationslesscodegreater-work-in-server-components-but-not-in-client-components\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>The client component is either outside \u003Ccode>NextIntlClientProvider\u003C\u002Fcode> or the provider is not receiving messages. In that case, \u003Ccode>next-intl\u003C\u002Fcode> throws a runtime error such as \u003Cem>“No intl context found. Have you configured the provider?”\u003C\u002Fem> If you are passing messages to the client, \u003Ccode>getMessages()\u003C\u002Fcode> belongs in the server-rendered layout and the result is passed into \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>This is an example runtime error that appears when a client component renders without \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_B7403BF61DCC8397992BF80314AE66EF05E00ED94F28BA73D1E239B95B5522F4_1776973096649_image.png\" class=\"kg-image\" alt=\"Screenshot of an example runtime error that appears when a client component renders without NextIntlClientProvider.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"why-does-lesscodegreaterusetranslationslesscodegreater-fail-inside-an-async-server-component\">Why does \u003Ccode>useTranslations\u003C\u002Fcode> fail inside an async server component? \u003Ca class=\"markdownit-header-anchor\" href=\"#why-does-lesscodegreaterusetranslationslesscodegreater-fail-inside-an-async-server-component\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>This is a server-side rendering failure. Depending on the environment, you may see a Next.js runtime overlay, an invalid hook error, or a generic \u003Ccode>500 Internal Server Error\u003C\u002Fcode> page in the browser. In async server components, use \u003Ccode>await getTranslations(...)\u003C\u002Fcode> instead, and reserve \u003Ccode>useTranslations(...)\u003C\u002Fcode> for non-async shared components and client components.\u003C\u002Fp>\u003Ch3 id=\"how-do-i-match-the-downloaded-json-structure-with-nested-keys-in-enjson\">How do I match the downloaded JSON structure with nested keys in en.json? \u003Ca class=\"markdownit-header-anchor\" href=\"#how-do-i-match-the-downloaded-json-structure-with-nested-keys-in-enjson\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Do not add \u003Ccode>features: [\"structured_json\"]\u003C\u002Fcode> for this setup. Both plain JSON and structured JSON \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fjson-format\">are supported\u003C\u002Fa> out of the box in Localazy, with no extra configuration required.\u003C\u002Fp>\u003Ch3 id=\"why-does-localazy-cli-reject-my-credentials\">Why does Localazy CLI reject my credentials? \u003Ca class=\"markdownit-header-anchor\" href=\"#why-does-localazy-cli-reject-my-credentials\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Use \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode>, not \u003Ccode>writeApiToken\u003C\u002Fcode> or \u003Ccode>readApiToken\u003C\u002Fcode>. \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fauthorization\">Key-file values override config-file values\u003C\u002Fa>, and command-line keys override both.\u003C\u002Fp>\u003Ch3 id=\"lesscodegreaterlocalazy-uploadlesscodegreater-cannot-find-the-config-file-whats-the-solution\">\u003Ccode>localazy upload\u003C\u002Fcode> cannot find the config file. What's the solution? \u003Ca class=\"markdownit-header-anchor\" href=\"#lesscodegreaterlocalazy-uploadlesscodegreater-cannot-find-the-config-file-whats-the-solution\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>The CLI looks for \u003Ccode>localazy.json\u003C\u002Fcode> in the current working directory by default. \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fcommand-line-options\">Command-line options\u003C\u002Fa> let you override that behavior: use \u003Ccode>-c\u003C\u002Fcode> to point to a specific config file, \u003Ccode>-k\u003C\u002Fcode> to point to a specific keys file, and \u003Ccode>-d\u003C\u002Fcode> to set the working directory.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\"># Run from the project root\ncd .\u002Flocalazy-nextjs\nlocalazy upload\n\n# Use a specific config file\nlocalazy upload -c .\u002Flocalazy.json\n\n# Use a specific working directory\nlocalazy upload -d .\n\n# Use both config and keys files explicitly\nlocalazy upload -c .\u002Flocalazy.json -k .\u002Flocalazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"conclusion\">🏁 Conclusion \u003Ca class=\"markdownit-header-anchor\" href=\"#conclusion\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>This setup gives you locale-aware routing, translated metadata, and four working locales without custom glue code. It also gives you \u003Cstrong>room to grow when you need it\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>Without a translation workflow, that growth turns into manual coordination, which often involves missing keys, stale entries, files passed back and forth between developers and translators... Localazy replaces that with five repeatable steps: \u003Cstrong>update the source file, upload, translate, download, deploy\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>Check out the complete \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGunkev\u002Flocalazy-nextjs\">GitHub repository\u003C\u002Fa> for this guide and compare it with your own implementation. Clone it, add a fifth locale, and run \u003Ccode>localazy upload\u003C\u002Fcode> . See how far you can take this before you run out of languages worth adding. 😄\u003C\u002Fp>","Next.js + next-intl + Localazy | Full guide","Build a Next.js App Router app in four languages using next-intl and Localazy. We cover routing, translated metadata, and the workflow for new locales.",{"id":43,"status":4,"created_on":1900,"modified_on":1901,"icon":1902,"header":1903,"description":1904,"button_label":1905,"link":1906},"2022-03-17T12:23:03.000Z","2026-08-06T13:06:01.000Z","member","Why developers love Localazy 💖","From mobile apps to SaaS platforms: see how product teams handle translations without slowing down release cycles.","See case studies","case-study",{"slug":1846,"id":1839,"uuid":1908,"title":1845,"html":1909,"comment_id":1839,"feature_image":1848,"featured":229,"visibility":1910,"email_recipient_filter":1911,"created_at":1912,"updated_at":1847,"published_at":1847,"custom_excerpt":1895,"codeinjection_head":8,"codeinjection_foot":8,"custom_template":8,"canonical_url":8,"authors":1913,"tags":1919,"primary_author":1949,"primary_tag":1950,"url":1951,"excerpt":1895,"reading_time":150,"access":229,"send_email_when_published":227,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":1897,"meta_description":1898,"email_subject":8,"frontmatter":8,"dictionary":1867,"cta":1899,"plainTags":1863},"8a133076-7d5c-46da-b1a3-150142cb099f","\u003Cp>Internationalizing routes in \u003Ca href=\"https:\u002F\u002Fnextjs.org\u002F\">Next.js\u003C\u002Fa> is straightforward. What usually breaks setups is what comes next: keeping locale-aware routing, metadata, UI copy, and generated translation files coherent as the app grows.\u003C\u002Fp>\u003Cp>In this guide, we will build \u003Cstrong>a cleaner localization workflow for the Next.js App Router using \u003Ccode>next-intl\u003C\u002Fcode> and Localazy\u003C\u002Fstrong>. The result is a setup that handles runtime translation properly and gives you a practical way to add languages without turning localization into a maintenance problem.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%8E%AF-what-you%E2%80%99ll-build\">🎯 What you’ll build\u003C\u002Fh2>\u003Cp>We'll use \u003Cstrong>a small Next.js profile page \u003C\u002Fstrong>as our sample project. Using an existing structure, we'll work on the internationalization layer: routing, message loading, locale-aware navigation, metadata translation, and the Localazy upload\u002Fdownload workflow. By the end, you should have:\u003C\u002Fp>\u003Cul>\u003Cli>Locale-based routing (\u003Ccode>\u002Fen\u003C\u002Fcode>, \u003Ccode>\u002Ffr\u003C\u002Fcode>, \u003Ccode>\u002Fde\u003C\u002Fcode>, \u003Ccode>\u002Fja\u003C\u002Fcode>)\u003C\u002Fli>\u003Cli>A profile UI on the main page using server and client components with translations\u003C\u002Fli>\u003Cli>Localized metadata on the root route\u003C\u002Fli>\u003Cli>A language switcher that persists selection via URL\u003C\u002Fli>\u003Cli>A full Localazy integration for uploading source strings and downloading translations\u003C\u002Fli>\u003C\u002Ful>\u003Cp>You can view a working demo of the final result here:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776766874175_localazy-next-app.gif\" class=\"kg-image\" alt loading=\"lazy\">\u003C\u002Ffigure>\u003Cp>The example page includes three components:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>ProfileCard\u003C\u002Fcode>, which renders static labels and interpolated values such as the user’s name and role\u003C\u002Fli>\u003Cli>\u003Ccode>AgeCounter\u003C\u002Fcode>, which demonstrates ICU pluralization\u003C\u002Fli>\u003Cli>\u003Ccode>StatusForm\u003C\u002Fcode>, which uses translated form labels, dropdown options, buttons, and confirmation messages\u003C\u002Fli>\u003C\u002Ful>\u003Cp>This gives us enough surface area to cover common i18n patterns with Localazy.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%97%82%EF%B8%8F-project-structure\">🗂️ Project structure\u003C\u002Fh2>\u003Cp>This is the structure we'll work with after downloading translations from Localazy:\u003C\u002Fp>\u003Cpre>\u003Ccode>localazy-nextjs\u002F\n├── messages\u002F\n│   ├── de.json\n│   ├── en.json\n│   ├── fr.json\n│   └── ja.json\n├── src\u002F\n│   ├── app\u002F\n│   │   └── [locale]\u002F\n│   │       ├── layout.tsx\n│   │       └── page.tsx\n│   ├── components\u002F\n│   │   ├── AgeCounter.tsx\n│   │   ├── LanguageSwitcher.tsx\n│   │   ├── ProfileCard.tsx\n│   │   └── StatusForm.tsx\n│   ├── i18n\u002F\n│   │   ├── navigation.ts\n│   │   ├── request.ts\n│   │   └── routing.ts\n│   └── proxy.ts\n├── localazy.json\n├── localazy.keys.json\n├── next.config.ts\n└── package.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The \u003Ccode>messages\u002F\u003C\u002Fcode> directory is at the project root. It contains the JSON message files used by \u003Ccode>next-intl\u003C\u002Fcode>. At the start of the workflow, only \u003Ccode>en.json\u003C\u002Fcode> needs to exist because English is the source language. Translated files such as \u003Ccode>fr.json\u003C\u002Fcode>, \u003Ccode>de.json\u003C\u002Fcode>, and \u003Ccode>ja.json\u003C\u002Fcode> will be generated later when you download translations from Localazy. The \u003Ccode>src\u002Fapp\u002F[locale]\u002F\u003C\u002Fcode> directory contains the locale-based route segment. This allows the same page to render under routes such as \u003Ccode>\u002Fen\u003C\u002Fcode>, \u003Ccode>\u002Ffr\u003C\u002Fcode>, \u003Ccode>\u002Fde\u003C\u002Fcode>, and \u003Ccode>\u002Fja\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>The \u003Ccode>src\u002Fi18n\u002F\u003C\u002Fcode> directory contains the shared internationalization configuration. \u003Ccode>routing.ts\u003C\u002Fcode> defines supported locales, \u003Ccode>request.ts\u003C\u002Fcode> loads the correct message file for each request, and \u003Ccode>navigation.ts\u003C\u002Fcode> provides locale-aware navigation helpers.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%93%8B-prerequisites\">📋 Prerequisites\u003C\u002Fh2>\u003Cp>Before starting, make sure you have:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fnodejs.org\u002Fen\">Node.js\u003C\u002Fa> 24 or later\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fregister\">A Localazy account\u003C\u002Fa> (free tier is enough to follow this guide)\u003C\u002Fli>\u003Cli>Familiarity with Next.js App Router, TypeScript, and React Server Components\u003C\u002Fli>\u003Cli>The \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Finstallation\">Localazy CLI\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"1%EF%B8%8F%E2%83%A3-step-1-install-next-intl\">1️⃣ Step 1: Install next-intl\u003C\u002Fh2>\u003Cp>Install \u003Ccode>next-intl\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">yarn add next-intl\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You can also use \u003Ccode>npm\u003C\u002Fcode>, \u003Ccode>pnpm\u003C\u002Fcode>, or \u003Ccode>bun\u003C\u002Fcode> depending on the package manager used in your project.\u003C\u002Fp>\u003Ch2 id=\"2%EF%B8%8F%E2%83%A3-step-2-configure-the-next-intl-plugin\">2️⃣ Step 2: Configure the next-intl plugin\u003C\u002Fh2>\u003Cp>In your \u003Ccode>next.config.ts\u003C\u002Fcode>, wrap the Next.js config with the \u003Ccode>next-intl\u003C\u002Fcode> plugin:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import type { NextConfig } from 'next';\nimport createNextIntlPlugin from 'next-intl\u002Fplugin';\n\nconst withNextIntl = createNextIntlPlugin('.\u002Fsrc\u002Fi18n\u002Frequest.ts');\n\nconst nextConfig: NextConfig = {};\n\nexport default withNextIntl(nextConfig);\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The plugin points to \u003Ccode>src\u002Fi18n\u002Frequest.ts\u003C\u002Fcode>, which is where the app will load messages for each request. This keeps message loading on the server side and gives \u003Ccode>next-intl\u003C\u002Fcode> the configuration it needs during the build and request lifecycle.\u003C\u002Fp>\u003Ch2 id=\"3%EF%B8%8F%E2%83%A3-step-3-define-the-routing-configuration\">3️⃣ Step 3: Define the routing configuration\u003C\u002Fh2>\u003Cp>Create \u003Ccode>\u003Cstrong>src\u002Fi18n\u002Frouting.ts\u003C\u002Fstrong>\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { defineRouting } from 'next-intl\u002Frouting';\n\nexport const routing = defineRouting({\n  locales: ['en'],\n  defaultLocale: 'en'\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>This file is the source of truth for the supported locales\u003C\u002Fstrong>. For now, only English is active because it's the only message file available. Later, after downloading translations, you can extend the list as you wish:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">locales: ['en', 'fr', 'de', 'ja']\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Do not add a locale here until the matching message file exists in \u003Ccode>messages\u002F\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"4%EF%B8%8F%E2%83%A3-step-4-load-messages-per-request\">4️⃣ Step 4: Load messages per request\u003C\u002Fh2>\u003Cp>Make sure your \u003Ccode>src\u002Fi18n\u002Frequest.ts\u003C\u002Fcode> looks like this:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { getRequestConfig } from 'next-intl\u002Fserver';\nimport { hasLocale } from 'next-intl';\nimport { routing } from '.\u002Frouting';\n\nexport default getRequestConfig(async ({ requestLocale }) =&gt; {\n  const requested = await requestLocale;\n\n  const locale = hasLocale(routing.locales, requested)\n    ? requested\n    : routing.defaultLocale;\n\n  return {\n    locale,\n    messages: (await import(`..\u002F..\u002Fmessages\u002F${locale}.json`)).default\n  };\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This does two things: it validates the incoming locale against your supported list, and it loads the correct JSON file for that locale. next-intl allows you to define messages with arbitrary async logic in getRequestConfig, including dynamic imports like this one.\u003C\u002Fp>\u003Ch2 id=\"5%EF%B8%8F%E2%83%A3-step-5-add-locale-aware-request-handling\">5️⃣ Step 5: Add locale-aware request handling\u003C\u002Fh2>\u003Cp>Create \u003Ccode>\u003Cstrong>src\u002Fproxy.ts\u003C\u002Fstrong>\u003C\u002Fcode> to run locale-aware request handling. As of Next.js 16, \u003Ca href=\"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fgetting-started\u002Fproxy\">middleware was renamed\u003C\u002Fa>; the behavior stays the same, but \u003Cstrong>proxy.ts\u003C\u002Fstrong> is now the current file convention:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import createMiddleware from 'next-intl\u002Fmiddleware';\nimport { routing } from '.\u002Fi18n\u002Frouting';\n\nexport default createMiddleware(routing);\n\nexport const config = {\n  matcher: '\u002F((?!api|trpc|_next|_vercel|.*\\\\..*).*)'\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The matcher excludes API routes, framework internals, Vercel system paths, and static files.\u003C\u002Fp>\u003Ch2 id=\"6%EF%B8%8F%E2%83%A3-step-6-add-translations\">6️⃣ Step 6: Add translations\u003C\u002Fh2>\u003Cp>Create your source locale file at \u003Ccode>\u003Cstrong>messages\u002Fen.json\u003C\u002Fstrong>\u003C\u002Fcode>. \u003C\u002Fp>\u003Cp>Structure your source file to mirror the three component boundaries:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"ProfileCard\": {\n    \"greeting\": \"Welcome back, {name}\",\n    \"role_admin\": \"Administrator\",\n    \"role_member\": \"Member\"\n  },\n  \"AgeCounter\": {\n    \"age_label\": \"You are {count, plural, one {# year old} other {# years old}}\"\n  },\n  \"StatusForm\": {\n    \"status_available\": \"Available\",\n    \"status_busy\": \"Busy\",\n    \"status_away\": \"Away\",\n    \"save_button\": \"Save changes\",\n    \"save_confirm\": \"Your changes have been saved\"\n  },\n  \"nav\": {\n    \"switchLanguage\": \"Language\"\n  },\n  \"metadata\": {\n    \"profileTitle\": \"Profile | My App\",\n    \"profileDescription\": \"View and manage your profile details.\"\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The namespace layout is deliberate. Aligning namespaces with component boundaries keeps translation ownership clear, reduces lookup friction, and makes refactors safer as the UI grows. The \u003Ccode>age_label\u003C\u002Fcode> entry uses ICU plural syntax to ensure that singular and plural rendering stay in the message layer, avoiding leaking conditional logic into the component. Store the status labels as separate keys so they're easy to reference in the UI and simpler to manage in Localazy. \u003C\u002Fp>\u003Cp>With the dev server running, open \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Fen\u003C\u002Fcode> to verify the page. Once additional locale files are available, the same route will resolve under \u003Ccode>\u002Ffr\u003C\u002Fcode>, \u003Ccode>\u002Fde\u003C\u002Fcode>, and \u003Ccode>\u002Fja\u003C\u002Fcode> with the translated UI.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776763024061_profile.jpg\" class=\"kg-image\" alt=\"Screenshot of the sample project we'll be working on.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch2 id=\"7%EF%B8%8F%E2%83%A3-step-7-add-language-switching\">7️⃣ Step 7: Add language switching\u003C\u002Fh2>\u003Cp>A language switcher needs locale-aware navigation to build on, so start with the navigation helpers.\u003C\u002Fp>\u003Ch3 id=\"create-the-navigation-helpers\">Create the navigation helpers\u003C\u002Fh3>\u003Cp>In next-intl, \u003Ca href=\"https:\u002F\u002Fnext-intl.dev\u002Fdocs\u002Frouting\u002Fnavigation\">locale-aware navigation APIs\u003C\u002Fa> are created by calling \u003Ccode>createNavigation\u003C\u002Fcode> with your routing config. This returns wrappers such as \u003Ccode>Link\u003C\u002Fcode>, \u003Ccode>useRouter\u003C\u002Fcode>, and \u003Ccode>usePathname\u003C\u002Fcode> that integrate locale handling into navigation automatically.\u003C\u002Fp>\u003Cp> Create \u003Ccode>\u003Cstrong>src\u002Fi18n\u002Fnavigation.ts\u003C\u002Fstrong>\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { createNavigation } from 'next-intl\u002Fnavigation';\nimport { routing } from '.\u002Frouting';\n\nexport const { Link, redirect, usePathname, useRouter } = createNavigation(routing);\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Import these navigation helpers from your local \u003Ccode>navigation.ts\u003C\u002Fcode> file, not from \u003Ccode>next-intl\u002Fnavigation\u003C\u002Fcode> or \u003Ccode>next\u002Fnavigation\u003C\u002Fcode> directly. They behave like the standard Next.js navigation APIs, but are already wired to your \u003Ccode>routing\u003C\u002Fcode> config, so locale handling is built in. \u003Ccode>usePathname\u003C\u002Fcode> also returns the pathname without the locale prefix.\u003C\u002Fp>\u003Cp>At this point, \u003Ccode>src\u002Fi18n\u002F\u003C\u002Fcode> contains three files: \u003Ccode>routing.ts\u003C\u002Fcode>, \u003Ccode>request.ts\u003C\u002Fcode>, and \u003Ccode>navigation.ts\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch3 id=\"switch-locale\">Switch locale\u003C\u002Fh3>\u003Cp>\u003Cstrong>Create the language switcher as a client component\u003C\u002Fstrong>. It reads the active locale, gets the current pathname from your locale-aware navigation helpers, and replaces the URL with the same route under the newly selected locale. \u003Ccode>usePathname\u003C\u002Fcode> returns the current pathname without the locale prefix, and \u003Ccode>router.replace(pathname, {locale})\u003C\u002Fcode> switches locales on the current page.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">'use client';\n\nimport { useLocale, useTranslations } from 'next-intl';\nimport { usePathname, useRouter } from '@\u002Fi18n\u002Fnavigation';\nimport { routing } from '@\u002Fi18n\u002Frouting';\n\nexport default function LanguageSwitcher() {\n  const locale = useLocale();\n  const pathname = usePathname();\n  const router = useRouter();\n  const t = useTranslations('nav');\n\n  function handleChange(event: React.ChangeEvent&lt;HTMLSelectElement&gt;) {\n    router.replace(pathname, { locale: event.target.value });\n  }\n\n  return (\n    &lt;div&gt;\n      &lt;label htmlFor=\"locale-select\"&gt;{t('switchLanguage')}: &lt;\u002Flabel&gt;\n      &lt;select id=\"locale-select\" value={locale} onChange={handleChange}&gt;\n        {routing.locales.map((loc) =&gt; (\n          &lt;option key={loc} value={loc}&gt;\n            {loc.toUpperCase()}\n          &lt;\u002Foption&gt;\n        ))}\n      &lt;\u002Fselect&gt;\n    &lt;\u002Fdiv&gt;\n  );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>usePathname\u003C\u002Fcode> and \u003Ccode>useRouter\u003C\u002Fcode> come from the locale-aware helpers you created earlier.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776763742442_language-switch.jpg\" class=\"kg-image\" alt=\"Sample UI: language selector has been added on the top right.\" loading=\"lazy\">\u003Cfigcaption>Language selector has been added on the top right.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch3 id=\"persist-selection-via-url\">Persist selection via URL\u003C\u002Fh3>\u003Cp>Since the locale is part of the \u003Ccode>pathname\u003C\u002Fcode>, the current language already persists across navigation. If you later add localized \u003Ccode>pathnames\u003C\u002Fcode>, you may also need to forward route \u003Ccode>params\u003C\u002Fcode> when switching locales. \u003C\u002Fp>\u003Cp>\u003Cstrong>Add the switcher to the layout\u003C\u002Fstrong> so it appears on every page. In this layout, \u003Ccode>messages\u003C\u002Fcode> comes from \u003Ccode>getMessages()\u003C\u002Fcode> and is passed to \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>, which makes translations available to client components such as \u003Ccode>LanguageSwitcher\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { getMessages } from \"next-intl\u002Fserver\";\nimport LanguageSwitcher from '@\u002Fcomponents\u002FLanguageSwitcher';\n\n...\n\nconst messages = await getMessages();\nreturn (    \n&lt;html lang={locale} className={poppins.variable}&gt; \n\t&lt;body&gt;\n\t    &lt;NextIntlClientProvider messages={messages}&gt;\n\t      &lt;header\n\t        style={{\n\t          padding: \"1rem\",\n\t          borderBottom: \"1px solid #eee\",\n\t          display: \"flex\",\n\t          justifyContent: \"space-between\",\n\t          alignItems: \"center\",\n\t      }}\n\t    &gt;\n\t      &lt;div style={{fontWeight: \"bold\", fontSize: 20}}&gt;Nextjs-Localazy&lt;\u002Fdiv&gt;\n\t        &lt;LanguageSwitcher \u002F&gt;\n\t    &lt;\u002Fheader&gt;\n\t      {children}\n\t  &lt;\u002FNextIntlClientProvider&gt;\n\t&lt;\u002Fbody&gt;\n&lt;\u002Fhtml&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"use-generatemetadata-with-translations\">Use generateMetadata with translations\u003C\u002Fh3>\u003Cp>Search engines and social previews read whatever the metadata says, so it needs to match the active locale.\u003C\u002Fp>\u003Cp>Next.js generates route-level metadata through \u003Ccode>generateMetadata\u003C\u002Fcode>. To localize it, load translations inside that function with \u003Ccode>getTranslations\u003C\u002Fcode> from \u003Ccode>next-intl\u002Fserver\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { getTranslations } from 'next-intl\u002Fserver';\nimport type { Metadata } from 'next';\n\ntype Props = {\n  params: Promise&lt;{ locale: string }&gt;;\n};\n\nexport async function generateMetadata({ params }: Props): Promise&lt;Metadata&gt; {\n  const { locale } = await params;\n  const t = await getTranslations({ locale, namespace: 'metadata' });\n\n  return {\n    title: t('profileTitle'),\n    description: t('profileDescription'),\n  };\n}\n\n...\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Ccode>getTranslations\u003C\u002Fcode> is the async server-side translation API. Use it in places where hooks are not available, such as \u003Ccode>generateMetadata\u003C\u002Fcode>, route handlers, server actions, and async server components. It accepts \u003Ccode>locale\u003C\u002Fcode> explicitly. Here, the locale is read from the route params and passed to \u003Ccode>getTranslations\u003C\u002Fcode>, so the metadata is generated for the active locale.\u003C\u002Fp>\u003Cp>With this in place, visiting \u003Ccode>\u002Ffr\u003C\u002Fcode> can produce French \u003Ccode>&lt;title&gt;\u003C\u002Fcode> and \u003Ccode>&lt;meta name=\"description\"&gt;\u003C\u002Fcode> tags for that route, which is important for both users and locale-aware indexing.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776966208849_meta-data-translation.gif\" class=\"kg-image\" alt loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"server-vs-client-translation\">Server vs client translation\u003C\u002Fh3>\u003Cp>In the App Router, the rule is straightforward: \u003C\u002Fp>\u003Cul>\u003Cli>Use \u003Ccode>getTranslations\u003C\u002Fcode> in async server contexts\u003C\u002Fli>\u003Cli>Use \u003Ccode>useTranslations\u003C\u002Fcode> in components\u003C\u002Fli>\u003C\u002Ful>\u003Cp>In practice, that means async server components, \u003Ccode>generateMetadata\u003C\u002Fcode>, route handlers, and server actions should use \u003Ccode>getTranslations\u003C\u002Fcode>, while non-async shared components and client components can use \u003Ccode>useTranslations\u003C\u002Fcode>. \u003Ccode>next-intl\u003C\u002Fcode> explicitly distinguishes between \u003Ca href=\"https:\u002F\u002Fnext-intl.dev\u002Fdocs\u002Fenvironments\u002Fserver-client-components\">async and non-async server components\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Client components can only read translations through \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>. Server components read their configuration from \u003Ccode>i18n\u002Frequest.ts\u003C\u002Fcode>, while client components receive inherited props such as \u003Ccode>locale\u003C\u002Fcode> and \u003Ccode>messages\u003C\u002Fcode> from the provider rendered in the layout.\u003C\u002Fp>\u003Cp>The common mistakes are mixing those APIs across boundaries: calling \u003Ccode>useTranslations\u003C\u002Fcode> inside an async server component, or trying to use \u003Ccode>getTranslations\u003C\u002Fcode> inside a client component. Keeping that split clear avoids most \u003Ccode>next-intl\u003C\u002Fcode> runtime issues.\u003C\u002Fp>\u003Cp>One more detail matters for message delivery. \u003Cstrong>\u003Ccode>next-intl\u003C\u002Fcode> does not automatically send all messages to the client\u003C\u002Fstrong>. If you call \u003Ccode>getMessages()\u003C\u002Fcode> in the layout and pass the result to \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>, you are explicitly sending that message set to client components. That is fine for small apps. If your message payload grows, you can narrow what you pass to the provider.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">\u002F\u002F Full message set\nconst messages = await getMessages();\n\u002F\u002F Or selectively:\n\u002F\u002F messages={{ profile: (await import(`..\u002F..\u002Fmessages\u002F${locale}.json`)).default.profile }}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>For most apps, the full message object is acceptable at first. Start narrowing it only when the translation payload becomes large enough to matter.\u003C\u002Fp>\u003Ch3 id=\"when-manual-translation-stops-scaling\">When manual translation stops scaling\u003C\u002Fh3>\u003Cp>Rendering multiple locales correctly is only one part of localization. The harder problem starts when source strings change, new languages enter the workflow, and translated files aren't accurate across the codebase. \u003C\u002Fp>\u003Cp>Without dedicated translation infrastructure, the process usually degrades into file passing: someone exports \u003Ccode>en.json\u003C\u002Fcode>, sends it to a translator, receives edited files back, and merges changes by hand. New keys appear in the source file with no reliable way to detect gaps across \u003Ccode>fr\u003C\u002Fcode>, \u003Ccode>de\u003C\u002Fcode>, or \u003Ccode>ja\u003C\u002Fcode>. \u003Cstrong>Renamed keys leave stale entries behind and, as the number of locales grows, so does the risk of drift between source and translated files\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>At that point, translation management becomes operational overhead. That is the point where a translation platform like Localazy becomes useful. The same pattern applies in other frontend stacks too. For a useful comparison, see \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-foundations\">our guide to localizing an Angular app with Localazy\u003C\u002Fa>, which follows a similar translation workflow with different framework wiring.\u003C\u002Fp>\u003Cblockquote>\u003Cem>\u003Cstrong>📘 Related read\u003C\u002Fstrong>: \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Ftranslation-api-translate-your-content-on-the-fly-with-localazy-ai\">Translation API: Translate your content on the fly with Localazy AI!\u003C\u002Fa>\u003C\u002Fem>\u003C\u002Fblockquote>\u003Ch2 id=\"8%EF%B8%8F%E2%83%A3-step-8-integrating-localazy-into-nextjs\">8️⃣ Step 8: Integrating Localazy into Next.js\u003C\u002Fh2>\u003Cp>Now it's time to install the CLI, connect it to a Localazy project, and wire uploads and downloads into your regular workflow.\u003C\u002Fp>\u003Ch3 id=\"install-the-cli\">Install the CLI\u003C\u002Fh3>\u003Cp>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Finstallation\">Install the Localazy CLI\u003C\u002Fa> as a development dependency so everyone on the project uses the same version.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">yarn add -D @localazy\u002Fcli\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"create-a-localazy-project\">Create a Localazy project\u003C\u002Fh3>\u003Cp>Go to Localazy, create a new project, and note your project token from the project settings:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776764730552_create+project.jpg\" class=\"kg-image\" alt=\"Screenshot of the next-js project creation in Localazy.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Cp>In the next step, select Next.js, then copy and store the CLI keys. These keys are used to authenticate upload and download operations.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776765082481_nextjs-api-keys.jpg\" class=\"kg-image\" alt=\"Screenshot of the Next.js integration inside Localazy.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"configure-localazyjson\">Configure localazy.json\u003C\u002Fh3>\u003Cp>Create \u003Ccode>\u003Cstrong>localazy.json\u003C\u002Fstrong>\u003C\u002Fcode> at the project root and paste this inside:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"upload\": {\n    \"files\": [\n      {\n        \"pattern\": \"messages\u002Fen.json\",\n        \"path\": \"${path}\",\n        \"type\": \"json\"\n      }\n    ]\n  },\n  \"download\": {\n    \"files\": [\n      {\n        \"output\": \"${path}\u002F${lang}.json\"\n      }\n    ]\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This file defines what gets uploaded and where translated files are written on download. The upload block uses \u003Ccode>\"path\": \"${path}\"\u003C\u002Fcode> so the CLI preserves the source file path. The download block uses \u003Ccode>${lang}\u003C\u002Fcode> so generated filenames keep the full locale code, including region or script variants when needed.\u003C\u002Fp>\u003Ch3 id=\"store-the-keys-separately\">Store the keys separately\u003C\u002Fh3>\u003Cp>Keep the Localazy credentials in a separate \u003Ccode>localazy.keys.json\u003C\u002Fcode> file next to \u003Ccode>localazy.json\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"writeKey\": \"YOUR_WRITE_KEY\",\n  \"readKey\": \"YOUR_READ_KEY\"\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>Do not commit real keys to version control\u003C\u002Fstrong>. Add \u003Ccode>localazy.keys.json\u003C\u002Fcode> to \u003Ccode>.gitignore\u003C\u002Fcode> so the file stays local to your environment.\u003C\u002Fp>\u003Ch3 id=\"automate-uploads-and-downloads-in-cicd\">Automate uploads and downloads in CI\u002FCD\u003C\u002Fh3>\u003Cp>Running \u003Ccode>localazy upload\u003C\u002Fcode> and \u003Ccode>localazy download\u003C\u002Fcode> manually is fine while you are validating the workflow locally. In a team setup, those steps belong in CI\u002FCD. \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fhow-to-automate-your-localization-in-ci-cd-pipelines\">Localazy offers CLI-based automation for build pipelines\u003C\u002Fa> and provides guidance and examples for GitHub Actions and other CI systems. \u003C\u002Fp>\u003Cp>A practical pattern is to upload source strings when the source locale changes, manage translations in Localazy, then download the latest translated files as part of the build or release workflow so the deployed app includes the current locale set.\u003C\u002Fp>\u003Ch2 id=\"9%EF%B8%8F%E2%83%A3-step-9-add-a-new-language-and-test\">9️⃣ Step 9: Add a new language and test\u003C\u002Fh2>\u003Cp>From here, adding a language takes barely any effort.\u003C\u002Fp>\u003Ch3 id=\"upload-source-strings\">Upload source strings\u003C\u002Fh3>\u003Cp>Run the upload command:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">localazy upload\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This pushes \u003Ccode>messages\u002Fen.json\u003C\u002Fcode> to your Localazy project as the source locale. Once uploaded, the keys become available in the dashboard for translation.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776765767241_english+upload.jpg\" class=\"kg-image\" alt=\"Uploading the English source keys to the next-js project in Localazy.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"add-target-languages-in-localazy\">Add target languages in Localazy\u003C\u002Fh3>\u003Cp>In the Localazy dashboard, add the target languages you want to support, for example here I added: French (\u003Ccode>fr\u003C\u002Fcode>), German (\u003Ccode>de\u003C\u002Fcode>), and Japanese (\u003Ccode>ja\u003C\u002Fcode>). You can use \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flocalazy-ai\">Localazy AI\u003C\u002Fa> to pre-translate the new locales (or choose from Localazy’s available \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fmachine-translations\">machine translation engines\u003C\u002Fa>) then download the completed files back into the project.\u003C\u002Fp>\u003Cp>For example, this is how I completed the Japanese translations using Localazy AI. In your project page, add a new language and select your provider:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png\" class=\"kg-image\" alt=\"Adding a new language to the next-js project using Localazy AI.\" loading=\"lazy\" width=\"1051\" height=\"607\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment8f824957-63e6-4991-a23.png 1051w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>After adding the language, click the \u003Cstrong>Translate\u003C\u002Fstrong> button next to it. \u003C\u002Fp>\u003Cp>In the \u003Cstrong>Suggestions\u003C\u002Fstrong> panel, under \u003Cstrong>AI Translation\u003C\u002Fstrong>, click \u003Cstrong>Generate\u003C\u002Fstrong> to create a Localazy AI suggestion for the selected string:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png\" class=\"kg-image\" alt=\"Generating a Localazy AI suggestion for a string.\" loading=\"lazy\" width=\"1581\" height=\"745\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Fattachment15b891a4-d1a0-4348-942.png 1581w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Review the suggestion. If it fits your app’s context, click \u003Cstrong>Use this\u003C\u002Fstrong> to add it to the translation field.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg\" class=\"kg-image\" alt=\"Using a Localazy AI suggestion for a string.\" loading=\"lazy\" width=\"1591\" height=\"760\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F08\u002Flocalazy-next-ai2.jpg 1591w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>For each generated translation, review it in context and choose the necessary action: save it, send it for review, or mark it as needing improvements.\u003C\u002Fp>\u003Cp>Once the target languages are translated, they will appear in your Localazy project with their translation progress. Just confirm that every target language has a full progress bar before downloading the files and shipping them to production:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776765774233_translated+langs.jpg\" class=\"kg-image\" alt=\"Translation progress on the Localazy dashboard (all locales completed).\" loading=\"lazy\">\u003C\u002Ffigure>\u003Cblockquote>👀 Localazy’s \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics\">language statistics\u003C\u002Fa> view gives you a broader overview of translation progress, review status, and incomplete content across languages\u003C\u002Fblockquote>\u003Ch3 id=\"download-translations\">Download translations\u003C\u002Fh3>\u003Cp>Next, pull the translated files into your project with:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">localazy download\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>With the \u003Ccode>download\u003C\u002Fcode> mapping you configured earlier, this writes locale files under \u003Ccode>messages\u002F\u003C\u002Fcode> (for example, \u003Ccode>messages\u002Ffr.json\u003C\u002Fcode>, \u003Ccode>messages\u002Fde.json\u003C\u002Fcode>, and \u003Ccode>messages\u002Fja.json\u003C\u002Fcode>) using the same key structure as the source file.\u003C\u002Fp>\u003Ch3 id=\"update-the-routing-config\">Update the routing config\u003C\u002Fh3>\u003Cp>Once a new locale file exists, add that locale to \u003Ccode>\u003Cstrong>src\u002Fi18n\u002Frouting.ts\u003C\u002Fstrong>\u003C\u002Fcode>\u003Cstrong> \u003C\u002Fstrong>so it becomes part of your routing configuration:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export const routing = defineRouting({\n  locales: ['en', 'fr', 'de', 'ja'],\n  defaultLocale: 'en',\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"%F0%9F%94%9F-step-10-verify-in-the-ui\">🔟 Step 10: Verify in the UI\u003C\u002Fh2>\u003Cp>Start the development server:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">yarn dev\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then open \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Ffr\u003C\u002Fcode>, \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Fde\u003C\u002Fcode> or \u003Ccode>http:\u002F\u002Flocalhost:3000\u002Fja\u003C\u002Fcode>, or switch languages directly in the UI. As long as the corresponding message files exist and the locales are registered in \u003Ccode>routing.ts\u003C\u002Fcode>, the page will render in that locale using the same locale-aware navigation setup you already configured.\u003C\u002Fp>\u003Cp>For example, opening \u003Ccode>\u002Ffr\u003C\u002Fcode> should render the page in French, including the welcome message, age counter, status options, and localized metadata. The language switcher updates the URL and re-renders the page in the selected locale without a full reload:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_5BE9B8829E7007FA3CC208F668747C26B1AB0704A789EB60983973BA01B2DD4A_1776766856130_meta-data-translation.gif\" class=\"kg-image\" alt loading=\"lazy\">\u003C\u002Ffigure>\u003Ch2 id=\"%F0%9F%9B%A0%EF%B8%8F-troubleshooting\">🛠️ Troubleshooting\u003C\u002Fh2>\u003Ch3 id=\"what-does-missingmessage-error-in-the-console-mean\">What does \u003Ccode>MISSING_MESSAGE\u003C\u002Fcode> error in the console mean?\u003C\u002Fh3>\u003Cp>A key exists in \u003Ccode>en.json\u003C\u002Fcode> but is missing from another locale file. Run \u003Ccode>localazy download\u003C\u002Fcode> to refresh generated locale files, then verify that the missing key exists in the target locale. By default, when a message fails to resolve, \u003Ccode>next-intl\u003C\u002Fcode> logs an error and renders the fallback \u003Ccode>${namespace}.${key}\u003C\u002Fcode> instead.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_B7403BF61DCC8397992BF80314AE66EF05E00ED94F28BA73D1E239B95B5522F4_1776972041770_image.png\" class=\"kg-image\" alt=\"MISSING_MESSAGE error in the console.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"how-do-i-fix-a-locale-stuck-in-a-redirect-loop\">How do I fix a locale stuck in a redirect loop?\u003C\u002Fh3>\u003Cp>This is usually a routing mismatch. Make sure \u003Ccode>src\u002Fproxy.ts\u003C\u002Fcode> and the rest of the app all use the same \u003Ccode>routing\u003C\u002Fcode> object. \u003Ccode>createMiddleware(routing)\u003C\u002Fcode> handles locale negotiation, redirects, rewrites, and alternate links. Also note that in current Next.js, the file convention is \u003Ccode>proxy.ts\u003C\u002Fcode>. Older references to \u003Ccode>middleware.ts\u003C\u002Fcode> are outdated for this setup.\u003C\u002Fp>\u003Ch3 id=\"why-does-metadata-stay-in-english-after-switching-locale\">Why does metadata stay in English after switching locale?\u003C\u002Fh3>\u003Cp>Check that \u003Ccode>generateMetadata\u003C\u002Fcode> is using the active locale from the route params. A common mistake is hardcoding the source locale (eg. \u003Ccode>locale: 'en'\u003C\u002Fcode>), which forces the metadata to resolve in English every time.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export async function generateMetadata({ params }: Props): Promise&lt;Metadata&gt; {\n  const t = await getTranslations({ locale: 'en', namespace: 'metadata' });\n\n  return {\n    title: t('profileTitle'),\n    description: t('profileDescription')\n  };\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Instead, read the locale from \u003Ccode>params\u003C\u002Fcode> and pass it to \u003Ccode>getTranslations\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export async function generateMetadata({ params }:Props):Promise&lt;Metadata&gt; {\nconst { locale } = await params;\nconst t = await getTranslations({ locale, namespace:'metadata' });\n\nreturn {\n    title:t('profileTitle'),\n    description:t('profileDescription')\n  };\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>If the metadata key is missing from the target locale, you may also see a \u003Ccode>MISSING_MESSAGE\u003C\u002Fcode> error. In that case, run \u003Ccode>localazy download\u003C\u002Fcode> again and verify that the translated locale file contains the keys under the \u003Ccode>metadata\u003C\u002Fcode> namespace.\u003C\u002Fp>\u003Ch3 id=\"why-does-usetranslations-work-in-server-components-but-not-in-client-components\">Why does \u003Ccode>useTranslations\u003C\u002Fcode> work in server components but not in client components?\u003C\u002Fh3>\u003Cp>The client component is either outside \u003Ccode>NextIntlClientProvider\u003C\u002Fcode> or the provider is not receiving messages. In that case, \u003Ccode>next-intl\u003C\u002Fcode> throws a runtime error such as \u003Cem>“No intl context found. Have you configured the provider?”\u003C\u002Fem> If you are passing messages to the client, \u003Ccode>getMessages()\u003C\u002Fcode> belongs in the server-rendered layout and the result is passed into \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>This is an example runtime error that appears when a client component renders without \u003Ccode>NextIntlClientProvider\u003C\u002Fcode>:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fpaper-attachments.dropboxusercontent.com\u002Fs_B7403BF61DCC8397992BF80314AE66EF05E00ED94F28BA73D1E239B95B5522F4_1776973096649_image.png\" class=\"kg-image\" alt=\"Screenshot of an example runtime error that appears when a client component renders without NextIntlClientProvider.\" loading=\"lazy\">\u003C\u002Ffigure>\u003Ch3 id=\"why-does-usetranslations-fail-inside-an-async-server-component\">Why does \u003Ccode>useTranslations\u003C\u002Fcode> fail inside an async server component?\u003C\u002Fh3>\u003Cp>This is a server-side rendering failure. Depending on the environment, you may see a Next.js runtime overlay, an invalid hook error, or a generic \u003Ccode>500 Internal Server Error\u003C\u002Fcode> page in the browser. In async server components, use \u003Ccode>await getTranslations(...)\u003C\u002Fcode> instead, and reserve \u003Ccode>useTranslations(...)\u003C\u002Fcode> for non-async shared components and client components.\u003C\u002Fp>\u003Ch3 id=\"how-do-i-match-the-downloaded-json-structure-with-nested-keys-in-enjson\">How do I match the downloaded JSON structure with nested keys in en.json?\u003C\u002Fh3>\u003Cp>Do not add \u003Ccode>features: [\"structured_json\"]\u003C\u002Fcode> for this setup. Both plain JSON and structured JSON \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fjson-format\">are supported\u003C\u002Fa> out of the box in Localazy, with no extra configuration required.\u003C\u002Fp>\u003Ch3 id=\"why-does-localazy-cli-reject-my-credentials\">Why does Localazy CLI reject my credentials?\u003C\u002Fh3>\u003Cp>Use \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode>, not \u003Ccode>writeApiToken\u003C\u002Fcode> or \u003Ccode>readApiToken\u003C\u002Fcode>. \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fauthorization\">Key-file values override config-file values\u003C\u002Fa>, and command-line keys override both.\u003C\u002Fp>\u003Ch3 id=\"localazy-upload-cannot-find-the-config-file-whats-the-solution\">\u003Ccode>localazy upload\u003C\u002Fcode> cannot find the config file. What's the solution?\u003C\u002Fh3>\u003Cp>The CLI looks for \u003Ccode>localazy.json\u003C\u002Fcode> in the current working directory by default. \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fcommand-line-options\">Command-line options\u003C\u002Fa> let you override that behavior: use \u003Ccode>-c\u003C\u002Fcode> to point to a specific config file, \u003Ccode>-k\u003C\u002Fcode> to point to a specific keys file, and \u003Ccode>-d\u003C\u002Fcode> to set the working directory.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\"># Run from the project root\ncd .\u002Flocalazy-nextjs\nlocalazy upload\n\n# Use a specific config file\nlocalazy upload -c .\u002Flocalazy.json\n\n# Use a specific working directory\nlocalazy upload -d .\n\n# Use both config and keys files explicitly\nlocalazy upload -c .\u002Flocalazy.json -k .\u002Flocalazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"%F0%9F%8F%81-conclusion\">🏁 Conclusion\u003C\u002Fh2>\u003Cp>This setup gives you locale-aware routing, translated metadata, and four working locales without custom glue code. It also gives you \u003Cstrong>room to grow when you need it\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>Without a translation workflow, that growth turns into manual coordination, which often involves missing keys, stale entries, files passed back and forth between developers and translators... Localazy replaces that with five repeatable steps: \u003Cstrong>update the source file, upload, translate, download, deploy\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>Check out the complete \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGunkev\u002Flocalazy-nextjs\">GitHub repository\u003C\u002Fa> for this guide and compare it with your own implementation. Clone it, add a fifth locale, and run \u003Ccode>localazy upload\u003C\u002Fcode> . See how far you can take this before you run out of languages worth adding. 😄\u003C\u002Fp>","public","none","2026-08-08T16:30:14.000+02:00",[1914],{"id":1841,"name":1842,"slug":1843,"profile_image":1844,"cover_image":8,"bio":1915,"website":1916,"location":1917,"facebook":8,"twitter":8,"meta_title":8,"meta_description":8,"url":1918},"Curious technical writer who loves turning complex tools into clear, helpful documentation for developers.","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fkevine-nzapdi\u002F","Yaoundé, Cameroon","https:\u002F\u002Fghost.localazy.com\u002Fauthor\u002Fkevine-nzapdi\u002F",[1920,1925,1928,1933,1936,1939,1944],{"id":1921,"name":1922,"slug":1923,"description":1872,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1924},"65b269670470910001944a5a","[DICT] Next.js","term-156","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-156\u002F",{"id":1926,"name":1851,"slug":1852,"description":8,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1927},"65b23e0c04709100019448c5","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fnext-js\u002F",{"id":1929,"name":1930,"slug":1931,"description":8,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1932},"60fffb486f8ebe0001bd8ddd","[COMSHARE]","comshare","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fcomshare\u002F",{"id":1934,"name":1854,"slug":1854,"description":8,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1935},"60f567ab6f8ebe0001bd80ec","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fi18n\u002F",{"id":1937,"name":1857,"slug":1858,"description":8,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1938},"6556628a0470910001941ffe","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Ftutorial\u002F",{"id":1940,"name":1941,"slug":1942,"description":1881,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1943},"68dd2c1463350c0001d6081e","[DICT] Git-based localization","term-410","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-410\u002F",{"id":1945,"name":1946,"slug":1947,"description":1904,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1948},"60a37fc7cf7b6a0001d1f11b","[CTA] Why developers love Localazy 💖","cta-13","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fcta-13\u002F",{"id":1841,"name":1842,"slug":1843,"profile_image":1844,"cover_image":8,"bio":1915,"website":1916,"location":1917,"facebook":8,"twitter":8,"meta_title":8,"meta_description":8,"url":1918},{"id":1921,"name":1922,"slug":1923,"description":1872,"feature_image":8,"visibility":1910,"og_image":8,"og_title":8,"og_description":8,"twitter_image":8,"twitter_title":8,"twitter_description":8,"meta_title":8,"meta_description":8,"codeinjection_head":8,"codeinjection_foot":8,"canonical_url":8,"accent_color":8,"url":1924},"https:\u002F\u002Fghost.localazy.com\u002Flocalize-nextjs-app-next-intl-localazy\u002F",[1953,1969,1993],{"id":1954,"owner":1955,"created_by":8,"sort":8,"title":1956,"slug":1957,"modified_on":53,"created_on":1958,"pinned":227,"badge":8,"priority":1826,"main_image":1959,"status":4,"tags":1960,"dictionary":1968,"reading_time":1837,"excerpt":-1,"og_title":53,"og_description":53,"og_image":53},"60a37fc7cf7b6a0001d1f1d1",{"id":1819,"first_name":1820,"last_name":53,"slug":1821,"avatar":1822},"An overview of software localization and i18n tools (2022)","overview-software-localization-i18n-tools-2021","2021-05-02T15:08:51.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F04\u002FSoftware-localization-overview22.png",[1961,1963,1966,1967],{"id":518,"created_on":1830,"status":4,"label":89,"slug":1962,"on_index_page":227},"localazy",{"id":518,"created_on":1830,"status":4,"label":1964,"slug":1965,"on_index_page":227},"Tip","tip",{"id":518,"created_on":1830,"status":4,"label":419,"slug":1835,"on_index_page":229},{"id":518,"created_on":1830,"status":4,"label":1854,"slug":1854,"on_index_page":229},[],{"id":1970,"owner":1971,"created_by":8,"sort":8,"title":1976,"slug":1977,"modified_on":53,"created_on":1978,"pinned":227,"badge":8,"priority":1826,"main_image":1979,"status":4,"tags":1980,"dictionary":1992,"reading_time":1837,"excerpt":-1,"og_title":53,"og_description":53,"og_image":53},"646b7e63047091000193c33b",{"id":1972,"first_name":1973,"last_name":53,"slug":1974,"avatar":1975},"619d2332df4bcb00010bc032","Moyinoluwa Adenuga","moyinoluwa-adenuga","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fadenuga.png","How to localize a NestJS application with nestjs-i18n and Localazy","how-to-localize-a-nestjs-application-with-nestjs-i18n-and-localazy","2023-05-24T14:22:32.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F05\u002Flocalazy-article-nestj-js-1.png",[1981,1985,1986,1989],{"id":1982,"created_on":1830,"status":4,"label":1983,"slug":1984,"on_index_page":227},646,"NestJS","nestjs",{"id":518,"created_on":1830,"status":4,"label":1854,"slug":1854,"on_index_page":229},{"id":518,"created_on":1830,"status":4,"label":1987,"slug":1988,"on_index_page":227},"HowTo","howto",{"id":518,"created_on":1830,"status":4,"label":1990,"slug":1991,"on_index_page":227},"Automated Localization","automated-localization",[],{"id":1994,"owner":1995,"created_by":8,"sort":8,"title":2000,"slug":2001,"modified_on":53,"created_on":2002,"pinned":227,"badge":8,"priority":1826,"main_image":2003,"status":4,"tags":2004,"dictionary":2011,"reading_time":1837,"excerpt":-1,"og_title":53,"og_description":53,"og_image":53},"610e58ca6f8ebe0001bd9286",{"id":1996,"first_name":1997,"last_name":53,"slug":1998,"avatar":1999},"6092822ecf7b6a0001d1dab3","David Václavek","david-vaclavek","\u002F\u002Fwww.gravatar.com\u002Favatar\u002F90788a3f3dc9558a151a87d7fe096592?s=250&d=mm&r=x","How to localize Nette app using contributte\u002Ftranslation and Localazy","localize-php-nette-app-using-contributte-translation-localazy","2021-09-07T10:11:37.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F09\u002FHow-to-lokalize-Nette.png",[2005,2009,2010],{"id":2006,"created_on":1830,"status":4,"label":2007,"slug":2008,"on_index_page":227},613703526,"PHP","php",{"id":518,"created_on":1830,"status":4,"label":1987,"slug":1988,"on_index_page":227},{"id":518,"created_on":1830,"status":4,"label":1854,"slug":1854,"on_index_page":229},[],{"id":7,"sort":8,"created_on":2013,"name":2014,"cta_link":2015,"banner_image":2016},"2022-03-17T12:23:14.000Z","default","https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Flocalazy-ai",{"id":2017},"72defd59-a21d-44b9-822c-4e183ca62b99"]