[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-settings":3,"main-navigation":153,"footer-homepage":836,"footer-integrations":903,"blog-post-nav-nav":1814,"blog-post-nav-[USE LATEST FEATURED]":1836,"blog-guide-to-translate-angular-apps-with-ngx-translate-i18n":1851},{"id":4,"status":5,"security_section_title":6,"loved_section_title":7,"columns":8,"social_links":113,"policy_links":143},1,"published","Secured & trusted","Loved by users",[9,28,48,74,78],{"id":4,"status":5,"sort":10,"title":11,"column_key":12,"links":13},null,"Localazy","connect",[14,18,23],{"id":15,"status":5,"sort":4,"title":16,"url":17},11,"Book a demo","___LOCALAZY_MEETING_URL___",{"id":19,"status":5,"sort":20,"title":21,"url":22},12,2,"Contact","\u002Fcontact",{"id":24,"status":5,"sort":25,"title":26,"url":27},21,3,"About us","\u002Fabout-us",{"id":20,"status":5,"sort":10,"title":29,"column_key":30,"links":31},"Programs","programs",[32,36,40,44],{"id":4,"status":5,"sort":33,"title":34,"url":35},4,"Partner Program","\u002Fpartnership",{"id":20,"status":5,"sort":37,"title":38,"url":39},5,"Ambassador Program","\u002Fambassador",{"id":25,"status":5,"sort":41,"title":42,"url":43},6,"Startup Program","\u002Ffor\u002Fstartups",{"id":33,"status":5,"sort":45,"title":46,"url":47},7,"Nonprofits","\u002Ffor\u002Fnonprofit",{"id":25,"status":5,"sort":10,"title":49,"column_key":50,"links":51},"Use Cases","use_cases",[52,56,60,64,67,70],{"id":37,"status":5,"sort":53,"title":54,"url":55},8,"Software Localization","\u002Fterm\u002Fsoftware-localization",{"id":41,"status":5,"sort":57,"title":58,"url":59},9,"Machine Translation Services","\u002Ffeatures\u002Fmachine-translation",{"id":45,"status":5,"sort":61,"title":62,"url":63},10,"Translation API","\u002Ffeatures\u002Ftranslation-api",{"id":53,"status":5,"sort":15,"title":65,"url":66},"Crowdsourced Translations","\u002Ffeatures\u002Fshare-tm",{"id":57,"status":5,"sort":19,"title":68,"url":69},"Figma i18n & localization","\u002Ffeatures\u002Ffigma-localization-plugin",{"id":61,"status":5,"sort":71,"title":72,"url":73},13,"Translation as a Service","\u002Fterm\u002Ftranslation-service",{"id":33,"status":5,"sort":10,"title":75,"column_key":76,"links":77},"Integrations","integrations",[],{"id":37,"status":5,"sort":10,"title":79,"column_key":80,"links":81},"Resources","resources",[82,86,90,94,98,102,106,110],{"id":71,"status":5,"sort":83,"title":84,"url":85},14,"Documentation","\u002Fdocs",{"id":83,"status":5,"sort":87,"title":88,"url":89},15,"Dictionary","\u002Fdictionary",{"id":87,"status":5,"sort":91,"title":92,"url":93},16,"Case Studies","\u002Fcase-study",{"id":91,"status":5,"sort":95,"title":96,"url":97},17,"Discussion forum","___DISCUSS_URL___",{"id":95,"status":5,"sort":99,"title":100,"url":101},18,"Localization Blog","\u002Fblog",{"id":99,"status":5,"sort":103,"title":104,"url":105},19,"FAQ","\u002Ffaq",{"id":103,"status":5,"sort":107,"title":108,"url":109},20,"Pricing","\u002Fpricing",{"id":107,"status":5,"sort":24,"title":111,"url":112},"Brand assets","https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1tZqsZHBlGelz7A2FwTsiwrs4j3sd9HTk",[114,119,124,129,134,139],{"id":4,"status":5,"sort":10,"platform":115,"icon":116,"url":117,"label":118},"feed","rss","\u002Ffeed.xml","Localazy RSS Feed",{"id":20,"status":5,"sort":10,"platform":120,"icon":121,"url":122,"label":123},"facebook","fb-logo","https:\u002F\u002Fwww.facebook.com\u002Flocalazy\u002F","Localazy facebook",{"id":25,"status":5,"sort":10,"platform":125,"icon":126,"url":127,"label":128},"github","github-logo","https:\u002F\u002Fgithub.com\u002Flocalazy","Localazy GitHub",{"id":33,"status":5,"sort":10,"platform":130,"icon":131,"url":132,"label":133},"x","x-twitter","https:\u002F\u002Fx.com\u002Flocalazy","Localazy X",{"id":37,"status":5,"sort":10,"platform":135,"icon":136,"url":137,"label":138},"linkedin","linkedin-logo","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002F37836599\u002F","Localazy LinkedIn",{"id":41,"status":5,"sort":10,"platform":140,"icon":141,"url":97,"label":142},"discourse","discourse-logo","Localazy Discourse",[144,147,150],{"id":4,"status":5,"sort":10,"title":145,"url":146,"action":10},"Privacy policy","\u002Fprivacy-policy",{"id":20,"status":5,"sort":10,"title":148,"url":149,"action":10},"Terms & Conditions","\u002Fterms-and-conditions",{"id":25,"status":5,"sort":10,"title":151,"url":10,"action":152},"Cookies","cookie-consent",[154,347,580,708,831,833],{"id":20,"name":155,"url":10,"url_text":10,"status":5,"groups":156},"Solutions",[157,168,239,274],{"navigation_items_group_id":158},{"id":25,"sort":37,"status":5,"name":159,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":162,"show_all_url":10,"represent_as_tile":160,"items":163},"Featured Article",false,"top",true,[164],{"collection":165,"item":166},"blog_post_navigation_item_type",{"id":33,"status":5,"sort":10,"show_author_img":162,"blog_post_tag":167,"description":10},"nav",{"navigation_items_group_id":169},{"id":37,"sort":4,"status":5,"name":170,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":171,"represent_as_tile":162,"items":172},"Your Role","\u002Froles",[173,185,195,205,216,228],{"collection":174,"item":175},"relation_navigation_item_type",{"id":4,"status":5,"sort":10,"name":176,"item":177},"CMO",[178],{"collection":179,"item":180},"personas",{"id":4,"status":5,"sort":10,"slug":181,"icon":182},"chief-marketing-officers",{"id":183,"title":184},"526097d8-176f-48e5-83d3-2fc4d77061f9","La Mail Bulk",{"collection":174,"item":186},{"id":25,"status":5,"sort":10,"name":187,"item":188},"CTO",[189],{"collection":179,"item":190},{"id":33,"status":5,"sort":10,"slug":191,"icon":192},"chief-technical-officers",{"id":193,"title":194},"f808fdf0-c78b-4294-ba59-fe25f46fe825","La Mechanic",{"collection":174,"item":196},{"id":107,"status":5,"sort":10,"name":197,"item":198},"Product Manager",[199],{"collection":179,"item":200},{"id":99,"status":5,"sort":10,"slug":201,"icon":202},"product-managers",{"id":203,"title":204},"ea39586a-21fc-4b34-ba87-496028e5198f","La Worker",{"collection":174,"item":206},{"id":207,"status":5,"sort":10,"name":208,"item":209},37,"Translator",[210],{"collection":179,"item":211},{"id":107,"status":5,"sort":10,"slug":212,"icon":213},"professional-translators",{"id":214,"title":215},"07945171-d51d-4ca8-96c0-21cde9db258f","La Chat",{"collection":174,"item":217},{"id":218,"status":5,"sort":10,"name":219,"item":220},38,"Developer",[221],{"collection":179,"item":222},{"id":223,"status":5,"sort":10,"slug":224,"icon":225},30,"software-developers",{"id":226,"title":227},"1806e46d-c551-4845-bf42-4407344d229e","La Terminal",{"collection":174,"item":229},{"id":230,"status":5,"sort":10,"name":231,"item":232},27,"Localization Manager",[233],{"collection":179,"item":234},{"id":41,"status":5,"sort":10,"slug":235,"icon":236},"localization-managers",{"id":237,"title":238},"dac69bd1-bf5d-41d0-87d4-dd13e314698a","La Language",{"navigation_items_group_id":240},{"id":57,"sort":25,"status":5,"name":241,"render_show_all_url":160,"show_all_url_position":242,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":243},"Use cases","bottom",[244,250,255,260,264,269],{"collection":245,"item":246},"simple_link_navigation_item_type",{"id":247,"status":5,"sort":10,"url":248,"url_text":249,"show_favorite_icon":160},24,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fsoftware-localization","Software localization",{"collection":245,"item":251},{"id":252,"status":5,"sort":10,"url":253,"url_text":254,"show_favorite_icon":160},26,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fmobile-app-localization","Mobile app localization",{"collection":245,"item":256},{"id":257,"status":5,"sort":10,"url":258,"url_text":259,"show_favorite_icon":160},25,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fwebsite-localization","Website localization",{"collection":245,"item":261},{"id":230,"status":5,"sort":10,"url":262,"url_text":263,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fdesign-localization","Design localization",{"collection":245,"item":265},{"id":266,"status":5,"sort":10,"url":267,"url_text":268,"show_favorite_icon":160},28,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fgame-localization","Game localization",{"collection":245,"item":270},{"id":271,"status":5,"sort":10,"url":272,"url_text":273,"show_favorite_icon":160},29,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fhelp-and-docs-localization","Help & docs localization",{"navigation_items_group_id":275},{"id":53,"sort":20,"status":5,"name":276,"render_show_all_url":160,"show_all_url_position":242,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":277},"Industry",[278,289,300,310,320,329,340],{"collection":174,"item":279},{"id":280,"status":5,"sort":10,"name":281,"item":282},23,"Digital Agencies",[283],{"collection":179,"item":284},{"id":45,"status":5,"sort":10,"slug":285,"icon":286},"digital-agencies",{"id":287,"title":288},"547f5619-b21d-4b29-86f1-8b2200313cde","La Digi Agency",{"collection":174,"item":290},{"id":291,"status":5,"sort":10,"name":292,"item":293},39,"Startups & SaaS",[294],{"collection":179,"item":295},{"id":20,"status":5,"sort":10,"slug":296,"icon":297},"startups",{"id":298,"title":299},"da1516e2-4afc-40a2-bcbf-a8161e2d610d","La Saa S",{"collection":174,"item":301},{"id":20,"status":5,"sort":10,"name":302,"item":303},"E-commerce",[304],{"collection":179,"item":305},{"id":37,"status":5,"sort":10,"slug":306,"icon":307},"e-commerce",{"id":308,"title":309},"a3d09cd2-054f-4bb5-a0a2-d3d207db65df","La Ecommerce",{"collection":174,"item":311},{"id":103,"status":5,"sort":10,"name":312,"item":313},"FinTech Platforms",[314],{"collection":179,"item":315},{"id":230,"status":5,"sort":10,"slug":316,"icon":317},"fintech",{"id":318,"title":319},"147339ba-07d1-4e5e-baad-23d27e60c919","La Money",{"collection":174,"item":321},{"id":247,"status":5,"sort":10,"name":322,"item":323},"Translation Agencies",[324],{"collection":179,"item":325},{"id":247,"status":5,"sort":10,"slug":326,"icon":327},"translation-agencies",{"id":328,"title":238},"15d6fe33-2af8-4d6e-933d-5caa64394511",{"collection":174,"item":330},{"id":331,"status":5,"sort":10,"name":332,"item":333},22,"Travel & Tourism",[334],{"collection":179,"item":335},{"id":25,"status":5,"sort":10,"slug":336,"icon":337},"tourism",{"id":338,"title":339},"23a785e8-0ae5-4c4b-8452-aab1b58182a6","La Travel",{"collection":174,"item":341},{"id":257,"status":5,"sort":10,"name":342,"item":343},"Nonprofit Causes",[344],{"collection":179,"item":345},{"id":266,"status":5,"sort":10,"slug":346,"icon":10},"nonprofit",{"id":37,"name":348,"url":10,"url_text":10,"status":5,"groups":349},"Features",[350,417,474,523],{"navigation_items_group_id":351},{"id":15,"sort":41,"status":5,"name":352,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":353},"Localization",[354,363,372,380,388,392,400,409],{"collection":174,"item":355},{"id":356,"status":5,"sort":10,"name":357,"item":358},44,"Localization services",[359],{"collection":360,"item":361},"products",{"id":57,"status":5,"slug":362},"continuous-localization-team",{"collection":174,"item":364},{"id":365,"status":5,"sort":10,"name":366,"item":367},45,"Translation management",[368],{"collection":369,"item":370},"term_landing_page",{"id":271,"status":5,"slug":371},"translation-management-system",{"collection":174,"item":373},{"id":374,"status":5,"sort":10,"name":375,"item":376},46,"Context Screenshots",[377],{"collection":360,"item":378},{"id":71,"status":5,"slug":379},"context-screenshots-ocr",{"collection":174,"item":381},{"id":382,"status":5,"sort":10,"name":383,"item":384},47,"Translation Glossary",[385],{"collection":360,"item":386},{"id":95,"status":5,"slug":387},"glossary",{"collection":245,"item":389},{"id":33,"status":5,"sort":10,"url":390,"url_text":391,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Freviewing-translations","Quality control",{"collection":174,"item":393},{"id":394,"status":5,"sort":10,"name":395,"item":396},34,"Connected Projects",[397],{"collection":360,"item":398},{"id":4,"status":5,"slug":399},"connected-projects",{"collection":174,"item":401},{"id":402,"status":5,"sort":10,"name":403,"item":404},64,"Plural handling",[405],{"collection":360,"item":406},{"id":407,"status":5,"slug":408},32,"plurals",{"collection":174,"item":410},{"id":411,"status":5,"sort":10,"name":412,"item":413},65,"Style guides",[414],{"collection":360,"item":415},{"id":218,"status":5,"slug":416},"style-guide",{"navigation_items_group_id":418},{"id":19,"sort":45,"status":5,"name":419,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":420},"Translation",[421,429,437,441,449,457,466],{"collection":174,"item":422},{"id":423,"status":5,"sort":10,"name":424,"item":425},36,"Professional translations",[426],{"collection":369,"item":427},{"id":223,"status":5,"slug":428},"professional-translation-services",{"collection":174,"item":430},{"id":431,"status":5,"sort":10,"name":432,"item":433},48,"Crowdsourced translations",[434],{"collection":360,"item":435},{"id":53,"status":5,"slug":436},"share-tm",{"collection":245,"item":438},{"id":37,"status":5,"sort":10,"url":439,"url_text":440,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings","Translation interface",{"collection":174,"item":442},{"id":443,"status":5,"sort":10,"name":444,"item":445},55,"Machine translations",[446],{"collection":360,"item":447},{"id":37,"status":5,"slug":448},"machine-translation",{"collection":174,"item":450},{"id":451,"status":5,"sort":10,"name":452,"item":453},60,"Localazy AI translation",[454],{"collection":360,"item":455},{"id":271,"status":5,"slug":456},"localazy-ai",{"collection":174,"item":458},{"id":459,"status":5,"sort":10,"name":460,"item":461},61,"Translation Memory",[462],{"collection":360,"item":463},{"id":464,"status":5,"slug":465},35,"translation-memory",{"collection":174,"item":467},{"id":468,"status":5,"sort":10,"name":469,"item":470},63,"Code & placeholders",[471],{"collection":360,"item":472},{"id":223,"status":5,"slug":473},"code-and-placeholders",{"navigation_items_group_id":475},{"id":71,"sort":53,"status":5,"name":476,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":477},"Management",[478,482,490,498,507,515,519],{"collection":245,"item":479},{"id":53,"status":5,"sort":10,"url":480,"url_text":481,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles","User roles",{"collection":174,"item":483},{"id":484,"status":5,"sort":10,"name":485,"item":486},51,"Duplicity Linking",[487],{"collection":360,"item":488},{"id":103,"status":5,"slug":489},"duplicity-linking",{"collection":174,"item":491},{"id":492,"status":5,"sort":10,"name":493,"item":494},52,"Language Permissions",[495],{"collection":360,"item":496},{"id":24,"status":5,"slug":497},"language-permissions",{"collection":174,"item":499},{"id":500,"status":501,"sort":10,"name":502,"item":503},53,"draft","Automations",[504],{"collection":360,"item":505},{"id":107,"status":5,"slug":506},"automations",{"collection":174,"item":508},{"id":509,"status":5,"sort":10,"name":510,"item":511},58,"Branching",[512],{"collection":360,"item":513},{"id":230,"status":5,"slug":514},"branching",{"collection":245,"item":516},{"id":24,"status":501,"sort":10,"url":517,"url_text":518,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fsso-configuration","SSO",{"collection":245,"item":520},{"id":331,"status":501,"sort":10,"url":521,"url_text":522,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics","Reporting",{"navigation_items_group_id":524},{"id":83,"sort":57,"status":5,"name":525,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":526},"Development",[527,533,541,548,555,563,572],{"collection":174,"item":528},{"id":271,"status":5,"sort":10,"name":62,"item":529},[530],{"collection":360,"item":531},{"id":15,"status":5,"slug":532},"translation-api",{"collection":174,"item":534},{"id":535,"status":5,"sort":10,"name":536,"item":537},33,"Localazy CLI",[538],{"collection":360,"item":539},{"id":45,"status":5,"slug":540},"cli",{"collection":174,"item":542},{"id":407,"status":5,"sort":10,"name":543,"item":544},"Language CDN",[545],{"collection":360,"item":546},{"id":33,"status":5,"slug":547},"language-cdn",{"collection":174,"item":549},{"id":266,"status":5,"sort":10,"name":550,"item":551},"Releases",[552],{"collection":360,"item":553},{"id":41,"status":5,"slug":554},"releases",{"collection":174,"item":556},{"id":557,"status":501,"sort":10,"name":558,"item":559},57,"Format Conversions",[560],{"collection":360,"item":561},{"id":20,"status":5,"slug":562},"format-conversions",{"collection":174,"item":564},{"id":565,"status":5,"sort":10,"name":566,"item":567},59,"Webhooks",[568],{"collection":360,"item":569},{"id":570,"status":5,"slug":571},31,"webhooks",{"collection":174,"item":573},{"id":574,"status":5,"sort":10,"name":575,"item":576},62,"Export Aliases",[577],{"collection":360,"item":578},{"id":535,"status":5,"slug":579},"export-aliases",{"id":33,"name":75,"url":10,"url_text":10,"status":5,"groups":581},[582,698],{"navigation_items_group_id":583},{"id":45,"sort":61,"status":5,"name":584,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":585},"Most popular",[586],{"collection":174,"item":587},{"id":19,"status":5,"sort":10,"name":75,"item":588},[589,597,604,611,618,624,631,638,645,652,659,668,675,682,690],{"collection":590,"item":591},"platforms",{"id":41,"status":5,"sort":4,"slug":592,"name":593,"icon":594},"android","Android",{"id":595,"title":596},"ff965add-53b0-44ad-b27c-ea4ef641d384","Ic Outline Android",{"collection":590,"item":598},{"id":45,"status":5,"sort":20,"slug":599,"name":600,"icon":601},"ios","iOS",{"id":602,"title":603},"886285d7-816a-4430-b5a5-edfe307b238e","Ios",{"collection":590,"item":605},{"id":535,"status":5,"sort":25,"slug":606,"name":607,"icon":608},"react","React",{"id":609,"title":610},"26757a90-88a3-4a94-b587-9f38614ed3bd","Logos React",{"collection":590,"item":612},{"id":103,"status":5,"sort":33,"slug":613,"name":614,"icon":615},"vuejs","Vue.js",{"id":616,"title":617},"6180b41f-3249-47d3-adcd-50fe1cf11bf1","Vue",{"collection":590,"item":619},{"id":91,"status":5,"sort":37,"slug":620,"name":621,"icon":622},"angular","Angular",{"id":623,"title":621},"2a31a97a-48c5-4531-aa36-41c9dd0bdbef",{"collection":590,"item":625},{"id":4,"status":5,"sort":41,"slug":626,"name":627,"icon":628},"flutter","Flutter",{"id":629,"title":630},"b9f13a11-9328-4a03-86cf-b20de0685606","Logos Flutter",{"collection":590,"item":632},{"id":25,"status":5,"sort":15,"slug":633,"name":634,"icon":635},"typescript","TypeScript",{"id":636,"title":637},"8d1319b5-8a96-4199-8407-00add3418b1f","Logos Typescript Icon",{"collection":590,"item":639},{"id":570,"status":5,"sort":19,"slug":640,"name":641,"icon":642},"javascript","JavaScript",{"id":643,"title":644},"4218d0c9-7e6b-494d-9663-37ceaf93ee8c","Logos Javascript",{"collection":590,"item":646},{"id":19,"status":5,"sort":107,"slug":647,"name":648,"icon":649},"json","JSON",{"id":650,"title":651},"99ac3b7c-dba5-4693-a4f4-1f27a6d7782d","Logos Json",{"collection":590,"item":653},{"id":24,"status":5,"sort":24,"slug":654,"name":655,"icon":656},"xliff","XLIFF",{"id":657,"title":658},"ca424cc8-e8a7-4aef-8dca-ef4a4d1334fc","Format",{"collection":590,"item":660},{"id":661,"status":5,"sort":662,"slug":663,"name":664,"icon":665},72,54,"strapi","Strapi",{"id":666,"title":667},"cde7f1d0-f2e0-4243-929e-a3f8f9146e69","Strapi Logo Purple",{"collection":590,"item":669},{"id":451,"status":5,"sort":443,"slug":670,"name":671,"icon":672},"figma","Figma",{"id":673,"title":674},"813745a4-a77d-4735-93b7-e0dd731b2304","Figma Icon",{"collection":590,"item":676},{"id":484,"status":5,"sort":382,"slug":677,"name":678,"icon":679},"microsoft-excel","Microsoft Excel",{"id":680,"title":681},"7a175955-7b96-4561-939f-a0e1924faa40","Excel",{"collection":590,"item":683},{"id":684,"status":5,"sort":459,"slug":685,"name":686,"icon":687},66,"github-actions","GitHub Actions",{"id":688,"title":689},"da17554f-ac6d-443d-9bac-1f29645ec1c6","Github Icon",{"collection":590,"item":691},{"id":692,"status":5,"sort":693,"slug":694,"name":695,"icon":696},97,999,"webflow","Webflow",{"id":697,"title":695},"ff43a386-52f8-499f-b77c-ab9a30f4a77e",{"navigation_items_group_id":699},{"id":33,"sort":15,"status":5,"name":700,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":701},"Explore more",[702],{"collection":703,"item":704},"text_link_navigation_item_type",{"id":4,"status":5,"sort":10,"text":705,"url":706,"url_text":707},"Localazy is a technology-agnostic platform supporting 50+ frameworks, file formats & popular tools.","\u002Fintegrations","See all integrations",{"id":4,"name":79,"url":10,"url_text":10,"status":5,"groups":709},[710,734,740],{"navigation_items_group_id":711},{"id":4,"sort":19,"status":5,"name":712,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":713},"Helpful Links",[714,717,719,723,725,728,730],{"collection":245,"item":715},{"id":71,"status":5,"sort":10,"url":101,"url_text":716,"show_favorite_icon":162},"Localazy Blog",{"collection":245,"item":718},{"id":83,"status":5,"sort":10,"url":85,"url_text":84,"show_favorite_icon":162},{"collection":245,"item":720},{"id":4,"status":5,"sort":10,"url":721,"url_text":722,"show_favorite_icon":160},"https:\u002F\u002Fdiscuss.localazy.com\u002F","Discussion Forum",{"collection":245,"item":724},{"id":19,"status":5,"sort":10,"url":93,"url_text":92,"show_favorite_icon":160},{"collection":245,"item":726},{"id":25,"status":5,"sort":10,"url":35,"url_text":727,"show_favorite_icon":160},"Become a Partner",{"collection":245,"item":729},{"id":87,"status":5,"sort":10,"url":105,"url_text":104,"show_favorite_icon":160},{"collection":245,"item":731},{"id":95,"status":5,"sort":10,"url":732,"url_text":733,"show_favorite_icon":160},"\u002Ftags\u002Frelease-update","Release Updates",{"navigation_items_group_id":735},{"id":20,"sort":83,"status":5,"name":716,"render_show_all_url":162,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":101,"represent_as_tile":160,"items":736},[737],{"collection":165,"item":738},{"id":25,"status":5,"sort":10,"show_author_img":160,"blog_post_tag":739,"description":10},"[USE LATEST FEATURED]",{"navigation_items_group_id":741},{"id":41,"sort":71,"status":5,"name":84,"render_show_all_url":162,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":85,"represent_as_tile":160,"items":742},[743,757,769,780,792,802,813,821],{"collection":174,"item":744},{"id":33,"status":5,"sort":10,"name":745,"item":746},"General",[747],{"collection":748,"item":749},"docs_section",{"id":20,"status":5,"sort":4,"slug":750,"name":745,"icon":751,"featured_icon":754},"general",{"id":752,"title":753},"423101f1-308c-42f1-8dfe-53272019e7cb","Global",{"id":755,"title":756},"0f7ca4cb-dc3b-4f62-b476-132ed5c4931f","General Doc",{"collection":174,"item":758},{"id":37,"status":5,"sort":10,"name":759,"item":760},"CLI",[761],{"collection":748,"item":762},{"id":25,"status":5,"sort":20,"slug":540,"name":759,"icon":763,"featured_icon":766},{"id":764,"title":765},"2f7a4573-8265-4d76-8d55-ce0cc79b8983","Cli",{"id":767,"title":768},"3f76ff7b-0e74-4046-bb03-4ca99c3b66d5","Doc Cat Cli",{"collection":174,"item":770},{"id":53,"status":5,"sort":10,"name":771,"item":772},"API",[773],{"collection":748,"item":774},{"id":107,"status":5,"sort":25,"slug":775,"name":771,"icon":776,"featured_icon":777},"api",{"id":764,"title":765},{"id":778,"title":779},"20866781-e69b-4e01-9456-05437487b75c","API Doc",{"collection":174,"item":781},{"id":782,"status":5,"sort":10,"name":783,"item":784},50,"CDN",[785],{"collection":748,"item":786},{"id":252,"status":5,"sort":33,"slug":787,"name":783,"icon":788,"featured_icon":789},"cdn",{"id":752,"title":753},{"id":790,"title":791},"a8ee9cb7-4e02-41f0-b595-eb518c3085b6","Doc Cat Cdn",{"collection":174,"item":793},{"id":41,"status":5,"sort":10,"name":593,"item":794},[795],{"collection":748,"item":796},{"id":4,"status":5,"sort":37,"slug":592,"name":593,"icon":797,"featured_icon":799},{"id":798,"title":593},"fb8329ae-0c0c-4fbc-bcdc-83f2eeda1039",{"id":800,"title":801},"f7c0dec8-5b42-4943-ab3a-e3665723ad6f","Doc Cat Android",{"collection":174,"item":803},{"id":45,"status":5,"sort":10,"name":600,"item":804},[805],{"collection":748,"item":806},{"id":33,"status":5,"sort":41,"slug":599,"name":600,"icon":807,"featured_icon":810},{"id":808,"title":809},"289e136c-55df-4d51-847b-1782a2308ee4","Ios Blue",{"id":811,"title":812},"2968d3f0-14b5-4427-82e7-f1ea2de17846","Doc Cat Ios",{"collection":174,"item":814},{"id":57,"status":5,"sort":10,"name":671,"item":815},[816],{"collection":748,"item":817},{"id":24,"status":5,"sort":45,"slug":670,"name":671,"icon":818,"featured_icon":819},{"id":764,"title":765},{"id":820,"title":671},"f5e66b5b-a439-47f6-af4a-6ad261de2e87",{"collection":174,"item":822},{"id":61,"status":5,"sort":10,"name":664,"item":823},[824],{"collection":748,"item":825},{"id":280,"status":5,"sort":53,"slug":663,"name":664,"icon":826,"featured_icon":828},{"id":827,"title":664},"3b4b03c7-e131-49e6-a014-c8c2c8a2751e",{"id":829,"title":830},"1dd05c76-e517-4aea-a3d8-49cfddb40056","Strapi Doc",{"id":25,"name":108,"url":109,"url_text":108,"status":5,"groups":832},[],{"id":41,"name":16,"url":834,"url_text":16,"status":5,"groups":835},"\u002Fbook-demo",[],{"status":5,"header_badges":837,"footer_badges":855,"footer_secured_badges":861,"slider_badges":873},[838,845,850],{"id":4,"status":5,"sort":10,"link":839,"title":840,"badgeType":841,"badgeName":842,"metadata":10,"image":843},"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Flocalazy\u002Freviews","Best meets requirements","Other","G2-winter-24-best-meets-requirments",{"id":844},"8d5dd6fd-6995-4c92-8219-a6ed5ba6acdc",{"id":20,"status":5,"sort":10,"link":839,"title":846,"badgeType":841,"badgeName":847,"metadata":10,"image":848},"Best support","G2-winter-24-best-support",{"id":849},"e59dd465-84d9-45c7-987d-dd4048fd6992",{"id":25,"status":5,"sort":10,"link":839,"title":851,"badgeType":841,"badgeName":852,"metadata":10,"image":853},"Easiest admin","G2-winter-24-easiest-admin",{"id":854},"5f12c4c8-bec0-47cf-87b4-a4502e9f1bd2",[856],{"id":19,"status":5,"sort":10,"link":839,"title":857,"badgeType":841,"badgeName":858,"metadata":10,"image":859},"Users love us","Users love us 25",{"id":860},"232416a5-86ba-4be6-85a5-b88802003d53",[862,868],{"id":15,"status":5,"sort":10,"link":863,"title":864,"badgeType":841,"badgeName":865,"metadata":10,"image":866},"https:\u002F\u002Fsprinto.com\u002Fget-iso-27001\u002F","Sprinto ISO 27001","Sprinto ISO 27001 certificate",{"id":867},"c1c6c06c-6caf-4b78-8a7e-9606c395eb61",{"id":71,"status":5,"sort":10,"link":869,"title":870,"badgeType":841,"badgeName":870,"metadata":10,"image":871},"https:\u002F\u002Fwww.aicpa.org\u002Fsoc4so","SOC certificate",{"id":872},"4f4bc0a6-09a0-41df-8295-8f990d96d941",[874,880,884,888,892,896,901],{"id":37,"status":5,"sort":10,"link":839,"title":875,"badgeType":841,"badgeName":876,"metadata":877,"image":878},"Most likely to recommend","a","",{"id":879},"da055731-3f11-4fc7-96f2-c11c0b84c831",{"id":41,"status":5,"sort":10,"link":839,"title":881,"badgeType":841,"badgeName":10,"metadata":10,"image":882},"EMEA High Performer",{"id":883},"586fb488-81f2-41db-a4e8-ef309e50c0e6",{"id":45,"status":5,"sort":10,"link":839,"title":885,"badgeType":841,"badgeName":10,"metadata":10,"image":886},"Ease of Doing Business With",{"id":887},"bfa26865-430e-463d-9886-cb56a8a8ecf6",{"id":53,"status":5,"sort":10,"link":839,"title":889,"badgeType":841,"badgeName":10,"metadata":10,"image":890},"High Performer",{"id":891},"2cc1ba0f-c23a-4c97-ad4a-a655c97466fe",{"id":57,"status":5,"sort":10,"link":839,"title":893,"badgeType":841,"badgeName":10,"metadata":10,"image":894},"Fastest Implementation",{"id":895},"6f297758-1c95-45f4-a6e9-528319897132",{"id":61,"status":5,"sort":10,"link":897,"title":898,"badgeType":841,"badgeName":10,"metadata":10,"image":899},"https:\u002F\u002Fwww.intercert.com\u002Fservices\u002Fgovernance-risk-compliance\u002Fiso-iec-27001","Intercert ISO 27001",{"id":900},"0521a5f1-e1f2-4da6-a2bc-dc92773f2a7b",{"id":15,"status":5,"sort":10,"link":863,"title":864,"badgeType":841,"badgeName":865,"metadata":10,"image":902},{"id":867},[904,1044,1122,1228,1314,1393,1482,1573,1660,1759],{"id":535,"status":5,"created_on":905,"modified_on":906,"name":607,"slug":606,"description":907,"docs_link":908,"priority":10,"has_sdk":160,"sort":25,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":909,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":911,"tile_description":912,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":913,"upload_features":914,"icon":915,"meta_image":916,"primary_tag":918,"tags":934,"integration_methods":952,"recommended_methods":1028,"default_integration_method":1029,"faq_categories":1036,"translations":1042,"platforms_id":535},"2022-03-18T08:09:24.000Z","2025-02-26T13:36:08.000Z","Manage your React app translations with Localazy, a continuous localization tool. React i18n done right. ","\u002Fdocs\u002Fcli\u002Fjson-format","JSON format support","CLI support","react-i18next and more","Use Localazy to translate your React projects with your favorite i18n library.",{"json":647},[],{"id":609},{"id":917},"a97492ec-ee8d-429c-bf66-d0fe59b6e5c9",{"id":37,"status":5,"sort":20,"created_on":919,"label":920,"hidden":160,"icon":921,"translations":923},"2022-03-17T12:23:44.000Z","Web apps",{"id":922},"c9e70e4f-8136-432a-8d82-53c3501a9eb4",[924,926,929,932],{"id":37,"languages_code":925,"label":920},"xxa",{"id":365,"languages_code":927,"label":928},"es","Aplicaciones web",{"id":782,"languages_code":930,"label":931},"cs","Webové aplikace",{"id":565,"languages_code":933,"label":920},"en",[935,942],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":936,"translations":937},{"id":922},[938,939,940,941],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":53,"status":5,"sort":57,"label":943,"hidden":160,"created_on":944,"icon":10,"translations":945},"Framework","2022-03-17T12:23:45.000Z",[946,947,949,950],{"id":53,"languages_code":925,"label":943},{"id":500,"languages_code":927,"label":948},"Marco",{"id":451,"languages_code":930,"label":943},{"id":951,"languages_code":933,"label":943},67,[953,965,990,1011],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":956},"Translate strings directly or upload them into your Localazy project.","\u002Fdocs\u002Fapi\u002Fintroduction",[957,958,961,963],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},40,"Utilice la API para exportar traducciones e importar contenido de\u002Fa Localazy mediante programación.",{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},"Choose between translating strings directly or uploading them into Localazy.",{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},"Pomocí rozhraní API můžete programovaně exportovat překlady a importovat obsah z\u002Fdo Localazy.",{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":971},"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",[972,973,976,977,980,983,984,985],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},"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":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},"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":402,"languages_code":927,"label":981,"description":982,"slug":967},"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":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},88,"de","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":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":997},"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",[998,999,1002,1003,1007],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},"Carga directa de archivos","Cargue sus textos y traducciones existentes en cualquier formato directamente para empezar rápidamente.",{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},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":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},85,"Direkter Datei-Upload","Laden Sie Ihre Texte und vorhandenen Übersetzungen in einem beliebigen Format direkt hoch, um schnell loszulegen.",{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1015},"Command Line Interface","The best option for developers that want to make localization an automated part of their workflow.","\u002Fdocs\u002Fcli\u002Fthe-basics",[1016,1017,1020,1021,1024],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},"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":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},"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":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},87,"Befehlszeilenschnittstelle","Die beste Option für Entwickler, die die Lokalisierung zu einem automatisierten Teil ihres Arbeitsablaufs machen möchten.",[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1030},[1031,1032,1033,1034,1035],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1037],{"id":1038,"status":5,"created_on":1039,"sort":10,"slug":1040,"label":1041,"on_faq_index":10},76,"2025-02-26T12:44:29.000Z","front-end-common","Front-end Common",[1043],{"languages_code":925,"name":607,"slug":606,"description":907,"support_type":909,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":911,"tile_description":912,"id":535,"platforms_id":535,"docs_link":908},{"id":103,"status":5,"created_on":905,"modified_on":1045,"name":614,"slug":613,"description":1046,"docs_link":908,"priority":10,"has_sdk":160,"sort":33,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":909,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1047,"tile_description":1048,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1049,"upload_features":1050,"icon":1051,"meta_image":1052,"primary_tag":1054,"tags":1061,"integration_methods":1075,"recommended_methods":1106,"default_integration_method":1107,"faq_categories":1114,"translations":1120,"platforms_id":103},"2025-02-26T13:35:41.000Z","Online Vue.js project localization tool for your translation management. Enjoy true continuous localization with Localazy & translate your JSON files automatically.","Vue.js & JSON","Enjoy true continuous localization with Localazy & translate your Vue projects automatically.",{"json":647},[],{"id":616},{"id":1053},"8171b836-d6b8-4354-8db3-34ccd384970d",{"id":37,"status":5,"sort":20,"created_on":919,"label":920,"hidden":160,"icon":1055,"translations":1056},{"id":922},[1057,1058,1059,1060],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},[1062,1069],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1063,"translations":1064},{"id":922},[1065,1066,1067,1068],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":53,"status":5,"sort":57,"label":943,"hidden":160,"created_on":944,"icon":10,"translations":1070},[1071,1072,1073,1074],{"id":53,"languages_code":925,"label":943},{"id":500,"languages_code":927,"label":948},{"id":451,"languages_code":930,"label":943},{"id":951,"languages_code":933,"label":943},[1076,1082,1092,1099],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1077},[1078,1079,1080,1081],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1083},[1084,1085,1086,1087,1088,1089,1090,1091],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1093},[1094,1095,1096,1097,1098],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1100},[1101,1102,1103,1104,1105],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1108},[1109,1110,1111,1112,1113],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1115,1119],{"id":1004,"status":5,"created_on":1116,"sort":10,"slug":1117,"label":1118,"on_faq_index":10},"2023-03-01T11:21:41.000Z","vue-localization","Vue.js Localization",{"id":1038,"status":5,"created_on":1039,"sort":10,"slug":1040,"label":1041,"on_faq_index":10},[1121],{"languages_code":925,"name":614,"slug":613,"description":1046,"support_type":909,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1047,"tile_description":1048,"id":103,"platforms_id":103,"docs_link":908},{"id":4,"status":5,"created_on":905,"modified_on":1123,"name":627,"slug":626,"description":1124,"docs_link":1125,"priority":10,"has_sdk":160,"sort":41,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1126,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1126,"tile_description":1127,"is_enterprise":160,"is_popular":160,"primary_use_case":1128,"hierarchy_handling":1129,"best_for":1130,"file_extension":1131,"format_code_example":1132,"format_to_extension":1133,"upload_features":1135,"icon":1136,"meta_image":1137,"primary_tag":1139,"tags":1150,"integration_methods":1186,"recommended_methods":1217,"default_integration_method":1218,"faq_categories":1225,"translations":1226,"platforms_id":4},"2025-07-03T14:21:42.000Z","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","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":1134},"arb",[],{"id":629},{"id":1138},"c2674666-4371-4aa4-9a65-438c7363fafe",{"id":41,"status":5,"sort":53,"created_on":944,"label":1140,"hidden":160,"icon":1141,"translations":1143},"Mobile apps",{"id":1142},"c9c7e1f5-8b59-4016-ae0c-6fba9469cd55",[1144,1145,1147,1149],{"id":41,"languages_code":925,"label":1140},{"id":374,"languages_code":927,"label":1146},"Aplicaciones móviles",{"id":443,"languages_code":930,"label":1148},"Mobilní aplikace",{"id":411,"languages_code":933,"label":1140},[1151,1162,1169,1176],{"id":45,"status":5,"sort":103,"label":1152,"hidden":160,"created_on":944,"icon":1153,"translations":1155},"Desktop & Games",{"id":1154},"65b04533-5b4c-430c-b8a4-ecce84754200",[1156,1157,1159,1161],{"id":45,"languages_code":925,"label":1152},{"id":382,"languages_code":927,"label":1158},"Escritorio y Juegos",{"id":1004,"languages_code":930,"label":1160},"Stolní počítače & Hry",{"id":684,"languages_code":933,"label":1152},{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1163,"translations":1164},{"id":922},[1165,1166,1167,1168],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":41,"status":5,"sort":53,"label":1140,"hidden":160,"created_on":944,"icon":1170,"translations":1171},{"id":1142},[1172,1173,1174,1175],{"id":41,"languages_code":925,"label":1140},{"id":374,"languages_code":927,"label":1146},{"id":443,"languages_code":930,"label":1148},{"id":411,"languages_code":933,"label":1140},{"id":223,"status":5,"sort":407,"label":1177,"hidden":162,"created_on":944,"icon":10,"translations":1178},"ARB",[1179,1180,1182,1184],{"id":223,"languages_code":925,"label":1177},{"id":1181,"languages_code":927,"label":1177},120,{"id":1183,"languages_code":930,"label":1177},125,{"id":1185,"languages_code":933,"label":1177},130,[1187,1193,1203,1210],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1188},[1189,1190,1191,1192],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1194},[1195,1196,1197,1198,1199,1200,1201,1202],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1204},[1205,1206,1207,1208,1209],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1211},[1212,1213,1214,1215,1216],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1219},[1220,1221,1222,1223,1224],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1227],{"languages_code":925,"name":627,"slug":626,"description":1124,"support_type":1126,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1126,"tile_description":1127,"id":4,"platforms_id":4,"docs_link":1125},{"id":570,"status":5,"created_on":1229,"modified_on":1230,"name":641,"slug":640,"description":1231,"docs_link":1232,"priority":10,"has_sdk":160,"sort":19,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1233,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1233,"tile_description":1234,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1235,"upload_features":1237,"icon":1238,"meta_image":1239,"primary_tag":1241,"tags":1254,"integration_methods":1269,"recommended_methods":1300,"default_integration_method":1301,"faq_categories":1308,"translations":1312,"platforms_id":570},"2022-03-18T08:09:25.000Z","2024-07-17T07:43:22.000Z","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","Translating JS files is easy as a pie with Localazy!",{"js":1236},"js",[],{"id":643},{"id":1240},"2c6699eb-1d80-4772-8268-5597dbcead8c",{"id":61,"status":5,"sort":61,"created_on":944,"label":1242,"hidden":160,"icon":1243,"translations":1245},"Programming Languages",{"id":1244},"8c5836bb-1fbe-49c5-9330-8f931838c457",[1246,1247,1249,1252],{"id":61,"languages_code":925,"label":1242},{"id":468,"languages_code":927,"label":1248},"Lenguajes de Programación",{"id":1250,"languages_code":930,"label":1251},68,"Programovací Jazyky",{"id":1253,"languages_code":933,"label":1242},70,[1255,1262],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1256,"translations":1257},{"id":922},[1258,1259,1260,1261],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":61,"status":5,"sort":61,"label":1242,"hidden":160,"created_on":944,"icon":1263,"translations":1264},{"id":1244},[1265,1266,1267,1268],{"id":61,"languages_code":925,"label":1242},{"id":468,"languages_code":927,"label":1248},{"id":1250,"languages_code":930,"label":1251},{"id":1253,"languages_code":933,"label":1242},[1270,1276,1286,1293],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1271},[1272,1273,1274,1275],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1277},[1278,1279,1280,1281,1282,1283,1284,1285],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1287},[1288,1289,1290,1291,1292],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1294},[1295,1296,1297,1298,1299],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1302},[1303,1304,1305,1306,1307],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1309],{"id":464,"status":5,"created_on":1310,"sort":10,"slug":1311,"label":641,"on_faq_index":160},"2022-06-10T09:49:33.000Z","javascript-i18n-localization",[1313],{"languages_code":925,"name":641,"slug":640,"description":1231,"support_type":1233,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1233,"tile_description":1234,"id":570,"platforms_id":570,"docs_link":1232},{"id":19,"status":5,"created_on":1229,"modified_on":1315,"name":648,"slug":647,"description":1316,"docs_link":908,"priority":10,"has_sdk":160,"sort":107,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1317,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1318,"tile_description":1319,"is_enterprise":160,"is_popular":162,"primary_use_case":1320,"hierarchy_handling":1321,"best_for":1322,"file_extension":1323,"format_code_example":1324,"format_to_extension":1325,"upload_features":1326,"icon":1327,"meta_image":1328,"primary_tag":1330,"tags":1341,"integration_methods":1349,"recommended_methods":1380,"default_integration_method":1381,"faq_categories":1388,"translations":1391,"platforms_id":19},"2025-10-14T11:22:29.000Z","Online JSON translator you will love. Comfortable JSON language files editor with powerful CLI under your fingers for continuous localization.","Advanced format support","{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":647},[],{"id":650},{"id":1329},"8d614c20-667e-4bee-a64d-7d7ce9c0ee0a",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1332,"translations":1334},"File formats",{"id":1333},"ab7c8f89-dcce-45ab-9e21-8605aef289c3",[1335,1336,1338,1340],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},"Formatos de archivo",{"id":484,"languages_code":930,"label":1339},"Formáty souborů",{"id":574,"languages_code":933,"label":1331},[1342],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1343,"translations":1344},{"id":1333},[1345,1346,1347,1348],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1350,1356,1366,1373],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1351},[1352,1353,1354,1355],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1357},[1358,1359,1360,1361,1362,1363,1364,1365],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1367},[1368,1369,1370,1371,1372],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1374},[1375,1376,1377,1378,1379],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1382},[1383,1384,1385,1386,1387],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1389],{"id":423,"status":5,"created_on":1390,"sort":10,"slug":647,"label":648,"on_faq_index":160},"2022-06-10T10:49:07.000Z",[1392],{"languages_code":925,"name":648,"slug":647,"description":1316,"support_type":1317,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1318,"tile_description":1319,"id":19,"platforms_id":19,"docs_link":908},{"id":24,"status":5,"created_on":1229,"modified_on":1394,"name":655,"slug":654,"description":1395,"docs_link":1396,"priority":10,"has_sdk":160,"sort":24,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":160,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1398,"tile_description":1399,"is_enterprise":160,"is_popular":162,"primary_use_case":1400,"hierarchy_handling":1401,"best_for":1402,"file_extension":1403,"format_code_example":1404,"format_to_extension":1405,"upload_features":1407,"icon":1408,"meta_image":1409,"primary_tag":1411,"tags":1418,"integration_methods":1440,"recommended_methods":1471,"default_integration_method":1472,"faq_categories":1479,"translations":1480,"platforms_id":24},"2025-07-03T14:28:31.000Z","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","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":1406},"xlf",[],{"id":657},{"id":1410},"889970a6-cce8-4055-b96a-9c3f292aa67f",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1412,"translations":1413},{"id":1333},[1414,1415,1416,1417],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1419,1426,1433],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1420,"translations":1421},{"id":1333},[1422,1423,1424,1425],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1427,"translations":1428},{"id":1333},[1429,1430,1431,1432],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1434,"translations":1435},{"id":1333},[1436,1437,1438,1439],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1441,1447,1457,1464],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1442},[1443,1444,1445,1446],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1448},[1449,1450,1451,1452,1453,1454,1455,1456],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1458},[1459,1460,1461,1462,1463],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1465},[1466,1467,1468,1469,1470],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1473},[1474,1475,1476,1477,1478],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1481],{"languages_code":925,"name":655,"slug":654,"description":1395,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1398,"tile_description":1399,"id":24,"platforms_id":24,"docs_link":1396},{"id":107,"status":5,"created_on":1483,"modified_on":1483,"name":1484,"slug":1485,"description":1486,"docs_link":1487,"priority":10,"has_sdk":160,"sort":247,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1488,"tile_description":1489,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1490,"upload_features":1491,"icon":1492,"meta_image":1494,"primary_tag":1496,"tags":1503,"integration_methods":1531,"recommended_methods":1562,"default_integration_method":1563,"faq_categories":1570,"translations":1571,"platforms_id":107},"2026-05-21T20:49:09.000Z","PO","po","Edit .po and .pot files with your team, automate translation with AI, and ship faster.","\u002Fdocs\u002Fcli\u002Fpo-format","Seamless integration","Upload, edit and translate PO files with Localazy.",{"po":1485},[],{"id":1493},"25f317fe-0c10-4f0b-92cd-f80d1f3c6a67",{"id":1495},"490022f9-d91a-4e1a-9e79-db374ec997c2",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1497,"translations":1498},{"id":1333},[1499,1500,1501,1502],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1504,1511,1521],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1505,"translations":1506},{"id":1333},[1507,1508,1509,1510],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":394,"status":5,"sort":394,"label":1512,"hidden":162,"created_on":944,"icon":10,"translations":1513},"C++",[1514,1515,1517,1519],{"id":394,"languages_code":925,"label":1512},{"id":1516,"languages_code":927,"label":1512},135,{"id":1518,"languages_code":930,"label":1512},140,{"id":1520,"languages_code":933,"label":1512},144,{"id":24,"status":5,"sort":247,"label":1522,"hidden":162,"created_on":944,"icon":10,"translations":1523},"Gettext",[1524,1525,1527,1529],{"id":24,"languages_code":925,"label":1522},{"id":1526,"languages_code":927,"label":1522},101,{"id":1528,"languages_code":930,"label":1522},106,{"id":1530,"languages_code":933,"label":1522},111,[1532,1538,1548,1555],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1533},[1534,1535,1536,1537],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1539},[1540,1541,1542,1543,1544,1545,1546,1547],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1549},[1550,1551,1552,1553,1554],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1556},[1557,1558,1559,1560,1561],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1564},[1565,1566,1567,1568,1569],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1572],{"languages_code":925,"name":1484,"slug":1485,"description":1486,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1488,"tile_description":1489,"id":107,"platforms_id":107,"docs_link":1487},{"id":252,"status":5,"created_on":1229,"modified_on":1574,"name":1575,"slug":1576,"description":1577,"docs_link":1578,"priority":10,"has_sdk":160,"sort":230,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1579,"tile_description":1580,"is_enterprise":160,"is_popular":160,"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":1647,"default_integration_method":1648,"faq_categories":1655,"translations":1658,"platforms_id":252},"2025-10-02T08:32:44.000Z","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",".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":1576},[],{"id":1493},{"id":1590},"1f07bf83-9363-47d6-b21b-a5121c0efaf6",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1592,"translations":1593},{"id":1333},[1594,1595,1596,1597],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1599,1606],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1600,"translations":1601},{"id":1333},[1602,1603,1604,1605],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":247,"status":5,"sort":252,"label":1607,"hidden":162,"created_on":944,"icon":10,"translations":1608},"C#",[1609,1610,1612,1614],{"id":247,"languages_code":925,"label":1607},{"id":1611,"languages_code":927,"label":1607},103,{"id":1613,"languages_code":930,"label":1607},108,{"id":1615,"languages_code":933,"label":1607},113,[1617,1623,1633,1640],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1618},[1619,1620,1621,1622],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1624},[1625,1626,1627,1628,1629,1630,1631,1632],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1634},[1635,1636,1637,1638,1639],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1641},[1642,1643,1644,1645,1646],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1649},[1650,1651,1652,1653,1654],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1656],{"id":356,"status":5,"created_on":1657,"sort":10,"slug":1576,"label":1575,"on_faq_index":10},"2022-08-01T16:44:06.000Z",[1659],{"languages_code":925,"name":1575,"slug":1576,"description":1577,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1579,"tile_description":1580,"id":252,"platforms_id":252,"docs_link":1578},{"id":661,"status":5,"created_on":1661,"modified_on":1662,"name":664,"slug":663,"description":1663,"docs_link":1664,"priority":10,"has_sdk":10,"sort":662,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1665,"show_in_spa":162,"is_file_format":10,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":1665,"tile_subtitle":1665,"tile_description":1666,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":10,"upload_features":10,"icon":1667,"meta_image":1668,"primary_tag":1670,"tags":1682,"integration_methods":1726,"recommended_methods":1746,"default_integration_method":1747,"faq_categories":1754,"translations":1757,"platforms_id":661},"2022-06-16T09:08:11.000Z","2026-04-27T18:16:54.000Z","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","Localize your Strapi website with our official localization plugin. Easy setup and installation.",{"id":666},{"id":1669},"5995b721-a2ea-487e-ad4b-298a489bbd24",{"id":19,"status":5,"sort":15,"created_on":944,"label":1671,"hidden":160,"icon":1672,"translations":1674},"CMS",{"id":1673},"1172a655-928c-4594-9263-d8afdfd9cd79",[1675,1676,1678,1680],{"id":19,"languages_code":925,"label":1671},{"id":1677,"languages_code":927,"label":1671},73,{"id":1679,"languages_code":930,"label":1671},81,{"id":1681,"languages_code":933,"label":1671},84,[1683,1695,1707,1714],{"id":99,"status":5,"sort":95,"label":1684,"hidden":160,"created_on":944,"icon":10,"translations":1685},"Multilingual SEO",[1686,1687,1690,1693],{"id":99,"languages_code":925,"label":1684},{"id":1688,"languages_code":927,"label":1689},89,"SEO multilingüe",{"id":1691,"languages_code":930,"label":1692},94,"Vícejazyčné SEO",{"id":1694,"languages_code":933,"label":1684},99,{"id":535,"status":5,"sort":535,"label":302,"hidden":160,"created_on":944,"icon":1696,"translations":1698},{"id":1697},"e782ed3f-d954-45ca-8b17-5bf5fe95f30a",[1699,1700,1703,1705],{"id":535,"languages_code":925,"label":302},{"id":1701,"languages_code":927,"label":1702},132,"Comercio electrónico",{"id":1704,"languages_code":930,"label":302},137,{"id":1706,"languages_code":933,"label":302},142,{"id":19,"status":5,"sort":15,"label":1671,"hidden":160,"created_on":944,"icon":1708,"translations":1709},{"id":1673},[1710,1711,1712,1713],{"id":19,"languages_code":925,"label":1671},{"id":1677,"languages_code":927,"label":1671},{"id":1679,"languages_code":930,"label":1671},{"id":1681,"languages_code":933,"label":1671},{"id":20,"status":5,"sort":41,"label":1715,"hidden":160,"created_on":944,"icon":1716,"translations":1718},"Marketing tools",{"id":1717},"098fe6a4-dd2e-42d8-937e-2d8121e6e266",[1719,1720,1723,1725],{"id":20,"languages_code":925,"label":1715},{"id":1721,"languages_code":927,"label":1722},43,"Herramientas de marketing",{"id":431,"languages_code":930,"label":1724},"Marketingové nástroje",{"id":509,"languages_code":933,"label":1715},[1727],{"id":53,"status":5,"sort":10,"label":1728,"alternative_label":1729,"slug":1730,"description":1731,"documentation_link":1732,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1734},"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",[1735,1736,1739,1740,1743],{"id":53,"languages_code":925,"label":1728,"description":1731,"slug":1730},{"id":1721,"languages_code":927,"label":1737,"description":1738,"slug":10},"Complemento Oficial de Strapi","Nuestros desarrolladores mantienen un complemento oficial de localización de Strapi. ¡Empiece en unos pocos clics!",{"id":500,"languages_code":933,"label":1728,"description":1731,"slug":1730},{"id":574,"languages_code":930,"label":1741,"description":1742,"slug":10},"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":1688,"languages_code":987,"label":1744,"description":1745,"slug":10},"Offizielles Strapi-Plugin","Unsere Entwickler pflegen ein offizielles Strapi-Lokalisierungs-Plugin. Starten Sie mit ein paar Klicks!",[],{"id":53,"status":5,"sort":10,"label":1728,"alternative_label":1729,"slug":1730,"description":1731,"documentation_link":1732,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1748},[1749,1750,1751,1752,1753],{"id":53,"languages_code":925,"label":1728,"description":1731,"slug":1730},{"id":1721,"languages_code":927,"label":1737,"description":1738,"slug":10},{"id":500,"languages_code":933,"label":1728,"description":1731,"slug":1730},{"id":574,"languages_code":930,"label":1741,"description":1742,"slug":10},{"id":1688,"languages_code":987,"label":1744,"description":1745,"slug":10},[1755],{"id":207,"status":5,"created_on":1756,"sort":10,"slug":663,"label":664,"on_faq_index":10},"2022-06-16T09:24:13.000Z",[1758],{"languages_code":925,"name":664,"slug":663,"description":1663,"support_type":1665,"meta_title":10,"meta_description":10,"marketing_subtitle":1665,"tile_subtitle":1665,"tile_description":1666,"id":661,"platforms_id":661,"docs_link":1664},{"id":451,"status":5,"created_on":1229,"modified_on":1760,"name":671,"slug":670,"description":10,"docs_link":1761,"priority":10,"has_sdk":160,"sort":443,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1762,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":1763,"tile_subtitle":1764,"tile_description":1765,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":10,"upload_features":1766,"icon":1767,"meta_image":1768,"primary_tag":1770,"tags":1783,"integration_methods":1791,"recommended_methods":1804,"default_integration_method":1805,"faq_categories":1811,"translations":1812,"platforms_id":451},"2024-12-20T15:00:22.000Z","\u002Fdocs\u002Fintegrations\u002Fquick-start-figma","plugin","Figma plugin","Localization plugin","Quickly translate your Figma designs and seamlessly reuse the translations during the development of your project.",[],{"id":673},{"id":1769},"7573fed6-8817-4cb4-84d2-be327e6c4891",{"id":25,"status":5,"sort":45,"created_on":944,"label":1771,"hidden":160,"icon":1772,"translations":1774},"Design tools",{"id":1773},"1053d863-b690-4fbd-aadf-dbf2ba282768",[1775,1776,1779,1782],{"id":25,"languages_code":925,"label":1771},{"id":1777,"languages_code":927,"label":1778},42,"Herramientas de diseño",{"id":1780,"languages_code":930,"label":1781},49,"Nástroje pro návrh",{"id":557,"languages_code":933,"label":1771},[1784],{"id":25,"status":5,"sort":45,"label":1771,"hidden":160,"created_on":944,"icon":1785,"translations":1786},{"id":1773},[1787,1788,1789,1790],{"id":25,"languages_code":925,"label":1771},{"id":1777,"languages_code":927,"label":1778},{"id":1780,"languages_code":930,"label":1781},{"id":557,"languages_code":933,"label":1771},[1792],{"id":45,"status":5,"sort":10,"label":1729,"alternative_label":1729,"slug":1793,"description":1794,"documentation_link":85,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1795},"official-plugin","Our developers maintain an official plugin for this integration. Start in a few clicks!",[1796,1797,1800,1801],{"id":45,"languages_code":925,"label":1729,"description":1794,"slug":1793},{"id":280,"languages_code":927,"label":1798,"description":1799,"slug":10},"Plugin Oficial","Nuestros desarrolladores mantienen un plugin oficial para esta integración. ¡Empiece con unos pocos clics!",{"id":271,"languages_code":933,"label":1729,"description":1794,"slug":1793},{"id":464,"languages_code":930,"label":1802,"description":1803,"slug":10},"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":45,"status":5,"sort":10,"label":1729,"alternative_label":1729,"slug":1793,"description":1794,"documentation_link":85,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1806},[1807,1808,1809,1810],{"id":45,"languages_code":925,"label":1729,"description":1794,"slug":1793},{"id":280,"languages_code":927,"label":1798,"description":1799,"slug":10},{"id":271,"languages_code":933,"label":1729,"description":1794,"slug":1793},{"id":464,"languages_code":930,"label":1802,"description":1803,"slug":10},[],[1813],{"languages_code":925,"name":671,"slug":670,"description":10,"support_type":1762,"meta_title":10,"meta_description":10,"marketing_subtitle":1763,"tile_subtitle":1764,"tile_description":1765,"id":451,"platforms_id":451,"docs_link":1761},{"id":1815,"owner":1816,"created_by":10,"sort":10,"title":1821,"slug":1822,"modified_on":877,"created_on":1823,"pinned":160,"badge":10,"priority":1824,"main_image":1825,"status":5,"tags":1826,"dictionary":1834,"reading_time":1835,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"69d78a237ab1270001eddabf",{"id":1817,"first_name":1818,"last_name":877,"slug":1819,"avatar":1820},"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",[1827,1829,1832],{"id":451,"created_on":1828,"status":5,"label":771,"slug":775,"on_index_page":160},"2026-05-28 18:14:00",{"id":402,"created_on":1828,"status":5,"label":1830,"slug":1831,"on_index_page":162},"AI","ai",{"id":451,"created_on":1828,"status":5,"label":352,"slug":1833,"on_index_page":162},"localization",[],0,{"id":1837,"owner":1838,"created_by":10,"sort":10,"title":1839,"slug":1840,"modified_on":877,"created_on":1841,"pinned":160,"badge":10,"priority":1824,"main_image":1842,"status":5,"tags":1843,"dictionary":1850,"reading_time":1835,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"69ea1abb7ab1270001ede902",{"id":1817,"first_name":1818,"last_name":877,"slug":1819,"avatar":1820},"You can just build things. But should you? The build vs. buy debate in localization","build-vs-buy-in-localization-you-can-build-things-but-should-you","2026-05-25T08:43:00.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F05\u002Flocalazy-Vibe-coding.png",[1844,1845,1849],{"id":402,"created_on":1828,"status":5,"label":1830,"slug":1831,"on_index_page":162},{"id":1846,"created_on":1828,"status":5,"label":1847,"slug":1848,"on_index_page":160},646,"Business Development","business-development",{"id":451,"created_on":1828,"status":5,"label":352,"slug":1833,"on_index_page":162},[],{"post":1852,"relatedPosts":2013,"banner":2072},{"id":1853,"owner":1854,"created_by":10,"sort":10,"title":1859,"slug":1860,"modified_on":1861,"created_on":1862,"pinned":162,"badge":10,"priority":1824,"main_image":1863,"status":5,"tags":1864,"dictionary":1872,"reading_time":61,"excerpt":1941,"og_title":877,"og_description":877,"og_image":877,"content":1942,"meta_title":1943,"meta_description":1944,"canonical":877,"cta":1945,"fullGhostPost":1953},"690e5ee563350c0001d617da",{"id":1855,"first_name":1856,"last_name":877,"slug":1857,"avatar":1858},"6824a22d63350c0001d5a5cb","Kevine Nzapdi","kevine-nzapdi","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002FKevine.png","Guide to translating Angular apps with ngx-translate | Part 3: i18n 🌎","guide-to-translate-angular-apps-with-ngx-translate-i18n","2026-01-24T19:16:44.000+01:00","2026-01-23T15:49:29.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Ftechnical-article-2.png",[1865,1867,1868],{"id":451,"created_on":1828,"status":5,"label":1866,"slug":1866,"on_index_page":162},"i18n",{"id":451,"created_on":1828,"status":5,"label":621,"slug":620,"on_index_page":160},{"id":1869,"created_on":1828,"status":5,"label":1870,"slug":1871,"on_index_page":160},6556628,"Tutorial","tutorial",[1873,1894,1911,1919],{"id":1874,"status":5,"owner":1875,"created_on":1876,"title":1877,"excerpt":1878,"content":1879,"slug":1880,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1881},255,"a5e46ee7-1f50-4f81-ae2d-68a664c76aa2","2026-05-12T07:09:24.000Z","ICU Message Format","A localization-friendly syntax that lets developers write dynamic, multilingual messages using placeholders and logic rules.","ICU Message Format is part of the [International Components for Unicode (ICU)](https:\u002F\u002Ficu.unicode.org \"https:\u002F\u002Ficu.unicode.org\") suite. It is widely used in localization to create dynamic, context-aware messages that adapt to grammatical and structural rules across languages. Instead of hardcoding separate strings for each scenario, developers use ICU Message Format to define templates that automatically adjust based on variables such as quantity, gender, or other contextual inputs.\n\nThis system is essential in software localization, where content like notifications, user messages, and UI text often depends on dynamic data. It allows translators to focus on conveying the intended meaning without restructuring sentences manually for every case or language.\n\nFor example, in English, the sentence “You have 1 new message” changes to “You have 5 new messages” depending on the number. In other languages, the change might involve gender-specific words, different sentence structures, or alternate verb conjugations. \n\nICU Message Format enables this by using placeholders and conditional logic, ensuring that messages are grammatically correct and natural-sounding in all supported languages.\n\n### 🧩 Highlights of ICU Message Format:\n\n* Handles pluralization, gender variations, and context-based message structures\n* Uses placeholders to insert dynamic values such as numbers, names, and dates\n* Supports nested messages and conditional formatting for advanced use cases\n* Integrates with localization platforms like Localazy, Phrase, and Transifex\n* Keeps translations consistent and reusable across multiple contexts\n* Reduces the need for multiple translation strings per language\n* Improves translation speed by minimizing structural rework \n\n### 🛠️ **Example:**\n\n```\n\"You have {NUM_MESSAGES, plural, one {# new message} other {# new messages}}.\"\n```","icu-message-format",[1882,1883,1886,1889,1891],{"id":1613,"slug":647},{"id":1884,"slug":1885},90,"icu",{"id":1887,"slug":1888},116,"yaml",{"id":1181,"slug":1890},"placeholder",{"id":1892,"slug":1893},274,"software-localization",{"id":1895,"status":5,"owner":1875,"created_on":1896,"title":1897,"excerpt":1898,"content":1899,"slug":1897,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1900},426,"2026-05-12T07:09:27.000Z","ngx-translate","A community-built translation library for Angular that loads and displays localized strings at runtime.","[ngx-translate](https:\u002F\u002Fngx-translate.org \"https:\u002F\u002Fngx-translate.org\") is a runtime translation library for Angular that loads localized strings from JSON files and updates the UI as soon as the user switches languages. It is used to build multilingual interfaces without rebuilding the application for every locale. It loads translation files at runtime, applies keys directly in templates, and updates visible text when the active language changes. This makes it practical for projects that handle dynamic content, frequent releases, or environments where language files need to come from an API.\n\nThe library offers a flexible structure: teams can organize translations in separate folders, load them on demand, or map them to custom file names. Interpolation, nested keys, and fallbacks are supported out of the box. However, for features such as ICU Message handling or advanced parsing, you might need to use compatible plugins. \n\nThis modular approach makes ngx-translate suitable for Angular, Ionic, hybrid apps, and setups that need more control than Angular’s built-in i18n system.\n\n### 📌 Key points to know about ngx-translate\n\n* It supports nested keys, parameters, plural forms, and fallbacks.\n* JSON-based translation files let teams add, edit, and restructure content quickly.\n* Language switching happens at runtime, so the UI updates instantly without a rebuild.\n* The architecture is modular, so teams can add plugins or write their own compiler or parser.\n* Works well with apps that need fast iteration, dynamic content, or remote translation sources.\n* The library works with custom loaders, so translations can come from the server, a CMS, or a CDN.\n\n### 🧩 How ngx-translate fits into localization workflows\n\n* Works with translation platforms that export structured JSON.\n* Makes it easy to load locale data at different stages of the app lifecycle.\n* Ideal for projects that want live updates across all supported languages.\n* Supports continuous delivery because content changes do not require a deployment.\n* Helps teams test translations, layout shifts, and parameter handling without rebuilding the app.\n\n### Notes\n\nClient-side loading gives ngx-translate a lot of flexibility, yet it also puts file size and network conditions under direct pressure. Many teams split translations by module, preload key sections, or serve files through [a CDN](https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Flanguage-cdn) to keep the interface responsive.\n\n### Related sources:\n\n* GitHub: \u003Chttps:\u002F\u002Fgithub.com\u002Fngx-translate\u002Fcore>\n* npm: \u003Chttps:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@ngx-translate\u002Fcore>\n* Documentation: \u003Chttps:\u002F\u002Fgithub.com\u002Fngx-translate\u002Fcore#readme>",[1901,1902,1904,1907,1908],{"id":1613,"slug":647},{"id":1903,"slug":620},69,{"id":1905,"slug":1906},79,"internationalization",{"id":1874,"slug":1880},{"id":1909,"slug":1910},405,"string-interpolation",{"id":1903,"status":5,"owner":1912,"created_on":1913,"title":621,"excerpt":1914,"content":1915,"slug":620,"meta_title":877,"meta_description":10,"canonical":10,"related_terms":1916},"2bac48a8-b362-482f-b574-3bc71dca4c5b","2022-03-17T12:22:55.000Z","Angular is a TypeScript-based open-source platform for building mobile and desktop web applications. ","Angular enables you to build applications that range from simple, single-developer projects to enterprise-level applications.\n\nThe Angular platform consists of:\n- a framework for building scalable web applications that consist of several individual components,\n- an extensive collection of integrated libraries that support the development of application features, including routing, forms management, and client-server communication,\n- a set of tools designed to help you write code, build software, test your work, and update your applications.\n\nGoogle designed Angular as a ground-up rewrite of AngularJS. Angular has been developed and maintained by Google developers since 2016 with help from a community of individuals and corporations. \n\nYou can learn more about Angular on the [official website](https:\u002F\u002Fangular.io\u002F).\n\nRelated links:\n[How to localize Angular app with angular-i18n and Localazy](\u002Fblog\u002Flocalize-angular-app-i18n-l10n-localazy)",[1917],{"id":1918,"slug":633},74,{"id":1920,"status":5,"owner":1875,"created_on":1896,"title":1921,"excerpt":1922,"content":1923,"slug":1924,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1925},428,"Pseudo-locale","A test locale that applies controlled text changes to mimic a real locale's behaviour and reveal early i18n faults.","A pseudo-locale modifies visible strings automatically during development or testing. It helps developers and QA see where the UI breaks, where placeholders fail, and where text assumptions hide i18n issues. Typical transformations include accenting characters, expanding length, adding visible delimiters, and flipping direction. Pseudo-locales reveal functional and design problems early, reducing rework and translation costs.\n\nTeams use pseudo-locales to find issues that often appear only after localization: clipped text, missing externalization, broken placeholders, font limits, or incorrect handling of right-to-left content. This makes pseudo-locales a direct way to test international readiness before translators start working. However, pseudo-locales do not check tone or cultural fit. Their purpose is to expose technical problems.\n\n### 🧪 What pseudo-locales change\n\n* Accent or extended characters.\n* Longer text through padded segments.\n* Bracket or symbol markers around each string.\n* Unicode direction marks for RTL testing.\n* Visible markers around variables and placeholders.\n\n### 🤔 How to create useful pseudo-locales:\n\n1. Accent or substitute characters (e → è\u002Fë) so ASCII-only code reveals encoding or font issues.\n2. Expand strings (add padding or repeat words) to test layout and wrapping.\n3. Insert visible placeholders or tags around variables to catch missing or reordered placeholders.\n4. Apply Unicode RTL markers or mirror characters for right-to-left testing.\n5. Automate generation from the source string bundle and include pseudo-locales in smoke tests.\n\n### Notes\n\nA pseudo-locale must reflect realistic stress on the interface. Avoid extreme growth patterns that no natural language produces, and check every part of the product, including error states and secondary screens. This ensures the test mirrors real usage instead of producing noise. ","pseudo-locale ",[1926,1929,1932,1935,1938],{"id":1927,"slug":1928},161,"rtl",{"id":1930,"slug":1931},270,"unicode",{"id":1933,"slug":1934},306,"localization-quality-assurance",{"id":1936,"slug":1937},409,"localization-testing",{"id":1939,"slug":1940},427,"pseudo-testing","Our invoice dashboard is built and polished — now it's time to make our app truly global. In this tutorial, we’ll integrate Localazy to manage translations, add a pseudo-locale for QA testing, and enable ICU plurals to handle smarter, context-aware messages.","\u003Cp>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-app-logic\">We have built\u003C\u002Fa> a complete invoice dashboard: functional, sleek, and ready. Now, let’s teach it how to speak.\u003C\u002Fp>\u003Cp>In this third and final part of the series, \u003Cstrong>you will connect your Angular app to Localazy\u003C\u002Fstrong>, upload your base English translations, and pull in additional languages like French. You’ll also add a pseudo-locale to \u003Cstrong>visually test missing or truncated text\u003C\u002Fstrong>, and use ICU messages to \u003Cstrong>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fpluralization-in-software-localization-beginners-guide\u002F\">handle plurals\u003C\u002Fa> and gender variations \u003C\u002Fstrong>seamlessly.\u003C\u002Fp>\u003Cp>By the end of this guide, your app won’t just be multilingual but it will also be localization-ready, QA-proof, and production-strong.\u003C\u002Fp>\u003Ch2 id=\"integrate-localazy-into-your-angular-project\">🧩 Integrate Localazy into your Angular project \u003Ca class=\"markdownit-header-anchor\" href=\"#integrate-localazy-into-your-angular-project\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Now that runtime i18n is working and your JSON files live in \u003Ccode>public\u002Fassets\u002Fi18n\u003C\u002Fcode>, it’s time to connect your Angular app to Localazy so translations can sync automatically without endless copy-paste.\u003C\u002Fp>\u003Ch3 id=\"1-install-the-cli-locally\">1. Install the CLI locally \u003Ca class=\"markdownit-header-anchor\" href=\"#1-install-the-cli-locally\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-bash\">npm i -D @localazy\u002Fcli\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"2-get-your-project-keys\">2. Get your project keys \u003Ca class=\"markdownit-header-anchor\" href=\"#2-get-your-project-keys\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Log into your Localazy account and open the \u003Cstrong>Integration overview &gt; Angular\u003C\u002Fstrong> section to grab your keys.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-1.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1895\" height=\"957\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-1.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-1.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-1.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-1.png 1895w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>On the next screen, you’ll see your Write key and Read key. \u003Cstrong>Copy both or save them\u003C\u002Fstrong>, as you’ll paste them into the Localazy config in the next step.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-2.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1888\" height=\"953\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-2.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-2.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-2.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-2.png 1888w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Ch3 id=\"3-set-up-the-localazy-integration\">3. Set up the Localazy integration \u003Ca class=\"markdownit-header-anchor\" href=\"#3-set-up-the-localazy-integration\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>You’ve got your keys — now let’s tell Localazy where your Angular i18n files live and how to sync them. \u003Cbr>\u003Cbr>Create \u003Ccode>localazy.json\u003C\u002Fcode> (project root):\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"project\": \"invoice-pwa\",\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": [\n      { \"path\": \"public\u002Fassets\u002Fi18n\u002Fen.json\", \"lang\": \"en\", \"tags\": [\"app\"] }\n    ]\n  },\n  \"download\": {\n    \"files\": [\n      { \"path\": \"public\u002Fassets\u002Fi18n\u002F${lang}.json\" }\n    ]\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This minimal integration pushes \u003Cstrong>English\u003C\u002Fstrong> and pulls \u003Cstrong>French\u003C\u002Fstrong> right back into \u003Ccode>public\u002Fassets\u002Fi18n\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch3 id=\"4-keep-your-api-keys-out-of-git\">4. Keep your API keys out of Git \u003Ca class=\"markdownit-header-anchor\" href=\"#4-keep-your-api-keys-out-of-git\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Create a tiny keys file you \u003Cstrong>do not commit\u003C\u002Fstrong>:\u003C\u002Fp>\u003Cp>\u003Cstrong>\u003Ccode>localazy.keys.json\u003C\u002Fcode> (root)\u003C\u002Fstrong>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{ \"writeKey\": \"YOUR_WRITE_KEY\", \"readKey\": \"YOUR_READ_KEY\" }\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Add to \u003Ccode>.gitignore\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode>localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You’ll use \u003Cstrong>Write Key\u003C\u002Fstrong> for uploads and \u003Cstrong>Read Key\u003C\u002Fstrong> for downloads.\u003C\u002Fp>\u003Ch3 id=\"5-upload-en-and-download\">5. Upload EN and download \u003Ca class=\"markdownit-header-anchor\" href=\"#5-upload-en-and-download\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Run this command from the project root to push your English source strings to the Localazy platform:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy upload -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You’ll see your project with \u003Cstrong>English\u003C\u002Fstrong> source strings in the dashboard as seen below. From there, simply \u003Cstrong>add French\u003C\u002Fstrong> as a second language. This will be your first target locale.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-14.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1889\" height=\"953\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-14.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-14.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-14.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-14.png 1889w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Translating is easy: just click the \u003Cstrong>Translate\u003C\u002Fstrong> action in the interface to auto-translate everything in one go. You'll need to select a translation provider. Localazy currently offers:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fa-practical-guide-to-translating-with-localazy-ai\u002F\">Localazy AI\u003C\u002Fa>\u003C\u002Fstrong>\u003C\u002Fli>\u003Cli>\u003Cstrong>Google Translate\u003C\u002Fstrong>\u003C\u002Fli>\u003Cli>\u003Cstrong>DeepL\u003C\u002Fstrong>\u003C\u002Fli>\u003Cli>\u003Cstrong>Amazon Translate\u003C\u002Fstrong>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-12.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1911\" height=\"959\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-12.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-12.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-12.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-12.png 1911w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>In a moment, you'll be able to see your translated strings:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-13.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1892\" height=\"960\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-13.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-13.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-13.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-13.png 1892w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-15.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1887\" height=\"943\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-15.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-15.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-15.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-15.png 1887w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Once the translation is done, you can open the \u003Cstrong>Review\u003C\u002Fstrong> tab to go through each string and make quick edits if needed before approving them for production.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-16.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1897\" height=\"973\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-16.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-16.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-16.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-16.png 1897w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>With Localazy, you can directly upload and download your source strings to the platform from the \u003Cstrong>File management\u003C\u002Fstrong> section:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-17.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1883\" height=\"893\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-17.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-17.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-17.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-17.png 1883w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Once FR has content, download it:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy download -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Note that this will overide the manual strings you inserted in the first part of this tutorial. \u003C\u002Fp>\u003Cp>You should now have this:\u003C\u002Fp>\u003Cpre>\u003Ccode>public\u002Fassets\u002Fi18n\u002Ffr.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Verify in your Angular app. Start the dev server:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npm start\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now toggle the \u003Cstrong>EN\u002FFR button\u003C\u002Fstrong> in your app. You should see the fresh strings from \u003Ccode>fr.json\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"test-using-a-pseudo-locale\">⛓️‍💥 Test using a pseudo-locale \u003Ca class=\"markdownit-header-anchor\" href=\"#test-using-a-pseudo-locale\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>When localizing apps, engineers often struggle to spot missing or broken translations early. Localazy solves this with a \u003Cstrong>pseudo-locale (\u003Ccode>qps\u003C\u002Fcode>)\u003C\u002Fstrong>, which automatically lengthens text and adds markers to highlight untranslated or clipped strings.\u003C\u002Fp>\u003Cp>By mapping it in your config, you can quickly switch to “qps mode” in Angular and visually test layouts before going live, a simple best practice that keeps your localization clean and reliable.\u003C\u002Fp>\u003Ch3 id=\"1-select-your-custom-locale\">1. Select your custom locale \u003Ca class=\"markdownit-header-anchor\" href=\"#1-select-your-custom-locale\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>In the language picker, search for \u003Cstrong>Custom locale\u003C\u002Fstrong> and choose \u003Cstrong>Custom Locale (xxc)\u003C\u002Fstrong>:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-3.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1907\" height=\"961\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-3.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-3.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-3.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-3.png 1907w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Then select the language:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-4.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1905\" height=\"960\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-4.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-4.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-4.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-4.png 1905w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Ch3 id=\"2-seed-and-map-it\">2. Seed and map it \u003Ca class=\"markdownit-header-anchor\" href=\"#2-seed-and-map-it\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Now that you have added the custom locale, seed it by copying the English strings into it for testing (since Localazy won’t download an empty language):\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-5.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1577\" height=\"962\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-5.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-5.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-5.png 1577w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>To test your translations visually using a pseudo-locale, make the mapping explicit in your configuration:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">{\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": [\n      { \"pattern\": \"public\u002Fassets\u002Fi18n\u002Fen.json\", \"lang\": \"en\", \"path\": \"public\u002Fassets\u002Fi18n\" }\n    ]\n  },\n  \"download\": {\n    \"files\": [\n      { \"output\": \"${path}\u002F${lang}.json\" }\n    ],\n    \"langAliases\": {\n      \"xxc\": \"qps\" \u002F\u002F map Localazy's pseudo code to your local \"qps\"\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"3-add-it-to-your-project\">3. Add it to your project \u003Ca class=\"markdownit-header-anchor\" href=\"#3-add-it-to-your-project\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Run this command to download the custom locale to your project:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">npx localazy download -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You should now have:\u003C\u002Fp>\u003Cpre>\u003Ccode>public\u002Fassets\u002Fi18n\u002Fqps.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This writes \u003Ccode>public\u002Fassets\u002Fi18n\u002Fqps.json\u003C\u002Fcode> thanks to \u003Ccode>langAliases\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>Now, allow it in the language service. First, widen your accepted languages so \u003Ccode>qps\u003C\u002Fcode> is treated like any other locale in \u003Ccode>src\u002Fapp\u002Fcore\u002Flanguage.service.ts\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">type Lang = 'en' | 'fr' | 'qps';          \nprivate readonly supported: Lang[] = ['en', 'fr', 'qps'];\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then expose it to the app shell so the header can switch to \u003Ccode>qps\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>\u003Cstrong>Also update it in \u003Ccode>app.ts\u003C\u002Fcode>:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-jsx\">import { Component, signal } from '@angular\u002Fcore';\nimport { RouterOutlet } from '@angular\u002Frouter';\nimport { LanguageService } from '.\u002Fcore\u002Flanguage.service';\n\n...\n\nexport class App {\n \n ...\n\n  \u002F\u002F Public API for the template\n  setLang(code: 'en' | 'fr' | 'qps') \n    this.lang.use(code);\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Finally, add a tiny “QA” toggle in the header:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-html\">&lt;button type=\"button\" class=\"btn-secondary\" (click)=\"setLang('qps')\"&gt;QA&lt;\u002Fbutton&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"4-test-it\">4. Test it \u003Ca class=\"markdownit-header-anchor\" href=\"#4-test-it\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>To test your pseudo-locale visually, open your \u003Cstrong>Localazy dashboard\u003C\u002Fstrong>, pick the custom locale you created (\u003Ccode>xxc\u003C\u002Fcode> → \u003Ccode>qps\u003C\u002Fcode>), and edit one of the strings; for example, change \u003Cstrong>“Install app”\u003C\u002Fstrong> to something playful or slightly distorted like \u003Cstrong>“Ĭńşţāĺľ āƥƥ [QA]\" and download\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>When you run your app, this will make it easy to spot pseudo-localized text in the UI, stretched, accented, or bracketed. \u003Cstrong>It helps you quickly identify layout issues, missing translations, or clipped text\u003C\u002Fstrong> that might not be obvious with regular English or French.\u003C\u002Fp>\u003Cp>Another example on the usefulness of this method is German translations, which are usually longer and might stretch or distort your UI. Instead of waiting for actual translations, you can spot problems like overflowing text or clipped buttons by switching to a pseudo-locale such as \u003Ccode>qps\u003C\u002Fcode>. It automatically adds accents, brackets, or longer versions of your English text, helping developers and designers ensure that every label, form, and button stays readable and responsive across all languages.\u003C\u002Fp>\u003Cp>When it's time to test the content, just run \u003Ccode>npm start\u003C\u002Fcode>, switch between \u003Cstrong>EN \u002F FR \u002F QA\u003C\u002Fstrong>, and make sure the \u003Cstrong>QA\u003C\u002Fstrong> text looks weird (accents\u002Fbrackets) to confirm that pseudo-locale is working. \u003C\u002Fp>\u003Cp>Your next move is to enable \u003Cstrong>ICU syntax\u003C\u002Fstrong> so your app can handle real-world plural and gender cases cleanly with \u003Ccode>ngx-translate\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"icu-for-plural-and-gender-support\">👭 ICU for plural and gender support \u003Ca class=\"markdownit-header-anchor\" href=\"#icu-for-plural-and-gender-support\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>With a tiny tweak to your Angular config, \u003Ccode>ngx-translate\u003C\u002Fcode> will be able to understand \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Ficu\">ICU syntax\u003C\u002Fa>, so instead of awkward “1 items” or “0 invoice,” \u003Cstrong>your app will speak like a real person\u003C\u002Fstrong>. After this change, your JSON files will handle smart plural and gender rules automatically with no extra logic needed. Let's see how.\u003C\u002Fp>\u003Ch3 id=\"1-add-imports\">1. Add imports \u003Ca class=\"markdownit-header-anchor\" href=\"#1-add-imports\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Add these imports at the top of \u003Ccode>\u003Cstrong>src\u002Fapp\u002Fapp.config.ts\u003C\u002Fstrong>\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { TranslateCompiler } from '@ngx-translate\u002Fcore';\nimport { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';\n\n\u002F\u002F Then, in your providers array, drop this in (keep everything else as-is):\n{ provide: TranslateCompiler, useClass: TranslateMessageFormatCompiler },\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now your translations can do smart things like this:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"itemsCount\": \"{count, plural, =0 {No items} one {# item} other {# items}}\"\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Let’s put it to work. Add this new ICU message to your English file:\u003C\u002Fp>\u003Cp>\u003Ccode>\u003Cstrong>public\u002Fassets\u002Fi18n\u002Fen.json\u003C\u002Fstrong>\u003C\u002Fcode>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"dashboard\": {\n    \"resultsPlural\": \"{count, plural, =0 {No invoices} one {# invoice} other {# invoices}}\"\n  },\n  \"invoice\": {\n    \"view\": {\n      \"itemsCount\": \"{count, plural, one {# item} other {# items}}\"\n    },\n    \"due\": {\n      \"relative\": \"{state, select, today {Due today} future {Due in {count, plural, one {# day} other {# days}}} past {Overdue by {count, plural, one {# day} other {# days}}}}\"\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"2-enable-pluralicu\">2. Enable plural_icu \u003Ca class=\"markdownit-header-anchor\" href=\"#2-enable-pluralicu\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Localazy supports several plural formats and needs to know \u003Cstrong>which one you are using\u003C\u002Fstrong>. By default, Localazy treats JSON keys as plain strings. To make it detect ICU plural patterns like:\u003C\u002Fp>\u003Cpre>\u003Ccode>{count, plural, one {...} other {...}}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You must enable the \u003Cstrong>\u003Ccode>plural_icu\u003C\u002Fcode>\u003C\u002Fstrong> feature in your \u003Ccode>localazy.json\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">{\n  \"upload\": {\n    ...\n    \"features\": [\"plural_icu\"]\n  }\n    ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"3-push-the-source-and-add-translations\">3. Push the source and add translations \u003Ca class=\"markdownit-header-anchor\" href=\"#3-push-the-source-and-add-translations\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Push your English source to Localazy:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">npx localazy upload -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>That seeds Localazy with \u003Ccode>public\u002Fassets\u002Fi18n\u002Fen.json\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>Now open your Localazy project, search for the \u003Cstrong>resultsPlural\u003C\u002Fstrong>, \u003Cstrong>itemsCount\u003C\u002Fstrong>, and \u003Cstrong>relative\u003C\u002Fstrong> and add the corresponding French strings:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-6.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1461\" height=\"722\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-6.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-6.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-6.png 1461w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Invoice plural.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-7.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1454\" height=\"790\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-7.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-7.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-7.png 1454w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Due days.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-8.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1454\" height=\"785\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-8.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-8.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-8.png 1454w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Invoice views' item plural.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Then pull the translation back:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy download -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You should now have fresh files like:\u003C\u002Fp>\u003Cpre>\u003Ccode>public\u002Fassets\u002Fi18n\u002Ffr.json\npublic\u002Fassets\u002Fi18n\u002Fqps.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"4-test-it\">4. Test it \u003Ca class=\"markdownit-header-anchor\" href=\"#4-test-it\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Now let’s fire up the app and make sure the \u003Cstrong>ICU plurals\u003C\u002Fstrong>, \u003Cstrong>relative due labels\u003C\u002Fstrong>, and all the \u003Cstrong>counts\u003C\u002Fstrong> behave as expected across screens. We’ll look for natural copy (“0\u002F1\u002FN invoices”), correct item counts on the Invoice View, and clean “Due today \u002F in # days \u002F # days ago” messages, so you should not see any awkward or clipped text.\u003C\u002Fp>\u003Cp>Drop this in \u003Ccode>src\u002Fapp\u002Ffeatures\u002Finvoice-view\u002Finvoice-view.html\u003C\u002Fcode> under the table, before “Notes + totals”:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-html\">&lt;!-- Items count (ICU plural) --&gt;\n&lt;div class=\"mt-3 text-sm text-gray-600\"&gt;\n  @if (invoice(); as inv) {\n    {{ 'invoice.view.itemsCount' | translate : { count: inv.items.length } }}\n  }\n&lt;\u002Fdiv&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Add a date helper plus two small methods to turn it into a readable label.\u003C\u002Fp>\u003Cp>Create the date util \u003Ccode>src\u002Fapp\u002Fcore\u002Futils\u002Fdate.ts\u003C\u002Fcode> and paste the code below:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export function daysDiffFromToday(isoDate: string): number {\n  const d = new Date(isoDate);\n  if (isNaN(d.getTime())) return 0;\n  const today = new Date();\n  \u002F\u002F compare at local midnight so timezones don’t skew the count\n  const start = new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime();\n  const end   = new Date(d.getFullYear(),     d.getMonth(),     d.getDate()).getTime();\n  const msPerDay = 24 * 60 * 60 * 1000;\n  return Math.round((end - start) \u002F msPerDay); \u002F\u002F &gt;0 future, 0 today, &lt;0 past\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Use it in the dashboard component \u003Ccode>\u003Cstrong>src\u002Fapp\u002Ffeatures\u002Fdashboard\u002Fdashboard.component.ts\u003C\u002Fstrong>\u003C\u002Fcode>.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { daysDiffFromToday } from '..\u002F..\u002Fcore\u002Futils\u002Fdate';\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Add inside the class:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">dueState(inv: Invoice): 'today' | 'future' | 'past' {\n  if (!inv.dueDate) return 'future'; \u002F\u002F missing dueDate = no warning\n  const d = daysDiffFromToday(inv.dueDate);\n  return d === 0 ? 'today' : d &gt; 0 ? 'future' : 'past';\n}\n\ndueCount(inv: Invoice): number {\n  if (!inv.dueDate) return 0;\n  return Math.abs(daysDiffFromToday(inv.dueDate));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Render the label in each row on \u003Cstrong>\u003Ccode>src\u002Fapp\u002Ffeatures\u002Fdashboard\u002Fdashboard.component.html\u003C\u002Fcode> \u003C\u002Fstrong>inside each list item, right under the top row’s \u003Ccode>&lt;div class=\"flex items-center gap-3\"&gt;…&lt;\u002Fdiv&gt;\u003C\u002Fcode>):\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-html\">&lt;div class=\"mt-1 text-xs text-gray-500\"&gt;\n  @if (inv.dueDate) {\n    {{ 'invoice.due.relative' | translate : { state: dueState(inv), count: dueCount(inv) } }}\n  }\n&lt;\u002Fdiv&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Restart the app and check the Dashboard. \u003C\u002Fp>\u003Cp>In our test, the total count reads naturally “Aucune facture \u002F 1 facture \u002F N factures” in French, or \"No Invoice \u002F 1 Invoice\u002F N Invoices\" in English. Each row should show a clear due label (“Échéance aujourd’hui \u002F dans # jour(s) \u002F en retard de # jour(s)”), and on the Invoice View, the items counter reflects the right plural (“# élément(s)”).\u003C\u002Fp>\u003Cp>An important point I want to mention is that you should be extremely careful when translating ICU plurals. I accidentally removed the \u003Cstrong>\u003Ccode>other\u003C\u002Fcode>\u003C\u002Fstrong> branch from the outer \u003Ccode>select\u003C\u002Fcode>. The build blew up with: \u003Cstrong>“No 'other' form found…”\u003C\u002Fstrong> from \u003Ccode>ngx-translate-messageformat-compiler\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-9.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1899\" height=\"384\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-9.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-9.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-9.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-9.png 1899w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>And my frontend shows this:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-10.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1862\" height=\"911\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-10.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-10.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-10.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-10.png 1862w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>The fix was \u003Cstrong>simply to add an \u003Ccode>other\u003C\u002Fcode> fallback (even empty)\u003C\u002Fstrong> and ensure braces are balanced.\u003C\u002Fp>\u003Ch2 id=\"faq\">？ FAQ \u003Ca class=\"markdownit-header-anchor\" href=\"#faq\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Ch3 id=\"how-do-i-switch-languages-at-runtime\">How do I switch languages at runtime? \u003Ca class=\"markdownit-header-anchor\" href=\"#how-do-i-switch-languages-at-runtime\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>We use \u003Ccode>ngx-translate\u003C\u002Fcode> with an HTTP loader and a tiny \u003Ccode>LanguageService\u003C\u002Fcode> that calls \u003Ccode>translate.use(lang)\u003C\u002Fcode> and persists the choice in \u003Ccode>localStorage\u003C\u002Fcode>. No rebuilds needed.\u003C\u002Fp>\u003Ch3 id=\"why-not-angular-built-in-i18n\">Why not Angular built-in i18n? \u003Ca class=\"markdownit-header-anchor\" href=\"#why-not-angular-built-in-i18n\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Angular i18n is great for compile-time translations, but it requires rebuilds. \u003Ccode>ngx-translate\u003C\u002Fcode> enables runtime language switching\u003Cstrong> \u003C\u002Fstrong>and works smoothly with the Localazy sync. Also, Angular built-in i18n uses XLF, and here we choose JSON + ngx-translate for runtime switching.\u003C\u002Fp>\u003Ch3 id=\"how-does-localazy-fit-in\">How does Localazy fit in? \u003Ca class=\"markdownit-header-anchor\" href=\"#how-does-localazy-fit-in\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Localazy manages source strings, machine\u002Fhuman translation, reviews, and pushes\u002Fpulls JSON via CLI. We upload \u003Ccode>en.json\u003C\u002Fcode>, translate \u003Cstrong>fr\u003C\u002Fstrong>, (optionally) add a pseudo-locale, and then download into \u003Ccode>public\u002Fassets\u002Fi18n\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch3 id=\"whats-the-pseudo-locale-qps-for\">What’s the \"pseudo-locale (qps)\" for? \u003Ca class=\"markdownit-header-anchor\" href=\"#whats-the-pseudo-locale-qps-for\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>It exaggerates text length and adds markers so you can spot clipped or untranslated strings. It's super helpful for stress tests without having to wait for real translations.\u003C\u002Fp>\u003Ch3 id=\"do-i-need-to-list-languages-in-localazyjson\">Do I need to list \"languages\": [...] in localazy.json? \u003Ca class=\"markdownit-header-anchor\" href=\"#do-i-need-to-list-languages-in-localazyjson\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>No. Omit it to download all available locales. Add it only if you want to limit downloads (e.g., \u003Ccode>[\"fr\",\"qps\"]\u003C\u002Fcode>) for predictable outputs.\u003C\u002Fp>\u003Ch3 id=\"how-do-icu-pluralsgender-work-here\">How do ICU plurals\u002Fgender work here? \u003Ca class=\"markdownit-header-anchor\" href=\"#how-do-icu-pluralsgender-work-here\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Enable the messageformat compiler and write ICU messages in your JSON (e.g., \u003Ccode>{count, plural, one {# item} other {# items}}\u003C\u002Fcode>). This keeps grammar natural across languages.\u003C\u002Fp>\u003Ch3 id=\"will-translations-work-offline-in-the-pwa\">Will translations work offline in the PWA? \u003Ca class=\"markdownit-header-anchor\" href=\"#will-translations-work-offline-in-the-pwa\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Yes. Production builds cache \u003Ccode>\u002Fassets\u002Fi18n\u002F*.json\u003C\u002Fcode> via Angular Service Worker, so language files remain available offline.\u003C\u002Fp>\u003Ch3 id=\"why-a-signal-based-store-instead-of-ngrx\">Why a signal-based store instead of NgRx? \u003Ca class=\"markdownit-header-anchor\" href=\"#why-a-signal-based-store-instead-of-ngrx\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Signals give you lightweight reactivity for CRUD, selectors, and local persistence without a boilerplate. You can always upgrade to NgRx if the app grows.\u003C\u002Fp>\u003Ch3 id=\"how-do-i-exportimport-data-safely\">How do I export\u002Fimport data safely? \u003Ca class=\"markdownit-header-anchor\" href=\"#how-do-i-exportimport-data-safely\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Use \u003Cstrong>Export JSON\u003C\u002Fstrong> for backups and \u003Cstrong>Import JSON\u003C\u002Fstrong> to replace\u002Fmerge (sanitized via serializers). \u003Cstrong>Export CSV\u003C\u002Fstrong> gives you invoices and line items for spreadsheets.\u003C\u002Fp>\u003Ch3 id=\"any-tailwind-gotchas-with-localization\">Any Tailwind 'gotchas' with localization? \u003Ca class=\"markdownit-header-anchor\" href=\"#any-tailwind-gotchas-with-localization\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Prefer fluid layouts (\u003Ccode>flex\u003C\u002Fcode>, \u003Ccode>grid\u003C\u002Fcode>, \u003Ccode>gap\u003C\u002Fcode>, \u003Ccode>min-w-0\u003C\u002Fcode>, \u003Ccode>break-words\u003C\u002Fcode>) and avoid hard width caps on labels\u002Fbuttons. Pseudo-locale is your friend for catching overflow early.\u003C\u002Fp>\u003Ch3 id=\"can-i-deploy-under-a-sub-path-eg-invoice-pwa\">Can I deploy under a sub-path (e.g., \u002Finvoice-pwa\u002F)? \u003Ca class=\"markdownit-header-anchor\" href=\"#can-i-deploy-under-a-sub-path-eg-invoice-pwa\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Yes. The \u003Cstrong>\u003Ccode>HttpLoaderFactory\u003C\u002Fcode>\u003C\u002Fstrong> (for \u003Ccode>@ngx-translate\u002Fhttp-loader\u003C\u002Fcode>) uses \u003Ccode>document.baseURI\u003C\u002Fcode>, so translation files resolve correctly when your app is served under a \u003Ccode>&lt;base href=\"\u002Fsubpath\u002F\"&gt;\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"more-resources\">📚 More resources \u003Ca class=\"markdownit-header-anchor\" href=\"#more-resources\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>This marks the end of our tutorial. If you haven't read the previous articles, check out \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-foundations\">the first part\u003C\u002Fa>, where we built a minimal Angular app, wired runtime i18n with \u003Cstrong>ngx-translate \u003C\u002Fstrong>and\u003Cstrong> \u003C\u002Fstrong>added Tailwind styling; and \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-app-logic\">the second installment\u003C\u002Fa>, where we  set up the app logic before translating. \u003C\u002Fp>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-grey\">\u003Cdiv class=\"kg-callout-emoji\">👉\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cstrong>Code for the complete tutorial on GitHub\u003C\u002Fstrong>: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGunkev\u002Finvoice-pwa\">https:\u002F\u002Fgithub.com\u002FGunkev\u002Finvoice-pwa\u003C\u002Fa>.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>I also recommend checking out the references below:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fangular.dev\u002Fguide\u002Fcomponents\">Anatomy of a component\u003C\u002Fa> \u003C\u002Fstrong>(angular.dev)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fangular.dev\u002Fguide\u002Frouting\">\u003Cstrong>Routing\u003C\u002Fstrong>\u003C\u002Fa> (angular.dev)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fv17.angular.io\u002Fguide\u002Fservice-worker-intro\">\u003Cstrong>Service worker intro\u003C\u002Fstrong>\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fangular.dev\u002Fapi\u002Fservice-worker\u002FprovideServiceWorker\">\u003Cstrong>provideServiceWorker\u003C\u002Fstrong>\u003C\u002Fa> (angular.dev)\u003C\u002Fli>\u003Cli>\u003Cstrong>ngx-translate library\u003C\u002Fstrong>: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fngx-translate\u002Fcore\u002F\">core\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fngx-translate\u002Fhttp-loader\">http loader\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flephyrus\u002Fngx-translate-messageformat-compiler\">message format compiler\u003C\u002Fa> (Github)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Ftailwindcss.com\u002Fdocs\u002Finstallation\u002Fusing-vite\">\u003Cstrong>Starter installation guide\u003C\u002Fstrong>\u003C\u002Fa> (Tailwind CSS)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fintegrations\u002Fangular\u002F\">\u003Cstrong>I\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fintegrations\u002Fangular\u002F\">ntegrations: Angular\u003C\u002Fa> \u003C\u002Fstrong>(Localazy)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Flocalize-angular-app-i18n-l10n-localazy?srsltid=AfmBOoohLpBJIwXRAW4h5N3_e6cnSnBDqrycc26W_f8hdU91nOuygfjF\">\u003Cstrong>How to localize an Angular app with angular-i18n and Localazy\u003C\u002Fstrong>\u003C\u002Fa> (Localazy)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Happy coding! ✌️\u003C\u002Fp>","Guide to translating Angular apps with ngx-translate, #3","Learn how to manage translations, add a pseudo-locale for QA testing, and enable ICU plurals to handle smarter, context-aware messages.",{"id":365,"status":5,"created_on":1946,"modified_on":1947,"icon":1948,"header":1949,"description":1950,"button_label":1951,"link":1952},"2025-04-22T13:11:52.000Z","2025-04-22T13:55:18.000Z","app","Explore our developer hub 🧑‍💻","Got questions? Find quick answers in our Developer Portal, a space built for you with easy access to repositories, documentation, SDKs, and more.","Take me there","\u002Fdeveloper-portal",{"slug":1860,"id":1853,"uuid":1954,"title":1859,"html":1955,"comment_id":1853,"feature_image":1863,"featured":162,"visibility":1956,"email_recipient_filter":1957,"created_at":1958,"updated_at":1861,"published_at":1862,"custom_excerpt":1941,"codeinjection_head":10,"codeinjection_foot":10,"custom_template":10,"canonical_url":10,"authors":1959,"tags":1965,"primary_author":2010,"primary_tag":2011,"url":2012,"excerpt":1941,"reading_time":61,"access":162,"send_email_when_published":160,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":1943,"meta_description":1944,"email_subject":10,"frontmatter":10,"dictionary":1872,"cta":1945,"plainTags":1864},"ca0a4c33-78de-4bad-b6da-5ce1a6162405","\u003Cp>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-app-logic\">We have built\u003C\u002Fa> a complete invoice dashboard: functional, sleek, and ready. Now, let’s teach it how to speak.\u003C\u002Fp>\u003Cp>In this third and final part of the series, \u003Cstrong>you will connect your Angular app to Localazy\u003C\u002Fstrong>, upload your base English translations, and pull in additional languages like French. You’ll also add a pseudo-locale to \u003Cstrong>visually test missing or truncated text\u003C\u002Fstrong>, and use ICU messages to \u003Cstrong>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fpluralization-in-software-localization-beginners-guide\u002F\">handle plurals\u003C\u002Fa> and gender variations \u003C\u002Fstrong>seamlessly.\u003C\u002Fp>\u003Cp>By the end of this guide, your app won’t just be multilingual but it will also be localization-ready, QA-proof, and production-strong.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%A7%A9-integrate-localazy-into-your-angular-project\">🧩 Integrate Localazy into your Angular project\u003C\u002Fh2>\u003Cp>Now that runtime i18n is working and your JSON files live in \u003Ccode>public\u002Fassets\u002Fi18n\u003C\u002Fcode>, it’s time to connect your Angular app to Localazy so translations can sync automatically without endless copy-paste.\u003C\u002Fp>\u003Ch3 id=\"1-install-the-cli-locally\">1. Install the CLI locally\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-bash\">npm i -D @localazy\u002Fcli\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"2-get-your-project-keys\">2. Get your project keys\u003C\u002Fh3>\u003Cp>Log into your Localazy account and open the \u003Cstrong>Integration overview &gt; Angular\u003C\u002Fstrong> section to grab your keys.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-1.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1895\" height=\"957\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-1.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-1.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-1.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-1.png 1895w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>On the next screen, you’ll see your Write key and Read key. \u003Cstrong>Copy both or save them\u003C\u002Fstrong>, as you’ll paste them into the Localazy config in the next step.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-2.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1888\" height=\"953\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-2.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-2.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-2.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-2.png 1888w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Ch3 id=\"3-set-up-the-localazy-integration\">3. Set up the Localazy integration\u003C\u002Fh3>\u003Cp>You’ve got your keys — now let’s tell Localazy where your Angular i18n files live and how to sync them. \u003Cbr>\u003Cbr>Create \u003Ccode>localazy.json\u003C\u002Fcode> (project root):\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"project\": \"invoice-pwa\",\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": [\n      { \"path\": \"public\u002Fassets\u002Fi18n\u002Fen.json\", \"lang\": \"en\", \"tags\": [\"app\"] }\n    ]\n  },\n  \"download\": {\n    \"files\": [\n      { \"path\": \"public\u002Fassets\u002Fi18n\u002F${lang}.json\" }\n    ]\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This minimal integration pushes \u003Cstrong>English\u003C\u002Fstrong> and pulls \u003Cstrong>French\u003C\u002Fstrong> right back into \u003Ccode>public\u002Fassets\u002Fi18n\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch3 id=\"4-keep-your-api-keys-out-of-git\">4. Keep your API keys out of Git\u003C\u002Fh3>\u003Cp>Create a tiny keys file you \u003Cstrong>do not commit\u003C\u002Fstrong>:\u003C\u002Fp>\u003Cp>\u003Cstrong>\u003Ccode>localazy.keys.json\u003C\u002Fcode> (root)\u003C\u002Fstrong>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{ \"writeKey\": \"YOUR_WRITE_KEY\", \"readKey\": \"YOUR_READ_KEY\" }\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Add to \u003Ccode>.gitignore\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode>localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You’ll use \u003Cstrong>Write Key\u003C\u002Fstrong> for uploads and \u003Cstrong>Read Key\u003C\u002Fstrong> for downloads.\u003C\u002Fp>\u003Ch3 id=\"5-upload-en-and-download\">5. Upload EN and download\u003C\u002Fh3>\u003Cp>Run this command from the project root to push your English source strings to the Localazy platform:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy upload -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You’ll see your project with \u003Cstrong>English\u003C\u002Fstrong> source strings in the dashboard as seen below. From there, simply \u003Cstrong>add French\u003C\u002Fstrong> as a second language. This will be your first target locale.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-14.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1889\" height=\"953\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-14.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-14.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-14.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-14.png 1889w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Translating is easy: just click the \u003Cstrong>Translate\u003C\u002Fstrong> action in the interface to auto-translate everything in one go. You'll need to select a translation provider. Localazy currently offers:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fa-practical-guide-to-translating-with-localazy-ai\u002F\">Localazy AI\u003C\u002Fa>\u003C\u002Fstrong>\u003C\u002Fli>\u003Cli>\u003Cstrong>Google Translate\u003C\u002Fstrong>\u003C\u002Fli>\u003Cli>\u003Cstrong>DeepL\u003C\u002Fstrong>\u003C\u002Fli>\u003Cli>\u003Cstrong>Amazon Translate\u003C\u002Fstrong>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-12.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1911\" height=\"959\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-12.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-12.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-12.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-12.png 1911w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>In a moment, you'll be able to see your translated strings:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-13.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1892\" height=\"960\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-13.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-13.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-13.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-13.png 1892w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-15.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1887\" height=\"943\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-15.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-15.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-15.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-15.png 1887w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Once the translation is done, you can open the \u003Cstrong>Review\u003C\u002Fstrong> tab to go through each string and make quick edits if needed before approving them for production.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-16.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1897\" height=\"973\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-16.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-16.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-16.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-16.png 1897w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>With Localazy, you can directly upload and download your source strings to the platform from the \u003Cstrong>File management\u003C\u002Fstrong> section:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-17.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1883\" height=\"893\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-17.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-17.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-17.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-17.png 1883w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Once FR has content, download it:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy download -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Note that this will overide the manual strings you inserted in the first part of this tutorial. \u003C\u002Fp>\u003Cp>You should now have this:\u003C\u002Fp>\u003Cpre>\u003Ccode>public\u002Fassets\u002Fi18n\u002Ffr.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Verify in your Angular app. Start the dev server:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npm start\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now toggle the \u003Cstrong>EN\u002FFR button\u003C\u002Fstrong> in your app. You should see the fresh strings from \u003Ccode>fr.json\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"%E2%9B%93%EF%B8%8F%E2%80%8D%F0%9F%92%A5-test-using-a-pseudo-locale\">⛓️‍💥 Test using a pseudo-locale\u003C\u002Fh2>\u003Cp>When localizing apps, engineers often struggle to spot missing or broken translations early. Localazy solves this with a \u003Cstrong>pseudo-locale (\u003Ccode>qps\u003C\u002Fcode>)\u003C\u002Fstrong>, which automatically lengthens text and adds markers to highlight untranslated or clipped strings.\u003C\u002Fp>\u003Cp>By mapping it in your config, you can quickly switch to “qps mode” in Angular and visually test layouts before going live, a simple best practice that keeps your localization clean and reliable.\u003C\u002Fp>\u003Ch3 id=\"1-select-your-custom-locale\">1. Select your custom locale\u003C\u002Fh3>\u003Cp>In the language picker, search for \u003Cstrong>Custom locale\u003C\u002Fstrong> and choose \u003Cstrong>Custom Locale (xxc)\u003C\u002Fstrong>:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-3.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1907\" height=\"961\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-3.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-3.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-3.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-3.png 1907w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>Then select the language:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-4.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1905\" height=\"960\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-4.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-4.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-4.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-4.png 1905w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Ch3 id=\"2-seed-and-map-it\">2. Seed and map it\u003C\u002Fh3>\u003Cp>Now that you have added the custom locale, seed it by copying the English strings into it for testing (since Localazy won’t download an empty language):\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-5.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1577\" height=\"962\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-5.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-5.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-5.png 1577w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>To test your translations visually using a pseudo-locale, make the mapping explicit in your configuration:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">{\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": [\n      { \"pattern\": \"public\u002Fassets\u002Fi18n\u002Fen.json\", \"lang\": \"en\", \"path\": \"public\u002Fassets\u002Fi18n\" }\n    ]\n  },\n  \"download\": {\n    \"files\": [\n      { \"output\": \"${path}\u002F${lang}.json\" }\n    ],\n    \"langAliases\": {\n      \"xxc\": \"qps\" \u002F\u002F map Localazy's pseudo code to your local \"qps\"\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"3-add-it-to-your-project\">3. Add it to your project\u003C\u002Fh3>\u003Cp>Run this command to download the custom locale to your project:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">npx localazy download -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You should now have:\u003C\u002Fp>\u003Cpre>\u003Ccode>public\u002Fassets\u002Fi18n\u002Fqps.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This writes \u003Ccode>public\u002Fassets\u002Fi18n\u002Fqps.json\u003C\u002Fcode> thanks to \u003Ccode>langAliases\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>Now, allow it in the language service. First, widen your accepted languages so \u003Ccode>qps\u003C\u002Fcode> is treated like any other locale in \u003Ccode>src\u002Fapp\u002Fcore\u002Flanguage.service.ts\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">type Lang = 'en' | 'fr' | 'qps';          \nprivate readonly supported: Lang[] = ['en', 'fr', 'qps'];\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then expose it to the app shell so the header can switch to \u003Ccode>qps\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>\u003Cstrong>Also update it in \u003Ccode>app.ts\u003C\u002Fcode>:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-jsx\">import { Component, signal } from '@angular\u002Fcore';\nimport { RouterOutlet } from '@angular\u002Frouter';\nimport { LanguageService } from '.\u002Fcore\u002Flanguage.service';\n\n...\n\nexport class App {\n \n ...\n\n  \u002F\u002F Public API for the template\n  setLang(code: 'en' | 'fr' | 'qps') \n    this.lang.use(code);\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Finally, add a tiny “QA” toggle in the header:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-html\">&lt;button type=\"button\" class=\"btn-secondary\" (click)=\"setLang('qps')\"&gt;QA&lt;\u002Fbutton&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"4-test-it\">4. Test it\u003C\u002Fh3>\u003Cp>To test your pseudo-locale visually, open your \u003Cstrong>Localazy dashboard\u003C\u002Fstrong>, pick the custom locale you created (\u003Ccode>xxc\u003C\u002Fcode> → \u003Ccode>qps\u003C\u002Fcode>), and edit one of the strings; for example, change \u003Cstrong>“Install app”\u003C\u002Fstrong> to something playful or slightly distorted like \u003Cstrong>“Ĭńşţāĺľ āƥƥ [QA]\" and download\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cp>When you run your app, this will make it easy to spot pseudo-localized text in the UI, stretched, accented, or bracketed. \u003Cstrong>It helps you quickly identify layout issues, missing translations, or clipped text\u003C\u002Fstrong> that might not be obvious with regular English or French.\u003C\u002Fp>\u003Cp>Another example on the usefulness of this method is German translations, which are usually longer and might stretch or distort your UI. Instead of waiting for actual translations, you can spot problems like overflowing text or clipped buttons by switching to a pseudo-locale such as \u003Ccode>qps\u003C\u002Fcode>. It automatically adds accents, brackets, or longer versions of your English text, helping developers and designers ensure that every label, form, and button stays readable and responsive across all languages.\u003C\u002Fp>\u003Cp>When it's time to test the content, just run \u003Ccode>npm start\u003C\u002Fcode>, switch between \u003Cstrong>EN \u002F FR \u002F QA\u003C\u002Fstrong>, and make sure the \u003Cstrong>QA\u003C\u002Fstrong> text looks weird (accents\u002Fbrackets) to confirm that pseudo-locale is working. \u003C\u002Fp>\u003Cp>Your next move is to enable \u003Cstrong>ICU syntax\u003C\u002Fstrong> so your app can handle real-world plural and gender cases cleanly with \u003Ccode>ngx-translate\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%91%AD-icu-for-plural-and-gender-support\">👭 ICU for plural and gender support\u003C\u002Fh2>\u003Cp>With a tiny tweak to your Angular config, \u003Ccode>ngx-translate\u003C\u002Fcode> will be able to understand \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Ficu\">ICU syntax\u003C\u002Fa>, so instead of awkward “1 items” or “0 invoice,” \u003Cstrong>your app will speak like a real person\u003C\u002Fstrong>. After this change, your JSON files will handle smart plural and gender rules automatically with no extra logic needed. Let's see how.\u003C\u002Fp>\u003Ch3 id=\"1-add-imports\">1. Add imports\u003C\u002Fh3>\u003Cp>Add these imports at the top of \u003Ccode>\u003Cstrong>src\u002Fapp\u002Fapp.config.ts\u003C\u002Fstrong>\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { TranslateCompiler } from '@ngx-translate\u002Fcore';\nimport { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';\n\n\u002F\u002F Then, in your providers array, drop this in (keep everything else as-is):\n{ provide: TranslateCompiler, useClass: TranslateMessageFormatCompiler },\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now your translations can do smart things like this:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"itemsCount\": \"{count, plural, =0 {No items} one {# item} other {# items}}\"\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Let’s put it to work. Add this new ICU message to your English file:\u003C\u002Fp>\u003Cp>\u003Ccode>\u003Cstrong>public\u002Fassets\u002Fi18n\u002Fen.json\u003C\u002Fstrong>\u003C\u002Fcode>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"dashboard\": {\n    \"resultsPlural\": \"{count, plural, =0 {No invoices} one {# invoice} other {# invoices}}\"\n  },\n  \"invoice\": {\n    \"view\": {\n      \"itemsCount\": \"{count, plural, one {# item} other {# items}}\"\n    },\n    \"due\": {\n      \"relative\": \"{state, select, today {Due today} future {Due in {count, plural, one {# day} other {# days}}} past {Overdue by {count, plural, one {# day} other {# days}}}}\"\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"2-enable-pluralicu\">2. Enable plural_icu\u003C\u002Fh3>\u003Cp>Localazy supports several plural formats and needs to know \u003Cstrong>which one you are using\u003C\u002Fstrong>. By default, Localazy treats JSON keys as plain strings. To make it detect ICU plural patterns like:\u003C\u002Fp>\u003Cpre>\u003Ccode>{count, plural, one {...} other {...}}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You must enable the \u003Cstrong>\u003Ccode>plural_icu\u003C\u002Fcode>\u003C\u002Fstrong> feature in your \u003Ccode>localazy.json\u003C\u002Fcode>:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">{\n  \"upload\": {\n    ...\n    \"features\": [\"plural_icu\"]\n  }\n    ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"3-push-the-source-and-add-translations\">3. Push the source and add translations\u003C\u002Fh3>\u003Cp>Push your English source to Localazy:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">npx localazy upload -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>That seeds Localazy with \u003Ccode>public\u002Fassets\u002Fi18n\u002Fen.json\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>Now open your Localazy project, search for the \u003Cstrong>resultsPlural\u003C\u002Fstrong>, \u003Cstrong>itemsCount\u003C\u002Fstrong>, and \u003Cstrong>relative\u003C\u002Fstrong> and add the corresponding French strings:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-6.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1461\" height=\"722\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-6.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-6.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-6.png 1461w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Invoice plural.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-7.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1454\" height=\"790\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-7.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-7.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-7.png 1454w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Due days.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-8.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1454\" height=\"785\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-8.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-8.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-8.png 1454w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Invoice views' item plural.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Then pull the translation back:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy download -k localazy.keys.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>You should now have fresh files like:\u003C\u002Fp>\u003Cpre>\u003Ccode>public\u002Fassets\u002Fi18n\u002Ffr.json\npublic\u002Fassets\u002Fi18n\u002Fqps.json\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"4-test-it-1\">4. Test it\u003C\u002Fh3>\u003Cp>Now let’s fire up the app and make sure the \u003Cstrong>ICU plurals\u003C\u002Fstrong>, \u003Cstrong>relative due labels\u003C\u002Fstrong>, and all the \u003Cstrong>counts\u003C\u002Fstrong> behave as expected across screens. We’ll look for natural copy (“0\u002F1\u002FN invoices”), correct item counts on the Invoice View, and clean “Due today \u002F in # days \u002F # days ago” messages, so you should not see any awkward or clipped text.\u003C\u002Fp>\u003Cp>Drop this in \u003Ccode>src\u002Fapp\u002Ffeatures\u002Finvoice-view\u002Finvoice-view.html\u003C\u002Fcode> under the table, before “Notes + totals”:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-html\">&lt;!-- Items count (ICU plural) --&gt;\n&lt;div class=\"mt-3 text-sm text-gray-600\"&gt;\n  @if (invoice(); as inv) {\n    {{ 'invoice.view.itemsCount' | translate : { count: inv.items.length } }}\n  }\n&lt;\u002Fdiv&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Add a date helper plus two small methods to turn it into a readable label.\u003C\u002Fp>\u003Cp>Create the date util \u003Ccode>src\u002Fapp\u002Fcore\u002Futils\u002Fdate.ts\u003C\u002Fcode> and paste the code below:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">export function daysDiffFromToday(isoDate: string): number {\n  const d = new Date(isoDate);\n  if (isNaN(d.getTime())) return 0;\n  const today = new Date();\n  \u002F\u002F compare at local midnight so timezones don’t skew the count\n  const start = new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime();\n  const end   = new Date(d.getFullYear(),     d.getMonth(),     d.getDate()).getTime();\n  const msPerDay = 24 * 60 * 60 * 1000;\n  return Math.round((end - start) \u002F msPerDay); \u002F\u002F &gt;0 future, 0 today, &lt;0 past\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Use it in the dashboard component \u003Ccode>\u003Cstrong>src\u002Fapp\u002Ffeatures\u002Fdashboard\u002Fdashboard.component.ts\u003C\u002Fstrong>\u003C\u002Fcode>.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">import { daysDiffFromToday } from '..\u002F..\u002Fcore\u002Futils\u002Fdate';\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Add inside the class:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-tsx\">dueState(inv: Invoice): 'today' | 'future' | 'past' {\n  if (!inv.dueDate) return 'future'; \u002F\u002F missing dueDate = no warning\n  const d = daysDiffFromToday(inv.dueDate);\n  return d === 0 ? 'today' : d &gt; 0 ? 'future' : 'past';\n}\n\ndueCount(inv: Invoice): number {\n  if (!inv.dueDate) return 0;\n  return Math.abs(daysDiffFromToday(inv.dueDate));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Render the label in each row on \u003Cstrong>\u003Ccode>src\u002Fapp\u002Ffeatures\u002Fdashboard\u002Fdashboard.component.html\u003C\u002Fcode> \u003C\u002Fstrong>inside each list item, right under the top row’s \u003Ccode>&lt;div class=\"flex items-center gap-3\"&gt;…&lt;\u002Fdiv&gt;\u003C\u002Fcode>):\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-html\">&lt;div class=\"mt-1 text-xs text-gray-500\"&gt;\n  @if (inv.dueDate) {\n    {{ 'invoice.due.relative' | translate : { state: dueState(inv), count: dueCount(inv) } }}\n  }\n&lt;\u002Fdiv&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Restart the app and check the Dashboard. \u003C\u002Fp>\u003Cp>In our test, the total count reads naturally “Aucune facture \u002F 1 facture \u002F N factures” in French, or \"No Invoice \u002F 1 Invoice\u002F N Invoices\" in English. Each row should show a clear due label (“Échéance aujourd’hui \u002F dans # jour(s) \u002F en retard de # jour(s)”), and on the Invoice View, the items counter reflects the right plural (“# élément(s)”).\u003C\u002Fp>\u003Cp>An important point I want to mention is that you should be extremely careful when translating ICU plurals. I accidentally removed the \u003Cstrong>\u003Ccode>other\u003C\u002Fcode>\u003C\u002Fstrong> branch from the outer \u003Ccode>select\u003C\u002Fcode>. The build blew up with: \u003Cstrong>“No 'other' form found…”\u003C\u002Fstrong> from \u003Ccode>ngx-translate-messageformat-compiler\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-9.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1899\" height=\"384\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-9.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-9.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-9.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-9.png 1899w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>And my frontend shows this:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-10.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1862\" height=\"911\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F11\u002Fimage-10.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F11\u002Fimage-10.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2025\u002F11\u002Fimage-10.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002Fimage-10.png 1862w\" sizes=\"(min-width: 720px) 720px\">\u003C\u002Ffigure>\u003Cp>The fix was \u003Cstrong>simply to add an \u003Ccode>other\u003C\u002Fcode> fallback (even empty)\u003C\u002Fstrong> and ensure braces are balanced.\u003C\u002Fp>\u003Ch2 id=\"%EF%BC%9F-faq\">？ FAQ\u003C\u002Fh2>\u003Ch3 id=\"how-do-i-switch-languages-at-runtime\">How do I switch languages at runtime?\u003C\u002Fh3>\u003Cp>We use \u003Ccode>ngx-translate\u003C\u002Fcode> with an HTTP loader and a tiny \u003Ccode>LanguageService\u003C\u002Fcode> that calls \u003Ccode>translate.use(lang)\u003C\u002Fcode> and persists the choice in \u003Ccode>localStorage\u003C\u002Fcode>. No rebuilds needed.\u003C\u002Fp>\u003Ch3 id=\"why-not-angular-built-in-i18n\">Why not Angular built-in i18n?\u003C\u002Fh3>\u003Cp>Angular i18n is great for compile-time translations, but it requires rebuilds. \u003Ccode>ngx-translate\u003C\u002Fcode> enables runtime language switching\u003Cstrong> \u003C\u002Fstrong>and works smoothly with the Localazy sync. Also, Angular built-in i18n uses XLF, and here we choose JSON + ngx-translate for runtime switching.\u003C\u002Fp>\u003Ch3 id=\"how-does-localazy-fit-in\">How does Localazy fit in?\u003C\u002Fh3>\u003Cp>Localazy manages source strings, machine\u002Fhuman translation, reviews, and pushes\u002Fpulls JSON via CLI. We upload \u003Ccode>en.json\u003C\u002Fcode>, translate \u003Cstrong>fr\u003C\u002Fstrong>, (optionally) add a pseudo-locale, and then download into \u003Ccode>public\u002Fassets\u002Fi18n\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch3 id=\"what%E2%80%99s-the-pseudo-locale-qps-for\">What’s the \"pseudo-locale (qps)\" for?\u003C\u002Fh3>\u003Cp>It exaggerates text length and adds markers so you can spot clipped or untranslated strings. It's super helpful for stress tests without having to wait for real translations.\u003C\u002Fp>\u003Ch3 id=\"do-i-need-to-list-languages-in-localazyjson\">Do I need to list \"languages\": [...] in localazy.json?\u003C\u002Fh3>\u003Cp>No. Omit it to download all available locales. Add it only if you want to limit downloads (e.g., \u003Ccode>[\"fr\",\"qps\"]\u003C\u002Fcode>) for predictable outputs.\u003C\u002Fp>\u003Ch3 id=\"how-do-icu-pluralsgender-work-here\">How do ICU plurals\u002Fgender work here?\u003C\u002Fh3>\u003Cp>Enable the messageformat compiler and write ICU messages in your JSON (e.g., \u003Ccode>{count, plural, one {# item} other {# items}}\u003C\u002Fcode>). This keeps grammar natural across languages.\u003C\u002Fp>\u003Ch3 id=\"will-translations-work-offline-in-the-pwa\">Will translations work offline in the PWA?\u003C\u002Fh3>\u003Cp>Yes. Production builds cache \u003Ccode>\u002Fassets\u002Fi18n\u002F*.json\u003C\u002Fcode> via Angular Service Worker, so language files remain available offline.\u003C\u002Fp>\u003Ch3 id=\"why-a-signal-based-store-instead-of-ngrx\">Why a signal-based store instead of NgRx?\u003C\u002Fh3>\u003Cp>Signals give you lightweight reactivity for CRUD, selectors, and local persistence without a boilerplate. You can always upgrade to NgRx if the app grows.\u003C\u002Fp>\u003Ch3 id=\"how-do-i-exportimport-data-safely\">How do I export\u002Fimport data safely?\u003C\u002Fh3>\u003Cp>Use \u003Cstrong>Export JSON\u003C\u002Fstrong> for backups and \u003Cstrong>Import JSON\u003C\u002Fstrong> to replace\u002Fmerge (sanitized via serializers). \u003Cstrong>Export CSV\u003C\u002Fstrong> gives you invoices and line items for spreadsheets.\u003C\u002Fp>\u003Ch3 id=\"any-tailwind-gotchas-with-localization\">Any Tailwind 'gotchas' with localization?\u003C\u002Fh3>\u003Cp>Prefer fluid layouts (\u003Ccode>flex\u003C\u002Fcode>, \u003Ccode>grid\u003C\u002Fcode>, \u003Ccode>gap\u003C\u002Fcode>, \u003Ccode>min-w-0\u003C\u002Fcode>, \u003Ccode>break-words\u003C\u002Fcode>) and avoid hard width caps on labels\u002Fbuttons. Pseudo-locale is your friend for catching overflow early.\u003C\u002Fp>\u003Ch3 id=\"can-i-deploy-under-a-sub-path-eg-invoice-pwa\">Can I deploy under a sub-path (e.g., \u002Finvoice-pwa\u002F)?\u003C\u002Fh3>\u003Cp>Yes. The \u003Cstrong>\u003Ccode>HttpLoaderFactory\u003C\u002Fcode>\u003C\u002Fstrong> (for \u003Ccode>@ngx-translate\u002Fhttp-loader\u003C\u002Fcode>) uses \u003Ccode>document.baseURI\u003C\u002Fcode>, so translation files resolve correctly when your app is served under a \u003Ccode>&lt;base href=\"\u002Fsubpath\u002F\"&gt;\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%93%9A-more-resources\">📚 More resources\u003C\u002Fh2>\u003Cp>This marks the end of our tutorial. If you haven't read the previous articles, check out \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-foundations\">the first part\u003C\u002Fa>, where we built a minimal Angular app, wired runtime i18n with \u003Cstrong>ngx-translate \u003C\u002Fstrong>and\u003Cstrong> \u003C\u002Fstrong>added Tailwind styling; and \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Fguide-to-translate-angular-apps-with-ngx-translate-app-logic\">the second installment\u003C\u002Fa>, where we  set up the app logic before translating. \u003C\u002Fp>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-grey\">\u003Cdiv class=\"kg-callout-emoji\">👉\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cstrong>Code for the complete tutorial on GitHub\u003C\u002Fstrong>: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGunkev\u002Finvoice-pwa\">https:\u002F\u002Fgithub.com\u002FGunkev\u002Finvoice-pwa\u003C\u002Fa>.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>I also recommend checking out the references below:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fangular.dev\u002Fguide\u002Fcomponents\">Anatomy of a component\u003C\u002Fa> \u003C\u002Fstrong>(angular.dev)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fangular.dev\u002Fguide\u002Frouting\">\u003Cstrong>Routing\u003C\u002Fstrong>\u003C\u002Fa> (angular.dev)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fv17.angular.io\u002Fguide\u002Fservice-worker-intro\">\u003Cstrong>Service worker intro\u003C\u002Fstrong>\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fangular.dev\u002Fapi\u002Fservice-worker\u002FprovideServiceWorker\">\u003Cstrong>provideServiceWorker\u003C\u002Fstrong>\u003C\u002Fa> (angular.dev)\u003C\u002Fli>\u003Cli>\u003Cstrong>ngx-translate library\u003C\u002Fstrong>: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fngx-translate\u002Fcore\u002F\">core\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fngx-translate\u002Fhttp-loader\">http loader\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flephyrus\u002Fngx-translate-messageformat-compiler\">message format compiler\u003C\u002Fa> (Github)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Ftailwindcss.com\u002Fdocs\u002Finstallation\u002Fusing-vite\">\u003Cstrong>Starter installation guide\u003C\u002Fstrong>\u003C\u002Fa> (Tailwind CSS)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fintegrations\u002Fangular\u002F\">\u003Cstrong>I\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fintegrations\u002Fangular\u002F\">ntegrations: Angular\u003C\u002Fa> \u003C\u002Fstrong>(Localazy)\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fblog\u002Flocalize-angular-app-i18n-l10n-localazy?srsltid=AfmBOoohLpBJIwXRAW4h5N3_e6cnSnBDqrycc26W_f8hdU91nOuygfjF\">\u003Cstrong>How to localize an Angular app with angular-i18n and Localazy\u003C\u002Fstrong>\u003C\u002Fa> (Localazy)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Happy coding! ✌️\u003C\u002Fp>","public","none","2025-11-07T22:04:37.000+01:00",[1960],{"id":1855,"name":1856,"slug":1857,"profile_image":1858,"cover_image":10,"bio":1961,"website":1962,"location":1963,"facebook":10,"twitter":10,"meta_title":10,"meta_description":10,"url":1964},"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",[1966,1969,1972,1975,1980,1985,1990,1995,2000,2005],{"id":1967,"name":1866,"slug":1866,"description":10,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1968},"60f567ab6f8ebe0001bd80ec","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fi18n\u002F",{"id":1970,"name":621,"slug":620,"description":621,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1971},"60a37fc7cf7b6a0001d1f10b","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fangular\u002F",{"id":1973,"name":1870,"slug":1871,"description":10,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1974},"6556628a0470910001941ffe","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Ftutorial\u002F",{"id":1976,"name":1977,"slug":1978,"description":1878,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1979},"67f7fb3563350c0001d58fee","[DICT] ICU Message Format","term-255","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-255\u002F",{"id":1981,"name":1982,"slug":1983,"description":1898,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1984},"69147f7163350c0001d61910","[DICT] ngx-translate","term-426","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-426\u002F",{"id":1986,"name":1987,"slug":1988,"description":1914,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1989},"60a37fc7cf7b6a0001d1f162","[DICT] Angular","term-69","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-69\u002F",{"id":1991,"name":1992,"slug":1993,"description":1922,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1994},"691481ba63350c0001d61925","[DICT] Pseudo-locale","term-428","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-428\u002F",{"id":1996,"name":1997,"slug":1998,"description":10,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1999},"60fffb486f8ebe0001bd8ddd","[COMSHARE]","comshare","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fcomshare\u002F",{"id":2001,"name":2002,"slug":2003,"description":10,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2004},"62f35ef7fe956a0001089272","[AD] Zapier","ad-6","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fad-6\u002F",{"id":2006,"name":2007,"slug":2008,"description":1950,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2009},"6807959863350c0001d59590","[CTA] Explore our developer hub","cta-45","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fcta-45\u002F",{"id":1855,"name":1856,"slug":1857,"profile_image":1858,"cover_image":10,"bio":1961,"website":1962,"location":1963,"facebook":10,"twitter":10,"meta_title":10,"meta_description":10,"url":1964},{"id":1967,"name":1866,"slug":1866,"description":10,"feature_image":10,"visibility":1956,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":1968},"https:\u002F\u002Fghost.localazy.com\u002Fguide-to-translate-angular-apps-with-ngx-translate-i18n\u002F",[2014,2030,2053],{"id":2015,"owner":2016,"created_by":10,"sort":10,"title":2017,"slug":2018,"modified_on":877,"created_on":2019,"pinned":160,"badge":10,"priority":1824,"main_image":2020,"status":5,"tags":2021,"dictionary":2029,"reading_time":1835,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"60a37fc7cf7b6a0001d1f1d1",{"id":1817,"first_name":1818,"last_name":877,"slug":1819,"avatar":1820},"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",[2022,2024,2027,2028],{"id":451,"created_on":1828,"status":5,"label":11,"slug":2023,"on_index_page":160},"localazy",{"id":451,"created_on":1828,"status":5,"label":2025,"slug":2026,"on_index_page":160},"Tip","tip",{"id":451,"created_on":1828,"status":5,"label":352,"slug":1833,"on_index_page":162},{"id":451,"created_on":1828,"status":5,"label":1866,"slug":1866,"on_index_page":162},[],{"id":2031,"owner":2032,"created_by":10,"sort":10,"title":2037,"slug":2038,"modified_on":877,"created_on":2039,"pinned":160,"badge":10,"priority":1824,"main_image":2040,"status":5,"tags":2041,"dictionary":2052,"reading_time":1835,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"646b7e63047091000193c33b",{"id":2033,"first_name":2034,"last_name":877,"slug":2035,"avatar":2036},"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",[2042,2045,2046,2049],{"id":1846,"created_on":1828,"status":5,"label":2043,"slug":2044,"on_index_page":160},"NestJS","nestjs",{"id":451,"created_on":1828,"status":5,"label":1866,"slug":1866,"on_index_page":162},{"id":451,"created_on":1828,"status":5,"label":2047,"slug":2048,"on_index_page":160},"HowTo","howto",{"id":451,"created_on":1828,"status":5,"label":2050,"slug":2051,"on_index_page":160},"Automated Localization","automated-localization",[],{"id":2054,"owner":2055,"created_by":10,"sort":10,"title":2060,"slug":2061,"modified_on":877,"created_on":2062,"pinned":160,"badge":10,"priority":1824,"main_image":2063,"status":5,"tags":2064,"dictionary":2071,"reading_time":1835,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"610e58ca6f8ebe0001bd9286",{"id":2056,"first_name":2057,"last_name":877,"slug":2058,"avatar":2059},"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",[2065,2069,2070],{"id":2066,"created_on":1828,"status":5,"label":2067,"slug":2068,"on_index_page":160},613703526,"PHP","php",{"id":451,"created_on":1828,"status":5,"label":2047,"slug":2048,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":1866,"slug":1866,"on_index_page":162},[],{"id":41,"sort":10,"created_on":2073,"name":2074,"cta_link":2075,"banner_image":2076},"2022-08-10T07:30:18.000Z","Zapier","https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fzapier-integration",{"id":2077},"b2f25845-b34a-4a0f-980c-f14db1fe6d6a"]