[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-settings":3,"main-navigation":153,"footer-homepage":836,"footer-integrations":903,"blog-post-nav-[USE LATEST FEATURED]":1814,"blog-post-nav-nav":1839,"docs-android-localazy-gradle-plugin":1851,"faq-embed:\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin:::5|10|11":2610},{"id":4,"status":5,"security_section_title":6,"loved_section_title":7,"columns":8,"social_links":113,"policy_links":143},1,"published","Secured & trusted","Loved by users",[9,28,48,74,78],{"id":4,"status":5,"sort":10,"title":11,"column_key":12,"links":13},null,"Localazy","connect",[14,18,23],{"id":15,"status":5,"sort":4,"title":16,"url":17},11,"Book a demo","___LOCALAZY_MEETING_URL___",{"id":19,"status":5,"sort":20,"title":21,"url":22},12,2,"Contact","\u002Fcontact",{"id":24,"status":5,"sort":25,"title":26,"url":27},21,3,"About us","\u002Fabout-us",{"id":20,"status":5,"sort":10,"title":29,"column_key":30,"links":31},"Programs","programs",[32,36,40,44],{"id":4,"status":5,"sort":33,"title":34,"url":35},4,"Partner Program","\u002Fpartnership",{"id":20,"status":5,"sort":37,"title":38,"url":39},5,"Ambassador Program","\u002Fambassador",{"id":25,"status":5,"sort":41,"title":42,"url":43},6,"Startup Program","\u002Ffor\u002Fstartups",{"id":33,"status":5,"sort":45,"title":46,"url":47},7,"Nonprofits","\u002Ffor\u002Fnonprofit",{"id":25,"status":5,"sort":10,"title":49,"column_key":50,"links":51},"Use Cases","use_cases",[52,56,60,64,67,70],{"id":37,"status":5,"sort":53,"title":54,"url":55},8,"Software Localization","\u002Fterm\u002Fsoftware-localization",{"id":41,"status":5,"sort":57,"title":58,"url":59},9,"Machine Translation Services","\u002Ffeatures\u002Fmachine-translation",{"id":45,"status":5,"sort":61,"title":62,"url":63},10,"Translation API","\u002Ffeatures\u002Ftranslation-api",{"id":53,"status":5,"sort":15,"title":65,"url":66},"Crowdsourced Translations","\u002Ffeatures\u002Fshare-tm",{"id":57,"status":5,"sort":19,"title":68,"url":69},"Figma i18n & localization","\u002Ffeatures\u002Ffigma-localization-plugin",{"id":61,"status":5,"sort":71,"title":72,"url":73},13,"Translation as a Service","\u002Fterm\u002Ftranslation-service",{"id":33,"status":5,"sort":10,"title":75,"column_key":76,"links":77},"Integrations","integrations",[],{"id":37,"status":5,"sort":10,"title":79,"column_key":80,"links":81},"Resources","resources",[82,86,90,94,98,102,106,110],{"id":71,"status":5,"sort":83,"title":84,"url":85},14,"Documentation","\u002Fdocs",{"id":83,"status":5,"sort":87,"title":88,"url":89},15,"Dictionary","\u002Fdictionary",{"id":87,"status":5,"sort":91,"title":92,"url":93},16,"Case Studies","\u002Fcase-study",{"id":91,"status":5,"sort":95,"title":96,"url":97},17,"Discussion forum","___DISCUSS_URL___",{"id":95,"status":5,"sort":99,"title":100,"url":101},18,"Localization Blog","\u002Fblog",{"id":99,"status":5,"sort":103,"title":104,"url":105},19,"FAQ","\u002Ffaq",{"id":103,"status":5,"sort":107,"title":108,"url":109},20,"Pricing","\u002Fpricing",{"id":107,"status":5,"sort":24,"title":111,"url":112},"Brand assets","https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1tZqsZHBlGelz7A2FwTsiwrs4j3sd9HTk",[114,119,124,129,134,139],{"id":4,"status":5,"sort":10,"platform":115,"icon":116,"url":117,"label":118},"feed","rss","\u002Ffeed.xml","Localazy RSS Feed",{"id":20,"status":5,"sort":10,"platform":120,"icon":121,"url":122,"label":123},"facebook","fb-logo","https:\u002F\u002Fwww.facebook.com\u002Flocalazy\u002F","Localazy facebook",{"id":25,"status":5,"sort":10,"platform":125,"icon":126,"url":127,"label":128},"github","github-logo","https:\u002F\u002Fgithub.com\u002Flocalazy","Localazy GitHub",{"id":33,"status":5,"sort":10,"platform":130,"icon":131,"url":132,"label":133},"x","x-twitter","https:\u002F\u002Fx.com\u002Flocalazy","Localazy X",{"id":37,"status":5,"sort":10,"platform":135,"icon":136,"url":137,"label":138},"linkedin","linkedin-logo","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002F37836599\u002F","Localazy LinkedIn",{"id":41,"status":5,"sort":10,"platform":140,"icon":141,"url":97,"label":142},"discourse","discourse-logo","Localazy Discourse",[144,147,150],{"id":4,"status":5,"sort":10,"title":145,"url":146,"action":10},"Privacy policy","\u002Fprivacy-policy",{"id":20,"status":5,"sort":10,"title":148,"url":149,"action":10},"Terms & Conditions","\u002Fterms-and-conditions",{"id":25,"status":5,"sort":10,"title":151,"url":10,"action":152},"Cookies","cookie-consent",[154,347,580,708,831,833],{"id":20,"name":155,"url":10,"url_text":10,"status":5,"groups":156},"Solutions",[157,168,239,274],{"navigation_items_group_id":158},{"id":25,"sort":37,"status":5,"name":159,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":162,"show_all_url":10,"represent_as_tile":160,"items":163},"Featured Article",false,"top",true,[164],{"collection":165,"item":166},"blog_post_navigation_item_type",{"id":33,"status":5,"sort":10,"show_author_img":162,"blog_post_tag":167,"description":10},"nav",{"navigation_items_group_id":169},{"id":37,"sort":4,"status":5,"name":170,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":171,"represent_as_tile":162,"items":172},"Your Role","\u002Froles",[173,185,195,205,216,228],{"collection":174,"item":175},"relation_navigation_item_type",{"id":4,"status":5,"sort":10,"name":176,"item":177},"CMO",[178],{"collection":179,"item":180},"personas",{"id":4,"status":5,"sort":10,"slug":181,"icon":182},"chief-marketing-officers",{"id":183,"title":184},"526097d8-176f-48e5-83d3-2fc4d77061f9","La Mail Bulk",{"collection":174,"item":186},{"id":25,"status":5,"sort":10,"name":187,"item":188},"CTO",[189],{"collection":179,"item":190},{"id":33,"status":5,"sort":10,"slug":191,"icon":192},"chief-technical-officers",{"id":193,"title":194},"f808fdf0-c78b-4294-ba59-fe25f46fe825","La Mechanic",{"collection":174,"item":196},{"id":107,"status":5,"sort":10,"name":197,"item":198},"Product Manager",[199],{"collection":179,"item":200},{"id":99,"status":5,"sort":10,"slug":201,"icon":202},"product-managers",{"id":203,"title":204},"ea39586a-21fc-4b34-ba87-496028e5198f","La Worker",{"collection":174,"item":206},{"id":207,"status":5,"sort":10,"name":208,"item":209},37,"Translator",[210],{"collection":179,"item":211},{"id":107,"status":5,"sort":10,"slug":212,"icon":213},"professional-translators",{"id":214,"title":215},"07945171-d51d-4ca8-96c0-21cde9db258f","La Chat",{"collection":174,"item":217},{"id":218,"status":5,"sort":10,"name":219,"item":220},38,"Developer",[221],{"collection":179,"item":222},{"id":223,"status":5,"sort":10,"slug":224,"icon":225},30,"software-developers",{"id":226,"title":227},"1806e46d-c551-4845-bf42-4407344d229e","La Terminal",{"collection":174,"item":229},{"id":230,"status":5,"sort":10,"name":231,"item":232},27,"Localization Manager",[233],{"collection":179,"item":234},{"id":41,"status":5,"sort":10,"slug":235,"icon":236},"localization-managers",{"id":237,"title":238},"dac69bd1-bf5d-41d0-87d4-dd13e314698a","La Language",{"navigation_items_group_id":240},{"id":57,"sort":25,"status":5,"name":241,"render_show_all_url":160,"show_all_url_position":242,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":243},"Use cases","bottom",[244,250,255,260,264,269],{"collection":245,"item":246},"simple_link_navigation_item_type",{"id":247,"status":5,"sort":10,"url":248,"url_text":249,"show_favorite_icon":160},24,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fsoftware-localization","Software localization",{"collection":245,"item":251},{"id":252,"status":5,"sort":10,"url":253,"url_text":254,"show_favorite_icon":160},26,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fmobile-app-localization","Mobile app localization",{"collection":245,"item":256},{"id":257,"status":5,"sort":10,"url":258,"url_text":259,"show_favorite_icon":160},25,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fwebsite-localization","Website localization",{"collection":245,"item":261},{"id":230,"status":5,"sort":10,"url":262,"url_text":263,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fdesign-localization","Design localization",{"collection":245,"item":265},{"id":266,"status":5,"sort":10,"url":267,"url_text":268,"show_favorite_icon":160},28,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fgame-localization","Game localization",{"collection":245,"item":270},{"id":271,"status":5,"sort":10,"url":272,"url_text":273,"show_favorite_icon":160},29,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fhelp-and-docs-localization","Help & docs localization",{"navigation_items_group_id":275},{"id":53,"sort":20,"status":5,"name":276,"render_show_all_url":160,"show_all_url_position":242,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":277},"Industry",[278,289,300,310,320,329,340],{"collection":174,"item":279},{"id":280,"status":5,"sort":10,"name":281,"item":282},23,"Digital Agencies",[283],{"collection":179,"item":284},{"id":45,"status":5,"sort":10,"slug":285,"icon":286},"digital-agencies",{"id":287,"title":288},"547f5619-b21d-4b29-86f1-8b2200313cde","La Digi Agency",{"collection":174,"item":290},{"id":291,"status":5,"sort":10,"name":292,"item":293},39,"Startups & SaaS",[294],{"collection":179,"item":295},{"id":20,"status":5,"sort":10,"slug":296,"icon":297},"startups",{"id":298,"title":299},"da1516e2-4afc-40a2-bcbf-a8161e2d610d","La Saa S",{"collection":174,"item":301},{"id":20,"status":5,"sort":10,"name":302,"item":303},"E-commerce",[304],{"collection":179,"item":305},{"id":37,"status":5,"sort":10,"slug":306,"icon":307},"e-commerce",{"id":308,"title":309},"a3d09cd2-054f-4bb5-a0a2-d3d207db65df","La Ecommerce",{"collection":174,"item":311},{"id":103,"status":5,"sort":10,"name":312,"item":313},"FinTech Platforms",[314],{"collection":179,"item":315},{"id":230,"status":5,"sort":10,"slug":316,"icon":317},"fintech",{"id":318,"title":319},"147339ba-07d1-4e5e-baad-23d27e60c919","La Money",{"collection":174,"item":321},{"id":247,"status":5,"sort":10,"name":322,"item":323},"Translation Agencies",[324],{"collection":179,"item":325},{"id":247,"status":5,"sort":10,"slug":326,"icon":327},"translation-agencies",{"id":328,"title":238},"15d6fe33-2af8-4d6e-933d-5caa64394511",{"collection":174,"item":330},{"id":331,"status":5,"sort":10,"name":332,"item":333},22,"Travel & Tourism",[334],{"collection":179,"item":335},{"id":25,"status":5,"sort":10,"slug":336,"icon":337},"tourism",{"id":338,"title":339},"23a785e8-0ae5-4c4b-8452-aab1b58182a6","La Travel",{"collection":174,"item":341},{"id":257,"status":5,"sort":10,"name":342,"item":343},"Nonprofit Causes",[344],{"collection":179,"item":345},{"id":266,"status":5,"sort":10,"slug":346,"icon":10},"nonprofit",{"id":37,"name":348,"url":10,"url_text":10,"status":5,"groups":349},"Features",[350,417,474,523],{"navigation_items_group_id":351},{"id":15,"sort":41,"status":5,"name":352,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":353},"Localization",[354,363,372,380,388,392,400,409],{"collection":174,"item":355},{"id":356,"status":5,"sort":10,"name":357,"item":358},44,"Localization services",[359],{"collection":360,"item":361},"products",{"id":57,"status":5,"slug":362},"continuous-localization-team",{"collection":174,"item":364},{"id":365,"status":5,"sort":10,"name":366,"item":367},45,"Translation management",[368],{"collection":369,"item":370},"term_landing_page",{"id":271,"status":5,"slug":371},"translation-management-system",{"collection":174,"item":373},{"id":374,"status":5,"sort":10,"name":375,"item":376},46,"Context Screenshots",[377],{"collection":360,"item":378},{"id":71,"status":5,"slug":379},"context-screenshots-ocr",{"collection":174,"item":381},{"id":382,"status":5,"sort":10,"name":383,"item":384},47,"Translation Glossary",[385],{"collection":360,"item":386},{"id":95,"status":5,"slug":387},"glossary",{"collection":245,"item":389},{"id":33,"status":5,"sort":10,"url":390,"url_text":391,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Freviewing-translations","Quality control",{"collection":174,"item":393},{"id":394,"status":5,"sort":10,"name":395,"item":396},34,"Connected Projects",[397],{"collection":360,"item":398},{"id":4,"status":5,"slug":399},"connected-projects",{"collection":174,"item":401},{"id":402,"status":5,"sort":10,"name":403,"item":404},64,"Plural handling",[405],{"collection":360,"item":406},{"id":407,"status":5,"slug":408},32,"plurals",{"collection":174,"item":410},{"id":411,"status":5,"sort":10,"name":412,"item":413},65,"Style guides",[414],{"collection":360,"item":415},{"id":218,"status":5,"slug":416},"style-guide",{"navigation_items_group_id":418},{"id":19,"sort":45,"status":5,"name":419,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":420},"Translation",[421,429,437,441,449,457,466],{"collection":174,"item":422},{"id":423,"status":5,"sort":10,"name":424,"item":425},36,"Professional translations",[426],{"collection":369,"item":427},{"id":223,"status":5,"slug":428},"professional-translation-services",{"collection":174,"item":430},{"id":431,"status":5,"sort":10,"name":432,"item":433},48,"Crowdsourced translations",[434],{"collection":360,"item":435},{"id":53,"status":5,"slug":436},"share-tm",{"collection":245,"item":438},{"id":37,"status":5,"sort":10,"url":439,"url_text":440,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings","Translation interface",{"collection":174,"item":442},{"id":443,"status":5,"sort":10,"name":444,"item":445},55,"Machine translations",[446],{"collection":360,"item":447},{"id":37,"status":5,"slug":448},"machine-translation",{"collection":174,"item":450},{"id":451,"status":5,"sort":10,"name":452,"item":453},60,"Localazy AI translation",[454],{"collection":360,"item":455},{"id":271,"status":5,"slug":456},"localazy-ai",{"collection":174,"item":458},{"id":459,"status":5,"sort":10,"name":460,"item":461},61,"Translation Memory",[462],{"collection":360,"item":463},{"id":464,"status":5,"slug":465},35,"translation-memory",{"collection":174,"item":467},{"id":468,"status":5,"sort":10,"name":469,"item":470},63,"Code & placeholders",[471],{"collection":360,"item":472},{"id":223,"status":5,"slug":473},"code-and-placeholders",{"navigation_items_group_id":475},{"id":71,"sort":53,"status":5,"name":476,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":477},"Management",[478,482,490,498,507,515,519],{"collection":245,"item":479},{"id":53,"status":5,"sort":10,"url":480,"url_text":481,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles","User roles",{"collection":174,"item":483},{"id":484,"status":5,"sort":10,"name":485,"item":486},51,"Duplicity Linking",[487],{"collection":360,"item":488},{"id":103,"status":5,"slug":489},"duplicity-linking",{"collection":174,"item":491},{"id":492,"status":5,"sort":10,"name":493,"item":494},52,"Language Permissions",[495],{"collection":360,"item":496},{"id":24,"status":5,"slug":497},"language-permissions",{"collection":174,"item":499},{"id":500,"status":501,"sort":10,"name":502,"item":503},53,"draft","Automations",[504],{"collection":360,"item":505},{"id":107,"status":5,"slug":506},"automations",{"collection":174,"item":508},{"id":509,"status":5,"sort":10,"name":510,"item":511},58,"Branching",[512],{"collection":360,"item":513},{"id":230,"status":5,"slug":514},"branching",{"collection":245,"item":516},{"id":24,"status":501,"sort":10,"url":517,"url_text":518,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fsso-configuration","SSO",{"collection":245,"item":520},{"id":331,"status":501,"sort":10,"url":521,"url_text":522,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics","Reporting",{"navigation_items_group_id":524},{"id":83,"sort":57,"status":5,"name":525,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":526},"Development",[527,533,541,548,555,563,572],{"collection":174,"item":528},{"id":271,"status":5,"sort":10,"name":62,"item":529},[530],{"collection":360,"item":531},{"id":15,"status":5,"slug":532},"translation-api",{"collection":174,"item":534},{"id":535,"status":5,"sort":10,"name":536,"item":537},33,"Localazy CLI",[538],{"collection":360,"item":539},{"id":45,"status":5,"slug":540},"cli",{"collection":174,"item":542},{"id":407,"status":5,"sort":10,"name":543,"item":544},"Language CDN",[545],{"collection":360,"item":546},{"id":33,"status":5,"slug":547},"language-cdn",{"collection":174,"item":549},{"id":266,"status":5,"sort":10,"name":550,"item":551},"Releases",[552],{"collection":360,"item":553},{"id":41,"status":5,"slug":554},"releases",{"collection":174,"item":556},{"id":557,"status":501,"sort":10,"name":558,"item":559},57,"Format Conversions",[560],{"collection":360,"item":561},{"id":20,"status":5,"slug":562},"format-conversions",{"collection":174,"item":564},{"id":565,"status":5,"sort":10,"name":566,"item":567},59,"Webhooks",[568],{"collection":360,"item":569},{"id":570,"status":5,"slug":571},31,"webhooks",{"collection":174,"item":573},{"id":574,"status":5,"sort":10,"name":575,"item":576},62,"Export Aliases",[577],{"collection":360,"item":578},{"id":535,"status":5,"slug":579},"export-aliases",{"id":33,"name":75,"url":10,"url_text":10,"status":5,"groups":581},[582,698],{"navigation_items_group_id":583},{"id":45,"sort":61,"status":5,"name":584,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":585},"Most popular",[586],{"collection":174,"item":587},{"id":19,"status":5,"sort":10,"name":75,"item":588},[589,597,604,611,618,624,631,638,645,652,659,668,675,682,690],{"collection":590,"item":591},"platforms",{"id":41,"status":5,"sort":4,"slug":592,"name":593,"icon":594},"android","Android",{"id":595,"title":596},"ff965add-53b0-44ad-b27c-ea4ef641d384","Ic Outline Android",{"collection":590,"item":598},{"id":45,"status":5,"sort":20,"slug":599,"name":600,"icon":601},"ios","iOS",{"id":602,"title":603},"886285d7-816a-4430-b5a5-edfe307b238e","Ios",{"collection":590,"item":605},{"id":535,"status":5,"sort":25,"slug":606,"name":607,"icon":608},"react","React",{"id":609,"title":610},"26757a90-88a3-4a94-b587-9f38614ed3bd","Logos React",{"collection":590,"item":612},{"id":103,"status":5,"sort":33,"slug":613,"name":614,"icon":615},"vuejs","Vue.js",{"id":616,"title":617},"6180b41f-3249-47d3-adcd-50fe1cf11bf1","Vue",{"collection":590,"item":619},{"id":91,"status":5,"sort":37,"slug":620,"name":621,"icon":622},"angular","Angular",{"id":623,"title":621},"2a31a97a-48c5-4531-aa36-41c9dd0bdbef",{"collection":590,"item":625},{"id":4,"status":5,"sort":41,"slug":626,"name":627,"icon":628},"flutter","Flutter",{"id":629,"title":630},"b9f13a11-9328-4a03-86cf-b20de0685606","Logos Flutter",{"collection":590,"item":632},{"id":25,"status":5,"sort":15,"slug":633,"name":634,"icon":635},"typescript","TypeScript",{"id":636,"title":637},"8d1319b5-8a96-4199-8407-00add3418b1f","Logos Typescript Icon",{"collection":590,"item":639},{"id":570,"status":5,"sort":19,"slug":640,"name":641,"icon":642},"javascript","JavaScript",{"id":643,"title":644},"4218d0c9-7e6b-494d-9663-37ceaf93ee8c","Logos Javascript",{"collection":590,"item":646},{"id":19,"status":5,"sort":107,"slug":647,"name":648,"icon":649},"json","JSON",{"id":650,"title":651},"99ac3b7c-dba5-4693-a4f4-1f27a6d7782d","Logos Json",{"collection":590,"item":653},{"id":24,"status":5,"sort":24,"slug":654,"name":655,"icon":656},"xliff","XLIFF",{"id":657,"title":658},"ca424cc8-e8a7-4aef-8dca-ef4a4d1334fc","Format",{"collection":590,"item":660},{"id":661,"status":5,"sort":662,"slug":663,"name":664,"icon":665},72,54,"strapi","Strapi",{"id":666,"title":667},"cde7f1d0-f2e0-4243-929e-a3f8f9146e69","Strapi Logo Purple",{"collection":590,"item":669},{"id":451,"status":5,"sort":443,"slug":670,"name":671,"icon":672},"figma","Figma",{"id":673,"title":674},"813745a4-a77d-4735-93b7-e0dd731b2304","Figma Icon",{"collection":590,"item":676},{"id":484,"status":5,"sort":382,"slug":677,"name":678,"icon":679},"microsoft-excel","Microsoft Excel",{"id":680,"title":681},"7a175955-7b96-4561-939f-a0e1924faa40","Excel",{"collection":590,"item":683},{"id":684,"status":5,"sort":459,"slug":685,"name":686,"icon":687},66,"github-actions","GitHub Actions",{"id":688,"title":689},"da17554f-ac6d-443d-9bac-1f29645ec1c6","Github Icon",{"collection":590,"item":691},{"id":692,"status":5,"sort":693,"slug":694,"name":695,"icon":696},97,999,"webflow","Webflow",{"id":697,"title":695},"ff43a386-52f8-499f-b77c-ab9a30f4a77e",{"navigation_items_group_id":699},{"id":33,"sort":15,"status":5,"name":700,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":701},"Explore more",[702],{"collection":703,"item":704},"text_link_navigation_item_type",{"id":4,"status":5,"sort":10,"text":705,"url":706,"url_text":707},"Localazy is a technology-agnostic platform supporting 50+ frameworks, file formats & popular tools.","\u002Fintegrations","See all integrations",{"id":4,"name":79,"url":10,"url_text":10,"status":5,"groups":709},[710,734,740],{"navigation_items_group_id":711},{"id":4,"sort":19,"status":5,"name":712,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":713},"Helpful Links",[714,717,719,723,725,728,730],{"collection":245,"item":715},{"id":71,"status":5,"sort":10,"url":101,"url_text":716,"show_favorite_icon":162},"Localazy Blog",{"collection":245,"item":718},{"id":83,"status":5,"sort":10,"url":85,"url_text":84,"show_favorite_icon":162},{"collection":245,"item":720},{"id":4,"status":5,"sort":10,"url":721,"url_text":722,"show_favorite_icon":160},"https:\u002F\u002Fdiscuss.localazy.com\u002F","Discussion Forum",{"collection":245,"item":724},{"id":19,"status":5,"sort":10,"url":93,"url_text":92,"show_favorite_icon":160},{"collection":245,"item":726},{"id":25,"status":5,"sort":10,"url":35,"url_text":727,"show_favorite_icon":160},"Become a Partner",{"collection":245,"item":729},{"id":87,"status":5,"sort":10,"url":105,"url_text":104,"show_favorite_icon":160},{"collection":245,"item":731},{"id":95,"status":5,"sort":10,"url":732,"url_text":733,"show_favorite_icon":160},"\u002Ftags\u002Frelease-update","Release Updates",{"navigation_items_group_id":735},{"id":20,"sort":83,"status":5,"name":716,"render_show_all_url":162,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":101,"represent_as_tile":160,"items":736},[737],{"collection":165,"item":738},{"id":25,"status":5,"sort":10,"show_author_img":160,"blog_post_tag":739,"description":10},"[USE LATEST FEATURED]",{"navigation_items_group_id":741},{"id":41,"sort":71,"status":5,"name":84,"render_show_all_url":162,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":85,"represent_as_tile":160,"items":742},[743,757,769,780,792,802,813,821],{"collection":174,"item":744},{"id":33,"status":5,"sort":10,"name":745,"item":746},"General",[747],{"collection":748,"item":749},"docs_section",{"id":20,"status":5,"sort":4,"slug":750,"name":745,"icon":751,"featured_icon":754},"general",{"id":752,"title":753},"423101f1-308c-42f1-8dfe-53272019e7cb","Global",{"id":755,"title":756},"0f7ca4cb-dc3b-4f62-b476-132ed5c4931f","General Doc",{"collection":174,"item":758},{"id":37,"status":5,"sort":10,"name":759,"item":760},"CLI",[761],{"collection":748,"item":762},{"id":25,"status":5,"sort":20,"slug":540,"name":759,"icon":763,"featured_icon":766},{"id":764,"title":765},"2f7a4573-8265-4d76-8d55-ce0cc79b8983","Cli",{"id":767,"title":768},"3f76ff7b-0e74-4046-bb03-4ca99c3b66d5","Doc Cat Cli",{"collection":174,"item":770},{"id":53,"status":5,"sort":10,"name":771,"item":772},"API",[773],{"collection":748,"item":774},{"id":107,"status":5,"sort":25,"slug":775,"name":771,"icon":776,"featured_icon":777},"api",{"id":764,"title":765},{"id":778,"title":779},"20866781-e69b-4e01-9456-05437487b75c","API Doc",{"collection":174,"item":781},{"id":782,"status":5,"sort":10,"name":783,"item":784},50,"CDN",[785],{"collection":748,"item":786},{"id":252,"status":5,"sort":33,"slug":787,"name":783,"icon":788,"featured_icon":789},"cdn",{"id":752,"title":753},{"id":790,"title":791},"a8ee9cb7-4e02-41f0-b595-eb518c3085b6","Doc Cat Cdn",{"collection":174,"item":793},{"id":41,"status":5,"sort":10,"name":593,"item":794},[795],{"collection":748,"item":796},{"id":4,"status":5,"sort":37,"slug":592,"name":593,"icon":797,"featured_icon":799},{"id":798,"title":593},"fb8329ae-0c0c-4fbc-bcdc-83f2eeda1039",{"id":800,"title":801},"f7c0dec8-5b42-4943-ab3a-e3665723ad6f","Doc Cat Android",{"collection":174,"item":803},{"id":45,"status":5,"sort":10,"name":600,"item":804},[805],{"collection":748,"item":806},{"id":33,"status":5,"sort":41,"slug":599,"name":600,"icon":807,"featured_icon":810},{"id":808,"title":809},"289e136c-55df-4d51-847b-1782a2308ee4","Ios Blue",{"id":811,"title":812},"2968d3f0-14b5-4427-82e7-f1ea2de17846","Doc Cat Ios",{"collection":174,"item":814},{"id":57,"status":5,"sort":10,"name":671,"item":815},[816],{"collection":748,"item":817},{"id":24,"status":5,"sort":45,"slug":670,"name":671,"icon":818,"featured_icon":819},{"id":764,"title":765},{"id":820,"title":671},"f5e66b5b-a439-47f6-af4a-6ad261de2e87",{"collection":174,"item":822},{"id":61,"status":5,"sort":10,"name":664,"item":823},[824],{"collection":748,"item":825},{"id":280,"status":5,"sort":53,"slug":663,"name":664,"icon":826,"featured_icon":828},{"id":827,"title":664},"3b4b03c7-e131-49e6-a014-c8c2c8a2751e",{"id":829,"title":830},"1dd05c76-e517-4aea-a3d8-49cfddb40056","Strapi Doc",{"id":25,"name":108,"url":109,"url_text":108,"status":5,"groups":832},[],{"id":41,"name":16,"url":834,"url_text":16,"status":5,"groups":835},"\u002Fbook-demo",[],{"status":5,"header_badges":837,"footer_badges":855,"footer_secured_badges":861,"slider_badges":873},[838,845,850],{"id":4,"status":5,"sort":10,"link":839,"title":840,"badgeType":841,"badgeName":842,"metadata":10,"image":843},"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Flocalazy\u002Freviews","Best meets requirements","Other","G2-winter-24-best-meets-requirments",{"id":844},"8d5dd6fd-6995-4c92-8219-a6ed5ba6acdc",{"id":20,"status":5,"sort":10,"link":839,"title":846,"badgeType":841,"badgeName":847,"metadata":10,"image":848},"Best support","G2-winter-24-best-support",{"id":849},"e59dd465-84d9-45c7-987d-dd4048fd6992",{"id":25,"status":5,"sort":10,"link":839,"title":851,"badgeType":841,"badgeName":852,"metadata":10,"image":853},"Easiest admin","G2-winter-24-easiest-admin",{"id":854},"5f12c4c8-bec0-47cf-87b4-a4502e9f1bd2",[856],{"id":19,"status":5,"sort":10,"link":839,"title":857,"badgeType":841,"badgeName":858,"metadata":10,"image":859},"Users love us","Users love us 25",{"id":860},"232416a5-86ba-4be6-85a5-b88802003d53",[862,868],{"id":15,"status":5,"sort":10,"link":863,"title":864,"badgeType":841,"badgeName":865,"metadata":10,"image":866},"https:\u002F\u002Fsprinto.com\u002Fget-iso-27001\u002F","Sprinto ISO 27001","Sprinto ISO 27001 certificate",{"id":867},"c1c6c06c-6caf-4b78-8a7e-9606c395eb61",{"id":71,"status":5,"sort":10,"link":869,"title":870,"badgeType":841,"badgeName":870,"metadata":10,"image":871},"https:\u002F\u002Fwww.aicpa.org\u002Fsoc4so","SOC certificate",{"id":872},"4f4bc0a6-09a0-41df-8295-8f990d96d941",[874,880,884,888,892,896,901],{"id":37,"status":5,"sort":10,"link":839,"title":875,"badgeType":841,"badgeName":876,"metadata":877,"image":878},"Most likely to recommend","a","",{"id":879},"da055731-3f11-4fc7-96f2-c11c0b84c831",{"id":41,"status":5,"sort":10,"link":839,"title":881,"badgeType":841,"badgeName":10,"metadata":10,"image":882},"EMEA High Performer",{"id":883},"586fb488-81f2-41db-a4e8-ef309e50c0e6",{"id":45,"status":5,"sort":10,"link":839,"title":885,"badgeType":841,"badgeName":10,"metadata":10,"image":886},"Ease of Doing Business With",{"id":887},"bfa26865-430e-463d-9886-cb56a8a8ecf6",{"id":53,"status":5,"sort":10,"link":839,"title":889,"badgeType":841,"badgeName":10,"metadata":10,"image":890},"High Performer",{"id":891},"2cc1ba0f-c23a-4c97-ad4a-a655c97466fe",{"id":57,"status":5,"sort":10,"link":839,"title":893,"badgeType":841,"badgeName":10,"metadata":10,"image":894},"Fastest Implementation",{"id":895},"6f297758-1c95-45f4-a6e9-528319897132",{"id":61,"status":5,"sort":10,"link":897,"title":898,"badgeType":841,"badgeName":10,"metadata":10,"image":899},"https:\u002F\u002Fwww.intercert.com\u002Fservices\u002Fgovernance-risk-compliance\u002Fiso-iec-27001","Intercert ISO 27001",{"id":900},"0521a5f1-e1f2-4da6-a2bc-dc92773f2a7b",{"id":15,"status":5,"sort":10,"link":863,"title":864,"badgeType":841,"badgeName":865,"metadata":10,"image":902},{"id":867},[904,1044,1122,1228,1314,1393,1482,1573,1660,1759],{"id":535,"status":5,"created_on":905,"modified_on":906,"name":607,"slug":606,"description":907,"docs_link":908,"priority":10,"has_sdk":160,"sort":25,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":909,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":911,"tile_description":912,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":913,"upload_features":914,"icon":915,"meta_image":916,"primary_tag":918,"tags":934,"integration_methods":952,"recommended_methods":1028,"default_integration_method":1029,"faq_categories":1036,"translations":1042,"platforms_id":535},"2022-03-18T08:09:24.000Z","2025-02-26T13:36:08.000Z","Manage your React app translations with Localazy, a continuous localization tool. React i18n done right. ","\u002Fdocs\u002Fcli\u002Fjson-format","JSON format support","CLI support","react-i18next and more","Use Localazy to translate your React projects with your favorite i18n library.",{"json":647},[],{"id":609},{"id":917},"a97492ec-ee8d-429c-bf66-d0fe59b6e5c9",{"id":37,"status":5,"sort":20,"created_on":919,"label":920,"hidden":160,"icon":921,"translations":923},"2022-03-17T12:23:44.000Z","Web apps",{"id":922},"c9e70e4f-8136-432a-8d82-53c3501a9eb4",[924,926,929,932],{"id":37,"languages_code":925,"label":920},"xxa",{"id":365,"languages_code":927,"label":928},"es","Aplicaciones web",{"id":782,"languages_code":930,"label":931},"cs","Webové aplikace",{"id":565,"languages_code":933,"label":920},"en",[935,942],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":936,"translations":937},{"id":922},[938,939,940,941],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":53,"status":5,"sort":57,"label":943,"hidden":160,"created_on":944,"icon":10,"translations":945},"Framework","2022-03-17T12:23:45.000Z",[946,947,949,950],{"id":53,"languages_code":925,"label":943},{"id":500,"languages_code":927,"label":948},"Marco",{"id":451,"languages_code":930,"label":943},{"id":951,"languages_code":933,"label":943},67,[953,965,990,1011],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":956},"Translate strings directly or upload them into your Localazy project.","\u002Fdocs\u002Fapi\u002Fintroduction",[957,958,961,963],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},40,"Utilice la API para exportar traducciones e importar contenido de\u002Fa Localazy mediante programación.",{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},"Choose between translating strings directly or uploading them into Localazy.",{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},"Pomocí rozhraní API můžete programovaně exportovat překlady a importovat obsah z\u002Fdo Localazy.",{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":971},"Create source keys online","add-keys-manually","Add source keys via the web interface online and sync them into your project later.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#add-new-keys-in-ui","vpn-key-outline",[972,973,976,977,980,983,984,985],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},"Cree claves fuente en línea","Añada claves fuente a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},"Vytvářejte zdrojové klíče online","Přidejte zdrojové klíče přes webové rozhraní online a synchronizujte je do svého projektu později.",{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},"Cree claves de origen en línea","Añada claves de origen a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},88,"de","Erstellen Sie Quellschlüssel online","Fügen Sie Quellschlüssel über die Weboberfläche online hinzu und synchronisieren Sie sie später mit Ihrem Projekt.",{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":997},"Direct file upload","File upload","web-upload","Upload your texts and existing translations in any format directly to start quickly.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files","file-upload",[998,999,1002,1003,1007],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},"Carga directa de archivos","Cargue sus textos y traducciones existentes en cualquier formato directamente para empezar rápidamente.",{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},56,"Přímé nahrávání souborů","Nahrajte přímo své texty a stávající překlady v libovolném formátu a začněte pracovat ihned.",{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},85,"Direkter Datei-Upload","Laden Sie Ihre Texte und vorhandenen Übersetzungen in einem beliebigen Format direkt hoch, um schnell loszulegen.",{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1015},"Command Line Interface","The best option for developers that want to make localization an automated part of their workflow.","\u002Fdocs\u002Fcli\u002Fthe-basics",[1016,1017,1020,1021,1024],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},"Interfaz de Línea de Comandos","La mejor opción para los desarrolladores que deseen hacer de la localización una parte automatizada de su flujo de trabajo.",{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},"Rozhraní Příkazového Řádku","Nejlepší volba pro vývojáře, kteří chtějí, aby se lokalizace stala automatizovanou součástí jejich pracovních postupů.",{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},87,"Befehlszeilenschnittstelle","Die beste Option für Entwickler, die die Lokalisierung zu einem automatisierten Teil ihres Arbeitsablaufs machen möchten.",[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1030},[1031,1032,1033,1034,1035],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1037],{"id":1038,"status":5,"created_on":1039,"sort":10,"slug":1040,"label":1041,"on_faq_index":10},76,"2025-02-26T12:44:29.000Z","front-end-common","Front-end Common",[1043],{"languages_code":925,"name":607,"slug":606,"description":907,"support_type":909,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":911,"tile_description":912,"id":535,"platforms_id":535,"docs_link":908},{"id":103,"status":5,"created_on":905,"modified_on":1045,"name":614,"slug":613,"description":1046,"docs_link":908,"priority":10,"has_sdk":160,"sort":33,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":909,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1047,"tile_description":1048,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1049,"upload_features":1050,"icon":1051,"meta_image":1052,"primary_tag":1054,"tags":1061,"integration_methods":1075,"recommended_methods":1106,"default_integration_method":1107,"faq_categories":1114,"translations":1120,"platforms_id":103},"2025-02-26T13:35:41.000Z","Online Vue.js project localization tool for your translation management. Enjoy true continuous localization with Localazy & translate your JSON files automatically.","Vue.js & JSON","Enjoy true continuous localization with Localazy & translate your Vue projects automatically.",{"json":647},[],{"id":616},{"id":1053},"8171b836-d6b8-4354-8db3-34ccd384970d",{"id":37,"status":5,"sort":20,"created_on":919,"label":920,"hidden":160,"icon":1055,"translations":1056},{"id":922},[1057,1058,1059,1060],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},[1062,1069],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1063,"translations":1064},{"id":922},[1065,1066,1067,1068],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":53,"status":5,"sort":57,"label":943,"hidden":160,"created_on":944,"icon":10,"translations":1070},[1071,1072,1073,1074],{"id":53,"languages_code":925,"label":943},{"id":500,"languages_code":927,"label":948},{"id":451,"languages_code":930,"label":943},{"id":951,"languages_code":933,"label":943},[1076,1082,1092,1099],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1077},[1078,1079,1080,1081],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1083},[1084,1085,1086,1087,1088,1089,1090,1091],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1093},[1094,1095,1096,1097,1098],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1100},[1101,1102,1103,1104,1105],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1108},[1109,1110,1111,1112,1113],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1115,1119],{"id":1004,"status":5,"created_on":1116,"sort":10,"slug":1117,"label":1118,"on_faq_index":10},"2023-03-01T11:21:41.000Z","vue-localization","Vue.js Localization",{"id":1038,"status":5,"created_on":1039,"sort":10,"slug":1040,"label":1041,"on_faq_index":10},[1121],{"languages_code":925,"name":614,"slug":613,"description":1046,"support_type":909,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1047,"tile_description":1048,"id":103,"platforms_id":103,"docs_link":908},{"id":4,"status":5,"created_on":905,"modified_on":1123,"name":627,"slug":626,"description":1124,"docs_link":1125,"priority":10,"has_sdk":160,"sort":41,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1126,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1126,"tile_description":1127,"is_enterprise":160,"is_popular":160,"primary_use_case":1128,"hierarchy_handling":1129,"best_for":1130,"file_extension":1131,"format_code_example":1132,"format_to_extension":1133,"upload_features":1135,"icon":1136,"meta_image":1137,"primary_tag":1139,"tags":1150,"integration_methods":1186,"recommended_methods":1217,"default_integration_method":1218,"faq_categories":1225,"translations":1226,"platforms_id":4},"2025-07-03T14:21:42.000Z","Learn how to use Localazy CLI for localization of Flutter app. Flutter’s ARB format is fully supported including arrays, plurals, and selected context information. No extra configuration is necessary, but you can enable certain features if you want to.","\u002Fdocs\u002Fcli\u002Fflutter-format","ARB format support","Use the Localazy CLI for localization of Flutter projects. Flutter’s ARB format is fully supported.","Supports metadata like placeholders","JSON-like key-value","Flutter apps",".arb","```\n{\n  \"localazy_message\": \"Go international, today. With Localazy.\"\n}\n```",{"arb":1134},"arb",[],{"id":629},{"id":1138},"c2674666-4371-4aa4-9a65-438c7363fafe",{"id":41,"status":5,"sort":53,"created_on":944,"label":1140,"hidden":160,"icon":1141,"translations":1143},"Mobile apps",{"id":1142},"c9c7e1f5-8b59-4016-ae0c-6fba9469cd55",[1144,1145,1147,1149],{"id":41,"languages_code":925,"label":1140},{"id":374,"languages_code":927,"label":1146},"Aplicaciones móviles",{"id":443,"languages_code":930,"label":1148},"Mobilní aplikace",{"id":411,"languages_code":933,"label":1140},[1151,1162,1169,1176],{"id":45,"status":5,"sort":103,"label":1152,"hidden":160,"created_on":944,"icon":1153,"translations":1155},"Desktop & Games",{"id":1154},"65b04533-5b4c-430c-b8a4-ecce84754200",[1156,1157,1159,1161],{"id":45,"languages_code":925,"label":1152},{"id":382,"languages_code":927,"label":1158},"Escritorio y Juegos",{"id":1004,"languages_code":930,"label":1160},"Stolní počítače & Hry",{"id":684,"languages_code":933,"label":1152},{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1163,"translations":1164},{"id":922},[1165,1166,1167,1168],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":41,"status":5,"sort":53,"label":1140,"hidden":160,"created_on":944,"icon":1170,"translations":1171},{"id":1142},[1172,1173,1174,1175],{"id":41,"languages_code":925,"label":1140},{"id":374,"languages_code":927,"label":1146},{"id":443,"languages_code":930,"label":1148},{"id":411,"languages_code":933,"label":1140},{"id":223,"status":5,"sort":407,"label":1177,"hidden":162,"created_on":944,"icon":10,"translations":1178},"ARB",[1179,1180,1182,1184],{"id":223,"languages_code":925,"label":1177},{"id":1181,"languages_code":927,"label":1177},120,{"id":1183,"languages_code":930,"label":1177},125,{"id":1185,"languages_code":933,"label":1177},130,[1187,1193,1203,1210],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1188},[1189,1190,1191,1192],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1194},[1195,1196,1197,1198,1199,1200,1201,1202],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1204},[1205,1206,1207,1208,1209],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1211},[1212,1213,1214,1215,1216],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1219},[1220,1221,1222,1223,1224],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1227],{"languages_code":925,"name":627,"slug":626,"description":1124,"support_type":1126,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1126,"tile_description":1127,"id":4,"platforms_id":4,"docs_link":1125},{"id":570,"status":5,"created_on":1229,"modified_on":1230,"name":641,"slug":640,"description":1231,"docs_link":1232,"priority":10,"has_sdk":160,"sort":19,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1233,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1233,"tile_description":1234,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1235,"upload_features":1237,"icon":1238,"meta_image":1239,"primary_tag":1241,"tags":1254,"integration_methods":1269,"recommended_methods":1300,"default_integration_method":1301,"faq_categories":1308,"translations":1312,"platforms_id":570},"2022-03-18T08:09:25.000Z","2024-07-17T07:43:22.000Z","Localize your app with JavaScript localizations and Localazy CLI.\nUpload JavaScript files with strings to Localazy and manage your translations easily. Download translated files back.","\u002Fdocs\u002Fcli\u002Fjavascript-format","JS file support","Translating JS files is easy as a pie with Localazy!",{"js":1236},"js",[],{"id":643},{"id":1240},"2c6699eb-1d80-4772-8268-5597dbcead8c",{"id":61,"status":5,"sort":61,"created_on":944,"label":1242,"hidden":160,"icon":1243,"translations":1245},"Programming Languages",{"id":1244},"8c5836bb-1fbe-49c5-9330-8f931838c457",[1246,1247,1249,1252],{"id":61,"languages_code":925,"label":1242},{"id":468,"languages_code":927,"label":1248},"Lenguajes de Programación",{"id":1250,"languages_code":930,"label":1251},68,"Programovací Jazyky",{"id":1253,"languages_code":933,"label":1242},70,[1255,1262],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1256,"translations":1257},{"id":922},[1258,1259,1260,1261],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":61,"status":5,"sort":61,"label":1242,"hidden":160,"created_on":944,"icon":1263,"translations":1264},{"id":1244},[1265,1266,1267,1268],{"id":61,"languages_code":925,"label":1242},{"id":468,"languages_code":927,"label":1248},{"id":1250,"languages_code":930,"label":1251},{"id":1253,"languages_code":933,"label":1242},[1270,1276,1286,1293],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1271},[1272,1273,1274,1275],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1277},[1278,1279,1280,1281,1282,1283,1284,1285],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1287},[1288,1289,1290,1291,1292],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1294},[1295,1296,1297,1298,1299],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1302},[1303,1304,1305,1306,1307],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1309],{"id":464,"status":5,"created_on":1310,"sort":10,"slug":1311,"label":641,"on_faq_index":160},"2022-06-10T09:49:33.000Z","javascript-i18n-localization",[1313],{"languages_code":925,"name":641,"slug":640,"description":1231,"support_type":1233,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1233,"tile_description":1234,"id":570,"platforms_id":570,"docs_link":1232},{"id":19,"status":5,"created_on":1229,"modified_on":1315,"name":648,"slug":647,"description":1316,"docs_link":908,"priority":10,"has_sdk":160,"sort":107,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1317,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1318,"tile_description":1319,"is_enterprise":160,"is_popular":162,"primary_use_case":1320,"hierarchy_handling":1321,"best_for":1322,"file_extension":1323,"format_code_example":1324,"format_to_extension":1325,"upload_features":1326,"icon":1327,"meta_image":1328,"primary_tag":1330,"tags":1341,"integration_methods":1349,"recommended_methods":1380,"default_integration_method":1381,"faq_categories":1388,"translations":1391,"platforms_id":19},"2025-10-14T11:22:29.000Z","Online JSON translator you will love. Comfortable JSON language files editor with powerful CLI under your fingers for continuous localization.","Advanced format support","{Objectively the best}","Translate any JSON files with Localazy, with the best in class plural and array support.","Used for structured data storage and APIs","Uses key-value pairs","Web & mobile apps, APIs",".json","```\n{\n  \"parent\": {\n    \"child\": {\n      \"another_nested_level\": \"All is supported.\"\n    }\n  }\n}\n```",{"json":647},[],{"id":650},{"id":1329},"8d614c20-667e-4bee-a64d-7d7ce9c0ee0a",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1332,"translations":1334},"File formats",{"id":1333},"ab7c8f89-dcce-45ab-9e21-8605aef289c3",[1335,1336,1338,1340],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},"Formatos de archivo",{"id":484,"languages_code":930,"label":1339},"Formáty souborů",{"id":574,"languages_code":933,"label":1331},[1342],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1343,"translations":1344},{"id":1333},[1345,1346,1347,1348],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1350,1356,1366,1373],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1351},[1352,1353,1354,1355],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1357},[1358,1359,1360,1361,1362,1363,1364,1365],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1367},[1368,1369,1370,1371,1372],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1374},[1375,1376,1377,1378,1379],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1382},[1383,1384,1385,1386,1387],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1389],{"id":423,"status":5,"created_on":1390,"sort":10,"slug":647,"label":648,"on_faq_index":160},"2022-06-10T10:49:07.000Z",[1392],{"languages_code":925,"name":648,"slug":647,"description":1316,"support_type":1317,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1318,"tile_description":1319,"id":19,"platforms_id":19,"docs_link":908},{"id":24,"status":5,"created_on":1229,"modified_on":1394,"name":655,"slug":654,"description":1395,"docs_link":1396,"priority":10,"has_sdk":160,"sort":24,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":160,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1398,"tile_description":1399,"is_enterprise":160,"is_popular":162,"primary_use_case":1400,"hierarchy_handling":1401,"best_for":1402,"file_extension":1403,"format_code_example":1404,"format_to_extension":1405,"upload_features":1407,"icon":1408,"meta_image":1409,"primary_tag":1411,"tags":1418,"integration_methods":1440,"recommended_methods":1471,"default_integration_method":1472,"faq_categories":1479,"translations":1480,"platforms_id":24},"2025-07-03T14:28:31.000Z","XLIFF is meant for localization. Enjoy Localazy - an online XLIFF editor for your translation management. Integrate your XLIFF files with Localazy to achieve true continuous localization and translate XLIFF files on autopilot.","\u002Fdocs\u002Fcli\u002Fxliff-12-format","File format support","Meant for localization","XLIFF stands for XML Localization Interchange File Format - and Localazy is the best way to manage XLIFF files.","Used in translation pipelines","XML-based exchange format","Translation & software",".xliff","```\n\u003Ctrans-unit id=\"localazy_message\">\n    \u003Csource>Go international, today. With Localazy.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```",{"xliff":1406},"xlf",[],{"id":657},{"id":1410},"889970a6-cce8-4055-b96a-9c3f292aa67f",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1412,"translations":1413},{"id":1333},[1414,1415,1416,1417],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1419,1426,1433],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1420,"translations":1421},{"id":1333},[1422,1423,1424,1425],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1427,"translations":1428},{"id":1333},[1429,1430,1431,1432],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1434,"translations":1435},{"id":1333},[1436,1437,1438,1439],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1441,1447,1457,1464],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1442},[1443,1444,1445,1446],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1448},[1449,1450,1451,1452,1453,1454,1455,1456],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1458},[1459,1460,1461,1462,1463],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1465},[1466,1467,1468,1469,1470],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1473},[1474,1475,1476,1477,1478],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1481],{"languages_code":925,"name":655,"slug":654,"description":1395,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1398,"tile_description":1399,"id":24,"platforms_id":24,"docs_link":1396},{"id":107,"status":5,"created_on":1483,"modified_on":1483,"name":1484,"slug":1485,"description":1486,"docs_link":1487,"priority":10,"has_sdk":160,"sort":247,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1488,"tile_description":1489,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1490,"upload_features":1491,"icon":1492,"meta_image":1494,"primary_tag":1496,"tags":1503,"integration_methods":1531,"recommended_methods":1562,"default_integration_method":1563,"faq_categories":1570,"translations":1571,"platforms_id":107},"2026-05-21T20:49:09.000Z","PO","po","Edit .po and .pot files with your team, automate translation with AI, and ship faster.","\u002Fdocs\u002Fcli\u002Fpo-format","Seamless integration","Upload, edit and translate PO files with Localazy.",{"po":1485},[],{"id":1493},"25f317fe-0c10-4f0b-92cd-f80d1f3c6a67",{"id":1495},"490022f9-d91a-4e1a-9e79-db374ec997c2",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1497,"translations":1498},{"id":1333},[1499,1500,1501,1502],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1504,1511,1521],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1505,"translations":1506},{"id":1333},[1507,1508,1509,1510],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":394,"status":5,"sort":394,"label":1512,"hidden":162,"created_on":944,"icon":10,"translations":1513},"C++",[1514,1515,1517,1519],{"id":394,"languages_code":925,"label":1512},{"id":1516,"languages_code":927,"label":1512},135,{"id":1518,"languages_code":930,"label":1512},140,{"id":1520,"languages_code":933,"label":1512},144,{"id":24,"status":5,"sort":247,"label":1522,"hidden":162,"created_on":944,"icon":10,"translations":1523},"Gettext",[1524,1525,1527,1529],{"id":24,"languages_code":925,"label":1522},{"id":1526,"languages_code":927,"label":1522},101,{"id":1528,"languages_code":930,"label":1522},106,{"id":1530,"languages_code":933,"label":1522},111,[1532,1538,1548,1555],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1533},[1534,1535,1536,1537],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1539},[1540,1541,1542,1543,1544,1545,1546,1547],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1549},[1550,1551,1552,1553,1554],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1556},[1557,1558,1559,1560,1561],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1564},[1565,1566,1567,1568,1569],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1572],{"languages_code":925,"name":1484,"slug":1485,"description":1486,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1488,"tile_description":1489,"id":107,"platforms_id":107,"docs_link":1487},{"id":252,"status":5,"created_on":1229,"modified_on":1574,"name":1575,"slug":1576,"description":1577,"docs_link":1578,"priority":10,"has_sdk":160,"sort":230,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1579,"tile_description":1580,"is_enterprise":160,"is_popular":160,"primary_use_case":1581,"hierarchy_handling":1582,"best_for":1583,"file_extension":1584,"format_code_example":1585,"format_to_extension":1586,"upload_features":1587,"icon":1588,"meta_image":1589,"primary_tag":1591,"tags":1598,"integration_methods":1616,"recommended_methods":1647,"default_integration_method":1648,"faq_categories":1655,"translations":1658,"platforms_id":252},"2025-10-02T08:32:44.000Z","RESX","resx","Quickly translate and manage your RESX files with Localazy or integrate Localazy with your .NET project and enjoy a fully automated localization process. ","\u002Fdocs\u002Fcli\u002Fresx-format",".NET localization","Translate .NET projects using RESX files and Localazy.","Standard format for Windows\u002F.NET localization","Flat key-value structure",".NET applications",".resx","```\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Croot>\n  \u003Cdata name=\"localazy_message\" xml:space=\"preserve\">\n    \u003Cvalue>Go international, today. With Localazy.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\u003C\u002Froot>\n```",{"resx":1576},[],{"id":1493},{"id":1590},"1f07bf83-9363-47d6-b21b-a5121c0efaf6",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1592,"translations":1593},{"id":1333},[1594,1595,1596,1597],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1599,1606],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1600,"translations":1601},{"id":1333},[1602,1603,1604,1605],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":247,"status":5,"sort":252,"label":1607,"hidden":162,"created_on":944,"icon":10,"translations":1608},"C#",[1609,1610,1612,1614],{"id":247,"languages_code":925,"label":1607},{"id":1611,"languages_code":927,"label":1607},103,{"id":1613,"languages_code":930,"label":1607},108,{"id":1615,"languages_code":933,"label":1607},113,[1617,1623,1633,1640],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1618},[1619,1620,1621,1622],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1624},[1625,1626,1627,1628,1629,1630,1631,1632],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1634},[1635,1636,1637,1638,1639],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1641},[1642,1643,1644,1645,1646],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1649},[1650,1651,1652,1653,1654],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1656],{"id":356,"status":5,"created_on":1657,"sort":10,"slug":1576,"label":1575,"on_faq_index":10},"2022-08-01T16:44:06.000Z",[1659],{"languages_code":925,"name":1575,"slug":1576,"description":1577,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1579,"tile_description":1580,"id":252,"platforms_id":252,"docs_link":1578},{"id":661,"status":5,"created_on":1661,"modified_on":1662,"name":664,"slug":663,"description":1663,"docs_link":1664,"priority":10,"has_sdk":10,"sort":662,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1665,"show_in_spa":162,"is_file_format":10,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":1665,"tile_subtitle":1665,"tile_description":1666,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":10,"upload_features":10,"icon":1667,"meta_image":1668,"primary_tag":1670,"tags":1682,"integration_methods":1726,"recommended_methods":1746,"default_integration_method":1747,"faq_categories":1754,"translations":1757,"platforms_id":661},"2022-06-16T09:08:11.000Z","2026-04-27T18:16:54.000Z","Enjoy seamless integration of Strapi & Localazy and translate your website efficiently. Download the official Localazy plugin in the Strapi Marketplace to get started!","\u002Fdocs\u002Fstrapi\u002Fstrapi-plugin-introduction","Localization Plugin","Localize your Strapi website with our official localization plugin. Easy setup and installation.",{"id":666},{"id":1669},"5995b721-a2ea-487e-ad4b-298a489bbd24",{"id":19,"status":5,"sort":15,"created_on":944,"label":1671,"hidden":160,"icon":1672,"translations":1674},"CMS",{"id":1673},"1172a655-928c-4594-9263-d8afdfd9cd79",[1675,1676,1678,1680],{"id":19,"languages_code":925,"label":1671},{"id":1677,"languages_code":927,"label":1671},73,{"id":1679,"languages_code":930,"label":1671},81,{"id":1681,"languages_code":933,"label":1671},84,[1683,1695,1707,1714],{"id":99,"status":5,"sort":95,"label":1684,"hidden":160,"created_on":944,"icon":10,"translations":1685},"Multilingual SEO",[1686,1687,1690,1693],{"id":99,"languages_code":925,"label":1684},{"id":1688,"languages_code":927,"label":1689},89,"SEO multilingüe",{"id":1691,"languages_code":930,"label":1692},94,"Vícejazyčné SEO",{"id":1694,"languages_code":933,"label":1684},99,{"id":535,"status":5,"sort":535,"label":302,"hidden":160,"created_on":944,"icon":1696,"translations":1698},{"id":1697},"e782ed3f-d954-45ca-8b17-5bf5fe95f30a",[1699,1700,1703,1705],{"id":535,"languages_code":925,"label":302},{"id":1701,"languages_code":927,"label":1702},132,"Comercio electrónico",{"id":1704,"languages_code":930,"label":302},137,{"id":1706,"languages_code":933,"label":302},142,{"id":19,"status":5,"sort":15,"label":1671,"hidden":160,"created_on":944,"icon":1708,"translations":1709},{"id":1673},[1710,1711,1712,1713],{"id":19,"languages_code":925,"label":1671},{"id":1677,"languages_code":927,"label":1671},{"id":1679,"languages_code":930,"label":1671},{"id":1681,"languages_code":933,"label":1671},{"id":20,"status":5,"sort":41,"label":1715,"hidden":160,"created_on":944,"icon":1716,"translations":1718},"Marketing tools",{"id":1717},"098fe6a4-dd2e-42d8-937e-2d8121e6e266",[1719,1720,1723,1725],{"id":20,"languages_code":925,"label":1715},{"id":1721,"languages_code":927,"label":1722},43,"Herramientas de marketing",{"id":431,"languages_code":930,"label":1724},"Marketingové nástroje",{"id":509,"languages_code":933,"label":1715},[1727],{"id":53,"status":5,"sort":10,"label":1728,"alternative_label":1729,"slug":1730,"description":1731,"documentation_link":1732,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1734},"Official Strapi Plugin","Official Plugin","official-strapi-plugin","Our developers maintain an official Strapi localization plugin. Start in a few clicks!","\u002Fdocs\u002Fstrapi","localazy-box",[1735,1736,1739,1740,1743],{"id":53,"languages_code":925,"label":1728,"description":1731,"slug":1730},{"id":1721,"languages_code":927,"label":1737,"description":1738,"slug":10},"Complemento Oficial de Strapi","Nuestros desarrolladores mantienen un complemento oficial de localización de Strapi. ¡Empiece en unos pocos clics!",{"id":500,"languages_code":933,"label":1728,"description":1731,"slug":1730},{"id":574,"languages_code":930,"label":1741,"description":1742,"slug":10},"Oficiál Plugin Strapi","Naši vývojáři udržují a neustále vylepšují oficiální lokalizační plugin Strapi. Začněte několika kliknutími!",{"id":1688,"languages_code":987,"label":1744,"description":1745,"slug":10},"Offizielles Strapi-Plugin","Unsere Entwickler pflegen ein offizielles Strapi-Lokalisierungs-Plugin. Starten Sie mit ein paar Klicks!",[],{"id":53,"status":5,"sort":10,"label":1728,"alternative_label":1729,"slug":1730,"description":1731,"documentation_link":1732,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1748},[1749,1750,1751,1752,1753],{"id":53,"languages_code":925,"label":1728,"description":1731,"slug":1730},{"id":1721,"languages_code":927,"label":1737,"description":1738,"slug":10},{"id":500,"languages_code":933,"label":1728,"description":1731,"slug":1730},{"id":574,"languages_code":930,"label":1741,"description":1742,"slug":10},{"id":1688,"languages_code":987,"label":1744,"description":1745,"slug":10},[1755],{"id":207,"status":5,"created_on":1756,"sort":10,"slug":663,"label":664,"on_faq_index":10},"2022-06-16T09:24:13.000Z",[1758],{"languages_code":925,"name":664,"slug":663,"description":1663,"support_type":1665,"meta_title":10,"meta_description":10,"marketing_subtitle":1665,"tile_subtitle":1665,"tile_description":1666,"id":661,"platforms_id":661,"docs_link":1664},{"id":451,"status":5,"created_on":1229,"modified_on":1760,"name":671,"slug":670,"description":10,"docs_link":1761,"priority":10,"has_sdk":160,"sort":443,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1762,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":1763,"tile_subtitle":1764,"tile_description":1765,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":10,"upload_features":1766,"icon":1767,"meta_image":1768,"primary_tag":1770,"tags":1783,"integration_methods":1791,"recommended_methods":1804,"default_integration_method":1805,"faq_categories":1811,"translations":1812,"platforms_id":451},"2024-12-20T15:00:22.000Z","\u002Fdocs\u002Fintegrations\u002Fquick-start-figma","plugin","Figma plugin","Localization plugin","Quickly translate your Figma designs and seamlessly reuse the translations during the development of your project.",[],{"id":673},{"id":1769},"7573fed6-8817-4cb4-84d2-be327e6c4891",{"id":25,"status":5,"sort":45,"created_on":944,"label":1771,"hidden":160,"icon":1772,"translations":1774},"Design tools",{"id":1773},"1053d863-b690-4fbd-aadf-dbf2ba282768",[1775,1776,1779,1782],{"id":25,"languages_code":925,"label":1771},{"id":1777,"languages_code":927,"label":1778},42,"Herramientas de diseño",{"id":1780,"languages_code":930,"label":1781},49,"Nástroje pro návrh",{"id":557,"languages_code":933,"label":1771},[1784],{"id":25,"status":5,"sort":45,"label":1771,"hidden":160,"created_on":944,"icon":1785,"translations":1786},{"id":1773},[1787,1788,1789,1790],{"id":25,"languages_code":925,"label":1771},{"id":1777,"languages_code":927,"label":1778},{"id":1780,"languages_code":930,"label":1781},{"id":557,"languages_code":933,"label":1771},[1792],{"id":45,"status":5,"sort":10,"label":1729,"alternative_label":1729,"slug":1793,"description":1794,"documentation_link":85,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1795},"official-plugin","Our developers maintain an official plugin for this integration. Start in a few clicks!",[1796,1797,1800,1801],{"id":45,"languages_code":925,"label":1729,"description":1794,"slug":1793},{"id":280,"languages_code":927,"label":1798,"description":1799,"slug":10},"Plugin Oficial","Nuestros desarrolladores mantienen un plugin oficial para esta integración. ¡Empiece con unos pocos clics!",{"id":271,"languages_code":933,"label":1729,"description":1794,"slug":1793},{"id":464,"languages_code":930,"label":1802,"description":1803,"slug":10},"Oficiální Plugin","Naši vývojáři udržují a neustále vylepšují oficiální plugin pro tuto integraci. Začněte několika kliknutími!",[],{"id":45,"status":5,"sort":10,"label":1729,"alternative_label":1729,"slug":1793,"description":1794,"documentation_link":85,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1806},[1807,1808,1809,1810],{"id":45,"languages_code":925,"label":1729,"description":1794,"slug":1793},{"id":280,"languages_code":927,"label":1798,"description":1799,"slug":10},{"id":271,"languages_code":933,"label":1729,"description":1794,"slug":1793},{"id":464,"languages_code":930,"label":1802,"description":1803,"slug":10},[],[1813],{"languages_code":925,"name":671,"slug":670,"description":10,"support_type":1762,"meta_title":10,"meta_description":10,"marketing_subtitle":1763,"tile_subtitle":1764,"tile_description":1765,"id":451,"platforms_id":451,"docs_link":1761},{"id":1815,"owner":1816,"created_by":10,"sort":10,"title":1821,"slug":1822,"modified_on":877,"created_on":1823,"pinned":160,"badge":10,"priority":1824,"main_image":1825,"status":5,"tags":1826,"dictionary":1837,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"69ea1abb7ab1270001ede902",{"id":1817,"first_name":1818,"last_name":877,"slug":1819,"avatar":1820},"606c233dcf7b6a0001d1da93","Petr Hodný","petr-hodny","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fpetr.png","You can just build things. But should you? The build vs. buy debate in localization","build-vs-buy-in-localization-you-can-build-things-but-should-you","2026-05-25T08:43:00.000+02:00","0.7","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F05\u002Flocalazy-Vibe-coding.png",[1827,1831,1835],{"id":402,"created_on":1828,"status":5,"label":1829,"slug":1830,"on_index_page":162},"2026-05-29 16:59:28","AI","ai",{"id":1832,"created_on":1828,"status":5,"label":1833,"slug":1834,"on_index_page":160},646,"Business Development","business-development",{"id":451,"created_on":1828,"status":5,"label":352,"slug":1836,"on_index_page":162},"localization",[],0,{"id":1840,"owner":1841,"created_by":10,"sort":10,"title":1842,"slug":1843,"modified_on":877,"created_on":1844,"pinned":160,"badge":10,"priority":1824,"main_image":1845,"status":5,"tags":1846,"dictionary":1850,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"69d78a237ab1270001eddabf",{"id":1817,"first_name":1818,"last_name":877,"slug":1819,"avatar":1820},"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","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F04\u002FLocalazy-AI-translation-api.png",[1847,1848,1849],{"id":451,"created_on":1828,"status":5,"label":771,"slug":775,"on_index_page":160},{"id":402,"created_on":1828,"status":5,"label":1829,"slug":1830,"on_index_page":162},{"id":451,"created_on":1828,"status":5,"label":352,"slug":1836,"on_index_page":162},[],{"content":1852,"sections":1990,"docsInSection":2112,"defaultSearchItems":2554,"relatedBlogArticles":2555},{"doc":1853,"originalContent":1861,"originalExcerpt":1860,"placeholders":1929},{"id":25,"status":5,"sort":1854,"owner":1855,"created_on":1856,"modified_on":1857,"slug":1858,"title":1859,"excerpt":1860,"content":1861,"meta_title":1859,"meta_description":1860,"pinned":160,"main_image":10,"section":1862,"subsection":1870,"cta":10,"faq":1874,"dictionary":1898,"blog_articles":1924,"translations":1926,"documentation_id":25},"20000","2bac48a8-b362-482f-b574-3bc71dca4c5b","2022-03-18T07:51:24.000Z","2024-08-08T08:08:57.000Z","localazy-gradle-plugin","Localazy Gradle plugin","The Localazy Gradle plugin helps you to upload strings and to integrate Localazy into your app.","## The plugin overview\n\nThe plugin has several important functions:\n\n* it integrates tightly with the Android Gradle plugin to understand  your project's structure\n* it uploads strings including metadata about flavors, build types, etc. to the translation platform\n* it integrates the [Localazy Android library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library) into the bytecode of your app so translations can be updated on-the-fly\n* while building your app, it replaces app's resources with updated translations\n\nAlso, when the [Localazy Android library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library) is integrated into your app, it collects stats to improve translations and to suggests languages you should translate your app into, etc.\n\n\n## No changes to your code\n\nWe are committed to a simple rule \"No changes to your code\" which means two important things:\n\n**We never touch your source code. No exceptions.** All modifications to your app take place during the build process and are applied to intermediate files. The plugin also respects your project’s structure and should work correctly with any project layout, including different product flavors, build types, etc.\n\n**No work on your side.** Under normal circumstances, there is no extra action needed except for adding the plugin and the Android library to your build scripts. Our defaults are suitable for the majority of apps, and no changes in your source code are needed to have your app translated with Localazy.\n\n**As a result, it’s easy to try Localazy out, and you can be sure that your project stays unmodified.**\n\n## Quick start\n\n\u003Ciframe width=\"100%\" height=\"460\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBfmi-Bv2WAA\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen>\u003C\u002Fiframe>\n\nThe plugin is compatible with native Android apps written with **Java, Kotlin** and other JVM-based languages. Your project must be built using **Gradle** with **Android Gradle plugin (com.android.tools.build:gradle)**.\n\n**Choose the quick start based on your AGP version:**\n- [Android Gradle Plugin 3.5.0 - 4.2.2](\u002Fdocs\u002Fandroid\u002Fagp-3_5-and-newer)\n- [Android Gradle Plugin 7.0+](\u002Fdocs\u002Fandroid\u002Fagp-7-and-newer)\n- [Android Gradle Plugin 8.0+](\u002Fdocs\u002Fandroid\u002Fagp-8-and-newer) \n\n## Gradle Kotlin DSL\n\nFrom version 2.0.0, our Gradle plugin supports Kotlin DSL. You can use older versions of our plugin with Kotlin DSL as well, but it's not seamless. \n\nExamples in our documentation are provided in Groovy, but they are almost identical to Kotlin DSL version of the same configuration. \n\n## Configure the plugin\n\nOur defaults are suitable for the majority of apps, and extra configuration is usually not necessary except for small tweaks (excluding particular strings, disabling errors for debug builds, etc.)\n\nThe configuration of the plugin looks like:\n\n```groovy\nlocalazy {\n\n    readKey \"the-read-key-for-the-project\"\n    writeKey \"the-write-key-for-the-project\"\n\n    upload {\n        \u002F\u002F ...\n    }\n\n    download {\n        \u002F\u002F ...\n    }\n\n    injection {\n        \u002F\u002F ...\n    }\n\n    resources {\n        \u002F\u002F ...\n    }\n\n}\n```\n\n### localazy\n\nThe `localazy` section serves as the main configuration and contains all other options related to the plugin.\n\n| Name | Type | Default | Description\n| --- | --- | --- | ---\n| `readKey` | string | _none_ | The read key to use for downloading updated translations into the app and for sending stats.\n| `writeKey` | string | _none_ | The write key to use for uploading strings for translating.\n| `tag` | string | _latest_ | \u003Cmark title=\"Since Localazy Gradle plugin 1.5.3\">1.5.3+\u003C\u002Fmark> Define [release tag](\u002Fdocs\u002Fcli\u002Frelease-tags) to be used. |\n| `addPrefix` | boolean | false | Adds prefix `[LL]` for all strings processed by Localazy OTA engine, so you can verify that the whole app is correctly translated. It's also useful when developing custom view transformers.\n| `allowAllLibraries` | boolean | false | \u003Cmark title=\"Since Localazy Gradle plugin 1.3.0\">1.3.0+\u003C\u002Fmark> Enables an experimental support for libraries with different build types and product flavors. \n| `upload` | struct | _none_ | Configures string uploading. See [upload](#upload).\n| `download` | struct | _none_ | Configures string downloading. See [download](#download).\n| `injection` | struct | _none_ | Configures the library injection. See [injection](#injection).\n| `resources` | struct | _none_ | Configures resources injection. See [resources](#resources).\n| `copyFrom` | project | _none_ | Defines another module to copy configuration from. It's useful for integrating libraries, so you don't need to define the configuration again. Please keep in mind, that it only copies unchanged values. It doesn't copy data from the upload section as the upload is always processed by the app's module only. \n\n::: info\nYou can find read and write keys in your app’s **Settings** > **Access Keys**.\n:::\n\n#### Defining keys in local.properties\n\nYou can define read and write keys in `local.properties`, so they are not committed to the version control system.\n\nThis is especially useful for open-source software with publicly available repositories.\n\n```properties\n# Path to Android SDK is typically defined here.\nsdk.dir=\u002Fhome\u002Fuser\u002Fpath\u002Fto\u002Fandroid\n\nlocalazy.readKey=your-app-read-key\nlocalazy.writeKey=your-app-write-key\n```\n\n::: info\nYou can define the keys also in `gradle.properties` the same way.   \n:::\n\n\n#### Copying the configuration to library\n\nTo apply Localazy correctly to your library modules, you have to include them in the [projects of the upload section](#projects) and apply the Localazy Gradle plugin to them. However, the configuration is not, by default, shared between modules and so you would need to configure the library module again. With the `copyFrom` option, you can transfer the configuration from your app's module like this:       \n\n```groovy\napply plugin: 'com.localazy.gradle'\n\nlocalazy {\n    copyFrom project(\":app\")\n}\n```\n\n### upload\n\nThe `upload` section configures how strings are uploaded from your app to the Localazy platform. The default configuration is suitable for the majority of apps, and under normal circumstances, you don’t need to make any changes.\n\n| Name | Type | Default | Description\n| --- | --- | --- | ---\n| `deprecateMissing` | boolean | true | If set to **true**, strings that are not contained in the batch are marked deprecated.\n| `defaultLang` | string | inherited | The language of **values** folder. Special value **inherited** means to use the project's default language as defined in the Localazy platform. The language must be one recognized be the Localazy platform in format xx (eq. cs, en, de) or xx_XX (eq. cs_CZ, en_US).\n| `defaultState` | string | current | If set to **current**, the uploaded string is automatically used as a translation if no translation is available. If set to **force_current** (\u003Cmark title=\"Since Localazy Gradle plugin 1.5.3\">1.5.3+\u003C\u002Fmark>), the uploaded string is forced as the current translation even if there is an existing translation. If set to **new**, uploaded strings are uploaded as non-approved and must go through the review process - this is important if you are not sure of the translation quality.\n| `showUploadAll` | boolean | false | If set to **true**, Gradle tasks [uploadAllStrings](#uploadallstrings) and [uploadBaseStrings](#uploadbasestrings) are available instead of [uploadStrings](#uploadstrings) only.\n| `strictMode` | boolean | false | \u003Cmark title=\"Since Localazy Gradle plugin 1.4.0\">1.4.0+\u003C\u002Fmark> If set to **true**, the pre-upload analysis ends with error if there are some possible issues detected. \n| `ignoreMissingDefault` | boolean | false | If set to **true**, the plugin ignores missing default translations in flavors, which may lead to the phrase not appear correctly in the Localazy platform.\n| `ignorePrivateStrings` | boolean | false | If set to **true**, the plugin ignores private strings analysis. By default, Localazy warns you if the string seems to be an ad identifier, etc., and prevents upload.\n| `strings` | struct | _n\u002Fa_ | Allows to include or exclude string keys in the upload. See [strings](#strings).\n| `files` | struct | _n\u002Fa_ | Allows to include or exclude files with strings in the upload. See [files](#files).\n| `projects` | struct | _n\u002Fa_ | Allows to include projects that should be included in the upload. See [projects](#projects).\n| `analysis` | struct | _n\u002Fa_ | \u003Cmark title=\"Since Localazy Gradle plugin 1.3.0\">1.3.0+\u003C\u002Fmark> Allows to exclude strings from pre-upload analysis. See [analysis](#analysis).\n| `include` | struct | _n\u002Fa_ | \u003Cmark title=\"Since Localazy Gradle plugin 1.4.0\">1.4.0+\u003C\u002Fmark> Allows to manually include strings that are excluded by the analysis. See [include](#include).\n\n::: info\nUse strings and files to exclude API keys, tokens, ad placement ID, Facebook’s app ID, etc.\n:::\n\n\n#### strings\n\nAllows to include or exclude particular strings from uploading. You can include or exclude strings that match the given pattern, and it’s possible to use wildcard symbols `*` and `?`.\n\nBy default, all strings are included except for those that are explicitly excluded here. If at least one `include` is used, the resolution process is switched to the include-only mode, which means that all strings are excluded by default except for those explicitly included. Excluding has higher a priority than including.\n\n```groovy\nlocalazy {\n    upload {\n        strings {\n\n            \u002F\u002F Include key_1, apply to all subprojects\n            include \"key_1\"\n\n            \u002F\u002F Include key_1 from anotherProject subproject\n            include project(\":anotherProject\"), \"key_1\"\n\n            \u002F\u002F Exclude key_2, apply to all subprojects\n            exclude \"key_2\"\n\n            \u002F\u002F Exclude key_2 from anotherProject subproject\n            exclude project(\":anotherProject\"), \"key_2\"\n\n        }\n    }\n}\n```\n\n::: info\nTo use inclusion or exclusion of sub-project strings, you need also to add the given sub-project in the projects section.\n:::\n\n\n#### files\n\nAllows to include or exclude particular files from uploading. You can include or exclude files that match the given pattern, and it’s possible to use wildcard symbols `*` and `?`.\n\nBy default, all files are included except for those that are explicitly excluded here. If at least one `include` is used, the resolution process is switched to the include-only mode, which means that all files are excluded by default except for those explicitly included. Excluding has a higher priority than including.\n\nThe file path to be matched is in a special format allowing for precise selection of included\u002Fexcluded resources. The format is `flavorName:folder\u002Ffile.ext`, which means that it’s usually something like `main:values\u002Fstrings.xml`.\n\n```groovy\nlocalazy {\n    upload {\n        files {\n\n            \u002F\u002F Include strings_specific.xml from all subprojects, folders and flavors\n            include \"*\u002Fstrings_specific.xml\"\n\n            \u002F\u002F Include strings_specific.xml from flavor free, folder values-v11 and project anotherProject\n            include project(\":anotherProject\"), \"free:values-v11\u002Fstrings_specific.xml\"\n\n            \u002F\u002F Exclude strings_private.xml, apply to all subprojects, folders and flavors\n            exclude \"*\u002Fstrings_private.xml\"\n\n            \u002F\u002F Exclude strings_private.xml from flavor free, folder values-v11 and project anotherProject\n            exclude project(\":anotherProject\"), \"free:values-v11\u002Fstrings_private.xml\"\n\n        }\n    }\n}\n```\n\n::: info\nTo use inclusion or exclusion of sub-project strings, you need also to add the given sub-project in the projects section.\n:::\n\n\n#### projects\n\nAllows to include extra Gradle projects (modules in Android Studio) when uploading strings. The project\u002Fmodule this configuration is placed inside is always included.\n\nIt’s useful to include projects when you need to translate also strings from your libraries, etc.\n\n```groovy\nlocalazy {\n    upload {\n        projects {\n            include project(\":anotherProject\")\n        }\n    }\n}\n```\n\n#### analysis\n\nAllows skipping strings with listed keys from the pre-upload analysis that checks your strings for those that you are likely to exclude from the upload, and those that don't have default translation.\n\nYou can disable the analysis completely using `ignoreMissingDefault` and `ignorePrivateStrings`.\n\nIt's possible to use wildcard characters `*` and `?`.\n\n```groovy\nlocalazy {\n    upload {\n        analysis {\n            skip \"key_1\"\n            skip \"key_2\"\n            skip \"key_3\"\n        }\n    }\n}\n```\n\n#### include\n\nAllows manual including of strings that are excluded by the pre-upload analysis because they may contain private or sensitive data.\n\nIt's possible to use wildcard characters `*` and `?`.\n\n```groovy\nlocalazy {\n    upload {\n        include {\n            string \"key_1\"\n            string \"key_2\"\n            string \"key_3\"\n        }\n    }\n}\n```\n\n\n### download\n\nThe `download` section tells the plugin on how to download data and how to behave if data or the internet connection is not available. The downloaded data are cached and used when building the app.\n\n| Name | Type | Default | Description\n| --- | --- | --- | ---\n| `enabledForRelease` | boolean | true | If set to *true*, download new strings from Localazy for release builds.\n| `enabledForDebug` | boolean | true |  If set to *true*, download new strings from Localazy for debug builds.\n| `errorOnFailureRelease` | boolean | true |  If set to *true*, fail if data cannot be downloaded for release builds. If *false*, silently ignore the problem and show a warning. We strongly discourage you from settings this option to false!\n| `errorOnFailureDebug` | boolean | true |  If set to *true*, fail if data cannot be downloaded for debug builds. If *false*, silently ignore the problem and show a warning.\n| `redownloadInterval` | long | 3600 | Configures how often to re-download data from Localazy in seconds. The minimum is 900 seconds.\n\n### injection\n\nThe `injection` section allows you to configure how the Android library is integrated into your app.\n\n| Name | Type | Default | Description\n| --- | --- | --- | ---\n| `enabledForRelease` | boolean | true | If set to *false*, the code injection of the Android library is disabled for release builds.\n| `enabledForDebug` | boolean | true | If set to *false*, the code injection of the Android library is disabled for debug builds.\n| `library` | string | androidx | \u003Cmark title=\"Since Localazy Gradle plugin 1.3.0\">1.3.0+\u003C\u002Fmark> Automatically adds the Localazy Android library as dependency. Allowed values are **none** (don't add library), **androix** (add AndroidX version), **plain** (add plain Android version), **support** (add version with the legacy support libraries). \n| `installRepositories` | boolean | true | \u003Cmark title=\"Since Localazy Gradle plugin 1.5.0\">1.5.0+\u003C\u002Fmark> Do not add Localazy repository automatically. It's important if you want to have repositories defined in `settings.gradle`.\n| `dontUpdateForDebug` | boolean | false | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.1\">1.2.1+\u003C\u002Fmark> If set to **true**, OTA updates and stats collecting is disabled for the development\u002Fdebug builds.\n| `dontCheckInternetPermission` | boolean | false | \u003Cmark title=\"Since Localazy Gradle plugin 1.3.0\">1.3.0+\u003C\u002Fmark> If set to **true**, the plugin doesn't check whether INTERNET permission is granted to the app.\n| `updateInterval` | int | 86400 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> How often to check for new translations in seconds. Minimal value is 3600.\n| `updateIntervalForFailure` | int | 14400 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> How often to check for new translations in seconds if the previous request failed. Minimal value is 900.\n| `updateDelay` | int | 0 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> How many seconds to delay the first check for new translations. By settings this value, you can filter out users that install the app and remove it almost immediately. \n| `statsInterval` | int | 86400 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> How often to send collected stats to our servers. Minimal value is 900.\n| `statsIntervalForFailure` | int | 14400 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> How often to send collected stats to our server if the previous request failed. Minimal value is 900. \n| `statsDelay` | int | 300 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> How many seconds to delay the first sending of collected stats. By settings this value, you can filter out users that install the app and remove it almost immediately.\n| `minimalStatsSize` | int | 2048 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> Defines the minimal size of the collected stats package before it's sent to our servers in bytes. Keep this small to receive stats from users.   \n| `maximalStatsSize` | int | 262144 | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> Defines the maximal size of the file for collecting stats. There are three files for stats, so Localazy needs storage equal to `3 x maximalStatsSize`. If the maximal size is reached, stats are no longer collected until successfully sent to our servers. \n| `updateForActivityOnly` | boolean | true | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> If set to **true**, translations are only updated when **Activity** is shown. It prevents unwanted updates (and lower the number of DAU requests) from background services and receivers.     \n| `sendStatsRegularly` | boolean | false | \u003Cmark title=\"Since Localazy Gradle plugin 1.2.0\">1.2.0+\u003C\u002Fmark> If set to **true**, collected stats are sent to our servers periodically. If set to **false**, collected stats are only sent after a translation update request (no matter if translations were updated or not). It prevents too many requests to our servers and thus lowers the number of DAU requests (and your price). If set to **false**, `statsInterval`, `statsIntervalForFailure` and `statsDelay` are ignored.\n| `enableApplicationTransform` | boolean | false | If set to *true*, the code injection is applied also to subclasses of `android.app.Application`. This is generally not needed and there are known issues with Firebase when enabled. Enable this only if you really need it.\n| `exclude` | method | _n\u002Fa_ | Allows excluding classes from the injection process. See [exclude](#exclude).\n| `installRepositories` | boolean | true | \u003Cmark title=\"Since Localazy Gradle plugin 1.3.0\">1.3.0+\u003C\u002Fmark> Automatically install Localazy repository to all subprojects of the root project, so you don't need to do so manually.\n| `loyalUsersOnly` | method | _n\u002Fa_ | \u003Cmark title=\"Since Localazy Gradle plugin 1.3.0\">1.3.0+\u003C\u002Fmark> Call this method to set `updateInterval`, `updateIntervalForFailure`, `updateDelay` and other options to values suitable for delivering updates to only long-term loyal users. \n\n::: warning\nIf the injection is disabled, Localazy can’t update translations on the fly and can’t optimize how your app is translated!\n:::\n\n::: warning\nIf you set `library` to `none`, you need to add the dependency manually or disable injection using `enabledForRelease` and `enabledForDebug`. \n:::\n\n::: info\nIf you do changes to injection settings, be sure to clean and rebuild your project.\n:::\n\n#### exclude\n\nThe injection process modifies the bytecode of produced class files. You can exclude classes for which the injection process is undesired. To exclude class, you specify its fully qualified name or use wildcard `*` for a single path segment or `**` for everything.\n\nIt’s normally not necessary to exclude classes, and you shouldn’t do so unless there is a good reason for it.\n\n```groovy\nlocalazy {\n    injection {\n\n        \u002F\u002F Exclude class com.localazy.test.Class1\n        exclude \"com.localazy.test.Class1\"\n\n        \u002F\u002F Exclude any class in package com.localazy.test but NOT in subpackages\n        exclude \"com.localazy.test.*\"\n\n        \u002F\u002F Exclude any class in package com.localazy.test and all subpackages\n        exclude \"com.localazy.test.**\"\n\n        \u002F\u002F Exclude class Class1 in any package\n        exclude \"**.Class1\"\n\n        \u002F\u002F Define more rules with a single line\n        exclude \"package.Class1\", \"package.Class2\", \"package.Class3\"\n\n    }\n}\n```\n\n::: warning\nTake care when excluding classes as it may cause undesired effects and incomplete translation of your app.\n:::\n\n### resources\n\nWith Localazy, you don’t need to download XML files manually. The plugin overwrites all strings in your app with the most recent version from the translation platform. It also adds languages that are available in Localazy but not in your app.\n\nIt never changes your source code nor your XML resources. All changes take place during the compilation only while the Android Gradle plugin merges resources.\n\nThe `resources` section configures how your resources are updated with new translations.\n\n| Name | Type | Default | Description\n| --- | --- | --- | ---\n| `enabledForRelease` | boolean | true | If set to *true*, your string resources are automatically merged with new strings from Localazy for release builds.\n| `enabledForDebug` | boolean | true | If set to *true*, your string resources are automatically merged with new strings from Localazy for debug building.\n| `failOnMissingDataRelease` | boolean | true | If set to *true*, the build process fails if data are missing and cannot be merged with release builds. If *false*, resources are not updated, and this step is silently skipped. We strongly discourage you from settings this option to false!\n| `failOnMissingDataDebug` | boolean | true | If set to *true*, the build process fails if data are missing and cannot be merged with debug builds. If *false*, resources are not updated, and this step is silently skipped.\n\n::: info\nIf you do changes to resources settings, be sure to clean and rebuild your project.\n:::\n\n## Uploading strings\n\nWhen the plugin is configured, new Gradle tasks are available for uploading strings to the translation platform.\n\n### uploadStrings\n\nWhen used for the first time \u002F in a new project, upload strings in all languages for translation.\n\nSubsequent uses upload only changes to the base language as all future changes to strings should be made only to the base language.\n\nThis task uses hidden `.localazy` file in the project directory to store state information.\n\n::: info \nNot available if upload.showUploadAll is set to true. \n:::\n\n### uploadBaseStrings\n\nUpload strings in the base language for translation.\n\nFor the first time, you should upload your strings in all languages with [uploadAllStrings](#uploadallstrings). Then, do changes to the base language only and use this task to upload changes for translation.\n\n::: info\nOnly available if upload.showUploadAll is set to true.\n:::\n\n### uploadAllStrings\n\nUpload strings in all languages for translation.\n\nThis should be used only for the first time. In the future, you should add new strings to the base language only and upload changes with [uploadBaseStrings](#uploadbasestrings).\n\n::: info \nOnly available if upload.showUploadAll is set to true. \n:::\n\n\n## Links\n\n**[Frequently asked questions](\u002Fdocs\u002Fandroid\u002Fgradle-plugin-faq)** - Learn more about advanced topics related to Localazy Gradle plugin.    \n\n**[Localazy Android library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library)** - Dive deeper into the magic; there's more you can do with Localazy. \n\n**[What you should know before uploading strings](\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings)** - Learn more about key aspects to consider if you are serious about translating your app.  \n",["Reactive",1863],{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":1868,"featured_icon":1869},"2022-03-17T12:23:29.000Z","Android SDK Documentation","Localazy Android Documentation","How to add more languages to the Android app using Localazy. Comprehensive documentation.",{"id":798},{"id":800},["Reactive",1871],{"id":57,"status":5,"sort":37,"created_on":1872,"name":1873},"2022-03-18T07:38:52.000Z","Usage",["Reactive",1875],[1876,1886,1892],{"id":37,"status":5,"title":1877,"content":1878,"slug":1879,"created_on":1880,"modified_on":1881,"owner":1855,"meta_title":10,"category":1882},"Why Gradle plugin doesn't inject the Localazy Android library?","When you configure the Localazy Gradle plugin or change its configuration, be sure to clean the project.\nWe use caching and incremental builds wherever possible to speed up the building of your app. Without cleaning your project, the compiled classes may not be re-compiled, and changes not applied. ","the-gradle-plugin-does-not-inject-localazy-android-library","2022-03-17T12:23:00.000Z","2023-05-26T19:27:32.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},"2022-03-17T12:22:57.000Z","android-integration","Android integration",{"id":61,"status":5,"title":1887,"content":1888,"slug":1889,"created_on":1880,"modified_on":1890,"owner":1855,"meta_title":10,"category":1891},"How to download the latest version of strings.xml?","![Translation graph](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fedc4e5bf-4841-4291-b7ad-92e0c672a775)\n\nAt this moment, all you need is our Gradle plugin. When you **build your app**, the latest version of XML is automatically downloaded. By default, automatic publishing is enabled and **changes may take up to 15 minutes to apply**.\n\nYou can **skip** this interval by **publishing the latest release manually**.\n\nAlso, **it's a good idea to run Gradle clean to remove data from the cache. We use also local caching to speed up the build process.**\n\n**To test** your new language availability, all you need is to **switch your device language** as Localazy follows user device locale by default. You can, of course, offer a language selector to your users if you would like to.","how-to-get-latest-version-of-xml-back","2023-05-26T19:27:48.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":15,"status":5,"title":1893,"content":1894,"slug":1895,"created_on":1880,"modified_on":1896,"owner":1855,"meta_title":10,"category":1897},"How much Localazy plugin has hold on application code?","The plugin indeed changes the bytecode of your app in several places. It looks for certain patterns to identify where the changes are needed. However, it never sends your source code nor the bytecode to anywhere and all changes are made strictly to inject the OTA feature.\n\nHonestly, any plugin you add to your project can access your source code, resources and bytecode and our plugin is no different from Firebase or Google Services in term how it changes your bytecode.\n\n**We are ready to sign a contract binding us to not send your source code, resources or bytecode anywhere and inject only code strictly needed for OTA features.**\n\nThe second option is to use our CLI, but you will lose the comfort of the automatic resolution of your project structure and OTA updates.","how-much-localazy-plugin-has-hold-on-application-code","2023-05-25T14:29:43.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},["Reactive",1899],[1900,1906,1909,1914,1919],{"id":87,"status":5,"owner":1855,"created_on":1901,"title":1902,"excerpt":1903,"content":1904,"slug":1905,"meta_title":10,"meta_description":10,"canonical":10},"2022-03-17T12:22:55.000Z","Kotlin","An open-source statically typed programming language that targets the JVM, Android, JavaScript, and Native.","[Kotlin](https:\u002F\u002Fkotlinlang.org\u002F) is a programming language developed by [JetBrains](https:\u002F\u002Fwww.jetbrains.com\u002F). \n\nAs a statically typed programming language, it can be run on multiple operating systems. Kotlin also has both object-oriented and functional constructs.\n\nIt’s a general-purpose programming language which means it can run on JVM, Android, and JavaScript.\n\nAndrey Breslav, Kotlin’s development lead, said Kotlin is designed to be an industrial-strength object-oriented language, and a “better language” than Java, but still be fully interoperable with Java code, allowing companies to make a gradual migration from Java to Kotlin.\n\n## References:\n- [Kotlinlang.org](https:\u002F\u002Fkotlinlang.org\u002F)\n- [Why Localazy developers love Kotlin?](\u002Fblog\u002Finterview-jetbrains-why-localazy-developers-love-kotlin)\n- [Kotlin-related articles on our blog](\u002Ftags\u002Fkotlin)","kotlin",{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},"A mobile operating system (OS) primarily designed for touchscreen devices such as smartphones and tablets.","Based on a modified version of the Linux operating system kernel with proprietary elements (such as Google Play), the Android operating system is currently one of the most popular solutions for mobile devices and smart TVs.\n\n## Distributions of OS based on Android:\n\n+ LineageOS and Replicant\n+ \u002Fe\u002F\n\n![StatCounter](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F2af45fe7-e7e2-463d-940f-75b0c49a79ba\n)\n\n## Some alternatives to Android:\n\n+ iOS\n+ TizenOS\n+ PureOS\u002FLibrem\n+ LuneOS\n+ SailfishOS\n\n## Useful information about Android:\n\n+ [Android Studio](\u002Fdictionary\u002Fandroid-studio\u002F) for development\n+ [Android Gradle Plugin](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) - Build automation tool",{"id":331,"status":5,"owner":1855,"created_on":1901,"title":1910,"excerpt":1911,"content":1912,"slug":1913,"meta_title":10,"meta_description":10,"canonical":10},"Gradle","An open-source build automation tool that is designed to be flexible enough to build almost any type of software. ","Gradle helps teams build, automate and deliver better software, faster. \n\nGradle's rich API and mature ecosystem of plugins and integrations allow for real build automation from end to end.\n\nFor example, Altogether with [Android Studio](\u002Fdictionary\u002Fandroid-studio\u002F), Gradle can help integrate Localazy easily with your Android App thanks to [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) available.","gradle",{"id":257,"status":5,"owner":1855,"created_on":1901,"title":1915,"excerpt":1916,"content":1917,"slug":1918,"meta_title":10,"meta_description":10,"canonical":10},"Android Studio","Android Studio, an official Integrated Development Environment for Android mobile OS development.","Based on [IntelliJ IDEA](\u002Fdictionary\u002Fintellij-idea) by JetBrains, Android Studio is the official development environment for Android operating system, initially developed by Android Inc., lately acquired by Google.\n\n\u003Ca href=\"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\" target=\"_blank\" rel=\"nofollow\">Android Studio\u003C\u002Fa> is now available for Linux based operating systems, macOS and MS Windows under freeware license.\n\nAndroid Studio is a part of Google Developers environment, where not only Android developers can benefit from other services such as [Google Firebase](\u002Fdictionary\u002Ffirebase) or Google Cloud Platform.","android-studio",{"id":252,"status":5,"owner":1855,"created_on":1901,"title":1920,"excerpt":1921,"content":1922,"slug":1923,"meta_title":10,"meta_description":10,"canonical":10},"Java","Java is an object-oriented programming language used to create applications for various platforms.","The object-oriented computer programming language Java was developed to provide an easy way for developers to build various applications and is considered one of the most popular programming languages.\n\nJames Gosling developed the original version of Java while working at Sun Microsystems as a software engineer in the 1990s. The language's popularity has led to its use in many applications today.\n\nRemember, Java should not be confused with [JavaScript](\u002Fdictionary\u002Fjavascript).\n\nJava is designed to be easy to use and easy to understand. It has the same basic concepts in all computer systems so that if you write a program in Java, you can expect it to work on most devices.\n\nThis programming language lets you create standalone, interactive programs called applets. Java is designed to let you write the code once and run it anywhere without extensive modifications.\n\nJava applications are compiled to bytecode, which can run on any Java Virtual Machine (JVM), notwithstanding the computer architecture because Java is platform-independent. \n\n## Further reading\n- [Java localization](\u002Fproperties)\n- [Kotlin](\u002Fdictionary\u002Fkotlin)\n- [Official website](https:\u002F\u002Fwww.java.com\u002Fen\u002F)\n","java",["Reactive",1925],[],["Reactive",1927],[1928],{"id":25,"documentation_id":25,"languages_code":925,"slug":1858,"title":1859,"content":1861,"meta_title":1859,"meta_description":1860,"excerpt":1860},[1930,1933,1936,1939,1942,1945,1948,1951,1954,1957,1960,1963,1966,1969,1973,1976,1979,1983,1987],{"key":1931,"value":1932,"note":10},"___GRADLE_DEPENDENCY___","com.localazy:gradle:1.5.4",{"key":1934,"value":1935,"note":10},"___LIBRARY_VERSION___","1.2.1",{"key":1937,"value":1938,"note":10},"___REPOSITORY_URL___","https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Frelease\u002F",{"key":1940,"value":1941,"note":10},"___URL_DOCS___","https:\u002F\u002Flocalazy.com\u002Fdocs",{"key":1943,"value":1944,"note":10},"___URL_DOCS_ANDROID_LIBRARY___","https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-android-library",{"key":1946,"value":1947,"note":10},"___URL_DOCS_ANDROID_GRADLE___","https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin",{"key":1949,"value":1950,"note":10},"___URL_DOCS_WHAT_SHOULD_YOU_KNOW___","https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings",{"key":1952,"value":1953,"note":10},"___CLI_VERSION___","v2.0.11",{"key":1955,"value":1956,"note":10},"___USER_WRITE_KEY___","your-write-key",{"key":1958,"value":1959,"note":10},"___USER_READ_KEY___","your-read-key",{"key":1961,"value":1962,"note":10},"___CLI_LINKS___","  ",{"key":1964,"value":1965,"note":10},"___CLI_TYPES___","| File | Types |\n| --- | --- |\n| Flutter ARB | `arb json` |\n| JSON | `json` |\n| JSON - multilingual | `json multilingual` |\n| JSON - RequireJS | `json requirejs` |\n| Android (uploaded with Gradle) | `android xml gradle` |\n| Android (uploaded with CLI) | `android xml upload` |\n| iOS .strings | `ios-strings ios strings` |\n| iOS .plist | `ios-plist ios plist` |\n| iOS .stringsdict | `ios-stringsdict ios stringsdict` |\n| iOS .xcstrings | `xcstrings ios json` |\n| XLIFF 1.2 | `xliff xml 1.2` |\n| XLIFF 2.0 | `xliff xml 2.0` |\n| TMX | `tmx translation-memory` |\n| PO files | `po gettext` |\n| YAML | `yaml` |\n| YAML - Rails i18n | `yaml lang-root` |\n| YAML - multilingual | `yaml multilingual` |\n| RESX | `resx xml` |\n| JSON5 | `json5` |\n| JSON5 - multilingual | `json5 multilingual` |\n| HJSON | `hjson` |\n| HJSON - multilingual | `hjson multilingual` |\n| JavaScript | `js` |\n| JavaScript - multilingual | `js multilingual` |\n| Java Properties | `properties java` |\n| INI files | `ini` |\n| INI files - multilingual | `ini multilingual` |\n| PHP | `php` |\n| PHP - multilingual | `php multilingual` |\n| Qt Linquist TS  | `qt-ts ts qt xml linquist` |\n| Text | `text single file` |\n| CSV | `csv` |\n| CSV - multilingual | `csv multilingual` |\n| NEON | `neon` |\n| NEON - multilingual | `neon multilingual` |\n| TOML | `toml` |\n| TOML - multilingual | `toml multilingual` |\n| Excel | `excel xls xlsx` |\n| Excel - multilingual | `excel xls xlsx multilingual` |\n| OpenOffice ODS | `ods openoffice` |\n| OpenOffice ODS - multilingual | `ods openoffice multilingual` |\n| SRT Subtitles | `srt subtitles subrip` |\n| Adobe Captivate | `captivate adobe xml` |",{"key":1967,"value":1968,"note":10},"___CLI_TYPE_TABLES___","| Name | Type | Description |\n| --- | --- | --- |\n| [**Android**](\u002Fdocs\u002Fcli\u002Fandroid-format) | [**android**](\u002Fdocs\u002Fcli\u002Fandroid-format) | Full support for Android XML including array-lists and plurals. |\n| [**iOS \u002F macOS**](\u002Fdocs\u002Fcli\u002Fios-format) | [**xcstrings**](\u002Fdocs\u002Fcli\u002Fxcstrings-format)\u003Cbr \u002F>[**ios-strings**](\u002Fdocs\u002Fcli\u002Fios-format)\u003Cbr \u002F>[**ios-stringsdict**](\u002Fdocs\u002Fcli\u002Fios-format)\u003Cbr \u002F>[**ios-plist**](\u002Fdocs\u002Fcli\u002Fios-format)\u003Cbr \u002F>[**xliff**](\u002Fdocs\u002Fcli\u002Fxliff-12-format) | Full support including extended support for arrays and plurals. | \n| [**Flutter ARB**](\u002Fdocs\u002Fcli\u002Fflutter-arb-format) | [**arb**](\u002Fdocs\u002Fcli\u002Fflutter-arb-format) | Full support for Flutter ARB format including arrays and plurals. |\n| [**JSON**](\u002Fdocs\u002Fcli\u002Fjson-format) | [**json**](\u002Fdocs\u002Fcli\u002Fjson-format) | Plain JSON, structured JSON, Mozilla i18n, RequireJS, etc. |\n| [**JavaScript**](\u002Fdocs\u002Fcli\u002Fjavascript-format) | [**js**](\u002Fdocs\u002Fcli\u002Fjavascript-format) | Support for JavaScript files including arrays, plurals, etc. |\n| [**XLIFF 1.2**](\u002Fdocs\u002Fcli\u002Fxliff-12-format) | [**xliff**](\u002Fdocs\u002Fcli\u002Fxliff-12-format) | XLIFF 1.2 with a support for plurals and arrays. |\n| [**XLIFF 2.0**](\u002Fdocs\u002Fcli\u002Fxliff-20-format) | [**xliff**](\u002Fdocs\u002Fcli\u002Fxliff-20-format) | XLIFF 2.0 with a support for plurals and arrays. |\n| [**TMX**](\u002Fdocs\u002Fcli\u002Ftmx-format) | [**tmx**](\u002Fdocs\u002Fcli\u002Ftmx-format) | Translation Memory Exchange files (TMX). |\n| [**PO**](\u002Fdocs\u002Fcli\u002Fpo-format) | [**po**](\u002Fdocs\u002Fcli\u002Fpo-format)\u003Cbr \u002F>[**pot**](\u002Fdocs\u002Fcli\u002Fpo-format) | PO files with a support for plurals. |\n| [**YAML**](\u002Fdocs\u002Fcli\u002Fyaml-format) | [**yaml**](\u002Fdocs\u002Fcli\u002Fyaml-format) | YAML with a support for plurals, arrays and Ruby on Rails. |\n| [**RESX**](\u002Fdocs\u002Fcli\u002Fresx-format) | [**resx**](\u002Fdocs\u002Fcli\u002Fresx-format) | RESX with a custom support for plurals and arrays. |\n| [**JSON5**](\u002Fdocs\u002Fcli\u002Fjson5-format) | [**json5**](\u002Fdocs\u002Fcli\u002Fjson5-format) | Support for JSON5 - plain, structured, arrays, plurals, etc. |\n| [**HJSON**](\u002Fdocs\u002Fcli\u002Fhjson-format) | [**hjson**](\u002Fdocs\u002Fcli\u002Fhjson-format) | Support for HJSON - plain, structured, arrays, plurals, etc. |\n| [**Java Properties**](\u002Fdocs\u002Fcli\u002Fhjson-format) | [**properties**](\u002Fdocs\u002Fcli\u002Fhjson-format) | Java Properties with a custom support for plurals and arrays. |\n| [**INI**](\u002Fdocs\u002Fcli\u002Fini-format) | [**ini**](\u002Fdocs\u002Fcli\u002Fini-format) | INI files with support for different encodings, plurals and arrays. |\n| [**PHP**](\u002Fdocs\u002Fcli\u002Fphp-format) | [**php**](\u002Fdocs\u002Fcli\u002Fphp-format) | Array-based PHP files with support for Laravel format. |\n| [**Qt TS**](\u002Fdocs\u002Fcli\u002Fqt-ts-format) | [**qt-ts**](\u002Fdocs\u002Fcli\u002Fqt-ts-format) | Qt Linquist TS format with many different parsing options. |\n| [**TOML**](\u002Fdocs\u002Fcli\u002Ftoml-format) | [**toml**](\u002Fdocs\u002Fcli\u002Ftoml-format) | TOML format with a support for plurals and arrays. | \n| [**NEON**](\u002Fdocs\u002Fcli\u002Fneon-format) | [**neon**](\u002Fdocs\u002Fcli\u002Fneon-format) | Neon (Nette Object Notation) with a support for plurals and arrays. | \n| [**CSV\u002FTSV**](\u002Fdocs\u002Fcli\u002Fcsv-format) | [**csv**](\u002Fdocs\u002Fcli\u002Fcsv-format) | Configurable CSV\u002FTSV with a support for plurals and arrays. |\n| [**Microsoft Excel**](\u002Fdocs\u002Fcli\u002Fexcel-format) | [**excel**](\u002Fdocs\u002Fcli\u002Fexcel-format) | Microsoft Excel XLS\u002FXLSX files with a support for plurals and arrays. |\n| [**OpenOffice ODS**](\u002Fdocs\u002Fcli\u002Fods-format) | [**ods**](\u002Fdocs\u002Fcli\u002Fods-format) | OpenOffice\u002FLibreOffice Spreadsheet files with a support for plurals and arrays. |\n| [**SRT Subtitles**](\u002Fdocs\u002Fcli\u002Fsrt-format) | [**srt**](\u002Fdocs\u002Fcli\u002Fsrt-format) | SubRip SRT subtitle files. |\n| [**Plain Texts**](\u002Fdocs\u002Fcli\u002Fplain-text-format) | [**text**](\u002Fdocs\u002Fcli\u002Fplain-text-format) | Single text files - App Store description, Play Store description, README, documentation, etc. |\n| **Adobe Captive** | **captivate** | Adobe Captivate files. |",{"key":1970,"value":1971,"note":1972},"___ZAPIER_TEMPLATES___","\u003Czapier-zap-templates apps=\"localazy\" create-without-template=\"hide\" limit=\"10\" use-this-zap=\"show\" theme=\"light\">\u003C\u002Fzapier-zap-templates>","Embed Zapier templates for Localazy integration.",{"key":1974,"value":1975,"note":10},"___CLI_FORMAT_CONVERSIONS___","\u003C!-- DONT CHANGE THE BLOCK BELOW - IT'S AUTOGENERATED. -->\n\n## Available conversions\n\n- `android` - Convert to Android XML\n- `arb` - Convert to Flutter ARB\n- `csv` - Convert to CSV\u002FTSV\n- `csv-multilingual` - Convert to multilingual CSV\u002FTSV\n- `excel` - Convert to Excel (.xls\u002F.xlsx)\n- `excel-multilingual` - Convert to multilingual Excel (.xls\u002F.xlsx)\n- `ini` - Convert to INI\n- `ini-multilingual` - Convert to multilingual INI\n- `ios-strings` - Convert to iOS's .strings\n- `ios-stringsdict` - Convert to iOS's .stringsdict\n- `json` - Convert to JSON\n- `json-mozilla` - Convert to Mozilla i18n JSON\n- `json-multilingual` - Convert to multilingual JSON\n- `mo` - Convert to Gettext MO file\n- `neon` - Convert to Nette Neon\n- `neon-multilingual` - Convert to multilingual Nette Neon\n- `ods` - Convert to OpenOffice (.ods)\n- `ods-multilingual` - Convert to multilingual OpenOffice (.ods)\n- `php` - Convert to PHP\n- `php-multilingual` - Convert to multilingual PHP\n- `po` - Convert to Gettext PO file\n- `tmx` - Convert to Translation Memory (TMX)\n- `toml` - Convert to TOML\n- `toml-multilingual` - Convert to multilingual TOML\n- `xcstrings` - Convert to XCode Strings Catalog\n- `xliff12` - Convert to XLIFF 1.2\n- `xliff20` - Convert to XLIFF 2.0\n- `yaml` - Convert to YAML\n- `yaml-multilingual` - Convert to multilingual YAML\n- `yaml-rails` - Convert to Rails i18n YAML\n\n## Detailed information\n\n### android | Convert to Android XML\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `force_underscore` - Force underscore character even for dots (`.`).\n  - `no`  _[default]_ - Don't use underscore character for dots\n  - `yes`  - Use underscore characters for dots\n- `escape_new_lines` - Escape new lines with `\\n`.\n  - `no`  _[default]_ - Use standard line breaks\n  - `yes`  - Escape new lines with `\\n`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n\n### arb | Convert to Flutter ARB\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `no`  - Don't flatten structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `arb_locale` - Generating @@locale key\n  - `none`  - Don't generate @@locale\n  - `lang`  - Generate @@locale with language code only\n  - `full`  _[default]_ - Generate @@locale with full locale\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` _[default]_ - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### csv | Convert to CSV\u002FTSV\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n  - `ansi`  - ANSI ASCII\n- `delimiter` - Column delimiter\n  - `comma`  _[default]_ - Use COMMA as as delimiter\n  - `semicolon`  - Use SEMICOLON as a delimiter\n  - `tab`  - Use TAB as a delimiter\n- `quotes` - Quotes\n  - `double`  _[default]_ - Use double quotes\n  - `single`  - Use single quotes\n  - `backslash`  - Use backslashes\n- `force_quotes` - Force quotes\n  - `true`  - Force quotes for all values\n  - `false`  _[default]_ - Only quote values if necessary\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### csv-multilingual | Convert to multilingual CSV\u002FTSV\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n  - `ansi`  - ANSI ASCII\n- `delimiter` - Column delimiter\n  - `comma`  _[default]_ - Use COMMA as as delimiter\n  - `semicolon`  - Use SEMICOLON as a delimiter\n  - `tab`  - Use TAB as a delimiter\n- `quotes` - Quotes\n  - `double`  _[default]_ - Use double quotes\n  - `single`  - Use single quotes\n  - `backslash`  - Use backslashes\n- `force_quotes` - Force quotes\n  - `true`  - Force quotes for all values\n  - `false`  _[default]_ - Only quote values if necessary\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### excel | Convert to Excel (.xls\u002F.xlsx)\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### excel-multilingual | Convert to multilingual Excel (.xls\u002F.xlsx)\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n- `excel_type` - Excel file format\n  - `xlsx`  _[default]_ - New OpenDocument XML format (Excel 2007+)\n  - `xls`  - Old XLS format (Excel 2003 and below)\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### ini | Convert to INI\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `force_escaping` - Forcing aggressive escaping.\n  - `true`  - Force escaping\n  - `false`  _[default]_ - Don't force unnecessary escaping\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n  - `ansi`  - ANSI ASCII\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### ini-multilingual | Convert to multilingual INI\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `force_escaping` - Forcing aggressive escaping.\n  - `true`  - Force escaping\n  - `false`  _[default]_ - Don't force unnecessary escaping\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n  - `ansi`  - ANSI ASCII\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### ios-strings | Convert to iOS's .strings\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n\n### ios-stringsdict | Convert to iOS's .stringsdict\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file.\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases.\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - strings are filtered out\n  - arrays are filtered out\n\n#### Required parameters\n- `variable` - Variable name for plural structure (VARIABLE, COUNT, ...)\n\n\n### json | Convert to JSON\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### json-mozilla | Convert to Mozilla i18n JSON\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### json-multilingual | Convert to multilingual JSON\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### mo | Convert to Gettext MO file\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n\n### neon | Convert to Nette Neon\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### neon-multilingual | Convert to multilingual Nette Neon\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### ods | Convert to OpenOffice (.ods)\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### ods-multilingual | Convert to multilingual OpenOffice (.ods)\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases.\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n\n\n### php | Convert to PHP\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### php-multilingual | Convert to multilingual PHP\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### po | Convert to Gettext PO file\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `encoding` - Output file encoding\n  - `auto`  _[default]_ - Automatic\n  - `utf8`  - UTF-8\n  - `utf16`  - UTF-16\n  - `utf16le`  - UTF-16LE\n  - `utf16be`  - UTF-16BE\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n\n### tmx | Convert to Translation Memory (TMX)\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterPlurals` is available\n  - arrays are filtered out\n\n\n### toml | Convert to TOML\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### toml-multilingual | Convert to multilingual TOML\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### xcstrings | Convert to XCode Strings Catalog\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterPlurals` is available\n  - arrays are filtered out\n\n\n### xliff12 | Convert to XLIFF 1.2\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n\n### xliff20 | Convert to XLIFF 2.0\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `flatten_keys` - Flattening structured keys\n  - `dot`  _[default]_ - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n\n### yaml | Convert to YAML\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### yaml-multilingual | Convert to multilingual YAML\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n- `lang_format` - Format of the locale used for multilingual keys\n  - `ll-rr-scrp`  _[default]_ - LL, LL-RR, LL-SCRP, LL-RR-SCRP\n  - `ll-rr#scrp`  - LL, LL-RR, LL#SCRP, LL-RR#SCRP\n  - `ll_scrp_rr`  - LL, LL_RR, LL_SCRP, LL_SCRP_RR\n  - `ll_rr_scrp`  - LL, LL_RR, LL_SCRP, LL_RR_SCRP\n  - `ll+rr+scrp`  - LL, LL+RR, LL+SCRP, LL+RR+SCRP\n  - `ll+scrp+rr`  - LL, LL+RR, LL+SCRP, LL+SCRP+RR\n  - `ll-scrp_rr`  - LL, LL_RR, LL-SCRP, LL-SCRP_RR\n  - `locale_name`  - Locale name (English, German, ...)\n  - `bcp`  - b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR\n  - `android_noscript`  - LL, LL-rRR, LL, LL-rRR\n  - `android`  - LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n### yaml-rails | Convert to Rails i18n YAML\n\n#### Supported input formats\n\nandroid, api, arb, csv, excel, hjson, ini, ios-plist, ios-strings, ios-stringsdict, js, json, json5, neon, ods, php, po, properties, qt-ts, resx, text, tmx, toml, xcstrings, yaml\n\n#### Parameters\n\n- `xcstrings_keep_structure` - Keeping iOS Strings Catalog structured keys.\n  - `true`  - Keep key structure\n  - `false`  _[default]_ - Convert structure to plain keys\n- `filter_untranslated` - Filtering of untranslated phrases\n  - `true`  - Filter untranslated phrases out of the file\n  - `false`  _[default]_ - Use the source language translation for the untranslated phrases\n- `clear_params` - Clearing additional phrases metadata.\n  - `true`  - Clear all additional phrase metadata\n  - `false`  _[default]_ - Keep additional phrase metadata, except for those changed for plurals\u002Farrays\n- `flatten_keys` - Flattening structured keys\n  - `no`  _[default]_ - Don't flatten structured keys\n  - `dot`  - Flatten structured keys with `.`\n  - `underscore`  - Flatten structured keys with `_`\n  - `dash`  - Flatten structured keys with `-`\n\n#### Filtering options\n\n  - `filterStrings` is available\n  - `filterArrays` is available\n  - `filterPlurals` is available\n\n#### Array types\n- `array` _[default]_ - Output string-array as array\n- `array_br` - Output string-array as keys suffixed by `[index]`\n\n#### Plural types\n- `plural_postfix_br` _[default]_ - Output plurals as keys suffixed by `[pluralForm]`\n- `plural_postfix_sd` - Output plurals as keys suffixed by `.pluralForm`\n- `plural_postfix_dd` - Output plurals as keys suffixed by `:pluralForm`\n- `plural_postfix_us` - Output plurals as keys suffixed by `_pluralForm`\n- `plural_postfix_cc` - Output plurals as keys suffixed by `PluralForm`\n- `plural_i18next` - Output plurals in i18Next format\n- `plural_object` - Output plurals as structured object\n- `plural_icu` - Output plurals in ICU message format\n    - _Required param:_ `variable` - Variable name for ICU message (count, variable, etc.)\n- `plural_array` - Output plurals as array of objects\n    - _Required param:_ `type` - Key used for storing the plural type\n    - _Required param:_ `content` - Key used for storing the translation\n\n\n",{"key":1977,"value":1978,"note":10},"___GRADLE_DEPENDENCY_V2___","com.localazy:gradle:2.0.3",{"key":1980,"value":1981,"note":1982},"___USER_REF_AFFIL___","`https:\u002F\u002Flocalazy.com\u002Fregister?ref=YOUR-REF-ID`","If the user is signed in, the value is replaced by his ref affil code. ",{"key":1984,"value":1985,"note":1986},"___USER_REF_PARTNER___","`https:\u002F\u002Flocalazy.com\u002Fregister?ref=YOUR-PARTNER-REF-ID`","If the user is signed in, the value is replaced by his ref partner code. ",{"key":1988,"value":1989,"note":10},"___CLI_REMAP_TYPES___","- android\n- json\n- json-multilingual\n- arb\n- require-js\n- json-mozzila\n- ios-strings\n- ios-plist\n- ios-stringsdict\n- resx\n- yaml\n- yaml-rails\n- yaml-multilingual\n- po\n- json5\n- json5-multilingual\n- hjson\n- hjson-multilingual\n- js\n- js-multilingual\n- properties\n- ini\n- ini-multilingual\n- php\n- php-multilingual\n- qt-ts\n- csv\n- csv-multilingual\n- neon\n- neon-multilingual\n- toml\n- toml-multilingual\n- excel\n- excel-multilingual\n- ods\n- ods-multilingual\n- tmx\n- xcstrings",[1991,2001,2013,2023,2037,2045,2056,2065,2076,2088,2103],{"id":20,"status":5,"sort":4,"created_on":1864,"slug":750,"name":745,"excerpt":1992,"subtitle":1993,"meta_title":1994,"meta_description":1995,"hidden":160,"icon":1996,"featured_icon":1997,"translations":1998,"blog_tags":2000,"docs_section_id":20},"Description of general Localazy features & settings. Learn about the details of our platform.","General Localazy Guides","Localazy General Documentation","How to SW internationalization. How to get multilanguage support for your app. How to localize software. Localazy guides available. ",{"id":752},{"id":755},[1999],{"id":20,"languages_code":925,"name":745,"excerpt":1992,"subtitle":1993,"slug":750,"meta_title":1994,"meta_description":1995,"docs_section_id":20},[],{"id":25,"status":5,"sort":20,"created_on":1864,"slug":540,"name":759,"excerpt":2002,"subtitle":2003,"meta_title":2004,"meta_description":2005,"hidden":160,"icon":2006,"featured_icon":2007,"translations":2008,"blog_tags":2010,"docs_section_id":25},"Start localizing your app with Localazy CLI, integrate it into your build chain or CI\u002FCD. Ideal for developers.","CLI Guides & Information","Localazy CLI Documentation","Guide to SW localization using Localazy, tool made by and for developers. Comprehensive documentation available here.",{"id":764},{"id":767},[2009],{"id":25,"languages_code":925,"name":759,"excerpt":2002,"subtitle":2003,"slug":540,"meta_title":2004,"meta_description":2005,"docs_section_id":25},[2011],{"id":280,"status":5,"created_on":2012,"label":759,"slug":540,"on_index_page":160},"2022-03-17T12:22:58.000Z",{"id":107,"status":5,"sort":25,"created_on":1864,"slug":775,"name":771,"excerpt":2014,"subtitle":2015,"meta_title":10,"meta_description":10,"hidden":160,"icon":2016,"featured_icon":2017,"translations":2018,"blog_tags":2020,"docs_section_id":107},"Localazy API reference, organized around REST. Articles about limits, endpoints and more.","API Documentation",{"id":764},{"id":778},[2019],{"id":107,"languages_code":925,"name":771,"excerpt":2014,"subtitle":2015,"slug":775,"meta_title":10,"meta_description":10,"docs_section_id":107},[2021],{"id":394,"status":5,"created_on":2022,"label":771,"slug":775,"on_index_page":160},"2022-03-17T12:22:59.000Z",{"id":252,"status":5,"sort":33,"created_on":2024,"slug":787,"name":783,"excerpt":2025,"subtitle":2026,"meta_title":2027,"meta_description":2028,"hidden":160,"icon":2029,"featured_icon":2030,"translations":2031,"blog_tags":2033,"docs_section_id":252},"2023-02-14T14:29:35.000Z","Deliver your translations with our global content delivery network.","Content Delivery Network","Localazy CDN ","Learn how to use the Localazy CDN to deliver new translations as soon as they are approved for production use. ",{"id":752},{"id":790},[2032],{"id":252,"languages_code":925,"name":783,"excerpt":2025,"subtitle":2026,"slug":787,"meta_title":2027,"meta_description":2028,"docs_section_id":252},[2034],{"id":2035,"status":5,"created_on":2036,"label":783,"slug":787,"on_index_page":160},69,"2023-02-21T14:08:07.000Z",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"excerpt":2038,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2039,"featured_icon":2040,"translations":2041,"blog_tags":2043,"docs_section_id":4},"Platform specific articles about the advanced features of Android apps in Localazy.",{"id":798},{"id":800},[2042],{"id":4,"languages_code":925,"name":593,"excerpt":2038,"subtitle":1865,"slug":592,"meta_title":1866,"meta_description":1867,"docs_section_id":4},[2044],{"id":33,"status":5,"created_on":2012,"label":593,"slug":592,"on_index_page":160},{"id":33,"status":5,"sort":41,"created_on":1864,"slug":599,"name":600,"excerpt":2046,"subtitle":2047,"meta_title":10,"meta_description":10,"hidden":160,"icon":2048,"featured_icon":2049,"translations":2050,"blog_tags":2052,"docs_section_id":33},"Platform specific articles about iOS apps in Localazy.","Swift SDK Documentation",{"id":808},{"id":811},[2051],{"id":33,"languages_code":925,"name":600,"excerpt":2046,"subtitle":2047,"slug":599,"meta_title":10,"meta_description":10,"docs_section_id":33},[2053],{"id":2054,"status":5,"created_on":2055,"label":600,"slug":599,"on_index_page":162},77,"2023-05-25T12:44:11.000Z",{"id":24,"status":5,"sort":45,"created_on":1864,"slug":670,"name":671,"excerpt":2057,"subtitle":2058,"meta_title":10,"meta_description":10,"hidden":160,"icon":2059,"featured_icon":2060,"translations":2061,"blog_tags":2063,"docs_section_id":24},"Start localizing your designs fast and easy with Figma design tool and Figma Plugin by Localazy","Figma Plugin",{"id":764},{"id":820},[2062],{"id":24,"languages_code":925,"name":671,"excerpt":2057,"subtitle":2058,"slug":670,"meta_title":10,"meta_description":10,"docs_section_id":24},[2064],{"id":411,"status":5,"created_on":2022,"label":671,"slug":670,"on_index_page":162},{"id":280,"status":5,"sort":53,"created_on":2066,"slug":663,"name":664,"excerpt":2067,"subtitle":2068,"meta_title":10,"meta_description":10,"hidden":160,"icon":2069,"featured_icon":2070,"translations":2071,"blog_tags":2073,"docs_section_id":280},"2022-06-08T13:03:58.000Z","Automate the localization of your Strapi project with the Strapi localization plugin by Localazy","Strapi Plugin",{"id":827},{"id":829},[2072],{"id":280,"languages_code":925,"name":664,"excerpt":2067,"subtitle":2068,"slug":663,"meta_title":10,"meta_description":10,"docs_section_id":280},[2074],{"id":951,"status":5,"created_on":2075,"label":664,"slug":663,"on_index_page":162},"2022-06-29T00:01:26.000Z",{"id":230,"status":5,"sort":57,"created_on":2077,"slug":2078,"name":2079,"excerpt":2080,"subtitle":2081,"meta_title":10,"meta_description":10,"hidden":160,"icon":2082,"featured_icon":2084,"translations":2085,"blog_tags":2087,"docs_section_id":230},"2023-08-22T11:35:21.000Z","directus","Directus","Automate the localization of your Directus project with the Directus localization plugin by Localazy","Directus plugin",{"id":2083},"b6669e8d-6702-4aa1-8e4f-978f9028c332",{"id":2083},[2086],{"id":230,"languages_code":925,"name":2079,"excerpt":2080,"subtitle":2081,"slug":2078,"meta_title":10,"meta_description":10,"docs_section_id":230},[],{"id":247,"status":5,"sort":19,"created_on":2089,"slug":2090,"name":2091,"excerpt":2092,"subtitle":2093,"meta_title":10,"meta_description":10,"hidden":160,"icon":2094,"featured_icon":2096,"translations":2098,"blog_tags":2100,"docs_section_id":247},"2022-07-18T13:27:47.000Z","zapier","Zapier","Connect Localazy with over 5000 apps with Zapier.","Integration Platform",{"id":2095},"a1fda7c9-4e8c-48f4-99ec-a111db6a6daa",{"id":2097},"0a5546c4-adbc-4636-8695-32867837e97d",[2099],{"id":247,"languages_code":925,"name":2091,"excerpt":2092,"subtitle":2093,"slug":2090,"meta_title":10,"meta_description":10,"docs_section_id":247},[2101],{"id":1250,"status":5,"created_on":2102,"label":2091,"slug":2090,"on_index_page":160},"2022-08-16T13:54:46.000Z",{"id":331,"status":5,"sort":71,"created_on":1864,"slug":76,"name":75,"excerpt":2104,"subtitle":2105,"meta_title":10,"meta_description":10,"hidden":162,"icon":2106,"featured_icon":2107,"translations":2109,"blog_tags":2111,"docs_section_id":331},"Learn how to connect Localazy to your favourite platform or framework.","Quick starts, Setup examples, Integration types,...",{"id":764},{"id":2108},"881c489b-4835-44ea-94b7-bda62cc57d6c",[2110],{"id":331,"languages_code":925,"name":75,"excerpt":2104,"subtitle":2105,"slug":76,"meta_title":10,"meta_description":10,"docs_section_id":331},[],[2113,2134,2153,2171,2187,2219,2240,2262,2287,2308,2332,2384,2400,2418,2442,2468,2489,2506,2522,2539],{"id":25,"status":5,"sort":1854,"created_on":1856,"modified_on":1857,"slug":1858,"title":1859,"excerpt":1860,"content":1861,"meta_title":1859,"meta_description":1860,"pinned":160,"main_image":10,"section":2114,"subsection":2117,"cta":10,"faq":2118,"dictionary":2125,"translations":2131,"documentation_id":25,"blog_articles":2133},{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2115,"featured_icon":2116},{"id":798},{"id":800},{"id":57,"status":5,"sort":37,"created_on":1872,"name":1873},[2119,2121,2123],{"id":37,"status":5,"title":1877,"content":1878,"slug":1879,"created_on":1880,"modified_on":1881,"owner":1855,"meta_title":10,"category":2120},{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":61,"status":5,"title":1887,"content":1888,"slug":1889,"created_on":1880,"modified_on":1890,"owner":1855,"meta_title":10,"category":2122},{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":15,"status":5,"title":1893,"content":1894,"slug":1895,"created_on":1880,"modified_on":1896,"owner":1855,"meta_title":10,"category":2124},{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},[2126,2127,2128,2129,2130],{"id":87,"status":5,"owner":1855,"created_on":1901,"title":1902,"excerpt":1903,"content":1904,"slug":1905,"meta_title":10,"meta_description":10,"canonical":10},{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},{"id":331,"status":5,"owner":1855,"created_on":1901,"title":1910,"excerpt":1911,"content":1912,"slug":1913,"meta_title":10,"meta_description":10,"canonical":10},{"id":257,"status":5,"owner":1855,"created_on":1901,"title":1915,"excerpt":1916,"content":1917,"slug":1918,"meta_title":10,"meta_description":10,"canonical":10},{"id":252,"status":5,"owner":1855,"created_on":1901,"title":1920,"excerpt":1921,"content":1922,"slug":1923,"meta_title":10,"meta_description":10,"canonical":10},[2132],{"id":25,"documentation_id":25,"languages_code":925,"slug":1858,"title":1859,"content":1861,"meta_title":1859,"meta_description":1860,"excerpt":1860},[],{"id":2135,"status":5,"sort":2136,"created_on":2137,"modified_on":2138,"slug":2139,"title":2140,"excerpt":2141,"content":2142,"meta_title":2140,"meta_description":2141,"pinned":160,"main_image":10,"section":2143,"subsection":2146,"cta":10,"faq":2147,"dictionary":2148,"translations":2149,"documentation_id":2135,"blog_articles":2152},218,"20003","2023-12-05T10:55:37.000Z","2024-07-17T05:45:06.000Z","agp-3_5-and-newer","Android Gradle Plugin 3.5+","Learn the easy way to localize your Android app, including OTA updates. Forget about sending strings.xml back and forth!","For Android Gradle Plugin 3.5 and newer, please follow instructions below. \n\n**1.** Open Android Studio, locate **gradle.build** file in your project’s **root** directory and add Localazy repository and Gradle plugin to the **buildscript** section.\n\n```groovy\nbuildscript {\n\n    repositories {\n        \u002F\u002F ... other repositories ...\n        maven { url \"___REPOSITORY_URL___\" }\n    }\n\n    dependencies {\n        \u002F\u002F ... other dependencies ...\n        classpath \"___GRADLE_DEPENDENCY___\"\n    }\n\n}\n```\n\n**2.** Open **gradle.build** file in your **app’s** module and add following snippet a the end of the file: \n\n```groovy\n\u002F\u002F Always be sure to add this after android { ... } section\napply plugin: 'com.localazy.gradle'\n\nlocalazy {\n    readKey \"the-read-key-for-the-project\"\n    writeKey \"the-write-key-for-the-project\"\n}\n```\n::: info\nRead more about [injection options](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection) to configure what type of library is injected and whether OTA updates are available for all users or loyal ones only.\n:::\n \n\n**And that’s it!** Your app is translated, and translations are updated automatically.\n\nNow, you can [configure the plugin](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#configure-the-plugin).",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2144,"featured_icon":2145},{"id":798},{"id":800},{"id":57,"status":5,"sort":37,"created_on":1872,"name":1873},[],[],[2150],{"id":2151,"documentation_id":2135,"languages_code":925,"slug":2139,"title":2140,"content":2142,"meta_title":2140,"meta_description":2141,"excerpt":2141},217,[],{"id":2154,"status":5,"sort":2155,"created_on":2156,"modified_on":2157,"slug":2158,"title":2159,"excerpt":2160,"content":2161,"meta_title":2159,"meta_description":2160,"pinned":160,"main_image":10,"section":2162,"subsection":2165,"cta":10,"faq":2166,"dictionary":2167,"translations":2168,"documentation_id":2154,"blog_articles":2170},187,"20005","2023-05-30T15:16:39.000Z","2025-02-17T14:50:04.000Z","agp-7-and-newer","Android Gradle Plugin 7.0+","A bit of fine-tuning is necessary for Android Gradle Plugin 7.0 and newer. Let's dive into it. ","For Android Gradle Plugin 7.0 and newer, please follow instructions below. \n\n**1.** Open Android Studio, locate **gradle.build** file in your project’s **root** directory and create a new **buildscript** section. The resulting file should look like:\n\n```groovy\nbuildscript {  \n    repositories {  \n        maven { url \"___REPOSITORY_URL___\" } \n    }  \n    dependencies {  \n        classpath \"___GRADLE_DEPENDENCY___\"  \n    }    \n}  \n  \nplugins {  \n    id 'com.android.application' version '7.4.0' apply false  \n    id 'com.android.library' version '7.4.0' apply false  \n    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false  \n}\n```\n\n**2.** Open the **settings.gradle** file and add Localazy repository `maven { url \"https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Frelease\u002F\" }` like this:\n\n```groovy\npluginManagement {  \n    repositories {  \n        google()  \n        mavenCentral()  \n        gradlePluginPortal()  \n    }  \n}  \ndependencyResolutionManagement {  \n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)  \n    repositories {  \n        maven { url \"___REPOSITORY_URL___\" }  \n        google()  \n        mavenCentral()  \n    }  \n}  \nrootProject.name = \"my-awesome-app\"  \ninclude ':app'\n```\n\n**3.** Open **gradle.build** file in your **app’s** module and add following snippet a the end of the file:\n\n```groovy\n\u002F\u002F Always be sure to add this after android { ... } section\napply plugin: 'com.localazy.gradle'\n \nlocalazy {\n    readKey \"the-read-key-for-the-project\"\n    writeKey \"the-write-key-for-the-project\"\n    injection {\n\t    installRepositories false\n    }\n}\n```\n::: info\nRead more about [injection options](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection) to configure what type of library is injected and whether OTA updates are available for all users or loyal ones only.\n:::\n\nNow, you can [configure the plugin](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#configure-the-plugin).",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2163,"featured_icon":2164},{"id":798},{"id":800},{"id":57,"status":5,"sort":37,"created_on":1872,"name":1873},[],[],[2169],{"id":2154,"documentation_id":2154,"languages_code":925,"slug":2158,"title":2159,"content":2161,"meta_title":2159,"meta_description":2160,"excerpt":2160},[],{"id":2151,"status":5,"sort":2172,"created_on":2173,"modified_on":2138,"slug":2174,"title":2175,"excerpt":2141,"content":2176,"meta_title":2175,"meta_description":2141,"pinned":160,"main_image":10,"section":2177,"subsection":2180,"cta":10,"faq":2181,"dictionary":2182,"translations":2183,"documentation_id":2151,"blog_articles":2186},"20007","2023-12-05T10:49:01.000Z","agp-8-and-newer","Android Gradle Plugin 8.0+","For Android Gradle Plugin 8.0 and newer, it's necessary to use our Gradle plugin 2.0.0+. Please follow instructions below. \n## Backup your resources\n\n**If you already have existing translations into other languages, backup your resources before using Localazy Gradle plugin!** Due to internal changes introduced to AGP 8.0+, we can no longer process your resources without modifying them as we could in the previous versions.\n\nWe never touch your `values` folder and never modify it! In locale-based folders (`values-fr`, `values-de`, etc.) we scan all XML files, remove known strings, string arrays and plurals that are already translated on Localazy and generate a new file `strings_localazy.xml` with updated translations. \n\nPlease do not modify `strings_localazy.xml`. It's automatically generated and changes would be lost on the next build. \n\nDo not worry, **we never modify your source code or anything else** except for strings, string arrays and plurals. \n\n## Gradle with Kotlin DSL\n\n**1.** Open Android Studio, locate **gradle.build.kts** file in your project’s **root** directory and create a new **buildscript** section. The resulting file should look like:\n\n```kotlin\nbuildscript {  \n    repositories {  \n        maven { \n\t        setUrl(\"___REPOSITORY_URL___\")\n        } \n    }  \n    dependencies {  \n        classpath(\"___GRADLE_DEPENDENCY_V2___\")\n    }    \n}  \n  \nplugins {  \n  id(\"com.android.application\") version \"8.1.4\" apply false  \n  id(\"org.jetbrains.kotlin.android\") version \"1.8.10\" apply false  \n}\n```\n\n**2.** Open the **settings.gradle.kts** file and add Localazy repository `https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Frelease\u002F` like this:\n\n```kotlin\npluginManagement {  \n    repositories {  \n        google()  \n        mavenCentral()  \n        gradlePluginPortal()  \n    }  \n}  \ndependencyResolutionManagement {  \n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)  \n    repositories {          \n        google()  \n        mavenCentral()  \n        maven { \n\t        setUrl(\"___REPOSITORY_URL___\")\n        }  \n    }  \n} \n\nrootProject.name = \"my-awesome-app\"  \ninclude(\":app\")\n```\n\n**3.** Open **gradle.build.kts** file in your **app’s** module and add following snippet a the end of the file:\n\n```groovy\n\u002F\u002F Always be sure to add this after android { ... } section\napply(plugin = \"com.localazy.gradle\")\n \nlocalazy {\n    readKey = \"the-read-key-for-the-project\"\n    writeKey = \"the-write-key-for-the-project\"\n}\n```\n::: info\nRead more about [injection options](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection) to configure what type of library is injected and whether OTA updates are available for all users or loyal ones only.\n:::\n\nNow, you can [configure the plugin](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#configure-the-plugin).\n\n## Gradle with Groovy\n\n**1.** Open Android Studio, locate **gradle.build** file in your project’s **root** directory and create a new **buildscript** section. The resulting file should look like:\n\n```groovy\nbuildscript {  \n    repositories {  \n        maven { url \"___REPOSITORY_URL___\" } \n    }  \n    dependencies {  \n        classpath \"___GRADLE_DEPENDENCY_V2___\"  \n    }    \n}  \n  \nplugins {  \n    id 'com.android.application' version '8.1.4' apply false  \n    id 'org.jetbrains.kotlin.android' version '1.8.10' apply false  \n}\n```\n\n**2.** Open the **settings.gradle** file and add Localazy repository `https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Frelease\u002F` like this:\n\n```groovy\npluginManagement {  \n    repositories {  \n        google()  \n        mavenCentral()  \n        gradlePluginPortal()  \n    }  \n}  \ndependencyResolutionManagement {  \n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)  \n    repositories {  \n        maven { url \"___REPOSITORY_URL___\" }  \n        google()  \n        mavenCentral()  \n    }  \n}  \n\nrootProject.name = \"my-awesome-app\"  \ninclude ':app'\n```\n\n**3.** Open **gradle.build** file in your **app’s** module and add following snippet a the end of the file:\n\n```groovy\n\u002F\u002F Always be sure to add this after android { ... } section\napply plugin: 'com.localazy.gradle'\n \nlocalazy {\n    readKey \"the-read-key-for-the-project\"\n    writeKey \"the-write-key-for-the-project\"\n}\n```\n::: info\nRead more about [injection options](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection) to configure what type of library is injected and whether OTA updates are available for all users or loyal ones only.\n:::\n\nNow, you can [configure the plugin](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#configure-the-plugin).\n\n## Git Tip\n\nYou can safely mark `strings_localazy.xml` as ignored in your `.gitignore` as it can be restored from Localazy any time needed. ",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2178,"featured_icon":2179},{"id":798},{"id":800},{"id":57,"status":5,"sort":37,"created_on":1872,"name":1873},[],[],[2184],{"id":2185,"documentation_id":2151,"languages_code":925,"slug":2174,"title":2175,"content":2176,"meta_title":2175,"meta_description":2141,"excerpt":2141},216,[],{"id":37,"status":5,"sort":2188,"created_on":1856,"modified_on":2189,"slug":2190,"title":2191,"excerpt":2192,"content":2193,"meta_title":2191,"meta_description":2192,"pinned":160,"main_image":10,"section":2194,"subsection":2197,"cta":10,"faq":2198,"dictionary":2211,"translations":2216,"documentation_id":37,"blog_articles":2218},"20010","2024-08-12T06:33:44.000Z","localazy-android-library","Localazy Android library","The Localazy Android library translates the app on the fly, updates translations, collects and sends anonymous statistics and provides additional methods for controlling how your app is being translated.","If you followed instructions on [how to add Localazy into your app](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin), there is nothing else you need to do to have your app translated. However, the Localazy library provides additional methods described in this documentation that you can use to improve users' experience and get more volunteers.\n\n## Compatibility\n\n* the library is extremely lightweight and has no dependencies by itself\n* Android from **API level 14** is supported\n* **Kotlin projects** are fully supported\n\n\n## Issues reporting\n\nUnfortunately, Android doesn’t provide a unified way to override how it obtains texts and translations on the fly. If you notice that something is not correctly translated, please contact us at **team@localazy.com**.\n\n\n## Integration and initialization\n\nFor integration and initialization of the library, please follow instructions on [how to add Localazy into your app](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin).\n\nWe don’t recommend initializing the library manually as the Gradle plugin modifies the bytecode of your app on several different places. Without the changes made, Localazy wouldn’t be able to fully translate your app. Manual initialization could cause undesired situations and incomplete translations.\n\nTypically, the library is initialized by the first call to `attachBaseContext` method inside `Application` or your first `Activity` \u002F `Service`. The initialization code is injected into these places by the Localazy Gradle plugin.\n\n\n## Enabling and disabling\n\nYou can temporarily enable\u002Fdisable on-the-fly translations and stats collecting (see [Collecting stats](#collecting-stats)).\n\n```java\nLocalazy.setEnabled(false);\n\u002F\u002F Localazy is disabled, and translations are obtained by the default Android mechanism.\n\nLocalazy.setEnabled(true);\n\u002F\u002F Localazy is enabled again and provides translations.\n\n\u002F\u002F We can also check for the current state.\nif (Localazy.isEnabled()) {\n    \u002F\u002F The library is doing its hard work...\n}\n\nLocalazy.setStatsEnabled(false);\n\u002F\u002F Collecting and sending stats data is completely disabled.\n\nLocalazy.setStatsEnabled(true);\n\u002F\u002F We are collecting data to improve your translations again...\n\n\u002F\u002F And we can check for the current state.\nif (Localazy.isStatsEnabled()) {\n    \u002F\u002F The library is making your app better.\n}\n```\n\nChanges to `setEnabled` or `setStatsEnabled` are not stored persistently. On-the-fly translations and stats collecting are re-enabled when the app is restarted. You can introduce your logic for persisting the state.\n\n\n## Project information\n\nKnowing the URL of your app on the Localazy site is useful as you can ask people to help you with translating the app and send them directly to the translation platform.\n\nYou can get Uri pointing to your app with this code:\n\n```java\nUri projectUri = Localazy.getProjectUri();\n```\n\n::: info\nMethod getProjectUri() returns null if the information is not available (Localazy is not initialized yet, data are not correctly loaded, etc.).\n:::\n\n## Working with locales\n\nLocalazy doesn’t change the locale of your app. Internally, it resolves the closest locale for which it has a translation available and uses it.\n\nTo obtain the current internally resolved locale use:\n\n```java\n\u002F\u002F As Android's Locale.\nLocale currentLocale = Localazy.getCurrentLocale();\n\n\u002F\u002F As LocalazyLocale that provide more information. \nLocalazyLocale currentLLocale = Localazy.getCurrentLocalazyLocale();\n```\n\n::: info\nThe call to getCurrentLocale() or getCurrentLocalazyLocale() returns null if the information is not yet available (Localazy is not initialized yet, data are not correctly loaded, etc.).\n:::\n\nTo get information about whether the current internally resolved locale is fully translated use:\n\n```java\nboolean translated = Localazy.isFullyTranslated();\n```\n\n::: info\nThe call to isFullyTranslated() returns false if Localazy is not initialized yet, data are not correctly loaded, etc.\n:::\n\nTo list all locales know to Localazy:\n\n```java\nList\u003CLocalazyLocale> locales = Localazy.getLocales();\n```\n\n::: info\nThe call to getLocales() returns null if the information is not yet available (Localazy is not initialized yet, data are not correctly loaded, etc.).\n:::\n\nTo force the library to switch the app locale to another one:\n\n```java\n\u002F\u002F The second parameter allows making the change persistent.\nLocalazy.forceLocale(newLocale, persistent);\n\n\u002F\u002F Remove previously set forced locale.\n\u002F\u002F A restart of the app (opened activities) may be necessary.\nLocalazy.forceLocale(null, persistent);\n```\n\n::: warning \nForcing locale affects not only on-the-fly translations but also system texts, resources, etc. It’s like switching the whole app into another language.\n:::\n\n::: info\nThis method may be invoked even if the library is not initialized yet, and forced locale is correctly applied later. Before the initialization finishes, it doesn’t affect your app locale.\n:::\n\n::: info\nThis method doesn’t change the existing content and already inflated views. You have to take care of refreshing content.\n:::\n\nTo invalidate internal caches and reload data (useful for multi-process apps or handling external events):\n\n```java\nLocalazy.forceReload();\n```\n\n::: info\nThis method doesn’t change the existing content and already inflated views. You have to take care of refreshing content.\n:::\n\n\n## LocalazyLocale\n\nThe list of all known locales returned by `Localazy.getLocales()` is represented by a list of LocalazyLocale instances.\n\n```java\nLocalazyLocale locale;\n\u002F\u002F ...\n\n\u002F\u002F Returns language as ISO 639 code (eq. zh).\nString language = locale.getLanguage();\n\n\u002F\u002F Returns country\u002Fregion as ISO 3166 code (eq. TW).\n\u002F\u002F Returns null if the country\u002Fregion is not contained.\nString region = locale.getCountry();\n\n\u002F\u002F Returns script as ISO 15924 code (eq. Hant).\n\u002F\u002F Returns null if the script is not contained.\nString script = locale.getScript();\n\n\u002F\u002F Returns the locale as java.util.Locale.\n\u002F\u002F This method considers the script on Android 5+.\nLocale l = locale.getLocale();\n\n\u002F\u002F Returns true if the locale is completely translated.\nboolean translated = locale.isFullyTranslated();\n\n\u002F\u002F Returns display name for the locale in English - eq. \"Czech (Czechia)\" for \"cs_CZ\".\nString name = locale.getName();\n\n\u002F\u002F Returns display name for the locale in its own language - eq. \"Čeština (Česko)\" for \"cs_CZ\".\nString localizedName = locale.getLocalizedName();\n\n\u002F\u002F Returns the internal Localazy ID for this locale.\n\u002F\u002F It's useful for constructing URL addresses of the Localazy platform.\nshort localazyId = locale.getLocalazyId();\n```\n\n::: info\nYou can use information from locale.isFullyTranslated() to ask people to help you with translating the app into languages that are not fully translated yet.\n:::\n\n## Obtaining strings\n\nThere may be some situations where you need to obtain translated strings on the places where the library couldn’t be injected by the Localazy Gradle plugin (such as when writing custom view transformers).\n\n`Localazy` singleton offers a variant of all Android’s standard methods for obtaining strings, string arrays and plurals that are guaranteed to return translated version if available.\n\n```java\n\u002F\u002F The same as Resources.getString(int)\nLocalazy.getString(context, R.string.identifier);\n\n\u002F\u002F The same as Resources.getString(int, Object...)\nLocalazy.getString(context, R.string.identifier, params);\n\n\u002F\u002F The same as Resources.getText(int)\nLocalazy.getText(context, R.string.identifier);\n\n\u002F\u002F The same as Resources.getText(int, CharSequence)\nLocalazy.getText(context, R.string.identifier. defaultValue);\n\n\u002F\u002F The same as Resources.getTextArray(int)\nLocalazy.getTextArray(context, R.array.identifier);\n\n\u002F\u002F The same as Resources.getStringArray(int)\nLocalazy.getStringArray(context, R.array.identifier);\n\n\u002F\u002F The same as Resources.getQuantityText(int, int)\nLocalazy.getQuantityText(context, R.plural.identifier, quantity);\n\n\u002F\u002F The same as Resources.getQuantityText(int, int, Object...)\nLocalazy.getQuantityString(context, R.plural.identifier, quantity, params);\n\n\u002F\u002F The same as Resources.getQuantityText(int, int)\nLocalazy.getQuantityString(context, R.plural.identifier, quantity);\n```\n\n::: info\nIf the library is not initialized or is disabled or when the translation is not available, methods above fallback to the standard Android mechanism. So, it’s completely safe to use them.\n:::\n\n## Listening to events\n\nYou can register `LocalazyListener` using `Localazy.setListener(…​`) and listen to several events emitted by the library.\n\n| Method | Description\n| --- | ---\n| `missingTextFound(LocalazyId id, Locale locale, String key)` | The `key` is not translated into the current language.\n| `missingKeyFound(Locale locale, String key)` | The `key` is unknown to Localazy, which probably means that you don’t upload updated texts, or the `key` was excluded during strings uploading.\n| `stringsUpdateStarted()` | The library has started the update process.\n| `stringsUpdateFinished()` | The library has updated the translation data.\n| `stringsUpdateFailed(int errorCode)` | The data update process failed with an error identified by `errorCode`. See [error codes](#error-codes) for more information.\n| `stringsUpdateNotNecessary()` | The library contacted the update server and found out that there is no change.\n| `stringsLoaded(boolean fromUpdate, boolean success)` | The library has loaded data - this is called after initial load, strings update, etc.\n\n::: warning\nEvents are not emitted on the main UI thread!\n:::\n\n## Forced updating\n\nYou can force the string updating by invoking:\n\n```java\nLocalazy.forceUpdate();\n```\n\n## LocalazyId\n\nIf there is a missing translation detected, you receive `LocalazyId` that allows you to ask people for help with translating it.\n\n```java\npublic void missingTextFound(LocalazyId id, Locale locale, String key) {\n\n    \u002F\u002F Get the direct URL for translating the phrase.\n    String url = id.getPhraseUrl();\n\n    \u002F\u002F Get hidden state of the phrase.\n    boolean hidden = id.isHidden();\n\n}\n```\n\n::: info\nIf the phrase is hidden on the platform, don’t ask people for help. There are reasons why it doesn’t need a translation.\n:::\n\n## Error codes\n\nError code returned by `stringsUpdateFailed(int errorCode)` can be:\n\n| Code | Description\n| --- | ---\n| 400 | Invalid request.\n| 401 | Invalid authorization. Please check the read key.\n| 403 | Invalid app package or certificate. Be sure that the given combination has been allowed in your project's settings.\n| 404 | The update package cannot be found. It usually means that you haven't uploaded and published your translations yet.\n| 409 | The update package cannot be downloaded because you hit account limits; payment has to be done.\n| 426 | The update package cannot be downloaded because the library contained in your app is too old. Please update the library.\n| 429 | Too many request to the server.\n\n\n## Testing on-the-fly functionality\n\nYou can enable the prefix feature that adds `[LL]` prefix to strings that comes from Localazy on-the-fly translating engine.\n\nThis is useful for testing that all parts of your app are correctly translated with Localazy and also for testing [Custom view transformer](#custom-view-transformer).\n\nYou can enable this feature in the Localazy Gradle plugin configuration with `addPrefix` option or in the code:\n\n```java\nLocalazy.addLocalazyPrefix(true);\n```\n\n::: info\nDue to intensive internal caching, enabling and disabling the feature on the code level needs the app to be restarted in order to invalide all internal caches. You have to handle the restart on your own.\n:::\n\n## StringsLoaded annotation\n\nIf you don’t want to implement the full `LocalazyListener` to receive information about changes to strings, you can use `@StringsLoaded` annotation.\n\nListening to this event is useful if you want to update your UI when new translations are available.\n\nIn your `Activity` (or any other `Context`-based class) add a method without parameters:\n\n```java\n@StringsLoaded\npublic void stringsLoaded() {\n    \u002F\u002F update your UI\n}\n```\n\nor a method with two boolean parameters that provide additional information about whether the strings were updated after the new version has been downloaded from Localazy servers and whether the loading of data has succeeded:\n\n```java\n@StringsLoaded\npublic void stringsLoaded(boolean fromUpdate, boolean success) {\n    \u002F\u002F update your UI\n}\n```\n\n::: warning\nPlease don’t use this annotation multiple times in the same class. It’s registered only once.\n:::\n\n::: warning\nThe call to this method isn’t made on the main UI thread. Be sure to perform all changes to your UI on the main thread.\n:::\n\n## Custom view transformer\n\nAs Android doesn’t use standard way for obtaining strings while inflating layouts, it’s necessary to use view transformers that update the view after it’s inflated.\n\nThe library contains transformers for all standard views, including those from support and AndroidX libraries.\n\nThe most probably, your custom components are derived from system ones like `TextView` and so you don't need to do anything special for them to be supported correctly by Localaly on-the-fly translations.\n\nIf your component is not correctly translated with Localazy, you can write your own tranformer. You just need to implement 3 methods. See the simple example code above.\n\n```java\nclass MyTransformer implements LocalazyViewTransformer {\n\n    private static final String ATTRIBUTE_TEXT = \"myInternalText\";\n\n    @Override\n    public boolean shouldRegister() {\n        \u002F\u002F You can skip transformer registration if conditions are not met.\n        \u002F\u002F This mainly useful in libraries that may be applied to different\n        \u002F\u002F projects.\n        try {\n            Class.forName(\"my.flavor.MyView\");\n            return true;\n        } catch (Exception e) {\n            return false;\n        }\n    }\n\n    @Override\n    public boolean isSupportedType(Object any) {\n        \u002F\u002F At this point, it's decided whether to use the registered transformer\n        \u002F\u002F for the given view type.\n        return any instanceof my.flavor.MyView;\n    }\n\n    @Override\n    public View transform(Context current, View view, AttributeSet attrs) {\n        \u002F\u002F Find attribute with text and do necessary transformations.\n        for (int index = 0; index \u003C attrs.getAttributeCount(); index++) {\n            String attributeName = attrs.getAttributeName(index);\n            if (ATTRIBUTE_TEXT.equals(attributeName)) {\n                String value = attrs.getAttributeValue(index);\n                if (value != null && value.startsWith(\"@\")) {\n                    \u002F\u002F Use Localazy singleton to obtain strings as \n                    \u002F\u002F current context may not be Localazy-enabled by itself.\n                    int resValue = attrs.getAttributeResourceValue(index, 0);\n                    String text = Localazy.getText(current, resValue);\n                    ((my.flavor.MyView)view).setMyInternalText(text);\n                }\n            }\n        }\n        return view;\n    }\n\n}\n```\n\nWhen your new custom view transformer is ready, just register it and you are done.\n\n```java\nLocalazy.registerTransformer(new MyTransformer());\n```\n\n## Developer app\n\nThe library uses an internal cache mechanism which may not be desired when testing translations.\n\nUsing our Localazy Developer app, you can force your app to update strings from the server and reload them.\n\nDownload the app from the Play Store: [Localazy Developer app](https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.localazy.android.developer)\n\n\n## Collecting stats\n\nThe library collects anonymous data to improve translations and suggest optimization tips. It’s important to prioritize translations to maximize value for users.\n\n**Collected data:**\n\n* detected and resolved locale\n* phrase usage\n* Android version\n* library version\n* generated user ID - not stored for more than 24 hours\n\nThe library don’t collect personal data, unique identifiers other than generated user ID, etc.\n\nWhen uploading stats to our servers, the IP address may be temporarily stored. Our lawful basis for processing the IP address is the legitimate interests to protect our servers and technical infrastructure.",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2195,"featured_icon":2196},{"id":798},{"id":800},{"id":57,"status":5,"sort":37,"created_on":1872,"name":1873},[2199,2205],{"id":33,"status":5,"title":2200,"content":2201,"slug":2202,"created_on":1880,"modified_on":2203,"owner":1855,"meta_title":10,"category":2204},"Do I need to use the Android Library?","The [Localazy Android Library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library) is an optional component that offers numerous benefits to your app, including automated upload and Over-The-Air (OTA) updates. However, we understand that you may have reservations about integrating third-party libraries into your app.\n\nAs a result, if you prefer not to use the Localazy Android Library, you can still utilize our [CLI](\u002Fdocs\u002Fcli\u002Fthe-basics) (Command-Line Interface) without any dependency on the Localazy Android library.","do-i-have-to-integrate-localazy-android-library","2023-05-26T19:27:29.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":57,"status":5,"title":2206,"content":2207,"slug":2208,"created_on":1880,"modified_on":2209,"owner":1855,"meta_title":10,"category":2210},"How to change language in my app after Android library integration?","You don't need to touch your source code at all.\n\nLocalazy works fully automatically and select the best matching locale based on the user settings.\n\nIt uses the same detection mechanism as Android.\n\nThe Localazy library allows to switch locales manually if you want to use it, but it's not required.\n\nIf you, for some reason, need to work with locales manually, see the documentation for Localazy Android library:\nhttps:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-android-library#working-with-locales","how-to-change-language-in-my-app-after-android-library-integration","2023-05-26T19:27:42.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},[2212,2213,2214,2215],{"id":87,"status":5,"owner":1855,"created_on":1901,"title":1902,"excerpt":1903,"content":1904,"slug":1905,"meta_title":10,"meta_description":10,"canonical":10},{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},{"id":257,"status":5,"owner":1855,"created_on":1901,"title":1915,"excerpt":1916,"content":1917,"slug":1918,"meta_title":10,"meta_description":10,"canonical":10},{"id":252,"status":5,"owner":1855,"created_on":1901,"title":1920,"excerpt":1921,"content":1922,"slug":1923,"meta_title":10,"meta_description":10,"canonical":10},[2217],{"id":37,"documentation_id":37,"languages_code":925,"slug":2190,"title":2191,"content":2193,"meta_title":2191,"meta_description":2192,"excerpt":2192},[],{"id":2220,"status":5,"sort":2221,"created_on":2222,"modified_on":2223,"slug":2224,"title":2225,"excerpt":2226,"content":2227,"meta_title":10,"meta_description":10,"pinned":160,"main_image":10,"section":2228,"subsection":2231,"cta":10,"faq":2234,"dictionary":2235,"translations":2236,"documentation_id":2220,"blog_articles":2239},227,"20500","2024-02-15T14:03:46.000Z","2024-07-17T06:49:25.000Z","earn-with-localazy","Earn with Localazy","Localazy offers a useful set of features for Android developers to help them translate their apps using community, machine translations, and verified professional translators. It's being used by thousands of apps in production to deliver a multilingual experience. \n\nAnd you can also earn money with your Android apps and Localazy without obtrusive ads everywhere. ","## How to start\n\nDepending on your app, it's likely that developers are part of your app's user base. You can recommend them to Localazy and earn money back with our partnership program. Just send them to our website with your partner code in the query parameters `?ref=___USER_REF_PARTNER___`.\n\n### Example\nYou can implement your own solution, but below is a simple one from us to show a dialog to developers only after they open the app a few times. You can easily extend it and start earning money with Localazy for like 3 minutes of your work. \n\n```\n\u002F\u002F Localazy.kt\npackage com.my.app\n\nimport android.app.AlertDialog\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.net.Uri\nimport android.provider.Settings\nimport androidx.core.content.ContextCompat.startActivity\nimport com.my.app.R\n\nobject Localazy {\n\n    private const val PREFERENCES_NAME = \"localazy\"\n    private const val PREFERENCE_START_COUNTER = \"start_counter\"\n    private const val PREFERENCE_DISMISSED = \"dismissed\"\n    private const val REFERRAL_URL = \"https:\u002F\u002Flocalazy.com\u002Fandroid?ref=[your-referral-code]\"\n    private const val FIRST_SHOW = 3\n\n    private fun Context.isDevModeEnabled(): Boolean {\n        \u002F\u002F Supported on API 17+\n        return Settings.Secure.getInt(contentResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0\n    }\n\n    private fun SharedPreferences.increment(key: String): Int {\n        val currentValue = getInt(key, 0) + 1\n        edit().putInt(key, currentValue).apply()\n        return currentValue\n    }\n\n    private fun Context.setDismissed() {\n        getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE)\n            .edit().putBoolean(PREFERENCE_DISMISSED, true).apply()\n    }\n\n    private fun Context.resetCounter() {\n        getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE)\n            .edit().putInt(PREFERENCE_START_COUNTER, 0).apply()\n    }\n\n    private fun Context.showDialog() {\n        AlertDialog.Builder(this)\n            .setTitle(R.string.localazy_dialog_title)\n            .setMessage(R.string.localazy_dialog_text)\n            .setPositiveButton(R.string.localazy_dialog_go) { dialog, _ ->\n                startActivity(this, Intent(Intent.ACTION_VIEW, Uri.parse(REFERRAL_URL)), null)\n                setDismissed()\n                dialog.dismiss()\n            }\n            .setNeutralButton(R.string.localazy_dialog_no) { dialog, _ ->\n                setDismissed()\n                dialog.dismiss()\n            }\n            .setOnCancelListener { _ ->\n                resetCounter()\n            }\n            .setOnDismissListener { _ ->\n                resetCounter()\n            }\n            .show()\n    }\n\n    fun showReferralDialog(context: Context) {\n        if (context.isDevModeEnabled()) {\n            context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE).let { sp ->\n                if (\n                    sp.increment(PREFERENCE_START_COUNTER) >= FIRST_SHOW &&\n                    !sp.getBoolean(PREFERENCE_DISMISSED, false)\n                ) {\n                    context.showDialog()\n                }\n            }\n        }\n    }\n\n}\n```\n\nAdd a few texts to your `strings.xml`:\n\n```\n\u003Cstring name=\"localazy_dialog_title\">Hello, fellow developer!\u003C\u002Fstring>\n\u003Cstring name=\"localazy_dialog_text\">Translating your app to more languages? Try Localazy!\u003C\u002Fstring>\n\u003Cstring name=\"localazy_dialog_go\">I\\'m In!\u003C\u002Fstring>\n\u003Cstring name=\"localazy_dialog_no\">Not Interested\u003C\u002Fstring>\n```\n\nIn your main activity, just call the function with the activity context:\n\n```\noverride fun onStart() {\n    super.onStart()\n    Localazy.showReferralDialog(this)\n}\n```\n\n### Which links should you use?\nYou can send users to any page on our site. For Android developers, the homepage `https:\u002F\u002Flocalazy.com` or the page dedicated to Android `https:\u002F\u002Flocalazy.com\u002Fandroid` are likely to be the best ones. \n\nDo not forget to add your partner code with \n`?ref=___USER_REF_PARTNER___`. \n\n\n## Stats\nYou can see your stats on our partnership page available here:\n- [Partner Stats](https:\u002F\u002Flocalazy.com\u002Fpartner-stats)\n\n## Terms & Conditions\nBy participating, you agree to the [Localazy Affiliate Terms & Conditions](https:\u002F\u002Flocalazy.com\u002Fcommunity\u002Fb2b-partnerships\u002Faffiliate-terms-conditions). \n\n\n",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2229,"featured_icon":2230},{"id":798},{"id":800},{"id":959,"status":5,"sort":41,"created_on":2232,"name":2233},"2024-02-15T13:55:47.000Z","Partnership",[],[],[2237],{"id":2238,"documentation_id":2220,"languages_code":925,"slug":2224,"title":2225,"content":2227,"meta_title":10,"meta_description":10,"excerpt":2226},225,[],{"id":33,"status":5,"sort":2241,"created_on":1856,"modified_on":2242,"slug":2243,"title":2244,"excerpt":2245,"content":2246,"meta_title":2244,"meta_description":2245,"pinned":160,"main_image":10,"section":2247,"subsection":2250,"cta":10,"faq":2252,"dictionary":2253,"translations":2259,"documentation_id":33,"blog_articles":2261},"21010","2024-08-12T06:35:18.000Z","gradle-plugin-faq","Gradle Plugin FAQ","The most common questions related to Localazy Gradle plugin. How does it work? How to use it with app bundles and libraries?","## I get an error: prefer settings repositories over project repositories\n\nRecently, Android introduced a new way how to define repositories. Instead of your `build.gradle`, you should place them into `settings.gradle`.\n\n[Read more about how to do fix this issue](\u002Fdocs\u002Fandroid\u002Fhow-to-fix-prefer-settings-repositories-over-project-repositories)\n\n\n## Why does the download task fail for the new app?\n\nIf you have just added Localazy to your app and uploaded strings, please wait for up to 5 minutes for our servers to process your strings and prepare data.\n\nYou can temporarily disable errors in [download](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#download) and [resources](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#resources) sections of the plugin configuration and keep working on your awesome app while we are processing your strings.\n\n## Why does the download fail with release tag?\n\nBe sure that the release tag is available and published.\n\n\n## Why don't new strings appear in my app?\n\nThe most common reasons are:\n\n* It's possible that published changes are not available yet. The publishing process may take up to 5 minutes.\n* The locally cached version is used when building the app.\n\nWait for up to 5 minutes, clean your project, and rebuild it.\n\n\n## What are the known limitations?\n\n* While Localazy fully supports flavors in app modules, it doesn't support flavors in library modules. However, using flavors in libraries is rare.\n* The app module and library modules must use the same set of build types. It only applies to library modules added in *localazy* &gt; *upload* &gt; *projects*.\n* All flavors must have the default translation of the string. Otherwise, it cannot be correctly handled by the Localazy platform. However, not respecting this rule is considered bad practice anyway.\n* Deprecated feature modules may not be fully supported. The new dynamic feature modules and App Bundles are fully supported.\n\n\n## Does Localazy affect my tests? \n\nThe bytecode injection and resources processing is not applied to unit and instrumentation tests. This is for a reason: to keep tests predictable.\n\n\n## How to apply Localazy to dynamic feature modules?\n\nLocalazy fully supports App Bundles and dynamic feature modules. For App Bundles without dynamic feature modules, you just follow the [Quick start chapter of Localazy Gradle plugin documentation](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#quick-start), and that's it.\n\nIf your app makes use of dynamic features, do this:\n\n**1.** Follow steps **2** and **3** from [Quick start chapter of Localazy Gradle plugin documentation](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#quick-start) for all dynamic feature modules you want to include. Be sure to use the same version (plain, support, androidx) of the Android library as in your app's module.\n\n**2.** Adds your dynamic feature modules in the plugin configuration of your app's module under **localazy** > **upload** > **projects**.\n\n**3**. **And that's it!**\n\n::: info\nStrings from the dynamic feature module are placed inside a namespace corresponding to the module name. If you change its name, our [Localazy InTM](\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-intm) will assist you in moving translations. \n:::\n\n\n## How to apply Localazy to libraries?\n\nLocalazy is designed to work for app modules, and it's not suitable for translating libraries only.\n\nHowever, **it works perfectly for apps with library modules**.\n\n**1.** Follow steps **2** and **3** from [Quick start chapter of Localazy Gradle plugin documentation](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#quick-start) for all library modules you want to include. No special configuration is necessary as only the injection process is involved for libraries. Be sure to use the same version (plain, support, androidx) of the Android library as in your app's module.\n\n2. Adds your library modules in the plugin configuration of your app's module under **localazy** > **upload** > **projects**.\n\n3. **And that's it!**\n\n\n## What about older versions of my app?\n\nLocalazy keeps track of removed strings and delivers them for older versions of your app. There is nothing you need to do.\n\nHowever, there is one rule to keep in mind. Never change the meaning of the existing string radically. It's not a good practice anyway, and it would interfere with older app versions.\n\nFor example, imagine that you have string **string_app_new** containing text **New Item**. You no longer need it, and you want to reuse it for **Delete New Items**. Don't do it. Create a new string with different key and just remove string **my_app_new** from your **strings.xml**.\n\n\n## How does Localazy modify my code?\n\n[Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) changes the bytecode of your app in several ways.\n\nIt needs to add [the library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library) initialization and resources overriding code to your `Application` (if available), all `Activities`, `Services`, `Receivers` and `Providers`.\n\nIt also needs to modify code that creates menus and preferences.\n\nAdditional changes to your bytecode may be required for some features like [@StringLoaded annotation](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library#stringsloaded-annotation), etc.\n",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2248,"featured_icon":2249},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},"Guides and tips",[],[2254,2255,2256,2257,2258],{"id":87,"status":5,"owner":1855,"created_on":1901,"title":1902,"excerpt":1903,"content":1904,"slug":1905,"meta_title":10,"meta_description":10,"canonical":10},{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},{"id":331,"status":5,"owner":1855,"created_on":1901,"title":1910,"excerpt":1911,"content":1912,"slug":1913,"meta_title":10,"meta_description":10,"canonical":10},{"id":257,"status":5,"owner":1855,"created_on":1901,"title":1915,"excerpt":1916,"content":1917,"slug":1918,"meta_title":10,"meta_description":10,"canonical":10},{"id":252,"status":5,"owner":1855,"created_on":1901,"title":1920,"excerpt":1921,"content":1922,"slug":1923,"meta_title":10,"meta_description":10,"canonical":10},[2260],{"id":33,"documentation_id":33,"languages_code":925,"slug":2243,"title":2244,"content":2246,"meta_title":2244,"meta_description":2245,"excerpt":2245},[],{"id":1688,"status":5,"sort":2263,"created_on":2264,"modified_on":2265,"slug":2266,"title":2267,"excerpt":2268,"content":2269,"meta_title":2270,"meta_description":10,"pinned":160,"main_image":10,"section":2271,"subsection":2274,"cta":2275,"faq":2282,"dictionary":2283,"translations":2284,"documentation_id":1688,"blog_articles":2286},"21015","2022-03-18T07:51:25.000Z","2024-07-16T15:14:57.000Z","how-to-fix-prefer-settings-repositories-over-project-repositories","How to fix Android repository issue","Learn how to use Localazy with repositories defined in settings.gradle and how to prefer settings repositories over project repositories","Recently, Android introduced a new way how to define repositories. Instead of your `build.gradle`, you should place them into `settings.gradle`. It collides with how the Localazy Gradle plugin adds its repository, and you end up with this error message:\n\n`Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by plugin 'com.localazy.gradle'`\n\nThere are two possible solutions for this issue.\n\n\n## Disable repositories in settings.gradle\n\nThis approach allows the Localazy Gradle plugin to manage repositories on its own, and you don't need to care about it. \n\nComment out `repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)` in the `settings.gradle` file:\n\n```groovy\ndependencyResolutionManagement {\n    \u002F\u002F repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n```\n\nAnd be sure to add the `repositories` section to your `build.gradle` manually. \n\n\n## Adding Localazy repository manually\n\nIn your `build.gradle` file, tell Localazy to don't add its repository automatically:\n\n```groovy\n\u002F\u002F ... your build.gradle file ...\n\nlocalazy {\n\t\u002F\u002F ... your Localazy configuration ...\n  injection {\n    installRepositories false\n  }\n}\n\n```\n\nAnd add Localazy repository to your `settings.gradle`:\n\n```groovy\ndependencyResolutionManagement {\n  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n  repositories {\n    google()\n    mavenCentral()\n    maven { url \"https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Frelease\u002F\" }\n  }\n}\n```","How to fix: prefer settings repositories over project repositories",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2272,"featured_icon":2273},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},{"id":20,"status":501,"created_on":2276,"modified_on":2277,"icon":2278,"header":2279,"description":2280,"button_label":2279,"link":2281},"2022-03-17T12:23:03.000Z","2020-05-19T09:23:31.000Z","member","NONE","Use this if no CTA should be shown.","none",[],[],[2285],{"id":1688,"documentation_id":1688,"languages_code":925,"slug":2266,"title":2267,"content":2269,"meta_title":2270,"meta_description":10,"excerpt":2268},[],{"id":247,"status":5,"sort":2288,"created_on":1856,"modified_on":2189,"slug":2289,"title":2290,"excerpt":2291,"content":2292,"meta_title":2290,"meta_description":2291,"pinned":160,"main_image":10,"section":2293,"subsection":2296,"cta":2297,"faq":2303,"dictionary":2304,"translations":2305,"documentation_id":247,"blog_articles":2307},"21020","only-ota-updates-that-really-work","Only OTA updates that really work!","Integrate Localazy OTA updates without a single change of your source code. Learn more about why it's only solution that can localize your app fully and completely on-the-fly. ","## No changes to the source code\n\n**Localazy is the only solution available to come with this benefit.** [Our Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) does all the work for you. It learns about your app structure and uploads your strings. It integrates updated translations to your resource files and injects our Android library automatically. \n\nExcept for adding a few lines to your build scripts, you don't need to change anything in your source code or resource XML files. \n\n**The Localazy Gradle plugin never touches your source code and your resource XML files! Everything happens only during the build time on intermediate files.** It's completely safe, and you can turn it off anytime. \n\n**Our Gradle plugin is the only way to be sure that your app is fully translated over the air!** See below...\n\n## Only solution to translate your app fully\n\nSome other translation platforms offer similar features. It's usually called Android SDK, and **it's a big lie**! They claim that their SDK can localize your app, and it's simply not true. \n\nUsually, they suggest overriding **attachBaseContext** method and wrapping the Context object with their SDK. Sometimes, there are some additional steps necessary. There are two big issues about this approach:\n\n* You need to change your source code! Do you really want to do it? What if you don't have a single BaseActivity for the whole app? Do you want to make the necessary changes in all places? What if you forget to override the method somewhere in your app? \n* Whether you change your source code carefully on all the possible places as instructed, you end up with a partially untranslated app that can behave unpredictably. Why? Keep reading... \n\n**Localazy OTA updates are the only fully working solution because:**\n\n### The complete lifecycle\n\nWe take care of everything - **uploading your strings, downloading them back, adapting your resources, injecting the Android library and initial translation data**. It saves you a lot of time - there is no handling of XML files - and allows us to bring you the features described below. \n\n### Adapted resources \n\nWe **adapt your resources** during the build, and there is always the most recent version of translations as a fallback with no extra effort on your side. \n\n### Smart automatic injection\n\nWe **automatically inject the library**. It means that we make several hundreds of transformations across the whole bytecode of your app, injecting Localazy **not only to Activity classes but also to Services, Receivers, Providers**, and many other places. \n\nOur injection process is complex and doesn't consider only **attachBaseContext** method. It translates your apps fully, including **menus, popups, dialogs, preferences, and other parts of your app** that other translation platforms entirely ignore. \n\n### Product flavors and build types\n\nWe understand your app's structure and **translate your app correctly, including build types and product flavors**. And that's tricky because there are many rules for strings overriding. And **Localazy is the only translation platform that can do it** with no extra effort on your side. \n\n### Libraries and dynamic features\n\nLocalazy can also translate **apps with libraries and dynamic features maintaining the correct strings overriding**. Our Gradle plugin applies all the necessary transformations to libraries and modules, ensuring that your app is fully localized over the air. \n\n### Plurals on all Androids\n\nWe have **our own plural system that works on all Android versions**. We care and invested our time to bring this solution. Some other platforms use plurals only on Android 24+ because the plural API wasn't available on earlier versions. Do you really want to sacrifice such critical functionality? \n\n### APK and app bundles\n\nWe fully support APK-based apps as well as app bundles and automatically handle deprecated phrases and app versions.\n\n### Smart library\n \nWe provide an [extensive set of functions](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library) that you can use to **get more contributors and volunteers** in your app. \n\n### No unpredictable behavior\n\nNow, you probably understand why I mentioned the unpredictable behavior. Just imagine that you use product flavors with different strings, which is pretty standard  if you build your app for more than just Play Store and in tens of other situations. We have customized strings for Play Store, Amazon Store, Huawei Apps, and Samsung Galaxy Store in our apps. \n\nWe could adapt our apps, add tons of IF conditions, and bring all the strings together to the main flavor. But why? **Do you really want to change your app for the translation platform? No! The localization platform should translate your app as-is.**\n\nAs you can see, translating the app on-the-fly is not easy, and changing a few lines of the source code, as other platforms suggest, is not enough. It's a complex problem, and we solved it from top to bottom. \n\n### No dependencies and extensibility\n\nWe love Kotlin here at Localazy, but we wrote our Android library in pure Java with no single dependency. **It's tiny and fast.**\n\nWe have three different versions - the **plain library** with no dependencies, the **AndroidX version**, and a special **version for legacy Support libraries**. You don't need to change or migrate your app because of us; you just pick the right library for you.\n \nIf there is something our library can't translate fully, you can extend it with our own code ;-). \n\n### And much more...\n\nThere is more to say about how you can configure Gradle plugin to suit your needs and use it for seamless localization of your app. [**Just try it out on your own!**](\u002Fregister)\n\n**And all above without a single change of your source code!**\n\nWe are still not finished...\n\n## Optimized translations\n\nWe've designed Localazy with OTA updates in mind. It's not an additional feature to get more money from you. It's more than just publishing exported translation on Amazon's S3, which some other translation platforms do. \n\nIt's a pro-active tool that improves the user experience of your app and optimizes the hard work for you and your contributors. We don't only deliver updated translations, but we also **collect anonymous stats and use them for many internal optimizations**. \n\nIn the realtime, we **adapt the order in which phrases are translated** by your contributors to maximize their impact. Unless your app is tiny, your contributors may not be able to translate it fully at once. Every single translation counts, and you want to have the most important phrases translated first. Who cares about error messages that your users are unlikely to see unless they run into an improbable error if the main menu of your app is untranslated? \n\n**And the same applies to [the review process](\u002Fdocs\u002Fgeneral\u002Funique-review-process-and-self-managed-translations).** If you have a spare minute, you want to invest it into making a visible impact. Therefore, in our review process, the phrases don't come in the random order. You can be sure that one minute of your time is turned into a delightful experience for your app's users.\n\nAlso, the collected stats help us prioritize processes in ShareTM, calculate distribution weight for phrases, understand the audience of your app, and provide meaningful insight. \n\n## For app developers, from app developers\n\nWe are app developers too, and we know what it takes to translate your app fully and completely. We struggled with app localization for so long that we decided to build Localazy... for the good of all of us.  \n\n**We rely on Localazy with our own apps that are used by millions of users. And you can rely on it too!**\n\n## Pricing\nThe price for OTA updates feature is calculated daily based on DAU (Daily Active Users) on the given day. When activated, we charge for online services at the end of the billing period or when your current expenses exceed $50.\n\n| OTA Pricing | Price\u002FUnit|\n| --- | --- |\n| first 1000 DAU| $0.0008 |\n| next 10k DAU | $0.00024 |\n| next 100k DAU | $0.000072 |\n| above | $0.0000216 |\n\nYou can always see your current expenses and stats in the [Marketplace](\u002Fmy\u002Fmarketplace).\n",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2294,"featured_icon":2295},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},{"id":4,"status":5,"created_on":2276,"modified_on":2298,"icon":2278,"header":2299,"description":2300,"button_label":2301,"link":2302},"2024-04-11T11:09:17.000Z","Join Localazy today 💙","Translating has never been easier. Try Localazy for free with a 14-day trial.","Sign up","register",[],[],[2306],{"id":247,"documentation_id":247,"languages_code":925,"slug":2289,"title":2290,"content":2292,"meta_title":2290,"meta_description":2291,"excerpt":2291},[],{"id":24,"status":5,"sort":2309,"created_on":1856,"modified_on":2310,"slug":2311,"title":2312,"excerpt":2313,"content":2314,"meta_title":2312,"meta_description":2313,"pinned":160,"main_image":10,"section":2315,"subsection":2318,"cta":10,"faq":2319,"dictionary":2328,"translations":2329,"documentation_id":24,"blog_articles":2331},"21030","2024-08-12T05:24:46.000Z","configure-ota-updates-and-save-money","Configure OTA updates and save money","Save money by configuring OTA updates for loyal users and don't pay for illegal copies of your app.","Daily DAU is fair\n--- \n\nWith Localazy, for OTA updates, you only pay for what you use. The price for this feature is calculated daily based on DAU (Daily Active Users) on the given day. \n\nAs an active user, we understand your app's user device that connects to our servers to:\n\n- check whether new translations are available or download them\n- send collected stats about languages and phrases that we used to optimize the translation process\n\nCalculating DAU on a daily basis is great as it flexibly reacts to spikes, and you are not overpaying just because one day in the month had higher than your normal traffic.\n\n| OTA Pricing | Price\u002FUnit|\n| --- | --- |\n| first 1000 DAU| $0.0008 |\n| next 10k DAU | $0.00024 |\n| next 100k DAU | $0.000072 |\n| above | $0.0000216 |\n\nYou can always see your current expenses and stats in the [Marketplace](\u002Fmy\u002Fmarketplace).\n\nDon't pay for illegal copies\n---\n\nBy default, anybody with your app can update translations from Localazy. Honestly, paying for DAU generated from illegal and altered copies of your app is probably not what you want. Limit it by settings allowed packages and certificate fingerprints!\n\nGo to [localazy.com](https:\u002F\u002Flocalazy.com), login, open your app, and then go to **Settings** > **Android Security**. Limit access to allowed packages\u002Fcertificates.       \n![Screnshot](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fdad39127-67ae-4eb4-bb43-b904e12d2cba)\n\n**And that's it!** No more money spent on illegal copies.\n\nLimit updates and stats sending\n---\n\nBy default, the Localazy library integrated into your app is trying to check\u002Fdownload updated translations once per day and send collected stats along with the update. \n\nHowever, you can configure completely different behavior in your Gradle script with no single change to the source code. \n\nLocalazy Gradle plugin from version 1.2.0 comes [with 10 new configuration options for the library injection process](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection).\n\nLet's, for example, configure Localazy to update translations only for long-term loyal users. **This configuration significantly decreases costs for OTA updates!**\n\n```groovy\n\u002F\u002F Your app's module Gradle build script.\n\n\u002F\u002F ... the rest of the file ...\n\nlocalazy {\n\n    injection {\n\n        \u002F\u002F Check for updated translations once per a week\n        updateInterval 604800\n\n        \u002F\u002F Check for updated translations once per 24 hours\n        \u002F\u002F if the previous request failed\n        updateIntervalForFailure 86400\n\n        \u002F\u002F Delay the first check for updated translations \n        \u002F\u002F by 2 hours to filter out users that install and \n        \u002F\u002F almost immediately uninstall your app\n        updateDelay 7200\n   \n        \u002F\u002F Do not check for updated strings from background\n        \u002F\u002F services and receivers but only from Activities\n       updateForActivityOnly true\n\n        \u002F\u002F Do not send stats on their own but bind them \n        \u002F\u002F to check for updated translations\n        sendStatsRegularly false\n\n    }\n\n}\n```\n\nFor long-term loyal users, we have added a shortcut from version 1.3.0. Now, it's as easy as:\n\n```groovy\nlocalazy {\n    \u002F\u002F ...\n    injection {\n        loyalUsersOnly()\n    }\n}\n```\n\nDisable OTA updates completely\n---\n\nYou may want to disable OTA updates completely as it may not be suitable for your particular situation. No problem at all! \n\nJust update the Localazy Gradle plugin configuration as follows:\n\n```groovy\nlocalazy {\n    \u002F\u002F ...\n    injection {\n        enabledForRelease false\n        enabledForDebug false\n    }\n}\n```\n\nConfigure it remotely\n---\n\nLocalazy Android library already knows how to update parameters introduced in this article remotely, and making it available for you through some nice UI is on our roadmap ;-).\n",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2316,"featured_icon":2317},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[2320,2322],{"id":33,"status":5,"title":2200,"content":2201,"slug":2202,"created_on":1880,"modified_on":2203,"owner":1855,"meta_title":10,"category":2321},{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":45,"status":5,"title":2323,"content":2324,"slug":2325,"created_on":1880,"modified_on":2326,"owner":1855,"meta_title":10,"category":2327},"How to apply updated translations when OTA updates are disabled?","You don't need to. Even if OTA updates are disabled, we add the most recent translation to your resources when you build your app. Our [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) does it automatically for you without touching your source files. ","how-to-apply-updated-translations-when-ota-updates-are-disabled","2023-05-26T19:27:39.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},[],[2330],{"id":24,"documentation_id":24,"languages_code":925,"slug":2311,"title":2312,"content":2314,"meta_title":2312,"meta_description":2313,"excerpt":2313},[],{"id":41,"status":5,"sort":2333,"created_on":1856,"modified_on":2334,"slug":2335,"title":2336,"excerpt":2337,"content":2338,"meta_title":2339,"meta_description":2337,"pinned":160,"main_image":10,"section":2340,"subsection":2343,"cta":10,"faq":2344,"dictionary":2366,"translations":2381,"documentation_id":41,"blog_articles":2383},"21040","2024-08-07T04:52:14.000Z","what-you-should-know-before-uploading-your-android-strings","Before you upload your Android strings","If you are serious about translating your app and you already have existing translations, you should consider a few key aspects. ","## The science behind...\n\nYou can upload your translations to Localazy with a single click. Thanks to our [no changes to your code](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#no-changes-to-your-code) policy, it's easy, and you don't need to modify your code.\n\nHowever, if you are serious about translating your app and you already have existing translations, you should also consider topics below before you upload them.\n\n### Provide the context\n\nYour translators need additional information, so-called context, to provide a high-quality translation. We are actively working on more ways how to ensure that your translators correctly localize your app.  \n\n[Providing comments for key or confusing strings](\u002Fdocs\u002Fandroid\u002Fhow-to-provide-comments-for-strings) is something you can do to improve how your app is translated.\n\n### Glossary is important\n\nThe glossary can provide an extra context for your translators and thus improve the quality of your mobile app translation. [Learn more about how to define your glossary](\u002Fdocs\u002Fgeneral\u002Fhow-to-define-your-glossary).\n\n### Upload screenshots\n\n*We are preparing a post about how to capture and upload screenshots from your app.*  \n\n### Review existing translations\n\nIf you are not sure about the quality of your existing translations, you can [change upload mode and let them go through **the review process**](\u002Fdocs\u002Fandroid\u002Fhow-to-force-existing-translations-to-be-reviewed).\n \n### Exclude private strings\n\nBe sure you don't upload your private strings such as advertisement ID, Facebook app ID, etc. It's easy to exclude them from the upload batch. [Read more about how to do it.](\u002Fdocs\u002Fandroid\u002Fexclude-strings-and-files-from-upload)\n\n### Leave deprecated locales on us\n\nDo you know that Hebrew is **he** and no longer **iw**. Do you maintain both of these locales to be sure that your app is fully compatible with older as well as newer Android versions? It's no longer necessary. Localazy solves that for you. [Learn more about it.](\u002Fdocs\u002Fandroid\u002Fdont-solve-deprecated-locales-by-yourself)\n\n### Handle Chinese correctly\n\n**Chinese**, with **Simplified** and **Traditional** scripts, is a bit of complex topic to handle correctly. You should also know about the most common regions - **CN** (China), **TW** (Taiwan), **HK** (Hong Kong), **MO** (Macao), **SG** (Singapure)... \n\n[It's easy to get Chinese translations correctly with Localazy.](\u002Fdocs\u002Fandroid\u002Fhow-to-handle-chinese-with-localazy)\n\n### Translate libraries\n\n*We are preparing a post about how to translate libraries along with your app.* \n \n### Translate dynamic modules \n\n*We are preparing a post about how to translate app modules and app bundles.*\n\n## Get inspiration...\n\nYou can learn more about these concepts also from \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flocalazy\u002Fandroid-demos\" target=\"_blank\">our demo projects on Github\u003C\u002Fa>. ","What you should know before uploading your Android strings",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2341,"featured_icon":2342},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[2345,2351,2357],{"id":20,"status":5,"title":2346,"content":2347,"slug":2348,"created_on":1880,"modified_on":2349,"owner":1855,"meta_title":10,"category":2350},"In which form string resources can be uploaded?","You can upload your strings directly from you IDE using our available libraries. The reason behind this is the advanced analysis of translatable strings. Localazy will find all strings and will also recommend ignoring common private strings if they are not flagged.\n\n## Is this way of uploading useful also for apps which already have translations?\n\nOf course, this works for both starting and enrolled apps. Moreover, you can easily migrate all your work into Localazy and finish your current unfinished translations sooner thanks to [Localazy ShareTM](\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-sharetm).\n","in-which-form-string-resources-can-be-uploaded","2026-03-30T12:37:07.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":41,"status":5,"title":2352,"content":2353,"slug":2354,"created_on":1880,"modified_on":2355,"owner":1855,"meta_title":10,"category":2356},"Should I remove existing strings.xml files after integrating Localazy?","No. You can leave them unchanged. We automatically process them during the build process, update contained strings, and add missing ones. \nWe never touch your source files, but we always build your app with the most recent translation.","should-i-remove-existing-stringsxml-files-after-integrating-localazy","2023-05-26T19:27:36.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},{"id":2358,"status":5,"title":2359,"content":2360,"slug":2361,"created_on":2362,"modified_on":2363,"owner":2364,"meta_title":10,"category":2365},260,"How to get rid of quotation marks after conversion from JSON to Android XML?","Suppose you have a project where the source file is a JSON file with a row in the format:\n```json\n\"about.moreButton\": \"Learn more on our website\",\n```\n\nWhen using the Localazy CLI to import to Android with [Format Conversions](\u002Fdocs\u002Fcli\u002Fformat-conversions) *(or when you just try to export the JSON file to Android XML inside the Localazy web platform)*, you might notice that the format is:\n\n```xml\n \u003Cstring name=\"about_moreButton\">\"Learn more on our website\"\u003C\u002Fstring>\n```\n\nNow, you might think you should delete those start and end quotation marks in the body of the XML row to achieve this result:\n\n```xml\n\u003Cstring name=\"about_moreButton\">Learn more on our website\u003C\u002Fstring>\n```\n\nHowever, you can keep the quotation marks in the Android XML file because it's a supported construct used to correctly encode white characters that would otherwise be lost in all cases. Quotation marks ensure that the exact form of your strings is preserved after conversion.\n\nIn actual use, the text will render correctly on the device.\n\n> More information can be found on the [Android Developers website: String Resources](https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Ftopics\u002Fresources\u002Fstring-resource#FormattingAndStyling)","how-to-get-rid-of-quotation-marks-after-conversion-from-json-to-android-xml","2023-05-18T10:53:38.000Z","2025-10-27T13:27:06.000Z","4d38dee1-a9d9-4a00-a57d-3ced2b7cb39c",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},[2367,2371,2375,2376],{"id":20,"status":5,"owner":1855,"created_on":2368,"title":352,"excerpt":2369,"content":2370,"slug":1836,"meta_title":10,"meta_description":10,"canonical":10},"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.",{"id":33,"status":5,"owner":1855,"created_on":2368,"title":419,"excerpt":2372,"content":2373,"slug":2374,"meta_title":877,"meta_description":877,"canonical":877},"The process of transforming a text into another language.","Translation (t9n) helps people understand a given term in their native language and is a vital part of the [localization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Flocalization) (l10n) process.\n\nThe localization process is often the most tedious one during software developement, as you can’t just introduce a few locale-based rules in your source code.\n\nTranslating texts to another language is hard. You need to know context\u002Fmeaning. You can translate a word quickly, but without context, you can translate it the wrong way. For example, the term “book” can mean “reserve” or “piece of literature” in the Czech language. Both translations are correct, but which one is valid for a button? Context provides the right meaning.\n\n## [ISO definition of the term \"translation\"](https:\u002F\u002Fwww.iso.org\u002Fobp\u002Fui\u002F#iso:std:iso:17100:ed-1:v1:en)\n\nSet of processes to render source language content into target language content in written form.","translation",{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},{"id":423,"status":5,"owner":1855,"created_on":1901,"title":2377,"excerpt":2378,"content":2379,"slug":2380,"meta_title":10,"meta_description":10,"canonical":10},"Locale","In software, the term locale refers to the set of parameters defining a language environment. ","Locales are used to define the user's language, region, and other interface preferences (like time zones, date formats, or currencies) to facilitate communication.\n\nUsing the appropiate locale is key to enhance [UX](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fux) and deploy an effective [i18n](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Finternationalization) strategy. \n\nLocales are identified with:\n- **A language code** for each language variety (i.e. fr for French, de for German or ja for Japanese). \n- **A region code**, in case differentiation is needed, like es_MX for Mexican Spanish, en_AU for Australian English or it_CH for Swiss Italian.\n\nClassification of locales is governed by the [ISO 639](https:\u002F\u002Fwww.iso.org\u002Fiso-639-language-code) standard.\n\n*See the available Localazy's [locale guides](https:\u002F\u002Flocalazy.com\u002Ftags\u002Flocales) in our blog.*","locale",[2382],{"id":41,"documentation_id":41,"languages_code":925,"slug":2335,"title":2336,"content":2338,"meta_title":2339,"meta_description":2337,"excerpt":2337},[],{"id":19,"status":5,"sort":2385,"created_on":1856,"modified_on":2386,"slug":2387,"title":2388,"excerpt":2389,"content":2390,"meta_title":2388,"meta_description":2389,"pinned":160,"main_image":10,"section":2391,"subsection":2394,"cta":10,"faq":2395,"dictionary":2396,"translations":2397,"documentation_id":19,"blog_articles":2399},"21050","2024-07-16T15:14:33.000Z","how-to-provide-comments-for-strings","How to provide comments for strings","Learn three important rules why adding the context through comments is important. ","## Providing context is important \n\nTo ensure high-quality translations, it's key to provide as much additional information to your translators as possible. The context is essential for strings that may have more different meanings and for strings that you want to translate in a specific way. \n\nAt Localazy, we are working hard to introduce more tools for ensuring high-quality translations. Sometimes, it's up to you too... and commenting strings is one of the situations we can't help you much other than giving you the simplest possible way to do so. \n\n## How to do it with Localazy\n\nThe base\u002Fsource language is one-way synchronized from your code with our [Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin). When parsing your strings resources, we link the last XML comment before the actual string element together. It applies for strings, array lists, and plurals. \n\n```xml\n\u003Cresources>\n\n    \u003C!-- The comment for `string_share` -->\n    \u003Cstring name=\"string_share\">Share\u003C\u002Fstring>\n\n\u003C\u002Fresources>\n```\n\n## The golden rule #1\n\nKeep a simple rule in mind... when adding new strings to your XML files, provide comments to improve your translations. You don't need to do so for all strings but never miss comment for those that may have more meanings. The shorter the string is, the more important to comment on it as single words are usually hard to translate without the context. \n\nAlso, it's critical to keep in mind that the string can have a different meaning in other languages. For example, translating words like **share** or **book** is especially complicated without the context in the Czech language (my native language).\n\nThe translator can understand the word **book** as:\n* *make a reservation* which is **rezervovat** \n* *paper book for reading* which is **kniha** \n\n## The golden rule #2\n \nFor the very same reason as described above, it's essential not to reuse the same string for different meanings. To reduce the number of items in your language resources, you may be tempted to introduce a single element and use it across the whole app like this:\n\n```xml\n\u003Cresources>\n    \u003Cstring name=\"book\">Book\u003C\u002Fstring>\n\u003C\u002Fresources>\n```\n\nDon't do that! Use different strings with a descriptive name to prevent accidental reusing of bad string and provide context with a comment like this: \n\n```xml\n\u003Cresources>\n\n    \u003C!-- The item on our eshop; meaning 'publication' -->\n    \u003Cstring name=\"eshop_book\">Book\u003C\u002Fstring>\n\n    \u003C!-- Booking a flight; meaning 'making a reservation' -->\n    \u003Cstring name=\"book_flight\">Book\u003C\u002Fstring> \n\n\u003C\u002Fresources>\n```\n\n## The golden rule #3\n\nYou should define your app-specific terms in [the glossary](\u002Fdocs\u002Fgeneral\u002Fhow-to-define-your-glossary). It's another essential tool for providing the context. \n\nHowever, it's not always the best way how to let the translator know your requirements for high-quality translation. In many situations, comments are more likely to suit your needs. \n\nOften, I see punctuation to be a big issue. Sometimes, the translator forgets to add a dot at the end of the sentence or replace exclamation mark with dot, etc. If you want to be sure that the translator considers the punctuation with the desired importance, let her know:\n\n```xml\n\u003Cresources>\n\n    \u003C!-- Please keep '...' at the end of the text. -->\n    \u003Cstring name=\"save_as\">Save as ...\u003C\u002Fstring>\n\n\u003C\u002Fresources>\n```\n\nSpeaking about punctuation, keep in mind that there are differences between languages that you have to respect and not consider as a bad translation. \n\nLet's take French as an example. The sentence **\"apples or oranges?\"** would be correctly translated as **\"les pommes ou les oranges ?\"**. Do you see the space before the question mark in the French version? That's correct. Generally, colons, semicolons, exclamation points, and question marks are all preceded by a space in French. \n\n**The rule is:** Provide your translators with the context and all relevant information, but whenever you think the translation is incorrect, learn the language differences. \n\n## Learn more about the best practices \n \nYou can learn more about [how to translate your app from our blog](\u002Fblog) where we share tips, insights and important information.   \n\nAlso, don't miss [what you should know before uploading your android strings](\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings) guide to get high-quality translations for your app.",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2392,"featured_icon":2393},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[],[],[2398],{"id":19,"documentation_id":19,"languages_code":925,"slug":2387,"title":2388,"content":2390,"meta_title":2388,"meta_description":2389,"excerpt":2389},[],{"id":107,"status":5,"sort":2401,"created_on":1856,"modified_on":2402,"slug":2403,"title":2404,"excerpt":2405,"content":2406,"meta_title":2404,"meta_description":2405,"pinned":160,"main_image":10,"section":2407,"subsection":2410,"cta":10,"faq":2411,"dictionary":2414,"translations":2415,"documentation_id":107,"blog_articles":2417},"21060","2024-07-16T15:14:37.000Z","test-ota-updates-on-android","Test OTA updates on Android","So, do you feel that Localazy is not able to translate some of your strings? Learn more about important topics related to testing OTA updates for your translations.  ","## Be sure that strings are translated\n\nUsually, when you didn't plan to translate your app from the start, you may end up externalizing strings to XML resources later as you decide to make your app available in more languages.\n\nThis can be a source of many problems, and some strings may be left in the code or XML layouts. And Localazy can't translate strings that are not obtained by the localization mechanism.  \n\n## Verify the integration with Localazy prefix\n \nAndroid imposes several limitations to OTA updates, and so Localazy uses many different mechanisms to translate your app on-the-fly. \n \nIt's always a good idea to test whether the integrated Localazy library is able to translate the whole app correctly. Our [Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#localazy) comes with an option called `addPrefix` that adds `[LL]` prefix to all strings that go through our OTA mechanism.\n \nWith this option enabled, the app looks like:\n \n![Enabled addPrefix option](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F3bd669fe-3d78-44a1-98bc-751cf4435240)\n \nFrom the first sight, you can see whether everything is processed correctly or not. \n \n## Check custom views\n\nAs mentioned in the previous chapter, OTA updates are not easy on Android, and custom views may need extra care on your side.\n\nWe provide the implementation for all views, menus, preferences, popups, etc. available in Android, AndroidX, and in the Support libraries. Also, all custom views that extend those or are compounded from those are covered too. It means that 99% of all apps are translated automatically with Localazy. \n \nIf it happens that your app uses a custom view that is not fully supported by Localazy, you can easily write our own [custom view transformer](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library#custom-view-transformer).\n\nIf you find some missing pieces, [let us know](mailto:team@localazy.com) and we add support for it.  \n\n## Automatic vs. manual publishing\n\nBy default, automatic publishing of changes is enabled for your app. When a translation is added, updated, or reviewed, your app is scheduled for publishing, and in about 15 to 30 minutes, changes are processed and made available through our update servers. \n\nThis is perfect when your app is in production. If you have trusted translators or reviewers that help you, their work automatically makes your app better even if you are not around.\n\nHowever, when testing the integration of Localazy, you may instead use manual publishing. It allows you to control the exact moment when the new update is available. \n\nJust go to Localazy, open your app, navigate to **Settings**, and disable automatic publishing.\n\n![Disable automatic publishing](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F2b94b57b-bed4-461c-86f9-9ca35f5a2490)\n\nFrom that moment on, the option to publish changes is available above the list of languages in **Translations**. There are three different states:\n\n**There are unpublished changes**\n\n![Image for unpublished changes](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F702ccfa0-687c-4ace-9638-f59309337981)\n\n**Localazy is processing the latest changes**\n\n![Image for publishing](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F2442053b-1dea-4e55-b604-db212b63adb0)\n\n**All changes are published**\n\n![Image for published](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fa5a4e3fc-604f-478a-86e5-54c6e0b37cab)\n\n::: info\nIf the state doesn't change automatically, try to reload the page.\n:::\n\n## Bypass caching with the Localazy Developer app\n\nThe [Localazy Android library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library) uses an internal cache mechanism which may not be desired when testing translations. \n\n**1.** Download \u003Ca href=\"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.localazy.android.developer\" target=\"_blank\">**Localazy Developer** from Play Store\u003C\u002Fa> to your testing device.\n\n**2.** Start the Localazy Developer app. It's very simple and just show a few lines of instructions and log. \n\n![The Localazy Developer app is simple but powerful](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fd807f574-3e32-435c-9c7b-1919b6ef08ca)\n\n**3.** Start your app that integrates the Localazy Android library. It's detected by the Localazy Developer app. If the detection is not successful, force stop your app and start it again.  \n\n![The app is detected by Localazy Developer app](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fb2d459fc-bf99-4a53-bbb7-55735adfa04b)\n\n**4.** From the notification bar, you can force your app to update strings from our servers. \n\n![Force update of strings of your app](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F471a60f5-6b76-4fd9-9846-960e39245652)\n\n**5.** The last log message is displayed in the notification, and more log messages are available in the Localazy Developer app. \n\n![Log messages from Localazy Developer app](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Ff061208a-f5f0-4144-b0d9-6b16c68dd9cc)\n\nThe Localazy Developer app is also a great way how to test [LocalazyListener](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library#listening-to-events) and [@StringLoaded annotation](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library#stringsloaded-annotation).\n\nIf you have any idea how to improve our tools, [we would love to hear about it](mailto:team@localazy.com).",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2408,"featured_icon":2409},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[2412],{"id":45,"status":5,"title":2323,"content":2324,"slug":2325,"created_on":1880,"modified_on":2326,"owner":1855,"meta_title":10,"category":2413},{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},[],[2416],{"id":107,"documentation_id":107,"languages_code":925,"slug":2403,"title":2404,"content":2406,"meta_title":2404,"meta_description":2405,"excerpt":2405},[],{"id":57,"status":5,"sort":2419,"created_on":1856,"modified_on":2386,"slug":2420,"title":2421,"excerpt":2422,"content":2423,"meta_title":2421,"meta_description":2422,"pinned":160,"main_image":10,"section":2424,"subsection":2427,"cta":10,"faq":2428,"dictionary":2435,"translations":2439,"documentation_id":57,"blog_articles":2441},"21070","exclude-strings-and-files-from-upload","Exclude strings and files from upload","Learn how to exclude your private strings such as ad identifiers, URL addresses and sensitive information from being uploaded to Localazy. ","## The reasons for keeping strings untranslated\n\nIt's a good practice to keep your strings out of your source code. And that means all strings, including those that are not supposed to be translated, such as **ad identifiers**, **URL addresses**, **internal IDs**, etc. \n\nAlso, there are valid reasons for not translating part of your app and keeping it in English (or your native language). We use this in our own apps. There is a page that asks people to help us translate the app, and it’s in English. Why? \n\nFirst, we can’t be sure what is the language of the user and whether this part is already translated or not. And, she probably sees this because the app is not fully translated (or is untranslated for the user's language at all).\n\nSecond, to be able to help with translating the app, the user should understand English well enough. So, if she’s not able to read the text of the page, she’s probably not the target audience of its message.  \n\nAnd there’s also a subtle third reason, it’s not important to translate this part of the app, and **fewer strings means fewer investments** - either money and time. \n\n## Three ways of excluding strings\n\nBefore you upload your strings for translating, you should exclude those we talked about above. There are three ways how to do so:\n\n### Mark them as non-translatable\n\nThere is an existing mechanism that allows you to define strings that you don't want to translate by marking them as `translatable=\"false\"`. Localazy honors this and doesn't upload strings with this attribute. \n\nYou can use it in your **strings.xml** like this:\n\n```xml\n\u003Cresources>\n\n    \u003C!-- This strings is excluded using standard Android way -->\n    \u003Cstring name=\"excluded_string_1\" translatable=\"false\">Excluded string 1\u003C\u002Fstring>\n\n\u003C\u002Fresources>\n```\n\n### Exclude strings in the build script\n\nYou can exclude strings based on their key\u002Fname by specifying them in **localazy** > **upload** > **strings** section of your **gradle.build** script. It allows you to exclude strings across all flavors or even in libraries without the need to specify all of them as `translatable=\"false\"`.\n\nIt's as easy as:\n\n```groovy\nlocalazy {\n  \u002F\u002F ...\n  upload {\n    \u002F\u002F ...\n    strings {\n      exclude \"excluded_key\"\n    }       \n  }\n}\n```\n\nYou can also switch to the include-only mode or specify strings inside libraries or dynamic modules. See [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#strings) for more information.  \n\n### Exclude files in the build script\n\nAs other translation platforms usually force developers to upload *strings files*, some of us, like me, already separated private and non-translatable strings to a dedicated file. Mine is called **strings_private.xml**. \n\nWith Localazy, you can easily exclude the whole file from being uploaded:  \n\n```groovy\nlocalazy {\n  \u002F\u002F ...\n  upload {\n    \u002F\u002F ...\n    files {\n      exclude \"*\u002Fstrings_private.xml\"\n    }       \n  }\n}\n```\n\nThe magic path ***\u002Fstrings_private.xml** tells the Gradle plugin to exclude **strings_private.xml** file from all flavors and all values folders. To specify that you don't want to upload **strings.xml** from the **free** flavor and **values-v11** folder use **free:values-v11\u002Fstrings.xml**.\n\nYou can also switch to the include-only mode or specify files inside libraries or dynamic modules. See [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#files) for more information.  \n  \n\n## Localazy is intelligent!  \n  \nWe all are humans and thus make mistakes. I myself uploaded strings that shouldn't be translated for several apps. I always forget about correctly specifying what to exclude. Well, it's entirely my fault because I simply don't use `translatable=\"false\"`. You know, when you are in the flow, you concentrate on your code, and switching to resources XML is a distraction you want to minimize. \n \nWell, my faults are good for you! We have extended our Gradle plugin with an analyzer that looks for the most common patterns and warns you before uploading strings in question.  \n\nThe upload task exits with an exception when the analyzer is not sure about whether it should upload some of your strings or not. \n\n![Gradle fails because of the analyzer](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Ffb34c686-8e63-4010-bde6-0203a6b994d0)\n\nHowever, a **false positive** detection may happen, and so there is an option to disable the analyzer. Do it in your build file like this:\n\n```groovy\nlocalazy {\n  \u002F\u002F ...\n  upload {\n    \u002F\u002F ...\n    ignorePrivateStrings true   \n  }\n}\n```   \n\n## I made a mistake... what now? \n\nNo problem at all. This could happen, and it happens to me as well. \n\nHowever, Localazy doesn't allow you to remove strings directly. It would cause much confusion. The base language is one-way synchronized from your app resources, and so we can't remove them from your code too. There is also our [no changes to your code](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#no-changes-to-your-code) politics we are committed to.\n\nDon't worry; it's still very simple: \n\n**1.** Exclude your strings in the build script or using `translatable=false` and re-upload them to Localazy.\n\n**2.** Excluded strings are no longer available for translation, but our platform still manages them. They are marked as **deprecated**. If they don't contain sensitive information, no action is necessary.         \n\n**3.** If you want them to be deleted, sign in to \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002Flogin\" target=\"_blank\">Localazy\u003C\u002Fa> and go to your project. Now, in **Translations** go to **MANAGE** for the source language, filter deprecated phrases and delete them. \n\nIt's simple, isn't it? \n\n## The example on Github\n\nThere is a \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flocalazy\u002Fandroid-demos\u002Ftree\u002Fmaster\u002Fexcluding-string-and-files\" target=\"_blank\">small example project available on Github\u003C\u002Fa> where you can see all the variants described above. \n\n## Dive deeper...\n\nDon't miss [what you should know before uploading your android strings](\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings) guide to learn more about important topics related to mobile app localization. ",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2425,"featured_icon":2426},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[2429],{"id":19,"status":5,"title":2430,"content":2431,"slug":2432,"created_on":1880,"modified_on":2433,"owner":1855,"meta_title":10,"category":2434},"How to protect my private strings?","You can easily [exclude strings and files from upload](\u002Fdocs\u002Fandroid\u002Fexclude-strings-and-files-from-upload). Make sure you do not include your Admob IDs and so on.","how-to-protect-my-private-strings","2023-05-26T19:27:51.000Z",{"id":20,"status":5,"created_on":1883,"sort":20,"slug":1884,"label":1885,"on_faq_index":162},[2436,2437,2438],{"id":33,"status":5,"owner":1855,"created_on":2368,"title":419,"excerpt":2372,"content":2373,"slug":2374,"meta_title":877,"meta_description":877,"canonical":877},{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},{"id":331,"status":5,"owner":1855,"created_on":1901,"title":1910,"excerpt":1911,"content":1912,"slug":1913,"meta_title":10,"meta_description":10,"canonical":10},[2440],{"id":57,"documentation_id":57,"languages_code":925,"slug":2420,"title":2421,"content":2423,"meta_title":2421,"meta_description":2422,"excerpt":2422},[],{"id":61,"status":5,"sort":2443,"created_on":1856,"modified_on":2444,"slug":2445,"title":2446,"excerpt":2447,"content":2448,"meta_title":2449,"meta_description":2447,"pinned":160,"main_image":10,"section":2450,"subsection":2453,"cta":10,"faq":2454,"dictionary":2455,"translations":2465,"documentation_id":61,"blog_articles":2467},"21080","2024-08-12T06:38:39.000Z","dont-solve-deprecated-locales-by-yourself","Solving deprecated locales","With Localazy, you don't need to care about deprecated locales and other issues ;-).","## Languages are evolving... \n\nIf you wanted to support languages such as **Hebrew** or **Indonesian** correctly, you needed to duplicate your resources to be sure that it's going to work on older as well as newer Android versions. The language codes and the ISO 639 are evolving, some codes are becoming deprecated, and new ones are introduced and later aliased to polish the standard.\n\n## But there is great news...\n\n**I've got great news for you!** You don't need to do so with Localazy, and you shouldn't.\n\nWhen you upload your translations, Localazy converts older locale codes to the newer ones. If your app contains both versions, you end up with an error. Nothing critical. Just an informative notification.\n\n**More great news!** When your translations are published, Localazy automatically adds both versions to ensure that your app works as expected. And we can transparently handle also regional variants.\n\nDon't think about these issues. That's our job.\n\n## Want to learn more? \n\nIf you want insight, the conversion is made for these locales:\n\n* **Hebrew** - he vs. iw\n* **Yiddish** - yi vs. ji\n* **Indonesian** - id vs. in\n* **Filipino** - fil vs. tl\n* **Norwegian, Bokmål** - no vs. nb\n\nWe could talk much longer about these issues. For example, **Filipino** is the successor of **Pilipino**, which is the modern transformation of **Tagalog** language. In fact, it's not just a deprecation of old locale code, but you are good to go with a simple alias.\n\nWe learn all these facts, issues, and small exceptions, so you don't need to.\n\n## Dive deeper...\n\nTranslating your mobile app is a complex topic, but we are doing our best to help you as much as we can. Don't miss [what you should know before uploading your android strings](\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings) guide to get high-quality translations for your app. ","Don't solve deprecated locales by yourself",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2451,"featured_icon":2452},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[],[2456,2457,2458,2464],{"id":20,"status":5,"owner":1855,"created_on":2368,"title":352,"excerpt":2369,"content":2370,"slug":1836,"meta_title":10,"meta_description":10,"canonical":10},{"id":33,"status":5,"owner":1855,"created_on":2368,"title":419,"excerpt":2372,"content":2373,"slug":2374,"meta_title":877,"meta_description":877,"canonical":877},{"id":37,"status":5,"owner":1855,"created_on":2459,"title":2460,"excerpt":2461,"content":2462,"slug":2463,"meta_title":877,"meta_description":877,"canonical":877},"2026-05-12T07:09:22.000Z","Globalization","The process of preparing a product for international use.","Globalization is a process in which companies prepare for international influence or start operating in an international scale. It involves designing and developing applications that function for multiple cultures. The process of globalization is a vital part of making the product ready for global use by concept and should be integrated when the business and product development strategies are being conceived.\n\nIn the case of mobile app developement, thinking about globalization from the very start will save you difficulties connected with rewriting the code and redesigning the UX, but that is not all. It is always a good idea to think about globalization before you even start with the development to find out whether your mobile app is viable for it or not.\n\nGlobalization has profound impacts on how companies operate, how cultures interact, and how economies grow. It drives innovation, opens up new markets, and creates opportunities for collaboration and competition on a worldwide stage.\n\n## 🌍 Key points about globalization: \n\n* Globalization facilitates the selling of goods, services, and the flow of capital, and labor across international borders, contributing to global economic interdependence and growth.\n* It encourages the exchange of cultural ideas, values, and practices, leading to greater cultural diversity and mutual understanding.\n* Businesses can expand into international markets, accessing new customer bases and growth opportunities, driving global trade.\n* While globalization offers numerous benefits, it also presents challenges such as economic inequality, cultural homogenization, and environmental impacts.\n\nUnderstanding and prioritizing globalization is essential for enabling individuals and organizations to access global opportunities and broaden their reach beyond native borders.\n\n> *Other concepts closely related to globalization are [internationalization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Finternationalization\u002F) and [expansion](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fexpansion\u002F).*","globalization",{"id":107,"status":5,"owner":1855,"created_on":1901,"title":593,"excerpt":1907,"content":1908,"slug":592,"meta_title":10,"meta_description":10,"canonical":10},[2466],{"id":61,"documentation_id":61,"languages_code":925,"slug":2445,"title":2446,"content":2448,"meta_title":2449,"meta_description":2447,"excerpt":2447},[],{"id":4,"status":5,"sort":2469,"created_on":1856,"modified_on":2470,"slug":2471,"title":2472,"excerpt":2473,"content":2474,"meta_title":2472,"meta_description":2473,"pinned":160,"main_image":10,"section":2475,"subsection":2478,"cta":10,"faq":2479,"dictionary":2480,"translations":2486,"documentation_id":4,"blog_articles":2488},"21090","2024-08-12T06:39:53.000Z","how-to-handle-chinese-with-localazy","How to handle Chinese with Localazy","Reach thousands of new users with a translation of your app to Chinese.","## Scripts and regions...\n\n**Chinese**, with **Simplified** and **Traditional** scripts, is a bit of a complex topic to handle correctly. You should also know about most common regions - **CN** (China), **TW** (Taiwan), **HK** (Hong Kong), **MO** (Macao), **SG** (Singapure)... Do you know what script is the most commonly used in Taiwan? And what about Singapure? \n\n## Easy to handle correctly...\n\nIn Localazy, all you need to do is to handle **Simplified Chinese** (zh#Hans) and **Traditional Chinese** (zh#Hant). \n\nIf you already have **Chinese translations** in your app, you just need to keep **zh-rCN** and **zh-rTW**. Those will be converted to **zh_CN#Hans** and **zh_TW#Hant** upon uploading to Localazy. \n\nEverything else is handled automatically by Localazy. We generate all the necessary variants and aliases. If you provide specific resources for other regions, we keep them as they are. \n\nIn a spirit of our vision, you no longer need to care about it and duplicate your translations. This is what you can expect Localazy to solve for you. You should be working on your app, making it better and better and not learning about hundreds of small exceptions along the way. \n\n## Want to learn more? \n\nBtw, the most common combinations of scripts and regions are:\n\n* **zh_TW (#Hant)** - Traditional\n* **zh_HK (#Hant)** - Traditional\n* **zh_MO (#Hant)** - Traditional\n* **zh_CN (#Hans)** - Simplified\n* **zh_SG (#Hans)** - Simplified\n\nFrom Android 7 on, with the support for many new locales, you can also use the new format **values-b+zh+Hant+TW**, but that makes the whole problem even bigger as correctly supporting all versions is becoming clunky with fallbacks, etc. For this reason, we implicitly support only the versions with the script included in Localazy and do all the conversions behind the scene.\n\n## Dive deeper...\n\nTranslating your mobile app and taking care of all the small issues and differences is a complex topic, but we are doing our best to help you as much as we can. Don't miss [what you should know before uploading your android strings](\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings) guide to get high-quality translations for your app. ",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2476,"featured_icon":2477},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[],[2481],{"id":4,"status":5,"owner":1855,"created_on":2368,"title":2482,"excerpt":2483,"content":2484,"slug":2485,"meta_title":877,"meta_description":877,"canonical":877},"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",[2487],{"id":4,"documentation_id":4,"languages_code":925,"slug":2471,"title":2472,"content":2474,"meta_title":2472,"meta_description":2473,"excerpt":2473},[],{"id":71,"status":5,"sort":2490,"created_on":1856,"modified_on":2491,"slug":2492,"title":2493,"excerpt":2494,"content":2495,"meta_title":2496,"meta_description":2494,"pinned":160,"main_image":10,"section":2497,"subsection":2500,"cta":10,"faq":2501,"dictionary":2502,"translations":2503,"documentation_id":71,"blog_articles":2505},"21100","2024-08-02T05:34:31.000Z","what-is-the-language-resource-contamination-and-how-to-fix-it","Fixing the language resource contamination","The language resource contamination breaks the locale fallback mechanism when you include libraries with many translations. Localazy fixes it! ","## The problem with language fallbacks\n\nThe language resource contamination is also called **language resource pollution**, and it breaks the locale fallback mechanism when you include libraries with many translations. It's a big deal for common libraries such as **AppCompat**, **AndroidX**, and **Google Play Services**. \n\nWhen the app is built, the resources are merged, and so there is no way how Android could know what languages your actual app is translated to.  \n\nImagine a simple situation; I can speak **Czech (cs)** and **French (fr)**. So I configure my Android device like this:\n\n\u003Cimg src=\"https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F9dd11101-3b63-4132-9a54-4fc99ec9015a\" width=\"320\" alt=\"Language resource contamination\" \u002F>\n\nThe default language of your app is **English** (as for the majority of existing apps), and you've invested a lot of effort and money to translate your app to the **French** language. But I'm not going to benefit from it.\n\nWhy? Your app contains **Czech (cs)** resources included from **AndroidX** and so Android select my preferred choice, the **Czech** language, and every single string in your app is missing in this language and fallbacks to the default one. And you don't want this to happen.\n\n## What is the solution to this issue?\n\nThe Android Gradle plugin comes with an easy to use solution. All you need to do is to specify locales that your app is translated to in your `build.gradle` file like this:\n\n```groovy\n\u002F\u002F ...\n\nandroid {\n\n  \u002F\u002F ...\n\n  defaultConfig {\n    \u002F\u002F ...    \n    resConfigs \"en\", \"fr\"\n  }\n\n  \u002F\u002F ...\n\n}\n\n\u002F\u002F ...\n```\n\nThis way, all other locales are omitted during the build process, and your app will work for me with **French** fallback precisely as desired.\n     \n## I don't want to specify locales manually! \n\nAnd you shouldn't! It can be a source of mistakes. What if you forget to include new translations or make a typo? There is no check, no warning.   \n \nAlso, you need to think about it, at least, for every release. It's adding another burden to your shoulders. Let's fight it together ;).\n\nThe Localazy Gradle plugin comes with an automated solution. You just need to make a few changes to your build script.\n\n```groovy\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\n\n\u002F\u002F Add the special plugin for accessing Localazy data.\napply plugin: 'com.localazy.gradle.data'\n\n\u002F\u002F Move the Localazy configuration above the android section. \nlocalazy {\n  \u002F\u002F ...\n}\n\nandroid {\n  \u002F\u002F ...\n  defaultConfig {\n    \u002F\u002F ...    \n    \u002F\u002F \n    resConfigs localazy.getResConfigs()\n  }\n  \u002F\u002F ...\n}\n\n\u002F\u002F ...\n\n\u002F\u002F Apply the normal Localazy plugin after the android section\napply plugin: 'com.localazy.gradle'\n``` \n\n::: info\nFollow the basic guide and upload your strings before introducing these changes to your build script as for this to work correctly, your translations have to be first uploaded and processed by our servers.\n::: \n  \n  \n## What about if I add more languages later?   \n\nThis all is just about the resources contained in your APK or app bundle. All updated strings and new languages are automatically added to your app during the build process.        \n\nLocalazy library integrated into your app uses its own resolution mechanism that is not affected by the resource contamination issue. It can download updated strings as well as new languages from our servers and use them even if they are filtered out by the process described above. OTA updates of your app's translations are not affected in any way. \n\n \n## What should you consider?\n\nYou should provide your translations for all strings in the app and don't rely on those provided by the libraries as you may easily end up with mixed translations in a way that is out of your control.\n  \nTranslating the whole app correctly without side effects is not an easy job, and we try to help you with this tedious task as much as we can.","What is the language resource contamination and how to fix it?",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2498,"featured_icon":2499},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[],[],[2504],{"id":71,"documentation_id":71,"languages_code":925,"slug":2492,"title":2493,"content":2495,"meta_title":2496,"meta_description":2494,"excerpt":2494},[],{"id":331,"status":5,"sort":2507,"created_on":1856,"modified_on":2402,"slug":2508,"title":2509,"excerpt":2510,"content":2511,"meta_title":2512,"meta_description":2510,"pinned":160,"main_image":10,"section":2513,"subsection":2516,"cta":10,"faq":2517,"dictionary":2518,"translations":2519,"documentation_id":331,"blog_articles":2521},"21110","how-to-force-existing-translations-to-be-reviewed","Force existing translations to be reviewed","It's widespread that volunteers translate many mobile apps without any verification. It's risky! It can affect how users perceive your app and how they value it. ","## Not sure about the quality?\n\nWe talk to you, mobile app developers, and it's widespread that volunteers translate many mobile apps without any verification. It's risky! You should always, at least, review translations that you put into your app. \n\nIt can affect how users perceive your app and how they value it. \n\n## Force the review process\n\nYou can easily upload your existing app translation to the Localazy platform by one click with the default settings of the [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin). \n\nBy default, uploaded strings are automatically approved, but you may want to change that and force all strings to go through the review process, so you can give them extra care and ensure that your app is correctly translated.\n\nHow to do that? It's simple like this: \n\n```groovy\nlocalazy {\n    \u002F\u002F your other settings like readKey, writeKey, etc.\n   \n    upload {\n        defaultState \"new\"\n    }\n}\n```\n\nAnd that's it. It's that easy ;-). Uploaded strings will be now marked as *new* and therefore need your approval to be used in the final version of your mobile app. ","How to force existing translations to be reviewed",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2514,"featured_icon":2515},{"id":798},{"id":800},{"id":61,"status":5,"sort":45,"created_on":1872,"name":2251},[],[],[2520],{"id":331,"documentation_id":331,"languages_code":925,"slug":2508,"title":2509,"content":2511,"meta_title":2512,"meta_description":2510,"excerpt":2510},[],{"id":91,"status":5,"sort":2523,"created_on":1856,"modified_on":2524,"slug":2525,"title":2526,"excerpt":2527,"content":2528,"meta_title":2529,"meta_description":2527,"pinned":160,"main_image":10,"section":2530,"subsection":2533,"cta":10,"faq":2534,"dictionary":2535,"translations":2536,"documentation_id":91,"blog_articles":2538},"22000","2024-08-12T06:32:34.000Z","changelog-gradle-plugin","Changelog - Gradle plugin","We never sleep and keep all our services and tools up to date. ","This document is a changelog for [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin).\n\n## Version 1.5.3\n- improves uploading of CDATA sections and text processing\n- adds support for release tags\n- minor improvements\n\n## Version 1.5.2\n- fixes issue with uploading strings in CDATA section\n\n## Version 1.5.1\n- support for Android Gradle plugin 4.1.x\n\n## Version 1.5.0\n- support for Android Gradle plugin 4.0.x\n- removes InstantApp and Feature dependency (removed in Android Gradle plugin 4.0.0+)\n\n## Version 1.4.0\n- streamlines the upload process with an optional strict mode\n- adds an additional option to control the pre-upload analysis by [specifying strings to include](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#upload)\n- fixes minor bugs and improves localazy.log file\n\n## Version 1.3.0\n- reworks the integration process - it's easier and needs fewer operations now\n- adds more internal checks that allow for smoother integration\n- adds a shortcut for [settings OTA updates for loyal users only](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection)\n- adds an option to [define keys in local.properties](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#defining-keys-in-localproperties)\n- adds an option to [skip strings in the pre-upload analysis](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#upload)\n- improves error reporting\n- improves library handling\n\n## Version 1.2.1\n- improves task generating, stops generating unnecessary tasks\n- improves the internal dependency map\n- adds option for [disabling stats and updates during the development](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection)\n\n## Version 1.2.0\n- adds [more configuration options for updates and stats](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin#injection)\n- changes default values to more sensible ones for most apps\n\n## Version 1.1.0\n- adds support for Android Gradle plugin 3.6.x\n- adds support for incremental builds\n\n## Version 1.0.0\n- support for Android Gradle plugin 3.5.x\n\n","Gradle plugin - Changelog",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2531,"featured_icon":2532},{"id":798},{"id":800},{"id":257,"status":5,"sort":53,"created_on":1872,"name":841},[],[],[2537],{"id":91,"documentation_id":91,"languages_code":925,"slug":2525,"title":2526,"content":2528,"meta_title":2529,"meta_description":2527,"excerpt":2527},[],{"id":103,"status":5,"sort":2540,"created_on":1856,"modified_on":2541,"slug":2542,"title":2543,"excerpt":2527,"content":2544,"meta_title":2543,"meta_description":2527,"pinned":160,"main_image":10,"section":2545,"subsection":2548,"cta":10,"faq":2549,"dictionary":2550,"translations":2551,"documentation_id":103,"blog_articles":2553},"22010","2024-07-16T15:14:34.000Z","changelog-android-library","Changelog - Android Library","This document is a changelog for [Localazy Android library](\u002Fdocs\u002Fandroid\u002Flocalazy-android-library).\n\n## Version 1.2.0\n- fixes and improvements\n- add support for the release tags\n- add support for TextInputLayout\n\n## Version 1.1.0\n- improves updates and stats intervals, delays, conditions\n- makes updates and stats highly configurable\n- makes some options configurable remotely\n- changes default values to more sensible ones for most apps\n\n## Version 1.0.1\n- fixes a minor bug with new lines being ignored in certain situations\n\n## Version 1.0.0\n- initial version of the library supporting plain Android, AndroidX and Support libraries\n\n",{"id":4,"status":5,"sort":37,"created_on":1864,"slug":592,"name":593,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":160,"icon":2546,"featured_icon":2547},{"id":798},{"id":800},{"id":257,"status":5,"sort":53,"created_on":1872,"name":841},[],[],[2552],{"id":103,"documentation_id":103,"languages_code":925,"slug":2542,"title":2543,"content":2544,"meta_title":2543,"meta_description":2527,"excerpt":2527},[],[],[2556,2574,2591],{"id":2557,"owner":2558,"created_by":10,"sort":10,"title":2563,"slug":2564,"modified_on":877,"created_on":2565,"pinned":160,"badge":10,"priority":1824,"main_image":2566,"status":5,"tags":2567,"dictionary":2573,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"60a37fc7cf7b6a0001d1f18c",{"id":2559,"first_name":2560,"last_name":877,"slug":2561,"avatar":2562},"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",[2568,2569,2570],{"id":451,"created_on":1828,"status":5,"label":593,"slug":592,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":352,"slug":1836,"on_index_page":162},{"id":451,"created_on":1828,"status":5,"label":2571,"slug":2572,"on_index_page":160},"HowTo","howto",[],{"id":2575,"owner":2576,"created_by":10,"sort":10,"title":2581,"slug":2582,"modified_on":877,"created_on":2583,"pinned":160,"badge":10,"priority":1824,"main_image":2584,"status":5,"tags":2585,"dictionary":2590,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"60a37fc7cf7b6a0001d1f1cf",{"id":2577,"first_name":2578,"last_name":877,"slug":2579,"avatar":2580},"6092822ecf7b6a0001d1dab0","Danijel Markov","danijel-markov","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fdanijel.png","Top 10 tools for (not only) multilingual Android development","top-10-tools-multilingual-android-development","2021-04-29T17:15:52.000+02:00","https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fb5749a78-1805-422f-8edf-05586a009047",[2586,2587],{"id":451,"created_on":1828,"status":5,"label":593,"slug":592,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":2588,"slug":2589,"on_index_page":162},"DevTips","devtips",[],{"id":2592,"owner":2593,"created_by":10,"sort":10,"title":2598,"slug":2599,"modified_on":877,"created_on":2600,"pinned":160,"badge":10,"priority":1824,"main_image":2601,"status":5,"tags":2602,"dictionary":2609,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"6941333663350c0001d6248d",{"id":2594,"first_name":2595,"last_name":877,"slug":2596,"avatar":2597},"6824a22d63350c0001d5a5cf","Dasun Nirmitha","dasun-nirmitha","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2025\u002F11\u002FDasun.png","Managing your Android and iOS projects in Localazy","managing-your-android-and-ios-projects-in-localazy","2026-03-26T15:21:24.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F01\u002Fmanage-android-and-ios.png",[2603,2604,2605],{"id":451,"created_on":1828,"status":5,"label":600,"slug":599,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":593,"slug":592,"on_index_page":160},{"id":2606,"created_on":1828,"status":5,"label":2607,"slug":2608,"on_index_page":160},667327,"App localization","app-localization",[],[2611,2612,2613],["Reactive",1876],["Reactive",1886],["Reactive",1892]]