[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"main-navigation":3,"footer-homepage":723,"footer-integrations":790,"footer-settings":1701,"blog-post-nav-nav":1814,"blog-post-nav-[USE LATEST FEATURED]":1836,"blog-localize-php-nette-app-using-contributte-translation-localazy":1857},[4,211,451,582,715,719],{"id":5,"name":6,"url":7,"url_text":7,"status":8,"groups":9},2,"Solutions",null,"published",[10,24,99,135],{"navigation_items_group_id":11},{"id":12,"sort":13,"status":8,"name":14,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":17,"show_all_url":7,"represent_as_tile":15,"items":18},3,5,"Featured Article",false,"top",true,[19],{"collection":20,"item":21},"blog_post_navigation_item_type",{"id":22,"status":8,"sort":7,"show_author_img":17,"blog_post_tag":23,"description":7},4,"nav",{"navigation_items_group_id":25},{"id":13,"sort":26,"status":8,"name":27,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":28,"represent_as_tile":17,"items":29},1,"Your Role","\u002Froles",[30,42,52,64,75,87],{"collection":31,"item":32},"relation_navigation_item_type",{"id":26,"status":8,"sort":7,"name":33,"item":34},"CMO",[35],{"collection":36,"item":37},"personas",{"id":26,"status":8,"sort":7,"slug":38,"icon":39},"chief-marketing-officers",{"id":40,"title":41},"526097d8-176f-48e5-83d3-2fc4d77061f9","La Mail Bulk",{"collection":31,"item":43},{"id":12,"status":8,"sort":7,"name":44,"item":45},"CTO",[46],{"collection":36,"item":47},{"id":22,"status":8,"sort":7,"slug":48,"icon":49},"chief-technical-officers",{"id":50,"title":51},"f808fdf0-c78b-4294-ba59-fe25f46fe825","La Mechanic",{"collection":31,"item":53},{"id":54,"status":8,"sort":7,"name":55,"item":56},20,"Product Manager",[57],{"collection":36,"item":58},{"id":59,"status":8,"sort":7,"slug":60,"icon":61},18,"product-managers",{"id":62,"title":63},"ea39586a-21fc-4b34-ba87-496028e5198f","La Worker",{"collection":31,"item":65},{"id":66,"status":8,"sort":7,"name":67,"item":68},37,"Translator",[69],{"collection":36,"item":70},{"id":54,"status":8,"sort":7,"slug":71,"icon":72},"professional-translators",{"id":73,"title":74},"07945171-d51d-4ca8-96c0-21cde9db258f","La Chat",{"collection":31,"item":76},{"id":77,"status":8,"sort":7,"name":78,"item":79},38,"Developer",[80],{"collection":36,"item":81},{"id":82,"status":8,"sort":7,"slug":83,"icon":84},30,"software-developers",{"id":85,"title":86},"1806e46d-c551-4845-bf42-4407344d229e","La Terminal",{"collection":31,"item":88},{"id":89,"status":8,"sort":7,"name":90,"item":91},27,"Localization Manager",[92],{"collection":36,"item":93},{"id":94,"status":8,"sort":7,"slug":95,"icon":96},6,"localization-managers",{"id":97,"title":98},"dac69bd1-bf5d-41d0-87d4-dd13e314698a","La Language",{"navigation_items_group_id":100},{"id":101,"sort":12,"status":8,"name":102,"render_show_all_url":15,"show_all_url_position":103,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":104},9,"Use cases","bottom",[105,111,116,121,125,130],{"collection":106,"item":107},"simple_link_navigation_item_type",{"id":108,"status":8,"sort":7,"url":109,"url_text":110,"show_favorite_icon":15},24,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fsoftware-localization","Software localization",{"collection":106,"item":112},{"id":113,"status":8,"sort":7,"url":114,"url_text":115,"show_favorite_icon":15},26,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fmobile-app-localization","Mobile app localization",{"collection":106,"item":117},{"id":118,"status":8,"sort":7,"url":119,"url_text":120,"show_favorite_icon":15},25,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fwebsite-localization","Website localization",{"collection":106,"item":122},{"id":89,"status":8,"sort":7,"url":123,"url_text":124,"show_favorite_icon":15},"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fdesign-localization","Design localization",{"collection":106,"item":126},{"id":127,"status":8,"sort":7,"url":128,"url_text":129,"show_favorite_icon":15},28,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fgame-localization","Game localization",{"collection":106,"item":131},{"id":132,"status":8,"sort":7,"url":133,"url_text":134,"show_favorite_icon":15},29,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fhelp-and-docs-localization","Help & docs localization",{"navigation_items_group_id":136},{"id":137,"sort":5,"status":8,"name":138,"render_show_all_url":15,"show_all_url_position":103,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":139},8,"Industry",[140,152,163,173,184,193,204],{"collection":31,"item":141},{"id":142,"status":8,"sort":7,"name":143,"item":144},23,"Digital Agencies",[145],{"collection":36,"item":146},{"id":147,"status":8,"sort":7,"slug":148,"icon":149},7,"digital-agencies",{"id":150,"title":151},"547f5619-b21d-4b29-86f1-8b2200313cde","La Digi Agency",{"collection":31,"item":153},{"id":154,"status":8,"sort":7,"name":155,"item":156},39,"Startups & SaaS",[157],{"collection":36,"item":158},{"id":5,"status":8,"sort":7,"slug":159,"icon":160},"startups",{"id":161,"title":162},"da1516e2-4afc-40a2-bcbf-a8161e2d610d","La Saa S",{"collection":31,"item":164},{"id":5,"status":8,"sort":7,"name":165,"item":166},"E-commerce",[167],{"collection":36,"item":168},{"id":13,"status":8,"sort":7,"slug":169,"icon":170},"e-commerce",{"id":171,"title":172},"a3d09cd2-054f-4bb5-a0a2-d3d207db65df","La Ecommerce",{"collection":31,"item":174},{"id":175,"status":8,"sort":7,"name":176,"item":177},19,"FinTech Platforms",[178],{"collection":36,"item":179},{"id":89,"status":8,"sort":7,"slug":180,"icon":181},"fintech",{"id":182,"title":183},"147339ba-07d1-4e5e-baad-23d27e60c919","La Money",{"collection":31,"item":185},{"id":108,"status":8,"sort":7,"name":186,"item":187},"Translation Agencies",[188],{"collection":36,"item":189},{"id":108,"status":8,"sort":7,"slug":190,"icon":191},"translation-agencies",{"id":192,"title":98},"15d6fe33-2af8-4d6e-933d-5caa64394511",{"collection":31,"item":194},{"id":195,"status":8,"sort":7,"name":196,"item":197},22,"Travel & Tourism",[198],{"collection":36,"item":199},{"id":12,"status":8,"sort":7,"slug":200,"icon":201},"tourism",{"id":202,"title":203},"23a785e8-0ae5-4c4b-8452-aab1b58182a6","La Travel",{"collection":31,"item":205},{"id":118,"status":8,"sort":7,"name":206,"item":207},"Nonprofit Causes",[208],{"collection":36,"item":209},{"id":127,"status":8,"sort":7,"slug":210,"icon":7},"nonprofit",{"id":13,"name":212,"url":7,"url_text":7,"status":8,"groups":213},"Features",[214,284,342,392],{"navigation_items_group_id":215},{"id":216,"sort":94,"status":8,"name":217,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":218},11,"Localization",[219,228,237,246,255,259,267,276],{"collection":31,"item":220},{"id":221,"status":8,"sort":7,"name":222,"item":223},44,"Localization services",[224],{"collection":225,"item":226},"products",{"id":101,"status":8,"slug":227},"continuous-localization-team",{"collection":31,"item":229},{"id":230,"status":8,"sort":7,"name":231,"item":232},45,"Translation management",[233],{"collection":234,"item":235},"term_landing_page",{"id":132,"status":8,"slug":236},"translation-management-system",{"collection":31,"item":238},{"id":239,"status":8,"sort":7,"name":240,"item":241},46,"Context Screenshots",[242],{"collection":225,"item":243},{"id":244,"status":8,"slug":245},13,"context-screenshots-ocr",{"collection":31,"item":247},{"id":248,"status":8,"sort":7,"name":249,"item":250},47,"Translation Glossary",[251],{"collection":225,"item":252},{"id":253,"status":8,"slug":254},17,"glossary",{"collection":106,"item":256},{"id":22,"status":8,"sort":7,"url":257,"url_text":258,"show_favorite_icon":15},"\u002Fdocs\u002Fgeneral\u002Freviewing-translations","Quality control",{"collection":31,"item":260},{"id":261,"status":8,"sort":7,"name":262,"item":263},34,"Connected Projects",[264],{"collection":225,"item":265},{"id":26,"status":8,"slug":266},"connected-projects",{"collection":31,"item":268},{"id":269,"status":8,"sort":7,"name":270,"item":271},64,"Plural handling",[272],{"collection":225,"item":273},{"id":274,"status":8,"slug":275},32,"plurals",{"collection":31,"item":277},{"id":278,"status":8,"sort":7,"name":279,"item":280},65,"Style guides",[281],{"collection":225,"item":282},{"id":77,"status":8,"slug":283},"style-guide",{"navigation_items_group_id":285},{"id":286,"sort":147,"status":8,"name":287,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":288},12,"Translation",[289,297,305,309,317,325,334],{"collection":31,"item":290},{"id":291,"status":8,"sort":7,"name":292,"item":293},36,"Professional translations",[294],{"collection":234,"item":295},{"id":82,"status":8,"slug":296},"professional-translation-services",{"collection":31,"item":298},{"id":299,"status":8,"sort":7,"name":300,"item":301},48,"Crowdsourced translations",[302],{"collection":225,"item":303},{"id":137,"status":8,"slug":304},"share-tm",{"collection":106,"item":306},{"id":13,"status":8,"sort":7,"url":307,"url_text":308,"show_favorite_icon":15},"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings","Translation interface",{"collection":31,"item":310},{"id":311,"status":8,"sort":7,"name":312,"item":313},55,"Machine translations",[314],{"collection":225,"item":315},{"id":13,"status":8,"slug":316},"machine-translation",{"collection":31,"item":318},{"id":319,"status":8,"sort":7,"name":320,"item":321},60,"Localazy AI translation",[322],{"collection":225,"item":323},{"id":132,"status":8,"slug":324},"localazy-ai",{"collection":31,"item":326},{"id":327,"status":8,"sort":7,"name":328,"item":329},61,"Translation Memory",[330],{"collection":225,"item":331},{"id":332,"status":8,"slug":333},35,"translation-memory",{"collection":31,"item":335},{"id":336,"status":8,"sort":7,"name":337,"item":338},63,"Code & placeholders",[339],{"collection":225,"item":340},{"id":82,"status":8,"slug":341},"code-and-placeholders",{"navigation_items_group_id":343},{"id":244,"sort":137,"status":8,"name":344,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":345},"Management",[346,350,358,367,376,384,388],{"collection":106,"item":347},{"id":137,"status":8,"sort":7,"url":348,"url_text":349,"show_favorite_icon":15},"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles","User roles",{"collection":31,"item":351},{"id":352,"status":8,"sort":7,"name":353,"item":354},51,"Duplicity Linking",[355],{"collection":225,"item":356},{"id":175,"status":8,"slug":357},"duplicity-linking",{"collection":31,"item":359},{"id":360,"status":8,"sort":7,"name":361,"item":362},52,"Language Permissions",[363],{"collection":225,"item":364},{"id":365,"status":8,"slug":366},21,"language-permissions",{"collection":31,"item":368},{"id":369,"status":370,"sort":7,"name":371,"item":372},53,"draft","Automations",[373],{"collection":225,"item":374},{"id":54,"status":8,"slug":375},"automations",{"collection":31,"item":377},{"id":378,"status":8,"sort":7,"name":379,"item":380},58,"Branching",[381],{"collection":225,"item":382},{"id":89,"status":8,"slug":383},"branching",{"collection":106,"item":385},{"id":365,"status":370,"sort":7,"url":386,"url_text":387,"show_favorite_icon":15},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fsso-configuration","SSO",{"collection":106,"item":389},{"id":195,"status":370,"sort":7,"url":390,"url_text":391,"show_favorite_icon":15},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics","Reporting",{"navigation_items_group_id":393},{"id":394,"sort":101,"status":8,"name":395,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":396},14,"Development",[397,404,412,419,426,434,443],{"collection":31,"item":398},{"id":132,"status":8,"sort":7,"name":399,"item":400},"Translation API",[401],{"collection":225,"item":402},{"id":216,"status":8,"slug":403},"translation-api",{"collection":31,"item":405},{"id":406,"status":8,"sort":7,"name":407,"item":408},33,"Localazy CLI",[409],{"collection":225,"item":410},{"id":147,"status":8,"slug":411},"cli",{"collection":31,"item":413},{"id":274,"status":8,"sort":7,"name":414,"item":415},"Language CDN",[416],{"collection":225,"item":417},{"id":22,"status":8,"slug":418},"language-cdn",{"collection":31,"item":420},{"id":127,"status":8,"sort":7,"name":421,"item":422},"Releases",[423],{"collection":225,"item":424},{"id":94,"status":8,"slug":425},"releases",{"collection":31,"item":427},{"id":428,"status":370,"sort":7,"name":429,"item":430},57,"Format Conversions",[431],{"collection":225,"item":432},{"id":5,"status":8,"slug":433},"format-conversions",{"collection":31,"item":435},{"id":436,"status":8,"sort":7,"name":437,"item":438},59,"Webhooks",[439],{"collection":225,"item":440},{"id":441,"status":8,"slug":442},31,"webhooks",{"collection":31,"item":444},{"id":445,"status":8,"sort":7,"name":446,"item":447},62,"Export Aliases",[448],{"collection":225,"item":449},{"id":406,"status":8,"slug":450},"export-aliases",{"id":22,"name":452,"url":7,"url_text":7,"status":8,"groups":453},"Integrations",[454,572],{"navigation_items_group_id":455},{"id":147,"sort":456,"status":8,"name":457,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":458},10,"Most popular",[459],{"collection":31,"item":460},{"id":286,"status":8,"sort":7,"name":452,"item":461},[462,470,477,484,491,498,505,512,519,526,533,542,549,556,564],{"collection":463,"item":464},"platforms",{"id":94,"status":8,"sort":26,"slug":465,"name":466,"icon":467},"android","Android",{"id":468,"title":469},"ff965add-53b0-44ad-b27c-ea4ef641d384","Ic Outline Android",{"collection":463,"item":471},{"id":147,"status":8,"sort":5,"slug":472,"name":473,"icon":474},"ios","iOS",{"id":475,"title":476},"886285d7-816a-4430-b5a5-edfe307b238e","Ios",{"collection":463,"item":478},{"id":406,"status":8,"sort":12,"slug":479,"name":480,"icon":481},"react","React",{"id":482,"title":483},"26757a90-88a3-4a94-b587-9f38614ed3bd","Logos React",{"collection":463,"item":485},{"id":175,"status":8,"sort":22,"slug":486,"name":487,"icon":488},"vuejs","Vue.js",{"id":489,"title":490},"6180b41f-3249-47d3-adcd-50fe1cf11bf1","Vue",{"collection":463,"item":492},{"id":493,"status":8,"sort":13,"slug":494,"name":495,"icon":496},16,"angular","Angular",{"id":497,"title":495},"2a31a97a-48c5-4531-aa36-41c9dd0bdbef",{"collection":463,"item":499},{"id":26,"status":8,"sort":94,"slug":500,"name":501,"icon":502},"flutter","Flutter",{"id":503,"title":504},"b9f13a11-9328-4a03-86cf-b20de0685606","Logos Flutter",{"collection":463,"item":506},{"id":12,"status":8,"sort":216,"slug":507,"name":508,"icon":509},"typescript","TypeScript",{"id":510,"title":511},"8d1319b5-8a96-4199-8407-00add3418b1f","Logos Typescript Icon",{"collection":463,"item":513},{"id":441,"status":8,"sort":286,"slug":514,"name":515,"icon":516},"javascript","JavaScript",{"id":517,"title":518},"4218d0c9-7e6b-494d-9663-37ceaf93ee8c","Logos Javascript",{"collection":463,"item":520},{"id":286,"status":8,"sort":54,"slug":521,"name":522,"icon":523},"json","JSON",{"id":524,"title":525},"99ac3b7c-dba5-4693-a4f4-1f27a6d7782d","Logos Json",{"collection":463,"item":527},{"id":365,"status":8,"sort":365,"slug":528,"name":529,"icon":530},"xliff","XLIFF",{"id":531,"title":532},"ca424cc8-e8a7-4aef-8dca-ef4a4d1334fc","Format",{"collection":463,"item":534},{"id":535,"status":8,"sort":536,"slug":537,"name":538,"icon":539},72,54,"strapi","Strapi",{"id":540,"title":541},"cde7f1d0-f2e0-4243-929e-a3f8f9146e69","Strapi Logo Purple",{"collection":463,"item":543},{"id":319,"status":8,"sort":311,"slug":544,"name":545,"icon":546},"figma","Figma",{"id":547,"title":548},"813745a4-a77d-4735-93b7-e0dd731b2304","Figma Icon",{"collection":463,"item":550},{"id":352,"status":8,"sort":248,"slug":551,"name":552,"icon":553},"microsoft-excel","Microsoft Excel",{"id":554,"title":555},"7a175955-7b96-4561-939f-a0e1924faa40","Excel",{"collection":463,"item":557},{"id":558,"status":8,"sort":327,"slug":559,"name":560,"icon":561},66,"github-actions","GitHub Actions",{"id":562,"title":563},"da17554f-ac6d-443d-9bac-1f29645ec1c6","Github Icon",{"collection":463,"item":565},{"id":566,"status":8,"sort":567,"slug":568,"name":569,"icon":570},97,999,"webflow","Webflow",{"id":571,"title":569},"ff43a386-52f8-499f-b77c-ab9a30f4a77e",{"navigation_items_group_id":573},{"id":22,"sort":216,"status":8,"name":574,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":575},"Explore more",[576],{"collection":577,"item":578},"text_link_navigation_item_type",{"id":26,"status":8,"sort":7,"text":579,"url":580,"url_text":581},"Localazy is a technology-agnostic platform supporting 50+ frameworks, file formats & popular tools.","\u002Fintegrations","See all integrations",{"id":26,"name":583,"url":7,"url_text":7,"status":8,"groups":584},"Resources",[585,618,624],{"navigation_items_group_id":586},{"id":26,"sort":286,"status":8,"name":587,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":588},"Helpful Links",[589,593,597,601,605,609,614],{"collection":106,"item":590},{"id":244,"status":8,"sort":7,"url":591,"url_text":592,"show_favorite_icon":17},"\u002Fblog","Localazy Blog",{"collection":106,"item":594},{"id":394,"status":8,"sort":7,"url":595,"url_text":596,"show_favorite_icon":17},"\u002Fdocs","Documentation",{"collection":106,"item":598},{"id":26,"status":8,"sort":7,"url":599,"url_text":600,"show_favorite_icon":15},"https:\u002F\u002Fdiscuss.localazy.com\u002F","Discussion Forum",{"collection":106,"item":602},{"id":286,"status":8,"sort":7,"url":603,"url_text":604,"show_favorite_icon":15},"\u002Fcase-study","Case Studies",{"collection":106,"item":606},{"id":12,"status":8,"sort":7,"url":607,"url_text":608,"show_favorite_icon":15},"\u002Fpartnership","Become a Partner",{"collection":106,"item":610},{"id":611,"status":8,"sort":7,"url":612,"url_text":613,"show_favorite_icon":15},15,"\u002Ffaq","FAQ",{"collection":106,"item":615},{"id":253,"status":8,"sort":7,"url":616,"url_text":617,"show_favorite_icon":15},"\u002Ftags\u002Frelease-update","Release Updates",{"navigation_items_group_id":619},{"id":5,"sort":394,"status":8,"name":592,"render_show_all_url":17,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":591,"represent_as_tile":15,"items":620},[621],{"collection":20,"item":622},{"id":12,"status":8,"sort":7,"show_author_img":15,"blog_post_tag":623,"description":7},"[USE LATEST FEATURED]",{"navigation_items_group_id":625},{"id":94,"sort":244,"status":8,"name":596,"render_show_all_url":17,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":595,"represent_as_tile":15,"items":626},[627,641,653,664,676,686,697,705],{"collection":31,"item":628},{"id":22,"status":8,"sort":7,"name":629,"item":630},"General",[631],{"collection":632,"item":633},"docs_section",{"id":5,"status":8,"sort":26,"slug":634,"name":629,"icon":635,"featured_icon":638},"general",{"id":636,"title":637},"423101f1-308c-42f1-8dfe-53272019e7cb","Global",{"id":639,"title":640},"0f7ca4cb-dc3b-4f62-b476-132ed5c4931f","General Doc",{"collection":31,"item":642},{"id":13,"status":8,"sort":7,"name":643,"item":644},"CLI",[645],{"collection":632,"item":646},{"id":12,"status":8,"sort":5,"slug":411,"name":643,"icon":647,"featured_icon":650},{"id":648,"title":649},"2f7a4573-8265-4d76-8d55-ce0cc79b8983","Cli",{"id":651,"title":652},"3f76ff7b-0e74-4046-bb03-4ca99c3b66d5","Doc Cat Cli",{"collection":31,"item":654},{"id":137,"status":8,"sort":7,"name":655,"item":656},"API",[657],{"collection":632,"item":658},{"id":54,"status":8,"sort":12,"slug":659,"name":655,"icon":660,"featured_icon":661},"api",{"id":648,"title":649},{"id":662,"title":663},"20866781-e69b-4e01-9456-05437487b75c","API Doc",{"collection":31,"item":665},{"id":666,"status":8,"sort":7,"name":667,"item":668},50,"CDN",[669],{"collection":632,"item":670},{"id":113,"status":8,"sort":22,"slug":671,"name":667,"icon":672,"featured_icon":673},"cdn",{"id":636,"title":637},{"id":674,"title":675},"a8ee9cb7-4e02-41f0-b595-eb518c3085b6","Doc Cat Cdn",{"collection":31,"item":677},{"id":94,"status":8,"sort":7,"name":466,"item":678},[679],{"collection":632,"item":680},{"id":26,"status":8,"sort":13,"slug":465,"name":466,"icon":681,"featured_icon":683},{"id":682,"title":466},"fb8329ae-0c0c-4fbc-bcdc-83f2eeda1039",{"id":684,"title":685},"f7c0dec8-5b42-4943-ab3a-e3665723ad6f","Doc Cat Android",{"collection":31,"item":687},{"id":147,"status":8,"sort":7,"name":473,"item":688},[689],{"collection":632,"item":690},{"id":22,"status":8,"sort":94,"slug":472,"name":473,"icon":691,"featured_icon":694},{"id":692,"title":693},"289e136c-55df-4d51-847b-1782a2308ee4","Ios Blue",{"id":695,"title":696},"2968d3f0-14b5-4427-82e7-f1ea2de17846","Doc Cat Ios",{"collection":31,"item":698},{"id":101,"status":8,"sort":7,"name":545,"item":699},[700],{"collection":632,"item":701},{"id":365,"status":8,"sort":147,"slug":544,"name":545,"icon":702,"featured_icon":703},{"id":648,"title":649},{"id":704,"title":545},"f5e66b5b-a439-47f6-af4a-6ad261de2e87",{"collection":31,"item":706},{"id":456,"status":8,"sort":7,"name":538,"item":707},[708],{"collection":632,"item":709},{"id":142,"status":8,"sort":137,"slug":537,"name":538,"icon":710,"featured_icon":712},{"id":711,"title":538},"3b4b03c7-e131-49e6-a014-c8c2c8a2751e",{"id":713,"title":714},"1dd05c76-e517-4aea-a3d8-49cfddb40056","Strapi Doc",{"id":12,"name":716,"url":717,"url_text":716,"status":8,"groups":718},"Pricing","\u002Fpricing",[],{"id":94,"name":720,"url":721,"url_text":720,"status":8,"groups":722},"Book a demo","\u002Fbook-demo",[],{"status":8,"header_badges":724,"footer_badges":742,"footer_secured_badges":748,"slider_badges":760},[725,732,737],{"id":26,"status":8,"sort":7,"link":726,"title":727,"badgeType":728,"badgeName":729,"metadata":7,"image":730},"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Flocalazy\u002Freviews","Best meets requirements","Other","G2-winter-24-best-meets-requirments",{"id":731},"8d5dd6fd-6995-4c92-8219-a6ed5ba6acdc",{"id":5,"status":8,"sort":7,"link":726,"title":733,"badgeType":728,"badgeName":734,"metadata":7,"image":735},"Best support","G2-winter-24-best-support",{"id":736},"e59dd465-84d9-45c7-987d-dd4048fd6992",{"id":12,"status":8,"sort":7,"link":726,"title":738,"badgeType":728,"badgeName":739,"metadata":7,"image":740},"Easiest admin","G2-winter-24-easiest-admin",{"id":741},"5f12c4c8-bec0-47cf-87b4-a4502e9f1bd2",[743],{"id":286,"status":8,"sort":7,"link":726,"title":744,"badgeType":728,"badgeName":745,"metadata":7,"image":746},"Users love us","Users love us 25",{"id":747},"232416a5-86ba-4be6-85a5-b88802003d53",[749,755],{"id":216,"status":8,"sort":7,"link":750,"title":751,"badgeType":728,"badgeName":752,"metadata":7,"image":753},"https:\u002F\u002Fsprinto.com\u002Fget-iso-27001\u002F","Sprinto ISO 27001","Sprinto ISO 27001 certificate",{"id":754},"c1c6c06c-6caf-4b78-8a7e-9606c395eb61",{"id":244,"status":8,"sort":7,"link":756,"title":757,"badgeType":728,"badgeName":757,"metadata":7,"image":758},"https:\u002F\u002Fwww.aicpa.org\u002Fsoc4so","SOC certificate",{"id":759},"4f4bc0a6-09a0-41df-8295-8f990d96d941",[761,767,771,775,779,783,788],{"id":13,"status":8,"sort":7,"link":726,"title":762,"badgeType":728,"badgeName":763,"metadata":764,"image":765},"Most likely to recommend","a","",{"id":766},"da055731-3f11-4fc7-96f2-c11c0b84c831",{"id":94,"status":8,"sort":7,"link":726,"title":768,"badgeType":728,"badgeName":7,"metadata":7,"image":769},"EMEA High Performer",{"id":770},"586fb488-81f2-41db-a4e8-ef309e50c0e6",{"id":147,"status":8,"sort":7,"link":726,"title":772,"badgeType":728,"badgeName":7,"metadata":7,"image":773},"Ease of Doing Business With",{"id":774},"bfa26865-430e-463d-9886-cb56a8a8ecf6",{"id":137,"status":8,"sort":7,"link":726,"title":776,"badgeType":728,"badgeName":7,"metadata":7,"image":777},"High Performer",{"id":778},"2cc1ba0f-c23a-4c97-ad4a-a655c97466fe",{"id":101,"status":8,"sort":7,"link":726,"title":780,"badgeType":728,"badgeName":7,"metadata":7,"image":781},"Fastest Implementation",{"id":782},"6f297758-1c95-45f4-a6e9-528319897132",{"id":456,"status":8,"sort":7,"link":784,"title":785,"badgeType":728,"badgeName":7,"metadata":7,"image":786},"https:\u002F\u002Fwww.intercert.com\u002Fservices\u002Fgovernance-risk-compliance\u002Fiso-iec-27001","Intercert ISO 27001",{"id":787},"0521a5f1-e1f2-4da6-a2bc-dc92773f2a7b",{"id":216,"status":8,"sort":7,"link":750,"title":751,"badgeType":728,"badgeName":752,"metadata":7,"image":789},{"id":754},[791,931,1009,1115,1201,1280,1369,1460,1547,1646],{"id":406,"status":8,"created_on":792,"modified_on":793,"name":480,"slug":479,"description":794,"docs_link":795,"priority":7,"has_sdk":15,"sort":12,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":796,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":798,"tile_description":799,"is_enterprise":15,"is_popular":15,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":800,"upload_features":801,"icon":802,"meta_image":803,"primary_tag":805,"tags":821,"integration_methods":839,"recommended_methods":915,"default_integration_method":916,"faq_categories":923,"translations":929,"platforms_id":406},"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":521},[],{"id":482},{"id":804},"a97492ec-ee8d-429c-bf66-d0fe59b6e5c9",{"id":13,"status":8,"sort":5,"created_on":806,"label":807,"hidden":15,"icon":808,"translations":810},"2022-03-17T12:23:44.000Z","Web apps",{"id":809},"c9e70e4f-8136-432a-8d82-53c3501a9eb4",[811,813,816,819],{"id":13,"languages_code":812,"label":807},"xxa",{"id":230,"languages_code":814,"label":815},"es","Aplicaciones web",{"id":666,"languages_code":817,"label":818},"cs","Webové aplikace",{"id":436,"languages_code":820,"label":807},"en",[822,829],{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":823,"translations":824},{"id":809},[825,826,827,828],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":137,"status":8,"sort":101,"label":830,"hidden":15,"created_on":831,"icon":7,"translations":832},"Framework","2022-03-17T12:23:45.000Z",[833,834,836,837],{"id":137,"languages_code":812,"label":830},{"id":369,"languages_code":814,"label":835},"Marco",{"id":319,"languages_code":817,"label":830},{"id":838,"languages_code":820,"label":830},67,[840,852,877,898],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":843},"Translate strings directly or upload them into your Localazy project.","\u002Fdocs\u002Fapi\u002Fintroduction",[844,845,848,850],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},40,"Utilice la API para exportar traducciones e importar contenido de\u002Fa Localazy mediante programación.",{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},"Choose between translating strings directly or uploading them into Localazy.",{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},"Pomocí rozhraní API můžete programovaně exportovat překlady a importovat obsah z\u002Fdo Localazy.",{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":858},"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",[859,860,863,864,867,870,871,872],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},"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":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},"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":269,"languages_code":814,"label":868,"description":869,"slug":854},"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":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},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":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":884},"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",[885,886,889,890,894],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},"Carga directa de archivos","Cargue sus textos y traducciones existentes en cualquier formato directamente para empezar rápidamente.",{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},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":895,"languages_code":874,"label":896,"description":897,"slug":7},85,"Direkter Datei-Upload","Laden Sie Ihre Texte und vorhandenen Übersetzungen in einem beliebigen Format direkt hoch, um schnell loszulegen.",{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":902},"Command Line Interface","The best option for developers that want to make localization an automated part of their workflow.","\u002Fdocs\u002Fcli\u002Fthe-basics",[903,904,907,908,911],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},"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":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},"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":912,"languages_code":874,"label":913,"description":914,"slug":7},87,"Befehlszeilenschnittstelle","Die beste Option für Entwickler, die die Lokalisierung zu einem automatisierten Teil ihres Arbeitsablaufs machen möchten.",[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":917},[918,919,920,921,922],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[924],{"id":925,"status":8,"created_on":926,"sort":7,"slug":927,"label":928,"on_faq_index":7},76,"2025-02-26T12:44:29.000Z","front-end-common","Front-end Common",[930],{"languages_code":812,"name":480,"slug":479,"description":794,"support_type":796,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":798,"tile_description":799,"id":406,"platforms_id":406,"docs_link":795},{"id":175,"status":8,"created_on":792,"modified_on":932,"name":487,"slug":486,"description":933,"docs_link":795,"priority":7,"has_sdk":15,"sort":22,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":796,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":934,"tile_description":935,"is_enterprise":15,"is_popular":15,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":936,"upload_features":937,"icon":938,"meta_image":939,"primary_tag":941,"tags":948,"integration_methods":962,"recommended_methods":993,"default_integration_method":994,"faq_categories":1001,"translations":1007,"platforms_id":175},"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":521},[],{"id":489},{"id":940},"8171b836-d6b8-4354-8db3-34ccd384970d",{"id":13,"status":8,"sort":5,"created_on":806,"label":807,"hidden":15,"icon":942,"translations":943},{"id":809},[944,945,946,947],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},[949,956],{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":950,"translations":951},{"id":809},[952,953,954,955],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":137,"status":8,"sort":101,"label":830,"hidden":15,"created_on":831,"icon":7,"translations":957},[958,959,960,961],{"id":137,"languages_code":812,"label":830},{"id":369,"languages_code":814,"label":835},{"id":319,"languages_code":817,"label":830},{"id":838,"languages_code":820,"label":830},[963,969,979,986],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":964},[965,966,967,968],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":970},[971,972,973,974,975,976,977,978],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":980},[981,982,983,984,985],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":987},[988,989,990,991,992],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":995},[996,997,998,999,1000],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1002,1006],{"id":891,"status":8,"created_on":1003,"sort":7,"slug":1004,"label":1005,"on_faq_index":7},"2023-03-01T11:21:41.000Z","vue-localization","Vue.js Localization",{"id":925,"status":8,"created_on":926,"sort":7,"slug":927,"label":928,"on_faq_index":7},[1008],{"languages_code":812,"name":487,"slug":486,"description":933,"support_type":796,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":934,"tile_description":935,"id":175,"platforms_id":175,"docs_link":795},{"id":26,"status":8,"created_on":792,"modified_on":1010,"name":501,"slug":500,"description":1011,"docs_link":1012,"priority":7,"has_sdk":15,"sort":94,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1013,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":15,"marketing_subtitle":797,"tile_subtitle":1013,"tile_description":1014,"is_enterprise":15,"is_popular":15,"primary_use_case":1015,"hierarchy_handling":1016,"best_for":1017,"file_extension":1018,"format_code_example":1019,"format_to_extension":1020,"upload_features":1022,"icon":1023,"meta_image":1024,"primary_tag":1026,"tags":1037,"integration_methods":1073,"recommended_methods":1104,"default_integration_method":1105,"faq_categories":1112,"translations":1113,"platforms_id":26},"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":1021},"arb",[],{"id":503},{"id":1025},"c2674666-4371-4aa4-9a65-438c7363fafe",{"id":94,"status":8,"sort":137,"created_on":831,"label":1027,"hidden":15,"icon":1028,"translations":1030},"Mobile apps",{"id":1029},"c9c7e1f5-8b59-4016-ae0c-6fba9469cd55",[1031,1032,1034,1036],{"id":94,"languages_code":812,"label":1027},{"id":239,"languages_code":814,"label":1033},"Aplicaciones móviles",{"id":311,"languages_code":817,"label":1035},"Mobilní aplikace",{"id":278,"languages_code":820,"label":1027},[1038,1049,1056,1063],{"id":147,"status":8,"sort":175,"label":1039,"hidden":15,"created_on":831,"icon":1040,"translations":1042},"Desktop & Games",{"id":1041},"65b04533-5b4c-430c-b8a4-ecce84754200",[1043,1044,1046,1048],{"id":147,"languages_code":812,"label":1039},{"id":248,"languages_code":814,"label":1045},"Escritorio y Juegos",{"id":891,"languages_code":817,"label":1047},"Stolní počítače & Hry",{"id":558,"languages_code":820,"label":1039},{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":1050,"translations":1051},{"id":809},[1052,1053,1054,1055],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":94,"status":8,"sort":137,"label":1027,"hidden":15,"created_on":831,"icon":1057,"translations":1058},{"id":1029},[1059,1060,1061,1062],{"id":94,"languages_code":812,"label":1027},{"id":239,"languages_code":814,"label":1033},{"id":311,"languages_code":817,"label":1035},{"id":278,"languages_code":820,"label":1027},{"id":82,"status":8,"sort":274,"label":1064,"hidden":17,"created_on":831,"icon":7,"translations":1065},"ARB",[1066,1067,1069,1071],{"id":82,"languages_code":812,"label":1064},{"id":1068,"languages_code":814,"label":1064},120,{"id":1070,"languages_code":817,"label":1064},125,{"id":1072,"languages_code":820,"label":1064},130,[1074,1080,1090,1097],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1075},[1076,1077,1078,1079],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1081},[1082,1083,1084,1085,1086,1087,1088,1089],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1091},[1092,1093,1094,1095,1096],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1098},[1099,1100,1101,1102,1103],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1106},[1107,1108,1109,1110,1111],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],[1114],{"languages_code":812,"name":501,"slug":500,"description":1011,"support_type":1013,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1013,"tile_description":1014,"id":26,"platforms_id":26,"docs_link":1012},{"id":441,"status":8,"created_on":1116,"modified_on":1117,"name":515,"slug":514,"description":1118,"docs_link":1119,"priority":7,"has_sdk":15,"sort":286,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1120,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":1120,"tile_description":1121,"is_enterprise":15,"is_popular":15,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":1122,"upload_features":1124,"icon":1125,"meta_image":1126,"primary_tag":1128,"tags":1141,"integration_methods":1156,"recommended_methods":1187,"default_integration_method":1188,"faq_categories":1195,"translations":1199,"platforms_id":441},"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":1123},"js",[],{"id":517},{"id":1127},"2c6699eb-1d80-4772-8268-5597dbcead8c",{"id":456,"status":8,"sort":456,"created_on":831,"label":1129,"hidden":15,"icon":1130,"translations":1132},"Programming Languages",{"id":1131},"8c5836bb-1fbe-49c5-9330-8f931838c457",[1133,1134,1136,1139],{"id":456,"languages_code":812,"label":1129},{"id":336,"languages_code":814,"label":1135},"Lenguajes de Programación",{"id":1137,"languages_code":817,"label":1138},68,"Programovací Jazyky",{"id":1140,"languages_code":820,"label":1129},70,[1142,1149],{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":1143,"translations":1144},{"id":809},[1145,1146,1147,1148],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":456,"status":8,"sort":456,"label":1129,"hidden":15,"created_on":831,"icon":1150,"translations":1151},{"id":1131},[1152,1153,1154,1155],{"id":456,"languages_code":812,"label":1129},{"id":336,"languages_code":814,"label":1135},{"id":1137,"languages_code":817,"label":1138},{"id":1140,"languages_code":820,"label":1129},[1157,1163,1173,1180],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1158},[1159,1160,1161,1162],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1164},[1165,1166,1167,1168,1169,1170,1171,1172],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1174},[1175,1176,1177,1178,1179],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1181},[1182,1183,1184,1185,1186],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1189},[1190,1191,1192,1193,1194],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1196],{"id":332,"status":8,"created_on":1197,"sort":7,"slug":1198,"label":515,"on_faq_index":15},"2022-06-10T09:49:33.000Z","javascript-i18n-localization",[1200],{"languages_code":812,"name":515,"slug":514,"description":1118,"support_type":1120,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1120,"tile_description":1121,"id":441,"platforms_id":441,"docs_link":1119},{"id":286,"status":8,"created_on":1116,"modified_on":1202,"name":522,"slug":521,"description":1203,"docs_link":795,"priority":7,"has_sdk":15,"sort":54,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1204,"show_in_spa":17,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":1205,"tile_description":1206,"is_enterprise":15,"is_popular":17,"primary_use_case":1207,"hierarchy_handling":1208,"best_for":1209,"file_extension":1210,"format_code_example":1211,"format_to_extension":1212,"upload_features":1213,"icon":1214,"meta_image":1215,"primary_tag":1217,"tags":1228,"integration_methods":1236,"recommended_methods":1267,"default_integration_method":1268,"faq_categories":1275,"translations":1278,"platforms_id":286},"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":521},[],{"id":524},{"id":1216},"8d614c20-667e-4bee-a64d-7d7ce9c0ee0a",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1219,"translations":1221},"File formats",{"id":1220},"ab7c8f89-dcce-45ab-9e21-8605aef289c3",[1222,1223,1225,1227],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},"Formatos de archivo",{"id":352,"languages_code":817,"label":1226},"Formáty souborů",{"id":445,"languages_code":820,"label":1218},[1229],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1230,"translations":1231},{"id":1220},[1232,1233,1234,1235],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1237,1243,1253,1260],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1238},[1239,1240,1241,1242],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1244},[1245,1246,1247,1248,1249,1250,1251,1252],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1254},[1255,1256,1257,1258,1259],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1261},[1262,1263,1264,1265,1266],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1269},[1270,1271,1272,1273,1274],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1276],{"id":291,"status":8,"created_on":1277,"sort":7,"slug":521,"label":522,"on_faq_index":15},"2022-06-10T10:49:07.000Z",[1279],{"languages_code":812,"name":522,"slug":521,"description":1203,"support_type":1204,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1205,"tile_description":1206,"id":286,"platforms_id":286,"docs_link":795},{"id":365,"status":8,"created_on":1116,"modified_on":1281,"name":529,"slug":528,"description":1282,"docs_link":1283,"priority":7,"has_sdk":15,"sort":365,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1284,"show_in_spa":15,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":1285,"tile_description":1286,"is_enterprise":15,"is_popular":17,"primary_use_case":1287,"hierarchy_handling":1288,"best_for":1289,"file_extension":1290,"format_code_example":1291,"format_to_extension":1292,"upload_features":1294,"icon":1295,"meta_image":1296,"primary_tag":1298,"tags":1305,"integration_methods":1327,"recommended_methods":1358,"default_integration_method":1359,"faq_categories":1366,"translations":1367,"platforms_id":365},"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":1293},"xlf",[],{"id":531},{"id":1297},"889970a6-cce8-4055-b96a-9c3f292aa67f",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1299,"translations":1300},{"id":1220},[1301,1302,1303,1304],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1306,1313,1320],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1307,"translations":1308},{"id":1220},[1309,1310,1311,1312],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1314,"translations":1315},{"id":1220},[1316,1317,1318,1319],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1321,"translations":1322},{"id":1220},[1323,1324,1325,1326],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1328,1334,1344,1351],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1329},[1330,1331,1332,1333],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1335},[1336,1337,1338,1339,1340,1341,1342,1343],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1345},[1346,1347,1348,1349,1350],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1352},[1353,1354,1355,1356,1357],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1360},[1361,1362,1363,1364,1365],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],[1368],{"languages_code":812,"name":529,"slug":528,"description":1282,"support_type":1284,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1285,"tile_description":1286,"id":365,"platforms_id":365,"docs_link":1283},{"id":54,"status":8,"created_on":1370,"modified_on":1370,"name":1371,"slug":1372,"description":1373,"docs_link":1374,"priority":7,"has_sdk":15,"sort":108,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1284,"show_in_spa":17,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":15,"marketing_subtitle":797,"tile_subtitle":1375,"tile_description":1376,"is_enterprise":15,"is_popular":17,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":1377,"upload_features":1378,"icon":1379,"meta_image":1381,"primary_tag":1383,"tags":1390,"integration_methods":1418,"recommended_methods":1449,"default_integration_method":1450,"faq_categories":1457,"translations":1458,"platforms_id":54},"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":1372},[],{"id":1380},"25f317fe-0c10-4f0b-92cd-f80d1f3c6a67",{"id":1382},"490022f9-d91a-4e1a-9e79-db374ec997c2",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1384,"translations":1385},{"id":1220},[1386,1387,1388,1389],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1391,1398,1408],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1392,"translations":1393},{"id":1220},[1394,1395,1396,1397],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":261,"status":8,"sort":261,"label":1399,"hidden":17,"created_on":831,"icon":7,"translations":1400},"C++",[1401,1402,1404,1406],{"id":261,"languages_code":812,"label":1399},{"id":1403,"languages_code":814,"label":1399},135,{"id":1405,"languages_code":817,"label":1399},140,{"id":1407,"languages_code":820,"label":1399},144,{"id":365,"status":8,"sort":108,"label":1409,"hidden":17,"created_on":831,"icon":7,"translations":1410},"Gettext",[1411,1412,1414,1416],{"id":365,"languages_code":812,"label":1409},{"id":1413,"languages_code":814,"label":1409},101,{"id":1415,"languages_code":817,"label":1409},106,{"id":1417,"languages_code":820,"label":1409},111,[1419,1425,1435,1442],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1420},[1421,1422,1423,1424],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1426},[1427,1428,1429,1430,1431,1432,1433,1434],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1436},[1437,1438,1439,1440,1441],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1443},[1444,1445,1446,1447,1448],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1451},[1452,1453,1454,1455,1456],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],[1459],{"languages_code":812,"name":1371,"slug":1372,"description":1373,"support_type":1284,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1375,"tile_description":1376,"id":54,"platforms_id":54,"docs_link":1374},{"id":113,"status":8,"created_on":1116,"modified_on":1461,"name":1462,"slug":1463,"description":1464,"docs_link":1465,"priority":7,"has_sdk":15,"sort":89,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1284,"show_in_spa":17,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":15,"marketing_subtitle":797,"tile_subtitle":1466,"tile_description":1467,"is_enterprise":15,"is_popular":15,"primary_use_case":1468,"hierarchy_handling":1469,"best_for":1470,"file_extension":1471,"format_code_example":1472,"format_to_extension":1473,"upload_features":1474,"icon":1475,"meta_image":1476,"primary_tag":1478,"tags":1485,"integration_methods":1503,"recommended_methods":1534,"default_integration_method":1535,"faq_categories":1542,"translations":1545,"platforms_id":113},"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":1463},[],{"id":1380},{"id":1477},"1f07bf83-9363-47d6-b21b-a5121c0efaf6",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1479,"translations":1480},{"id":1220},[1481,1482,1483,1484],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1486,1493],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1487,"translations":1488},{"id":1220},[1489,1490,1491,1492],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":108,"status":8,"sort":113,"label":1494,"hidden":17,"created_on":831,"icon":7,"translations":1495},"C#",[1496,1497,1499,1501],{"id":108,"languages_code":812,"label":1494},{"id":1498,"languages_code":814,"label":1494},103,{"id":1500,"languages_code":817,"label":1494},108,{"id":1502,"languages_code":820,"label":1494},113,[1504,1510,1520,1527],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1505},[1506,1507,1508,1509],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1511},[1512,1513,1514,1515,1516,1517,1518,1519],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1521},[1522,1523,1524,1525,1526],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1528},[1529,1530,1531,1532,1533],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1536},[1537,1538,1539,1540,1541],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1543],{"id":221,"status":8,"created_on":1544,"sort":7,"slug":1463,"label":1462,"on_faq_index":7},"2022-08-01T16:44:06.000Z",[1546],{"languages_code":812,"name":1462,"slug":1463,"description":1464,"support_type":1284,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1466,"tile_description":1467,"id":113,"platforms_id":113,"docs_link":1465},{"id":535,"status":8,"created_on":1548,"modified_on":1549,"name":538,"slug":537,"description":1550,"docs_link":1551,"priority":7,"has_sdk":7,"sort":536,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1552,"show_in_spa":17,"is_file_format":7,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":1552,"tile_subtitle":1552,"tile_description":1553,"is_enterprise":15,"is_popular":17,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":7,"upload_features":7,"icon":1554,"meta_image":1555,"primary_tag":1557,"tags":1569,"integration_methods":1613,"recommended_methods":1633,"default_integration_method":1634,"faq_categories":1641,"translations":1644,"platforms_id":535},"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":540},{"id":1556},"5995b721-a2ea-487e-ad4b-298a489bbd24",{"id":286,"status":8,"sort":216,"created_on":831,"label":1558,"hidden":15,"icon":1559,"translations":1561},"CMS",{"id":1560},"1172a655-928c-4594-9263-d8afdfd9cd79",[1562,1563,1565,1567],{"id":286,"languages_code":812,"label":1558},{"id":1564,"languages_code":814,"label":1558},73,{"id":1566,"languages_code":817,"label":1558},81,{"id":1568,"languages_code":820,"label":1558},84,[1570,1582,1594,1601],{"id":59,"status":8,"sort":253,"label":1571,"hidden":15,"created_on":831,"icon":7,"translations":1572},"Multilingual SEO",[1573,1574,1577,1580],{"id":59,"languages_code":812,"label":1571},{"id":1575,"languages_code":814,"label":1576},89,"SEO multilingüe",{"id":1578,"languages_code":817,"label":1579},94,"Vícejazyčné SEO",{"id":1581,"languages_code":820,"label":1571},99,{"id":406,"status":8,"sort":406,"label":165,"hidden":15,"created_on":831,"icon":1583,"translations":1585},{"id":1584},"e782ed3f-d954-45ca-8b17-5bf5fe95f30a",[1586,1587,1590,1592],{"id":406,"languages_code":812,"label":165},{"id":1588,"languages_code":814,"label":1589},132,"Comercio electrónico",{"id":1591,"languages_code":817,"label":165},137,{"id":1593,"languages_code":820,"label":165},142,{"id":286,"status":8,"sort":216,"label":1558,"hidden":15,"created_on":831,"icon":1595,"translations":1596},{"id":1560},[1597,1598,1599,1600],{"id":286,"languages_code":812,"label":1558},{"id":1564,"languages_code":814,"label":1558},{"id":1566,"languages_code":817,"label":1558},{"id":1568,"languages_code":820,"label":1558},{"id":5,"status":8,"sort":94,"label":1602,"hidden":15,"created_on":831,"icon":1603,"translations":1605},"Marketing tools",{"id":1604},"098fe6a4-dd2e-42d8-937e-2d8121e6e266",[1606,1607,1610,1612],{"id":5,"languages_code":812,"label":1602},{"id":1608,"languages_code":814,"label":1609},43,"Herramientas de marketing",{"id":299,"languages_code":817,"label":1611},"Marketingové nástroje",{"id":378,"languages_code":820,"label":1602},[1614],{"id":137,"status":8,"sort":7,"label":1615,"alternative_label":1616,"slug":1617,"description":1618,"documentation_link":1619,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1621},"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",[1622,1623,1626,1627,1630],{"id":137,"languages_code":812,"label":1615,"description":1618,"slug":1617},{"id":1608,"languages_code":814,"label":1624,"description":1625,"slug":7},"Complemento Oficial de Strapi","Nuestros desarrolladores mantienen un complemento oficial de localización de Strapi. ¡Empiece en unos pocos clics!",{"id":369,"languages_code":820,"label":1615,"description":1618,"slug":1617},{"id":445,"languages_code":817,"label":1628,"description":1629,"slug":7},"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":1575,"languages_code":874,"label":1631,"description":1632,"slug":7},"Offizielles Strapi-Plugin","Unsere Entwickler pflegen ein offizielles Strapi-Lokalisierungs-Plugin. Starten Sie mit ein paar Klicks!",[],{"id":137,"status":8,"sort":7,"label":1615,"alternative_label":1616,"slug":1617,"description":1618,"documentation_link":1619,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1635},[1636,1637,1638,1639,1640],{"id":137,"languages_code":812,"label":1615,"description":1618,"slug":1617},{"id":1608,"languages_code":814,"label":1624,"description":1625,"slug":7},{"id":369,"languages_code":820,"label":1615,"description":1618,"slug":1617},{"id":445,"languages_code":817,"label":1628,"description":1629,"slug":7},{"id":1575,"languages_code":874,"label":1631,"description":1632,"slug":7},[1642],{"id":66,"status":8,"created_on":1643,"sort":7,"slug":537,"label":538,"on_faq_index":7},"2022-06-16T09:24:13.000Z",[1645],{"languages_code":812,"name":538,"slug":537,"description":1550,"support_type":1552,"meta_title":7,"meta_description":7,"marketing_subtitle":1552,"tile_subtitle":1552,"tile_description":1553,"id":535,"platforms_id":535,"docs_link":1551},{"id":319,"status":8,"created_on":1116,"modified_on":1647,"name":545,"slug":544,"description":7,"docs_link":1648,"priority":7,"has_sdk":15,"sort":311,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1649,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":1650,"tile_subtitle":1651,"tile_description":1652,"is_enterprise":15,"is_popular":17,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":7,"upload_features":1653,"icon":1654,"meta_image":1655,"primary_tag":1657,"tags":1670,"integration_methods":1678,"recommended_methods":1691,"default_integration_method":1692,"faq_categories":1698,"translations":1699,"platforms_id":319},"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":547},{"id":1656},"7573fed6-8817-4cb4-84d2-be327e6c4891",{"id":12,"status":8,"sort":147,"created_on":831,"label":1658,"hidden":15,"icon":1659,"translations":1661},"Design tools",{"id":1660},"1053d863-b690-4fbd-aadf-dbf2ba282768",[1662,1663,1666,1669],{"id":12,"languages_code":812,"label":1658},{"id":1664,"languages_code":814,"label":1665},42,"Herramientas de diseño",{"id":1667,"languages_code":817,"label":1668},49,"Nástroje pro návrh",{"id":428,"languages_code":820,"label":1658},[1671],{"id":12,"status":8,"sort":147,"label":1658,"hidden":15,"created_on":831,"icon":1672,"translations":1673},{"id":1660},[1674,1675,1676,1677],{"id":12,"languages_code":812,"label":1658},{"id":1664,"languages_code":814,"label":1665},{"id":1667,"languages_code":817,"label":1668},{"id":428,"languages_code":820,"label":1658},[1679],{"id":147,"status":8,"sort":7,"label":1616,"alternative_label":1616,"slug":1680,"description":1681,"documentation_link":595,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1682},"official-plugin","Our developers maintain an official plugin for this integration. Start in a few clicks!",[1683,1684,1687,1688],{"id":147,"languages_code":812,"label":1616,"description":1681,"slug":1680},{"id":142,"languages_code":814,"label":1685,"description":1686,"slug":7},"Plugin Oficial","Nuestros desarrolladores mantienen un plugin oficial para esta integración. ¡Empiece con unos pocos clics!",{"id":132,"languages_code":820,"label":1616,"description":1681,"slug":1680},{"id":332,"languages_code":817,"label":1689,"description":1690,"slug":7},"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":147,"status":8,"sort":7,"label":1616,"alternative_label":1616,"slug":1680,"description":1681,"documentation_link":595,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1693},[1694,1695,1696,1697],{"id":147,"languages_code":812,"label":1616,"description":1681,"slug":1680},{"id":142,"languages_code":814,"label":1685,"description":1686,"slug":7},{"id":132,"languages_code":820,"label":1616,"description":1681,"slug":1680},{"id":332,"languages_code":817,"label":1689,"description":1690,"slug":7},[],[1700],{"languages_code":812,"name":545,"slug":544,"description":7,"support_type":1649,"meta_title":7,"meta_description":7,"marketing_subtitle":1650,"tile_subtitle":1651,"tile_description":1652,"id":319,"platforms_id":319,"docs_link":1648},{"id":26,"status":8,"security_section_title":1702,"loved_section_title":1703,"columns":1704,"social_links":1774,"policy_links":1804},"Secured & trusted","Loved by users",[1705,1717,1732,1753,1756],{"id":26,"status":8,"sort":7,"title":1706,"column_key":1707,"links":1708},"Localazy","connect",[1709,1711,1714],{"id":216,"status":8,"sort":26,"title":720,"url":1710},"___LOCALAZY_MEETING_URL___",{"id":286,"status":8,"sort":5,"title":1712,"url":1713},"Contact","\u002Fcontact",{"id":365,"status":8,"sort":12,"title":1715,"url":1716},"About us","\u002Fabout-us",{"id":5,"status":8,"sort":7,"title":1718,"column_key":1719,"links":1720},"Programs","programs",[1721,1723,1726,1729],{"id":26,"status":8,"sort":22,"title":1722,"url":607},"Partner Program",{"id":5,"status":8,"sort":13,"title":1724,"url":1725},"Ambassador Program","\u002Fambassador",{"id":12,"status":8,"sort":94,"title":1727,"url":1728},"Startup Program","\u002Ffor\u002Fstartups",{"id":22,"status":8,"sort":147,"title":1730,"url":1731},"Nonprofits","\u002Ffor\u002Fnonprofit",{"id":12,"status":8,"sort":7,"title":1733,"column_key":1734,"links":1735},"Use Cases","use_cases",[1736,1739,1742,1744,1747,1750],{"id":13,"status":8,"sort":137,"title":1737,"url":1738},"Software Localization","\u002Fterm\u002Fsoftware-localization",{"id":94,"status":8,"sort":101,"title":1740,"url":1741},"Machine Translation Services","\u002Ffeatures\u002Fmachine-translation",{"id":147,"status":8,"sort":456,"title":399,"url":1743},"\u002Ffeatures\u002Ftranslation-api",{"id":137,"status":8,"sort":216,"title":1745,"url":1746},"Crowdsourced Translations","\u002Ffeatures\u002Fshare-tm",{"id":101,"status":8,"sort":286,"title":1748,"url":1749},"Figma i18n & localization","\u002Ffeatures\u002Ffigma-localization-plugin",{"id":456,"status":8,"sort":244,"title":1751,"url":1752},"Translation as a Service","\u002Fterm\u002Ftranslation-service",{"id":22,"status":8,"sort":7,"title":452,"column_key":1754,"links":1755},"integrations",[],{"id":13,"status":8,"sort":7,"title":583,"column_key":1757,"links":1758},"resources",[1759,1760,1763,1764,1767,1769,1770,1771],{"id":244,"status":8,"sort":394,"title":596,"url":595},{"id":394,"status":8,"sort":611,"title":1761,"url":1762},"Dictionary","\u002Fdictionary",{"id":611,"status":8,"sort":493,"title":604,"url":603},{"id":493,"status":8,"sort":253,"title":1765,"url":1766},"Discussion forum","___DISCUSS_URL___",{"id":253,"status":8,"sort":59,"title":1768,"url":591},"Localization Blog",{"id":59,"status":8,"sort":175,"title":613,"url":612},{"id":175,"status":8,"sort":54,"title":716,"url":717},{"id":54,"status":8,"sort":365,"title":1772,"url":1773},"Brand assets","https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1tZqsZHBlGelz7A2FwTsiwrs4j3sd9HTk",[1775,1780,1785,1790,1795,1800],{"id":26,"status":8,"sort":7,"platform":1776,"icon":1777,"url":1778,"label":1779},"feed","rss","\u002Ffeed.xml","Localazy RSS Feed",{"id":5,"status":8,"sort":7,"platform":1781,"icon":1782,"url":1783,"label":1784},"facebook","fb-logo","https:\u002F\u002Fwww.facebook.com\u002Flocalazy\u002F","Localazy facebook",{"id":12,"status":8,"sort":7,"platform":1786,"icon":1787,"url":1788,"label":1789},"github","github-logo","https:\u002F\u002Fgithub.com\u002Flocalazy","Localazy GitHub",{"id":22,"status":8,"sort":7,"platform":1791,"icon":1792,"url":1793,"label":1794},"x","x-twitter","https:\u002F\u002Fx.com\u002Flocalazy","Localazy X",{"id":13,"status":8,"sort":7,"platform":1796,"icon":1797,"url":1798,"label":1799},"linkedin","linkedin-logo","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002F37836599\u002F","Localazy LinkedIn",{"id":94,"status":8,"sort":7,"platform":1801,"icon":1802,"url":1766,"label":1803},"discourse","discourse-logo","Localazy Discourse",[1805,1808,1811],{"id":26,"status":8,"sort":7,"title":1806,"url":1807,"action":7},"Privacy policy","\u002Fprivacy-policy",{"id":5,"status":8,"sort":7,"title":1809,"url":1810,"action":7},"Terms & Conditions","\u002Fterms-and-conditions",{"id":12,"status":8,"sort":7,"title":1812,"url":7,"action":1813},"Cookies","cookie-consent",{"id":1815,"owner":1816,"created_by":7,"sort":7,"title":1821,"slug":1822,"modified_on":764,"created_on":1823,"pinned":15,"badge":7,"priority":1824,"main_image":1825,"status":8,"tags":1826,"dictionary":1834,"reading_time":1835,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"69d78a237ab1270001eddabf",{"id":1817,"first_name":1818,"last_name":764,"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":319,"created_on":1828,"status":8,"label":655,"slug":659,"on_index_page":15},"2026-06-12 18:35:24",{"id":269,"created_on":1828,"status":8,"label":1830,"slug":1831,"on_index_page":17},"AI","ai",{"id":319,"created_on":1828,"status":8,"label":217,"slug":1833,"on_index_page":17},"localization",[],0,{"id":1837,"owner":1838,"created_by":7,"sort":7,"title":1843,"slug":1844,"modified_on":764,"created_on":1845,"pinned":15,"badge":7,"priority":1824,"main_image":1846,"status":8,"tags":1847,"dictionary":1856,"reading_time":1835,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"69e62c567ab1270001ede506",{"id":1839,"first_name":1840,"last_name":764,"slug":1841,"avatar":1842},"6824a22d63350c0001d5a5d4","Stephanie Casale","stephanie-casale","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F03\u002FStephanie.png","4 Arabic localization assumptions that fail in the real world, told by a Marine Corps linguist","4-arabic-localization-assumptions-that-fail-told-by-a-marine-corps-linguist","2026-06-09T17:41:36.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F06\u002FArabicLocal---Marine-Corps-5.png",[1848,1849,1853],{"id":319,"created_on":1828,"status":8,"label":217,"slug":1833,"on_index_page":17},{"id":1850,"created_on":1828,"status":8,"label":1851,"slug":1852,"on_index_page":15},646,"Business Development","business-development",{"id":319,"created_on":1828,"status":8,"label":1854,"slug":1855,"on_index_page":15},"Locales","locales",[],{"post":1858,"relatedPosts":2084,"banner":2144},{"id":1859,"owner":1860,"created_by":7,"sort":7,"title":1865,"slug":1866,"modified_on":1867,"created_on":1868,"pinned":17,"badge":7,"priority":1824,"main_image":1869,"status":8,"tags":1870,"dictionary":1880,"reading_time":59,"excerpt":1991,"og_title":764,"og_description":764,"og_image":764,"content":1992,"meta_title":764,"meta_description":764,"canonical":764,"cta":1993,"fullGhostPost":2001},"610e58ca6f8ebe0001bd9286",{"id":1861,"first_name":1862,"last_name":764,"slug":1863,"avatar":1864},"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","2026-04-16T16:25:02.000+02:00","2021-09-07T10:11:37.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F09\u002FHow-to-lokalize-Nette.png",[1871,1875,1878],{"id":1872,"created_on":1828,"status":8,"label":1873,"slug":1874,"on_index_page":15},613703526,"PHP","php",{"id":319,"created_on":1828,"status":8,"label":1876,"slug":1877,"on_index_page":15},"HowTo","howto",{"id":319,"created_on":1828,"status":8,"label":1879,"slug":1879,"on_index_page":17},"i18n",[1881,1907,1924,1936,1948,1959,1974,1983],{"id":319,"status":8,"owner":1882,"created_on":1883,"title":1884,"excerpt":1885,"content":1886,"slug":1887,"meta_title":764,"meta_description":764,"canonical":764,"related_terms":1888},"2bac48a8-b362-482f-b574-3bc71dca4c5b","2026-05-12T07:09:23.000Z","Externalized string","Text separated from source code so it can be translated and reused across languages.","An externalized string is a piece of text stored outside the core codebase, usually in a resource file or localization file, that enables app developers to maintain translations. This separation allows developers and localization teams to manage, translate, and update text without touching the code itself. It’s a basic requirement for internationalizing software or digital products.\n\nWhen strings are hard-coded directly into the application, they cannot be detected or processed by translation tools. Externalizing them makes it possible to feed content into translation workflows, apply translation memory, and reuse strings across different parts of the app.\n\nString externalization is one of the first steps in making a product ready for international audiences. It makes collaboration between developers and translators much easier, reduces the risk of introducing bugs during translation, and supports content consistency across languages and platforms.\n\n### 📂 Benefits of externalized strings\n\n* Make content available for translation.\n* Keep source code clean and easier to maintain.\n* Support translation memory and consistency.\n* Prevent hard-coded text from blocking localization.\n* Allow content updates without redeploying the app.\n\nWithout externalized strings, localization tools can’t do their job. Treating text as data, rather than as part of the code, gives teams the option to work with it and translate it into the target languages needed. ","externalized-string",[1889,1892,1895,1898,1901,1904],{"id":1890,"slug":1891},340,"key-based-internationalization",{"id":1893,"slug":1894},79,"internationalization",{"id":1896,"slug":1897},171,"strings",{"id":1899,"slug":1900},256,"TODO",{"id":1902,"slug":1903},277,"string-catalog",{"id":1905,"slug":1906},344,"101-matching",{"id":1908,"status":8,"owner":1882,"created_on":1883,"title":1909,"excerpt":1910,"content":1911,"slug":1912,"meta_title":764,"meta_description":764,"canonical":764,"related_terms":1913},90,"ICU","A robust set of C\u002FC++ and Java libraries designed to support Unicode and globalization features in software applications.","ICU is an [open-source](https:\u002F\u002Fwww.unicode.org\u002Fcopyright.html#License \"https:\u002F\u002Fwww.unicode.org\u002Fcopyright.html#License\") set of libraries that enables consistent behavior across platforms and languages, making it essential for internationalization (i18n) and localization (l10n) tasks. \n\nIt ensures that text, dates, numbers, and other culturally sensitive content are processed and displayed according to locale-specific rules.\n\nOriginally developed by IBM and now maintained by the Unicode Consortium, ICU is widely used in enterprise and open-source applications. Its integration with the [Common Locale Data Repository (CLDR)](https:\u002F\u002Fcldr.unicode.org\u002F) allows it to stay up to date with locale-specific conventions, supporting accurate formatting, sorting, and parsing across hundreds of languages and regions.\n\nThe ICU libraries are especially valuable in modern localization platforms and global software development, where linguistic precision and regional accuracy directly impact user experience. They are widely portable and gives applications the same results on all platforms and between C\u002FC++ and Java software.\n\n### 🛠️ What can ICU do?\n\n* Provides robust code page conversion between Unicode and legacy encodings\n* Enables language-sensitive string comparison with locale-specific collation rules\n* Formats numbers, dates, and currency according to regional conventions\n* Implements Unicode-aware regular expressions for global text processing\n* Handles bidirectional text (e.g., combining Arabic with English) accurately\n* Offers full access to Unicode properties and normalization functions\n* Supports multiple calendar systems and time zone calculations\n* Detects text boundaries for words, sentences, and line breaks\n* Integrates with the CLDR for up-to-date localization data\n\n> *📚 You can read more about ICU in their [official docs](https:\u002F\u002Ficu.unicode.org\u002F).*  ","icu",[1914,1917,1918,1921],{"id":1915,"slug":1916},272,"cldr",{"id":1893,"slug":1894},{"id":1919,"slug":1920},255,"icu-message-format",{"id":1922,"slug":1923},270,"unicode",{"id":1893,"status":8,"owner":1882,"created_on":1883,"title":1925,"excerpt":1926,"content":1927,"slug":1894,"meta_title":764,"meta_description":764,"canonical":764,"related_terms":1928},"Internationalization (i18n)","The process of making your software localizable.","Internationalization (i18n) is the process of preparing software, digital products, and content so they can be easily adapted for various languages, regions, and cultures without requiring extensive reengineering.\n\nThis foundational step ensures that a product can be efficiently localized to meet the needs of different global markets. To internationalize your software, you need to pay attention to technical requirements. The code structure and design has to be prepared to allow for [localization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Flocalization).\n\nIt involves considering various linguistic and cultural factors during the initial design and development phases. This process should start, ideally, in the design phase. For example, you may want to have externalised strings so you can bring your strings to the translation management tool.\n\nEvery business looking to expand their reach and provide User Experiences (UX) across diverse markets needs to consider internationalization and then localization.\n\n## 🌐 Key points about internationalization (i18n): \n\n* Internationalization involves creating flexible and adaptable designs that accommodate various languages, scripts, and cultural norms.\n* By preparing content and software for localization, internationalization simplifies the process of translating and adapting products for specific markets.\n* This process includes using Unicode, supporting different character sets, and ensuring compatibility with various regional formats (dates, currencies, etc.).\n* Investing in internationalization upfront reduces the time and cost associated with localizing products for multiple markets.\n\nBy prioritizing internationalization, companies can create products that are more versatile and ready for global distribution, ensuring they meet the needs of international users effectively.",[1929,1930,1932,1934],{"id":5,"slug":1833},{"id":22,"slug":1931},"translation",{"id":13,"slug":1933},"globalization",{"id":101,"slug":1935},"gilt",{"id":336,"status":8,"owner":1882,"created_on":1883,"title":1937,"excerpt":1938,"content":1939,"slug":1940,"meta_title":764,"meta_description":764,"canonical":764,"related_terms":1941},"Integrated Development Environment (IDE)","A software application that provides developers with a complete set of tools for writing, testing, and debugging code in one place.","An IDE (Integrated Development Environment) typically includes a source code editor, compiler or interpreter, build automation tools (such as Gradle for Android), a debugger, and a system for managing libraries and plugins.\n\nThese features let the IDEs streamline the software development process and reduce the need to switch between multiple standalone tools.\n\n### 🧩 What are the core features of IDEs?\n\n* **Source code editor**: Syntax highlighting, auto-completion, and error detection.\n* **Compiler\u002FInterpreter**: Translates code into executable programs.\n* **Build automation**: Tools like Gradle or Maven to manage builds and dependencies.\n* **Debugger**: Identifies and resolves code errors step by step.\n* **Plugin & library support**: Extend functionality for specific frameworks or languages.\n* **Version control integration**: Built-in Git support for collaboration.\n\n### ⚙️ Examples of IDEs\n\n* [**Android Studio**](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fandroid-studio): The official IDE for Android development.\n* [**IntelliJ IDEA**](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fintellij-idea): Popular for Java, Kotlin, and multi-language support.\n* [**NetBeans**](https:\u002F\u002Fwww.oracle.com\u002Ftools\u002Ftechnologies\u002Fnetbeans-ide.html): Open-source, focused on Java and PHP development.\n* [**Eclipse**](https:\u002F\u002Feclipseide.org\u002F): Widely used, extensible through plugins, especially in enterprise projects.\n\nPlacing the full toolkit in one environment allows IDEs to accelerate coding tasks, simplify project management, and raise code consistency.","integrated-development-kit-ide",[1942,1944,1946],{"id":195,"slug":1943},"gradle",{"id":118,"slug":1945},"android-studio",{"id":445,"slug":1947},"intellij-idea",{"id":5,"status":8,"owner":1882,"created_on":1949,"title":217,"excerpt":1950,"content":1951,"slug":1833,"meta_title":7,"meta_description":7,"canonical":7,"related_terms":1952},"2022-03-17T12:22:54.000Z","The process of preparing a product for a particular market.","Localization (l10n) is an essential part of the **[internationalization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Finternationalization)** process. During localization, a product is prepared to be used in a particular destination, language and culture. Part of the localization process consists of changing locales such as currency, text orientation, or date format; and aligning the product with local, technical, or legislative requirements.\n\nA crucial part of localization is **[translation](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Ftranslation\u002F)**.\n\nLocalization is the process of adapting an internationalized product to meet the specific needs of a target market by translating it into the native language of that market. This includes translating the user interface, text, graphics, and other content to match the specific target locale.\n\nThe goal of localization is to provide an optimal user experience for the target market, as well as to make the product accessible to a wider audience. This process often involves more than just translation, and may include adjusting graphics, changing text length to accommodate different writing systems, and modifying the product's layout to fit cultural differences.\n\nInternationalization and localization are essential components of **[globalization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fglobalization)** (g11n) and play a key role in expanding a product's reach and success. It's important to ensure that any Creative Commons attribution is considered during localization to prevent copyright infringement.\n\nBy localizing products, companies can reach new markets and increase their customer base, ultimately helping their business grow and thrive. The number of letters in the term i18n and l10n refers to the number of characters between the first and last letters in the term, and is used as a shorthand for internationalization and localization, respectively.",[1953,1954,1955,1956,1958],{"id":5,"slug":1833},{"id":22,"slug":1931},{"id":101,"slug":1935},{"id":154,"slug":1957},"translation-management-system-tms",{"id":1893,"slug":1894},{"id":244,"status":8,"owner":1882,"created_on":1960,"title":1961,"excerpt":1962,"content":1963,"slug":316,"meta_title":764,"meta_description":764,"canonical":764,"related_terms":1964},"2026-05-12T07:09:22.000Z","Machine translation (MT)","The process of translating using computational linguistics.","A machine translation engine is a software tool that translates a text from one language to another without the help of human translators.\n\nMachine translation, also known as MT, is widely used as the first round of translations and is frequently very effective for short strings. However, it can produce unsatisfactory results when context knowledge is required, and thus, a human review is always advised.\n\n### 💬 Methods used in machine translation\n\nMachine translation engines recently experienced huge improvements related to the advanced use of neural networks, but they generally rely on these different methods:\n\n* [Statistical machine translation (SMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fstatistical-machine-translation\u002F \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fstatistical-machine-translation\u002F\")\n* [Example-based machine translation (EBMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fexample-based-machine-translation \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fexample-based-machine-translation\")\n* [Hybrid machine translation (HMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fhybrid-machine-translation \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fhybrid-machine-translation\")\n* [Neural machine translation (NMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fneural-machine-translation\u002F \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fneural-machine-translation\u002F\")\n\nNeural machine translation (used by [AI-powered translation](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fai-powered-translation) engines) is the most sophisticated type of instant translation today. It uses machine learning to improve its translation capabilities. As the engine translates more text with each request, the better results it produces with time by learning. Most instant translation services use this technology.\n\n### 🔍 What's the difference between HAMT and MAHT?\n\nWithin the realm of machine translation, it’s important to distinguish between **Human-Assisted Machine Translation (HAMT)** and **Machine-Assisted Human Translation (MAHT)**:\n\n* [**Human-Assisted Machine Translation (HAMT)**](\u002Fdictionary\u002Fhuman-assisted-mt): This process involves a human reviewing translations generated by machine translation (MT) engines. It is also known as MT plus post-editing and\u002For pre-editing. The machine handles the initial translation, which is then edited by a human to improve accuracy and context. This approach is useful for projects with repetitive content and where budget or time constraints are significant.\n* [**Machine-Assisted Human Translation (MAHT)**](\u002Fdictionary\u002Fmaht): In this method, human translators use computer software to aid their work. Translators receive machine translation suggestions, but they decide how to use them. This approach allows for high translation accuracy while benefiting from features like translation glossaries and memories, which enhance the efficiency and consistency of the translation process.\n\n### 🦾 MT engines available in Localazy \n\nLocalazy users can use the most popular and advanced [MT engines](https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fmachine-translation \"https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fmachine-translation\") to translate their content:\n\n* Amazon Translate (available for free)\n* Google Translate\n* DeepL\n* Azure Translator\n* OpenAI (ChatGPT), with your own API key\n\n> *Users can unlock different engines depending on the plan they buy. See our [pricing](https:\u002F\u002Flocalazy.com\u002Fpricing) and [docs](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fadditional-mt-engines?srsltid=AfmBOoo--lURSBHDiHEoe3rYL3xSQHaZcTsl6kd7wwUYRGC-sGTTmG94 \"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fadditional-mt-engines?srsltid=AfmBOoo--lURSBHDiHEoe3rYL3xSQHaZcTsl6kd7wwUYRGC-sGTTmG94\") for more details.*\n\n### 📚 Additional resources:\n\n* [What is machine translation?](https:\u002F\u002Fwww.gala-global.org\u002Fwhat-machine-translation)\n* [History of machine translation](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHistory_of_machine_translation)",[1965,1967,1969,1971],{"id":441,"slug":1966},"maht",{"id":1568,"slug":1968},"mtpe-machine-translation-post-editing",{"id":1502,"slug":1970},"deepl",{"id":1972,"slug":1973},136,"human-assisted-mt",{"id":26,"status":8,"owner":1882,"created_on":1949,"title":1975,"excerpt":1976,"content":1977,"slug":1978,"meta_title":764,"meta_description":764,"canonical":764,"related_terms":1979},"ShareTM","The shared translation memory at Localazy.","ShareTM is the shared translation memory used by the Localazy user community. You can enable SharedTM to cut down on translation costs across the many languages available.\n\n> [*Learn more about ShareTM in the documentation*](\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-sharetm)","sharetm",[1980,1981],{"id":147,"slug":333},{"id":286,"slug":1982},"intm",{"id":1984,"status":8,"owner":1882,"created_on":1985,"title":1986,"excerpt":1987,"content":1988,"slug":1989,"meta_title":7,"meta_description":7,"canonical":7,"related_terms":1990},114,"2022-03-17T12:22:57.000Z","Nette","Nette is a popular framework for PHP web development.","Nette Framework is a popular tool for PHP web development. It was designed to be easily usable and developer-friendly to help collaborate effectively in teams and meet the specific needs of today's software development.\n\nSecurity and performance are important considerations in choosing a PHP framework, and Nette Framework takes care of most issues, such as safety traps like XSS and CSRF.\n\nNette Framework is a high-quality, highly flexible, open-source web framework with many advanced features and comes with several helpful libraries you can include in any PHP codebase, including WordPress and others. These independent components can be used in combination with other frameworks or codebases. \n\nThe framework has been [rated as the 3rd most popular](http:\u002F\u002Fwww.sitepoint.com\u002Fbest-php-framework-2015-sitepoint-survey-results\u002F) in the world, and by some, Nette was considered a breath of fresh air in the world of PHP frameworks.\n\n## Further reading\n- [Official website](https:\u002F\u002Fnette.org\u002F)","nette",[],"Have you ever heard of Nette Framework? You might not be familiar with the name, but this PHP framework is prevalent in the Czech and Slovak PHP developer communities. Learn how to translate Nette apps with Localazy!","\u003Cp>The whole Nette and its standalone sub-components are PHP 8 ready; thus, the project is alive and is actively developed and maintained. There are many ambitious projects built on Nette Framework that have already spread out behind the Czech borders, to name some: \u003Ca href=\"https:\u002F\u002Fwww.rohlik.cz\u002F\">\u003Cstrong>Rohlík\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>, \u003C\u002Fstrong>\u003Ca href=\"https:\u002F\u002Fwww.zasilkovna.cz\u002F\">\u003Cstrong>Zásilkovna\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>, or \u003C\u002Fstrong>\u003Ca href=\"https:\u002F\u002Fcdn77.jobs\u002F\">\u003Cstrong>CDN77\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>.\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>These three examples are only a needle in a haystack of companies who had to overcome all the challenges and struggles that the inevitable \u003Ca href=\"\u002Fdictionary\u002Finternationalization\">internationalization \u003C\u002Fa>process comes with. Can we do it any easier? We believe so; that's why we created \u003Cstrong>Localazy.\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Localazy features a pro-active review process, highly accurate translation memory supported by community-shared translations, \u003Ca href=\"\u002Fdictionary\u002Fmachine-translation\">machine translations\u003C\u002Fa> and professional translation services, and a simple, very intuitive UI. Thanks to that, managing translation strings, even with open-source projects where anybody can contribute (with varying quality), is a piece of cake 🍰.\u003C\u002Fp>\u003Cp>This article will walk you through all the steps necessary to create a \u003Ca href=\"\u002Fdictionary\u002Fnette\">Nette \u003C\u002Fa>application, integrate one of the \u003Ca href=\"https:\u002F\u002Fcontributte.org\u002F\">Nette Community's\u003C\u002Fa> internationalization packages, and use Localazy to localize the application.\u003C\u002Fp>\u003Cblockquote>Most importantly, to not diverge from the main topic, I'll focus on core concepts of internationalization using the \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> plugin for Nette and how Localazy can help; not Nette Framework itself nor visual styling concepts.\u003C\u002Fblockquote>\u003Ch2 id=\"tldr\">💨 TL;DR  \u003Ca class=\"markdownit-header-anchor\" href=\"#tldr\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cul>\u003Cli>set up and run a \u003Ca href=\"https:\u002F\u002Fnette.org\u002Fen\u002F\">Nette\u003C\u002Fa> project example\u003C\u002Fli>\u003Cli>install and set up a localization plugin called \u003Ccode>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcontributte\u002Ftranslation\">contributte\u002Ftranslation\u003C\u002Fa>\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>prepare templates for translations using the \u003Ca href=\"\u002Fneon\">NEON\u003C\u002Fa> file format\u003C\u002Fli>\u003Cli>implement an easy language switcher\u003C\u002Fli>\u003Cli>sign up for Localazy\u003C\u002Fli>\u003Cli>install Localazy CLI\u003C\u002Fli>\u003Cli>create the \u003Ccode>localazy.json\u003C\u002Fcode> file in the project root and fill in the \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fquick-start-neon\">configuration\u003C\u002Fa>, with modified \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fupload-reference\">upload\u003C\u002Fa> needs\u003C\u002Fli>\u003Cli>upload extracted language files by running \u003Ccode>localazy upload\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>in Localazy, add any language(s), translate, review...\u003C\u002Fli>\u003Cli>update your project of new locales with \u003Ccode>localazy download\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>create a new presenter including phrases in ICU Plurals notation\u003C\u002Fli>\u003Cli>update \u003Ccode>localazy.json\u003C\u002Fcode> configuration to fit our modified \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fdownload-reference\">download\u003C\u002Fa> needs, including a \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Ftransformations\">transformation\u003C\u002Fa>\u003C\u002Fli>\u003Cli>upload, translate and download plural strings\u003C\u002Fli>\u003Cli>Voilà 🎉\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"set-up-a-new-nette-project\">🕹️ Set up a new Nette project \u003Ca class=\"markdownit-header-anchor\" href=\"#set-up-a-new-nette-project\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Let's create a new Nette 3.1 web project, following steps from the \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fquickstart\u002Fgetting-started\">quick start\u003C\u002Fa>. Make sure you have composer installed on your machine. If not, use these \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fcomposer\">guidelines\u003C\u002Fa> to set it up. Then, open a terminal, navigate to any desired location and run the following command:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">composer create-project nette\u002Fweb-project nette-i18n-example              \u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌You can name the project whatever you like, here I used \u003Ccode>nette-i18n-example\u003C\u002Fcode>. It's also important to ensure that your PHP environment is at least in a 7.2 version, it is a \u003Ca href=\"https:\u002F\u002Fnette.org\u002Fen\u002Fmaintenance\">compatibility requirement\u003C\u002Fa> when using Nette 3.1.‌‌‌‌ \u003C\u002Fp>\u003Cp>Next, let's try if everything worked out well and we can run the project sample. Navigate into the \u003Ccode>www\u003C\u002Fcode> folder (in the terminal window or using your \u003Ca href=\"\u002Fdictionary\u002Fintegrated-development-kit-ide\">IDE\u003C\u002Fa> terminal). Run the in-built PHP CLI web server in the folder, using:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">php -S localhost:2222\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>This will start localhost server, serving from \u003Ccode>www\u003C\u002Fcode> folder on port \u003Ccode>2222\u003C\u002Fcode> (you can choose any allowed and free port number you like). Open your browser and go to \u003Ccode>http:\u002F\u002Flocahost:2222\u003C\u002Fcode>. If you followed all the previous steps correctly, you should see the screen below:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png\" class=\"kg-image\" alt=\"Clean Nette web project\" loading=\"lazy\" width=\"2000\" height=\"1272\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Clean Nette web project\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Great, we've just set up a new sample project!\u003C\u002Fp>\u003Ch2 id=\"set-up-the-localization-plugin\">🎌 Set up the localization plugin \u003Ca class=\"markdownit-header-anchor\" href=\"#set-up-the-localization-plugin\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Now, we will install and set up a \u003Ca href=\"\u002Fdictionary\u002Flocalization\">localization \u003C\u002Fa>plugin that will handle locale switching and read string resources from our translations files. There's a couple of localization plugins for Nette.\u003C\u002Fp>\u003Cp>You can find a list of these plugins on \u003Ca href=\"https:\u002F\u002Fcomponette.org\u002Fsearch\u002Flocalization\">Componette #localization\u003C\u002Fa>. One of them, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKdyby\u002FTranslation\">Kdyby\u002FTranslation\u003C\u002Fa>, which integrates \u003Ca href=\"https:\u002F\u002Fsymfony.com\u002Fdoc\u002Fcurrent\u002Ftranslation.html\">Symfony\u002FTranslation\u003C\u002Fa> into Nette Framework, is widely used, although unfortunately not being developed anymore (at the time of writing this post, the latest known release was in September 2019).\u003C\u002Fp>\u003Cp>That's the reason why we will use \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcontributte\u002Ftranslation\">Contributte\u002FTranslation\u003C\u002Fa>. ‌‌‌‌Even though Contributte\u002FTranslation has fewer stars ⭐ on Github, the project is more than five years younger (the first stable release was in March 2019), and the number of installations is almost 650k lower compared to the previously mentioned one (at the time of writing this post), I can recommend using the plugin. Why?\u003C\u002Fp>\u003Cul>\u003Cli>it's developed and maintained\u003C\u002Fli>\u003Cli>works with the same localization library as Kdyby\u002FTranslation (plugin is a wrapper of Symfony\u002FTranslation); thus, the implementation is very similar\u003C\u002Fli>\u003Cli>Contributte\u002FTranslation creator is really helpful in answering questions and resolving issues quickly (credits to \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faleswita\">Aleš Wita\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Ff3l1x.io\u002F\">Milan F3l1x Šulc\u003C\u002Fa> for helping)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>So in the next step, install the plugin:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">composer require contributte\u002Ftranslation\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, we have to set the plugin up. Open a configuration file named \u003Ccode>common.neon\u003C\u002Fcode> and register the plugin using the \u003Ccode>extensions\u003C\u002Fcode> block like this:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">...\nextensions:\n    translation: Contributte\\Translation\\DI\\TranslationExtension\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>config\u002Fcommon.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Open the \u003Ccode>local.neon\u003C\u002Fcode>  file and insert the following configuration:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">translation:\n    locales:\n        whitelist: [en, cs, sk, pl] # supported locales\n        default: en # default locale\n        # fallback: [en] # fallback locale\n    dirs: # directories containing locale files\n        - %appDir%\u002Flang\u002Fhomepage\n        - %appDir%\u002Flang\u002Fcommon\n    returnOriginalMessage: false\n    localeResolvers:\n        - Contributte\\Translation\\LocalesResolvers\\Router\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>config\u002Flocal.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>The purpose of keys is described in the code snippet comments above. I've commented the \u003Ccode>fallback\u003C\u002Fcode> key out because I would like to see the untranslated keys during the development phase.\u003C\u002Fp>\u003Cp>As we would definitely like to keep the order in our locale files, we will keep those files in subdirectories. If \u003Ccode>returnOriginalMessage\u003C\u002Fcode> is set to \u003Ccode>true\u003C\u002Fcode>, it returns a message (string) in \u003Ccode>default\u003C\u002Fcode> language if we choose one of the whitelisted (\u003Ccode>whitelist\u003C\u002Fcode>) languages and our message is not translated, in other case it returns a string resource key name.\u003C\u002Fp>\u003Cp>A ‌part called \u003Ccode>localeResolvers\u003C\u002Fcode> instructs the extension on how to resolve current locale and the order in which it will do so. There are four available resolvers.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-NEON\">localeResolvers:\n    # Locale passed as URL parameter\n    - Contributte\\Translation\\LocalesResolvers\\Router\n    # Locale passed as HTTP header\n    - Contributte\\Translation\\LocalesResolvers\\Header\n    # Locale passed as URL query\n    - Contributte\\Translation\\LocalesResolvers\\Parameter\n    # Locale passed in a session\n    - Contributte\\Translation\\LocalesResolvers\\Session\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This order would give the \u003Ccode>Router\u003C\u002Fcode> resolvers the highest priority, following \u003Ccode>Header\u003C\u002Fcode>, \u003Ccode>Parameter\u003C\u002Fcode> and \u003Ccode>Session\u003C\u002Fcode> in descending order. In our example, we will be using only \u003Ccode>Router\u003C\u002Fcode> locale resolver (as you may have noticed). \u003C\u002Fp>\u003Cp>Use whatever locale resolver fits your needs, it's completely up to you, although some of the following steps will differ a bit. \u003C\u002Fp>\u003Cblockquote>‌‌One more note: By default the \u003Ccode>Router\u003C\u002Fcode>, \u003Ccode>Parameter\u003C\u002Fcode>, and \u003Ccode>Session\u003C\u002Fcode> resolvers expect the name of the parameter\u002Fkey to be \u003Ccode>locale\u003C\u002Fcode>.\u003C\u002Fblockquote>\u003Cp>In the next step, we have to update our \u003Ccode>RouterFactory\u003C\u002Fcode> class. We need the Nette router to take the \u003Ccode>locale\u003C\u002Fcode> parameter so the app can recognize what the current locale is.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-PHP\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Router;\n\nuse Nette;\nuse Nette\\Application\\Routers\\RouteList;\nuse Nette\\Routing\\Route;\n\n\nfinal class RouterFactory\n{\n    use Nette\\StaticClass;\n\n    public static function createRouter(): RouteList\n    {\n        $router = new RouteList;\n        $router-&gt;addRoute('&lt;locale&gt;\u002F&lt;presenter&gt;\u002F&lt;action&gt;[\u002F&lt;id&gt;]', [\n            'presenter' =&gt; 'Homepage',\n            'action' =&gt; 'default',\n            'id' =&gt; null,\n            'locale' =&gt; [\n                Route::FILTER_TABLE =&gt; [\n                    'cs' =&gt; 'cs',\n                    'sk' =&gt; 'sk',\n                    'pl' =&gt; 'pl',\n                    'en' =&gt; 'en'\n                ]\n            ]\n        ]);\n        return $router;\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FRouter\u002FRouterFactory.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>This router setup matches our localhost URLs like \u003Ccode>http:\u002F\u002Flocalhost:2222\u002Fen\u002F\u003C\u002Fcode> or \u003Ccode>http:\u002F\u002Flocalhost:2222\u002Fcs\u002Fplurals\u002Ftest\u003C\u002Fcode> (as we will see in the latter steps of this tutorial). By adding a \u003Ccode>Route::FILTER_TABLE\u003C\u002Fcode>-keyed array we can force the translation plugin to map the \u003Ccode>locale\u003C\u002Fcode> name in a route to an internal locale name (might be useful in certain situations). \u003C\u002Fp>\u003Cp>We do not want to use this functionality, therefore we will keep the locale shortcuts the same (or we could also completely omit this block as I just wanted to demonstrate the option).\u003C\u002Fp>\u003Cp>Great job! We've just set the \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> plugin up!\u003C\u002Fp>\u003Ch2 id=\"prepare-templates-for-translations\">📃 Prepare templates for translations \u003Ca class=\"markdownit-header-anchor\" href=\"#prepare-templates-for-translations\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>In this step, we will \u003Ca href=\"\u002Fdictionary\u002Fexternalized-string\">externalize the strings\u003C\u002Fa> by extracting all the string resources into files that will serve as locale files. Remember when we configured our directories that will contain locale files?\u003C\u002Fp>\u003Cp>Just a reminder, it's \u003Ccode>%appDir%\u002Flang\u002Fhomepage\u003C\u002Fcode> and \u003Ccode>%appDir%\u002Flang\u002Fcommon\u003C\u002Fcode>. Create these directories in a project folder tree.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.22.06.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"342\" height=\"194\">\u003Cfigcaption>Directories meant to contain locale files\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, open the \u003Cem>Homepage default\u003C\u002Fem> template. It's in \u003Ccode>app\u002FPresenters\u002Ftemplates\u002FHomepage\u003C\u002Fcode> folder. The content of this file will look a lot alike this:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-latte\">{* This is the welcome page, you can delete it *}\n{block content}\n&lt;div id=\"banner\"&gt;\n    &lt;h1 n:block=title&gt;Congratulations!&lt;\u002Fh1&gt;\n&lt;\u002Fdiv&gt;\n&lt;div id=\"content\"&gt;\n    &lt;h2&gt;\n        You have successfully created your\n        &lt;a href=\"https:\u002F\u002Fnette.org\"&gt;Nette&lt;\u002Fa&gt; Web project.\n    &lt;\u002Fh2&gt;\n    &lt;p&gt;\n        &lt;img src=\"...\" alt=\"\"&gt;\n        If you are exploring Nette for the first time, you should read\n        the &lt;a href=\"https:\u002F\u002Fdoc.nette.org\u002Fquickstart\"&gt;Quick Start&lt;\u002Fa&gt;,\n        &lt;a href=\"https:\u002F\u002Fdoc.nette.org\"&gt;documentation&lt;\u002Fa&gt;,\n        &lt;a href=\"https:\u002F\u002Fblog.nette.org\"&gt;blog&lt;\u002Fa&gt; and\n        &lt;a href=\"https:\u002F\u002Fforum.nette.org\"&gt;forum&lt;\u002Fa&gt;.\n    &lt;\u002Fp&gt; \n    &lt;h2&gt;We hope you enjoy Nette!&lt;\u002Fh2&gt;\n&lt;\u002Fdiv&gt;\n&lt;style&gt;\n    ...\n&lt;\u002Fstyle&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002Ftemplates\u002FHomepage\u002Fdefault.latte\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>As I've already mentioned, our goal is to take all the strings and put them into separate files. As English is our source language, create a file called \u003Ccode>locale.\u003Cstrong>en\u003C\u002Fstrong>.neon\u003C\u002Fcode> in the previously created \u003Ccode>app\u002Flang\u002Fhomepage\u003C\u002Fcode> folder (if Spanish was a source language, for instance, we would create \u003Ccode>locale.es.neon\u003C\u002Fcode> file). \u003C\u002Fp>\u003Cp>Copy strings one by one into the locale file and assign them a key. Then, replace strings in the template with the key wrapped in a \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Ftranslations#toc-template-translation\">underscore tag\u003C\u002Fa> notation (\u003Ccode>{_locale_key}\u003C\u002Fcode>). After finishing this step, both should look similar to the snippets below.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">congratulations: \"Congratulations!\"\nwe_hope_you_enjoy_nette: \"We hope you enjoy Nette!\"\ndocs_links_paragraph: \"If you are exploring Nette for the first time, you should read the &lt;a href='https:\u002F\u002Fdoc.nette.org\u002Fquickstart'&gt;Quick Start&lt;\u002Fa&gt;, &lt;a href='https:\u002F\u002Fdoc.nette.org'&gt;documentation&lt;\u002Fa&gt;, &lt;a href='https:\u002F\u002Fblog.nette.org'&gt;blog&lt;\u002Fa&gt; and &lt;a href='https:\u002F\u002Fforum.nette.org'&gt;forum&lt;\u002Fa&gt;.\"\nweb_project_successfully_created: \"You have successfully created your %project% Web project.\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002Flang\u002Fhomepage\u002Flocale.en.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-latte\">{* This is the welcome page, you can delete it *}\n\n{block content}\n&lt;div id=\"banner\"&gt;\n    &lt;h1 n:block=title&gt;{_locale.congratulations}&lt;\u002Fh1&gt;\n&lt;\u002Fdiv&gt;\n\n&lt;div id=\"content\"&gt;\n    &lt;h2&gt;\n        {_locale.web_project_successfully_created, [\n            'project' =&gt; '&lt;a href=\"https:\u002F\u002Fnette.org\"&gt;Nette&lt;\u002Fa&gt;',\n        ]|noescape}\n    &lt;\u002Fh2&gt;\n\n    &lt;p&gt;\n        &lt;img src=\"...\" alt=\"\"&gt;\n        {_locale.docs_links_paragraph|noescape}\n    &lt;\u002Fp&gt;\n\n    &lt;h2&gt;{_locale.we_hope_you_enjoy_nette}&lt;\u002Fh2&gt;\n&lt;\u002Fdiv&gt;\n\n&lt;style&gt;\n\t...\n&lt;\u002Fstyle&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002Ftemplates\u002FHomepage\u002Fdefault.latte\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Let's take a further look at both snippets as there's a couple of important things related to localization we've just used that don't necessarily have to be clear. In the string resource key-named \u003Ccode>web_project_successfully_created\u003C\u002Fcode> of the NEON file, we've used a variable placeholder notation. \u003C\u002Fp>\u003Cp>In NEON files, placeholders are recognizable with starting and ending \u003Ccode>%\u003C\u002Fcode> signs, containing a placeholder name in between, in our case it is a \u003Ccode>%project%\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>In the template file, we passed a variable called \u003Ccode>project\u003C\u002Fcode> containing a value into the extracted string mentioned before. All of this is done using an array as a second argument of the underscore tag notation. This is how this pairing works using \u003Ca href=\"https:\u002F\u002Flatte.nette.org\">latte templating engine\u003C\u002Fa> and NEON. We've also used the \u003Ccode>noescape\u003C\u002Fcode> \u003Ca href=\"https:\u002F\u002Flatte.nette.org\u002Fen\u002Ffilters\">filter\u003C\u002Fa>, which disables automatic escaping so the HTML tags are actually rendered and not printed as a text.\u003C\u002Fp>\u003Cblockquote>Do not ever use the \u003Ccode>noescape\u003C\u002Fcode> filter for any untrusted user's input, as it can potentionally lead to XSS attack vulnerabilities.\u003C\u002Fblockquote>\u003Cp>Good job! Now, let's see how the project looks in the browser. Refresh the page - oops! What has just happened? We can see an exception thrown with \u003Cem>No route for HTTP request\u003C\u002Fem> information.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1272\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>No route for HTTP request\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌It makes sense though, this is a completely legit behavior. We've changed our \u003Ccode>RouterFactory\u003C\u002Fcode> to match URLs containing the locale identifier. Update the URL to \u003Ccode>localhost:2222\u002Fen\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1272\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Missing translations\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Why don't we see our strings loaded from the \u003Ccode>locale.en.neon\u003C\u002Fcode> file? Why are we seeing only the keys? Let's check what is really happening here. Nette includes a debugging tool called \u003Ca href=\"https:\u002F\u002Ftracy.nette.org\u002Fen\u002F\">Tracy\u003C\u002Fa>. \u003C\u002Fp>\u003Cp>If we take a look at the expanded \u003Ca href=\"https:\u002F\u002Ftracy.nette.org\u002Fen\u002Fguide#toc-tracy-bar\">Tracy Bar\u003C\u002Fa> (a section containing \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> settings), we can see that we're missing four translations and have loaded no resources files at all. In-built Nette caching mechanisms are the reason. To resolve this problem, delete \u003Ccode>temp\u002Fcache\u003C\u002Fcode> directory located in the project and reload the page in the browser.\u003C\u002Fp>\u003Cblockquote>As I used Nette over the years, I've experienced the \"caching problem\" many times during the development, not only when translating. Deleting cached files helped in the vast majority of problem occurrences.\u003C\u002Fblockquote>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"928\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Contributte\u002FTranslation Tracy Bar Tool\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Great! We can see that string resources are correctly loaded from the locale file. Using Tracy Bar, we can also notice that there's one loaded resource file and that we're using Router as our locale resolver. There's also a translator setting. From this point onwards, if anything goes wrong, you can always check this bar for any cues that might lead to resolving a problem.\u003C\u002Fp>\u003Ch2 id=\"implement-an-easy-language-switcher\">🧭 Implement an easy language switcher \u003Ca class=\"markdownit-header-anchor\" href=\"#implement-an-easy-language-switcher\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>It would be great to have an option to change the locale of our web application another way than just re-typing the URL parameter manually every time. We will create a simple language switcher. You can then style it using your custom CSS.\u003C\u002Fp>\u003Cp>Go to \u003Ccode>@layout.latte\u003C\u002Fcode> template file. This file serves as a \u003Ca href=\"https:\u002F\u002Flatte.nette.org\u002Fen\u002Ftemplate-inheritance#toc-layout-inheritance\">layout\u003C\u002Fa> file and defines an HTML skeleton document. Update the content:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-latte\">...\n&lt;body&gt;\n    &lt;div n:foreach=\"$flashes as $flash\" n:class=\"flash, $flash-&gt;type\"&gt;\n        {$flash-&gt;message}\n    &lt;\u002Fdiv&gt;\n\n    &lt;ul&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:en\"&gt;\n                English ({_locale.english})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:cs\"&gt;\n                Česky ({_locale.czech})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:sk\"&gt;\n                Slovensky ({_locale.slovakian})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:pl\"&gt;\n                Polski ({_locale.polish})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n    &lt;\u002Ful&gt;\n\n    {include content}\n    ...\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002Ftemplates\u002F@layout.latte\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Notice how the links are being built. We use the \u003Ccode>\u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.0\u002Fcreating-links#toc-in-the-presenter-template\">n:href\u003C\u002Fa>\u003C\u002Fcode> helper to create a link, pointing to \u003Ccode>this\u003C\u002Fcode> (same URL we're currently at), passing a \u003Ccode>locale\u003C\u002Fcode> URL parameter (we defined in the \u003Ccode>RouterFactory\u003C\u002Fcode> in one of the earlier steps), set to a value describing the desired locale.\u003C\u002Fp>\u003Cp>You probably already know what to do now - we have to define resources keys in NEON file. As layout serves as a common part of the application, we've already proactively created the \u003Ccode>common\u003C\u002Fcode> directory, where we will address all of the common string resources. Create a \u003Ccode>locale.en.neon\u003C\u002Fcode> file in that directory with the following content:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">english: English\nczech: Czech\nslovak: Slovak\npolish: Polish                \u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002Flang\u002Fcommon\u002Flocale.en.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Apply our recently described cache deleting process and reload the page.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"938\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>An easy language switcher implemented\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Great! We can click on links a couple of times to confirm that language switching works - take a look at Translator Tracy Bar changes.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"992\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translator Tracy Bar when English is used\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"1454\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translator Tracy Bar when Polish is used\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now that the language switching is implemented, it's time to add translations using Localazy!\u003C\u002Fp>\u003Ch2 id=\"integration-with-localazy\">🚩 Integration with Localazy \u003Ca class=\"markdownit-header-anchor\" href=\"#integration-with-localazy\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>This is the part where we can start benefiting from features that Localazy offers. In any project, we certainly do not want to manually handle things that can be automated. The manual approach is error-prone, tedious, and takes a long time. And localization is undoubtedly one of the things that you can automate.\u003C\u002Fp>\u003Cp>Go to the \u003Ca href=\"\u002Fregister\">Localazy signup\u003C\u002Fa> page or \u003Ca href=\"\u002Flogin\">login\u003C\u002Fa> (if you have already joined our community). Then, create a new app. We can leave it as public so other contributors can freely help with translating our app. \u003C\u002Fp>\u003Cp>Select English as the source language (generally, of course, you can use any other). Also, enable the \u003Cem>Use community translations (\u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-sharetm\">ShareTM\u003C\u002Fa>) \u003C\u002Fem>option to get some strings translated automatically by Localazy.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1153\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Create new app screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌The app is created. As you can see on the integration screen, Localazy supports a plethora of \u003Ca href=\"\u002Fintegrations\">integrations\u003C\u002Fa> and file formats! Scroll down and choose \u003Ca href=\"\u002Fneon\">NEON\u003C\u002Fa>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1153\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Integrations screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, we see the integration instructions screen. If you haven't used Localazy before, you need to install a \u003Ca href=\"\u002Fdocs\u002Fcli\u002Finstallation\">CLI tool\u003C\u002Fa> on your machine to be able to interact with Localazy in an automated way.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">npm install -g @localazy\u002Fcli\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Then, create a configuration file named \u003Ccode>localazy.json\u003C\u002Fcode> in the root folder of your project. Also, paste \u003Cem>writeKey\u003C\u002Fem> and \u003Cem>readKey\u003C\u002Fem> from step 2 of the integration guide page.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-JSON\">{\n    \"writeKey\": \"&lt;your-write-key&gt;\",\n    \"readKey\": \"&lt;your-read-key&gt;\",\n    \"upload\": {\n    \t\"type\": \"neon\",\n        \"files\": [\n            {\n                \"pattern\": \"app\u002Flang\u002F**\u002Flocale.en.neon\",\n                \"lang\": \"inherited\",\n                \"path\": \"${path}\"\n            }\n        ]\n    },\n    \"download\": {\n    \t\"files\": \"${path}\u002Flocale.${lang}.neon\"\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy.json\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>You may have noticed, that in the snippet above I just haven't blindly copied a sample that's provided on the integration page. Why? Because we have our locale files in a different directories.\u003C\u002Fp>\u003Cblockquote>More details on all available options of upload section are available in \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fupload-reference\">documentation\u003C\u002Fa>.\u003C\u002Fblockquote>\u003Cp>Now, it's finally time to upload our source language strings to Localazy. Navigate the terminal to the project root folder and run the following command:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">localazy upload -s\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Great! We’ve just simulated (\u003Ccode>-s\u003C\u002Fcode> stands for simulate) the upload without actually uploading anything. It is a good practice to test out the configuration to make sure that nothing unexpected occurs. In case of any warnings\u002Ferrors, CLI would output a log describing a problem to help you determine the problem and fix it faster. Let's upload language strings for real!\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">localazy upload\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Files were successfully transferred. In the Localazy app, hit the \u003Cem>NEXT STEP\u003C\u002Fem> button to proceed. Our app is ready! According to the instructions, refresh your browser window. Click on the \u003Cem>MANAGE SOURCE\u003C\u002Fem> button. List of uploaded source strings should be displayed.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Recording-2021-08-10-at-10.50.13-1.gif\" class=\"kg-image\" alt loading=\"lazy\" width=\"2878\" height=\"1566\">\u003C\u002Ffigure>\u003Cp>Go back, click \u003Cem>ADD LANGUAGES\u003C\u002Fem> tab and add the languages we've defined in our Nette web application. It was Czech, Slovak, and Polish.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Recording-2021-08-10-at-10.54.35-2.gif\" class=\"kg-image\" alt loading=\"lazy\" width=\"2878\" height=\"1566\">\u003Cfigcaption>Translations overview screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>You may see most of the strings translated, just waiting for your review. The automated matching with ShareTM improves all the time, and it's likely that thanks to this article (but not only), you would have all the strings automatically translated. That's one of the many powers of Localazy.\u003C\u002Fp>\u003C!--kg-card-begin: html-->\u003Cdiv class=\"markdown-it-vue-alter markdown-it-vue-alter-info\">\u003Ci class=\"markdown-it-vue-alert-icon markdown-it-vue-alert-icon-info\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"64 64 896 896\" data-icon=\"info-circle\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" class=\"\">\u003Cpath d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z\">\u003C\u002Fpath>\u003C\u002Fsvg>\u003C\u002Fi>\u003Cp>Some parts of this article might not be accurate. This article mentions the ShareTM feature, which we've updated later. Learn more about the \u003Ca href=\"\u002Fblog\u002Ffeature-update-sharetm-improvements\">Localazy ShareTM improvements in this article\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C!--kg-card-end: html-->\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1860\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translation screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1166\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>ShareTM &amp; Machine Translation suggestions\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Review suggestions and translate our strings. Localazy automatically shows you possible versions and suggestions. Also, the Amazon Machine Translation Engine result is at your disposal to help you with translations for free.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"939\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translations overview screen (all translated and approved)\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Good job. All strings are translated and translations approved. Now, we have to download them back to the web project.‌\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">localazy download\u003C\u002Fcode>\u003C\u002Fpre>\u003Cblockquote>‌Note that we can also simulate a download first by typing \u003Ccode>localazy download -s\u003C\u002Fcode>\u003C\u002Fblockquote>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.23.31.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"456\" height=\"488\">\u003Cfigcaption>Locale files in a project file tree\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Everything went well. When you look into the project file tree, you should see that we have six new files containing translations we've just made in Localazy. Now, delete the cache again and reload the page. Voilà!\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"938\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Polish translation\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"1486\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translator Tracy Bar when Polish is used\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Check our well-known screens to confirm everything was loaded correctly. It works like a charm!\u003C\u002Fp>\u003Ch2 id=\"theres-one-more-thing-plurals-and-selects\">⚠️ There's one more thing - plurals and selects \u003Ca class=\"markdownit-header-anchor\" href=\"#theres-one-more-thing-plurals-and-selects\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Processing plurals is one of the most complex things when localizing applications. Imagine handling all of the possible variants of plurals for each of the world's languages - that can really be a challenge.\u003C\u002Fp>\u003Cp>Fortunately, Localazy knows them all and makes translating completely intuitive. You can read more on that topic in \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Ftranslating-plurals\">How to translate plurals\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>First, let's create a new presenter in the \u003Ccode>app\u002FPresenters\u003C\u002Fcode> folder - name it, for example, \u003Ccode>PluralsPresenter\u003C\u002Fcode>. We've already demonstrated how to use translations in templates, this time, we'll use translator directly in a presenter.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-PHP\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Presenters;\n\nuse Nette;\n\nfinal class PluralsPresenter extends Nette\\Application\\UI\\Presenter\n{\n    \u002F** @var Nette\\Localization\\ITranslator @inject *\u002F\n\tpublic $translator;\n\n    public function renderDefault() {\n        $data = [];\n        $this-&gt;sendJson($data);\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002FPluralsPresenter.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, when we navigate to \u003Ccode>localhost:2222\u002Fen\u002Fplurals\u003C\u002Fcode> in the browser, we see just empty square brackets \u003Ccode>[]\u003C\u002Fcode> printed out. In the presenter code example, we've also injected a \u003Ccode>ITranslator\u003C\u002Fcode> dependency.\u003C\u002Fp>\u003Cblockquote>More on dependency injection usage in Nette can be found in \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fdi-usage\">DI: Getting Dependencies\u003C\u002Fa>.\u003C\u002Fblockquote>\u003Cp>Because \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> plugin is based on Symfony's translation rules, we must define \u003Ca href=\"\u002Fdictionary\u002Ficu\">ICU\u003C\u002Fa> messages using \u003Ca href=\"https:\u002F\u002Fsymfony.com\u002Fdoc\u002Fcurrent\u002Ftranslation\u002Fmessage_format.html\">this approach\u003C\u002Fa>. To use the ICU Message Format, the file containing message has to be suffixed with \u003Ccode>+intl-icu\u003C\u002Fcode>. Knowing this convention, create a file \u003Ccode>app\u002Flang\u002Fplurals\u002Flocale+intl-icu.en.neon\u003C\u002Fcode> with the following content:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">num_of_apples: \"{apples, plural, one {There is one apple...} other {There are # apples!}}\"\nusers: \"We have {count, plural, one {one user named {user_name}} other {# users named {user_name}}}.\"\nbaby_gender: \"{gender, select, girl {It's a girl!} boy {It's a boy!} other {It's something else!}}\"\norganizer_gender: \"{organizer_gender, select, female {{organizer_name} has invited you for her party!} male {{organizer_name} has invited you for his party!} other {{organizer_name} have invited you for their party!}}\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002Flangs\u002Fplurals\u002Flocale+intl-icu.en.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>We've defined two plurals respecting the English plural types (defining \u003Ccode>one\u003C\u002Fcode>, \u003Ccode>other\u003C\u002Fcode>). On top of that, to show you that Localazy handles it all, there are two more ICU select notations named \u003Ccode>baby_gender\u003C\u002Fcode> and \u003Ccode>organizer_gender\u003C\u002Fcode>. Let's try to send the strings as a JSON response. Modify our presenter:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-PHP\">...\npublic function renderDefault() {\n        $t = $this-&gt;translator;\n        $data = [\n            'num_of_apples_0' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 0]\n            ),\n            'num_of_apples_1' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 1]\n            ),\n            'num_of_apples_3' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 3]\n            ),\n            'num_of_apples_9' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 9]\n            ),\n            \n            'users_0' =&gt;  $t-&gt;translate('locale.users', [\n                'count' =&gt; 0,\n                'user_name' =&gt; 'Joe',\n            ]),\n            'users_5' =&gt;  $t-&gt;translate('locale.users', [\n                'count' =&gt; 5,\n                'user_name' =&gt; 'Joe',\n            ]),\n\n            'baby_gender_girl' =&gt;  $t-&gt;translate(\n                'locale.baby_gender', ['gender' =&gt; 'girl']\n            ),\n            'baby_gender_boy' =&gt;  $t-&gt;translate(\n                'locale.baby_gender', ['gender' =&gt; 'boy']\n            ),\n            'baby_gender_other' =&gt;  $t-&gt;translate(\n                'locale.baby_gender', ['gender' =&gt; 'other']\n            ),\n\n            'organizer_female' =&gt;  $t-&gt;translate(\n                'locale.organizer_gender', [\n                'organizer_gender' =&gt; 'female',\n                'organizer_name' =&gt; 'Miley'\n            ]),\n            'organizer_male' =&gt;  $t-&gt;translate(\n                'locale.organizer_gender', [\n                'organizer_gender' =&gt; 'male',\n                'organizer_name' =&gt; 'Kyle'\n            ]),\n            'organizer_other' =&gt;  $t-&gt;translate(\n                'locale.organizer_gender', [\n                'organizer_gender' =&gt; 'other',\n                'organizer_name' =&gt; 'Daniel'\n            ]),\n        ];\n    $this-&gt;sendJson($data);\n}\n...\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002FPlurals\u002FPluralsPresenter.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Also, keep in mind that we have to register the \u003Ccode>app\u002Flang\u002Fplurals\u003C\u002Fcode> directory in \u003Ccode>local.neon\u003C\u002Fcode> configuration file:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">dirs: # directories containing locale files\n    - %appDir%\u002Flang\u002Fhomepage\n    - %appDir%\u002Flang\u002Fcommon\n    - %appDir%\u002Flang\u002Fplurals\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>config\u002Flocal.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Refresh the browser (don't possibly forget to delete the cache). If you reproduced all of my steps, you should see a JSON response similar to mine.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1674\" height=\"1024\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 1674w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>ICU messages JSON response\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Let's dig into modifying our setup now. We need to tweak it a bit to make everything work correctly. Open \u003Ccode>localazy.json\u003C\u002Fcode> config file. We need to update both the \u003Cem>upload\u003C\u002Fem> and \u003Cem>download\u003C\u002Fem> sections:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-json\">...\n\"upload\": {\n        \"type\": \"neon\",\n        \"files\": [\n            {\n                \"pattern\": \"app\u002Flang\u002F**\u002Flocale.en.neon\",\n                \"lang\": \"inherited\",\n                \"path\": \"${path}\"\n            },\n            {\n                \"pattern\": \"app\u002Flang\u002F**\u002Flocale+intl-icu.en.neon\",\n                \"lang\": \"inherited\",\n                \"path\": \"${path}\"\n            }\n        ],\n        \"features\": [\n            \"plural_icu\"\n        ]\n    },\n    \"download\": {\n        \"files\": \"${path}\u002F${fileNameWithoutExtension}.${lang}.neon\"\n    },\n    \"transformations\": [\n        {\n            \"name\": \"fileNameWithoutExtension\",\n            \"source\": \"${file}\",\n            \"operations\": [\n                \"substringBefore: .\"\n            ]\n        }\n    ]\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy.json\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>We now provide not only \u003Ccode>locale.${lang}.neon\u003C\u002Fcode> files, but also \u003Ccode>locale+intl-icu.${lang}.neon\u003C\u002Fcode> source files. That's why we had to add this pattern into the \u003Ccode>upload.files\u003C\u002Fcode> section to tell Localazy to process these files as well. ‌‌But our \u003Ccode>download\u003C\u002Fcode> section also needs to be changed. \u003C\u002Fp>\u003Cp>We have to map a correct file name while downloading translations to the form that Nette translation plugin requires. That's why there's a \u003Ca href=\"\u002Fdocs\u002Fcli\u002Ftransformations\">transformation\u003C\u002Fa> written in the config file. Use \u003Ccode>\u003Ca href=\"\u002Fdocs\u002Fcli\u002Ftransformations#substringbefore\">substringBefore\u003C\u002Fa>\u003C\u002Fcode> to obtain the file name without the extension as a variable, so we can use it to help us build the correct file name.\u003C\u002Fp>\u003Cblockquote>There's a \u003Ca href=\"https:\u002F\u002Fdiscuss.localazy.com\u002Ft\u002Fhave-a-variable-of-filename-without-extension-1\u002F89\">thread\u003C\u002Fa> on the \u003Ca href=\"https:\u002F\u002Fdiscuss.localazy.com\">Localazy Discuss forum\u003C\u002Fa> that helped me resolve this problem. You can discuss and help each other with app localization. You can also report bugs, add new features ideas and more...\u003C\u002Fblockquote>\u003Cp>Localazy CLI consists of lots of optional features. In this example, we are using the ICU Message Format to parse plurals. To tell Localazy that we actually want to parse ICU plurals, we have to provide this in \u003Ccode>upload.features\u003C\u002Fcode> section. Each of the supported file format can have it's own specific features, in our case everything is described in the \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fneon-format#defined-using-icu\">NEON format documentation\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>We are ready to upload the ICU messages into Localazy. Use \u003Ccode>localazy upload\u003C\u002Fcode> again to transfer new changes. When we switch to Localazy user interface now, we see that the language completion status has changed and that there are more strings ready to be translated.\u003C\u002Fp>\u003Cblockquote>\u003Cstrong>Little cutaway\u003C\u002Fstrong>: One thing that can also be really helpful and where Localazy rules is the \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files\">File management\u003C\u002Fa>. You can click on the File management button to see what we have uploaded. If you click on the file name, you can see the phrases contained in the file. You can also perform various actions on files and file content.\u003C\u002Fblockquote>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"933\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>File management - files overview\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1003\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>File management - file detail\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, get back to translations and translate our plurals. We can see that Localazy translation screen is adapted to plurals for the current language being translated. \u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1171\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translating plurals using Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Practically, that means, that forms \u003Ccode>one\u003C\u002Fcode> and \u003Ccode>other\u003C\u002Fcode> from English were automatically mapped into Slovak \u003Ccode>one\u003C\u002Fcode>, \u003Ccode>few\u003C\u002Fcode> and \u003Ccode>other\u003C\u002Fcode> plural forms. It just feels so natural translating plurals using Localazy!\u003C\u002Fp>\u003Cp>Localazy also recognizes various formats of placeholders, that can sometimes be quite hard to recognize for a non-technical person or someone without a decent experience with localization. Thanks to Localazy, you will never lose a piece of information that you need to keep in the same format.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"947\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translation ICU select using Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Finish translating all languages and then type \u003Ccode>localazy download\u003C\u002Fcode> again to transfer newly translated phrases into our application. We can see three new files, containing our ICU translations. Now, after deleting the cache and trying locales by changing the URL in the browser, the translated JSON response is being returned.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1674\" height=\"1024\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 1674w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>ICU messages JSON response in Czech\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"closing-words\">✔️ Closing words \u003Ca class=\"markdownit-header-anchor\" href=\"#closing-words\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>This article demonstrated how to use Localazy, Nette framework, and Contributte\u002FTranslation plugin to localize a web application. Localazy is a powerful tool that makes translating various applications (not only Nette!) faster, easier, error-proof, and more fun.\u003C\u002Fp>\u003Cp>Now, you can \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flocalazy\u002Fnette-i18n-example\">download the repository\u003C\u002Fa> with this example project to explore it or \u003Ca href=\"\u002Fregister\">start localizing apps\u003C\u002Fa> on your own!\u003C\u002Fp>\u003Cp>Feel free to join us at \u003Ca href=\"http:\u002F\u002Fdiscuss.localazy.com\u002F\">discuss.localazy.com\u003C\u002Fa>. Share ideas with other developers, discuss feedback and new concepts, and comment on new features of Localazy as we add them.\u003C\u002Fp>",{"id":244,"status":8,"created_on":1994,"modified_on":1995,"icon":1996,"header":1997,"description":1998,"button_label":1999,"link":2000},"2022-03-17T12:23:03.000Z","2026-05-25T10:38:47.000Z","member","Why developers love Localazy 💖","From mobile apps to SaaS platforms. See how product teams handle translations without slowing down development.\n","See case studies","case-study",{"slug":1866,"id":1859,"uuid":2002,"title":1865,"html":2003,"comment_id":1859,"feature_image":1869,"featured":17,"visibility":2004,"email_recipient_filter":2005,"created_at":2006,"updated_at":1867,"published_at":1868,"custom_excerpt":1991,"codeinjection_head":2007,"codeinjection_foot":7,"custom_template":7,"canonical_url":7,"authors":2008,"tags":2014,"primary_author":2081,"primary_tag":2082,"url":2083,"excerpt":1991,"reading_time":175,"access":17,"send_email_when_published":15,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"email_subject":7,"frontmatter":7,"dictionary":1880,"cta":1993,"plainTags":1870},"b0f0c5ab-be85-485b-a625-013cdc2277d7","\u003Cp>The whole Nette and its standalone sub-components are PHP 8 ready; thus, the project is alive and is actively developed and maintained. There are many ambitious projects built on Nette Framework that have already spread out behind the Czech borders, to name some: \u003Ca href=\"https:\u002F\u002Fwww.rohlik.cz\u002F\">\u003Cstrong>Rohlík\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>, \u003C\u002Fstrong>\u003Ca href=\"https:\u002F\u002Fwww.zasilkovna.cz\u002F\">\u003Cstrong>Zásilkovna\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>, or \u003C\u002Fstrong>\u003Ca href=\"https:\u002F\u002Fcdn77.jobs\u002F\">\u003Cstrong>CDN77\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>.\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>These three examples are only a needle in a haystack of companies who had to overcome all the challenges and struggles that the inevitable \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Finternationalization\">internationalization \u003C\u002Fa>process comes with. Can we do it any easier? We believe so; that's why we created \u003Cstrong>Localazy.\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Localazy features a pro-active review process, highly accurate translation memory supported by community-shared translations, \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Fmachine-translation\">machine translations\u003C\u002Fa> and professional translation services, and a simple, very intuitive UI. Thanks to that, managing translation strings, even with open-source projects where anybody can contribute (with varying quality), is a piece of cake 🍰.\u003C\u002Fp>\u003Cp>This article will walk you through all the steps necessary to create a \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Fnette\">Nette \u003C\u002Fa>application, integrate one of the \u003Ca href=\"https:\u002F\u002Fcontributte.org\u002F\">Nette Community's\u003C\u002Fa> internationalization packages, and use Localazy to localize the application.\u003C\u002Fp>\u003Cblockquote>Most importantly, to not diverge from the main topic, I'll focus on core concepts of internationalization using the \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> plugin for Nette and how Localazy can help; not Nette Framework itself nor visual styling concepts.\u003C\u002Fblockquote>\u003Ch2 id=\"%F0%9F%92%A8-tldr\">💨 TL;DR \u003C\u002Fh2>\u003Cul>\u003Cli>set up and run a \u003Ca href=\"https:\u002F\u002Fnette.org\u002Fen\u002F\">Nette\u003C\u002Fa> project example\u003C\u002Fli>\u003Cli>install and set up a localization plugin called \u003Ccode>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcontributte\u002Ftranslation\">contributte\u002Ftranslation\u003C\u002Fa>\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>prepare templates for translations using the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fneon\">NEON\u003C\u002Fa> file format\u003C\u002Fli>\u003Cli>implement an easy language switcher\u003C\u002Fli>\u003Cli>sign up for Localazy\u003C\u002Fli>\u003Cli>install Localazy CLI\u003C\u002Fli>\u003Cli>create the \u003Ccode>localazy.json\u003C\u002Fcode> file in the project root and fill in the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fquick-start-neon\">configuration\u003C\u002Fa>, with modified \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fupload-reference\">upload\u003C\u002Fa> needs\u003C\u002Fli>\u003Cli>upload extracted language files by running \u003Ccode>localazy upload\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>in Localazy, add any language(s), translate, review...\u003C\u002Fli>\u003Cli>update your project of new locales with \u003Ccode>localazy download\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>create a new presenter including phrases in ICU Plurals notation\u003C\u002Fli>\u003Cli>update \u003Ccode>localazy.json\u003C\u002Fcode> configuration to fit our modified \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fdownload-reference\">download\u003C\u002Fa> needs, including a \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Ftransformations\">transformation\u003C\u002Fa>\u003C\u002Fli>\u003Cli>upload, translate and download plural strings\u003C\u002Fli>\u003Cli>Voilà 🎉\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"%F0%9F%95%B9%EF%B8%8F-set-up-a-new-nette-project\">🕹️ Set up a new Nette project\u003C\u002Fh2>\u003Cp>Let's create a new Nette 3.1 web project, following steps from the \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fquickstart\u002Fgetting-started\">quick start\u003C\u002Fa>. Make sure you have composer installed on your machine. If not, use these \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fcomposer\">guidelines\u003C\u002Fa> to set it up. Then, open a terminal, navigate to any desired location and run the following command:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">composer create-project nette\u002Fweb-project nette-i18n-example              \u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌You can name the project whatever you like, here I used \u003Ccode>nette-i18n-example\u003C\u002Fcode>. It's also important to ensure that your PHP environment is at least in a 7.2 version, it is a \u003Ca href=\"https:\u002F\u002Fnette.org\u002Fen\u002Fmaintenance\">compatibility requirement\u003C\u002Fa> when using Nette 3.1.‌‌‌‌ \u003C\u002Fp>\u003Cp>Next, let's try if everything worked out well and we can run the project sample. Navigate into the \u003Ccode>www\u003C\u002Fcode> folder (in the terminal window or using your \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Fintegrated-development-kit-ide\">IDE\u003C\u002Fa> terminal). Run the in-built PHP CLI web server in the folder, using:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">php -S localhost:2222\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>This will start localhost server, serving from \u003Ccode>www\u003C\u002Fcode> folder on port \u003Ccode>2222\u003C\u002Fcode> (you can choose any allowed and free port number you like). Open your browser and go to \u003Ccode>http:\u002F\u002Flocahost:2222\u003C\u002Fcode>. If you followed all the previous steps correctly, you should see the screen below:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png\" class=\"kg-image\" alt=\"Clean Nette web project\" loading=\"lazy\" width=\"2000\" height=\"1272\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.15.20-1.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Clean Nette web project\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Great, we've just set up a new sample project!\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%8E%8C-set-up-the-localization-plugin\">🎌 Set up the localization plugin\u003C\u002Fh2>\u003Cp>Now, we will install and set up a \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Flocalization\">localization \u003C\u002Fa>plugin that will handle locale switching and read string resources from our translations files. There's a couple of localization plugins for Nette.\u003C\u002Fp>\u003Cp>You can find a list of these plugins on \u003Ca href=\"https:\u002F\u002Fcomponette.org\u002Fsearch\u002Flocalization\">Componette #localization\u003C\u002Fa>. One of them, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKdyby\u002FTranslation\">Kdyby\u002FTranslation\u003C\u002Fa>, which integrates \u003Ca href=\"https:\u002F\u002Fsymfony.com\u002Fdoc\u002Fcurrent\u002Ftranslation.html\">Symfony\u002FTranslation\u003C\u002Fa> into Nette Framework, is widely used, although unfortunately not being developed anymore (at the time of writing this post, the latest known release was in September 2019).\u003C\u002Fp>\u003Cp>That's the reason why we will use \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcontributte\u002Ftranslation\">Contributte\u002FTranslation\u003C\u002Fa>. ‌‌‌‌Even though Contributte\u002FTranslation has fewer stars ⭐ on Github, the project is more than five years younger (the first stable release was in March 2019), and the number of installations is almost 650k lower compared to the previously mentioned one (at the time of writing this post), I can recommend using the plugin. Why?\u003C\u002Fp>\u003Cul>\u003Cli>it's developed and maintained\u003C\u002Fli>\u003Cli>works with the same localization library as Kdyby\u002FTranslation (plugin is a wrapper of Symfony\u002FTranslation); thus, the implementation is very similar\u003C\u002Fli>\u003Cli>Contributte\u002FTranslation creator is really helpful in answering questions and resolving issues quickly (credits to \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faleswita\">Aleš Wita\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Ff3l1x.io\u002F\">Milan F3l1x Šulc\u003C\u002Fa> for helping)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>So in the next step, install the plugin:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">composer require contributte\u002Ftranslation\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, we have to set the plugin up. Open a configuration file named \u003Ccode>common.neon\u003C\u002Fcode> and register the plugin using the \u003Ccode>extensions\u003C\u002Fcode> block like this:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">...\nextensions:\n    translation: Contributte\\Translation\\DI\\TranslationExtension\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>config\u002Fcommon.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Open the \u003Ccode>local.neon\u003C\u002Fcode>  file and insert the following configuration:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">translation:\n    locales:\n        whitelist: [en, cs, sk, pl] # supported locales\n        default: en # default locale\n        # fallback: [en] # fallback locale\n    dirs: # directories containing locale files\n        - %appDir%\u002Flang\u002Fhomepage\n        - %appDir%\u002Flang\u002Fcommon\n    returnOriginalMessage: false\n    localeResolvers:\n        - Contributte\\Translation\\LocalesResolvers\\Router\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>config\u002Flocal.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>The purpose of keys is described in the code snippet comments above. I've commented the \u003Ccode>fallback\u003C\u002Fcode> key out because I would like to see the untranslated keys during the development phase.\u003C\u002Fp>\u003Cp>As we would definitely like to keep the order in our locale files, we will keep those files in subdirectories. If \u003Ccode>returnOriginalMessage\u003C\u002Fcode> is set to \u003Ccode>true\u003C\u002Fcode>, it returns a message (string) in \u003Ccode>default\u003C\u002Fcode> language if we choose one of the whitelisted (\u003Ccode>whitelist\u003C\u002Fcode>) languages and our message is not translated, in other case it returns a string resource key name.\u003C\u002Fp>\u003Cp>A ‌part called \u003Ccode>localeResolvers\u003C\u002Fcode> instructs the extension on how to resolve current locale and the order in which it will do so. There are four available resolvers.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-NEON\">localeResolvers:\n    # Locale passed as URL parameter\n    - Contributte\\Translation\\LocalesResolvers\\Router\n    # Locale passed as HTTP header\n    - Contributte\\Translation\\LocalesResolvers\\Header\n    # Locale passed as URL query\n    - Contributte\\Translation\\LocalesResolvers\\Parameter\n    # Locale passed in a session\n    - Contributte\\Translation\\LocalesResolvers\\Session\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This order would give the \u003Ccode>Router\u003C\u002Fcode> resolvers the highest priority, following \u003Ccode>Header\u003C\u002Fcode>, \u003Ccode>Parameter\u003C\u002Fcode> and \u003Ccode>Session\u003C\u002Fcode> in descending order. In our example, we will be using only \u003Ccode>Router\u003C\u002Fcode> locale resolver (as you may have noticed). \u003C\u002Fp>\u003Cp>Use whatever locale resolver fits your needs, it's completely up to you, although some of the following steps will differ a bit. \u003C\u002Fp>\u003Cblockquote>‌‌One more note: By default the \u003Ccode>Router\u003C\u002Fcode>, \u003Ccode>Parameter\u003C\u002Fcode>, and \u003Ccode>Session\u003C\u002Fcode> resolvers expect the name of the parameter\u002Fkey to be \u003Ccode>locale\u003C\u002Fcode>.\u003C\u002Fblockquote>\u003Cp>In the next step, we have to update our \u003Ccode>RouterFactory\u003C\u002Fcode> class. We need the Nette router to take the \u003Ccode>locale\u003C\u002Fcode> parameter so the app can recognize what the current locale is.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-PHP\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Router;\n\nuse Nette;\nuse Nette\\Application\\Routers\\RouteList;\nuse Nette\\Routing\\Route;\n\n\nfinal class RouterFactory\n{\n    use Nette\\StaticClass;\n\n    public static function createRouter(): RouteList\n    {\n        $router = new RouteList;\n        $router-&gt;addRoute('&lt;locale&gt;\u002F&lt;presenter&gt;\u002F&lt;action&gt;[\u002F&lt;id&gt;]', [\n            'presenter' =&gt; 'Homepage',\n            'action' =&gt; 'default',\n            'id' =&gt; null,\n            'locale' =&gt; [\n                Route::FILTER_TABLE =&gt; [\n                    'cs' =&gt; 'cs',\n                    'sk' =&gt; 'sk',\n                    'pl' =&gt; 'pl',\n                    'en' =&gt; 'en'\n                ]\n            ]\n        ]);\n        return $router;\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FRouter\u002FRouterFactory.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>This router setup matches our localhost URLs like \u003Ccode>http:\u002F\u002Flocalhost:2222\u002Fen\u002F\u003C\u002Fcode> or \u003Ccode>http:\u002F\u002Flocalhost:2222\u002Fcs\u002Fplurals\u002Ftest\u003C\u002Fcode> (as we will see in the latter steps of this tutorial). By adding a \u003Ccode>Route::FILTER_TABLE\u003C\u002Fcode>-keyed array we can force the translation plugin to map the \u003Ccode>locale\u003C\u002Fcode> name in a route to an internal locale name (might be useful in certain situations). \u003C\u002Fp>\u003Cp>We do not want to use this functionality, therefore we will keep the locale shortcuts the same (or we could also completely omit this block as I just wanted to demonstrate the option).\u003C\u002Fp>\u003Cp>Great job! We've just set the \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> plugin up!\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%93%83-prepare-templates-for-translations\">📃 Prepare templates for translations\u003C\u002Fh2>\u003Cp>In this step, we will \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Fexternalized-string\">externalize the strings\u003C\u002Fa> by extracting all the string resources into files that will serve as locale files. Remember when we configured our directories that will contain locale files?\u003C\u002Fp>\u003Cp>Just a reminder, it's \u003Ccode>%appDir%\u002Flang\u002Fhomepage\u003C\u002Fcode> and \u003Ccode>%appDir%\u002Flang\u002Fcommon\u003C\u002Fcode>. Create these directories in a project folder tree.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.22.06.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"342\" height=\"194\">\u003Cfigcaption>Directories meant to contain locale files\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, open the \u003Cem>Homepage default\u003C\u002Fem> template. It's in \u003Ccode>app\u002FPresenters\u002Ftemplates\u002FHomepage\u003C\u002Fcode> folder. The content of this file will look a lot alike this:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-latte\">{* This is the welcome page, you can delete it *}\n{block content}\n&lt;div id=\"banner\"&gt;\n    &lt;h1 n:block=title&gt;Congratulations!&lt;\u002Fh1&gt;\n&lt;\u002Fdiv&gt;\n&lt;div id=\"content\"&gt;\n    &lt;h2&gt;\n        You have successfully created your\n        &lt;a href=\"https:\u002F\u002Fnette.org\"&gt;Nette&lt;\u002Fa&gt; Web project.\n    &lt;\u002Fh2&gt;\n    &lt;p&gt;\n        &lt;img src=\"...\" alt=\"\"&gt;\n        If you are exploring Nette for the first time, you should read\n        the &lt;a href=\"https:\u002F\u002Fdoc.nette.org\u002Fquickstart\"&gt;Quick Start&lt;\u002Fa&gt;,\n        &lt;a href=\"https:\u002F\u002Fdoc.nette.org\"&gt;documentation&lt;\u002Fa&gt;,\n        &lt;a href=\"https:\u002F\u002Fblog.nette.org\"&gt;blog&lt;\u002Fa&gt; and\n        &lt;a href=\"https:\u002F\u002Fforum.nette.org\"&gt;forum&lt;\u002Fa&gt;.\n    &lt;\u002Fp&gt; \n    &lt;h2&gt;We hope you enjoy Nette!&lt;\u002Fh2&gt;\n&lt;\u002Fdiv&gt;\n&lt;style&gt;\n    ...\n&lt;\u002Fstyle&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002Ftemplates\u002FHomepage\u002Fdefault.latte\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>As I've already mentioned, our goal is to take all the strings and put them into separate files. As English is our source language, create a file called \u003Ccode>locale.\u003Cstrong>en\u003C\u002Fstrong>.neon\u003C\u002Fcode> in the previously created \u003Ccode>app\u002Flang\u002Fhomepage\u003C\u002Fcode> folder (if Spanish was a source language, for instance, we would create \u003Ccode>locale.es.neon\u003C\u002Fcode> file). \u003C\u002Fp>\u003Cp>Copy strings one by one into the locale file and assign them a key. Then, replace strings in the template with the key wrapped in a \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Ftranslations#toc-template-translation\">underscore tag\u003C\u002Fa> notation (\u003Ccode>{_locale_key}\u003C\u002Fcode>). After finishing this step, both should look similar to the snippets below.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">congratulations: \"Congratulations!\"\nwe_hope_you_enjoy_nette: \"We hope you enjoy Nette!\"\ndocs_links_paragraph: \"If you are exploring Nette for the first time, you should read the &lt;a href='https:\u002F\u002Fdoc.nette.org\u002Fquickstart'&gt;Quick Start&lt;\u002Fa&gt;, &lt;a href='https:\u002F\u002Fdoc.nette.org'&gt;documentation&lt;\u002Fa&gt;, &lt;a href='https:\u002F\u002Fblog.nette.org'&gt;blog&lt;\u002Fa&gt; and &lt;a href='https:\u002F\u002Fforum.nette.org'&gt;forum&lt;\u002Fa&gt;.\"\nweb_project_successfully_created: \"You have successfully created your %project% Web project.\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002Flang\u002Fhomepage\u002Flocale.en.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-latte\">{* This is the welcome page, you can delete it *}\n\n{block content}\n&lt;div id=\"banner\"&gt;\n    &lt;h1 n:block=title&gt;{_locale.congratulations}&lt;\u002Fh1&gt;\n&lt;\u002Fdiv&gt;\n\n&lt;div id=\"content\"&gt;\n    &lt;h2&gt;\n        {_locale.web_project_successfully_created, [\n            'project' =&gt; '&lt;a href=\"https:\u002F\u002Fnette.org\"&gt;Nette&lt;\u002Fa&gt;',\n        ]|noescape}\n    &lt;\u002Fh2&gt;\n\n    &lt;p&gt;\n        &lt;img src=\"...\" alt=\"\"&gt;\n        {_locale.docs_links_paragraph|noescape}\n    &lt;\u002Fp&gt;\n\n    &lt;h2&gt;{_locale.we_hope_you_enjoy_nette}&lt;\u002Fh2&gt;\n&lt;\u002Fdiv&gt;\n\n&lt;style&gt;\n\t...\n&lt;\u002Fstyle&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002Ftemplates\u002FHomepage\u002Fdefault.latte\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Let's take a further look at both snippets as there's a couple of important things related to localization we've just used that don't necessarily have to be clear. In the string resource key-named \u003Ccode>web_project_successfully_created\u003C\u002Fcode> of the NEON file, we've used a variable placeholder notation. \u003C\u002Fp>\u003Cp>In NEON files, placeholders are recognizable with starting and ending \u003Ccode>%\u003C\u002Fcode> signs, containing a placeholder name in between, in our case it is a \u003Ccode>%project%\u003C\u002Fcode>.\u003C\u002Fp>\u003Cp>In the template file, we passed a variable called \u003Ccode>project\u003C\u002Fcode> containing a value into the extracted string mentioned before. All of this is done using an array as a second argument of the underscore tag notation. This is how this pairing works using \u003Ca href=\"https:\u002F\u002Flatte.nette.org\">latte templating engine\u003C\u002Fa> and NEON. We've also used the \u003Ccode>noescape\u003C\u002Fcode> \u003Ca href=\"https:\u002F\u002Flatte.nette.org\u002Fen\u002Ffilters\">filter\u003C\u002Fa>, which disables automatic escaping so the HTML tags are actually rendered and not printed as a text.\u003C\u002Fp>\u003Cblockquote>Do not ever use the \u003Ccode>noescape\u003C\u002Fcode> filter for any untrusted user's input, as it can potentionally lead to XSS attack vulnerabilities.\u003C\u002Fblockquote>\u003Cp>Good job! Now, let's see how the project looks in the browser. Refresh the page - oops! What has just happened? We can see an exception thrown with \u003Cem>No route for HTTP request\u003C\u002Fem> information.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1272\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.26.02.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>No route for HTTP request\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌It makes sense though, this is a completely legit behavior. We've changed our \u003Ccode>RouterFactory\u003C\u002Fcode> to match URLs containing the locale identifier. Update the URL to \u003Ccode>localhost:2222\u002Fen\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1272\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.28.40.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Missing translations\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Why don't we see our strings loaded from the \u003Ccode>locale.en.neon\u003C\u002Fcode> file? Why are we seeing only the keys? Let's check what is really happening here. Nette includes a debugging tool called \u003Ca href=\"https:\u002F\u002Ftracy.nette.org\u002Fen\u002F\">Tracy\u003C\u002Fa>. \u003C\u002Fp>\u003Cp>If we take a look at the expanded \u003Ca href=\"https:\u002F\u002Ftracy.nette.org\u002Fen\u002Fguide#toc-tracy-bar\">Tracy Bar\u003C\u002Fa> (a section containing \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> settings), we can see that we're missing four translations and have loaded no resources files at all. In-built Nette caching mechanisms are the reason. To resolve this problem, delete \u003Ccode>temp\u002Fcache\u003C\u002Fcode> directory located in the project and reload the page in the browser.\u003C\u002Fp>\u003Cblockquote>As I used Nette over the years, I've experienced the \"caching problem\" many times during the development, not only when translating. Deleting cached files helped in the vast majority of problem occurrences.\u003C\u002Fblockquote>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"928\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.31.45.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Contributte\u002FTranslation Tracy Bar Tool\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Great! We can see that string resources are correctly loaded from the locale file. Using Tracy Bar, we can also notice that there's one loaded resource file and that we're using Router as our locale resolver. There's also a translator setting. From this point onwards, if anything goes wrong, you can always check this bar for any cues that might lead to resolving a problem.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%A7%AD-implement-an-easy-language-switcher\">🧭 Implement an easy language switcher\u003C\u002Fh2>\u003Cp>It would be great to have an option to change the locale of our web application another way than just re-typing the URL parameter manually every time. We will create a simple language switcher. You can then style it using your custom CSS.\u003C\u002Fp>\u003Cp>Go to \u003Ccode>@layout.latte\u003C\u002Fcode> template file. This file serves as a \u003Ca href=\"https:\u002F\u002Flatte.nette.org\u002Fen\u002Ftemplate-inheritance#toc-layout-inheritance\">layout\u003C\u002Fa> file and defines an HTML skeleton document. Update the content:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-latte\">...\n&lt;body&gt;\n    &lt;div n:foreach=\"$flashes as $flash\" n:class=\"flash, $flash-&gt;type\"&gt;\n        {$flash-&gt;message}\n    &lt;\u002Fdiv&gt;\n\n    &lt;ul&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:en\"&gt;\n                English ({_locale.english})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:cs\"&gt;\n                Česky ({_locale.czech})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:sk\"&gt;\n                Slovensky ({_locale.slovakian})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n        &lt;li&gt;\n            &lt;a n:href=\"this locale:pl\"&gt;\n                Polski ({_locale.polish})\n            &lt;\u002Fa&gt;\n        &lt;\u002Fli&gt;\n    &lt;\u002Ful&gt;\n\n    {include content}\n    ...\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002Ftemplates\u002F@layout.latte\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Notice how the links are being built. We use the \u003Ccode>\u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.0\u002Fcreating-links#toc-in-the-presenter-template\">n:href\u003C\u002Fa>\u003C\u002Fcode> helper to create a link, pointing to \u003Ccode>this\u003C\u002Fcode> (same URL we're currently at), passing a \u003Ccode>locale\u003C\u002Fcode> URL parameter (we defined in the \u003Ccode>RouterFactory\u003C\u002Fcode> in one of the earlier steps), set to a value describing the desired locale.\u003C\u002Fp>\u003Cp>You probably already know what to do now - we have to define resources keys in NEON file. As layout serves as a common part of the application, we've already proactively created the \u003Ccode>common\u003C\u002Fcode> directory, where we will address all of the common string resources. Create a \u003Ccode>locale.en.neon\u003C\u002Fcode> file in that directory with the following content:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">english: English\nczech: Czech\nslovak: Slovak\npolish: Polish                \u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002Flang\u002Fcommon\u002Flocale.en.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Apply our recently described cache deleting process and reload the page.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"938\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.31.03.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>An easy language switcher implemented\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Great! We can click on links a couple of times to confirm that language switching works - take a look at Translator Tracy Bar changes.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"992\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.37.47.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translator Tracy Bar when English is used\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"1454\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.38.44.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translator Tracy Bar when Polish is used\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now that the language switching is implemented, it's time to add translations using Localazy!\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%9A%A9-integration-with-localazy\">🚩 Integration with Localazy\u003C\u002Fh2>\u003Cp>This is the part where we can start benefiting from features that Localazy offers. In any project, we certainly do not want to manually handle things that can be automated. The manual approach is error-prone, tedious, and takes a long time. And localization is undoubtedly one of the things that you can automate.\u003C\u002Fp>\u003Cp>Go to the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fregister\">Localazy signup\u003C\u002Fa> page or \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Flogin\">login\u003C\u002Fa> (if you have already joined our community). Then, create a new app. We can leave it as public so other contributors can freely help with translating our app. \u003C\u002Fp>\u003Cp>Select English as the source language (generally, of course, you can use any other). Also, enable the \u003Cem>Use community translations (\u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-sharetm\">ShareTM\u003C\u002Fa>) \u003C\u002Fem>option to get some strings translated automatically by Localazy.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1153\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.42.14.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Create new app screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌The app is created. As you can see on the integration screen, Localazy supports a plethora of \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fintegrations\">integrations\u003C\u002Fa> and file formats! Scroll down and choose \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fneon\">NEON\u003C\u002Fa>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1153\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-10.43.22.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Integrations screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, we see the integration instructions screen. If you haven't used Localazy before, you need to install a \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Finstallation\">CLI tool\u003C\u002Fa> on your machine to be able to interact with Localazy in an automated way.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">npm install -g @localazy\u002Fcli\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Then, create a configuration file named \u003Ccode>localazy.json\u003C\u002Fcode> in the root folder of your project. Also, paste \u003Cem>writeKey\u003C\u002Fem> and \u003Cem>readKey\u003C\u002Fem> from step 2 of the integration guide page.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-JSON\">{\n    \"writeKey\": \"&lt;your-write-key&gt;\",\n    \"readKey\": \"&lt;your-read-key&gt;\",\n    \"upload\": {\n    \t\"type\": \"neon\",\n        \"files\": [\n            {\n                \"pattern\": \"app\u002Flang\u002F**\u002Flocale.en.neon\",\n                \"lang\": \"inherited\",\n                \"path\": \"${path}\"\n            }\n        ]\n    },\n    \"download\": {\n    \t\"files\": \"${path}\u002Flocale.${lang}.neon\"\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy.json\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>You may have noticed, that in the snippet above I just haven't blindly copied a sample that's provided on the integration page. Why? Because we have our locale files in a different directories.\u003C\u002Fp>\u003Cblockquote>More details on all available options of upload section are available in \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fupload-reference\">documentation\u003C\u002Fa>.\u003C\u002Fblockquote>\u003Cp>Now, it's finally time to upload our source language strings to Localazy. Navigate the terminal to the project root folder and run the following command:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">localazy upload -s\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Great! We’ve just simulated (\u003Ccode>-s\u003C\u002Fcode> stands for simulate) the upload without actually uploading anything. It is a good practice to test out the configuration to make sure that nothing unexpected occurs. In case of any warnings\u002Ferrors, CLI would output a log describing a problem to help you determine the problem and fix it faster. Let's upload language strings for real!\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-bash\">localazy upload\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>Terminal\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Files were successfully transferred. In the Localazy app, hit the \u003Cem>NEXT STEP\u003C\u002Fem> button to proceed. Our app is ready! According to the instructions, refresh your browser window. Click on the \u003Cem>MANAGE SOURCE\u003C\u002Fem> button. List of uploaded source strings should be displayed.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Recording-2021-08-10-at-10.50.13-1.gif\" class=\"kg-image\" alt loading=\"lazy\" width=\"2878\" height=\"1566\">\u003C\u002Ffigure>\u003Cp>Go back, click \u003Cem>ADD LANGUAGES\u003C\u002Fem> tab and add the languages we've defined in our Nette web application. It was Czech, Slovak, and Polish.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Recording-2021-08-10-at-10.54.35-2.gif\" class=\"kg-image\" alt loading=\"lazy\" width=\"2878\" height=\"1566\">\u003Cfigcaption>Translations overview screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>You may see most of the strings translated, just waiting for your review. The automated matching with ShareTM improves all the time, and it's likely that thanks to this article (but not only), you would have all the strings automatically translated. That's one of the many powers of Localazy.\u003C\u002Fp>\u003C!--kg-card-begin: html-->\u003Cdiv class=\"markdown-it-vue-alter markdown-it-vue-alter-info\">\u003Ci class=\"markdown-it-vue-alert-icon markdown-it-vue-alert-icon-info\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"64 64 896 896\" data-icon=\"info-circle\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" class=\"\">\u003Cpath d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z\">\u003C\u002Fpath>\u003C\u002Fsvg>\u003C\u002Fi>\u003Cp>Some parts of this article might not be accurate. This article mentions the ShareTM feature, which we've updated later. Learn more about the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fblog\u002Ffeature-update-sharetm-improvements\">Localazy ShareTM improvements in this article\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C!--kg-card-end: html-->\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1860\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.17.37.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translation screen\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1166\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.18.59.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>ShareTM &amp; Machine Translation suggestions\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Review suggestions and translate our strings. Localazy automatically shows you possible versions and suggestions. Also, the Amazon Machine Translation Engine result is at your disposal to help you with translations for free.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"939\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.15.25.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translations overview screen (all translated and approved)\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Good job. All strings are translated and translations approved. Now, we have to download them back to the web project.‌\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">localazy download\u003C\u002Fcode>\u003C\u002Fpre>\u003Cblockquote>‌Note that we can also simulate a download first by typing \u003Ccode>localazy download -s\u003C\u002Fcode>\u003C\u002Fblockquote>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.23.31.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"456\" height=\"488\">\u003Cfigcaption>Locale files in a project file tree\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Everything went well. When you look into the project file tree, you should see that we have six new files containing translations we've just made in Localazy. Now, delete the cache again and reload the page. Voilà!\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"938\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.30.05.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Polish translation\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1624\" height=\"1486\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-11.25.13.png 1624w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translator Tracy Bar when Polish is used\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>‌Check our well-known screens to confirm everything was loaded correctly. It works like a charm!\u003C\u002Fp>\u003Ch2 id=\"%E2%9A%A0%EF%B8%8F-theres-one-more-thingplurals-and-selects\">⚠️ There's one more thing - plurals and selects\u003C\u002Fh2>\u003Cp>Processing plurals is one of the most complex things when localizing applications. Imagine handling all of the possible variants of plurals for each of the world's languages - that can really be a challenge.\u003C\u002Fp>\u003Cp>Fortunately, Localazy knows them all and makes translating completely intuitive. You can read more on that topic in \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Ftranslating-plurals\">How to translate plurals\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>First, let's create a new presenter in the \u003Ccode>app\u002FPresenters\u003C\u002Fcode> folder - name it, for example, \u003Ccode>PluralsPresenter\u003C\u002Fcode>. We've already demonstrated how to use translations in templates, this time, we'll use translator directly in a presenter.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-PHP\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Presenters;\n\nuse Nette;\n\nfinal class PluralsPresenter extends Nette\\Application\\UI\\Presenter\n{\n    \u002F** @var Nette\\Localization\\ITranslator @inject *\u002F\n\tpublic $translator;\n\n    public function renderDefault() {\n        $data = [];\n        $this-&gt;sendJson($data);\n    }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002FPluralsPresenter.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, when we navigate to \u003Ccode>localhost:2222\u002Fen\u002Fplurals\u003C\u002Fcode> in the browser, we see just empty square brackets \u003Ccode>[]\u003C\u002Fcode> printed out. In the presenter code example, we've also injected a \u003Ccode>ITranslator\u003C\u002Fcode> dependency.\u003C\u002Fp>\u003Cblockquote>More on dependency injection usage in Nette can be found in \u003Ca href=\"https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fdi-usage\">DI: Getting Dependencies\u003C\u002Fa>.\u003C\u002Fblockquote>\u003Cp>Because \u003Ccode>Contributte\u002FTranslation\u003C\u002Fcode> plugin is based on Symfony's translation rules, we must define \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Ficu\">ICU\u003C\u002Fa> messages using \u003Ca href=\"https:\u002F\u002Fsymfony.com\u002Fdoc\u002Fcurrent\u002Ftranslation\u002Fmessage_format.html\">this approach\u003C\u002Fa>. To use the ICU Message Format, the file containing message has to be suffixed with \u003Ccode>+intl-icu\u003C\u002Fcode>. Knowing this convention, create a file \u003Ccode>app\u002Flang\u002Fplurals\u002Flocale+intl-icu.en.neon\u003C\u002Fcode> with the following content:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">num_of_apples: \"{apples, plural, one {There is one apple...} other {There are # apples!}}\"\nusers: \"We have {count, plural, one {one user named {user_name}} other {# users named {user_name}}}.\"\nbaby_gender: \"{gender, select, girl {It's a girl!} boy {It's a boy!} other {It's something else!}}\"\norganizer_gender: \"{organizer_gender, select, female {{organizer_name} has invited you for her party!} male {{organizer_name} has invited you for his party!} other {{organizer_name} have invited you for their party!}}\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002Flangs\u002Fplurals\u002Flocale+intl-icu.en.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>We've defined two plurals respecting the English plural types (defining \u003Ccode>one\u003C\u002Fcode>, \u003Ccode>other\u003C\u002Fcode>). On top of that, to show you that Localazy handles it all, there are two more ICU select notations named \u003Ccode>baby_gender\u003C\u002Fcode> and \u003Ccode>organizer_gender\u003C\u002Fcode>. Let's try to send the strings as a JSON response. Modify our presenter:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-PHP\">...\npublic function renderDefault() {\n        $t = $this-&gt;translator;\n        $data = [\n            'num_of_apples_0' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 0]\n            ),\n            'num_of_apples_1' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 1]\n            ),\n            'num_of_apples_3' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 3]\n            ),\n            'num_of_apples_9' =&gt;  $t-&gt;translate(\n                'locale.num_of_apples', ['apples' =&gt; 9]\n            ),\n            \n            'users_0' =&gt;  $t-&gt;translate('locale.users', [\n                'count' =&gt; 0,\n                'user_name' =&gt; 'Joe',\n            ]),\n            'users_5' =&gt;  $t-&gt;translate('locale.users', [\n                'count' =&gt; 5,\n                'user_name' =&gt; 'Joe',\n            ]),\n\n            'baby_gender_girl' =&gt;  $t-&gt;translate(\n                'locale.baby_gender', ['gender' =&gt; 'girl']\n            ),\n            'baby_gender_boy' =&gt;  $t-&gt;translate(\n                'locale.baby_gender', ['gender' =&gt; 'boy']\n            ),\n            'baby_gender_other' =&gt;  $t-&gt;translate(\n                'locale.baby_gender', ['gender' =&gt; 'other']\n            ),\n\n            'organizer_female' =&gt;  $t-&gt;translate(\n                'locale.organizer_gender', [\n                'organizer_gender' =&gt; 'female',\n                'organizer_name' =&gt; 'Miley'\n            ]),\n            'organizer_male' =&gt;  $t-&gt;translate(\n                'locale.organizer_gender', [\n                'organizer_gender' =&gt; 'male',\n                'organizer_name' =&gt; 'Kyle'\n            ]),\n            'organizer_other' =&gt;  $t-&gt;translate(\n                'locale.organizer_gender', [\n                'organizer_gender' =&gt; 'other',\n                'organizer_name' =&gt; 'Daniel'\n            ]),\n        ];\n    $this-&gt;sendJson($data);\n}\n...\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>app\u002FPresenters\u002FPlurals\u002FPluralsPresenter.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Also, keep in mind that we have to register the \u003Ccode>app\u002Flang\u002Fplurals\u003C\u002Fcode> directory in \u003Ccode>local.neon\u003C\u002Fcode> configuration file:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-NEON\">dirs: # directories containing locale files\n    - %appDir%\u002Flang\u002Fhomepage\n    - %appDir%\u002Flang\u002Fcommon\n    - %appDir%\u002Flang\u002Fplurals\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>config\u002Flocal.neon\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Refresh the browser (don't possibly forget to delete the cache). If you reproduced all of my steps, you should see a JSON response similar to mine.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1674\" height=\"1024\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.00.06.png 1674w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>ICU messages JSON response\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Let's dig into modifying our setup now. We need to tweak it a bit to make everything work correctly. Open \u003Ccode>localazy.json\u003C\u002Fcode> config file. We need to update both the \u003Cem>upload\u003C\u002Fem> and \u003Cem>download\u003C\u002Fem> sections:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-json\">...\n\"upload\": {\n        \"type\": \"neon\",\n        \"files\": [\n            {\n                \"pattern\": \"app\u002Flang\u002F**\u002Flocale.en.neon\",\n                \"lang\": \"inherited\",\n                \"path\": \"${path}\"\n            },\n            {\n                \"pattern\": \"app\u002Flang\u002F**\u002Flocale+intl-icu.en.neon\",\n                \"lang\": \"inherited\",\n                \"path\": \"${path}\"\n            }\n        ],\n        \"features\": [\n            \"plural_icu\"\n        ]\n    },\n    \"download\": {\n        \"files\": \"${path}\u002F${fileNameWithoutExtension}.${lang}.neon\"\n    },\n    \"transformations\": [\n        {\n            \"name\": \"fileNameWithoutExtension\",\n            \"source\": \"${file}\",\n            \"operations\": [\n                \"substringBefore: .\"\n            ]\n        }\n    ]\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy.json\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>We now provide not only \u003Ccode>locale.${lang}.neon\u003C\u002Fcode> files, but also \u003Ccode>locale+intl-icu.${lang}.neon\u003C\u002Fcode> source files. That's why we had to add this pattern into the \u003Ccode>upload.files\u003C\u002Fcode> section to tell Localazy to process these files as well. ‌‌But our \u003Ccode>download\u003C\u002Fcode> section also needs to be changed. \u003C\u002Fp>\u003Cp>We have to map a correct file name while downloading translations to the form that Nette translation plugin requires. That's why there's a \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Ftransformations\">transformation\u003C\u002Fa> written in the config file. Use \u003Ccode>\u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Ftransformations#substringbefore\">substringBefore\u003C\u002Fa>\u003C\u002Fcode> to obtain the file name without the extension as a variable, so we can use it to help us build the correct file name.\u003C\u002Fp>\u003Cblockquote>There's a \u003Ca href=\"https:\u002F\u002Fdiscuss.localazy.com\u002Ft\u002Fhave-a-variable-of-filename-without-extension-1\u002F89\">thread\u003C\u002Fa> on the \u003Ca href=\"https:\u002F\u002Fdiscuss.localazy.com\">Localazy Discuss forum\u003C\u002Fa> that helped me resolve this problem. You can discuss and help each other with app localization. You can also report bugs, add new features ideas and more...\u003C\u002Fblockquote>\u003Cp>Localazy CLI consists of lots of optional features. In this example, we are using the ICU Message Format to parse plurals. To tell Localazy that we actually want to parse ICU plurals, we have to provide this in \u003Ccode>upload.features\u003C\u002Fcode> section. Each of the supported file format can have it's own specific features, in our case everything is described in the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fneon-format#defined-using-icu\">NEON format documentation\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>We are ready to upload the ICU messages into Localazy. Use \u003Ccode>localazy upload\u003C\u002Fcode> again to transfer new changes. When we switch to Localazy user interface now, we see that the language completion status has changed and that there are more strings ready to be translated.\u003C\u002Fp>\u003Cblockquote>\u003Cstrong>Little cutaway\u003C\u002Fstrong>: One thing that can also be really helpful and where Localazy rules is the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files\">File management\u003C\u002Fa>. You can click on the File management button to see what we have uploaded. If you click on the file name, you can see the phrases contained in the file. You can also perform various actions on files and file content.\u003C\u002Fblockquote>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"933\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.16.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>File management - files overview\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1003\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.10.46.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>File management - file detail\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Now, get back to translations and translate our plurals. We can see that Localazy translation screen is adapted to plurals for the current language being translated. \u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1171\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.25.32.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translating plurals using Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Practically, that means, that forms \u003Ccode>one\u003C\u002Fcode> and \u003Ccode>other\u003C\u002Fcode> from English were automatically mapped into Slovak \u003Ccode>one\u003C\u002Fcode>, \u003Ccode>few\u003C\u002Fcode> and \u003Ccode>other\u003C\u002Fcode> plural forms. It just feels so natural translating plurals using Localazy!\u003C\u002Fp>\u003Cp>Localazy also recognizes various formats of placeholders, that can sometimes be quite hard to recognize for a non-technical person or someone without a decent experience with localization. Thanks to Localazy, you will never lose a piece of information that you need to keep in the same format.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"947\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.38.45.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Translation ICU select using Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Finish translating all languages and then type \u003Ccode>localazy download\u003C\u002Fcode> again to transfer newly translated phrases into our application. We can see three new files, containing our ICU translations. Now, after deleting the cache and trying locales by changing the URL in the browser, the translated JSON response is being returned.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1674\" height=\"1024\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F08\u002FScreen-Shot-2021-08-10-at-12.57.19.png 1674w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>ICU messages JSON response in Czech\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"%E2%9C%94%EF%B8%8F-closing-words\">✔️ Closing words\u003C\u002Fh2>\u003Cp>This article demonstrated how to use Localazy, Nette framework, and Contributte\u002FTranslation plugin to localize a web application. Localazy is a powerful tool that makes translating various applications (not only Nette!) faster, easier, error-proof, and more fun.\u003C\u002Fp>\u003Cp>Now, you can \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flocalazy\u002Fnette-i18n-example\">download the repository\u003C\u002Fa> with this example project to explore it or \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fregister\">start localizing apps\u003C\u002Fa> on your own!\u003C\u002Fp>\u003Cp>Feel free to join us at \u003Ca href=\"http:\u002F\u002Fdiscuss.localazy.com\u002F\">discuss.localazy.com\u003C\u002Fa>. Share ideas with other developers, discuss feedback and new concepts, and comment on new features of Localazy as we add them.\u003C\u002Fp>","public","none","2021-08-07T11:56:26.000+02:00","{\"intercomArticleUrl\":\"\"}",[2009],{"id":1861,"name":1862,"slug":1863,"profile_image":1864,"cover_image":7,"bio":7,"website":2010,"location":2011,"facebook":7,"twitter":2012,"meta_title":7,"meta_description":7,"url":2013},"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdavid-vaclavek\u002F","Katowice, Poland","@dave_vaclavek","https:\u002F\u002Fghost.localazy.com\u002Fauthor\u002Fdavid-vaclavek\u002F",[2015,2018,2021,2026,2029,2034,2040,2045,2050,2056,2061,2066,2071,2076],{"id":2016,"name":1873,"slug":1874,"description":7,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2017},"613703526f8ebe0001bda3c5","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fphp\u002F",{"id":2019,"name":1876,"slug":1877,"description":1876,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2020},"60a37fc7cf7b6a0001d1f0fa","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fhowto\u002F",{"id":2022,"name":2023,"slug":2024,"description":1998,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2025},"60a37fc7cf7b6a0001d1f11b","[CTA] Why developers love Localazy 💖","cta-13","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fcta-13\u002F",{"id":2027,"name":1879,"slug":1879,"description":7,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2028},"60f567ab6f8ebe0001bd80ec","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fi18n\u002F",{"id":2030,"name":2031,"slug":2032,"description":1885,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2033},"60a37fc7cf7b6a0001d1f159","[DICT] Externalized string","term-60","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-60\u002F",{"id":2035,"name":2036,"slug":2037,"description":2038,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2039},"60ba4141cf7b6a0001d1f946","[DICT] ICU","term-90","ICU stands for International Components for Unicode","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-90\u002F",{"id":2041,"name":2042,"slug":2043,"description":1926,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2044},"60a37fc7cf7b6a0001d1f16c","[DICT] Internationalization (i18n)","term-79","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-79\u002F",{"id":2046,"name":2047,"slug":2048,"description":1938,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2049},"60a37fc7cf7b6a0001d1f15c","[DICT] Integrated Development Environment (IDE)","term-63","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-63\u002F",{"id":2051,"name":2052,"slug":2053,"description":2054,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2055},"60a37fc7cf7b6a0001d1f11f","[DICT] Localization","term-2","Localization is a process of preparing a product for a particular market.","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-2\u002F",{"id":2057,"name":2058,"slug":2059,"description":1962,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2060},"60a37fc7cf7b6a0001d1f12a","[DICT] Machine translation (MT)","term-13","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-13\u002F",{"id":2062,"name":2063,"slug":2064,"description":1976,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2065},"60a37fc7cf7b6a0001d1f11e","[DICT] ShareTM","term-1","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-1\u002F",{"id":2067,"name":2068,"slug":2069,"description":7,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2070},"61a0daffdf4bcb00010bc50c","[SYNDICATE]","syndicate","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fsyndicate\u002F",{"id":2072,"name":2073,"slug":2074,"description":1987,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2075},"61d45d6bdf4bcb00010bcea2","[DICT] Nette","term-114","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-114\u002F",{"id":2077,"name":2078,"slug":2079,"description":7,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2080},"64710a2f047091000193ca3d","[INTERCOM]","intercom","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fintercom\u002F",{"id":1861,"name":1862,"slug":1863,"profile_image":1864,"cover_image":7,"bio":7,"website":2010,"location":2011,"facebook":7,"twitter":2012,"meta_title":7,"meta_description":7,"url":2013},{"id":2016,"name":1873,"slug":1874,"description":7,"feature_image":7,"visibility":2004,"og_image":7,"og_title":7,"og_description":7,"twitter_image":7,"twitter_title":7,"twitter_description":7,"meta_title":7,"meta_description":7,"codeinjection_head":7,"codeinjection_foot":7,"canonical_url":7,"accent_color":7,"url":2017},"https:\u002F\u002Fghost.localazy.com\u002Flocalize-php-nette-app-using-contributte-translation-localazy\u002F",[2085,2107,2128],{"id":2086,"owner":2087,"created_by":7,"sort":7,"title":2092,"slug":2093,"modified_on":764,"created_on":2094,"pinned":15,"badge":7,"priority":1824,"main_image":2095,"status":8,"tags":2096,"dictionary":2106,"reading_time":1835,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"6372308e04709100019374c9",{"id":2088,"first_name":2089,"last_name":764,"slug":2090,"avatar":2091},"6061ffdd2a37af00016d413d","Daniel Charvát","daniel-charvat","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fdan-1.png","Figma in Localization: Figma as a Source of Truth","figma-series-figma-as-source-of-truth","2023-02-08T20:43:55.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F01\u002FFigma-Series-3.png",[2097,2099,2100,2103],{"id":2098,"created_on":1828,"status":8,"label":545,"slug":544,"on_index_page":17},6183,{"id":319,"created_on":1828,"status":8,"label":1876,"slug":1877,"on_index_page":15},{"id":319,"created_on":1828,"status":8,"label":2101,"slug":2102,"on_index_page":17},"DevTips","devtips",{"id":278,"created_on":1828,"status":8,"label":2104,"slug":2105,"on_index_page":15},"Design","design",[],{"id":2108,"owner":2109,"created_by":7,"sort":7,"title":2114,"slug":2115,"modified_on":764,"created_on":2116,"pinned":15,"badge":7,"priority":1824,"main_image":2117,"status":8,"tags":2118,"dictionary":2127,"reading_time":1835,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"63dd1bf30470910001939f8b",{"id":2110,"first_name":2111,"last_name":764,"slug":2112,"avatar":2113},"61dc4e87df4bcb00010bd508","Mary Okosun","mary-okosun","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fokosun.png","The ultimate guide to Localazy API","the-ultimate-guide-to-localazy-api","2023-03-15T10:00:00.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F03\u002Fultimate-localazy-api-guide.png",[2119,2120,2123,2124],{"id":319,"created_on":1828,"status":8,"label":655,"slug":659,"on_index_page":15},{"id":319,"created_on":1828,"status":8,"label":2121,"slug":2122,"on_index_page":15},"Automated Localization","automated-localization",{"id":319,"created_on":1828,"status":8,"label":1876,"slug":1877,"on_index_page":15},{"id":319,"created_on":1828,"status":8,"label":2125,"slug":2126,"on_index_page":15},"Guide","guide",[],{"id":2129,"owner":2130,"created_by":7,"sort":7,"title":2135,"slug":2136,"modified_on":764,"created_on":2137,"pinned":15,"badge":7,"priority":1824,"main_image":2138,"status":8,"tags":2139,"dictionary":2143,"reading_time":1835,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"60a37fc7cf7b6a0001d1f18c",{"id":2131,"first_name":2132,"last_name":764,"slug":2133,"avatar":2134},"1","Václav Hodek","vaclav-hodek","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fvasek.png","Quick guide to Android localization with Localazy","quick-guide-to-android-localization-localazy","2022-02-09T09:00:00.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F09\u002FHow-to-lokalize-Android-app.png",[2140,2141,2142],{"id":319,"created_on":1828,"status":8,"label":466,"slug":465,"on_index_page":15},{"id":319,"created_on":1828,"status":8,"label":217,"slug":1833,"on_index_page":17},{"id":319,"created_on":1828,"status":8,"label":1876,"slug":1877,"on_index_page":15},[],{"id":26,"sort":7,"created_on":2145,"name":2146,"cta_link":2147,"banner_image":2148},"2022-03-17T12:23:14.000Z","default","https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Flocalazy-ai",{"id":2149},"72defd59-a21d-44b9-822c-4e183ca62b99"]