[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"main-navigation":3,"footer-homepage":723,"footer-integrations":790,"footer-settings":1701,"blog-post-nav-[USE LATEST FEATURED]":1814,"blog-post-nav-nav":1839,"docs-cli-toml-format":1851,"faq-embed:\u002Fdocs\u002Fcli\u002Ftoml-format:::37":3203},[4,211,451,582,715,719],{"id":5,"name":6,"url":7,"url_text":7,"status":8,"groups":9},2,"Solutions",null,"published",[10,24,99,135],{"navigation_items_group_id":11},{"id":12,"sort":13,"status":8,"name":14,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":17,"show_all_url":7,"represent_as_tile":15,"items":18},3,5,"Featured Article",false,"top",true,[19],{"collection":20,"item":21},"blog_post_navigation_item_type",{"id":22,"status":8,"sort":7,"show_author_img":17,"blog_post_tag":23,"description":7},4,"nav",{"navigation_items_group_id":25},{"id":13,"sort":26,"status":8,"name":27,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":28,"represent_as_tile":17,"items":29},1,"Your Role","\u002Froles",[30,42,52,64,75,87],{"collection":31,"item":32},"relation_navigation_item_type",{"id":26,"status":8,"sort":7,"name":33,"item":34},"CMO",[35],{"collection":36,"item":37},"personas",{"id":26,"status":8,"sort":7,"slug":38,"icon":39},"chief-marketing-officers",{"id":40,"title":41},"526097d8-176f-48e5-83d3-2fc4d77061f9","La Mail Bulk",{"collection":31,"item":43},{"id":12,"status":8,"sort":7,"name":44,"item":45},"CTO",[46],{"collection":36,"item":47},{"id":22,"status":8,"sort":7,"slug":48,"icon":49},"chief-technical-officers",{"id":50,"title":51},"f808fdf0-c78b-4294-ba59-fe25f46fe825","La Mechanic",{"collection":31,"item":53},{"id":54,"status":8,"sort":7,"name":55,"item":56},20,"Product Manager",[57],{"collection":36,"item":58},{"id":59,"status":8,"sort":7,"slug":60,"icon":61},18,"product-managers",{"id":62,"title":63},"ea39586a-21fc-4b34-ba87-496028e5198f","La Worker",{"collection":31,"item":65},{"id":66,"status":8,"sort":7,"name":67,"item":68},37,"Translator",[69],{"collection":36,"item":70},{"id":54,"status":8,"sort":7,"slug":71,"icon":72},"professional-translators",{"id":73,"title":74},"07945171-d51d-4ca8-96c0-21cde9db258f","La Chat",{"collection":31,"item":76},{"id":77,"status":8,"sort":7,"name":78,"item":79},38,"Developer",[80],{"collection":36,"item":81},{"id":82,"status":8,"sort":7,"slug":83,"icon":84},30,"software-developers",{"id":85,"title":86},"1806e46d-c551-4845-bf42-4407344d229e","La Terminal",{"collection":31,"item":88},{"id":89,"status":8,"sort":7,"name":90,"item":91},27,"Localization Manager",[92],{"collection":36,"item":93},{"id":94,"status":8,"sort":7,"slug":95,"icon":96},6,"localization-managers",{"id":97,"title":98},"dac69bd1-bf5d-41d0-87d4-dd13e314698a","La Language",{"navigation_items_group_id":100},{"id":101,"sort":12,"status":8,"name":102,"render_show_all_url":15,"show_all_url_position":103,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":104},9,"Use cases","bottom",[105,111,116,121,125,130],{"collection":106,"item":107},"simple_link_navigation_item_type",{"id":108,"status":8,"sort":7,"url":109,"url_text":110,"show_favorite_icon":15},24,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fsoftware-localization","Software localization",{"collection":106,"item":112},{"id":113,"status":8,"sort":7,"url":114,"url_text":115,"show_favorite_icon":15},26,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fmobile-app-localization","Mobile app localization",{"collection":106,"item":117},{"id":118,"status":8,"sort":7,"url":119,"url_text":120,"show_favorite_icon":15},25,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fwebsite-localization","Website localization",{"collection":106,"item":122},{"id":89,"status":8,"sort":7,"url":123,"url_text":124,"show_favorite_icon":15},"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fdesign-localization","Design localization",{"collection":106,"item":126},{"id":127,"status":8,"sort":7,"url":128,"url_text":129,"show_favorite_icon":15},28,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fgame-localization","Game localization",{"collection":106,"item":131},{"id":132,"status":8,"sort":7,"url":133,"url_text":134,"show_favorite_icon":15},29,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fhelp-and-docs-localization","Help & docs localization",{"navigation_items_group_id":136},{"id":137,"sort":5,"status":8,"name":138,"render_show_all_url":15,"show_all_url_position":103,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":139},8,"Industry",[140,152,163,173,184,193,204],{"collection":31,"item":141},{"id":142,"status":8,"sort":7,"name":143,"item":144},23,"Digital Agencies",[145],{"collection":36,"item":146},{"id":147,"status":8,"sort":7,"slug":148,"icon":149},7,"digital-agencies",{"id":150,"title":151},"547f5619-b21d-4b29-86f1-8b2200313cde","La Digi Agency",{"collection":31,"item":153},{"id":154,"status":8,"sort":7,"name":155,"item":156},39,"Startups & SaaS",[157],{"collection":36,"item":158},{"id":5,"status":8,"sort":7,"slug":159,"icon":160},"startups",{"id":161,"title":162},"da1516e2-4afc-40a2-bcbf-a8161e2d610d","La Saa S",{"collection":31,"item":164},{"id":5,"status":8,"sort":7,"name":165,"item":166},"E-commerce",[167],{"collection":36,"item":168},{"id":13,"status":8,"sort":7,"slug":169,"icon":170},"e-commerce",{"id":171,"title":172},"a3d09cd2-054f-4bb5-a0a2-d3d207db65df","La Ecommerce",{"collection":31,"item":174},{"id":175,"status":8,"sort":7,"name":176,"item":177},19,"FinTech Platforms",[178],{"collection":36,"item":179},{"id":89,"status":8,"sort":7,"slug":180,"icon":181},"fintech",{"id":182,"title":183},"147339ba-07d1-4e5e-baad-23d27e60c919","La Money",{"collection":31,"item":185},{"id":108,"status":8,"sort":7,"name":186,"item":187},"Translation Agencies",[188],{"collection":36,"item":189},{"id":108,"status":8,"sort":7,"slug":190,"icon":191},"translation-agencies",{"id":192,"title":98},"15d6fe33-2af8-4d6e-933d-5caa64394511",{"collection":31,"item":194},{"id":195,"status":8,"sort":7,"name":196,"item":197},22,"Travel & Tourism",[198],{"collection":36,"item":199},{"id":12,"status":8,"sort":7,"slug":200,"icon":201},"tourism",{"id":202,"title":203},"23a785e8-0ae5-4c4b-8452-aab1b58182a6","La Travel",{"collection":31,"item":205},{"id":118,"status":8,"sort":7,"name":206,"item":207},"Nonprofit Causes",[208],{"collection":36,"item":209},{"id":127,"status":8,"sort":7,"slug":210,"icon":7},"nonprofit",{"id":13,"name":212,"url":7,"url_text":7,"status":8,"groups":213},"Features",[214,284,342,392],{"navigation_items_group_id":215},{"id":216,"sort":94,"status":8,"name":217,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":218},11,"Localization",[219,228,237,246,255,259,267,276],{"collection":31,"item":220},{"id":221,"status":8,"sort":7,"name":222,"item":223},44,"Localization services",[224],{"collection":225,"item":226},"products",{"id":101,"status":8,"slug":227},"continuous-localization-team",{"collection":31,"item":229},{"id":230,"status":8,"sort":7,"name":231,"item":232},45,"Translation management",[233],{"collection":234,"item":235},"term_landing_page",{"id":132,"status":8,"slug":236},"translation-management-system",{"collection":31,"item":238},{"id":239,"status":8,"sort":7,"name":240,"item":241},46,"Context Screenshots",[242],{"collection":225,"item":243},{"id":244,"status":8,"slug":245},13,"context-screenshots-ocr",{"collection":31,"item":247},{"id":248,"status":8,"sort":7,"name":249,"item":250},47,"Translation Glossary",[251],{"collection":225,"item":252},{"id":253,"status":8,"slug":254},17,"glossary",{"collection":106,"item":256},{"id":22,"status":8,"sort":7,"url":257,"url_text":258,"show_favorite_icon":15},"\u002Fdocs\u002Fgeneral\u002Freviewing-translations","Quality control",{"collection":31,"item":260},{"id":261,"status":8,"sort":7,"name":262,"item":263},34,"Connected Projects",[264],{"collection":225,"item":265},{"id":26,"status":8,"slug":266},"connected-projects",{"collection":31,"item":268},{"id":269,"status":8,"sort":7,"name":270,"item":271},64,"Plural handling",[272],{"collection":225,"item":273},{"id":274,"status":8,"slug":275},32,"plurals",{"collection":31,"item":277},{"id":278,"status":8,"sort":7,"name":279,"item":280},65,"Style guides",[281],{"collection":225,"item":282},{"id":77,"status":8,"slug":283},"style-guide",{"navigation_items_group_id":285},{"id":286,"sort":147,"status":8,"name":287,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":288},12,"Translation",[289,297,305,309,317,325,334],{"collection":31,"item":290},{"id":291,"status":8,"sort":7,"name":292,"item":293},36,"Professional translations",[294],{"collection":234,"item":295},{"id":82,"status":8,"slug":296},"professional-translation-services",{"collection":31,"item":298},{"id":299,"status":8,"sort":7,"name":300,"item":301},48,"Crowdsourced translations",[302],{"collection":225,"item":303},{"id":137,"status":8,"slug":304},"share-tm",{"collection":106,"item":306},{"id":13,"status":8,"sort":7,"url":307,"url_text":308,"show_favorite_icon":15},"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings","Translation interface",{"collection":31,"item":310},{"id":311,"status":8,"sort":7,"name":312,"item":313},55,"Machine translations",[314],{"collection":225,"item":315},{"id":13,"status":8,"slug":316},"machine-translation",{"collection":31,"item":318},{"id":319,"status":8,"sort":7,"name":320,"item":321},60,"Localazy AI translation",[322],{"collection":225,"item":323},{"id":132,"status":8,"slug":324},"localazy-ai",{"collection":31,"item":326},{"id":327,"status":8,"sort":7,"name":328,"item":329},61,"Translation Memory",[330],{"collection":225,"item":331},{"id":332,"status":8,"slug":333},35,"translation-memory",{"collection":31,"item":335},{"id":336,"status":8,"sort":7,"name":337,"item":338},63,"Code & placeholders",[339],{"collection":225,"item":340},{"id":82,"status":8,"slug":341},"code-and-placeholders",{"navigation_items_group_id":343},{"id":244,"sort":137,"status":8,"name":344,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":345},"Management",[346,350,358,367,376,384,388],{"collection":106,"item":347},{"id":137,"status":8,"sort":7,"url":348,"url_text":349,"show_favorite_icon":15},"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles","User roles",{"collection":31,"item":351},{"id":352,"status":8,"sort":7,"name":353,"item":354},51,"Duplicity Linking",[355],{"collection":225,"item":356},{"id":175,"status":8,"slug":357},"duplicity-linking",{"collection":31,"item":359},{"id":360,"status":8,"sort":7,"name":361,"item":362},52,"Language Permissions",[363],{"collection":225,"item":364},{"id":365,"status":8,"slug":366},21,"language-permissions",{"collection":31,"item":368},{"id":369,"status":370,"sort":7,"name":371,"item":372},53,"draft","Automations",[373],{"collection":225,"item":374},{"id":54,"status":8,"slug":375},"automations",{"collection":31,"item":377},{"id":378,"status":8,"sort":7,"name":379,"item":380},58,"Branching",[381],{"collection":225,"item":382},{"id":89,"status":8,"slug":383},"branching",{"collection":106,"item":385},{"id":365,"status":370,"sort":7,"url":386,"url_text":387,"show_favorite_icon":15},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fsso-configuration","SSO",{"collection":106,"item":389},{"id":195,"status":370,"sort":7,"url":390,"url_text":391,"show_favorite_icon":15},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics","Reporting",{"navigation_items_group_id":393},{"id":394,"sort":101,"status":8,"name":395,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":396},14,"Development",[397,404,412,419,426,434,443],{"collection":31,"item":398},{"id":132,"status":8,"sort":7,"name":399,"item":400},"Translation API",[401],{"collection":225,"item":402},{"id":216,"status":8,"slug":403},"translation-api",{"collection":31,"item":405},{"id":406,"status":8,"sort":7,"name":407,"item":408},33,"Localazy CLI",[409],{"collection":225,"item":410},{"id":147,"status":8,"slug":411},"cli",{"collection":31,"item":413},{"id":274,"status":8,"sort":7,"name":414,"item":415},"Language CDN",[416],{"collection":225,"item":417},{"id":22,"status":8,"slug":418},"language-cdn",{"collection":31,"item":420},{"id":127,"status":8,"sort":7,"name":421,"item":422},"Releases",[423],{"collection":225,"item":424},{"id":94,"status":8,"slug":425},"releases",{"collection":31,"item":427},{"id":428,"status":370,"sort":7,"name":429,"item":430},57,"Format Conversions",[431],{"collection":225,"item":432},{"id":5,"status":8,"slug":433},"format-conversions",{"collection":31,"item":435},{"id":436,"status":8,"sort":7,"name":437,"item":438},59,"Webhooks",[439],{"collection":225,"item":440},{"id":441,"status":8,"slug":442},31,"webhooks",{"collection":31,"item":444},{"id":445,"status":8,"sort":7,"name":446,"item":447},62,"Export Aliases",[448],{"collection":225,"item":449},{"id":406,"status":8,"slug":450},"export-aliases",{"id":22,"name":452,"url":7,"url_text":7,"status":8,"groups":453},"Integrations",[454,572],{"navigation_items_group_id":455},{"id":147,"sort":456,"status":8,"name":457,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":458},10,"Most popular",[459],{"collection":31,"item":460},{"id":286,"status":8,"sort":7,"name":452,"item":461},[462,470,477,484,491,498,505,512,519,526,533,542,549,556,564],{"collection":463,"item":464},"platforms",{"id":94,"status":8,"sort":26,"slug":465,"name":466,"icon":467},"android","Android",{"id":468,"title":469},"ff965add-53b0-44ad-b27c-ea4ef641d384","Ic Outline Android",{"collection":463,"item":471},{"id":147,"status":8,"sort":5,"slug":472,"name":473,"icon":474},"ios","iOS",{"id":475,"title":476},"886285d7-816a-4430-b5a5-edfe307b238e","Ios",{"collection":463,"item":478},{"id":406,"status":8,"sort":12,"slug":479,"name":480,"icon":481},"react","React",{"id":482,"title":483},"26757a90-88a3-4a94-b587-9f38614ed3bd","Logos React",{"collection":463,"item":485},{"id":175,"status":8,"sort":22,"slug":486,"name":487,"icon":488},"vuejs","Vue.js",{"id":489,"title":490},"6180b41f-3249-47d3-adcd-50fe1cf11bf1","Vue",{"collection":463,"item":492},{"id":493,"status":8,"sort":13,"slug":494,"name":495,"icon":496},16,"angular","Angular",{"id":497,"title":495},"2a31a97a-48c5-4531-aa36-41c9dd0bdbef",{"collection":463,"item":499},{"id":26,"status":8,"sort":94,"slug":500,"name":501,"icon":502},"flutter","Flutter",{"id":503,"title":504},"b9f13a11-9328-4a03-86cf-b20de0685606","Logos Flutter",{"collection":463,"item":506},{"id":12,"status":8,"sort":216,"slug":507,"name":508,"icon":509},"typescript","TypeScript",{"id":510,"title":511},"8d1319b5-8a96-4199-8407-00add3418b1f","Logos Typescript Icon",{"collection":463,"item":513},{"id":441,"status":8,"sort":286,"slug":514,"name":515,"icon":516},"javascript","JavaScript",{"id":517,"title":518},"4218d0c9-7e6b-494d-9663-37ceaf93ee8c","Logos Javascript",{"collection":463,"item":520},{"id":286,"status":8,"sort":54,"slug":521,"name":522,"icon":523},"json","JSON",{"id":524,"title":525},"99ac3b7c-dba5-4693-a4f4-1f27a6d7782d","Logos Json",{"collection":463,"item":527},{"id":365,"status":8,"sort":365,"slug":528,"name":529,"icon":530},"xliff","XLIFF",{"id":531,"title":532},"ca424cc8-e8a7-4aef-8dca-ef4a4d1334fc","Format",{"collection":463,"item":534},{"id":535,"status":8,"sort":536,"slug":537,"name":538,"icon":539},72,54,"strapi","Strapi",{"id":540,"title":541},"cde7f1d0-f2e0-4243-929e-a3f8f9146e69","Strapi Logo Purple",{"collection":463,"item":543},{"id":319,"status":8,"sort":311,"slug":544,"name":545,"icon":546},"figma","Figma",{"id":547,"title":548},"813745a4-a77d-4735-93b7-e0dd731b2304","Figma Icon",{"collection":463,"item":550},{"id":352,"status":8,"sort":248,"slug":551,"name":552,"icon":553},"microsoft-excel","Microsoft Excel",{"id":554,"title":555},"7a175955-7b96-4561-939f-a0e1924faa40","Excel",{"collection":463,"item":557},{"id":558,"status":8,"sort":327,"slug":559,"name":560,"icon":561},66,"github-actions","GitHub Actions",{"id":562,"title":563},"da17554f-ac6d-443d-9bac-1f29645ec1c6","Github Icon",{"collection":463,"item":565},{"id":566,"status":8,"sort":567,"slug":568,"name":569,"icon":570},97,999,"webflow","Webflow",{"id":571,"title":569},"ff43a386-52f8-499f-b77c-ab9a30f4a77e",{"navigation_items_group_id":573},{"id":22,"sort":216,"status":8,"name":574,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":575},"Explore more",[576],{"collection":577,"item":578},"text_link_navigation_item_type",{"id":26,"status":8,"sort":7,"text":579,"url":580,"url_text":581},"Localazy is a technology-agnostic platform supporting 50+ frameworks, file formats & popular tools.","\u002Fintegrations","See all integrations",{"id":26,"name":583,"url":7,"url_text":7,"status":8,"groups":584},"Resources",[585,618,624],{"navigation_items_group_id":586},{"id":26,"sort":286,"status":8,"name":587,"render_show_all_url":15,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":7,"represent_as_tile":15,"items":588},"Helpful Links",[589,593,597,601,605,609,614],{"collection":106,"item":590},{"id":244,"status":8,"sort":7,"url":591,"url_text":592,"show_favorite_icon":17},"\u002Fblog","Localazy Blog",{"collection":106,"item":594},{"id":394,"status":8,"sort":7,"url":595,"url_text":596,"show_favorite_icon":17},"\u002Fdocs","Documentation",{"collection":106,"item":598},{"id":26,"status":8,"sort":7,"url":599,"url_text":600,"show_favorite_icon":15},"https:\u002F\u002Fdiscuss.localazy.com\u002F","Discussion Forum",{"collection":106,"item":602},{"id":286,"status":8,"sort":7,"url":603,"url_text":604,"show_favorite_icon":15},"\u002Fcase-study","Case Studies",{"collection":106,"item":606},{"id":12,"status":8,"sort":7,"url":607,"url_text":608,"show_favorite_icon":15},"\u002Fpartnership","Become a Partner",{"collection":106,"item":610},{"id":611,"status":8,"sort":7,"url":612,"url_text":613,"show_favorite_icon":15},15,"\u002Ffaq","FAQ",{"collection":106,"item":615},{"id":253,"status":8,"sort":7,"url":616,"url_text":617,"show_favorite_icon":15},"\u002Ftags\u002Frelease-update","Release Updates",{"navigation_items_group_id":619},{"id":5,"sort":394,"status":8,"name":592,"render_show_all_url":17,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":591,"represent_as_tile":15,"items":620},[621],{"collection":20,"item":622},{"id":12,"status":8,"sort":7,"show_author_img":15,"blog_post_tag":623,"description":7},"[USE LATEST FEATURED]",{"navigation_items_group_id":625},{"id":94,"sort":244,"status":8,"name":596,"render_show_all_url":17,"show_all_url_position":16,"show_favorite_icon":15,"show_all_url":595,"represent_as_tile":15,"items":626},[627,641,653,664,676,686,697,705],{"collection":31,"item":628},{"id":22,"status":8,"sort":7,"name":629,"item":630},"General",[631],{"collection":632,"item":633},"docs_section",{"id":5,"status":8,"sort":26,"slug":634,"name":629,"icon":635,"featured_icon":638},"general",{"id":636,"title":637},"423101f1-308c-42f1-8dfe-53272019e7cb","Global",{"id":639,"title":640},"0f7ca4cb-dc3b-4f62-b476-132ed5c4931f","General Doc",{"collection":31,"item":642},{"id":13,"status":8,"sort":7,"name":643,"item":644},"CLI",[645],{"collection":632,"item":646},{"id":12,"status":8,"sort":5,"slug":411,"name":643,"icon":647,"featured_icon":650},{"id":648,"title":649},"2f7a4573-8265-4d76-8d55-ce0cc79b8983","Cli",{"id":651,"title":652},"3f76ff7b-0e74-4046-bb03-4ca99c3b66d5","Doc Cat Cli",{"collection":31,"item":654},{"id":137,"status":8,"sort":7,"name":655,"item":656},"API",[657],{"collection":632,"item":658},{"id":54,"status":8,"sort":12,"slug":659,"name":655,"icon":660,"featured_icon":661},"api",{"id":648,"title":649},{"id":662,"title":663},"20866781-e69b-4e01-9456-05437487b75c","API Doc",{"collection":31,"item":665},{"id":666,"status":8,"sort":7,"name":667,"item":668},50,"CDN",[669],{"collection":632,"item":670},{"id":113,"status":8,"sort":22,"slug":671,"name":667,"icon":672,"featured_icon":673},"cdn",{"id":636,"title":637},{"id":674,"title":675},"a8ee9cb7-4e02-41f0-b595-eb518c3085b6","Doc Cat Cdn",{"collection":31,"item":677},{"id":94,"status":8,"sort":7,"name":466,"item":678},[679],{"collection":632,"item":680},{"id":26,"status":8,"sort":13,"slug":465,"name":466,"icon":681,"featured_icon":683},{"id":682,"title":466},"fb8329ae-0c0c-4fbc-bcdc-83f2eeda1039",{"id":684,"title":685},"f7c0dec8-5b42-4943-ab3a-e3665723ad6f","Doc Cat Android",{"collection":31,"item":687},{"id":147,"status":8,"sort":7,"name":473,"item":688},[689],{"collection":632,"item":690},{"id":22,"status":8,"sort":94,"slug":472,"name":473,"icon":691,"featured_icon":694},{"id":692,"title":693},"289e136c-55df-4d51-847b-1782a2308ee4","Ios Blue",{"id":695,"title":696},"2968d3f0-14b5-4427-82e7-f1ea2de17846","Doc Cat Ios",{"collection":31,"item":698},{"id":101,"status":8,"sort":7,"name":545,"item":699},[700],{"collection":632,"item":701},{"id":365,"status":8,"sort":147,"slug":544,"name":545,"icon":702,"featured_icon":703},{"id":648,"title":649},{"id":704,"title":545},"f5e66b5b-a439-47f6-af4a-6ad261de2e87",{"collection":31,"item":706},{"id":456,"status":8,"sort":7,"name":538,"item":707},[708],{"collection":632,"item":709},{"id":142,"status":8,"sort":137,"slug":537,"name":538,"icon":710,"featured_icon":712},{"id":711,"title":538},"3b4b03c7-e131-49e6-a014-c8c2c8a2751e",{"id":713,"title":714},"1dd05c76-e517-4aea-a3d8-49cfddb40056","Strapi Doc",{"id":12,"name":716,"url":717,"url_text":716,"status":8,"groups":718},"Pricing","\u002Fpricing",[],{"id":94,"name":720,"url":721,"url_text":720,"status":8,"groups":722},"Book a demo","\u002Fbook-demo",[],{"status":8,"header_badges":724,"footer_badges":742,"footer_secured_badges":748,"slider_badges":760},[725,732,737],{"id":26,"status":8,"sort":7,"link":726,"title":727,"badgeType":728,"badgeName":729,"metadata":7,"image":730},"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Flocalazy\u002Freviews","Best meets requirements","Other","G2-winter-24-best-meets-requirments",{"id":731},"8d5dd6fd-6995-4c92-8219-a6ed5ba6acdc",{"id":5,"status":8,"sort":7,"link":726,"title":733,"badgeType":728,"badgeName":734,"metadata":7,"image":735},"Best support","G2-winter-24-best-support",{"id":736},"e59dd465-84d9-45c7-987d-dd4048fd6992",{"id":12,"status":8,"sort":7,"link":726,"title":738,"badgeType":728,"badgeName":739,"metadata":7,"image":740},"Easiest admin","G2-winter-24-easiest-admin",{"id":741},"5f12c4c8-bec0-47cf-87b4-a4502e9f1bd2",[743],{"id":286,"status":8,"sort":7,"link":726,"title":744,"badgeType":728,"badgeName":745,"metadata":7,"image":746},"Users love us","Users love us 25",{"id":747},"232416a5-86ba-4be6-85a5-b88802003d53",[749,755],{"id":216,"status":8,"sort":7,"link":750,"title":751,"badgeType":728,"badgeName":752,"metadata":7,"image":753},"https:\u002F\u002Fsprinto.com\u002Fget-iso-27001\u002F","Sprinto ISO 27001","Sprinto ISO 27001 certificate",{"id":754},"c1c6c06c-6caf-4b78-8a7e-9606c395eb61",{"id":244,"status":8,"sort":7,"link":756,"title":757,"badgeType":728,"badgeName":757,"metadata":7,"image":758},"https:\u002F\u002Fwww.aicpa.org\u002Fsoc4so","SOC certificate",{"id":759},"4f4bc0a6-09a0-41df-8295-8f990d96d941",[761,767,771,775,779,783,788],{"id":13,"status":8,"sort":7,"link":726,"title":762,"badgeType":728,"badgeName":763,"metadata":764,"image":765},"Most likely to recommend","a","",{"id":766},"da055731-3f11-4fc7-96f2-c11c0b84c831",{"id":94,"status":8,"sort":7,"link":726,"title":768,"badgeType":728,"badgeName":7,"metadata":7,"image":769},"EMEA High Performer",{"id":770},"586fb488-81f2-41db-a4e8-ef309e50c0e6",{"id":147,"status":8,"sort":7,"link":726,"title":772,"badgeType":728,"badgeName":7,"metadata":7,"image":773},"Ease of Doing Business With",{"id":774},"bfa26865-430e-463d-9886-cb56a8a8ecf6",{"id":137,"status":8,"sort":7,"link":726,"title":776,"badgeType":728,"badgeName":7,"metadata":7,"image":777},"High Performer",{"id":778},"2cc1ba0f-c23a-4c97-ad4a-a655c97466fe",{"id":101,"status":8,"sort":7,"link":726,"title":780,"badgeType":728,"badgeName":7,"metadata":7,"image":781},"Fastest Implementation",{"id":782},"6f297758-1c95-45f4-a6e9-528319897132",{"id":456,"status":8,"sort":7,"link":784,"title":785,"badgeType":728,"badgeName":7,"metadata":7,"image":786},"https:\u002F\u002Fwww.intercert.com\u002Fservices\u002Fgovernance-risk-compliance\u002Fiso-iec-27001","Intercert ISO 27001",{"id":787},"0521a5f1-e1f2-4da6-a2bc-dc92773f2a7b",{"id":216,"status":8,"sort":7,"link":750,"title":751,"badgeType":728,"badgeName":752,"metadata":7,"image":789},{"id":754},[791,931,1009,1115,1201,1280,1369,1460,1547,1646],{"id":406,"status":8,"created_on":792,"modified_on":793,"name":480,"slug":479,"description":794,"docs_link":795,"priority":7,"has_sdk":15,"sort":12,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":796,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":798,"tile_description":799,"is_enterprise":15,"is_popular":15,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":800,"upload_features":801,"icon":802,"meta_image":803,"primary_tag":805,"tags":821,"integration_methods":839,"recommended_methods":915,"default_integration_method":916,"faq_categories":923,"translations":929,"platforms_id":406},"2022-03-18T08:09:24.000Z","2025-02-26T13:36:08.000Z","Manage your React app translations with Localazy, a continuous localization tool. React i18n done right. ","\u002Fdocs\u002Fcli\u002Fjson-format","JSON format support","CLI support","react-i18next and more","Use Localazy to translate your React projects with your favorite i18n library.",{"json":521},[],{"id":482},{"id":804},"a97492ec-ee8d-429c-bf66-d0fe59b6e5c9",{"id":13,"status":8,"sort":5,"created_on":806,"label":807,"hidden":15,"icon":808,"translations":810},"2022-03-17T12:23:44.000Z","Web apps",{"id":809},"c9e70e4f-8136-432a-8d82-53c3501a9eb4",[811,813,816,819],{"id":13,"languages_code":812,"label":807},"xxa",{"id":230,"languages_code":814,"label":815},"es","Aplicaciones web",{"id":666,"languages_code":817,"label":818},"cs","Webové aplikace",{"id":436,"languages_code":820,"label":807},"en",[822,829],{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":823,"translations":824},{"id":809},[825,826,827,828],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":137,"status":8,"sort":101,"label":830,"hidden":15,"created_on":831,"icon":7,"translations":832},"Framework","2022-03-17T12:23:45.000Z",[833,834,836,837],{"id":137,"languages_code":812,"label":830},{"id":369,"languages_code":814,"label":835},"Marco",{"id":319,"languages_code":817,"label":830},{"id":838,"languages_code":820,"label":830},67,[840,852,877,898],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":843},"Translate strings directly or upload them into your Localazy project.","\u002Fdocs\u002Fapi\u002Fintroduction",[844,845,848,850],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},40,"Utilice la API para exportar traducciones e importar contenido de\u002Fa Localazy mediante programación.",{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},"Choose between translating strings directly or uploading them into Localazy.",{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},"Pomocí rozhraní API můžete programovaně exportovat překlady a importovat obsah z\u002Fdo Localazy.",{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":858},"Create source keys online","add-keys-manually","Add source keys via the web interface online and sync them into your project later.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#add-new-keys-in-ui","vpn-key-outline",[859,860,863,864,867,870,871,872],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},"Cree claves fuente en línea","Añada claves fuente a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},"Vytvářejte zdrojové klíče online","Přidejte zdrojové klíče přes webové rozhraní online a synchronizujte je do svého projektu později.",{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},"Cree claves de origen en línea","Añada claves de origen a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},88,"de","Erstellen Sie Quellschlüssel online","Fügen Sie Quellschlüssel über die Weboberfläche online hinzu und synchronisieren Sie sie später mit Ihrem Projekt.",{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":884},"Direct file upload","File upload","web-upload","Upload your texts and existing translations in any format directly to start quickly.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files","file-upload",[885,886,889,890,894],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},"Carga directa de archivos","Cargue sus textos y traducciones existentes en cualquier formato directamente para empezar rápidamente.",{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},56,"Přímé nahrávání souborů","Nahrajte přímo své texty a stávající překlady v libovolném formátu a začněte pracovat ihned.",{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},85,"Direkter Datei-Upload","Laden Sie Ihre Texte und vorhandenen Übersetzungen in einem beliebigen Format direkt hoch, um schnell loszulegen.",{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":902},"Command Line Interface","The best option for developers that want to make localization an automated part of their workflow.","\u002Fdocs\u002Fcli\u002Fthe-basics",[903,904,907,908,911],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},"Interfaz de Línea de Comandos","La mejor opción para los desarrolladores que deseen hacer de la localización una parte automatizada de su flujo de trabajo.",{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},"Rozhraní Příkazového Řádku","Nejlepší volba pro vývojáře, kteří chtějí, aby se lokalizace stala automatizovanou součástí jejich pracovních postupů.",{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},87,"Befehlszeilenschnittstelle","Die beste Option für Entwickler, die die Lokalisierung zu einem automatisierten Teil ihres Arbeitsablaufs machen möchten.",[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":917},[918,919,920,921,922],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[924],{"id":925,"status":8,"created_on":926,"sort":7,"slug":927,"label":928,"on_faq_index":7},76,"2025-02-26T12:44:29.000Z","front-end-common","Front-end Common",[930],{"languages_code":812,"name":480,"slug":479,"description":794,"support_type":796,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":798,"tile_description":799,"id":406,"platforms_id":406,"docs_link":795},{"id":175,"status":8,"created_on":792,"modified_on":932,"name":487,"slug":486,"description":933,"docs_link":795,"priority":7,"has_sdk":15,"sort":22,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":796,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":934,"tile_description":935,"is_enterprise":15,"is_popular":15,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":936,"upload_features":937,"icon":938,"meta_image":939,"primary_tag":941,"tags":948,"integration_methods":962,"recommended_methods":993,"default_integration_method":994,"faq_categories":1001,"translations":1007,"platforms_id":175},"2025-02-26T13:35:41.000Z","Online Vue.js project localization tool for your translation management. Enjoy true continuous localization with Localazy & translate your JSON files automatically.","Vue.js & JSON","Enjoy true continuous localization with Localazy & translate your Vue projects automatically.",{"json":521},[],{"id":489},{"id":940},"8171b836-d6b8-4354-8db3-34ccd384970d",{"id":13,"status":8,"sort":5,"created_on":806,"label":807,"hidden":15,"icon":942,"translations":943},{"id":809},[944,945,946,947],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},[949,956],{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":950,"translations":951},{"id":809},[952,953,954,955],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":137,"status":8,"sort":101,"label":830,"hidden":15,"created_on":831,"icon":7,"translations":957},[958,959,960,961],{"id":137,"languages_code":812,"label":830},{"id":369,"languages_code":814,"label":835},{"id":319,"languages_code":817,"label":830},{"id":838,"languages_code":820,"label":830},[963,969,979,986],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":964},[965,966,967,968],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":970},[971,972,973,974,975,976,977,978],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":980},[981,982,983,984,985],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":987},[988,989,990,991,992],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":995},[996,997,998,999,1000],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1002,1006],{"id":891,"status":8,"created_on":1003,"sort":7,"slug":1004,"label":1005,"on_faq_index":7},"2023-03-01T11:21:41.000Z","vue-localization","Vue.js Localization",{"id":925,"status":8,"created_on":926,"sort":7,"slug":927,"label":928,"on_faq_index":7},[1008],{"languages_code":812,"name":487,"slug":486,"description":933,"support_type":796,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":934,"tile_description":935,"id":175,"platforms_id":175,"docs_link":795},{"id":26,"status":8,"created_on":792,"modified_on":1010,"name":501,"slug":500,"description":1011,"docs_link":1012,"priority":7,"has_sdk":15,"sort":94,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1013,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":15,"marketing_subtitle":797,"tile_subtitle":1013,"tile_description":1014,"is_enterprise":15,"is_popular":15,"primary_use_case":1015,"hierarchy_handling":1016,"best_for":1017,"file_extension":1018,"format_code_example":1019,"format_to_extension":1020,"upload_features":1022,"icon":1023,"meta_image":1024,"primary_tag":1026,"tags":1037,"integration_methods":1073,"recommended_methods":1104,"default_integration_method":1105,"faq_categories":1112,"translations":1113,"platforms_id":26},"2025-07-03T14:21:42.000Z","Learn how to use Localazy CLI for localization of Flutter app. Flutter’s ARB format is fully supported including arrays, plurals, and selected context information. No extra configuration is necessary, but you can enable certain features if you want to.","\u002Fdocs\u002Fcli\u002Fflutter-format","ARB format support","Use the Localazy CLI for localization of Flutter projects. Flutter’s ARB format is fully supported.","Supports metadata like placeholders","JSON-like key-value","Flutter apps",".arb","```\n{\n  \"localazy_message\": \"Go international, today. With Localazy.\"\n}\n```",{"arb":1021},"arb",[],{"id":503},{"id":1025},"c2674666-4371-4aa4-9a65-438c7363fafe",{"id":94,"status":8,"sort":137,"created_on":831,"label":1027,"hidden":15,"icon":1028,"translations":1030},"Mobile apps",{"id":1029},"c9c7e1f5-8b59-4016-ae0c-6fba9469cd55",[1031,1032,1034,1036],{"id":94,"languages_code":812,"label":1027},{"id":239,"languages_code":814,"label":1033},"Aplicaciones móviles",{"id":311,"languages_code":817,"label":1035},"Mobilní aplikace",{"id":278,"languages_code":820,"label":1027},[1038,1049,1056,1063],{"id":147,"status":8,"sort":175,"label":1039,"hidden":15,"created_on":831,"icon":1040,"translations":1042},"Desktop & Games",{"id":1041},"65b04533-5b4c-430c-b8a4-ecce84754200",[1043,1044,1046,1048],{"id":147,"languages_code":812,"label":1039},{"id":248,"languages_code":814,"label":1045},"Escritorio y Juegos",{"id":891,"languages_code":817,"label":1047},"Stolní počítače & Hry",{"id":558,"languages_code":820,"label":1039},{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":1050,"translations":1051},{"id":809},[1052,1053,1054,1055],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":94,"status":8,"sort":137,"label":1027,"hidden":15,"created_on":831,"icon":1057,"translations":1058},{"id":1029},[1059,1060,1061,1062],{"id":94,"languages_code":812,"label":1027},{"id":239,"languages_code":814,"label":1033},{"id":311,"languages_code":817,"label":1035},{"id":278,"languages_code":820,"label":1027},{"id":82,"status":8,"sort":274,"label":1064,"hidden":17,"created_on":831,"icon":7,"translations":1065},"ARB",[1066,1067,1069,1071],{"id":82,"languages_code":812,"label":1064},{"id":1068,"languages_code":814,"label":1064},120,{"id":1070,"languages_code":817,"label":1064},125,{"id":1072,"languages_code":820,"label":1064},130,[1074,1080,1090,1097],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1075},[1076,1077,1078,1079],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1081},[1082,1083,1084,1085,1086,1087,1088,1089],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1091},[1092,1093,1094,1095,1096],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1098},[1099,1100,1101,1102,1103],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1106},[1107,1108,1109,1110,1111],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],[1114],{"languages_code":812,"name":501,"slug":500,"description":1011,"support_type":1013,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1013,"tile_description":1014,"id":26,"platforms_id":26,"docs_link":1012},{"id":441,"status":8,"created_on":1116,"modified_on":1117,"name":515,"slug":514,"description":1118,"docs_link":1119,"priority":7,"has_sdk":15,"sort":286,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1120,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":1120,"tile_description":1121,"is_enterprise":15,"is_popular":15,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":1122,"upload_features":1124,"icon":1125,"meta_image":1126,"primary_tag":1128,"tags":1141,"integration_methods":1156,"recommended_methods":1187,"default_integration_method":1188,"faq_categories":1195,"translations":1199,"platforms_id":441},"2022-03-18T08:09:25.000Z","2024-07-17T07:43:22.000Z","Localize your app with JavaScript localizations and Localazy CLI.\nUpload JavaScript files with strings to Localazy and manage your translations easily. Download translated files back.","\u002Fdocs\u002Fcli\u002Fjavascript-format","JS file support","Translating JS files is easy as a pie with Localazy!",{"js":1123},"js",[],{"id":517},{"id":1127},"2c6699eb-1d80-4772-8268-5597dbcead8c",{"id":456,"status":8,"sort":456,"created_on":831,"label":1129,"hidden":15,"icon":1130,"translations":1132},"Programming Languages",{"id":1131},"8c5836bb-1fbe-49c5-9330-8f931838c457",[1133,1134,1136,1139],{"id":456,"languages_code":812,"label":1129},{"id":336,"languages_code":814,"label":1135},"Lenguajes de Programación",{"id":1137,"languages_code":817,"label":1138},68,"Programovací Jazyky",{"id":1140,"languages_code":820,"label":1129},70,[1142,1149],{"id":13,"status":8,"sort":5,"label":807,"hidden":15,"created_on":806,"icon":1143,"translations":1144},{"id":809},[1145,1146,1147,1148],{"id":13,"languages_code":812,"label":807},{"id":230,"languages_code":814,"label":815},{"id":666,"languages_code":817,"label":818},{"id":436,"languages_code":820,"label":807},{"id":456,"status":8,"sort":456,"label":1129,"hidden":15,"created_on":831,"icon":1150,"translations":1151},{"id":1131},[1152,1153,1154,1155],{"id":456,"languages_code":812,"label":1129},{"id":336,"languages_code":814,"label":1135},{"id":1137,"languages_code":817,"label":1138},{"id":1140,"languages_code":820,"label":1129},[1157,1163,1173,1180],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1158},[1159,1160,1161,1162],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1164},[1165,1166,1167,1168,1169,1170,1171,1172],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1174},[1175,1176,1177,1178,1179],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1181},[1182,1183,1184,1185,1186],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1189},[1190,1191,1192,1193,1194],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1196],{"id":332,"status":8,"created_on":1197,"sort":7,"slug":1198,"label":515,"on_faq_index":15},"2022-06-10T09:49:33.000Z","javascript-i18n-localization",[1200],{"languages_code":812,"name":515,"slug":514,"description":1118,"support_type":1120,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1120,"tile_description":1121,"id":441,"platforms_id":441,"docs_link":1119},{"id":286,"status":8,"created_on":1116,"modified_on":1202,"name":522,"slug":521,"description":1203,"docs_link":795,"priority":7,"has_sdk":15,"sort":54,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1204,"show_in_spa":17,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":1205,"tile_description":1206,"is_enterprise":15,"is_popular":17,"primary_use_case":1207,"hierarchy_handling":1208,"best_for":1209,"file_extension":1210,"format_code_example":1211,"format_to_extension":1212,"upload_features":1213,"icon":1214,"meta_image":1215,"primary_tag":1217,"tags":1228,"integration_methods":1236,"recommended_methods":1267,"default_integration_method":1268,"faq_categories":1275,"translations":1278,"platforms_id":286},"2025-10-14T11:22:29.000Z","Online JSON translator you will love. Comfortable JSON language files editor with powerful CLI under your fingers for continuous localization.","Advanced format support","{Objectively the best}","Translate any JSON files with Localazy, with the best in class plural and array support.","Used for structured data storage and APIs","Uses key-value pairs","Web & mobile apps, APIs",".json","```\n{\n  \"parent\": {\n    \"child\": {\n      \"another_nested_level\": \"All is supported.\"\n    }\n  }\n}\n```",{"json":521},[],{"id":524},{"id":1216},"8d614c20-667e-4bee-a64d-7d7ce9c0ee0a",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1219,"translations":1221},"File formats",{"id":1220},"ab7c8f89-dcce-45ab-9e21-8605aef289c3",[1222,1223,1225,1227],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},"Formatos de archivo",{"id":352,"languages_code":817,"label":1226},"Formáty souborů",{"id":445,"languages_code":820,"label":1218},[1229],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1230,"translations":1231},{"id":1220},[1232,1233,1234,1235],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1237,1243,1253,1260],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1238},[1239,1240,1241,1242],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1244},[1245,1246,1247,1248,1249,1250,1251,1252],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1254},[1255,1256,1257,1258,1259],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1261},[1262,1263,1264,1265,1266],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1269},[1270,1271,1272,1273,1274],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1276],{"id":291,"status":8,"created_on":1277,"sort":7,"slug":521,"label":522,"on_faq_index":15},"2022-06-10T10:49:07.000Z",[1279],{"languages_code":812,"name":522,"slug":521,"description":1203,"support_type":1204,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1205,"tile_description":1206,"id":286,"platforms_id":286,"docs_link":795},{"id":365,"status":8,"created_on":1116,"modified_on":1281,"name":529,"slug":528,"description":1282,"docs_link":1283,"priority":7,"has_sdk":15,"sort":365,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1284,"show_in_spa":15,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":797,"tile_subtitle":1285,"tile_description":1286,"is_enterprise":15,"is_popular":17,"primary_use_case":1287,"hierarchy_handling":1288,"best_for":1289,"file_extension":1290,"format_code_example":1291,"format_to_extension":1292,"upload_features":1294,"icon":1295,"meta_image":1296,"primary_tag":1298,"tags":1305,"integration_methods":1327,"recommended_methods":1358,"default_integration_method":1359,"faq_categories":1366,"translations":1367,"platforms_id":365},"2025-07-03T14:28:31.000Z","XLIFF is meant for localization. Enjoy Localazy - an online XLIFF editor for your translation management. Integrate your XLIFF files with Localazy to achieve true continuous localization and translate XLIFF files on autopilot.","\u002Fdocs\u002Fcli\u002Fxliff-12-format","File format support","Meant for localization","XLIFF stands for XML Localization Interchange File Format - and Localazy is the best way to manage XLIFF files.","Used in translation pipelines","XML-based exchange format","Translation & software",".xliff","```\n\u003Ctrans-unit id=\"localazy_message\">\n    \u003Csource>Go international, today. With Localazy.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```",{"xliff":1293},"xlf",[],{"id":531},{"id":1297},"889970a6-cce8-4055-b96a-9c3f292aa67f",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1299,"translations":1300},{"id":1220},[1301,1302,1303,1304],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1306,1313,1320],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1307,"translations":1308},{"id":1220},[1309,1310,1311,1312],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1314,"translations":1315},{"id":1220},[1316,1317,1318,1319],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1321,"translations":1322},{"id":1220},[1323,1324,1325,1326],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1328,1334,1344,1351],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1329},[1330,1331,1332,1333],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1335},[1336,1337,1338,1339,1340,1341,1342,1343],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1345},[1346,1347,1348,1349,1350],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1352},[1353,1354,1355,1356,1357],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1360},[1361,1362,1363,1364,1365],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],[1368],{"languages_code":812,"name":529,"slug":528,"description":1282,"support_type":1284,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1285,"tile_description":1286,"id":365,"platforms_id":365,"docs_link":1283},{"id":54,"status":8,"created_on":1370,"modified_on":1370,"name":1371,"slug":1372,"description":1373,"docs_link":1374,"priority":7,"has_sdk":15,"sort":108,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1284,"show_in_spa":17,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":15,"marketing_subtitle":797,"tile_subtitle":1375,"tile_description":1376,"is_enterprise":15,"is_popular":17,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":1377,"upload_features":1378,"icon":1379,"meta_image":1381,"primary_tag":1383,"tags":1390,"integration_methods":1418,"recommended_methods":1449,"default_integration_method":1450,"faq_categories":1457,"translations":1458,"platforms_id":54},"2026-05-21T20:49:09.000Z","PO","po","Edit .po and .pot files with your team, automate translation with AI, and ship faster.","\u002Fdocs\u002Fcli\u002Fpo-format","Seamless integration","Upload, edit and translate PO files with Localazy.",{"po":1372},[],{"id":1380},"25f317fe-0c10-4f0b-92cd-f80d1f3c6a67",{"id":1382},"490022f9-d91a-4e1a-9e79-db374ec997c2",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1384,"translations":1385},{"id":1220},[1386,1387,1388,1389],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1391,1398,1408],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1392,"translations":1393},{"id":1220},[1394,1395,1396,1397],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":261,"status":8,"sort":261,"label":1399,"hidden":17,"created_on":831,"icon":7,"translations":1400},"C++",[1401,1402,1404,1406],{"id":261,"languages_code":812,"label":1399},{"id":1403,"languages_code":814,"label":1399},135,{"id":1405,"languages_code":817,"label":1399},140,{"id":1407,"languages_code":820,"label":1399},144,{"id":365,"status":8,"sort":108,"label":1409,"hidden":17,"created_on":831,"icon":7,"translations":1410},"Gettext",[1411,1412,1414,1416],{"id":365,"languages_code":812,"label":1409},{"id":1413,"languages_code":814,"label":1409},101,{"id":1415,"languages_code":817,"label":1409},106,{"id":1417,"languages_code":820,"label":1409},111,[1419,1425,1435,1442],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1420},[1421,1422,1423,1424],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1426},[1427,1428,1429,1430,1431,1432,1433,1434],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1436},[1437,1438,1439,1440,1441],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1443},[1444,1445,1446,1447,1448],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1451},[1452,1453,1454,1455,1456],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],[1459],{"languages_code":812,"name":1371,"slug":1372,"description":1373,"support_type":1284,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1375,"tile_description":1376,"id":54,"platforms_id":54,"docs_link":1374},{"id":113,"status":8,"created_on":1116,"modified_on":1461,"name":1462,"slug":1463,"description":1464,"docs_link":1465,"priority":7,"has_sdk":15,"sort":89,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1284,"show_in_spa":17,"is_file_format":17,"meta_title":7,"meta_description":7,"featured_on_web":15,"marketing_subtitle":797,"tile_subtitle":1466,"tile_description":1467,"is_enterprise":15,"is_popular":15,"primary_use_case":1468,"hierarchy_handling":1469,"best_for":1470,"file_extension":1471,"format_code_example":1472,"format_to_extension":1473,"upload_features":1474,"icon":1475,"meta_image":1476,"primary_tag":1478,"tags":1485,"integration_methods":1503,"recommended_methods":1534,"default_integration_method":1535,"faq_categories":1542,"translations":1545,"platforms_id":113},"2025-10-02T08:32:44.000Z","RESX","resx","Quickly translate and manage your RESX files with Localazy or integrate Localazy with your .NET project and enjoy a fully automated localization process. ","\u002Fdocs\u002Fcli\u002Fresx-format",".NET localization","Translate .NET projects using RESX files and Localazy.","Standard format for Windows\u002F.NET localization","Flat key-value structure",".NET applications",".resx","```\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Croot>\n  \u003Cdata name=\"localazy_message\" xml:space=\"preserve\">\n    \u003Cvalue>Go international, today. With Localazy.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\u003C\u002Froot>\n```",{"resx":1463},[],{"id":1380},{"id":1477},"1f07bf83-9363-47d6-b21b-a5121c0efaf6",{"id":22,"status":8,"sort":13,"created_on":831,"label":1218,"hidden":15,"icon":1479,"translations":1480},{"id":1220},[1481,1482,1483,1484],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},[1486,1493],{"id":22,"status":8,"sort":13,"label":1218,"hidden":15,"created_on":831,"icon":1487,"translations":1488},{"id":1220},[1489,1490,1491,1492],{"id":22,"languages_code":812,"label":1218},{"id":221,"languages_code":814,"label":1224},{"id":352,"languages_code":817,"label":1226},{"id":445,"languages_code":820,"label":1218},{"id":108,"status":8,"sort":113,"label":1494,"hidden":17,"created_on":831,"icon":7,"translations":1495},"C#",[1496,1497,1499,1501],{"id":108,"languages_code":812,"label":1494},{"id":1498,"languages_code":814,"label":1494},103,{"id":1500,"languages_code":817,"label":1494},108,{"id":1502,"languages_code":820,"label":1494},113,[1504,1510,1520,1527],{"id":22,"status":8,"sort":94,"label":655,"alternative_label":7,"slug":659,"description":841,"documentation_link":842,"loc_icon":659,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1505},[1506,1507,1508,1509],{"id":22,"languages_code":812,"label":655,"description":841,"slug":659},{"id":846,"languages_code":814,"label":655,"description":847,"slug":659},{"id":666,"languages_code":820,"label":655,"description":849,"slug":659},{"id":436,"languages_code":817,"label":655,"description":851,"slug":659},{"id":12,"status":8,"sort":13,"label":853,"alternative_label":7,"slug":854,"description":855,"documentation_link":856,"loc_icon":857,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1511},[1512,1513,1514,1515,1516,1517,1518,1519],{"id":12,"languages_code":812,"label":853,"description":855,"slug":854},{"id":154,"languages_code":814,"label":861,"description":862,"slug":7},{"id":352,"languages_code":820,"label":853,"description":855,"slug":854},{"id":319,"languages_code":817,"label":865,"description":866,"slug":7},{"id":269,"languages_code":814,"label":868,"description":869,"slug":854},{"id":278,"languages_code":820,"label":853,"description":855,"slug":854},{"id":558,"languages_code":817,"label":865,"description":866,"slug":854},{"id":873,"languages_code":874,"label":875,"description":876,"slug":7},{"id":5,"status":8,"sort":22,"label":878,"alternative_label":879,"slug":880,"description":881,"documentation_link":882,"loc_icon":883,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1521},[1522,1523,1524,1525,1526],{"id":5,"languages_code":812,"label":878,"description":881,"slug":880},{"id":77,"languages_code":814,"label":887,"description":888,"slug":7},{"id":248,"languages_code":820,"label":878,"description":881,"slug":880},{"id":891,"languages_code":817,"label":892,"description":893,"slug":7},{"id":895,"languages_code":874,"label":896,"description":897,"slug":7},{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1528},[1529,1530,1531,1532,1533],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[],{"id":26,"status":8,"sort":12,"label":899,"alternative_label":643,"slug":411,"description":900,"documentation_link":901,"loc_icon":411,"is_official_plugin":15,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1536},[1537,1538,1539,1540,1541],{"id":26,"languages_code":812,"label":899,"description":900,"slug":411},{"id":66,"languages_code":814,"label":905,"description":906,"slug":411},{"id":239,"languages_code":820,"label":899,"description":900,"slug":411},{"id":311,"languages_code":817,"label":909,"description":910,"slug":411},{"id":912,"languages_code":874,"label":913,"description":914,"slug":7},[1543],{"id":221,"status":8,"created_on":1544,"sort":7,"slug":1463,"label":1462,"on_faq_index":7},"2022-08-01T16:44:06.000Z",[1546],{"languages_code":812,"name":1462,"slug":1463,"description":1464,"support_type":1284,"meta_title":7,"meta_description":7,"marketing_subtitle":797,"tile_subtitle":1466,"tile_description":1467,"id":113,"platforms_id":113,"docs_link":1465},{"id":535,"status":8,"created_on":1548,"modified_on":1549,"name":538,"slug":537,"description":1550,"docs_link":1551,"priority":7,"has_sdk":7,"sort":536,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1552,"show_in_spa":17,"is_file_format":7,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":1552,"tile_subtitle":1552,"tile_description":1553,"is_enterprise":15,"is_popular":17,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":7,"upload_features":7,"icon":1554,"meta_image":1555,"primary_tag":1557,"tags":1569,"integration_methods":1613,"recommended_methods":1633,"default_integration_method":1634,"faq_categories":1641,"translations":1644,"platforms_id":535},"2022-06-16T09:08:11.000Z","2026-04-27T18:16:54.000Z","Enjoy seamless integration of Strapi & Localazy and translate your website efficiently. Download the official Localazy plugin in the Strapi Marketplace to get started!","\u002Fdocs\u002Fstrapi\u002Fstrapi-plugin-introduction","Localization Plugin","Localize your Strapi website with our official localization plugin. Easy setup and installation.",{"id":540},{"id":1556},"5995b721-a2ea-487e-ad4b-298a489bbd24",{"id":286,"status":8,"sort":216,"created_on":831,"label":1558,"hidden":15,"icon":1559,"translations":1561},"CMS",{"id":1560},"1172a655-928c-4594-9263-d8afdfd9cd79",[1562,1563,1565,1567],{"id":286,"languages_code":812,"label":1558},{"id":1564,"languages_code":814,"label":1558},73,{"id":1566,"languages_code":817,"label":1558},81,{"id":1568,"languages_code":820,"label":1558},84,[1570,1582,1594,1601],{"id":59,"status":8,"sort":253,"label":1571,"hidden":15,"created_on":831,"icon":7,"translations":1572},"Multilingual SEO",[1573,1574,1577,1580],{"id":59,"languages_code":812,"label":1571},{"id":1575,"languages_code":814,"label":1576},89,"SEO multilingüe",{"id":1578,"languages_code":817,"label":1579},94,"Vícejazyčné SEO",{"id":1581,"languages_code":820,"label":1571},99,{"id":406,"status":8,"sort":406,"label":165,"hidden":15,"created_on":831,"icon":1583,"translations":1585},{"id":1584},"e782ed3f-d954-45ca-8b17-5bf5fe95f30a",[1586,1587,1590,1592],{"id":406,"languages_code":812,"label":165},{"id":1588,"languages_code":814,"label":1589},132,"Comercio electrónico",{"id":1591,"languages_code":817,"label":165},137,{"id":1593,"languages_code":820,"label":165},142,{"id":286,"status":8,"sort":216,"label":1558,"hidden":15,"created_on":831,"icon":1595,"translations":1596},{"id":1560},[1597,1598,1599,1600],{"id":286,"languages_code":812,"label":1558},{"id":1564,"languages_code":814,"label":1558},{"id":1566,"languages_code":817,"label":1558},{"id":1568,"languages_code":820,"label":1558},{"id":5,"status":8,"sort":94,"label":1602,"hidden":15,"created_on":831,"icon":1603,"translations":1605},"Marketing tools",{"id":1604},"098fe6a4-dd2e-42d8-937e-2d8121e6e266",[1606,1607,1610,1612],{"id":5,"languages_code":812,"label":1602},{"id":1608,"languages_code":814,"label":1609},43,"Herramientas de marketing",{"id":299,"languages_code":817,"label":1611},"Marketingové nástroje",{"id":378,"languages_code":820,"label":1602},[1614],{"id":137,"status":8,"sort":7,"label":1615,"alternative_label":1616,"slug":1617,"description":1618,"documentation_link":1619,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1621},"Official Strapi Plugin","Official Plugin","official-strapi-plugin","Our developers maintain an official Strapi localization plugin. Start in a few clicks!","\u002Fdocs\u002Fstrapi","localazy-box",[1622,1623,1626,1627,1630],{"id":137,"languages_code":812,"label":1615,"description":1618,"slug":1617},{"id":1608,"languages_code":814,"label":1624,"description":1625,"slug":7},"Complemento Oficial de Strapi","Nuestros desarrolladores mantienen un complemento oficial de localización de Strapi. ¡Empiece en unos pocos clics!",{"id":369,"languages_code":820,"label":1615,"description":1618,"slug":1617},{"id":445,"languages_code":817,"label":1628,"description":1629,"slug":7},"Oficiál Plugin Strapi","Naši vývojáři udržují a neustále vylepšují oficiální lokalizační plugin Strapi. Začněte několika kliknutími!",{"id":1575,"languages_code":874,"label":1631,"description":1632,"slug":7},"Offizielles Strapi-Plugin","Unsere Entwickler pflegen ein offizielles Strapi-Lokalisierungs-Plugin. Starten Sie mit ein paar Klicks!",[],{"id":137,"status":8,"sort":7,"label":1615,"alternative_label":1616,"slug":1617,"description":1618,"documentation_link":1619,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1635},[1636,1637,1638,1639,1640],{"id":137,"languages_code":812,"label":1615,"description":1618,"slug":1617},{"id":1608,"languages_code":814,"label":1624,"description":1625,"slug":7},{"id":369,"languages_code":820,"label":1615,"description":1618,"slug":1617},{"id":445,"languages_code":817,"label":1628,"description":1629,"slug":7},{"id":1575,"languages_code":874,"label":1631,"description":1632,"slug":7},[1642],{"id":66,"status":8,"created_on":1643,"sort":7,"slug":537,"label":538,"on_faq_index":7},"2022-06-16T09:24:13.000Z",[1645],{"languages_code":812,"name":538,"slug":537,"description":1550,"support_type":1552,"meta_title":7,"meta_description":7,"marketing_subtitle":1552,"tile_subtitle":1552,"tile_description":1553,"id":535,"platforms_id":535,"docs_link":1551},{"id":319,"status":8,"created_on":1116,"modified_on":1647,"name":545,"slug":544,"description":7,"docs_link":1648,"priority":7,"has_sdk":15,"sort":311,"highlighted":15,"in_menu":17,"changefreq":7,"support_type":1649,"show_in_spa":17,"is_file_format":15,"meta_title":7,"meta_description":7,"featured_on_web":17,"marketing_subtitle":1650,"tile_subtitle":1651,"tile_description":1652,"is_enterprise":15,"is_popular":17,"primary_use_case":7,"hierarchy_handling":7,"best_for":7,"file_extension":7,"format_code_example":7,"format_to_extension":7,"upload_features":1653,"icon":1654,"meta_image":1655,"primary_tag":1657,"tags":1670,"integration_methods":1678,"recommended_methods":1691,"default_integration_method":1692,"faq_categories":1698,"translations":1699,"platforms_id":319},"2024-12-20T15:00:22.000Z","\u002Fdocs\u002Fintegrations\u002Fquick-start-figma","plugin","Figma plugin","Localization plugin","Quickly translate your Figma designs and seamlessly reuse the translations during the development of your project.",[],{"id":547},{"id":1656},"7573fed6-8817-4cb4-84d2-be327e6c4891",{"id":12,"status":8,"sort":147,"created_on":831,"label":1658,"hidden":15,"icon":1659,"translations":1661},"Design tools",{"id":1660},"1053d863-b690-4fbd-aadf-dbf2ba282768",[1662,1663,1666,1669],{"id":12,"languages_code":812,"label":1658},{"id":1664,"languages_code":814,"label":1665},42,"Herramientas de diseño",{"id":1667,"languages_code":817,"label":1668},49,"Nástroje pro návrh",{"id":428,"languages_code":820,"label":1658},[1671],{"id":12,"status":8,"sort":147,"label":1658,"hidden":15,"created_on":831,"icon":1672,"translations":1673},{"id":1660},[1674,1675,1676,1677],{"id":12,"languages_code":812,"label":1658},{"id":1664,"languages_code":814,"label":1665},{"id":1667,"languages_code":817,"label":1668},{"id":428,"languages_code":820,"label":1658},[1679],{"id":147,"status":8,"sort":7,"label":1616,"alternative_label":1616,"slug":1680,"description":1681,"documentation_link":595,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1682},"official-plugin","Our developers maintain an official plugin for this integration. Start in a few clicks!",[1683,1684,1687,1688],{"id":147,"languages_code":812,"label":1616,"description":1681,"slug":1680},{"id":142,"languages_code":814,"label":1685,"description":1686,"slug":7},"Plugin Oficial","Nuestros desarrolladores mantienen un plugin oficial para esta integración. ¡Empiece con unos pocos clics!",{"id":132,"languages_code":820,"label":1616,"description":1681,"slug":1680},{"id":332,"languages_code":817,"label":1689,"description":1690,"slug":7},"Oficiální Plugin","Naši vývojáři udržují a neustále vylepšují oficiální plugin pro tuto integraci. Začněte několika kliknutími!",[],{"id":147,"status":8,"sort":7,"label":1616,"alternative_label":1616,"slug":1680,"description":1681,"documentation_link":595,"loc_icon":1620,"is_official_plugin":17,"is_universal_plugin":15,"universal_plugin_vendor":7,"translations":1693},[1694,1695,1696,1697],{"id":147,"languages_code":812,"label":1616,"description":1681,"slug":1680},{"id":142,"languages_code":814,"label":1685,"description":1686,"slug":7},{"id":132,"languages_code":820,"label":1616,"description":1681,"slug":1680},{"id":332,"languages_code":817,"label":1689,"description":1690,"slug":7},[],[1700],{"languages_code":812,"name":545,"slug":544,"description":7,"support_type":1649,"meta_title":7,"meta_description":7,"marketing_subtitle":1650,"tile_subtitle":1651,"tile_description":1652,"id":319,"platforms_id":319,"docs_link":1648},{"id":26,"status":8,"security_section_title":1702,"loved_section_title":1703,"columns":1704,"social_links":1774,"policy_links":1804},"Secured & trusted","Loved by users",[1705,1717,1732,1753,1756],{"id":26,"status":8,"sort":7,"title":1706,"column_key":1707,"links":1708},"Localazy","connect",[1709,1711,1714],{"id":216,"status":8,"sort":26,"title":720,"url":1710},"___LOCALAZY_MEETING_URL___",{"id":286,"status":8,"sort":5,"title":1712,"url":1713},"Contact","\u002Fcontact",{"id":365,"status":8,"sort":12,"title":1715,"url":1716},"About us","\u002Fabout-us",{"id":5,"status":8,"sort":7,"title":1718,"column_key":1719,"links":1720},"Programs","programs",[1721,1723,1726,1729],{"id":26,"status":8,"sort":22,"title":1722,"url":607},"Partner Program",{"id":5,"status":8,"sort":13,"title":1724,"url":1725},"Ambassador Program","\u002Fambassador",{"id":12,"status":8,"sort":94,"title":1727,"url":1728},"Startup Program","\u002Ffor\u002Fstartups",{"id":22,"status":8,"sort":147,"title":1730,"url":1731},"Nonprofits","\u002Ffor\u002Fnonprofit",{"id":12,"status":8,"sort":7,"title":1733,"column_key":1734,"links":1735},"Use Cases","use_cases",[1736,1739,1742,1744,1747,1750],{"id":13,"status":8,"sort":137,"title":1737,"url":1738},"Software Localization","\u002Fterm\u002Fsoftware-localization",{"id":94,"status":8,"sort":101,"title":1740,"url":1741},"Machine Translation Services","\u002Ffeatures\u002Fmachine-translation",{"id":147,"status":8,"sort":456,"title":399,"url":1743},"\u002Ffeatures\u002Ftranslation-api",{"id":137,"status":8,"sort":216,"title":1745,"url":1746},"Crowdsourced Translations","\u002Ffeatures\u002Fshare-tm",{"id":101,"status":8,"sort":286,"title":1748,"url":1749},"Figma i18n & localization","\u002Ffeatures\u002Ffigma-localization-plugin",{"id":456,"status":8,"sort":244,"title":1751,"url":1752},"Translation as a Service","\u002Fterm\u002Ftranslation-service",{"id":22,"status":8,"sort":7,"title":452,"column_key":1754,"links":1755},"integrations",[],{"id":13,"status":8,"sort":7,"title":583,"column_key":1757,"links":1758},"resources",[1759,1760,1763,1764,1767,1769,1770,1771],{"id":244,"status":8,"sort":394,"title":596,"url":595},{"id":394,"status":8,"sort":611,"title":1761,"url":1762},"Dictionary","\u002Fdictionary",{"id":611,"status":8,"sort":493,"title":604,"url":603},{"id":493,"status":8,"sort":253,"title":1765,"url":1766},"Discussion forum","___DISCUSS_URL___",{"id":253,"status":8,"sort":59,"title":1768,"url":591},"Localization Blog",{"id":59,"status":8,"sort":175,"title":613,"url":612},{"id":175,"status":8,"sort":54,"title":716,"url":717},{"id":54,"status":8,"sort":365,"title":1772,"url":1773},"Brand assets","https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1tZqsZHBlGelz7A2FwTsiwrs4j3sd9HTk",[1775,1780,1785,1790,1795,1800],{"id":26,"status":8,"sort":7,"platform":1776,"icon":1777,"url":1778,"label":1779},"feed","rss","\u002Ffeed.xml","Localazy RSS Feed",{"id":5,"status":8,"sort":7,"platform":1781,"icon":1782,"url":1783,"label":1784},"facebook","fb-logo","https:\u002F\u002Fwww.facebook.com\u002Flocalazy\u002F","Localazy facebook",{"id":12,"status":8,"sort":7,"platform":1786,"icon":1787,"url":1788,"label":1789},"github","github-logo","https:\u002F\u002Fgithub.com\u002Flocalazy","Localazy GitHub",{"id":22,"status":8,"sort":7,"platform":1791,"icon":1792,"url":1793,"label":1794},"x","x-twitter","https:\u002F\u002Fx.com\u002Flocalazy","Localazy X",{"id":13,"status":8,"sort":7,"platform":1796,"icon":1797,"url":1798,"label":1799},"linkedin","linkedin-logo","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002F37836599\u002F","Localazy LinkedIn",{"id":94,"status":8,"sort":7,"platform":1801,"icon":1802,"url":1766,"label":1803},"discourse","discourse-logo","Localazy Discourse",[1805,1808,1811],{"id":26,"status":8,"sort":7,"title":1806,"url":1807,"action":7},"Privacy policy","\u002Fprivacy-policy",{"id":5,"status":8,"sort":7,"title":1809,"url":1810,"action":7},"Terms & Conditions","\u002Fterms-and-conditions",{"id":12,"status":8,"sort":7,"title":1812,"url":7,"action":1813},"Cookies","cookie-consent",{"id":1815,"owner":1816,"created_by":7,"sort":7,"title":1821,"slug":1822,"modified_on":764,"created_on":1823,"pinned":15,"badge":7,"priority":1824,"main_image":1825,"status":8,"tags":1826,"dictionary":1837,"reading_time":1838,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"69ea1abb7ab1270001ede902",{"id":1817,"first_name":1818,"last_name":764,"slug":1819,"avatar":1820},"606c233dcf7b6a0001d1da93","Petr Hodný","petr-hodny","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fpetr.png","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":269,"created_on":1828,"status":8,"label":1829,"slug":1830,"on_index_page":17},"2026-05-28 17:55:50","AI","ai",{"id":1832,"created_on":1828,"status":8,"label":1833,"slug":1834,"on_index_page":15},646,"Business Development","business-development",{"id":319,"created_on":1828,"status":8,"label":217,"slug":1836,"on_index_page":17},"localization",[],0,{"id":1840,"owner":1841,"created_by":7,"sort":7,"title":1842,"slug":1843,"modified_on":764,"created_on":1844,"pinned":15,"badge":7,"priority":1824,"main_image":1845,"status":8,"tags":1846,"dictionary":1850,"reading_time":1838,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"69d78a237ab1270001eddabf",{"id":1817,"first_name":1818,"last_name":764,"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":319,"created_on":1828,"status":8,"label":655,"slug":659,"on_index_page":15},{"id":269,"created_on":1828,"status":8,"label":1829,"slug":1830,"on_index_page":17},{"id":319,"created_on":1828,"status":8,"label":217,"slug":1836,"on_index_page":17},[],{"content":1852,"sections":1962,"docsInSection":2083,"defaultSearchItems":3141,"relatedBlogArticles":3142},{"doc":1853,"originalContent":1900,"originalExcerpt":1860,"placeholders":1901},{"id":1415,"status":8,"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":15,"main_image":7,"section":1862,"subsection":1870,"cta":1873,"faq":1881,"dictionary":1893,"blog_articles":1895,"translations":1897,"documentation_id":1415},"32110","2bac48a8-b362-482f-b574-3bc71dca4c5b","2022-03-18T07:51:25.000Z","2024-07-16T15:15:05.000Z","toml-format","File Format - TOML","Learn how to use Localazy CLI for app and software localization with translations in TOML files. ","You can use Localazy to work directly with TOML files. Our TOML parser is a flexible and configurable solution and you can fine-tune it for your specific needs. \n\n## Plain TOMLs\n\nSimple plain TOML files are supported out-of-the-box and no extra configuration is necessary.  \n\n```toml\nkey1 = \"Key 1\"\nkey2 = \"Key 2\"\n```\n\n## Structured TOMLs\n\nStructured TOMLs are supported by default and no configuration is necessary. \n\n```toml\n[parent]\n\n  [parent.child]\n  structured_key = \"All is supported.\"\n```\n\n## Multilingual TOML\n\nMultilingual TOMLs allow defining more languages inside a single file. Localazy supports multilingual TOMLs with all the features describe in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```toml\n[en] \nkey = \"in English\"\n\n[cs]\nkey = \"in Czech\"\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name**  (English, German, Czech, …)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n \n## Object-based TOMLs\n\nBy including `content_as_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable parsing of more complex TOML files where the content is based on sub-structures.  \n\n```toml\n[key]\nmessage = \"String content\"\ndescription = \"Optional additional comment for translators.\"\n```\n\nInstead of `message`, you can use `string`, `value`, `text`, `content` or `translation`. Localazy remembers the field name and generates exactly the same document - just translated - for each of languages.  \n\nFor the context information, instead of `description`, any of `context`, `comment` and `developer_comment` can be used. \n\n::: info\nAll other features described in this document are still available including structured TOML, arrays and plurals parsing, etc. \n:::\n   \n## Contextual metadata\n\nWe have adopted metadata format from ARB files to our TOML support allowing to define additional metadata for the string using `@key` notation.\n\nWith `arb_metadata` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable ARB-style metadata. With the feature enabled, Localazy extracts content from `description`, `context` and `placeholders` and presents it to the translators to provide better context and improve translation quality.\n\nFor plurals and arrays, metadata can be defined using the base form without the suffix. \n\n```toml\nsingleString = \"This is just a normal string.\"\n\ndatePickerMinuteOne = \"1 minute\"\ndatePickerMinuteOther = \"%minute minutes\"\n\n[\"@singleString\"] \ncontext = \"views:Home page\"\ndescription = \"Comment for the single string.\"\n\n[\"@datePickerMinute\"]\ndescription = \"Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'\"\nplural = \"minute\"\n  [\"@datePickerMinute\".placeholders]\n    [\"@datePickerMinute\".placeholders.minute]\n    description = \"the number of minutes\"\n    example = \"15\"\n```\n\nPlease note that quoting may be necessary and that you can only place metadata after your string definitions. \n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```toml\n my_key = \"This is a text of my key.\"\n \"@@localazy:comment:my_key\" = \"This is a comment for translators.\"\n \"@@localazy:limit:my_key\" = \"100\"\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThere are two ways how to define arrays.  \n\n### TOML Arrays\n\nStandard TOML arrays are recognized as arrays and stored with Localazy in a corresponding way.\n\nThis feature can be enabled by adding `array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```toml\n[game]\ndifficulty = [\"easy\", \"medium\", \"hard\"]\n```\n\n### Arrays defined by suffix\n\nLocalazy parses automatically also the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```toml\n\"difficulty[0]\" = \"easy\"\n\"difficulty[4]\" = \"normal\"\n\"difficulty[7]\" = \"hard\"\n\"difficulty[9]\" = \"extreme\"\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```toml\n# English has only two plural forms:\npluralOne = \"You have 1 item.\"\npluralOther = \"You have %d items.\"\n\n# Czech has three plural forms:\npluralOne = \"Máte 1 položku.\"\npluralFew = \"Máte %d položky.\"\npluralOther = \"Máte %d položek.\"\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section: \n\n* `plural_postfix_sd` for single dot variant.\n* `plural_postfix_us` for underscore variant.\n* `plural_postfix_cc` for camelCase variant.\n* `plural_postfix_br` for [brackets] variant.\n\n**Examples:**\n \n```toml\n[single_dot]\n\"users.one\" = \"There is one user.\"\n\"users.other\" = \"There are $number users.\"\n\n[underscore]\n\"users_one\" = \"There is one user.\"\n\"users_other\" = \"There are $number users.\"\n\n[camelCase]\n\"usersOne\" = \"There is one user.\"\n\"usersOther\" = \"There are $number users.\"\n\n[brackets]\n\"users[one]\" = \"There is one user.\"\n\"users[other]\" = \"There are $number users.\"\n```\n\n### Defined as object\n\nEnabled by `plural_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```toml\n[users]\none = \"There is one user.\"\nother = \"There are $number users.\"\n```\n\nThe object is considered plural if and only if all items are key-value strings with keys being valid plural types (zero, one, two, few, many, other).\n\nIf the condition above is not met, the object is not considered plural and is parsed as a structured TOML.\n\n\n### Defined using i18Next plural\n\nEnabled by `plural_i18next` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```toml\nkey = \"item\"\nkey_plural = \"items\"\n```\n\nAll plural forms:\n\n```toml\nkey_0 = \"zero\"\nkey_1 = \"singular\"\nkey_2 = \"two\"\nkey_3 = \"few\"\nkey_4 = \"many\"\nkey_5 = \"other\"\n```\n\n### Defined using ICU\n\nEnabled by `plural_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```toml\nusers = \"There are {COUNT, plural, one {one user} other {# users}}.\"\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n### Defined using pipeline\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n```toml\n{\n  key_plural: \"one | other\"\n}\n```\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Using key as the source translation\n\nThere is a special format where the key is also the source language translation. It's possible to enable the support for this format by adding `source_is_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```toml\n\"Text in the source language\" = \"Translation in the defined\"\n```\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Features overview\n\nThe table below is a summary of all available features for TOML parser.\n\n| Feature | Description |\n| --- | --- |\n| `content_as_object` | Enable object-based TOML. |\n| `multilingual` | Enable support of multilingual TOML files. |\n| `lang_format=xxx` | Define how to output locales for multilingual files. |\n| `array` | Parse TOML arrays as arrays and not as list of single strings. |\n| `array_br` | Parse strings with keys suffixed by `[x]` as arrays. |\n| `plural_postfix_us` | Parse strings with keys suffixed by `_type` as plural. |\n| `plural_postfix_cc` | Parse strings with keys suffixed by `Type` as plural. |\n| `plural_postfix_br` | Parse strings with keys suffixed by `[type]` as plural. |\n| `plural_postfix_sd` | Parse strings with keys suffixed by `.type` as plural. |\n| `plural_object` | Enable plurals defined as objects. |\n| `plural_i18next` | Enable i18Next plurals. |\n| `plural_icu` | Enable support for ICU plurals. |\n| `plural_pipeline` | Enable plurals defined using pipeline. |\n| `arb_metadata` | Enable support for ARB-style metadata. |\n| `skip_empty` | Consider empty translations as untranslated. |\n| `filter_untranslated` | Don't use the source language texts for missing translations. |\n| `source_is_key` | Use the key as the source translation. |\n| `add_bom` | Include byte order mark in the output file. |\n\n  \n",["Reactive",1863],{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":1868,"featured_icon":1869},"2022-03-17T12:23:29.000Z","CLI Guides & Information","Localazy CLI Documentation","Guide to SW localization using Localazy, tool made by and for developers. Comprehensive documentation available here.",{"id":648},{"id":651},["Reactive",1871],{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},"2022-03-18T07:38:52.000Z",["Reactive",1874],{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},"2022-03-17T12:23:03.000Z","2020-05-19T09:23:31.000Z","member","NONE","Use this if no CTA should be shown.","none",["Reactive",1882],[1883],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":1889},"How can I convert different localization file formats?","In the File Management section of Localazy, when downloading your files, you can select the desired format and download your strings in any of the available file formats.\n\nFormat Conversions feature is also an integral part of the [Localazy CLI tool](\u002Fdocs\u002Fcli\u002Fthe-basics), so if you want to automate format conversions, you will need to install Localazy CLI on your preferred platform.\n\n> Read the article: [How to convert localization files into different formats?](\u002Fblog\u002Fconvert-localization-files-different-formats-localazy)\n\n*Note: Format Conversions are available only as a part of the [Professional plan](\u002Ftiers\u002Fprofessional)*","how-to-use-format-conversions-feature","2022-03-17T12:23:00.000Z","2023-05-26T19:28:13.000Z",{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},"2022-03-17T12:22:58.000Z","file-formats","File Formats",["Reactive",1894],[],["Reactive",1896],[],["Reactive",1898],[1899],{"id":1415,"documentation_id":1415,"languages_code":812,"slug":1858,"title":1859,"content":1900,"meta_title":1859,"meta_description":1860,"excerpt":1860},"You can use Localazy to work directly with TOML files. Our TOML parser is a flexible and configurable solution and you can fine-tune it for your specific needs. \n\n## Plain TOMLs\n\nSimple plain TOML files are supported out-of-the-box and no extra configuration is necessary.  \n\n```toml\nkey1 = \"Key 1\"\nkey2 = \"Key 2\"\n```\n\n## Structured TOMLs\n\nStructured TOMLs are supported by default and no configuration is necessary. \n\n```toml\n[parent]\n\n  [parent.child]\n  structured_key = \"All is supported.\"\n```\n\n## Multilingual TOML\n\nMultilingual TOMLs allow defining more languages inside a single file. Localazy supports multilingual TOMLs with all the features describe in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```toml\n[en] \nkey = \"in English\"\n\n[cs]\nkey = \"in Czech\"\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name**  (English, German, Czech, …)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n \n## Object-based TOMLs\n\nBy including `content_as_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable parsing of more complex TOML files where the content is based on sub-structures.  \n\n```toml\n[key]\nmessage = \"String content\"\ndescription = \"Optional additional comment for translators.\"\n```\n\nInstead of `message`, you can use `string`, `value`, `text`, `content` or `translation`. Localazy remembers the field name and generates exactly the same document - just translated - for each of languages.  \n\nFor the context information, instead of `description`, any of `context`, `comment` and `developer_comment` can be used. \n\n::: info\nAll other features described in this document are still available including structured TOML, arrays and plurals parsing, etc. \n:::\n   \n## Contextual metadata\n\nWe have adopted metadata format from ARB files to our TOML support allowing to define additional metadata for the string using `@key` notation.\n\nWith `arb_metadata` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable ARB-style metadata. With the feature enabled, Localazy extracts content from `description`, `context` and `placeholders` and presents it to the translators to provide better context and improve translation quality.\n\nFor plurals and arrays, metadata can be defined using the base form without the suffix. \n\n```toml\nsingleString = \"This is just a normal string.\"\n\ndatePickerMinuteOne = \"1 minute\"\ndatePickerMinuteOther = \"%minute minutes\"\n\n[\"@singleString\"] \ncontext = \"views:Home page\"\ndescription = \"Comment for the single string.\"\n\n[\"@datePickerMinute\"]\ndescription = \"Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'\"\nplural = \"minute\"\n  [\"@datePickerMinute\".placeholders]\n    [\"@datePickerMinute\".placeholders.minute]\n    description = \"the number of minutes\"\n    example = \"15\"\n```\n\nPlease note that quoting may be necessary and that you can only place metadata after your string definitions. \n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```toml\n my_key = \"This is a text of my key.\"\n \"@@localazy:comment:my_key\" = \"This is a comment for translators.\"\n \"@@localazy:limit:my_key\" = \"100\"\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThere are two ways how to define arrays.  \n\n### TOML Arrays\n\nStandard TOML arrays are recognized as arrays and stored with Localazy in a corresponding way.\n\nThis feature can be enabled by adding `array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```toml\n[game]\ndifficulty = [\"easy\", \"medium\", \"hard\"]\n```\n\n### Arrays defined by suffix\n\nLocalazy parses automatically also the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```toml\n\"difficulty[0]\" = \"easy\"\n\"difficulty[4]\" = \"normal\"\n\"difficulty[7]\" = \"hard\"\n\"difficulty[9]\" = \"extreme\"\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```toml\n# English has only two plural forms:\npluralOne = \"You have 1 item.\"\npluralOther = \"You have %d items.\"\n\n# Czech has three plural forms:\npluralOne = \"Máte 1 položku.\"\npluralFew = \"Máte %d položky.\"\npluralOther = \"Máte %d položek.\"\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section: \n\n* `plural_postfix_sd` for single dot variant.\n* `plural_postfix_us` for underscore variant.\n* `plural_postfix_cc` for camelCase variant.\n* `plural_postfix_br` for [brackets] variant.\n\n**Examples:**\n \n```toml\n[single_dot]\n\"users.one\" = \"There is one user.\"\n\"users.other\" = \"There are $number users.\"\n\n[underscore]\n\"users_one\" = \"There is one user.\"\n\"users_other\" = \"There are $number users.\"\n\n[camelCase]\n\"usersOne\" = \"There is one user.\"\n\"usersOther\" = \"There are $number users.\"\n\n[brackets]\n\"users[one]\" = \"There is one user.\"\n\"users[other]\" = \"There are $number users.\"\n```\n\n### Defined as object\n\nEnabled by `plural_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```toml\n[users]\none = \"There is one user.\"\nother = \"There are $number users.\"\n```\n\nThe object is considered plural if and only if all items are key-value strings with keys being valid plural types (zero, one, two, few, many, other).\n\nIf the condition above is not met, the object is not considered plural and is parsed as a structured TOML.\n\n\n### Defined using i18Next plural\n\nEnabled by `plural_i18next` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```toml\nkey = \"item\"\nkey_plural = \"items\"\n```\n\nAll plural forms:\n\n```toml\nkey_0 = \"zero\"\nkey_1 = \"singular\"\nkey_2 = \"two\"\nkey_3 = \"few\"\nkey_4 = \"many\"\nkey_5 = \"other\"\n```\n\n### Defined using ICU\n\nEnabled by `plural_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```toml\nusers = \"There are {COUNT, plural, one {one user} other {# users}}.\"\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n### Defined using pipeline\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n```toml\n{\n  key_plural: \"one | other\"\n}\n```\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Using key as the source translation\n\nThere is a special format where the key is also the source language translation. It's possible to enable the support for this format by adding `source_is_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```toml\n\"Text in the source language\" = \"Translation in the defined\"\n```\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Features overview\n\nThe table below is a summary of all available features for TOML parser.\n\n| Feature | Description |\n| --- | --- |\n| `content_as_object` | Enable object-based TOML. |\n| `multilingual` | Enable support of multilingual TOML files. |\n| `lang_format=xxx` | Define how to output locales for multilingual files. |\n| `array` | Parse TOML arrays as arrays and not as list of single strings. |\n| `array_br` | Parse strings with keys suffixed by `[x]` as arrays. |\n| `plural_postfix_us` | Parse strings with keys suffixed by `_type` as plural. |\n| `plural_postfix_cc` | Parse strings with keys suffixed by `Type` as plural. |\n| `plural_postfix_br` | Parse strings with keys suffixed by `[type]` as plural. |\n| `plural_postfix_sd` | Parse strings with keys suffixed by `.type` as plural. |\n| `plural_object` | Enable plurals defined as objects. |\n| `plural_i18next` | Enable i18Next plurals. |\n| `plural_icu` | Enable support for ICU plurals. |\n| `plural_pipeline` | Enable plurals defined using pipeline. |\n| `arb_metadata` | Enable support for ARB-style metadata. |\n| `skip_empty` | Consider empty translations as untranslated. |\n| `filter_untranslated` | Don't use the source language texts for missing translations. |\n| `source_is_key` | Use the key as the source translation. |\n| `add_bom` | Include byte order mark in the output file. |\n\n___CLI_LINKS___\n",[1902,1905,1908,1911,1914,1917,1920,1923,1926,1929,1932,1935,1938,1941,1945,1948,1951,1955,1959],{"key":1903,"value":1904,"note":7},"___GRADLE_DEPENDENCY___","com.localazy:gradle:1.5.4",{"key":1906,"value":1907,"note":7},"___LIBRARY_VERSION___","1.2.1",{"key":1909,"value":1910,"note":7},"___REPOSITORY_URL___","https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Frelease\u002F",{"key":1912,"value":1913,"note":7},"___URL_DOCS___","https:\u002F\u002Flocalazy.com\u002Fdocs",{"key":1915,"value":1916,"note":7},"___URL_DOCS_ANDROID_LIBRARY___","https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-android-library",{"key":1918,"value":1919,"note":7},"___URL_DOCS_ANDROID_GRADLE___","https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin",{"key":1921,"value":1922,"note":7},"___URL_DOCS_WHAT_SHOULD_YOU_KNOW___","https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fandroid\u002Fwhat-you-should-know-before-uploading-your-android-strings",{"key":1924,"value":1925,"note":7},"___CLI_VERSION___","v2.0.11",{"key":1927,"value":1928,"note":7},"___USER_WRITE_KEY___","your-write-key",{"key":1930,"value":1931,"note":7},"___USER_READ_KEY___","your-read-key",{"key":1933,"value":1934,"note":7},"___CLI_LINKS___","  ",{"key":1936,"value":1937,"note":7},"___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":1939,"value":1940,"note":7},"___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":1942,"value":1943,"note":1944},"___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":1946,"value":1947,"note":7},"___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":1949,"value":1950,"note":7},"___GRADLE_DEPENDENCY_V2___","com.localazy:gradle:2.0.3",{"key":1952,"value":1953,"note":1954},"___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":1956,"value":1957,"note":1958},"___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":1960,"value":1961,"note":7},"___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",[1963,1973,1981,1991,2005,2016,2027,2036,2047,2059,2074],{"id":5,"status":8,"sort":26,"created_on":1864,"slug":634,"name":629,"excerpt":1964,"subtitle":1965,"meta_title":1966,"meta_description":1967,"hidden":15,"icon":1968,"featured_icon":1969,"translations":1970,"blog_tags":1972,"docs_section_id":5},"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":636},{"id":639},[1971],{"id":5,"languages_code":812,"name":629,"excerpt":1964,"subtitle":1965,"slug":634,"meta_title":1966,"meta_description":1967,"docs_section_id":5},[],{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"excerpt":1974,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":1975,"featured_icon":1976,"translations":1977,"blog_tags":1979,"docs_section_id":12},"Start localizing your app with Localazy CLI, integrate it into your build chain or CI\u002FCD. Ideal for developers.",{"id":648},{"id":651},[1978],{"id":12,"languages_code":812,"name":643,"excerpt":1974,"subtitle":1865,"slug":411,"meta_title":1866,"meta_description":1867,"docs_section_id":12},[1980],{"id":142,"status":8,"created_on":1890,"label":643,"slug":411,"on_index_page":15},{"id":54,"status":8,"sort":12,"created_on":1864,"slug":659,"name":655,"excerpt":1982,"subtitle":1983,"meta_title":7,"meta_description":7,"hidden":15,"icon":1984,"featured_icon":1985,"translations":1986,"blog_tags":1988,"docs_section_id":54},"Localazy API reference, organized around REST. Articles about limits, endpoints and more.","API Documentation",{"id":648},{"id":662},[1987],{"id":54,"languages_code":812,"name":655,"excerpt":1982,"subtitle":1983,"slug":659,"meta_title":7,"meta_description":7,"docs_section_id":54},[1989],{"id":261,"status":8,"created_on":1990,"label":655,"slug":659,"on_index_page":15},"2022-03-17T12:22:59.000Z",{"id":113,"status":8,"sort":22,"created_on":1992,"slug":671,"name":667,"excerpt":1993,"subtitle":1994,"meta_title":1995,"meta_description":1996,"hidden":15,"icon":1997,"featured_icon":1998,"translations":1999,"blog_tags":2001,"docs_section_id":113},"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":636},{"id":674},[2000],{"id":113,"languages_code":812,"name":667,"excerpt":1993,"subtitle":1994,"slug":671,"meta_title":1995,"meta_description":1996,"docs_section_id":113},[2002],{"id":2003,"status":8,"created_on":2004,"label":667,"slug":671,"on_index_page":15},69,"2023-02-21T14:08:07.000Z",{"id":26,"status":8,"sort":13,"created_on":1864,"slug":465,"name":466,"excerpt":2006,"subtitle":2007,"meta_title":2008,"meta_description":2009,"hidden":15,"icon":2010,"featured_icon":2011,"translations":2012,"blog_tags":2014,"docs_section_id":26},"Platform specific articles about the advanced features of Android apps in Localazy.","Android SDK Documentation","Localazy Android Documentation","How to add more languages to the Android app using Localazy. Comprehensive documentation.",{"id":682},{"id":684},[2013],{"id":26,"languages_code":812,"name":466,"excerpt":2006,"subtitle":2007,"slug":465,"meta_title":2008,"meta_description":2009,"docs_section_id":26},[2015],{"id":22,"status":8,"created_on":1890,"label":466,"slug":465,"on_index_page":15},{"id":22,"status":8,"sort":94,"created_on":1864,"slug":472,"name":473,"excerpt":2017,"subtitle":2018,"meta_title":7,"meta_description":7,"hidden":15,"icon":2019,"featured_icon":2020,"translations":2021,"blog_tags":2023,"docs_section_id":22},"Platform specific articles about iOS apps in Localazy.","Swift SDK Documentation",{"id":692},{"id":695},[2022],{"id":22,"languages_code":812,"name":473,"excerpt":2017,"subtitle":2018,"slug":472,"meta_title":7,"meta_description":7,"docs_section_id":22},[2024],{"id":2025,"status":8,"created_on":2026,"label":473,"slug":472,"on_index_page":17},77,"2023-05-25T12:44:11.000Z",{"id":365,"status":8,"sort":147,"created_on":1864,"slug":544,"name":545,"excerpt":2028,"subtitle":2029,"meta_title":7,"meta_description":7,"hidden":15,"icon":2030,"featured_icon":2031,"translations":2032,"blog_tags":2034,"docs_section_id":365},"Start localizing your designs fast and easy with Figma design tool and Figma Plugin by Localazy","Figma Plugin",{"id":648},{"id":704},[2033],{"id":365,"languages_code":812,"name":545,"excerpt":2028,"subtitle":2029,"slug":544,"meta_title":7,"meta_description":7,"docs_section_id":365},[2035],{"id":278,"status":8,"created_on":1990,"label":545,"slug":544,"on_index_page":17},{"id":142,"status":8,"sort":137,"created_on":2037,"slug":537,"name":538,"excerpt":2038,"subtitle":2039,"meta_title":7,"meta_description":7,"hidden":15,"icon":2040,"featured_icon":2041,"translations":2042,"blog_tags":2044,"docs_section_id":142},"2022-06-08T13:03:58.000Z","Automate the localization of your Strapi project with the Strapi localization plugin by Localazy","Strapi Plugin",{"id":711},{"id":713},[2043],{"id":142,"languages_code":812,"name":538,"excerpt":2038,"subtitle":2039,"slug":537,"meta_title":7,"meta_description":7,"docs_section_id":142},[2045],{"id":838,"status":8,"created_on":2046,"label":538,"slug":537,"on_index_page":17},"2022-06-29T00:01:26.000Z",{"id":89,"status":8,"sort":101,"created_on":2048,"slug":2049,"name":2050,"excerpt":2051,"subtitle":2052,"meta_title":7,"meta_description":7,"hidden":15,"icon":2053,"featured_icon":2055,"translations":2056,"blog_tags":2058,"docs_section_id":89},"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":2054},"b6669e8d-6702-4aa1-8e4f-978f9028c332",{"id":2054},[2057],{"id":89,"languages_code":812,"name":2050,"excerpt":2051,"subtitle":2052,"slug":2049,"meta_title":7,"meta_description":7,"docs_section_id":89},[],{"id":108,"status":8,"sort":286,"created_on":2060,"slug":2061,"name":2062,"excerpt":2063,"subtitle":2064,"meta_title":7,"meta_description":7,"hidden":15,"icon":2065,"featured_icon":2067,"translations":2069,"blog_tags":2071,"docs_section_id":108},"2022-07-18T13:27:47.000Z","zapier","Zapier","Connect Localazy with over 5000 apps with Zapier.","Integration Platform",{"id":2066},"a1fda7c9-4e8c-48f4-99ec-a111db6a6daa",{"id":2068},"0a5546c4-adbc-4636-8695-32867837e97d",[2070],{"id":108,"languages_code":812,"name":2062,"excerpt":2063,"subtitle":2064,"slug":2061,"meta_title":7,"meta_description":7,"docs_section_id":108},[2072],{"id":1137,"status":8,"created_on":2073,"label":2062,"slug":2061,"on_index_page":15},"2022-08-16T13:54:46.000Z",{"id":195,"status":8,"sort":244,"created_on":1864,"slug":1754,"name":452,"excerpt":2075,"subtitle":2076,"meta_title":7,"meta_description":7,"hidden":17,"icon":2077,"featured_icon":2078,"translations":2080,"blog_tags":2082,"docs_section_id":195},"Learn how to connect Localazy to your favourite platform or framework.","Quick starts, Setup examples, Integration types,...",{"id":648},{"id":2079},"881c489b-4835-44ea-94b7-bda62cc57d6c",[2081],{"id":195,"languages_code":812,"name":452,"excerpt":2075,"subtitle":2076,"slug":1754,"meta_title":7,"meta_description":7,"docs_section_id":195},[],[2084,2135,2158,2178,2196,2216,2264,2296,2328,2347,2396,2428,2447,2464,2483,2498,2525,2542,2560,2577,2602,2620,2638,2659,2677,2697,2716,2738,2757,2798,2819,2839,2860,2879,2898,2918,2931,2948,2974,2993,3013,3031,3050,3068,3087,3106,3123],{"id":127,"status":8,"sort":2085,"created_on":2086,"modified_on":2087,"slug":2088,"title":2089,"excerpt":2090,"content":2091,"meta_title":2089,"meta_description":2090,"pinned":17,"main_image":7,"section":2092,"subsection":2095,"cta":7,"faq":2097,"dictionary":2131,"translations":2132,"documentation_id":127,"blog_articles":2134},"30000","2022-03-18T07:51:24.000Z","2025-02-18T08:47:53.000Z","the-basics","The Basics","Start localizing your app with Localazy CLI. It's simple to start yet flexible enough for any project. ","Localazy CLI is our command-line interface, and you can use it to upload files to the Localazy platform and download translations back to your app. You can easily integrate it into your build chain or CI\u002FCD. \n\nWe are developers, and we make Localazy for developers. Therefore, the CLI is the first-class citizen, flexible and full-featured. \nIt's not only a limited extension. \n\nLocalazy CLI is a versatile tool. It's simple to start with it but it works also for complex projects with modules, libraries, different product flavors and existing translations.\n\n\u003Ciframe width=\"100%\" height=\"540px\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBD3XNe11yu8\" title=\"Localazy Quickstart for Developers: Get Started with the CLI\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C\u002Fiframe>\n\n## Getting started\n\n**1)** [Download or install the Localazy CLI](\u002Fdocs\u002Fcli\u002Finstallation). It's available for all major operating systems, as Java's JAR and Docker image. \n\n**2)** Create configuration script `localazy.json` that tells the CLI tool what files to upload and how to process downloaded translations. \n::: info\nTIP: \u003Ca href=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flocalazy\u002Fcli-schema\u002Fmaster\u002Flocalazy.json\">JSON Schema\u003C\u002Fa> is available for smart completion.\n:::\n\n**3)** Run `localazy upload` for uploading your strings to the Localazy platform. Do it whenever you change your source language.\n\n**4)** Run `localazy download` for downloading translation back to your app. It's a great idea to make it a part of your build chain.  \n \n*Note: In this documentation, we always use `localazy` as the command that should be invoked. However, the command can be different based on your setup (eg. `localazy.exe` on Windows).* \n\n## The first configuration script\n\nThe script below is very simple. It uploads your source file `file_en.json` to Localazy and place downloaded translated files to `file_XX.json` where `XX` is the language of the translated file.  \n\n```json\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": \"path\u002Ffile_en.json\"\n  },\n\n  \"download\": {\n    \"files\": \"path\u002Ffile_${lang}.json\"\n  },\n\n  \"conversion\": {},\n\n  \"transformations\": []\n  \n}\n```  \n\n* The **writeKey** and **readKey** authorize your request. See [Authorization](\u002Fdocs\u002Fcli\u002Fauthorization) for more information.\n* The **upload** section tells Localazy CLI how to collect files that should be uploaded and optionally can provide metadata for uploaded files. See [Upload Reference](\u002Fdocs\u002Fcli\u002Fupload-reference) for more information.\n* The **download** section describes how to process translated files and where to write them. See [Download Reference](\u002Fdocs\u002Fcli\u002Fdownload-reference) for more information.\n* The **conversion** section describes how to convert translated files between different formats. See [Format Conversions](\u002Fdocs\u002Fcli\u002Fformat-conversions) for more information.\n* The **Transformations** section allows defining rule for string transformations. Using transformations, you can eg. obtain file metadata from its path or build the specific path where to write translated files. See [Transformations](\u002Fdocs\u002Fcli\u002Ftransformations) for more information.\n* The placeholder `${lang}` is a [variable](\u002Fdocs\u002Fcli\u002Fvariables).  \n\nEvery Localazy CLI configuration file uses the same structure as described above. \n\n## The more complex example\n\nLet's say that there are more source files in different folders and that you want to preserve the path, and the file name.  \n\n```json\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n\n  \"transformations\": [\n    {\n      \"name\": \"cleaned_file\", \n      \"source\": \"${file}\",\n      \"operations\": [\n        \"remove: _en\"\n      ]   \n    },\n    {\n      \"name\": \"file_without_ext\",\n      \"source\": \"${file}\",\n      \"operations\": [\n        \"substringBeforeLast: .\"\n      ]     \n    }\n  ],\n\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": {\n      \"pattern\": \"path\u002F**\u002F*_en.json\",\n      \"file\": \"${cleaned_file}\",\n      \"path\": \"${path}\"\n    }\n  },\n\n  \"download\": {\n    \"files\": \"${path}\u002F${file_without_ext}_${lang}.json\"\n  }\n  \n}\n```  \n\nIn the [**upload**](\u002Fdocs\u002Fcli\u002Fupload-reference) section, files are collected using wildcards and with transformations, we remove `_en` suffix from the file name. This way, the phrases are uploaded with the nice and cleaned file name. \n\nIn the [**download**](\u002Fdocs\u002Fcli\u002Fdownload-reference) section, the output path is build dynamically for each of files. We simply use the stored path with `${path}`, remove extension from the file name and add the language code and restore the extension.  \n\nOf course, we could remove the whole `_en.json` from the file name in the **upload** section but this way, we preserve the correct file names.\n\nThe [**transformations**](\u002Fdocs\u002Fcli\u002Ftransformations) section defines how to transform input string (which could be almost anything) to the output one. In this example, we have two rules: `cleaned_file` removes the `_en` substring and `file_without_ext` removes the file extension.     \n\n## Android with build type and product flavors\n\nAs the last example, let's examine even more complex configuration that allows uploading and downloading strings for complex Android app maintaining correct build types and product flavors. It can upload the source language as well as all existing translations. \n\n```\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n    \n  \"transformations\": [\n    {\n      \"name\": \"product_flavors\",\n      \"source\": \"${path}\",\n      \"operations\": [\n        \"androidProductFlavors: gp am, free full auto\"\n      ]\n    },\n    {\n      \"name\": \"build_type\",\n      \"source\": \"${path}\",\n      \"operations\": [\n        \"androidBuildType: debug, release\"\n      ]\n    }\n  ],\n\n  \"upload\": {\n  \n    \"type\": \"android\",\n\n    \"folder\": \"\u002Fhome\u002Fwork\u002Fmyapp\",\n    \n    \"files\": [\n    \n      {\n        \"pattern\": \"src\u002F*\u002Fres\u002Fvalues\u002Fstrings*.xml\",\n        \"excludes\": [\n          \"**\u002Fstrings_private.xml\"\n        ],\n        \"productFlavors\": \"${product_flavors}\",\n        \"buildType\": \"${build_type}\"\n      },\n      \n      {\n        \"group\": \"all\",\n        \"pattern\": \"src\u002F*\u002Fres\u002Fvalues-*\u002Fstrings*.xml\",\n        \"lang\": \"${autodetectLang}\",\n        \"excludes\": [\n          \"**\u002Fvalues\u002F**\",\n          \"**\u002Fstrings_private.xml\",\n        ],\n        \"productFlavors\": \"${product_flavors}\",\n        \"buildType\": \"${build_type}\"\n      }\n      \n    ]\n  },\n\n  \"download\": {\n    \"folder\": \"\u002Fhome\u002Fwork\u002Fmyapp\",\n    \"files\": \"src\u002F${androidFlavoredFolder}\u002Fres\u002Fvalues-${langAndroidRes}\u002F${file}\"\n  }\n\n}\n```\n\nThe [**transformations**](\u002Fdocs\u002Fcli\u002Ftransformations) section uses built-in functions to get the build type and product flavors from the file path. The language is obtained using [auto-detection through variable ${autodetectLang}](\u002Fdocs\u002Fcli\u002Fexisting-translations).\n\nIn the [**upload**](\u002Fdocs\u002Fcli\u002Fupload-reference) section, two rules are defined. One for uploading the source language and the second for [all other existing translations](\u002Fdocs\u002Fcli\u002Fexisting-translations). The second rule is [placed into group **all**](\u002Fdocs\u002Fcli\u002Fcommand-line-options#groups) and thus it's not run automatically.\n\nFor files collected during **upload**, metadata **lang**, **buildType** and **productFlavors** are provided allowing the Localazy platform to correctly handle them. \n\nIt's possible to upload the source language by simply invoking `localazy upload`. It's also possible to upload all existing translations by invoking `localazy upload all` which runs both rules. \n\nBecause our uploaded data are perfectly prepared, all we need to do in the [**download**](\u002Fdocs\u002Fcli\u002Fdownload-reference) section is to write them to the right place. Using built-in precalculated [**variables**](\u002Fdocs\u002Fcli\u002Fvariables) `${androidFlavoredFolder}` and `${langAndroidRes}`, it's simple to build the correct path.   \n\nInvoking `localazy download` before build or as a part of the build chain will ensure that our app always contains the most recent translations. \n\n\n## The final note\n\nAs you can see, Localazy CLI can be used to upload simple projects, but it's flexible enough to handle large and complex situation. \n\nNot sure how to use it for your particular project? [Contact us for help!](https:\u002F\u002Flocalazy.com\u002Fcontact)\n\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2093,"featured_icon":2094},{"id":648},{"id":651},{"id":5,"status":8,"sort":26,"created_on":1872,"name":2096},"Getting started",[2098,2106,2114,2123],{"id":1608,"status":8,"title":2099,"content":2100,"slug":2101,"created_on":1887,"modified_on":2102,"owner":1855,"meta_title":7,"category":2103},"What is the maximum possible length of translation text?","There is no hard limit at the moment, but it's recommended to keep the size of each individual item under 4kB. This corresponds to 4,000 characters encoded as UTF-8 and 2,000 characters encoded as UTF-16. Uploading longer texts won't yield any errors, but might get refused by some external translation engines integrated in Localazy.","what-is-the-maximum-possible-length-of-translation-text","2023-05-26T19:28:22.000Z",{"id":13,"status":8,"created_on":2104,"sort":12,"slug":2105,"label":629,"on_faq_index":17},"2022-03-17T12:22:57.000Z","localazy",{"id":2107,"status":8,"title":2108,"content":2109,"slug":2110,"created_on":2111,"modified_on":2112,"owner":1855,"meta_title":7,"category":2113},116,"I have trouble with my CLI configuration. Can you help me?","The Localazy CLI is a powerful tool designed to automate the process of uploading and downloading translation files in almost any project. If you encounter any issues or questions that are not addressed in the [documentation](\u002Fdocs\u002Fcli), there's no need to worry as we're happy to help you to overcome these challenges.\n\nSimply reach out to us through our chat, and we'll make every effort to assist you promptly. Alternatively, you can send an email to team@localazy.com, providing your configuration details and a clear description of your goal. We will respond as quickly as possible to ensure your seamless experience with Localazy.","i-have-trouble-with-my-cli-configuration-can-you-help-me","2022-03-17T12:23:02.000Z","2025-02-04T19:27:42.000Z",{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},{"id":2115,"status":8,"title":2116,"content":2117,"slug":2118,"created_on":2119,"modified_on":2120,"owner":2121,"meta_title":7,"category":2122},286,"Where can I find my access keys?","As a developer, connecting to your Localazy project via [Localazy CLI](\u002Fdocs\u002Fcli\u002Fthe-basics) requires you to provide your unique `readKey` and `writeKey`to authorize upload and download operations.\n\nYou need to have the [Owner role](\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles) in the project to access your unique access keys. Then, navigate to the project and open the left menu to find  **Settings ->Access Keys**\n\n> Learn more in the [Localazy CLI: Authorization](\u002Fdocs\u002Fcli\u002Fauthorization)\n","where-can-i-find-my-access-keys","2023-07-14T09:24:55.000Z","2023-07-14T09:24:57.000Z","4d38dee1-a9d9-4a00-a57d-3ced2b7cb39c",{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},{"id":2124,"status":8,"title":2125,"content":2126,"slug":2127,"created_on":2128,"modified_on":2129,"owner":2121,"meta_title":7,"category":2130},417,"What exactly is Localazy CLI and what are its core capabilities?","Localazy CLI is a robust command-line interface tool designed for handling software localization workflows. It serves as a bridge between your development environment and Localazy's translation platform.\n\nThe CLI handles both uploading source files for translation and downloading completed translations back into your project structure. It supports complex localization scenarios like plurals, string arrays, and nested key structures. \n\nBeyond basic file operations, it provides features for versioning (through Release Tags), project branching, and format conversions. The CLI integrates with CI\u002FCD pipelines and can be automated as part of your build process, making it particularly valuable for teams practicing continuous deployment.","what-exactly-is-localazy-cli-and-what-are-its-core-capabilities","2025-02-04T19:40:25.000Z","2025-02-04T19:40:32.000Z",{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},[],[2133],{"id":127,"documentation_id":127,"languages_code":812,"slug":2088,"title":2089,"content":2091,"meta_title":2089,"meta_description":2090,"excerpt":2090},[],{"id":89,"status":8,"sort":2136,"created_on":2086,"modified_on":2137,"slug":2138,"title":2139,"excerpt":2140,"content":2141,"meta_title":2139,"meta_description":2140,"pinned":17,"main_image":7,"section":2142,"subsection":2145,"cta":2146,"faq":2147,"dictionary":2154,"translations":2155,"documentation_id":89,"blog_articles":2157},"30010","2025-02-28T09:27:21.000Z","installation","Installation","Learn how to install Localazy CLI for Linux, Windows and macOS or as a Java app or Docker image.","Localazy CLI is available as a native app for all major platforms (Windows, Linux and macOS), Java' JAR, npm package and Docker image.\n\nFor more information about using Localazy CLI please refer to [basics](\u002Fdocs\u002Fcli\u002Fthe-basics) and [command-line options](\u002Fdocs\u002Fcli\u002Fcommand-line-options).\n \n## NPM\n\nThe Localazy CLI is available on NPM repository as [**@localazy\u002Fcli**](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@localazy\u002Fcli).\n\n**Install:**\n\n```\nnpm install -g @localazy\u002Fcli\n```\n\n**Run CLI:**\n\n`localazy [command] [options] [groups]`\n\n::: info\nNode.js v18.20.7+ and NPM v6+ are required to run Localazy CLI.\n:::\n\n::: info\nNPM version of Localazy CLI doesn't support proxies (`--proxy`).\n:::\n\n## Linux\n\nLocalazy CLI for Linux is a native app, and it only has single dependency on `libcurl` (for HTTPS communication).\n\n### Debian\u002FUbuntu \n\n**Add repository and install:**\n\nRecommended way after `apt-key` gets deprecated:\n\n```shell script\ncurl -sS https:\u002F\u002Fdist.localazy.com\u002Fdebian\u002Fpubkey.gpg | sudo gpg --dearmor -o \u002Fetc\u002Fapt\u002Ftrusted.gpg.d\u002Flocalazy.gpg\necho \"deb [arch=amd64 signed-by=\u002Fetc\u002Fapt\u002Ftrusted.gpg.d\u002Flocalazy.gpg] https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Fapt\u002F stable main\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Flocalazy.list\n\nsudo apt-get update && sudo apt-get install localazy\n```\n\nOld way with `apt-key`:\n\n```shell script\ncurl -sS https:\u002F\u002Fdist.localazy.com\u002Fdebian\u002Fpubkey.gpg | sudo apt-key add - \necho \"deb [arch=amd64] https:\u002F\u002Fmaven.localazy.com\u002Frepository\u002Fapt\u002F stable main\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Flocalazy.list\n\nsudo apt-get update && sudo apt-get install localazy\n```\n\n**Run CLI:**\n\n`localazy [command] [options] [groups]`\n\n### RHEL\u002FCentOS\n\n**Download and install:**\n\n```shell script\ncurl -sS https:\u002F\u002Fdist.localazy.com\u002Frhel\u002Flocalazy.repo | tee \u002Fetc\u002Fyum.repos.d\u002Flocalazy.repo\n\nyum install localazy \n```\n\n**Run CLI:**\n\n`localazy [command] [options] [groups]`\n### Manual installation\n\nIf the `libcurl` is not installed on your system, install it:  \n\n* Debian\u002FUbuntu: `apt install libcurl4`\n* or use the standard package manager for your distribution  \n\n**Download DEB:**\n\n* [localazy-___CLI_VERSION___.deb](https:\u002F\u002Fdist.localazy.com\u002Fdeb\u002Flocalazy-___CLI_VERSION___.deb)\n\n**Download RPM:**\n\n* [localazy-___CLI_VERSION___.rpm](https:\u002F\u002Fdist.localazy.com\u002Frpm\u002Flocalazy-___CLI_VERSION___.rpm)\n\n**Download binary:**\n\n* [linux-___CLI_VERSION___.zip](https:\u002F\u002Fdist.localazy.com\u002Flinux\u002Flinux-___CLI_VERSION___.zip)\n* [linux-___CLI_VERSION___.tar](https:\u002F\u002Fdist.localazy.com\u002Flinux\u002Flinux-___CLI_VERSION___.tar)\n* [linux-___CLI_VERSION___.tar.gz](https:\u002F\u002Fdist.localazy.com\u002Flinux\u002Flinux-___CLI_VERSION___.tar.gz)\n\n**Run CLI:**\n\n`localazy [command] [options] [groups]`\n\n### Autocomplete for bash \u002F zsh\n\nYou can generate and install the autocomplete script for your shell by invoking command: \n\n```shell script\n# for bash\nsudo mkdir -p \u002Fusr\u002Fshare\u002Fbash-completion\u002Fcompletions && sudo bash -c '_LOCALAZY_COMPLETE=bash localazy > \u002Fusr\u002Fshare\u002Fbash-completion\u002Fcompletions\u002Flocalazy'\n\n# for zsh\n_LOCALAZY_COMPLETE=zsh localazy > ~\u002F.localazy-autocomplete.sh && echo source ~\u002F.localazy-autocomplete.sh >> ~\u002F.zshrc\n```\n\nThe bash autocomplete script is installed automatically when installed from repository, DEB or RPM. \n\n### Alpine Linux\n\nTo run Localazy CLI on Alpine Linux, you need to install necessary libraries:\n\n`apk add curl libstdc++ libc6-compat`\n\n**Download binary:**\n\n* [alpine-___CLI_VERSION___.zip](https:\u002F\u002Fdist.localazy.com\u002Falpine\u002Falpine-___CLI_VERSION___.zip)\n* [alpine-___CLI_VERSION___.tar](https:\u002F\u002Fdist.localazy.com\u002Falpine\u002Falpine-___CLI_VERSION___.tar)\n* [alpine-___CLI_VERSION___.tar.gz](https:\u002F\u002Fdist.localazy.com\u002Falpine\u002Falpine-___CLI_VERSION___.tar.gz)\n\n\n## macOS \n\nLocalazy CLI supports both **Arm64** and **Intel X64** Macs. \n\nLocalazy CLI is available through **brew**; just use the command-line to install it:\n```shell script\n> brew tap localazy\u002Ftools\n> brew install localazy\n```\n\nIn the future, you can update to the latest version of Localazy CLI with: \n```shell script\n> brew upgrade localazy\n```\n\n**Run CLI:**\n\n`localazy [command] [options] [groups]`\n\nYou can also download the binary directly. However, it depends on `libcurl` (can be installed with `brew install curl`). \n\n**Download direct binary:**\n\n* [macos-___CLI_VERSION___.zip](https:\u002F\u002Fdist.localazy.com\u002Fmacos\u002Fmacos-___CLI_VERSION___.zip)\n* [macos-___CLI_VERSION___.tar](https:\u002F\u002Fdist.localazy.com\u002Fmacos\u002Fmacos-___CLI_VERSION___.tar)\n* [macos-___CLI_VERSION___.tar.gz](https:\u002F\u002Fdist.localazy.com\u002Fmacos\u002Fmacos-___CLI_VERSION___.tar.gz)\n\n## Docker\n\n::: info\nThis Docker container is not supported on ARM-based Macs.\n:::\n\nThe Localazy CLI is available on Docker repository as [**localazy\u002Fcli**](https:\u002F\u002Fhub.docker.com\u002Fr\u002Flocalazy\u002Fcli). It has no **entrypoint** and no **cmd** and the `localazy` command is supposed to be run manually as per your needs. \n\nThe container is based on `ubuntu:22.04` so you can easily reuse it for more purposes. There is also Alpine Linux variant available. \n\nThe **workdir** inside the container is `\u002Flocalazy` and you should mount your working directory to it using `-v` parameter. \n\n#### Typical usage\n\n`docker run --rm -v $(pwd):\u002Flocalazy localazy\u002Fcli:latest localazy [command] [options] [groups]`\n\n**Details:**\n\n* `--rm` - the container is removed automatically when the operation finishes\n* `-v $(pwd):\u002Flocalazy` - mount the current directory as working directory\n* `localazy\u002Fcli:latest` - use the latest available Localazy CLI version\n* `localazy [command] [options] [groups]` - the actual invocation of Localazy CLI\n\n## Windows\n\nLocalazy CLI for Windows is a native app and has no dependencies.\n\n**Download:**\n\n* [windows-___CLI_VERSION___.zip](https:\u002F\u002Fdist.localazy.com\u002Fwindows\u002Fwindows-___CLI_VERSION___.zip)\n* [windows-___CLI_VERSION___.tar](https:\u002F\u002Fdist.localazy.com\u002Fwindows\u002Fwindows-___CLI_VERSION___.tar)\n* [windows-___CLI_VERSION___.tar.gz](https:\u002F\u002Fdist.localazy.com\u002Fwindows\u002Fwindows-___CLI_VERSION___.tar.gz)\n\n**Run CLI:**\n\n`.\\localazy.exe [command] [options] [groups]`\n\n*Note: Whenever working with file paths in the Localazy configuration file, we strongly advise you to use POSIX `\u002F` path separator instead of the backslash. It simplifies parsing and writing transformation rules.*\n\n## Java\u002FJVM\n\nFor using the Java version of Localazy CLI, you need JRE\u002FJDK 8 and above available on your machine.\n\n**Download:**\n\n* [java-___CLI_VERSION___.zip](https:\u002F\u002Fdist.localazy.com\u002Fjava\u002Fjava-___CLI_VERSION___.zip)\n* [java-___CLI_VERSION___.tar](https:\u002F\u002Fdist.localazy.com\u002Fjava\u002Fjava-___CLI_VERSION___.tar)\n* [java-___CLI_VERSION___.tar.gz](https:\u002F\u002Fdist.localazy.com\u002Fjava\u002Fjava-___CLI_VERSION___.tar.gz)\n\n**Run CLI:**\n\n`java -jar localazy.jar [command] [options] [groups]`\n\n## Notes\n\nThe native version of Localazy CLI available for Windows, Linux and macOS requires 64-bit system.\n\nIf you are still running 32-bit system, please use Java version with appropriate 32-bit JRE\u002FJDK. \n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2143,"featured_icon":2144},{"id":648},{"id":651},{"id":5,"status":8,"sort":26,"created_on":1872,"name":2096},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2148],{"id":113,"status":8,"title":2149,"content":2150,"slug":2151,"created_on":1887,"modified_on":2152,"owner":1855,"meta_title":7,"category":2153},"Localazy CLI is not working on macOS Big Sur and later","After upgrading to **macOS Big Sur**, there's a chance you may run into an issue with executing Localazy CLI. This is usually caused by incorrect configuration of `brew` package manager. (Note that this doesn't apply to binaries downloaded directly from our website, they should be working fine.)\n\nThe symptoms look like this, the process is killed without any further output.\n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F924ade42-a1ab-4c74-9501-6afdda141124)\n\nTo resolve the issue, go to **App Store -> Updates** and make sure, there's no update available for Xcode. If yes, click \"UPDATE\" and wait for it to finish. \n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fdca33bb0-4dc4-43da-af77-4948fbd462b4)\n\nAfter the update, try to run `brew doctor` and read the output carefully. There could be a warning about outdated CLT and suggested fix. \n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F9b6ff8c8-8520-41c5-886c-5f9d7e27f111)\n\nLet's run the commands in the specified order and confirm all dialogues that might appear. \n- `softwareupdate --all --install --force`,\n- `sudo rm -rf \u002FLibrary\u002FDeveloper\u002FCommandLineTools`\n- `sudo xcode-select --install`\n\nUpgrade Localazy CLI to the latest version by running `brew upgrade localazy\u002Ftools`\n\nAnd that's all! You can now verify that Localazy CLI is working again with the `localazy -h` command.\n","localazy-cli-is-not-working-on-macos-big-sur","2023-05-26T19:28:05.000Z",{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},[],[2156],{"id":89,"documentation_id":89,"languages_code":812,"slug":2138,"title":2139,"content":2141,"meta_title":2139,"meta_description":2140,"excerpt":2140},[],{"id":118,"status":8,"sort":2159,"created_on":2086,"modified_on":2160,"slug":2161,"title":2162,"excerpt":2163,"content":2164,"meta_title":2162,"meta_description":2165,"pinned":15,"main_image":7,"section":2166,"subsection":2169,"cta":2170,"faq":2171,"dictionary":2174,"translations":2175,"documentation_id":118,"blog_articles":2177},"30020","2024-08-12T06:32:34.000Z","authorization","Authorization","Learn how to authorize your request from Localazy CLI including other ways when providing keys in the configuration file is impractical for security reasons.","To authorize the upload and download operation, you have to provide **writeKey** and **readKey** for the particular project. Select the project from your [Dashboard](\u002Fmy\u002Fdashboard) and navigate to the **Settings** of your project. To obtain the keys, click on the **Access keys** tab. \n\nThere are several ways how you can provide the keys for the CLI tool.\n\n## Keys in the configuration file\n\nThe simplest and most common way is to provide **writeKey** and **readKey** in the configuration file **localazy.json**:\n\n```json\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n\n  \"upload\": {},\n  \"download\": {},\n  \"transformations\": []\n  \n}\n```  \n\nHowever, it may be impractical to provide the keys in the configuration file for security reasons. For example, if you share your source code on Github or other places. In such a situation, you should consider other ways of authorization described below.\n\n## Separate key file\n\nYou can store keys in a separate file called `localazy.keys.json`. If such a file exists, the keys are loaded from it. You can define a different key file using the command line: `localazy [command] -k keys.json`\n\nThe format of the file with keys is:\n\n```json\n{\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\"\n}\n``` \n\n## Keys provided on command line\n\nYou can also define both **writeKey** and **readKey** directly on the command line:\n\n`localazy [command] -r your-read-key -w your-write-key`\n  \n## Priority\n\nIf the keys are provided using more methods, the ones to be used are resolved this way:\n\n**1.** The keys from the configuration file, if provided, are used only if not provided by other way. \n\n**2.** The keys from the key file have higher priority than keys from the configuration file. \n\n**3.** The keys provided on the command line have the highest priority. Note that by using only **writeKey** or **readKey** on the command line, you can overwrite only the particular one.\n\n## Branching support\n\nIn the configuration file (`localazy.json`), you can specify the branch to perform the operation on using the `branch` parameter like this: \n\n```json\n{\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n  \"branch\": \"[target branch]\"\n}\n``` \n\nYou can access any branch with `writeKey`\u002F`readKey` corresponding to a different one as long as you have permission to access both of them. \n\nSee [Branching](\u002Fdocs\u002Fcli\u002Fbranching) for detailed information. \n\n___CLI_LINKS___\n","Learn how to authorize your request from Localazy CLI including other ways when providing keys in the configuration file is impractical fo security reasons.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2167,"featured_icon":2168},{"id":648},{"id":651},{"id":5,"status":8,"sort":26,"created_on":1872,"name":2096},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2172],{"id":2115,"status":8,"title":2116,"content":2117,"slug":2118,"created_on":2119,"modified_on":2120,"owner":2121,"meta_title":7,"category":2173},{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},[],[2176],{"id":118,"documentation_id":118,"languages_code":812,"slug":2161,"title":2162,"content":2164,"meta_title":2162,"meta_description":2165,"excerpt":2163},[],{"id":113,"status":8,"sort":2179,"created_on":2086,"modified_on":2180,"slug":2181,"title":2182,"excerpt":2183,"content":2184,"meta_title":2182,"meta_description":2183,"pinned":15,"main_image":7,"section":2185,"subsection":2188,"cta":2190,"faq":2191,"dictionary":2192,"translations":2193,"documentation_id":113,"blog_articles":2195},"31000","2024-07-16T15:14:37.000Z","command-line-options","Command-Line Options","Learn advanced command-line parameters that you can use for using Localazy CLI in specific situations such as automated builds and testing.","For most situations, invoking `localazy upload` and `localazy download` in the correct folder is enough. However, there are numerous parameters that you can use in specific situations.\n\nThe general usage pattern for Localazy CLI is:\n\n`localazy [proxy] [command] [common options] [groups\u002Fsubcommands] [subcommand options]`\n\n## Proxy\n\nYou can define proxy servers for the communication using the `--proxy server:port` command parameter. Please remember that HTTPS-compliant proxy server is required. \n\nIf your proxy requires basic authentication, you can pass the credentials as `--proxy user:pass@server:port`.\n\n## Commands\n\n* **upload** - Run upload rules to collect files and upload them to Localazy servers for processing. \n* **download** - Download files from Localazy servers and run download and conversion rules on them.\n* **list** - List files all translated files available on the server.\n* **languages** - List languages available on Localazy including their current state.\n* **file** - Manage (rename and delete) files on the server.\n* **tag** - Manage release tags - list, publish and delete tags.\n* **cdn** - List all files on the Localazy CDN.\n* **conversion** - Access information about file format conversions.\n* **branch** - Create, list, merge and delete branches.\n\nFor help, invoke `localazy [command] -h`.\n\n## Common Options\n\nAll of the commands above require the `localazy.json` file and accept these command-line options:\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;c&nbsp;config.json\u003C\u002Fnobr>\u003C\u002Ftt> | Override the configuration file name. Default: `localazy.json` |\n| \u003Ctt>\u003Cnobr>&#8211;k keys.json\u003C\u002Fnobr>\u003C\u002Ftt> | Override the keys file name. See [Authorization](\u002Fdocs\u002Fcli\u002Fauthorization). Default: `localazy.keys.json` |\n| \u003Ctt>\u003Cnobr>&#8211;r read-key\u003C\u002Fnobr>\u003C\u002Ftt> | Provide the **readkey** on the command line. See [Authorization](\u002Fdocs\u002Fcli\u002Fauthorization). | \n| \u003Ctt>\u003Cnobr>&#8211;w write-key\u003C\u002Fnobr>\u003C\u002Ftt> | Provide the **writeKey** on the command line. See [Authorization](\u002Fdocs\u002Fcli\u002Fauthorization). | \n| \u003Ctt>\u003Cnobr>&#8211;d working-directory\u003C\u002Fnobr>\u003C\u002Ftt> | Set the working directory that all paths are relative to. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;no-colors\u003C\u002Fnobr>\u003C\u002Ftt> | Disable using colored output. |\n\n## Upload Options\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;s\u003C\u002Fnobr>\u003C\u002Ftt> | Do not perform the actual operation, only simulate the process. No files are uploaded nor written. |\n| \u003Ctt>\u003Cnobr>&#8211;q\u003C\u002Fnobr>\u003C\u002Ftt> | Quiet mode. Print only important information. |\n| \u003Ctt>\u003Cnobr>&#8211;f\u003C\u002Fnobr>\u003C\u002Ftt> | Force the upload operation if the validation step fails. |\n| \u003Ctt>\u003Cnobr>&#8211;v\u003C\u002Fnobr>\u003C\u002Ftt> | The app version used for automatic versioning of deprecated phrases. See [Upload Reference](\u002Fdocs\u002Fcli\u002Fupload-reference). |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;project&nbsp;{project}\u003C\u002Fnobr>\u003C\u002Ftt> | Specify the project slug or ID to ensure that the upload is only performed if matching write and read keys are used. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;failOnMissingGroups\u003C\u002Fnobr>\u003C\u002Ftt> | Fail if unknown group is provided on the command line. |\n| \u003Ctt>\u003Cnobr>&#8211;p&nbsp;key:value\u003C\u002Fnobr>\u003C\u002Ftt> | Provide additional parameters for [highly dynamic configurations](\u002Fdocs\u002Fcli\u002Fhighly-dynamic-configurations). |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;async\u003C\u002Fnobr>\u003C\u002Ftt> | Do not wait for the server to process the uploaded data and report errors. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\n## Download Options\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;t tag\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation for the given release tag. |\n| \u003Ctt>\u003Cnobr>&#8211;s\u003C\u002Fnobr>\u003C\u002Ftt> | Do not perform the actual operation, only simulate the process. No files are uploaded nor written. |\n| \u003Ctt>\u003Cnobr>&#8211;q\u003C\u002Fnobr>\u003C\u002Ftt> | Quiet mode. Print only important information. |\n| \u003Ctt>\u003Cnobr>&#8211;f\u003C\u002Fnobr>\u003C\u002Ftt> | Force the upload operation if the validation step fails. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;failOnMissingGroups\u003C\u002Fnobr>\u003C\u002Ftt> | Fail if unknown group is provided on the command line. |\n| \u003Ctt>\u003Cnobr>&#8211;p&nbsp;key:value\u003C\u002Fnobr>\u003C\u002Ftt> | Provide additional parameters for [highly dynamic configurations](\u002Fdocs\u002Fcli\u002Fhighly-dynamic-configurations). |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\n## List Options\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;t tag\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation for the given release tag. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\n## Languages Options\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;csv\u003C\u002Fnobr>\u003C\u002Ftt> | Return the list in the CSV format for machine processing. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\n## File Options\n\nThis command allows management of high-level files on the server and shows corresponding CDN addresses.\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\n**List files:**\n\n`localazy file [common-options] list`\n\n**Delete file:**\n\n`localazy file [common-options] delete {fileId}`\n\n**Rename file:**\n\n`localazy file [common-options] rename {fileId} [-p new-path] [-f new-name]`\n\n## Tag Options\n\nThis command allows managing release tags.\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\nList all available tags including their publishing date and CDN addresses:\n\n`localazy tag [common-options] list`\n\nCreate\u002Fpublish the current translations under the tag:\n\n`localazy tag [common-options] publish {tag-name}`\n\nRemove the tag including corresponding data:\n\n`localazy tag [common-options] delete {tag-name}`\n\nRename existing tag:\n\n`localazy tag [common-options] rename {tag-name} {new-name}`\n\nPromote tag to another one (existing or new):\n\n`localazy tag [common-options] promote {tag-name} {target-tag}`\n\nMerge tags, manipulate string keys and languages:\n\n`localazy tag [common-options] merge [merge-parameters] {source-tag} {destionation-tag} {output-tag}`\n\nSee [Release Tags](\u002Fdocs\u002Fcli\u002Frelease-tags) for detailed information on all available commands and merge parameters. \n\n## CDN Options\n\nThis command lists all files available on CDN for the latest version or given release tag. Learn more about [Localazy CDN](\u002Fdocs\u002Fgeneral\u002Flocalazy-cdn).\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>&#8211;t tag\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation for the given release tag. |\n| \u003Ctt>\u003Cnobr>&#8211;&#8211;branch\u003C\u002Fnobr>\u003C\u002Ftt> | Perform the operation against a specific branch. If not provided, the operation is performed against the project specified by `readKey` and `writeKey`. |\n\n## Conversion Options\n\nThis command allows for listing supported conversion:\n\n`localazy conversion [common-options] list`\n\nAnd for obtaining detailed information about selected conversion:\n\n`localazy conversion [common-options] format {conversion}`\n\n## Branching\n\nThis command allows for creating, listing, merging, and deleting branches. \n\nSee [Branching](\u002Fdocs\u002Fcli\u002Fbranching) for detailed information on all available commands and parameters. \n\n## Groups\n\nGroups allow for running only selected rules for **upload** and **download**.\n\nFor **upload**, the group the collected files belongs to is sent to the server as additional information and you can later use it in your **download** rules to decided what to do with the files.  \n\nLet's consider this sample configuration file:\n\n```json\n{\n  \"upload\": {\n    \"files\": [\n\n      {\n        \"pattern\": \"app\u002Ffiles\u002Fen.json\"\n      },\n    \n      {\n        \"group\": \"library\",\n        \"pattern\": \"library\u002Ffiles\u002Fen.json\"\n      },\n\n      {\n        \"group\": \"web\",\n        \"pattern\": \"web\u002Ffiles\u002Fen.json\"\n      }\n\n    ]\n  }\n}\n```\n\nFor the first upload rule with the pattern `app\u002Ffiles\u002Fen.json`, no group is provided. **Missing or empty group is considered default and is always applied.**\n\nBy invoking Localazy CLI with groups provided, you can easily decide what files to upload: \n\n* Invoking `localazy upload` uploads only `app\u002Ffiles\u002Fen.json` as the default group is always applied.\n* Invoking `localazy upload library` uploads `app\u002Ffiles\u002Fen.json` and `library\u002Ffiles\u002Fen.json` as both the default group and the library group are applied.\n* Invoking `localazy upload library web` uploads all three files. \n\nGroups are very effective for selecting resources you want to upload \u002F download. They are also great for having the default rule for the source language and a kind of `all` rule for the initial upload of all your existing translations. \n\n**Note:** You can access the group the collected files belonged to when they were uploaded but groups provided on the command line for **download** only filter the download rules.\n\n___CLI_LINKS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2186,"featured_icon":2187},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},"Usage",{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2194],{"id":113,"documentation_id":113,"languages_code":812,"slug":2181,"title":2182,"content":2184,"meta_title":2182,"meta_description":2183,"excerpt":2183},[],{"id":2197,"status":8,"sort":2198,"created_on":2199,"modified_on":2200,"slug":2201,"title":2202,"excerpt":2203,"content":2204,"meta_title":2202,"meta_description":2203,"pinned":15,"main_image":7,"section":2205,"subsection":2208,"cta":2209,"faq":2210,"dictionary":2211,"translations":2212,"documentation_id":2197,"blog_articles":2215},276,"31005","2026-05-08T22:37:35.000Z","2026-05-08T22:39:18.000Z","ai-translations","AI Translations","Learn how to use CLI to translate texts using Localazy AI, benefiting from the project's context and our smart tools.","The `localazy translate` command provides on-demand, realtime AI translation directly from the command line. Unlike the [batch operations](\u002Fdocs\u002Fcli\u002Fbatch-operations), it does not modify any phrases stored in your project — it just returns translations synchronously so you can use them in scripts, build pipelines, or one-off tasks.\n\nThis is the same translation technology that powers Localazy AI in the editor and integrations, exposed for ad-hoc use without requiring a separate public API token.\n\n## Authorization\n\nAI translation is restricted to project **owners**. The command uses the standard `writeKey` configured for the CLI — managers and other roles will be rejected with an authorization error.\n\nSee [Authorization](\u002Fdocs\u002Fcli\u002Fauthorization) for details on how to configure the key.\n\n# Context\n\nThis command automatically uses the project's style guide, glossary and other contextual tools.\n\n## Translate a single text\n\nThe simplest invocation translates a piece of text from one language to another:\n\n```\nlocalazy translate --from en --to cs --text \"Hello, world!\"\n```\n\nThe translated text is printed to standard output. This makes it easy to pipe into other tools or capture into shell variables:\n\n```\nTRANSLATED=$(localazy translate --from en --to de --text \"Welcome\")\n```\n\n## Translate multiple items from a JSON file\n\nFor bulk on-demand translation, prepare a JSON file with the items to translate and pass it via `--input`:\n\n```\nlocalazy translate --from en --to cs --input items.json\n```\n\nThe input file must be a JSON array of items. The minimal item only needs `key` and `source`:\n\n```json\n[\n  {\n    \"key\": \"greeting\",\n    \"source\": \"Hello, world!\"\n  },\n  {\n    \"key\": \"farewell\",\n    \"source\": \"Goodbye!\"\n  }\n]\n```\n\nThe output is a JSON object mapping each `key` to its translation, pretty-printed by default:\n\n```json\n{\n  \"greeting\": \"Ahoj, světe!\",\n  \"farewell\": \"Sbohem!\"\n}\n```\n\nUse `--compact` to emit a single-line JSON object instead — useful when the output is consumed by another program:\n\n```\nlocalazy translate --from en --to cs --input items.json --compact\n```\n\n### Plurals\n\nThe `source` of an item can be either a string (for regular phrases) or an object whose keys are CLDR plural categories (`zero`, `one`, `two`, `few`, `many`, `other`):\n\n```json\n[\n  {\n    \"key\": \"item_count\",\n    \"source\": {\n      \"one\": \"%d item\",\n      \"other\": \"%d items\"\n    }\n  }\n]\n```\n\nThe translation in the response will follow the same shape — a string for singles, an object keyed by the target language's CLDR plural categories for plurals.\n\n### Item metadata\n\nEach item in the input file accepts optional fields that help the AI engine produce better translations:\n\n| Field          | Description                                                                                         |\n|----------------|-----------------------------------------------------------------------------------------------------|\n| `key`         | The identifier of the text that can be used as a source for the context. E.g., _button-label_, etc. |\n| `comment`      | Free-form context for the translator\u002Fengine — e.g. _\"Use imperative verb\"_.                         |\n| `lengthLimit`  | Maximum number of characters the translation should not exceed.                                     |\n| `file`         | The source file the phrase comes from. Serve as additional context.                                 |\n\nExample with metadata:\n\n```json\n[\n  {\n    \"key\": \"greeting\",\n    \"source\": \"Hello, world!\",\n    \"comment\": \"Should be informal\",\n    \"file\": \"strings.xml\",\n    \"lengthLimit\": 50\n  }\n]\n```\n\n## Command-line options\n\n| Option | Default | Description |\n| --- | --- | --- |\n| \u003Ctt>\u003Cnobr>`--from LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | _required_ | Source language locale code (e.g. `en`, `en-US`). |\n| \u003Ctt>\u003Cnobr>`--to LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | _required_ | Target language locale code (e.g. `cs`, `de`, `fr`). |\n| \u003Ctt>\u003Cnobr>`--text TEXT`\u003C\u002Fnobr>\u003C\u002Ftt> _(or `-t`)_ | _---_ | Translate a single piece of text. Mutually exclusive with `--input`. |\n| \u003Ctt>\u003Cnobr>`--key KEY`\u003C\u002Fnobr>\u003C\u002Ftt> | `text` | Key to use for the translated text when `--text` is provided. |\n| \u003Ctt>\u003Cnobr>`--input FILE`\u003C\u002Fnobr>\u003C\u002Ftt> | _---_ | Path to a JSON file with items to translate. Mutually exclusive with `--text`. |\n| \u003Ctt>\u003Cnobr>`--compact`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_ | Output a single-line JSON object instead of pretty-printed (only meaningful with `--input`). |\n| \u003Ctt>\u003Cnobr>`--branch NAME`\u003C\u002Fnobr>\u003C\u002Ftt> | _project default_ | Run the translation against a specific [branch](\u002Fdocs\u002Fcli\u002Fbranching). |\n\nYou must provide either `--text` or `--input` — invoking the command without one of them is an error.\n\n## Limits and rate limiting\n\nThe realtime translation endpoint is subject to per-project rate limits and per-request size limits to prevent abuse. If you need to translate large amounts of content as part of your project workflow, please contact us.\n\n## Examples\n\nTranslate a literal string and print the result:\n\n```\nlocalazy translate --from en --to cs --text \"Hello, world!\"\n```\n\nTranslate a batch from a file and store the result as JSON:\n\n```\nlocalazy translate --from en --to de --input src.json --compact > de.json\n```\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2206,"featured_icon":2207},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2213],{"id":2214,"documentation_id":2197,"languages_code":812,"slug":2201,"title":2202,"content":2204,"meta_title":2202,"meta_description":2203,"excerpt":2203},1433,[],{"id":274,"status":8,"sort":2217,"created_on":2086,"modified_on":2218,"slug":2219,"title":2220,"excerpt":2221,"content":2222,"meta_title":2220,"meta_description":2221,"pinned":15,"main_image":7,"section":2223,"subsection":2226,"cta":2227,"faq":2228,"dictionary":2260,"translations":2261,"documentation_id":274,"blog_articles":2263},"31010","2026-05-08T22:28:23.000Z","upload-reference","Upload Reference","Learn about how to configure what files to upload to the Localazy platform.","The upload section defines how to collect files that you want to upload to the Localazy platform for localization and what metadata to include. It also defines how to process uploaded data.\n\nIf you need to upload existing translations along with your source language, be sure to [learn more about it](\u002Fdocs\u002Fcli\u002Fexisting-translations) to prevent future issues.\n\n## Upload configuration\n\nYou can configure many parameters such as product flavors, build types, modules and libraries. It allows you to fit Localazy for your project. You don't need to change your project to fit the localization solution.\n\nHowever, as CLI comes with sensible defaults, the most common case is to use upload in its simplest form.\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n\n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": \"path\u002F*\u002Ffile.json\"\n  }\n\n}\n```\n\nThe full configuration of the upload section is:\n\n\n```json\n{\n\n  \"upload\": {\n    \"skipFailedAutodetection\": true,\n    \"deprecate\": \"file\",\n    \"importAsNew\": false,\n    \"forceCurrent\": false,\n    \"forceSource\": false,\n    \"filterSource\": true,\n    \"noSourceChanged\": false,\n    \"appVersion\": 0,\n    \"keySeparator\": \".\",\n    \"includeKeys\": [\"REGEX:key_.*\"],\n    \"excludeKeys\": [\"REGEX:private_.*\"],   \n    \"type\": \"json\",\n    \"features\": [\"multilingual\", \"...\"],\n    \"folder\": \"\",\n    \"files\": [\n      \u002F\u002F ...see Files configuration below ...\n    ]   \n  } \n\n}\n```\n\n| Field | Default | Description |\n| --- | --- | --- |\n| `skipFailedAutodetection` | _true_ | When set to **true** files that use [auto-detection](\u002Fdocs\u002Fcli\u002Fexisting-translations) are skipped if the auto-detection is not possible. When set to **false** an exception is raised. |\n| `deprecate` | _none_ | Tells the server to deprecate any key missing in this upload batch. Deprecated keys are still available but are not visible to translators. With value `file`, only keys missing in touched files are deprecated. With value `project`, all keys missing in this upload batch across whole project are deprecated. With default value `none`, nothing is deprecated. _Available from v1.6.0_ |\n| `deprecateMissing` | _false_ | Tells the server to deprecate any key missing in this upload batch. Deprecated keys are still available but are not visible to translators. _Deprecated - please use `deprecate=project` instead_ |\n| `importAsNew` | _false_ | Tells the server to import new phrases as unverified. Unverified phrases need to go through the review process. This option allows you to check translations using our unique review process if you are not sure of their quality. This option doesn't apply to the source language. |\n| `forceCurrent` | _false_ | Tells the server to promote changes in translated files as approved and current translations for phrases that are already translated. If set to **false**, such changes go to the review process. |\n| `forceSource` | _false_ | Tells the server to promote changes in the source language files even if there is a different version on Localazy. |\n| `filterSource` | _true_ | When set to **true**, strings that are the same as in the source language are not imported. This is important for platforms like iOS where localizable files contain the source phrase where the translation is not available. This option doesn't apply to the source language.\n| `noSourceChanged` | _false_ | When the source language changes for a phrase that is already translated, Localazy by default flags the existing translations as having a changed source so translators can review them. Use this option to suppress that flag and keep the existing translations untouched on the server. Set to **true** (or `\"all\"`) to apply to every language, **false** to keep the default behavior, or to a list of language codes (e.g. `[\"en\", \"es\"]`) — or a comma-separated string (e.g. `\"en,es\"`) — to limit the effect to specific languages only. |\n| `appVersion` | _0_ | Tells the server the version of the app in which the phrases where deprecated. It only makes sense with **deprecateMissing** switched to **true**. It allows for automatic versioning of deprecated phrases. This option can be provided on [the command-line with **-v** option](\u002Fdocs\u002Fcli\u002Fcommand-line-options).\n| `keySeparator` | _._ | The separator used for building structured keys for `includeKeys` and `excludeKeys`. See [excluding string keys](\u002Fdocs\u002Fcli\u002Fexcluding-string-keys) for more details. |\n| `includeKeys` | _[]_ | A list of rules for determining keys to include. See [excluding string keys](\u002Fdocs\u002Fcli\u002Fexcluding-string-keys) for more details. |\n| `excludeKeys` | _[]_ | A list of rules for determining keys to exclude. See [excluding string keys](\u002Fdocs\u002Fcli\u002Fexcluding-string-keys) for more details. |\n| `type` | _---_ | The type of files you are about to upload. The list of supported file formats is below. You can also defined the type separately for each of files. See Files configuration below. \n| `features` | _[]_ | The list of features (eg. how to parse plurals) to enable for the given **type**. See the list of supported file formats below for more information.\n| `folder` | _._ | The base folder all operations are relative to. It can be relative or absolute path. \n| `files` |  | Defines how to collect files for uploading and what parameters to upload along with them. See Files configuration below.  \n\n\n\n## Files configuration\n\nThe `files` contains a list of rules for collecting files for upload.\n\nYou can include files by their exact path or by using standard path wildcards `?` (single character), `*` (anything except path separator), `**` (anything including path separators).\n\nYou can control files that you want to upload with exclusion rules and [conditions](\u002Fdocs\u002Fcli\u002Fconditions).\n\n### Single file rule\n\nThis variant is useful mainly for uploading the source language only.\n\n```json\n{\n  \"upload\": {\n    \u002F\u002F ...other configuration...\n    \"files\": \"\u002Fpath\u002Fto\u002Ffile_en.json\" \n  }\n}\n```\n\nWhen the `files` is specified as string instead of array, CLI uses the string for `pattern` and inherit default values for all other fields.\n\n### Full rule configuration\n\nThe full configuration of `files` rule:\n\n```json\n{\n  \"upload\": {\n    \u002F\u002F ... other configuration ...\n\n    \"files\": {\n      \"group\": \"all-langs\", \n      \"pattern\": \"\u002Fpath\u002Fto\u002F*_en.json\",\n      \"excludes\": [ \n        \"**\u002Fprivate_*\"\n      ],\n      \"type\": \"json\",\n      \"features\": [\"multilingual\"],\n      \"conditions\": [ ... ],\n      \"lang\": \"${lang}\",\n      \"buildType\": \"debug\",\n      \"productFlavors\": \"0:gp 1:free\",\n      \"module\": \"...\",\n      \"library\": \"...\",\n      \"path\": \"...\",\n      \"file\": \"...\",\n      \"remap\": { ... }\n    }\n  \n  }\n}\n```\n\n| Field | Default | Description |\n| --- | --- | --- | \n| group | _---_ | Allows to filter rules using groups. See [groups](\u002Fdocs\u002Fcli\u002Fcommand-line-options#groups) for more information. |\n| pattern | _---_ | The pattern to use for collecting files. Standard path wildcards `?` (single character), `*` (anything except path separator), `**` (anything including path separators) are supported. |\n| excludes | _[]_ | The list of patterns used for excluding files. Standard path wildcards `?` (single character), `*` (anything except path separator), `**` (anything including path separators) are supported. |\n| type | _---_ | The type of files you are about to upload. The list of supported file formats is below. Setting this field overrides value set for the whole **upload** section. |\n| features | _[]_ | The list of features (eg. how to parse plurals) to enable for the given **type**. See the list of supported file formats below for more information. Setting this field overrides value set for the whole **upload** section. |\n| conditions | _---_ | Allows for more complex inclusion\u002Fexclusion of files. See [Conditions]() for more details. |\n| file | `${autodetectFileWithFallback}` | The file name to be used for upload. It's a good practise to clean file names. See **The important rule** below. |\n| path | `` | The path to be used for upload. It's a good practise to clean paths. See **The important rule** below. |\n| lang | _inherited_ | The language of the file being uploaded (format: ll-Scrp-RR). Special default value _inherited_ means the project's base language. |\n| buildType | _---_ | The custom build type for the file. See [Modules, libraries, flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more details. | \n| productFlavors | _---_ | The custom product flavors for the file. See [Modules, libraries, flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more details. |\n| module | _---_ | The module the file belongs to. See [Modules, libraries, flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more details. |\n| library | _---_ | The library the file belongs to. See [Modules, libraries, flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more details. |\n| remap | _---_ | Convert to different file format on upload. Refer to [Type Remapping](\u002Fdocs\u002Fcli\u002Ftype-remapping) for more details. |\n\n### Multiple rules\n\nYou can use array for `files` and combine single file rules with the full configuration rules:\n\n```json\n{\n  \"upload\": {\n    \u002F\u002F ...other configuration...\n\n    \"files\": [\n      \"\u002Fpath1\u002Fto\u002Ffile_en.json\",\n      \"\u002Fpath2\u002Fto\u002Ffile_en.json\",\n      {\n        \"type\": \"android\",\n        \"pattern\": \"\u002Fsrc\u002Fmain\u002Fvalues\u002Fstring.xml\"\n      }\n    ]\n\n  }\n}\n``` \n\n## How the upload works\n\n- The target directory is scanned for all files that match **pattern**.\n- Files that match any of the rules in **excludes** are skipped.\n- Files with [**conditions**](\u002Fdocs\u002Fcli\u002Fconditions) evaluated to **false** are skipped.\n- For each of files, all parameters are resolved - [**variables**](\u002Fdocs\u002Fcli\u002Fvariables) and [**transformations**](\u002Fdocs\u002Fcli\u002Ftransformations) are extremely important here to provide the correct data.\n- The verification process is initiated asking the server for verifying types, features, etc.\n- If the verification passes, the files are uploaded to the server in a single batch.\n- Files are processed by our server asynchronously and you are informed using the notifications on the Localazy platform.\n\n## Supported file formats\n\nWe believe that you shouldn't change your project to fit the localization solution.\n\nFor this reason, we have advanced support for formats like JSON that can handle different plural types, arrays, structured JSONs, multilingual JSONs, Mozilla i18n, etc. You can easily configure the features you need.\n\n___CLI_TYPE_TABLES___\n\n## The important rule\n\nYou shouldn't just upload files as they are. **Don't do it!** It's important to upload files correctly (eg. remove language from file's name and path) as it helps you to keep things nicely sorted and prevent future problems.\n\n**This rule is extremely important if you want to upload existing translations along with the source language. [Learn more about how to do it](\u002Fdocs\u002Fcli\u002Fexisting-translations).**\n\n## Test before uploading\n\nRun the Localazy CLI with parameter `-s` to output the list of files along with their parameters before you upload data to the Localazy platform.\n\nThis way, you are sure that everything is uploaded correctly.\n\nThe parameter `-s` switches CLI to the simulation mode - everything is processed as usual but the actual upload is not performed.\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2224,"featured_icon":2225},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2229,2236,2238,2244,2252],{"id":2230,"status":8,"title":2231,"content":2232,"slug":2233,"created_on":2111,"modified_on":2234,"owner":1855,"meta_title":7,"category":2235},115,"How can I upload POT and download PO files with Localazy CLI?","When using Localazy CLI, setting up a comfortable POT\u002FPO workflow requires some special settings, but is completely possible. Usually the source language file has a different format (POT) than files with translated strings in your project (PO). \n\nWe recommend setting two different rules for uploading:\n\n1. Upload your `messages.pot` file with `\"type\": \"pot\"` and also provide the `file` attribute to be sure that the filename is, in ideal case, something like `messages.po` to properly link your POT file to a PO file that is used for your source language internally by Localazy.\n2. To upload existing translations inside PO files, use ` \"type\": \"po\"` and provide the same file attribute again.\n\n## Example configuration\nYour upload configuration should then look like this:\n```\n\"files\": [\n  {\n    \"type\": \"pot\",\n    \"pattern\": \"source\u002Fmessages.pot\",\n    \"file\": \"message.po\"\n  },\n  {\n    \"group\": \"existing-translations\"\n    \"type\": \"po\",\n    \"pattern\": \"translations\u002F*\u002Fmessages.pot\",\n    \"file\": \"message.po\"\n  }\n]\n```","how-can-i-upload-pot-and-download-po-files-with-localazy-cli","2023-05-26T19:29:03.000Z",{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},{"id":2107,"status":8,"title":2108,"content":2109,"slug":2110,"created_on":2111,"modified_on":2112,"owner":1855,"meta_title":7,"category":2237},{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},{"id":108,"status":8,"title":2239,"content":2240,"slug":2241,"created_on":1887,"modified_on":2242,"owner":1855,"meta_title":7,"category":2243},"Is it possible to download the files to their original locations?","To download translations to their original locations, you can follow these steps. First, in the `localazy.json` configuration file and go to the download section. In this section, configure where you want to download your translations.\n\nFor a smoother process, ensure that you include the \"path\" parameter during the upload and use the same variable in the download section. Here's an example of how to do it:\n\n```\n\"upload\": {\n  \"files\": [\n    {\n      \"pattern\": \"src\u002F**\u002Flocale\u002Fen.ts\",\n      \"lang\": \"inherited\",\n      \"path\": \"${path}\"\n    }\n  ]\n},\n\n\"download\": {\n  \"files\": [\n    {\n      \"output\": \"${path}\u002F${lang}.ts\"\n    }\n  ]\n}\n```\n\nBy setting the \"path\" parameter correctly, the translations will be downloaded to the respective locations specified in your `localazy.json` configuration file.","is-it-possible-to-download-the-files-to-their-original-locations-with-the-updated-translations","2025-12-03T07:42:46.000Z",{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},{"id":2245,"status":8,"title":2246,"content":2247,"slug":2248,"created_on":2249,"modified_on":2250,"owner":2121,"meta_title":7,"category":2251},292,"Why are some keys in a JSON object missing from the downloaded files?","You might encounter a situation, when not all keys that are a part of the same structure get downloaded from your Localazy project. Most likely, the issue here is that you have the key both as a single text and also as a structure.\n\nThis often happens when you first create a key and later decide to actually change it to an object with multiple subkeys.\n\nSo at first, you create a key, e.g.: `user.welcome` with text \"This is a welcome text.\"\n\nBut then, you decide you want to use a structure such as: \n- `user.welcome.text` => \"This is a welcome text.\"\n- `user.welcome.title` => \"Welcome title\"\n\nSupposed it is a nested JSON, then you can't have both:\n\n```\n{\n\"user.welcome\": \"This is a welcome text.\",\n}\n```\n\nand at the same time use:\n\n```\n{\n\"user.welcome\": {\n\"text\": \"This is a welcome text\",\n\"title\": \"Welcome title\"\n}\n}\n```\nBecause the same key can not be an object and a text at the same time.\n\nIn the future, you can simply prevent this, by using deprecating during upload so old keys are automatically marked as deprecated when they are no longer part of the uploaded file. In your CLI configuration, set `deprecate` to value `project`, and all keys missing in the upload batch across whole project will be deprecated.\n\n\n\n","why-are-some-keys-in-a-json-object-missing-from-the-downloaded-files","2023-09-18T09:19:05.000Z","2025-10-27T13:27:30.000Z",{"id":291,"status":8,"created_on":1277,"sort":7,"slug":521,"label":522,"on_faq_index":15},{"id":2253,"status":8,"title":2254,"content":2255,"slug":2256,"created_on":2257,"modified_on":2258,"owner":2121,"meta_title":7,"category":2259},313,"Is it possible to manage multiple folders in one Localazy project?","Yes, absolutely. You can have multiple files in different folders uploaded to the same project. \n\nYou can include files by their exact path or by using standard path wildcards `?` (single character), `*` (anything except path separator), `**` (anything including path separators).\n\nYou can control files you want to upload with exclusion rules and [conditions](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fconditions).\n\nExample:\n\n``` \n  \"upload\": {\n    \"type\": \"json\",\n    \"files\": \"modules\u002F**\u002Fen.json\"\n  }\n \n}\n```\nThe above configuration will scan for files named en.json in all subfolders of the modules folder.\n ","is-it-possible-to-manage-multiple-folders-in-one-localazy-project","2023-12-11T09:41:08.000Z","2025-10-30T12:34:28.000Z",{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},[],[2262],{"id":274,"documentation_id":274,"languages_code":812,"slug":2219,"title":2220,"content":2222,"meta_title":2220,"meta_description":2221,"excerpt":2221},[],{"id":406,"status":8,"sort":2265,"created_on":2086,"modified_on":2266,"slug":2267,"title":2268,"excerpt":2269,"content":2270,"meta_title":2268,"meta_description":2271,"pinned":15,"main_image":7,"section":2272,"subsection":2275,"cta":2276,"faq":2277,"dictionary":2292,"translations":2293,"documentation_id":406,"blog_articles":2295},"31020","2025-10-06T17:33:28.000Z","download-reference","Download Reference","Learn how to configure where to store your translated files.","The download section defines where to store translated files.\n\n[**There are a lot of variables**](\u002Fdocs\u002Fcli\u002Fvariables) for the download section that you can use for building the output path and file.  \n\n\n## Single output rule \n\nFor each of the translated files, the output path is generated using the pattern `\u002Fpath\u002F${lang}\u002F${file}`. \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n\n  \"download\": {\n    \"files\": \"\u002Fpath\u002F${lang}\u002F${file}\"\n  }\n\n}\n```\n\n## Full output configuration \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n\n  \"download\": {\n    \"folder\": \"output\u002Fpath\",\n    \"metadataFileJson\": \"meta.json\",\n    \"metadataFileJs\": \"meta.js\",\n    \"metadataFileTs\": \"meta.ts\",\n    \"includeSourceLang\": false,\n    \"excludedLangs\": [\"cs\", \"de\"],\n    \"langAliases\": {\n      \"zh-Hant-TW\": \"zh-TW\"\n    },\n    \"langExpansions\": {\n      \"de\": [\"de-DE\", \"de-CH\"]\n    },\n    \"files\": {\n      \"group\": \"all\",\n      \"conditions\": [ ... ],\n      \"stop\": true,\n      \"changeExtension\": \"json\",\n      \"output\": \"path\u002F${lang}\u002F${file}\"\n    }   \n  }\n\n}\n```\n\n| Field | Default | Description |\n| --- | --- | --- |\n| `folder` | _._ | The base folder all operations are relative to. It can be a relative or absolute path. |\n| `metadataFileJson` | _---_ | The path\u002Ffile to generate [metadata in JSON format](\u002Fdocs\u002Fcli\u002Fmetadata-file) with the list of available languages |\n| `metadataFileJs` | _---_ | The path\u002Ffile to generate [metadata in Javascript format](\u002Fdocs\u002Fcli\u002Fmetadata-file) with the list of available languages and plural rules |\n| `metadataFileTs` | _---_ | The path\u002Ffile to generate [metadata in Typescript format](\u002Fdocs\u002Fcli\u002Fmetadata-file) with the list of available languages and plural rules |\n| `includeSourceLang` | _false_ | By default, the source language is not processed, only translated files are. |\n| `excludedLangs` | _[]_ | The list of languages to exclude from processing. |\n| `langAliases` | _---_ | Maps languages to different ones. |\n| `langExpansions` | _---_ | Adds additional languages to output; the same file will be saved several times. |\n| `files` | _[]_ | The rules to apply to all translated files. |\n| `files.group` | _---_ |  Allows to filter rules using groups. See [groups](\u002Fdocs\u002Fcli\u002Fcommand-line-options#groups) for more information. |\n| `files.conditions` | _[]_ | Allows for more complex filtering of rules. See [conditions](\u002Fdocs\u002Fcli\u002Fconditions) for more details. |\n| `files.stop` | _true_ | If **true**, no more rules are processed for the given file. Only makes sense if more output rules are defined. By default, the first matching rule stops processing for the file. |\n| `files.changeExtension` | _---_ | If defined, change the extension of the output file. Applied to the final output after resolving all variables. |\n| `files.output` | _---_ | The pattern for generating output path and file. Use [variables](\u002Fdocs\u002Fcli\u002Fvariables) to build the pattern. |\n\n## Multiple output rules \n\nYou can use an array for `files` and combine single output rules with full output configurations:\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n\n  \"download\": {\n    \u002F\u002F ..\n    \"files\": [\n      \"path1\u002F${lang}\u002F${file}\",\n      {\n        \"conditions\": [ ... ],\n        \"stop\": true,\n        \"output\": \"path2\u002F${lang}\u002F${file}\"\n      }\n    ]   \n  }\n\n}\n``` \n    \nWhen more rules are defined, each of the translated files goes through all of them. \n\nYou can store all or some of the files in multiple locations. When using more rules, [**conditions**](\u002Fdocs\u002Fcli\u002Fconditions) and **stop** are useful concepts.\n\n## How download works\n\n- Your files are downloaded from our servers.\n- Each of the files goes through all the rules in the order defined in the `files` section. \n- Rules with [**conditions**](\u002Fdocs\u002Fcli\u002Fconditions) evaluated to **false** are skipped.\n- When the rule is valid ([**conditions**](\u002Fdocs\u002Fcli\u002Fconditions) are evaluated to **true**) and **stop** is **true**, no more rules are processed. \n \n## Example with more output locations\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n\n  \"download\": {\n    \u002F\u002F ..\n    \"files\": [\n\n      {\n        \"stop\": false,\n        \"output\": \"backup\u002F${lang}\u002F${file}\"\n      },\n      \n      {\n        \"conditions\": \"!empty: ${scriptCode}\",\n        \"stop\": true\n      },\n\n      {\n        \"conditions\": \"!empty: ${regionCode}\",\n        \"stop\": true,\n        \"output\": \"withRegion\u002F${langLsrUnderscore}\u002F${file}\"\n      },\n\n      \"withLang\u002F${lang}\u002F${file}\"\n\n    ]   \n  }\n\n}\n``` \n\n- All files are stored using `backup\u002F${lang}\u002F${file}` pattern, and the processing is not stopped and continue.\n- If the locale of the given file contains script code, the processing is stopped.\n- If the locale of the given file contains region code, it's saved using `withRegion\u002F${langLsrUnderscore}\u002F${file}` pattern, and the processing is stopped.\n- All other files are stored using `withLang\u002F${lang}\u002F${file}`\n\n## Missing translations\n\nWhen you generate an output file using Localazy, it will use the source language as a fallback if a translation is missing in the target language. This helps prevent missing keys that could cause crashes in some frameworks.\n\nIf you want to disable this fallback feature, you can add `filter_untranslated` to the **features** section in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) and reupload your source language file. Note that this feature may not be available for all file formats, so check their documentation for details.\n\nNote that in order to download a file with fallback translations, the target language must have **at least one** translation present. If there are no translations, the language won't appear in the output.\n\n## Test before download \n\nDownloaded files **overwrite** any existing files. Be careful before you proceed!\n\nRun the Localazy CLI with parameter `-s` to output the list of files that are about to be written before you download and store translated files.\n\nThis way, you are sure everything is stored correctly, and you are not about to mess your project.   \n\nThe parameter `-s` switches CLI to the simulation mode - everything is processed as usual, but the actual storing is not performed.\n\n```\nlocalazy download -s\n```\n\n## Listing files on server\n\nTo list all files for the given project, you can run `localazy list` with the minimal configuration:\n\n```json\n{\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\"\n}\n```\n\n","Learn about how to configure where to store your translated files.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2273,"featured_icon":2274},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2278,2280,2282],{"id":2107,"status":8,"title":2108,"content":2109,"slug":2110,"created_on":2111,"modified_on":2112,"owner":1855,"meta_title":7,"category":2279},{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},{"id":108,"status":8,"title":2239,"content":2240,"slug":2241,"created_on":1887,"modified_on":2242,"owner":1855,"meta_title":7,"category":2281},{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},{"id":2283,"status":8,"title":2284,"content":2285,"slug":2286,"created_on":2287,"modified_on":2288,"owner":2121,"meta_title":7,"category":2289},231,"Why is the order of keys with translations alphabetized in the downloaded files?","Localazy doesn't store the order in which your keys are sorted inside the files you upload. Our parsers extract the keys, and the files are reconstructed upon downloading them. This allows you to manage the keys and convert your files to other formats. Ordering keys by alphabet is consistent and shouldn't break any project. \n\nWhile we don't recommend the following approach, you can add a numbered prefix to your key names if you really need to keep the keys in a particular order. E.g., `cancel_button` ➡️ `001_cancel_button`and so on. This way, you can be in control of the order in which keys are exported.","why-is-the-order-of-keys-with-translations-alphabetized-in-the-downloaded-files","2022-12-13T10:49:44.000Z","2023-05-26T19:29:54.000Z",{"id":369,"status":8,"created_on":2287,"sort":7,"slug":2290,"label":2291,"on_faq_index":17},"localazy-files","File Management",[],[2294],{"id":406,"documentation_id":406,"languages_code":812,"slug":2267,"title":2268,"content":2270,"meta_title":2268,"meta_description":2271,"excerpt":2269},[],{"id":2297,"status":8,"sort":2298,"created_on":1856,"modified_on":2299,"slug":433,"title":429,"excerpt":2300,"content":2301,"meta_title":429,"meta_description":2300,"pinned":15,"main_image":7,"section":2302,"subsection":2305,"cta":7,"faq":2306,"dictionary":2324,"translations":2325,"documentation_id":2297,"blog_articles":2327},83,"31030","2025-02-17T14:49:50.000Z","Learn how to convert localizable files between different formats easily with Localazy CLI.","You can convert translated files between different formats by including `conversion` section in your `localazy.json` file.\nYou can also filter content, change how plurals and string arrays are stored, convert files to multilingual ones, etc. \nThe `conversion` section behaves similarly to the [`download` section](\u002Fdocs\u002Fcli\u002Fdownload-reference) and you can use the same [variables](\u002Fdocs\u002Fcli\u002Fvariables).\n\nIf you need to convert between different file types on upload, refer to [Type Remapping](\u002Fdocs\u002Fcli\u002Ftype-remapping).\n\n## Running conversions\nConversions are processed along with downloading when `localazy download` is invoked.\nIf you only need to perform conversions, you can omit the `download` section in your configuration file. \nAlso, you can use groups to process download\u002Fconversions separately. \n\n\n## Full configuration\n\n```json\n{\n  \"conversion\": {\n    \"folder\": \".\",\n    \"excludedLangs\": [\"cs\", \"de\"],\n    \"actions\": {\n      \"group\": \"conversion\",\n      \"stop\": false,\n      \"conditions\": [ ... ],\n      \"changeExtension\": \"xml\",\n      \"output\": \"path\u002F${lang}\u002F${file}\",\n      \"type\": \"json\",\n      \"keySeparator\": \".\",\n      \"includeKeys\": [\"REGEX:key_.*\"],\n      \"excludeKeys\": [\"REGEX:private_.*\"],   \n      \"replacements\": {\n        \"%d\": \"{{placeholder}}\",\n        \"REGEX:\\\\(([a-Z]+))\": \"{{(%1%)}}\"\n      },\n      \"langAliases\": {\n        \"zh-Hant-TW\": \"zh-TW\"\n      },\n      \"langExpansions\": {\n        \"de\": [\"de-DE\", \"de-CH\"]\n      },            \n      \"arrayType\": \"array_br\",\n      \"pluralType\": \"plural_icu\",\n      \"forceArrayType\": false,\n      \"forcePluralType\": true,\n      \"filterStrings\": false,\n      \"filterArrays\": false,\n      \"filterPlurals\": false,      \n      \"params\": {\n        \"variable\": \"COUNT\"\n      }\n    }\n  }\n}\n```\n\n| Field | Default | Description |\n| --- | --- | --- |\n| `folder` | _._ | The base folder all operations are relative to. It can be a relative or absolute path. |\n| `excludedLangs` | _[]_ | The list of languages to exclude from processing. |\n| `actions.group` | _---_ |  Allows to filter rules using groups. See [groups](\u002Fdocs\u002Fcli\u002Fcommand-line-options#groups) for more information. |\n| `actions.stop` | _false_ | If **true**, no more rules are processed for the given file. Only makes sense if more output rules are defined. By default, all rules are processed (contrary to the download section). |\n| `actions.conditions` | _[]_ | Allows for more complex filtering of rules. See [conditions](\u002Fdocs\u002Fcli\u002Fconditions) for more details. |\n| `actions.changeExtension` | _---_ | If defined, change the extension of the output file. Applied to the final output after resolving all variables. |\n| `actions.output `| _---_ | The pattern for generating output path and file. Use [variables](\u002Fdocs\u002Fcli\u002Fvariables) to build the pattern. |\n| `actions.type` | _required_ | The type of the conversion to be performed with files. See below for available types and their parameters. |\n| `actions.keySeparator` | _._ | The separator used for building structured keys for `includeKeys` and `excludeKeys`. See [excluding string keys](\u002Fdocs\u002Fcli\u002Fexcluding-string-keys) for more details. |\n| `actions.includeKeys` | _[]_ | A list of rules for determining keys to include. See [excluding string keys](\u002Fdocs\u002Fcli\u002Fexcluding-string-keys) for more details. |\n| `actions.excludeKeys` | _[]_ | A list of rules for determining keys to exclude. See [excluding string keys](\u002Fdocs\u002Fcli\u002Fexcluding-string-keys) for more details. |\n| `actions.replacements` | _{}_ | Define rules for text changes and placeholder replacements. Please see the dedicated chapter below. |\n| `actions.langAliases` | _---_ | Maps languages to different codes. |\n| `actions.langExpansions` | _---_ | Adds additional languages to output; the same file will be saved several times. |\n| `actions.arrayType` | _---_ | If the type supports more formats for string arrays, you can select the desired one with this parameter. See the **Array types** section for each format below. | \n| `actions.pluralType` | _---_ | If the type supports more formats for plurals, you can select the desired one with this parameter.  See the **Plural types** section for each format below.| \n| `actions.forceArrayType` | _false_ | If the conversion is made between types that support the same format for string arrays, the format is retained unless you explicitly set this parameter to **true** to force change. |\n| `actions.forcePluralType` | _false_ | If the conversion is made between types that support the same format for plurals, the format is retained unless you explicitly set this parameter to **true** to force change. |\n| `actions.filterStrings` | _null_ | If the conversion type allows filtering, you can enable this option to filter strings out of the output file. |\n| `actions.filterArrays` | _null_ | If the conversion type allows filtering, you can enable this option to filter string arrays out of the output file. |\n| `actions.filterPlurals` | _null_ | If the conversion type allows filtering, you can enable this option to filter plurals out of the output file. |\n| `actions.params` | _{}_ | Additional parameters for the conversion type, plural and array formats. See the **Parameters** section for each format below. |\n\n## Multiple conversion rules\n\nYou can use an array for `actions` to provide more conversion rules.\n\n```json\n{\n  \"conversion\": {\n    \"actions\": [\n      {\n        \"type\": \"android\",\n        \"output\": \"path\u002Fto\u002Fandroid\u002Ffiles\u002F${lang}\u002F${file}\"\n      },\n      {\n        \"type\": \"ios-strings\",\n        \"output\": \"path\u002Fto\u002Fios\u002Ffiles\u002F${lang}\u002F${file}\"\n      }\n    ]\n  }\n}\n```\n\nWhen more rules are defined, each of the files goes through all of them.\n\nYou can store all or some of the converted files in multiple locations. When using more rules, [conditions]() and **stop** are useful concepts.\n\n\n## How conversion works\n\n- Your files are downloaded from our servers.\n- Each of the files goes through all the conversion rules.\n- Rules with conditions evaluated to `false` are skipped.\n- When the rule is valid (conditions are evaluated to `true`) and stop is `true`, no more rules are processed.\n- If the rule is valid, converted file is requested from the server and stored to the desired location.\n\n\n## Example conversion\n\n```json\n{\n  \"conversion\": {\n    \"actions\": {\n      \"group\": \"convert-files\",\n      \"output\": \"converted\u002F${file}\",\n      \"conditions\": \"startWith: ios_, ${file}\",\n      \"changeExtension\": \"json\",\n      \"type\": \"json-multilingual\",\n      \"pluralType\": \"plural_icu\",\n      \"forcePluralType\": true,\n      \"filterArray\": true,\n      \"params\": {\n        \"variable\": \"COUNT\"\n      }\n    }\n  }\n}\n```\n\n- The example code above is executed only when `localazy download convert-files` command is invoked.\n- It applies only to files with name starting with `ios_`.\n- Files are converted to multilingual JSON and stored to `converted\u002F${file}`.\n- The extension for such files is changed to **json**, so e.q. `ios_main_menu.xml` is stored as `ios_main_menu.json`.\n- All plurals are forced to be in `plural_icu` format with the variable being `COUNT` (specified by `params`).\n- All string arrays are filtered out. \n\n## Text changes & placeholder replacements\n\nUsing `actions.replacements`, you can replace text while converting your files. It's a convenient way how to adapt, e.q., placeholders and platform-specific texts.\n\nAll the replacement rules are applied to all texts. \n\nThere are two different ways how to define rules:\n\n### Simple replacements\n\n```\n\"replacements\": {\n  \"source\": \"target\"\n}\n```\n\nReplace substrings `source` to `target`. The replacement is case-sensitive.\n\n### Regex replacements\n\n```\n\"replacements\": {\n  \"REGEX:pre-(.*)-fix\": \"target: (%1%)\"\n}\n```\n\nReplace substrings matching regex pattern `pre-(.*)-fix` with `target: (%1%)` where `(%1%)` is special placeholder that references matched group from the regex.\n\nYou can use `(%1%)`, `(%2%)`, ... to use matched groups in the replacement. You can use `(%0%)` to use the whole matching substring. \n\nYou can use `(%i%)` for zero-based and `(%o%)` for one-based index of the replaced text. E.g., using something like `\"REGEX:...\": \"$(%o%)%s\"`, you can replace placeholders for Android strings XML making them positional. \n\n## Important note\n\nStored files overwrite any of existing files. Be careful!\n\n## Test before storing\n\nRun the Localazy CLI with parameter `-s` to output the list of files that are about to be written. This way, you are sure everything is stored correctly, and you are not about to mess your project.\n\nThe parameter `-s` switches CLI to the simulation mode – everything is processed as usual, but the output files are not written to disk.\n\n\u003C!-- DONT CHANGE THE BLOCK BELOW - IT'S AUTOGENERATED. -->\n\n___CLI_FORMAT_CONVERSIONS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2303,"featured_icon":2304},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[2307,2314],{"id":291,"status":8,"title":2308,"content":2309,"slug":2310,"created_on":1887,"modified_on":2311,"owner":1855,"meta_title":7,"category":2312},"Which localizable file format conversions do you support?","Localazy supports all major format conversions from Android XML and iOS .strings through multilingual JSON to XLIFF, qt-ts, and many more formats. You can [learn more about supported file format conversions in the documentation](\u002Fdocs\u002Fcli\u002Fformat-conversions).","which-localizable-file-format-conversions-do-you-support","2023-05-26T19:28:09.000Z",{"id":94,"status":8,"created_on":2104,"sort":7,"slug":2313,"label":212,"on_faq_index":17},"advanced-features",{"id":2315,"status":8,"title":2316,"content":2317,"slug":2318,"created_on":2319,"modified_on":2320,"owner":2121,"meta_title":7,"category":2321},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",{"id":5,"status":8,"created_on":2104,"sort":5,"slug":2322,"label":2323,"on_faq_index":17},"android-integration","Android integration",[],[2326],{"id":2297,"documentation_id":2297,"languages_code":812,"slug":433,"title":429,"content":2301,"meta_title":429,"meta_description":2300,"excerpt":2300},[],{"id":2329,"status":8,"sort":2330,"created_on":2331,"modified_on":2332,"slug":2333,"title":2334,"excerpt":2335,"content":2336,"meta_title":2334,"meta_description":2335,"pinned":15,"main_image":7,"section":2337,"subsection":2340,"cta":7,"faq":2341,"dictionary":2342,"translations":2343,"documentation_id":2329,"blog_articles":2346},229,"31032","2024-03-19T19:22:51.000Z","2024-07-17T06:49:25.000Z","type-remapping","Type Remapping","Learn how to convert localizable files when uploading them easily with Localazy CLI.","Type remapping allows uploading files and converting them to different file types.\n\nIf you need to convert between different file types on download, refer to [Format Conversions](\u002Fdocs\u002Fcli\u002Fformat-conversions).\n\n## Use Case\n\nType remapping is useful when migrating from old file formats or uploading existing translations only available in a file with a different format.\n\n## How It Works\n\nThe file is uploaded to Localazy servers using the type provided in the upload rule and is parsed using the corresponding parser.\n\nExtracted keys are processed and adapted by type remapping and imported as a file with a different type.\n\n## The Configuration\n\nType remapping is part of the [upload's file rule](\u002Fdocs\u002Fcli\u002Fupload-reference):\n\n```json\n{\n  \"upload\": {\n    \"files\": {\n      \"type\": \"csv\",\n\t  \"file\": \"existing_file.json\",\n      \"lang\": \"de\",\n      \"remap\": {\n        \"type\": \"json\",\n        \"flatten\": \".\",\n        \"nest\": \".\",\n        \"plural\": \"object\",\n        \"array\": \"array\"\n      }\n    }\n  \n  }\n}\n```\n\n\n| Field     | Default | Description                                                                                                                                                    |\n| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`    | -       | The target type the file is required to be converted to. Required property.                                                                                    |\n| `flatten` | -       | Text used as a separator for converting nested keys to flatten ones. Optional. If not provided, nested keys are not flattened.                                 |\n| `nest`    | -       | Text used as a separator for changing keys to nested ones. Optional. If not provided, keys are not changed in any way.                                         |\n| `plural`  | -       | Optional specification of plural type to be used. Must be supported by the target format. If not provided, plurals are converted to the type's default format. |\n| `array`   | -       | Optional specification of array type to be used. Must be supported by the target format. If not provided, arrays are converted to the type's default format.   |\n\n## Available Types\n\nIn Localazy, the file is identified not only by its path and file name, but also by its type, so you have to select the correct type if using type remapping to upload content to an existing file.\n\n**Available types:**\n\n___CLI_REMAP_TYPES___\n\n## Example\n\nLet's assume that we have a  simple JSON file `en.json`:\n\n```json\n{ \n\t\"key_1\": { \n\t\t\"key_11\": { \n\t\t\t\"key_111\": \"Key 111 (nested)\" \n\t\t} \n\t}, \n\t\"key2\": \"Key 2\", \n\t\"key3\": \"Key 3\" \n}\n```\n\nIt can be easily uploaded by a simple CLI configuration:\n\n```json\n{\n\t\"writeKey\": \"---\",\n\t\"readKey\": \"---\",\n\t\"upload\": {\n\t\t\"files\": {\n\t\t\t\"type\": \"json\",\n\t\t\t\"pattern\": \"en.json\", \n\t\t\t\"file\": \"remap_test_file.json\", \n\t\t\t\"lang\": \"en\", \n\t\t\t\"path\": \"\"\n\t\t} \n\t} \n}\n```\n\nWe have old CSV-based translations to the Czech language:\n\n```csv\nkey;cs\nkey_1->key_11->key_111;Klic 111 (vnořený)\nkey2;CS: Klic 2\nkey3;CS: Klic 3\n```\n\nWith the following configuration, we can upload this CSV file and convert it to JSON. Localazy will correctly add content as translations to the JSON file we uploaded before.\n\nAs we defined `nest` property, the key `key_1->key_11->key_111` will be correctly nested creating desired structure to match our JSON. \n\n```json\n{\n  \"writeKey\": \"---\",\n  \"readKey\": \"---\",\n  \"upload\": {\n    \"files\": {\n      \"type\": \"csv\",\n      \"features\": [\"delimiter_semicolon\"],\n      \"pattern\": \"cs.csv\",\n      \"file\": \"remap_test_file.json\",\n      \"lang\": \"cs\",\n      \"path\": \"\",\n      \"remap\": {\n        \"type\": \"json\",\n        \"nest\": \"->\"\n      }\n    }\n  }\n}\n```\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2338,"featured_icon":2339},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[],[],[2344],{"id":2345,"documentation_id":2329,"languages_code":812,"slug":2333,"title":2334,"content":2336,"meta_title":2334,"meta_description":2335,"excerpt":2335},227,[],{"id":1568,"status":8,"sort":2348,"created_on":1856,"modified_on":2349,"slug":2350,"title":2351,"excerpt":2352,"content":2353,"meta_title":2351,"meta_description":2352,"pinned":15,"main_image":7,"section":2354,"subsection":2357,"cta":2358,"faq":2359,"dictionary":2392,"translations":2393,"documentation_id":1568,"blog_articles":2395},"31035","2024-08-17T16:32:01.000Z","release-tags","Release Tags","Learn how to maintain several releases of your translations, and how to merge and manipulate them. ","The Release Tags feature allows for maintaining multiple existing releases simultaneously in a similar way as known, e.q., from `Docker`.\n\nLocalazy also comes with extensive functionality for merging and manipulating existing tags.\n\n## Latest tag\n\nAll changes are automatically published as the so-called `latest` tag\u002Fversion. \n\nCommands like `localazy download`, `localazy list`, and `localazy cdn` work with the `latest` version by default if not explicitly specified otherwise. \n\nUsing the latest ever-changing version in a production or staging environment may not be a good idea, and here come release tags to help. \n\n## Publish release tag\n\nInvoke `localazy tag publish staging` to create a new tag named `staging`. \n\nThe current state of your project is published under this tag and is accessible by invoking, e.q., `localazy download -t staging`.\n\nNo matter of changes made, the content under this tag is kept unchanged unless you call `localazy tag publish staging` again (or use merging or promoting tags).\n\n## Promoting tags\n\nWhile translators and contributors actively translate your project to more languages, you can test your `staging` tag, and promote it to production by invoking:\n\n`localazy tag promote staging production` or `localazy tag promote staging v1.0` \n\nPromoting tag overwrites the old tag or creates a new one and publishes the state from the source tag to it by re-running the whole publishing chain. \n\nIt's possible to promote the tag to itself which effectively re-run the publishing process. This is useful when improvements to our parsers and producers are introduced.\n\n## Listing, renaming, deleting tags\n\nTo list all available tags for your project, invoke: \n\n`localazy tag list`\n\nYou can rename tags with:\n\n`localazy tag rename {old-tag} {new-tag}`\n\nAnd you can also delete them with:\n\n`localazy tag delete {tag-name}`\n\n## Merging and manipulating tags\n\nMerging tags allows you to apply translations from the source tag to the target tag. The result of the operation is stored as the output tag. \n\nAs it's highly configurable, you can use it to manipulate the content of the tag - add, remove and change keys and languages. \n\nThe invocation of the command has this scheme: \n\n`localazy tag merge [parameters] source-tag target-tag output-tag`\n\nYou can use the same tag both for `source-tag` and `target-tag` to manipulate the content only. Also, you can use `latest` as the source or target to work with the current published translations. \n\n### Parameters\n\nWith parameters, you can configure what you want merging to do with your translations and languages:\n\n| Parameter | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>`--mode MODE`\u003C\u002Fnobr>\u003C\u002Ftt> | Merge mode; default: missing; see below |\n| \u003Ctt>\u003Cnobr>`--no-arrays-checks`\u003C\u002Fnobr>\u003C\u002Ftt> | Merge string arrays even if the merged item doesn't have the same number of elements as the target tag's source language item |\n| \u003Ctt>\u003Cnobr>`--different-sources`\u003C\u002Fnobr>\u003C\u002Ftt> | By default, only items with the same source language content for both source and target tag are merged; with this option you can disable this behavior |\n| \u003Ctt>\u003Cnobr>`--add-keys`\u003C\u002Fnobr>\u003C\u002Ftt> | Add string keys missing in the target tag but existing in the source tag |\n| \u003Ctt>\u003Cnobr>`--remove-keys`\u003C\u002Fnobr>\u003C\u002Ftt> | Remove string keys not existing in the source tag |\n| \u003Ctt>\u003Cnobr>`--key KEY`\u003C\u002Fnobr>\u003C\u002Ftt> | Key to merge; can be used multiple times to specify more keys; if not present, all keys are merged |\n| \u003Ctt>\u003Cnobr>`--key-level-separator`\u003C\u002Fnobr>\u003C\u002Ftt> | String used as separator for structured keys; default: '.' |\n| \u003Ctt>\u003Cnobr>`--file FILE`\u003C\u002Fnobr>\u003C\u002Ftt> | File to merge (e.g. `path1\u002Fpath2\u002Ftest.json`); can be used multiple times to specify more files; if not present, all files are merged |\n| \u003Ctt>\u003Cnobr>`--remove-unlisted-keys`\u003C\u002Fnobr>\u003C\u002Ftt> | Remove keys not listed using the `--key` option |\n| \u003Ctt>\u003Cnobr>`--rename-keys`\u003C\u002Fnobr>\u003C\u002Ftt> | Rename keys if the key is different. E.g., when the name is changed on Localazy after the tag creation. |\n| \u003Ctt>\u003Cnobr>`--no-key-prefix`\u003C\u002Fnobr>\u003C\u002Ftt> | Don't use `p:` and `a:` for prefixing plurals and string arrays for the `--key` option |\n| \u003Ctt>\u003Cnobr>`--update-project`\u003C\u002Fnobr>\u003C\u002Ftt> | Use project information from the source tag; by default, keep information from the target tag |\n| \u003Ctt>\u003Cnobr>`--update-meta`\u003C\u002Fnobr>\u003C\u002Ftt> | Update meta information for string keys; meta information stores additional data for arrays and plurals |\n| \u003Ctt>\u003Cnobr>`--update-languages`\u003C\u002Fnobr>\u003C\u002Ftt> | Change publish\u002Fhidden state for languages using information from the source tag |\n| \u003Ctt>\u003Cnobr>`--add-languages`\u003C\u002Fnobr>\u003C\u002Ftt> | Add languages missing in the target tag but existing in the source tag |\n| \u003Ctt>\u003Cnobr>`--languages LANGS`\u003C\u002Fnobr>\u003C\u002Ftt> | Comma-separated list of languages to merge; if not present, all languages in the target tag are merged |\n| \u003Ctt>\u003Cnobr>`--remove-unlisted-languages`\u003C\u002Fnobr>\u003C\u002Ftt> | Remove languages not listed in the `--languages` option |\n| \u003Ctt>\u003Cnobr>`--remove-missing-languages`\u003C\u002Fnobr>\u003C\u002Ftt> | Remove languages missing in the source tag |\n| \u003Ctt>\u003Cnobr>`--publish-languages LANGS`\u003C\u002Fnobr>\u003C\u002Ftt> | Comma-separated list of languages to change state to published (and not hidden) |\n| \u003Ctt>\u003Cnobr>`--unpublish-languages`\u003C\u002Fnobr>\u003C\u002Ftt> | Comma-separated list of languages to change state to unpublished |\n\n#### Merge modes\n\n| Mode | Description |\n| --- | --- |\n| none | Do not merge keys at all; useful for manipulating languages |\n| missing | Merge only strings that are untranslated in the target tag; never touch the source language |\n| update | Overwrite all translations in the target tag; never touch the source language |\n| overwrite | Overwrite all strings including the source language |\n\n**Please keep in mind:**\n- merging is limited to allowed keys and languages\n- by default, languages existing in the source tag that are not available in the target tag are not merged nor added\n- by default, only strings with the same source language content for both source and target tags are merged (don't apply for the `overwrite` mode)\n\n### Examples\n\nAdd missing translations from the `source` tag to the `target` tag and store as the `output` tag:\n\n`localazy merge source target output`\n\nAdd language `de` from `source` that is missing in `target`:\n\n`localazy merge --add-languages --languages de source target output`\n\nRemove all languages and keep only `cs`, `de` and `en`:\n\n`localazy merge --languages cs,de,en --remove-unlisted-languages target target output`\n\nUpdate all translations using the latest version:\n\n`localazy merge --mode update latest target output`\n\nFix invalid translation of the `my_key` key in the `path\u002Ftest.json` file in the `cs` language:\n\n`localazy merge --mode update --file path\u002Ftest.json --key my_key --languages cs latest target output`\n\nUnpublish language `cs`:\n\n`localazy merge --mode none --unpublish-languages `cs` target target output`\n\nAdd `my_key` from `source` that is missing in `target`:\n\n`localazy merge --add-keys --key my_key source target output`\n\nIf the key is renamed on Localazy, it's not automatically renamed during the merge. You can rename it using:\n\n`localazy merge --rename-keys source target output`\n\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2355,"featured_icon":2356},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2360,2367,2376,2384],{"id":2361,"status":8,"title":2362,"content":2363,"slug":2364,"created_on":2111,"modified_on":2365,"owner":1855,"meta_title":7,"category":2366},139,"How to create and manage Releases?","Once you subscribe to one of our [paid plans](\u002Fcompare-plans) and activate the Releases feature, you can start using new commands in the [Localazy CLI tool](\u002Fdocs\u002Fcli\u002Fthe-basics) to create and manage tags for your translations or navigate to the Releases page under the Tools section in the menu to manage your releases inside the Localazy platform.\n\n> Learn more about [Release Tags management with Localazy CLI](\u002Fdocs\u002Fcli\u002Frelease-tags)\n> Learn more about [manging Releases with Localazy](\u002Fdocs\u002Fgeneral\u002Freleases)","how-to-create-and-manage-release-tags","2023-08-04T09:58:30.000Z",{"id":132,"status":8,"created_on":1890,"sort":7,"slug":2350,"label":2351,"on_faq_index":15},{"id":2368,"status":8,"title":2369,"content":2370,"slug":2371,"created_on":2372,"modified_on":2373,"owner":2374,"meta_title":7,"category":2375},326,"Who can create Releases?","**The ability to create Releases** is available only for project **Owners**. This is to ensure that the release process, which is a critical aspect of managing a localization project, is handled by authorized individuals. This helps maintain the integrity and consistency of the project. \n\nOnce you subscribe to one of the paid plans and activate the Releases feature, you obtain access to new commands in the CLI tool. These commands allow you to create and manage tags for your translations, providing you with greater control over the versioning of your localized content.\n\nHowever, the functionality isn’t limited to just the CLI tool. You can also manage your releases directly inside the platform by navigating to the Releases page under the Tools section in the menu. This provides a visual interface for managing releases, making it more accessible for non-technical team members to participate in the release process. \nThis dual approach ensures that all team members, regardless of their technical proficiency, can effectively participate in the release process.\n\n> Explore more about [Releases feature in our documentation](\u002Fdocs\u002Fgeneral\u002Freleases)","who-can-create-releases","2024-05-09T02:34:10.000Z","2024-05-09T03:08:01.000Z","d8c4ae49-7239-4b85-abb6-d1fa80ba09ad",{"id":132,"status":8,"created_on":1890,"sort":7,"slug":2350,"label":2351,"on_faq_index":15},{"id":2377,"status":8,"title":2378,"content":2379,"slug":2380,"created_on":2381,"modified_on":2382,"owner":2374,"meta_title":7,"category":2383},327,"What does the latest release tag in Releases mean?","**The latest release tag**, also known as the **latest version**, is a dynamic tag that represents the most recent state of your project. It serves as a snapshot of your project at a specific point in time, capturing all the changes that have been made up to that point. This includes new translations, updated phrases, and any other modifications.\n\nAll changes are automatically published as the so-called latest tag\u002Fversion. This means that whenever you make a change, **it automatically becomes part of the latest version**. This automatic publishing extends to various commands like download, list, and cdn, which work with the latest version by default if not explicitly specified otherwise.\n\nThe table always contains the latest release, which is used by the system and automatically published within 15-minute intervals. **This ensures that your project is always up-to-date**, and that any new translations or changes are immediately available for use. This real-time updating of the latest version ensures that all team members always have access to the most recent and accurate content.\n\n[Find out more about the entire process.](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Frelease-tags)","what-does-the-latest-release-tag-in-releases-mean","2024-05-09T02:38:56.000Z","2024-05-09T02:47:44.000Z",{"id":132,"status":8,"created_on":1890,"sort":7,"slug":2350,"label":2351,"on_faq_index":15},{"id":2385,"status":8,"title":2386,"content":2387,"slug":2388,"created_on":2389,"modified_on":2390,"owner":2374,"meta_title":7,"category":2391},328,"How to promote Release tags?","**Promoting a Release tag** is a common practice in software development that involves moving a tag from one state to another. This is typically from a lower environment (such as staging), to a higher environment (like production). The purpose of this process is to ensure that all changes, including new translations or modifications, **are tested and verified before they’re made available to end users**. This helps maintain the quality and integrity of your localized content.\n\n**How does the process work?** While translators and contributors are actively translating your project into more languages, you can test your staging tag. Once you’re satisfied with the state of the staging tag, you can promote it to production. This is done by invoking a command like `localazy tag promote staging production` or `localazy tag promote staging v1.0`. \n\n**What happens when a tag is promoted?** When a tag is promoted, it overwrites the old tag or creates a new one, depending on whether a tag with the same name already exists. The state from the source tag (in this case, the staging tag) is published to the target tag (the production tag). This involves re-running the whole publishing chain, which ensures that the target tag accurately reflects the state of the source tag.\n\n**What are the benefits of promoting a Release tag?** Promoting a Release tag ensures that your production environment always reflects the most stable and tested version of your project. This means that your end users always have access to the most reliable and high-quality localized content. It also allows you to manage the release process more effectively, as you can control when and how new changes are released to end users.\n\n[Find out more about release tags.](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Frelease-tags)","how-to-promote-release-tags","2024-05-09T02:45:52.000Z","2024-05-10T09:55:45.000Z",{"id":132,"status":8,"created_on":1890,"sort":7,"slug":2350,"label":2351,"on_faq_index":15},[],[2394],{"id":1568,"documentation_id":1568,"languages_code":812,"slug":2350,"title":2351,"content":2353,"meta_title":2351,"meta_description":2352,"excerpt":2352},[],{"id":2397,"status":8,"sort":2398,"created_on":2399,"modified_on":2400,"slug":383,"title":379,"excerpt":2401,"content":2402,"meta_title":379,"meta_description":2401,"pinned":15,"main_image":7,"section":2403,"subsection":2406,"cta":7,"faq":2407,"dictionary":2424,"translations":2425,"documentation_id":2397,"blog_articles":2427},186,"31036","2023-05-30T12:16:40.000Z","2025-02-17T14:50:03.000Z","Learn how to maintain project branches and how to merge them.","The Branching feature allows for maintaining and merging multiple project branches, enabling complex workflows for versioned development and larger teams.\n\n## Basic overview\n\nWhen a new branch is created, it's a copy of its source, including the glossary, screenshots, and contributors\u002Fuser roles. It allows you to invite specific people, experiment with different context information, or keep the branch as a standalone project to maintain separate versions of your software or, e.g., **create separate branches for white-labeled solutions**.\n\nYou can access any branch with `writeKey`\u002F`readKey` corresponding to a different one as long as you have permission to access both of them. \n\nEach branch counts against the source key limit of your plan. \n\n## The `main` branch\n\nSimilarly to [Github](https:\u002F\u002Fgithub.com) naming conventions, the initial project is called the `main` branch and can be referenced as `main` in all commands. \n\n## Create a new branch\n\nTo create a new branch, invoke the following command:\n\n`localazy branch create {source_branch} {target_branch}`\n\nThe process can take a while. \n\n## List existing branches\n\nInvoke `localazy branch list` to show all the branches as the tree structure. \n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F6ec2b6f3-4d15-43c1-9ccb-87c482bd2fb5)\n\nAs you can see, Localazy keeps track of the structure of branches for you. \n\n## Delete branches\n\nInvoke `localazy branch delete {branch}` to delete the branch. \n\nIt's only possible to delete branches that do not have any child branches. \n\n## Merge branches\n\nLocalazy keeps track of the structure of branches but allows for merging any two of them in both directions. \n\nIt's recommended to run analysis before the merge as it can fail (CLI returns non-zero exit code) when conflicts and failures are detected. \n\nAll of the following commands can be limited to process a specific set of languages or keys and\u002For to resolve conflicts in a specific way using command-line options: \n\n| Option | Description |\n| --- | --- |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;no&#8211;new&#8211;files\u003C\u002Fnobr>\u003C\u002Ftt>** | Do not create new files in the target branch. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;no&#8211;new&#8211;langs\u003C\u002Fnobr>\u003C\u002Ftt>** | Do not create new languages in the target branch. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;no&#8211;new&#8211;keys\u003C\u002Fnobr>\u003C\u002Ftt>** | Do not create new keys in the target branch. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;conflicts&#8211;only\u003C\u002Fnobr>\u003C\u002Ftt>** | Process only conflicting translations, and skip all others. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;skip&#8211;existing\u003C\u002Fnobr>\u003C\u002Ftt>** | Skip all keys with existing translations. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;langs&nbsp;cs,de,fr\u003C\u002Fnobr>\u003C\u002Ftt>** | Comma-separated list of languages to process; if not specified, all languages are processed. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;keys&nbsp;_aXXX,_aBBB\u003C\u002Fnobr>\u003C\u002Ftt>** | Comma-separated list of keys to process; if not specified, all keys are process. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;no&#8211;fail&#8211;on&#8211;conflicts\u003C\u002Fnobr>\u003C\u002Ftt>** | Do not fail if there are any conflicts. Doesn't apply for the `merge` command. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;no&#8211;fail&#8211;on&#8211;failures\u003C\u002Fnobr>\u003C\u002Ftt>** | Do not fail if there are any failures. Doesn't apply for the `merge` command. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;strategy&nbsp;TYPE\u003C\u002Fnobr>\u003C\u002Ftt>** | Please see **Conflict resolution strategies** below. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;async\u003C\u002Fnobr>\u003C\u002Ftt>** | Run the merge command asynchronously. Do not wait for results. Only applies to the `merge` command. |\n\n### Conflict resolution strategies\n\nLocalazy understands any difference between the same key in the source and target branches as a conflict. To resolve the conflict, either the target or source branch has to be changed. \n\nYou can resolve all conflicts manually or use one of predefined automatic conflict resolution strategies. \n\n| Strategy | Description |\n| --- | --- |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;skip\u003C\u002Fnobr>\u003C\u002Ftt>** | Do not resolve conflicts. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;source\u003C\u002Fnobr>\u003C\u002Ftt>** | Resolve all conflicts using the source branch translations.  |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;target\u003C\u002Fnobr>\u003C\u002Ftt>** | Resolve all conflicts using the target branch translations. **Please note that the source branch will be affected.**  |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;time\u003C\u002Fnobr>\u003C\u002Ftt>** | Resolve conflicts using translations from the source branch if their are newer than corresponding ones in the target branch. |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;time-bidi\u003C\u002Fnobr>\u003C\u002Ftt>** | Resolve conflicts using newer translations either from the source or target branch. **Please note that the source branch will be affected.**  |\n| **\u003Ctt>\u003Cnobr>&#8211;&#8211;reference\u003C\u002Fnobr>\u003C\u002Ftt>** | When merging a branch into its direct parent, Localazy can resolve the changes automatically if the parent translation hasn't changed. In any other situation, conflicts are skipped. |\n\n### Analyze  changes \n\nAnalyze what is going to happen when the merge command is performed. It honors all of the command-line options described above to show you precisely the results of the operation. \n\nInvoke `localazy branch analyze [options] {source_branch} {target_branch}` to run analysis for `{source_branch}` -> `{target_branch}` merging. \n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F1d6b3b3b-ee9f-4832-b697-76d1e78d416f)\n\nThe following results are reported:\n\n| Category | Description |\n| --- | --- |\n| **\u003Ctt>\u003Cnobr>Conflicting&nbsp;Translations\u003C\u002Fnobr>\u003C\u002Ftt>** | Conflicting translations are those that are not the same, and the remembered translations in the source branch are different from the target. |\n| **\u003Ctt>\u003Cnobr>Failed&nbsp;Translations\u003C\u002Fnobr>\u003C\u002Ftt>** | Translations that cannot be merged because they have different types (e.g., plural vs. string) or do not have the same number of array items. |\n| **\u003Ctt>\u003Cnobr>Updated&nbsp;Translations\u003C\u002Fnobr>\u003C\u002Ftt>** | Translations in the target branch that are about to be updated using translations from the source one. |\n| **\u003Ctt>\u003Cnobr>Resolved&nbsp;From&nbsp;Source\u003C\u002Fnobr>\u003C\u002Ftt>** | Conflicts resolved with translations from the source branch. |\n| **\u003Ctt>\u003Cnobr>Resolved&nbsp;From&nbsp;Target\u003C\u002Fnobr>\u003C\u002Ftt>** | Conflicts resolved with translations from the target branch. |\n| **\u003Ctt>\u003Cnobr>New&nbsp;Translations\u003C\u002Fnobr>\u003C\u002Ftt>** | Translations newly created in the target branch. |\n| **\u003Ctt>\u003Cnobr>New&nbsp;Keys\u003C\u002Fnobr>\u003C\u002Ftt>** | Keys newly created in the target branch. |\n| **\u003Ctt>\u003Cnobr>New&nbsp;Languages\u003C\u002Fnobr>\u003C\u002Ftt>** | Languages newly created in the target branch. |\n| **\u003Ctt>\u003Cnobr>New&nbsp;Files\u003C\u002Fnobr>\u003C\u002Ftt>** | Files newly created in the target branch. |\n| **\u003Ctt>\u003Cnobr>Matching&nbsp;Translations\u003C\u002Fnobr>\u003C\u002Ftt>** | Translations that are the same both in source and target branches and are about to be left untouched. |\n\nIf `--no-fail-on-conflicts` is **not** provided, the command fails with exit code 127 when conflicts are detected. The same applies to failures if `--no-fail-on-failures` is **not** provided. \n \n### Investigate conflicts\n\nInvoke `localazy branch conflicts [options] {source_branch} {target_branch}` to list all the detected conflicts. \n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F8393a72d-44b0-4712-9463-be6552b08156)\n\nThis honors all of the command-line options described above. If `--no-fail-on-conflicts` is **not** provided, the command fails with exit code 127 when conflicts are detected.\n\n### Conflict resolution\n\nYou can resolve conflicts by invoking the merge command with specific command-line options. E.g. to resolve the conflict above by using the translation from the target branch, use this command:\n\n`localazy branch merge --langs en --keys _a7779040310148463412 --strategy target {source_branch} {target_branch}`\n\n**Note: Always use branches in the same order and specify the direction using `--strategy`.**\n\n### Investigate failures\n\nInvoke `localazy branch failures [options] {source_branch} {target_branch}` to list all the detected failures. \n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002F5b9fa096-882a-4233-952c-8575753cee43)\n\nThis honors all of the command-line options described above. If `--no-fail-on-failures` is **not** provided, the command fails with exit code 127 when failures are detected.\n\n### Perform merge\n\nInvoke `localazy branch merge [options] {source_branch} {target_branch}` to perform the actual merge operation based on specified options. \n\n**Note: The merge command doesn't fail on conflicts or failures.** It just skips or resolves them according to the command-line options. \n\n## Merge glossary and screenshots\n\nThis feature has yet to be made available. Stay tuned.\n\n## Support for other CLI commands\n\nYou can access any branch with `writeKey`\u002F`readKey` corresponding to a different one as long as you have permission to access both of them. \n\nMany commands such as `upload`, `download`, `cdn`, `tags` support a command-line option `--branch [branch_name]`, allowing to specify the branch to perform the operation on even if the `writeKey`\u002F`readKey` belongs to a different one. \n\nIt's also possible to [specify the branch in the configuration file](\u002Fdocs\u002Fcli\u002Fauthorization#branching-support). \n\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2404,"featured_icon":2405},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[2408,2416],{"id":2409,"status":8,"title":2410,"content":2411,"slug":2412,"created_on":2413,"modified_on":2414,"owner":2121,"meta_title":7,"category":2415},413,"What is the purpose of branching in Localazy, and how does it work?","The branching feature in Localazy allows you to maintain and merge multiple project branches, enabling workflows for versioned development or managing white-labeled solutions.\n\n![](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fca897780-0ba6-4689-b9be-b2e68b131253)\n\nEach branch is a copy of its source, including all relevant project resources like glossaries, screenshots, and contributors. Branches can function as standalone projects or integrate with the main branch and other branches as needed.\n\nBranching can be managed via [CLI](\u002Fdocs\u002Fcli\u002Fbranching) or using a web interface in [Developer Console](\u002Fconsole\u002Fbranching). \n\nLearn more in the [CLI docs](\u002Fdocs\u002Fcli\u002Fbranching).","what-is-the-purpose-of-branching-in-localazy-and-how-does-it-work","2025-01-07T21:55:06.000Z","2025-03-04T14:21:39.000Z",{"id":1564,"status":8,"created_on":2413,"sort":7,"slug":383,"label":379,"on_faq_index":7},{"id":2417,"status":8,"title":2418,"content":2419,"slug":2420,"created_on":2421,"modified_on":2422,"owner":2121,"meta_title":7,"category":2423},414,"How does the merge process work, and what options are available to resolve conflicts?","The merge process combines two branches, with options to handle translations, keys, languages, and conflicts.\n\n## Merge in Console\nYou can merge branches using the web interface in Console. \n\n1. Select the branches you want to merge.\n2. Configure the merge process to include new languages, files or keys. \n3. Pick your conflict resolution strategy - automatic or manual.\n4. Resolve conflicts if necessary\n5. Perform merge!\n\n### Merge options\nYou have the following checkbox options that will affect what will be merged and how:\n\n- Process only conflicting translations\n- Create new keys and translations in the target branch\n- Create new files in the target branch\n- Create new languages in the target branch\n- Skip all keys with existing translations\n- Deprecate keys missing in the source branch\n\n### Conflict Resolution\nThere are many ways to resolve the conflicts that arise during the merge process. You can resolve conflicts automatically or manually.\n\n![Localazy Branching Conflict Resolution](https:\u002F\u002Fdirectus9.localazy.com\u002Fassets\u002Fd1a15a1d-d716-4732-b8ac-8eddb011b038)\n\n> Learn more about [Merging branches](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fproject-branching#merge-branch-to)  \n\n## Merge with CLI\n- **Merge command**: Use `localazy branch merge [options] {source_branch} {target_branch}` to perform a merge.\n- **Conflict resolution**: Localazy provides strategies such as `--source`, `--target`, and `--time` to resolve conflicts. For example, using the `--strategy source` option applies translations from the source branch to resolve conflicts.\n- **Analysis before merging**: Run `localazy branch analyze [options] {source_branch} {target_branch}` to analyze potential conflicts or failures.\n- **Conflict handling**: Use commands like `localazy branch conflicts` and options such as `--no-fail-on-conflicts` to manage the process smoothly.\n\nYou can learn more in the [CLI Docs: Branching](\u002Fdocs\u002Fcli\u002Fbranching)\n","how-does-the-merge-process-work-and-what-options-are-available-to-resolve-conflicts","2025-01-07T22:00:11.000Z","2025-03-04T14:21:40.000Z",{"id":1564,"status":8,"created_on":2413,"sort":7,"slug":383,"label":379,"on_faq_index":7},[],[2426],{"id":2397,"documentation_id":2397,"languages_code":812,"slug":383,"title":379,"content":2402,"meta_title":379,"meta_description":2401,"excerpt":2401},[],{"id":2429,"status":8,"sort":2430,"created_on":2431,"modified_on":2432,"slug":2433,"title":2434,"excerpt":2435,"content":2436,"meta_title":2434,"meta_description":2435,"pinned":15,"main_image":7,"section":2437,"subsection":2440,"cta":7,"faq":2441,"dictionary":2442,"translations":2443,"documentation_id":2429,"blog_articles":2446},275,"31037","2026-05-08T22:32:47.000Z","2026-05-08T22:40:21.000Z","batch-operations","Batch Operations","Learn how to invoke batch operations for CLI and build your very own automations from your CI\u002FCD pipeline.","The `localazy batch` command groups operations that act on many phrases at once for a given language. They are processed asynchronously on the server — the CLI starts the operation, polls for progress, and reports the final result once it finishes.\n\nThere are three subcommands:\n\n| Subcommand | Purpose |\n| --- | --- |\n| `localazy batch translate` | Machine-translate phrases for a target language using a chosen MT engine. |\n| `localazy batch approve` | Approve waiting versions of translations for a target language. |\n| `localazy batch intm` | Apply translation memory (InTM) from connected projects. |\n\nIf you only need a one-off translation that is not stored on Localazy, use [`localazy translate`](\u002Fdocs\u002Fcli\u002Fai-translations) instead.\n\n## Authorization\n\nAll batch operations use the project's `writeKey` and require the `MANAGER` or `OWNER` role. See [Authorization](\u002Fdocs\u002Fcli\u002Fauthorization) for details on configuring keys.\n\nAll subcommands accept the `--branch NAME` option to operate on a specific [branch](\u002Fdocs\u002Fcli\u002Fbranching).\n\n## Server-side operations\n\nAll operations are processed asynchronously on the server side. While the CLI waits for the operation to finish, the operation is not terminated or suspended if the CLI is interrupted.\n\n## Common options\n\nThese options are accepted by multiple batch subcommands. Per-subcommand sections below describe which ones apply where.\n\n| Option | Description |\n| --- | --- |\n| \u003Ctt>\u003Cnobr>`--lang LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | **Required.** Target language locale code (e.g. `cs`, `de`, `fr`). |\n| \u003Ctt>\u003Cnobr>`--phrases IDS`\u003C\u002Fnobr>\u003C\u002Ftt> | Comma-separated phrase IDs to limit the operation to, or `all` (default). |\n| \u003Ctt>\u003Cnobr>`--branch NAME`\u003C\u002Fnobr>\u003C\u002Ftt> | Run against a specific branch. |\n\n## Batch translate\n\nTranslate phrases for a target language using one of the supported AI\u002FMT engines. \n\n```\nlocalazy batch translate --lang cs --engine localazyAi\n```\n\nBy default, only phrases with no translation in the target language are processed. Use the flags below to include other categories.\n\n### Options\n\n| Option | Default    | Description                                                                                       |\n| --- |------------|---------------------------------------------------------------------------------------------------|\n| \u003Ctt>\u003Cnobr>`--lang LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | _required_ | Target language locale code.                                                                      |\n| \u003Ctt>\u003Cnobr>`--engine ENGINE`\u003C\u002Fnobr>\u003C\u002Ftt> | _required_ | MT engine. Allowed values: `google`, `amazon`, `azure`, `deepl`, `localazyAi`.                    |\n| \u003Ctt>\u003Cnobr>`--approve`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_    | Auto-approve the new translations instead of placing them in review.                              |\n| \u003Ctt>\u003Cnobr>`--source-changed`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_    | Also translate phrases that already have a translation but whose source string has changed.       |\n| \u003Ctt>\u003Cnobr>`--waiting-for-review`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_    | Also translate phrases that have a version waiting for review.                                    |\n| \u003Ctt>\u003Cnobr>`--source-lang LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | _-_        | Override the source language used for translation. By default, project's source language is used. |\n| \u003Ctt>\u003Cnobr>`--phrases IDS`\u003C\u002Fnobr>\u003C\u002Ftt> | `all`      | Comma-separated phrase IDs to translate, or `all`.                                                |\n\n### Engines\n\n| ID | Engine |\n| --- | --- |\n| `localazyAi` | Localazy AI (recommended) |\n| `google` | Google Translate |\n| `amazon` | Amazon Translate |\n| `azure` | Azure Translator |\n| `deepl` | DeepL |\n\nAll AI\u002FMT engines consume translation credits from your project's plan. Use `localazy batch intm` first if you have connected projects with reusable translations.\n\n### Examples\n\nTranslate all untranslated Czech phrases with Localazy AI and put translations into review:\n\n```\nlocalazy batch translate --lang cs --engine localazyAi\n```\n\nTranslate and immediately approve German translations using DeepL:\n\n```\nlocalazy batch translate --lang de --engine deepl --approve\n```\n\nTranslate all untranslated phrases and those with the source changed flag:\n\n```\nlocalazy batch translate --lang fr --engine localazyAi --source-changed\n```\n\n## Batch approve\n\nApprove translations waiting for review for a given language.\n\n```\nlocalazy batch approve --lang cs\n```\n\nBy default, the latest waiting version of each phrase is approved. Use `--type` to control which versions are eligible and which one is preferred.\n\n### Options\n\n| Option | Default | Description |\n| --- | --- | --- |\n| \u003Ctt>\u003Cnobr>`--lang LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | _required_ | Target language locale code. |\n| \u003Ctt>\u003Cnobr>`--type FILTER:SELECTION`\u003C\u002Fnobr>\u003C\u002Ftt> | `all:latest` | Which versions are eligible (`filter`) and which one is preferred (`selection`). See **Approval types** below. |\n| \u003Ctt>\u003Cnobr>`--all-versions`\u003C\u002Fnobr>\u003C\u002Ftt> | _true_ | Process all versions, not only unapproved ones. |\n| \u003Ctt>\u003Cnobr>`--process-approved`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_ | Re-approve already approved translations. |\n| \u003Ctt>\u003Cnobr>`--phrases IDS`\u003C\u002Fnobr>\u003C\u002Ftt> | `all` | Comma-separated phrase IDs to approve, or `all`. |\n\n### Approval types\n\nThe `--type` option uses the form `FILTER:SELECTION`.\n\n`FILTER` controls which versions are considered for approval:\n\n| Filter | Description                                                                              |\n| --- |------------------------------------------------------------------------------------------|\n| `all` | All versions, regardless of source.                                                      |\n| `human` | Only versions submitted by human translators.                                            |\n| `clt` | Only versions submitted by Localazy CLT. |\n\n`SELECTION` controls which of the eligible versions wins when more than one is available:\n\n| Selection | Description |\n| --- | --- |\n| `single` | Approve only when there is exactly one waiting version (skip phrases with multiple). |\n| `latest` | Pick the latest version. |\n| `human` | Prefer the version from a human translator. |\n| `clt` | Prefer the version from CLT. |\n\nThe default `all:latest` approves the latest available version for every phrase that has at least one waiting version.\n\n### Examples\n\nApprove the latest waiting version of every Czech translation:\n\n```\nlocalazy batch approve --lang cs\n```\n\nApprove only translations submitted by human translators, picking the latest:\n\n```\nlocalazy batch approve --lang de --type human:latest\n```\n\nApprove only phrases that have a single unambiguous waiting version:\n\n```\nlocalazy batch approve --lang fr --type all:single\n```\n\n## Batch InTM\n\nApply translation memory (InTM) from connected projects to phrases in the target language. InTM reuses approved translations across your projects and does **not** consume any credits — it is the cheapest way to get coverage on phrases that have been translated elsewhere.\n\n```\nlocalazy batch intm --lang cs\n```\n\nBy default, all connected projects are eligible as TM sources. Use the options below to narrow down which projects are used.\n\n### Options\n\n| Option | Default | Description |\n| --- | --- | --- |\n| \u003Ctt>\u003Cnobr>`--lang LOCALE`\u003C\u002Fnobr>\u003C\u002Ftt> | _required_ | Target language locale code. |\n| \u003Ctt>\u003Cnobr>`--approve`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_ | Auto-approve the new translations instead of placing them in review. |\n| \u003Ctt>\u003Cnobr>`--source-projects IDS`\u003C\u002Fnobr>\u003C\u002Ftt> | _---_ | Comma-separated connected project IDs to use as TM source. |\n| \u003Ctt>\u003Cnobr>`--all-sources`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_ | Use all connected projects as TM source. |\n| \u003Ctt>\u003Cnobr>`--external-only`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_ | Exclude the current project from the TM source list. |\n| \u003Ctt>\u003Cnobr>`--waiting-for-review`\u003C\u002Fnobr>\u003C\u002Ftt> | _false_ | Also process phrases that have a version waiting for review. |\n| \u003Ctt>\u003Cnobr>`--phrases IDS`\u003C\u002Fnobr>\u003C\u002Ftt> | `all` | Comma-separated phrase IDs to process, or `all`. |\n\n### Examples\n\nApply translation memory from all connected projects to Czech:\n\n```\nlocalazy batch intm --lang cs --all-sources\n```\n\nApply TM from specific connected projects only:\n\n```\nlocalazy batch intm --lang de --source-projects _a7899421261323541,_a984121546213546546\n```\n\nApply TM, excluding the current project (useful when you only want matches that come from external sources):\n\n```\nlocalazy batch intm --lang fr --all-sources --external-only\n```\n## Exit codes\n\nBatch commands return a non-zero exit code if the operation fails to start, the server reports an error, or the result includes errors that prevent completion.\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2438,"featured_icon":2439},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[],[],[2444],{"id":2445,"documentation_id":2429,"languages_code":812,"slug":2433,"title":2434,"content":2436,"meta_title":2434,"meta_description":2435,"excerpt":2435},1429,[],{"id":1137,"status":8,"sort":2448,"created_on":1856,"modified_on":2449,"slug":2450,"title":2451,"excerpt":2452,"content":2453,"meta_title":2451,"meta_description":2454,"pinned":15,"main_image":7,"section":2455,"subsection":2458,"cta":7,"faq":2459,"dictionary":2460,"translations":2461,"documentation_id":1137,"blog_articles":2463},"31040","2024-07-16T15:14:49.000Z","metadata-file","Metadata File","Learn about how to generate metadata file with the list of available languages and plural rules.","To allow you fully automatize the localization of your mobile, desktop or web app, Localazy can generate useful metadata files.\n\nIt contains basic information about the project and the list of languages, their English and localized names, information about language, region and script. For selected formats, expressions for calculating correct plural types are included.\n\nYou can use metadata files to:\n\n- show language selector for users\n- automatically determine the best language to use\n- navigate uses to your project on Localazy to help you with translating it\n- use correct plural forms without including 3rd party libraries\n- and more...\n\n\n## Generating metadata file\n\nYou can generate metadata file by including `metadataFileJson`, `metadataFileJs` and\u002For `metadataFileTs` in the download section of your `localazy.json` file.\n\n```json\n{\n    \"download\": {\n      \"metadataFileJson\": \"languages.json\",\n      \"metadataFileJs\": \"languages.js\",\n      \"metadataFileTs\": \"languages.ts\"\n    }\n}\n```\n\nYou can include all of the above to generate all variants. \n\n## JSON format\n\nThe metadata file in JSON format is generated to the file specified by `metadataFileJson`. This format doesn't include plural type expression.\n\n```json\n{\n    \"projectUrl\": \"https:\u002F\u002Flocalazy.com\u002Fp\u002F...\",\n    \"baseLocale\": \"en\",\n    \"languages\": [\n        {\n            \"language\": \"ko_KO\",\n            \"region\": \"\",\n            \"script\": \"\",\n            \"isRtl\": false,\n            \"name\": \"Korean\",\n            \"localizedName\": \"한국어\",\n            \"aliasOf\": \"ko\"\n        },\n        {\n            \"language\": \"de\",\n            \"region\": \"\",\n            \"script\": \"\",\n            \"isRtl\": false,\n            \"name\": \"German\",\n            \"localizedName\": \"Deutsch\"           \n        },        \n        {\n            \"language\": \"de_DE\",\n            \"region\": \"\",\n            \"script\": \"\",\n            \"isRtl\": false,\n            \"name\": \"German\",\n            \"localizedName\": \"Deutsch\",\n            \"expansionOf\": \"de\"\n        },\n        {\n            \"language\": \"sk\",\n            \"region\": \"\",\n            \"script\": \"\",\n            \"isRtl\": false,\n            \"name\": \"Slovak\",\n            \"localizedName\": \"Slovenčina\"\n        },\n\n        \u002F\u002F ...\n\n    ],\n    \"files\": [\n      {\n        \"cdnHash\": \"14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\",\n        \"file\": \"idioms.json\",\n        \"path\": \"\",\n        \"library\": \"\",\n        \"module\": \"\",\n        \"buildType\": \"\",\n        \"productFlavors\": [],\n        \"cdnFiles\": {\n          \"ar\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Far\u002Fidioms.json\",\n          \"cs\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fcs\u002Fidioms.json\",\n          \"de\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fde\u002Fidioms.json\",\n          \"en\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fen\u002Fidioms.json\",\n          \"es\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fes\u002Fidioms.json\",\n          \"fi\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Ffi\u002Fidioms.json\",\n          \"it\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fit\u002Fidioms.json\",\n          \"ko\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fko\u002Fidioms.json\",\n          \"pl\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fpl\u002Fidioms.json\",\n          \"ru\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fru\u002Fidioms.json\"\n        }\n      },\n      \u002F\u002F ...\n    ]\n}\n```\n\n## Javascript format\n\nThe metadata file in Javascript format is generated to the file specified by `metadataFileJs`. It's a Javascript module, and you can include it out-of-the-box to your code.\n\nIt comes with an expression for determining the correct plural type.\n\n```javascript\nconst localazyMetadata = {\n  projectUrl: \"http:\u002F\u002Flocalhost:9091\u002Fp\u002Ffloating-apps-2\",\n  baseLocale: \"en\",\n  languages: [\n    {\n      language: \"ko_KO\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"Korean\",\n      localizedName: \"한국어\",\n      aliasOf: \"ko\",\n      pluralType: (n) => { return \"other\"; }\n    },\n    {\n      language: \"de\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"German\",\n      localizedName: \"Deutsch\",      \n      pluralType: (n) => { return (n===1) ? \"one\" : \"other\"; }\n    },    \n    {\n      language: \"de_DE\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"German\",\n      localizedName: \"Deutsch\",\n      expansionOf: \"de\",\n      pluralType: (n) => { return (n===1) ? \"one\" : \"other\"; }\n    },\n    {\n      language: \"sk\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"Slovak\",\n      localizedName: \"Slovenčina\",\n      pluralType: (n) => { return (n===1) ? \"one\" : (n>=2 && n\u003C=4) ? \"few\" : \"other\"; }\n    }\n  ],\n  \"files\": [\n    {\n      cdnHash: \"14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\",\n      file: \"idioms.json\",\n      path: \"\",\n      library: null,\n      module: null,\n      buildType: null,\n      productFlavors: [],\n      cdnFiles: {\n        \"ar\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Far\u002Fidioms.json\",\n        \"cs\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fcs\u002Fidioms.json\",\n        \"de\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fde\u002Fidioms.json\",\n        \"en\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fen\u002Fidioms.json\",\n        \"es\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fes\u002Fidioms.json\",\n        \"fi\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Ffi\u002Fidioms.json\",\n        \"it\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fit\u002Fidioms.json\",\n        \"ko\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fko\u002Fidioms.json\",\n        \"pl\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fpl\u002Fidioms.json\",\n        \"ru\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fru\u002Fidioms.json\"\n      }\n    },\n    \u002F\u002F ...\n  ]  \n};\n\nexport default localazyMetadata;\n```\n\n## Typescript format\n\nThe metadata file in Typescript format is generated to the file specified by `metadataFileTs`. It's a Typescript module, and you can include it out-of-the-box to your code. \n\nIt contains information about types and comes with an expression for determining the correct plural type.\n\n```typescript\nexport type LocalazyLanguage = {\n    language: string;\n    region: string;\n    script: string;\n    isRtl: boolean;\n    localizedName: string;\n    name: string;\n    pluralType: (n: number) => \"zero\" | \"one\" | \"two\" | \"many\" | \"few\" | \"other\";\n};\n \nexport type LocalazyFile = {\n    cdnHash: string;\n    file: string;\n    path: string;\n    library: string;\n    module: string;\n    buildType: string;\n    productFlavors: string[];\n    cdnFiles: { [lang:string]: string };\n};\n \nexport type LocalazyMetadata = {\n    projectUrl: string;\n    baseLocale: string;\n    languages: LocalazyLanguage[];\n    files: LocalazyFile[];\n};\n     \nconst localazyMetadata: LocalazyMetadata = {\n  projectUrl: \"http:\u002F\u002Flocalhost:9091\u002Fp\u002Ffloating-apps-2\",\n  baseLocale: \"en\",\n  languages: [\n    {\n      language: \"ko_KO\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"Korean\",\n      localizedName: \"한국어\",\n      aliasOf: \"ko\",\n      pluralType: (n) => { return \"other\"; }\n    },\n    {\n      language: \"de\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"German\",\n      localizedName: \"Deutsch\",     \n      pluralType: (n) => { return (n===1) ? \"one\" : \"other\"; }\n    },    \n    {\n      language: \"de_DE\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"German\",\n      localizedName: \"Deutsch\",\n      expansionOf: \"de\",\n      pluralType: (n) => { return (n===1) ? \"one\" : \"other\"; }\n    },\n    {\n      language: \"sk\",\n      region: \"\",\n      script: \"\",\n      isRtl: false,\n      name: \"Slovak\",\n      localizedName: \"Slovenčina\",\n      pluralType: (n) => { return (n===1) ? \"one\" : (n>=2 && n\u003C=4) ? \"few\" : \"other\"; }\n    }\n  ],\n  \"files\": [\n    {\n      cdnHash: \"14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\",\n      file: \"idioms.json\",\n      path: \"\",\n      library: \"\",\n      module: \"\",\n      buildType: \"\",\n      productFlavors: [],\n      cdnFiles: {\n        \"ar\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Far\u002Fidioms.json\",\n        \"cs\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fcs\u002Fidioms.json\",\n        \"de\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fde\u002Fidioms.json\",\n        \"en\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fen\u002Fidioms.json\",\n        \"es\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fes\u002Fidioms.json\",\n        \"fi\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Ffi\u002Fidioms.json\",\n        \"it\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fit\u002Fidioms.json\",\n        \"ko\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fko\u002Fidioms.json\",\n        \"pl\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fpl\u002Fidioms.json\",\n        \"ru\": \"https:\u002F\u002Fdelivery.localazy.com\u002F_a823899401821771352260639a85\u002F_e0\u002F14d4ba1asdf45df4c48cc3cb140bb64dd20a3271338a7\u002Fru\u002Fidioms.json\"\n      }\n    },    \n  ]    \n};\n \nexport default localazyMetadata;\n```\n\n___CLI_LINKS___","Learn about how to generate a metadata file with the list of available languages and plural rules.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2456,"featured_icon":2457},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[],[],[2462],{"id":1137,"documentation_id":1137,"languages_code":812,"slug":2450,"title":2451,"content":2453,"meta_title":2451,"meta_description":2454,"excerpt":2452},[],{"id":132,"status":8,"sort":2465,"created_on":2086,"modified_on":2466,"slug":2467,"title":2468,"excerpt":2469,"content":2470,"meta_title":2468,"meta_description":2469,"pinned":15,"main_image":7,"section":2471,"subsection":2474,"cta":2475,"faq":2476,"dictionary":2479,"translations":2480,"documentation_id":132,"blog_articles":2482},"31050","2024-08-12T05:25:40.000Z","variables","Variables","Learn about variables that you can use for building output path for translated files, sending data to server along with your files, for conditions or transformations. ","As files are processed during the upload and download, variables are populated allowing you to access certain information about the file that is currently being processed.\n\nYou can use variables to build output path for translated files, send data to server along with your files, for [conditional upload\u002Fdownload](\u002Fdocs\u002Fcli\u002Fconditions) or for [transformations](\u002Fdocs\u002Fcli\u002Ftransformations).\n\nVariables are always used as `${variable_name}`. Only letters and the underscore symbol are allowed for variable names.  \n\nValue of the variable is always string. \n\n## Upload variables\n\nThese variables are available while the Localazy CLI is collecting files to be uploaded to server. During the upload process, you are about to infer additional parameters that you want to send to server from the file path and name. \n\n| Variable | Description |\n| --- | --- |\n| `${file}` | The file name without the path. Eg. _file.json_ |\n| `${path}` | The path to the file without the file name itself. Eg. _path\u002Fto\u002Ffile_ |\n| `${fullPath}` | The full path to file including the path and the file name. Eg. _path\u002Fto\u002Ffile\u002Ffile.json_ |\n| `${autodetectSuccess}` | Set to string `true` if [auto-detection](\u002Fdocs\u002Fcli\u002Fexisting-translations) was successful and to `false` otherwise. | \n| `${autodetectLang}` | [Auto-detected locale](\u002Fdocs\u002Fcli\u002Fexisting-translations) if auto-detection is possible. | \n| `${autodetectPath}` | [Auto-detected path](\u002Fdocs\u002Fcli\u002Fexisting-translations) if auto-detection is possible. | \n| `${autodetectFile}` | [Auto-detected file](\u002Fdocs\u002Fcli\u002Fexisting-translations) if auto-detection is possible. | \n| `${autodetectFileWithFallback}` | [Auto-detected file](\u002Fdocs\u002Fcli\u002Fexisting-translations) if auto-detection is possible or return `${file}` as a fallback. | \n\n## Download variables\n\nThese variables are available while the Localazy CLI is processing the downloaded translated files. Many of variables available at that moment are those you previously sent while uploading your files. For this reason, it's necessary to upload files with the correct metadata.  \n\nAlso, Localazy CLI calculates many other variables, so they are ready to use.  \n\n\n| Variable | Description |\n| --- | --- |\n| `${file}` | The file name without the path. Eg. _file.json_ |\n| `${path}` | The path to the file without the file name. Eg. _\u002Fpath\u002Fto\u002Ffile_ |\n| `${fullPath}` | The full path to file including the path and the file name. Eg. _path\u002Fto\u002Ffile\u002Ffile.json_ |\n| `${fileWithoutExt}` | The file name without the path and extension. Eg. _file_ |\n| `${fullPathWithoutExt}` | The full path to file without the extension. Eg. _\u002Fpath\u002Fto\u002Ffile\u002Ffile_ |\n| `${fileExt}` | The file extension. Eg. _json_ |\n| `${groups}` | Space separated list of groups this file belonged too when uploaded. See [groups](\u002Fdocs\u002Fcli\u002Fcommand-line-options#groups) for more information.\n| `${module}` | The module this file belongs to. See [modules, libraries and product flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more information. \n| `${library}` | The library this file belongs to. See [modules, libraries and product flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more information. \n| `${buildType}` | The build type this file belongs to. See [modules, libraries and product flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more information. \n| `${productFlavors}` | Space separated list of product flavors this file belongs to. See [modules, libraries and product flavors](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors) for more information.\n| `${types}` | Space separated list of types, eg. `ios strings`. See below for available types information. |\n| `${languageCode}` | The code of the language, eg. `zh`. |\n| `${regionCode}` | The code of the region, eg. `TW`. |\n| `${scriptCode}` | The code of the script, eg. `Hans`. |\n| `${langName}` | Language name in its own language, eg. `Deutsch` for `de`. If the language name is not known, English name is returned. |\n| `${langNameEn}` | Language name in English, eg. `German` for `de`. |\n| `${langRtl}` | Contains string `true` if the language is RTL (right-to-left), `false` otherwise. \n| `${langLocalazyId}` |  The internal Localazy ID of the language. |\n| `${androidFlavoredFolder}` | A folder name built up from product flavors and the build type. Eg. returns `googleFreeDebug` for build type `debug` and product flavors `google` and `free`.\n| `${iosLprojFolder}` | A folder name built up from language and `.lproj` string. Eg. `en-US.lproj`. |\n| `${sourceLang}` | The source language of the project in `${lang}` format. |\n| `${lang}` | The locale formatted as: LL, LL-RR, LL-SCRP, LL-SCRP-RR |\n| `${language}` | The locale formatted as: LL, LL-RR, LL-SCRP, LL-SCRP-RR |\n| `${langIosStrings}` | The locale formatted as: LL, LL_RR, LL-SCRP, LL-SCRP_RR | \n| `${langAndroidResNoScript}` | The locale formatted as: LL, LL-rRR, LL, LL-rRR | \n| `${langAndroidRes}` | The locale formatted as: LL, LL-rRR, b+LL+SCRP, b+LL+SCRP+RR | \n| `${langAndroidBcp}` | The locale formatted as: b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR | \n| `${langLrsUnderscore}` | The locale formatted as: LL, LL_RR, LL_SCRP, LL_RR_SCRP | \n| `${langLsrUnderscore}` | The locale formatted as: LL, LL_RR, LL_SCRP, LL_SCRP_RR | \n| `${langLrsDash}` | The locale formatted as: LL, LL_RR, LL-SCRP, LL-RR-SCRP | \n| `${langLsrDash}` | The locale formatted as: LL, LL-RR, LL-SCRP, LL-SCRP-RR | \n\n## Locale formatting\n\nIn the table above, it's described that you can obtain the locale in different formats.\n\nThe format is always consisted of 4 patterns separated with a comma and each of the patterns is used depending on available parts (language, region, script).\n\n**Examples for format LL, LL_RR, LL-SCRP, LL_RR-SCRP:**\n\n| Language | Region | Script | Formatted |\n| --- | --- | --- | --- |\n| de | | | de | \n| cs | CZ | | cs_CZ |\n| zh | | Hant | zh-Hant |\n| zh | TW | Hans | zh_TW-Hans |\n\n**Examples for format b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR:**\n                \n| Language | Region | Script | Formatted |\n| --- | --- | --- | --- |\n| de | | | b+de | \n| cs | CZ | | b+cs+CZ |\n| zh | | Hant | b+zh+Hant |\n| zh | TW | Hans | b+zh+Hans+TW |                \n                                               \n## Types\n\nFor each file, its type is returned as a space separated list of several identifiers.  \n\nYou can use them to conditionally process file using [`containsWord` condition](\u002Fdocs\u002Fcli\u002Fconditions). \n \n___CLI_TYPES___\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2472,"featured_icon":2473},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2477],{"id":108,"status":8,"title":2239,"content":2240,"slug":2241,"created_on":1887,"modified_on":2242,"owner":1855,"meta_title":7,"category":2478},{"id":22,"status":8,"created_on":2104,"sort":13,"slug":411,"label":643,"on_faq_index":17},[],[2481],{"id":132,"documentation_id":132,"languages_code":812,"slug":2467,"title":2468,"content":2470,"meta_title":2468,"meta_description":2469,"excerpt":2469},[],{"id":82,"status":8,"sort":2484,"created_on":2086,"modified_on":2180,"slug":2485,"title":2486,"excerpt":2487,"content":2488,"meta_title":2486,"meta_description":2487,"pinned":15,"main_image":7,"section":2489,"subsection":2492,"cta":7,"faq":2493,"dictionary":2494,"translations":2495,"documentation_id":82,"blog_articles":2497},"31060","conditions","Conditions","Learn how to introduce even more complex logic for upload\u002Fdownload with conditions. ","With conditions, you can introduce complex logic for processing files while they are uploaded \u002F downloaded.\n\nThe example below shows different ways how you can use conditions:\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \"upload\": {\n    \"type\": \"android\",\n    \"files\": [\n  \n      {\n        \u002F\u002F ...\n        \"conditions\": \"!~equals: ${path}, src\"\n      },\n\n      {\n        \u002F\u002F ...\n        \"conditions\": [\n           \"!~equals: ${path}, src\",\n           [\n              \"contains: ab, ${path}\",\n              \"contains: cd, ${path}\"\n           ]   \n        ]\n      }\n\n    ]\n  }\n}\n``` \n\n## Single condition\n\nThe simplest way to use a single condition is:\n\n```json\n{\n  \u002F\u002F ...\n  \"conditions\": \"!~equals: ${path}, src\"\n}\n```\n\n## Conditions with AND \u002F OR\n\nThe full form of conditions is shown below.  \n\n```json\n{\n  \u002F\u002F ...\n  \"conditions\": [\n    \"condition1\",\n    [\n      \"condition2.1\",\n      \"condition2.2\"\n    ],\n    [\n      \"condition3.1\",\n      \"condition3.1\"\n    ]    \n  ]\n}\n```\n\nThe example above is the same as this formula:\n\n```condition1 || (condition2.1 && condition2.2) || (condition3.1 && condition3.2)``` \n\n## Expressions\n\n### equals\n\n`equals: input, term1, term2, term3`\n\nReturns true if the input equals at least one of the terms. \n\n### contains\n\n`contains: term, text`  \n\nReturns true if the term is contained in the text.\n\n### containsWord\n\n`containsWord: term, text`\n\nReturns true if the term is contained in the text but only if it's a whole word. The text is split by the spaces and each of the parts is tested against the term.\n\nIt's useful for checking for the existence of a particular group or product flavor, etc.\n\n### empty\n\n`empty: text` \n\nReturns true if the text is blank (empty or whitespaces only).\n\n### startsWith\n\n`startsWith: term, text`\n\nReturns true if the text starts with the term.\n\n### endsWith\n\n`endsWith: term, text`\n\nReturns true if the text ends with the term.\n\n## Variables\n\n[Variables](\u002Fdocs\u002Fcli\u002Fvariables) can be used as any of the parameters in the expression.\n\n```json\n{\n  \u002F\u002F ...\n  \"conditions\": \"equals: ${path}, ${expectedPath}\"\n}\n```\n\n## Negation\n\nPrepend `!` before the expression name to negate the output of the command.\n\n**Example:** \n\n`!equals: term1, term2` \n\nReturns false if the term1 is equals to term2.\n\n## Case-sensitivity\n\nBy default, all operations are case-sensitive.\n\nPrepend `~` before the expression name to switch to the case-insensitive mode.\n\n**Example:** \n\n`~equals: term1, TERM2`\n\nReturns true if the term1 is equals to the term2. The check is case-insensitive.\n\n## Single line AND\n\nIf you need a condition with more expressions, you can use `|` character to join more expressions on a single line.\n\n```json\n{\n  \u002F\u002F ...\n  \"conditions\": \"exp1 | exp2 | exp3\"\n}\n```\n\nThe example above is the same as: `exp1 && exp2 && exp3`\n\n\n\n## Special characters\n\nSome characters have a special meaning and so it's necessary to replace them. \n\n- white-spaces are trimmed to prevent formatting issues, please use `%space%` instead\n- `,` is used as parameter separator, please use `%comma%` instead\n- `$` is used for including variables, please use `%dollar%` instead\n- `|` is used for separating more command on a single line, please use `%vbar%` instead\n\n**Example:**\n\nFor checking whether the `${path}` is equal to the weird string ` ab,c` (starts with space), please replace special characters like this:\n\n```json\n{\n  \u002F\u002F ...\n  \"conditions\": \"equals: ${path}, %space%ab%comma%c\"\n}\n```\n\n___CLI_LINKS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2490,"featured_icon":2491},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[],[],[2496],{"id":82,"documentation_id":82,"languages_code":812,"slug":2485,"title":2486,"content":2488,"meta_title":2486,"meta_description":2487,"excerpt":2487},[],{"id":441,"status":8,"sort":2499,"created_on":2086,"modified_on":2500,"slug":2501,"title":2502,"excerpt":2503,"content":2504,"meta_title":2502,"meta_description":2503,"pinned":15,"main_image":7,"section":2505,"subsection":2508,"cta":2509,"faq":2510,"dictionary":2521,"translations":2522,"documentation_id":441,"blog_articles":2524},"31070","2024-07-16T15:14:39.000Z","transformations","Transformations","Learn how to transform file's path or name to language code and more.","Transformations allow for procesing input [variables](\u002Fdocs\u002Fcli\u002Fvariables) and inferring new ones. This is extremely useful for automating the workflow. You can, for example, obtain language code from file's name or path.\n\nIt's also important for cleaning paths, file names and other parameters before the upload.   \n\n\n## Transformation with a single operation\n\nThe example below creates a new variable called `lang_from_path` from the source string `${path}` applying the operation `substringAfter`.\n\nIt can be later used in the upload\u002Fdownload section. \n \n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \"lang_from_path\",\n        \"source\": \"${path}\",\n        \"operations\": \"substringAfter: .\u002F\"\n    }\n\n  ],\n\n  \"upload\": {\n    \"type\": \"ios-strings\",    \n    \"files\": {\n        \"lang\": \"${lang_from_path}\",\n        \"path\": \"\",\n        \"pattern\": \"*\u002FLocalizable.strings\"        \n    }\n  }\n \n}\n```\n\n## Transformation with multiple operations\n\nIt's possible to apply more operations. They are applied in the defined order. The subsequent operation is applied on the result from the previous one.\n\nThe example below turns source string `${path}`, let's take `.\u002Ftranslation-cs_CZ\u002Fmenu` as a sample, to the language code `cs_CZ`. \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \"lang_from_path\",\n        \"source\": \"${path}\",\n        \"operations\": [\n          \"substringAfter: .\u002F\",\n          \"substringBefore: \u002F\",\n          \"remove: translation-\"\n        ]\n    }\n\n  ]\n}\n```\n\n## Complex source string\n\nThe source string is a just a string with interpolated variables. Therefore, you can build it using more variables or string constants. \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \"complex_source\",\n        \"source\": \"Source can be consisted of ${more} ${variables}\",\n        \"operations\": \"substringAfter: .\u002F\"\n    }\n\n  ]\n}\n```\n\n## Operations\n\n### trimStart\n\nTrim all matching characters from the start of the string. \n\nThe function must be called without parameters (trim white-spaces) or with a single character string as a parameter.\n\nTrim all white-spaces: `trimStart`\n\nTrim all characters **a**: `trimStart: a`\n\n### trimEnd\n\nTrim all matching characters at the end of the string. \n\nThe function must be called without parameters (trim white-spaces) or with a single character string as a parameter.\n\nTrim all white-spaces: `trimEnd`\n\nTrim all characters **a**: `trimEnd: a`\n\n### substringAfter\n\nReturn substring after the first occurrence of the string provided as parameter.\n\nReturn substring after **\u002Fres\u002F**: `substringAfter: \u002Fres\u002F`\n\n### substringAfterLast\n\nReturn substring after the last occurrence of the string provided as parameter.\n\nReturn substring after the last **\u002F**: `substringAfterLast: \u002F`\n\n### substringBefore\n\nReturn substring before the first occurrence of the string provided as parameter.\n\nReturn substring before **\u002Fres\u002F**: `substringBefore: \u002Fres\u002F`\n\n### substringBeforeLast\n\nReturn substring before the last occurrence of the string provided as parameter.\n\nReturn substring before the last **\u002F**: `substringBeforeLast: \u002F`\n\n### append\n\nAppend the string provided as parameter.\n\nAppend **\u002Fstrings.json** to the string: `append: \u002Fstrings.json`\n\n### prepend\n\nPrepend the string provided as parameter.\n\nPrepend **translations\u002F** to the string: `prepend: translations\u002F`\n\n### replace\n\nThis function accepts two parameters separated with comma `,` and replace all occurrences of the first parameters with the second paramater.\n\nReplace all occurrences of `_` to `-`: `replace: _, -`\n\n### remove\n\nRemove all occurrences of the string provided as parameter.\n\nRemove all **\u002F**: `remove: \u002F`\n\n### removePrefix\n\nRemove prefix if it is the string provided as parameter. If the prefix is different from the parameter, the string is left unchanged.\n\nRemove prefix **.\u002Fres\u002F**: `removePrefix: .\u002Fres\u002F`\n\n### removeSuffix\n\nRemove suffix if it is the string provided as parameter. If the suffix is different from the parameter, the string is left unchanged.\n\nRemove JSON file extension **.json**: `removeSuffix: .json`\n\n### capitalize\n\nCapitalize the input string - change the first letter to the upper case.\n\nThis function has no parameters.\n\nTurn source string **free** to **Free**: `capitalize` \n\n### capitalizeWords\n\nCapitalize all words in the input string - change the first letter to the uppercase for every word.\n\nIf the function is called without parameters, all words are capitalized.\n\nThe function can be called with parameter \"true\" or \"false\". If the function is called with \"false\", the first words is not capitalized.\n\nTurn source string **free as beer** to **Free As Beer**: `capitalizeWords: true`\n\nTurn source string **free as beer** to **free As Beer**: `capitalizeWords: false`\n\n### lowerCase\n\nChange all letters of the input string to lower case.\n\nThis function has no parameters.\n\nTurn source string **FREE** to **free**: `lowerCase` \n\n### upperCase\n\nChange all letters of the input string to upper case.\n\nThis function has no parameters.\n\nTurn source string **free** to **FREE**: `upperCase` \n\n### print\n\nPrint the value after the string provided as parameter. \n\nFor example, `print: Value:%space%` prints `Value: VALUE`. \n\nUseful for debugging.\n\n### set\n\nSet the string provided as parameter to the value. It's useful for complex operations.\n\nIt's mainly useful with temporary variables. See **Redirecting output** below. \n\n### detectLang\n\nDetect language code from the string. There are several methods for the detection. The method is specified as the parameter.\n\n#### android\n\nLooks for `values-xx` folder in the source string and parse the language from it. Support the `values-b+sr+Latn+SR` notation. \n\nExample: `main\u002Fres\u002Fvalues-cs-rCZ\u002Fstrings.xml` => `cs-CZ`.\n\n#### suffix\n\nRemove extension of the file contained in the source string and looks for a suffix consisted of 2-3 letters for language (lowercased), 4 letters for script (capitalized) and 2-3 letters for a region (uppercased). It considers `-`, `_` and `+` as separators. \n\nExamples: `my_file_cs_CZ.arb` => `cs-CZ`\n\nCan be used for parsing suffixes for Flutter's ARB file in a localization folder.  \n\n**Tip:** If your files use a different separator for language part, use other transformations such as `replace` to change them.\n\n### formatLang\n\nThis operation expects that the source string is a locale consisted of 2-3 letters for language (lowercased), 4 letters for script (capitalized) and 2-3 letters for a region (uppercased). It considers `-`, `_` and `+` as separators. Script and region are optional.\n\nFour parameters are expected describing how to format the locale based on whether region, script or both are available.\n\nThe order of parameters is:\n1. Only the language code is available\n2. Language code and region are available\n3. Language code and script are available\n4. Language code, region and script are available \n \nIn each of the parameters string `LL` is replaced with the language code, `RR` with the region and `SCRP` with the script. \n\n**Examples for `formatLang: LL, LL_RR, LL-SCRP, LL_RR-SCRP`**\n\n| Source string | Language | Region | Script | Formatted |\n| --- | --- | --- | --- | --- |\n| de | de | | | de | \n| cs-CZ | cs | CZ | | cs_CZ |\n| zh+Hant | zh | | Hant | zh-Hant |\n| zh+Hans+TW | zh | TW | Hans | zh_TW-Hans |\n\n**Examples for `formatLang: b+LL, b+LL+RR, b+LL+SCRP, b+LL+SCRP+RR`**\n                \n| Source string | Language | Region | Script | Formatted |\n| --- | --- | --- | --- | --- |\n| de | de | | | b+de | \n| cs-CZ | cs | CZ | | b+cs+CZ |\n| zh-Hant | zh | | Hant | b+zh+Hant |\n| zh-TW-Hans | zh | TW | Hans | b+zh+Hans+TW |       \n\n\n### androidBuildType\n\nParse the build type from Android project standard structure. \n\nAs parameters separated by comma, it expects a list of all build types defined in your project.\n\nIt looks for `src\u002F` and parse the next part, so by sure that `src\u002F` is included in the source string.\n\n**Example:** \n - Source: `src\u002FgpFreeDebug\u002Fres\u002Fvalues\u002Fstrings.xml`\n - Command: `androidBuildType: debug, release`\n - Output: `debug`\n \n\n### androidProductFlavors\n\nParse product flavors from Android project standard structure. \n \nAs parameters, it expects list of product flavors \u002F dimensions. Product flavors in one dimension are separated by space and dimensions are separated with comma.\n \nIt's important to list dimensions in the correct order (as appear in build.gradle) to maintain priority correctly. \n\nIt looks for `src\u002F` and parse the next part, so by sure that `src\u002F` is included in the source string.\n\n**Example:**\n\nProduct flavors are defined as follows (gp = Google Play, am = Amazon Store) in your gradle.build file. \n\n```groovy\nflavorDimensions('store', 'price')\nproductFlavors {\n    gp {\n        dimension \"store\"\n    }\n    am {\n        dimension \"store\"\n    }\n    free {\n        dimension \"price\"\n    }\n    full {\n        dimension \"price\"\n    }        \n}\n```\n\nThe operation definition for such a configuration would be:\n\n`androidProductFlavors: gp am, free full`  \n\n**Example situation:** \n - Source: `src\u002FgpFreeDebug\u002Fres\u002Fvalues\u002Fstrings.xml`\n - Command: `androidProductFlavors: gp am, free full`\n - Output: `0:gp 1:free`\n\n**Note:** The output contains not only list of the product flavors but also priorities. They are correctly process by the server.\n\n## Multiple operations on a single line\n\nIf you need more simple operations, you can use `|` character to join more of them on a single line.\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \"test\",\n        \"source\": \"${path}\",\n        \"operations\": \"substringAfter: \u002F | substringBeforeLast: \u002F\"\n    }\n\n  ]\n}\n```\n\nThe example above is the same as:\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \"test\",\n        \"source\": \"${path}\",\n        \"operations\": [\n          \"substringAfter: \u002F\", \n          \"substringBeforeLast: \u002F\"\n        ]\n    }\n\n  ]\n}\n```\n\n## Special characters\n\nSome characters have a special meaning and so it's necessary to replace them. \n\n- white-spaces are trimmed to prevent formatting issues, please use `%space%` instead\n- `,` is used as parameter separator, please use `%comma%` instead\n- `$` is used for including variables, please use `%dollar%` instead\n- `|` is used for separating more command on a single line, please use `%vbar%` instead\n- `>` is used for redirecting output, please use `%bracket%` instead\n\n**Example:**\n\nIf you need to replace ` ab,c` (starts with space) with `$>|`, do it like this:\n\n```json\n{\n  \u002F\u002F ...\n  \"operations\": \"replace: %space%ab%comma%c, %dollar%%bracket%%vbar%\"\n}\n```\n\n## Redirecting output\n\nUsing the `>` (similary to bash, etc.), it's possible to redirect output to so-called temporary variable. Temporary variables are valid only for the single file.\n\nWhen the output of the operation is redirected, the source string is still taken as input but after the operation, a temporary variable is created (or changed) and the input is left unchanged. \n\nThis is useful in some specific situations like switching position of two parts of the file name. The same effect could be achieved with more transformations, but that would introduce unnecessery clutter. \n\n**Example:**\n\nLet's say that the input is `file_cs-CZ` where both `file` and `cs-CZ` may be different for each of processed file. However, you need `cs-CZ_file`.\n\nIt's very simple with the output redirecting:    \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \"redirecting_output_test\",\n        \"source\": \"${path}\",\n        \"operations\": [\n          \"substringBefore: _ > first_part\", \n          \"substringAfter: _ > second_part\",\n          \"set: ${second_part}_${first_part}\"\n        ]\n    }\n\n  ]\n}\n```\n\n## Initializators\n\nAny rule with name starting with `:` will be executed immediately. This rules cannot be called using `${variable}` as symbol `:` is not allowed in the name of variable.\n\nTogether with redirecting output (described above), initializators can be used to preproduced output.\n\nThis is particularly useful when you apply several different operations on the input string and want to get more outputs along the way.\n\n**Example:** \n\nLet's say that the input string is path like `\u002Faa\u002Fbb\u002Fcc\u002F...` where `aa`, `bb` and `cc` are path components you need for further processing.   \n\nThe example transformation below removes the first `\u002F`, stores `aa` into `first`, removes `aa\u002F`, store `bb` into `second`, removes `bb\u002F` and store `cc` into `third`.\n\nThis is done before the file is processed and so you can safely use variables `first`, `second` and `third`. \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"transformations\": [\n    \n    {\n        \"name\": \":preparse_path\",\n        \"source\": \"${path}\",\n        \"operations\": [\n          \"substringAfter: \u002F\", \n          \"substringBefore: \u002F > first\",\n          \"substringAfter: \u002F\",\n          \"substringBefore: \u002F > second\",\n          \"substringAfter: \u002F\",\n          \"substringBefore: \u002F > third\"\n        ]\n    }\n\n  ]\n}\n```\n\n### Initializator scoping\n\nAs all transformations - both for upload and download - are defined together and can access different variables, it's important to be sure that inializator is not run with the expected variables being undefined. \n\nFor this reason, it's possible to scope the initializator to either upload or download by adding a prefix:\n\n`:upload:find-product-flavors` - Is only run for upload\n`:download:create-output-path` - Is only run for download\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2506,"featured_icon":2507},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2511],{"id":2512,"status":8,"title":2513,"content":2514,"slug":2515,"created_on":2516,"modified_on":2517,"owner":2121,"meta_title":7,"category":2518},283,"Does Localazy use language codes from ISO 639 when exporting translations?","[ISO 639 language codes](https:\u002F\u002Fwww.iso.org\u002Fiso-639-language-codes.html) are internationally recognized codes for the representation of more than 500 languages or language families. Localazy follows the standards provided by [Unicode CLDR](https:\u002F\u002Fcldr.unicode.org\u002F) which respects the ISO declaration.\n\nYou can see locale codes in the language table and you can also setup aliases in your CLI configuration to use different code for any given language you download from Localazy via CLI.\n\n> Learn more about [Language Aliases on the blog](\u002Fblog\u002Flocalazy-cli-tips-language-aliases-expansions)\n\n","does-localazy-use-language-codes-from-iso-639-when-exporting-translations","2023-07-13T13:16:15.000Z","2023-07-13T13:16:18.000Z",{"id":286,"status":8,"created_on":2104,"sort":7,"slug":2519,"label":2520,"on_faq_index":17},"internationalization","Internationalization",[],[2523],{"id":441,"documentation_id":441,"languages_code":812,"slug":2501,"title":2502,"content":2504,"meta_title":2502,"meta_description":2503,"excerpt":2503},[],{"id":873,"status":8,"sort":2526,"created_on":1856,"modified_on":2527,"slug":2528,"title":2529,"excerpt":2530,"content":2531,"meta_title":2529,"meta_description":2530,"pinned":15,"main_image":7,"section":2532,"subsection":2535,"cta":2536,"faq":2537,"dictionary":2538,"translations":2539,"documentation_id":873,"blog_articles":2541},"31075","2025-02-17T14:49:36.000Z","excluding-string-keys","Excluding String Keys","Learn how to include\u002Fexclude string keys during upload and format conversion.","There are two reasons for filtering strings:\n\n- for [upload](\u002Fdocs\u002Fcli\u002Fupload-reference), to filter out sensitive strings and strings that you don't want to translate\n- for [format conversions](\u002Fdocs\u002Fcli\u002Fformat-conversions), to filter out strings that you don't want to be included in the converted file; e.q., you may want to remove platform-specific texts\n\n\n## Filtering keys\n\nStrings are always filtered based on rules for their keys. \n\nYou can define filtering rules using `keySeparator`, `includeKeys` and `excludeKeys`. For [upload](\u002Fdocs\u002Fcli\u002Fupload-reference), define it directly in the `upload` section. For [format conversions](\u002Fdocs\u002Fcli\u002Fformat-conversions), define it separately for each of `actions`. \n\n\nFiltering example:\n\n```\n{\n  \"keySeparator\": \".\",\n  \"includeKeys\": [\"REGEX:key_.*\", \"MATCH:my_key\"],\n  \"excludeKeys\": [\"REGEX:private_.*\"]    \n}\n```\n\n## Structured keys and `keySeparator`\n\nTo match structured keys like in the example below, you can define `keySeparator`. The default value is `.`, but you can change it to any string. \n\n```\n{\n\t\"level1\": {\n\t\t\"level2\": {\n\t\t\t\"key\": \"Text\"\n\t\t}\n\t}\n}\n```\n\nFor example, with `\"keySeparator\": \"->\"` the structured key from file above would be encoded as: `level1->level2->key`.\n\n## Filtering rules\n\nBoth `includeKeys` and `excludeKeys` is a list of strings; list of filtering rules. The format of each of the rules is `OPERATION:parameter`.\n\n**Available operations:**\n\n| Operation | Description |\n| --- | --- |\n| `MATCH:value` | The rule is valid only if the key exactly matches `value`.  |\n| `MATCH-CI:value` | The same as `MATCH:value` but this is case-insensitive variant. |\n| `CONTAIN:value` | The rule is valid only if the key contains `value`.  |\n| `CONTAIN-CI:value` | The same as `CONTAIN:value` but this is case-insensitive variant. |\n| `PREFIX:value` | The rule is valid only if the key starts with `value`. |\n| `PREFIX-CI:value` | The same as `PREFIX:value` but this is case-insensitive variant. |\n| `SUFFIX:value` | The rule is valid only if the key ends with `value`. |\n| `SUFFIX-CI:value` | The same as `SUFFIX:value` but this is case-insensitive variant. |\n| `REGEX:expression` | The rule is valid if the key matches the regular expression defined by `expression`. |\n\nInvalid rules are skipped. \n\n## Filtering priority\n\nIf `includeKeys` is empty or missing, all texts except for those excluded by `excludeKeys` are processed. \n\nIf `includeKeys` is not empty, only explicitly included texts are processed.\n\nRules in `excludeKeys` have higher priority than those in `includeKeys`. It means that if the same text matches a rule both in `includeKeys` and `excludeKeys`, it is not processed. \n\n## Format specific keys\n\nFor some formats, such as XLIFF, INI, etc., the key may carry also additional information about internal file structure.\n\nBe sure to use the correct expression for filtering - e.q., `CONTAIN` filter instead of the exact match. \n\nAlso, consult the list of phrases in Localazy for the key overview.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2533,"featured_icon":2534},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2540],{"id":873,"documentation_id":873,"languages_code":812,"slug":2528,"title":2529,"content":2531,"meta_title":2529,"meta_description":2530,"excerpt":2530},[],{"id":66,"status":8,"sort":2543,"created_on":1856,"modified_on":2544,"slug":2545,"title":2546,"excerpt":2547,"content":2548,"meta_title":2549,"meta_description":2547,"pinned":15,"main_image":7,"section":2550,"subsection":2553,"cta":2554,"faq":2555,"dictionary":2556,"translations":2557,"documentation_id":66,"blog_articles":2559},"31080","2024-07-16T15:14:41.000Z","existing-translations","Uploading Existing Translations","Learn how to upload existing translations along with your source language.","> You can upload existing translations to your source files also in [Localazy File Management](\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#update-existing-localization-files) \n\nUploading existing translations via CLI is easy to do, and there are auto-detection and validation features to assist you. **In fact, our sensible defaults are great for majority of situations.**\n\n## Specify the language!\n\n**The most important thing when uploading existing translations is to specify the language of the file.** \n\nYou can use auto-detection (read more below) or obtain language from the path or filename using [transformations](\u002Fdocs\u002Fcli\u002Ftransformations). \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ... \n\n  \"upload\": {\n    \"files\": {\n      \"pattern\": \"src\u002Fresources\u002Flocalization\u002Fstrings_*.json\",\n      \"lang\": \"${autodetectLang}\"\n    } \n  }\n}\n```\n\nFor usual situations, this is enough!\n\n## Separate the source language and translations\n\nYou should upload existing translations only once as uploading them each time could interferre with the work of your translators and contributors. It's handy to use [groups](\u002Fdocs\u002Fcli\u002Fcommand-line-options) for separating upload of the source language and other translations. \n\nWhen you make changes to your translations, you should change and upload the source language only and manage the rest with the Localazy platform.\n\nThe example code below defines two groups. The default one for uploading the source `strings_en.json` and the second one named `existing` for uploading everything except the source language. \n\nInvoke `localazy upload existing` to upload all translations only once and later use `localazy upload` to upload changes to the source language. \n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ... \n\n  \"upload\": {\n\n    \"files\": [\n      {\n        \"pattern\": \"src\u002Fresources\u002Flocalization\u002Fstrings_en.json\",\n        \"lang\": \"inherited\"\n      },\n      {\n        \"group\": \"existing\",\n        \"pattern\": \"src\u002Fresources\u002Flocalization\u002Fstrings_*.json\",\n        \"excludes\": [\"src\u002Fresources\u002Flocalization\u002Fstrings_en.json\"],\n        \"lang\": \"${autodetectLang}\"\n      }   \n    ]\n\n  }\n}\n```\n\n## The problem with different filenames\n\nWith Localazy, you can manage many files with the same keys. Therefore, the key is not the only differentiator. You must ensure that path, filename and key is the same to link translations correctly. You can imagine it as if the full key to the strings would be consisted of path, file and actual key.\n\nTypically, translations are placed in folders or files with different names (usually containing the locale code).\n\nImagine that you have translations stored like this:\n\n```\nsrc\u002Fresources\u002Flocalization\u002Fstrings_en.json  \u002F\u002F your source language\nsrc\u002Fresources\u002Flocalization\u002Fstrings_cs.json\nsrc\u002Fresources\u002Flocalization\u002Fstrings_fr.json\n```\n\nIf you would upload them with their original paths and filenames, you end up with `strings_cs.json` and `strings_fr.json` not being imported at all as they don't have the source language. Why? Because the path is the same for all files (`src\u002Fresources\u002Flocalization`) but filenames are different (`strings_en.json`, `strings_cs.json`, `strings_fr.json`).\n\n::: info\nLocalazy doesn't upload the file's path by default and it uses auto-detection for filenames, so **this situation is handled automatically** for you ;-).\n:::\n\n\n## And the simple solution\n\nYou can solve the example issue above easily by forcing the same filename `strings.json` for all files. \n\nBy default, Localazy tries to do that automatically and takes `file` from `${autodetectFileWithFallback}` that, if possible, remove the locale code and _clear_ the filename. You can do it manually for complex situations or if the auto-detection fails.\n\n```json\n{\n  \u002F\u002F ... other parts omitted for brevity ... \n\n  \"upload\": {\n    \"files\": {\n      \"pattern\": \"src\u002Fresources\u002Flocalization\u002Fstrings_*.json\",\n      \"lang\": \"${autodetectLang}\",\n      \"file\": \"strings.json\"\n    } \n  },\n\n  \"download\": {\n    \"files\": \"src\u002Fresources\u002Flocalization\u002Fstrings_${lang}.json\"  \n  }\n\n}\n```\n\n::: info\nUsing [transformations](\u002Fdocs\u002Fcli\u002Ftransformations), you can write generic rules for cleaning your paths and filenames. It's handy when you are uploading more different files and forcing the same filename is not possible. \n:::\n\n::: info\n[Transformations](\u002Fdocs\u002Fcli\u002Ftransformations) can be used for generating output paths in the **download** section for complex projects.\n:::\n\n### The important rule\n\nTake time to upload your files correctly (eg. remove language from the file's name and path) as it helps you to keep things nicely sorted and prevent future problems. \n\nIf you don't do and decide to change paths, files and other parameters later, you can hit the wall as the phrases may be uploaded in separated namespaces. In Localazy, we have mechanisms such as InTM to assist you with moving namespaces, but it's always better to avoid it if possible.\n\n**Always run the CLI in simulation mode with `localazy upload -s` to test your data before uploading them.**\n\n## Auto-detecting paths, files and languages\n\nFor each of files collected based on patterns in the **upload** section, the auto-detection is run automatically. \n\nThe algorithm tries to detect the locale (language, region and script) from the both file and path and clean the path and file accordingly.\n\nBased on the results of the auto-detection algorithms, extra variables are available:\n\n| Variable | Description |\n| --- | --- |\n| `${autodetectSuccess}` | Set to string `true` if the auto-detection was successful and to `false` otherwise. This can be used with [conditions](\u002Fdocs\u002Fcli\u002Fconditions) to apply different operations to files. | \n| `${autodetectLang}` | Auto-detected locale if auto-detection is possible. | \n| `${autodetectPath}` | Auto-detected path if auto-detection is possible. | \n| `${autodetectFile}` | Auto-detected file if auto-detection is possible. | \n| `${autodetectFileWithFallback}` | Auto-detected file if auto-detection is possible or return `${file}` as a fallback. | \n\nBy default, if the auto-detection fails, and the file uses any of the variables above (except for `${autodetectFileWithFallback}`), it's skipped. You can configure the auto-detection to do not skip files for which it fails using `skipFailedAutodetection` in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n**Always run the CLI in simulation mode with `localazy upload -s` to see the results of the auto-detection prior to uploading your files!** \n\n## Add existing translations to the uploaded strings\n\nIf you uploaded your source language before and want to add also existing translations, just be sure to use the same configuration (file, path, etc.) and upload them. Localazy takes care about the rest.\n\n**Tip:** You can list all files for the given app by running `localazy list` with the minimal configuration:\n\n```json\n{\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\"\n}\n```\n\nIt will help you to upload existing translations correctly. \n\n## Modules, libraries, product flavors, ...\n\nLocalazy comes with support for advanced concepts for complex projects such as modules, libraries, product flavors and build types. \n\nWhen it comes to uploading existing translations, the logic is the same as for paths and files. Eg. the same key in different product flavors is like having two different keys. \n\nLearn more information about [modules, libraries, product flavors and build types](\u002Fdocs\u002Fcli\u002Fmodules-libraries-and-product-flavors).\n\n___CLI_LINKS___\n","Uploading existing translations",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2551,"featured_icon":2552},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2558],{"id":66,"documentation_id":66,"languages_code":812,"slug":2545,"title":2546,"content":2548,"meta_title":2549,"meta_description":2547,"excerpt":2547},[],{"id":291,"status":8,"sort":2561,"created_on":1856,"modified_on":2500,"slug":2562,"title":2563,"excerpt":2564,"content":2565,"meta_title":2566,"meta_description":2564,"pinned":15,"main_image":7,"section":2567,"subsection":2570,"cta":2571,"faq":2572,"dictionary":2573,"translations":2574,"documentation_id":291,"blog_articles":2576},"31090","modules-libraries-and-product-flavors","Modules, Libraries & Product Flavors","Learn how to use Localazy with complex projects feature modules, libraries, product flavors and build types.","**We do not recommend using modules, libraries and build types. They are available for compatibility with our SDKs.**\n\n**We strongly advise to use only path and file name. Many features of Localazy are not supported when using modules, libraries and build types.**\n\nThe Localazy translation platform supports modules, libraries, build types and product flavors including the correct strings prioritizations and overriding.\n\nAll these features are supported by the Localazy CLI too. Please read about [**upload**](\u002Fdocs\u002Fcli\u002Fupload-reference) and [**download**](\u002Fdocs\u002Fcli\u002Fdownload-reference) to learn how to define them for your files.\n\n## Module\n\nA module is used for independent app modules; like dynamic feature modules in Android. \n\nA module works like a namespace, and can contain the same paths, files and keys but still keep the translations completely separated from the common strings and other modules.  \n\nAlso, it has a specific behavior for SDK integrations like our [Android library](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin). The module's strings have precedence over common ones, but only in the given module. \n\nFeel free to use modules whenever you need to translate app that consists of more independent parts.  \n\n## Library\n\nA library doesn't work as a namespace. When a string from library has the same path, file name and key as already exist in common strings, it's not imported.   \n\nSimply put: common strings have higher priority than those from libraries. \n\nThis is useful when strings from libraries are overriden by app's strings. It works this way on Android for example.  \n\nThe great thing about libraries is that strings that would be overriden anyway are not sent for translating (and so you save time and money).  \n\nIf more libraries share the same keys that don't exist in the app, the last processed library takes precedence over the previous ones. \n\nFor specific situations, you can set **allowDuplicateKeys** in  [**upload**](\u002Fdocs\u002Fcli\u002Fupload-reference). The path and file name become irrelevant and only the key is used as a string differentiator. It simplifies using libraries. Please note that it's a global option and you should NOT set it to **false** under normal circumstances!\n\n## Product flavors\n\nProduct flavors are well-known to Android developers as a way how to generate different app versions from a single codebase. \n\nTypically, product flavors are used for building eg. free and full versions or specific versions for different stores.   \n\nYou can define more product flavors separated with a space. The supported formats are:\n\n* `free playstore` - A list of product flavors related to the file.\n* `0:free 1:playstore` - A prioritized list of product flavors. This format is useful when some product flavor is missing, and the priority still should be correctly handled. \n\nProduct flavors work like a namespace, and can contain the same paths, files and keys but still keep the translations completely separated from the common strings and other product flavors.\n\n## Build type\n\nA build type is generally used to differentiate strings from **release**, **debug**, **alpha**, **beta**, etc. versions. You can define any string that is meaningful for you. \n\nA build type works like a namespace, and can contain the same paths, files and keys but still keep the translations completely separated from the common strings and other build types.\n\n## Combinations\n\nThere are no limits on how you can combine modules, libraries, product flavors and build types. \n\nA combination of those that work as a namespace creates a new separated namespace. So you can have different product flavors in different modules, etc. \n\n___CLI_LINKS___","Modules, libraries & product flavors",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2568,"featured_icon":2569},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2575],{"id":291,"documentation_id":291,"languages_code":812,"slug":2562,"title":2563,"content":2565,"meta_title":2566,"meta_description":2564,"excerpt":2564},[],{"id":2578,"status":8,"sort":2579,"created_on":2580,"modified_on":2581,"slug":2582,"title":2583,"excerpt":2584,"content":2585,"meta_title":2586,"meta_description":2587,"pinned":15,"main_image":7,"section":2588,"subsection":2591,"cta":2592,"faq":2593,"dictionary":2594,"translations":2599,"documentation_id":2578,"blog_articles":2601},166,"31100","2022-11-20T13:03:42.000Z","2025-02-17T14:49:48.000Z","highly-dynamic-configurations","Dynamic Configurations","Learn more about Dynamic Configurations with CLI.","As you can learn in [Command-Line Options](\u002Fdocs\u002Fcli\u002Fcommand-line-options), it's possible to provide additional parameters using the `-p` option. \n\nSuch parameters can be used the same way as any other parameter (`${parameter_name}`), but they are evaluated statically before the configuration JSON is parsed. Therefore, it's possible to use them to alter the behavior signifficantly.\n\n## Dynamic Upload & Download\n\nE.g., you can re-use the same configuration to upload different sources:\n\n```json\n{ \n\n  \"upload\": { \n    \"files\": \"${uploadPath}\u002Fsrc\u002Flocales\u002F**\u002Ftranslations.json\",\n    \"path\": \"${uploadPath}\", \n    \u002F\u002F ... \n  } \n  \n}\n```\n\nNow, you can just invoke our CLI like this:\n\n`localazy upload -p uploadPath:app`  \n`localazy upload -p uploadPath:library1`  \n`localazy upload -p uploadPath:library2`\n\nSimilar approach can be applied to the `download` section to select on where to store the resulting files or how to filter them based on specific parameters. \n\nIn a way, using additional parameters like this is similar to using [groups](\u002Fdocs\u002Fcli\u002Fcommand-line-options#groups), but you don't need to define the corresponding section beforehand. \n\n## Changing Parameters Dynamically\n\nFrom the latest CLI version (1.6.5+), it's possible to define parameters as strings even for boolean and numberic ones allowing to use a construction like this:\n\n```json\n{\n\n  \"upload\": {\n    \"folder\": \"${folder}\",\n    \"deprecate\": \"${deprecate}\",\n    \"filterSource\": \"${filterSource}\",\n    \"features\": [\"${feature1}\", \"${feature2}\"],\n    \u002F\u002F ...\n  }\n\n}\n```\n\nNow, you can just invoke our CLI:\n\n`localazy upload -p folder:. -p deprecate:none -p filterSource:true -p feature1:filter_untranslated -p feature2:` \n\nPlease note that empty items in `features` are filtered out and not evaluated allowing to use additional parameters in described way.\n\n## Whole JSON Blocks\n\nAs additional parameters are evaluated before the JSON is parsed, you can use them for an ugly hacks like this one:\n\n```json\n{\n\n  \"upload\": {\n    ${json1}\n    \"type\": \"json\",\n    \"files\": \"locales\u002F*.json\"\n  }\n\n}\n```\n\nNow, by invoking our CLI with the command below, you can provide a part of the configuration JSON dynamically. \n\n`localazy upload -p 'json1:\"importAsNew\": true,'`\n\nHowever, this approach means that the input configuration file is no longer a valid JSON. \n\n## Default Values\n\nTo specify default value for the external parameter, use the `${paramName|Default value}` format.\n\n```json\n{ \n  \"download\": { \n    \"includeSourceLang\": \"${includeSourceLang|false}\" \n  } \n}\n```\n\nYou can invoke the CLI as `localazy download` to download translations only, or as `localazy download -p includeSourceLang:true` to download also the source language. ","Highly Dynamic Configurations","Use additional parameters and create dynamic localization workflows.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2589,"featured_icon":2590},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[2595],{"id":5,"status":8,"owner":1855,"created_on":2596,"title":217,"excerpt":2597,"content":2598,"slug":1836,"meta_title":7,"meta_description":7,"canonical":7},"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.",[2600],{"id":2578,"documentation_id":2578,"languages_code":812,"slug":2582,"title":2583,"content":2585,"meta_title":2586,"meta_description":2587,"excerpt":2584},[],{"id":2603,"status":8,"sort":2604,"created_on":2605,"modified_on":2606,"slug":2607,"title":2608,"excerpt":2609,"content":2610,"meta_title":2608,"meta_description":2609,"pinned":15,"main_image":7,"section":2611,"subsection":2614,"cta":7,"faq":2615,"dictionary":2616,"translations":2617,"documentation_id":2603,"blog_articles":2619},172,"31110","2023-02-12T13:22:30.000Z","2025-02-17T14:49:54.000Z","comments","Comments","Define scheme or add comments to your configuration using $-prefixed keys.","The CLI validates the configuration and disallow for unknown keys or values to protect you from creating invalid configurations. \n\nHowever, you may need to define `$scheme` or add comments to your configuration and for this reason, any key prefixed with the symbol `$` is ignored.\n\nThe configuration below is fully valid for Localazy CLI from version 1.7.0+ above:\n\n```json\n{ \n  \"$scheme\": \"localazy\u002Fcli\", \n  \"upload\": { \n    \"files\": [ \n      { \n        \"$comment\": \"The rule for the main app locales.\", \n        \"type\": \"json\", \n        \"$features_comment\": \"The next line is commented out.\",\n        \"$features\": [\"filter_untranslated\"], \n        \"pattern\": \"app\u002F**\u002Flocales\u002F*.json\" \n      } \n    ] \n  } \n}\n```\n\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2612,"featured_icon":2613},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[],[],[2618],{"id":2603,"documentation_id":2603,"languages_code":812,"slug":2607,"title":2608,"content":2610,"meta_title":2608,"meta_description":2609,"excerpt":2609},[],{"id":2621,"status":8,"sort":2622,"created_on":2623,"modified_on":2624,"slug":2625,"title":2626,"excerpt":2627,"content":2628,"meta_title":2626,"meta_description":2627,"pinned":15,"main_image":7,"section":2629,"subsection":2632,"cta":7,"faq":2633,"dictionary":2634,"translations":2635,"documentation_id":2621,"blog_articles":2637},173,"31120","2023-02-12T13:29:36.000Z","2024-07-17T05:44:51.000Z","community-sharing","Community Sharing","Let's share your configuration with the community and help each other! ","If you are willing to share your configuration with the community to help other users of Localazy, you can add the `community` section to your `localazy.json` file like this:\n\n```json\n{ \n  \"community\": { \n    \"author\": \"Your Name\", \n    \"email\": \"your@email.com\", \n    \"company\": \"Localazy\", \n    \"website\": \"https:\u002F\u002Flocalazy.com\", \n    \"tags\": [\"nuxt\", \"nuxt-i18n\", \"javascript\", \"typescript\"],\n    \"description\": \"Uploading files for nuxt-i18n.\" \n  }, \n  \u002F\u002F ... \n}\n```\n\nWhen the configuration file with this section included is uploaded to Localazy servers, it’s sent for the approval to become a part of the upcoming community sharing portal. Also, we use such configurations for improving our documentation, quick starts and to introduce better automated solutions. \n\n**Note:** Do not worry about your `writeKey` and `readKey`. They are automatically removed before the configuration file would be used for the community sharing. \n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2630,"featured_icon":2631},{"id":648},{"id":651},{"id":94,"status":8,"sort":5,"created_on":1872,"name":2189},[],[],[2636],{"id":2621,"documentation_id":2621,"languages_code":812,"slug":2625,"title":2626,"content":2628,"meta_title":2626,"meta_description":2627,"excerpt":2627},[],{"id":261,"status":8,"sort":2639,"created_on":1856,"modified_on":2640,"slug":2641,"title":2642,"excerpt":2643,"content":2644,"meta_title":2642,"meta_description":2643,"pinned":15,"main_image":7,"section":2645,"subsection":2648,"cta":2649,"faq":2650,"dictionary":2655,"translations":2656,"documentation_id":261,"blog_articles":2658},"32010","2024-07-16T15:14:40.000Z","android-format","File Format - Android XML","Learn how to use Localazy CLI for localization of your Android app.","Android XML format is fully supported including array-lists and plurals. No extra configuration is necessary. \n\n**For Android app localization, we recommend using the [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) that automatically handles uploads, downloads and adds code for [OTA (over-the-air) updates](\u002Fdocs\u002Fandroid\u002Fonly-ota-updates-that-really-work).**\n\n\n## The basic usage\n\nUploading the source language is easy and with a [number of variables](\u002Fdocs\u002Fcli\u002Fvariables) for the download part, including preformatted Android language `${langAndroidRes}`, it's also simple to store translated files to their correct destination.\n\n```json\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n\n  \"upload\": {\n    \"type\": \"android\",   \n    \"files\": \"src\u002Fmain\u002Fres\u002Fvalues\u002Fstrings.xml\"\n  },\n\n  \"download\": {\n    \"files\": \"src\u002Fmain\u002Fres\u002Fvalues-${langAndroidRes}\u002F${file}\"\n  }\n\n}\n```\n\n\n## Upload existing translations\n\nFor Android projects, you can rely on the [auto-detection of the language from path\u002Ffile](\u002Fdocs\u002Fcli\u002Ftransformations).\n\n```json\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n\n  \"upload\": {\n    \"type\": \"android\",\n        \n    \"files\": [\n\n      \u002F\u002F For repeated upload of the source language.\n      \u002F\u002F Path is not necessary, so we remove it.  \n      {\n        \"pattern\": \"src\u002Fmain\u002Fres\u002Fvalues\u002Fstrings*.xml\"\n      },\n\n      \u002F\u002F For initial upload of all existing translations.\n      \u002F\u002F Run: `localazy upload all` to upload all translations.  \n      {\n        \"group\": \"all\",\n        \"pattern\": \"src\u002Fmain\u002Fres\u002Fvalues-*\u002Fstrings*.xml\",\n        \"lang\": \"${autodetectLang}\"\n      }\n\n    ]\n  },\n\n  \u002F\u002F Place downloaded translations to the correct folder.\n  \"download\": {\n    \"files\": \"src\u002Fmain\u002Fres\u002Fvalues-${langAndroidRes}\u002F${file}\"\n  }\n\n}\n```\n\n\n## Product flavors & build type\n\nLocalazy comes with full support for product flavors and build types. There are [transformations](\u002Fdocs\u002Fcli\u002Ftransformations) `androidBuildType` and `androidProductFlavors` for detecting those from the standard project structure.\n\nAlso, with the [preformatted variable](\u002Fdocs\u002Fcli\u002Fvariables) `${androidFlavoredFolder}`, it's easy to place downloaded translations to the correct folders.\n\n```json\n{\n\n  \"writeKey\": \"your-apps-write-key\", \n  \"readKey\": \"your-apps-read-key\",\n  \n  \u002F\u002F Use transformations to get product flavors and the build type from path.\n  \"transformations\": [\n    {\n      \"name\": \"product_flavors\",\n      \"source\": \"${path}\",\n      \"operations\": [\n        \"androidProductFlavors: gp am, free full auto\"\n      ]\n    },\n    {\n      \"name\": \"build_type\",\n      \"source\": \"${path}\",\n      \"operations\": [\n        \"androidBuildType: debug, release\"\n      ]\n    }\n  ],\n\n  \"upload\": {\n  \n    \"type\": \"android\",\n    \n    \"files\": [\n    \n      \u002F\u002F For repeated upload of the source language from all flavors and product types.\n      \u002F\u002F Path is not necessary, so we remove it. We can rebuild path from other variables.  \n      {\n        \"pattern\": \"src\u002F*\u002Fres\u002Fvalues\u002Fstrings*.xml\",\n        \"productFlavors\": \"${product_flavors}\",\n        \"buildType\": \"${build_type}\"\n      },\n      \n      \u002F\u002F For initial upload of all existing translations.\n      \u002F\u002F Run: `localazy upload all` to upload all translations. \n      {\n        \"group\": \"all\",\n        \"pattern\": \"src\u002F*\u002Fres\u002Fvalues-*\u002Fstrings*.xml\",\n        \"lang\": \"${autodetectLang}\",\n        \"productFlavors\": \"${product_flavors}\",\n        \"buildType\": \"${build_type}\"\n      }\n      \n    ]\n  },\n\n  \u002F\u002F Place downloaded translations to the correct folder.\n  \"download\": {\n    \"files\": \"src\u002F${androidFlavoredFolder}\u002Fres\u002Fvalues-${langAndroidRes}\u002F${file}\"\n  }\n\n}\n```\n\n## Strings uploaded with the Gradle plugin\n\nThe Gradle plugin uploads data in a very similar way as described above and so it's possible to download translations using:\n\n```json\n{\n\n  \u002F\u002F ... other parts omitted for brevity ...\n  \n  \"download\": {\n    \"files\": \"src\u002F${androidFlavoredFolder}\u002Fres\u002Fvalues-${langAndroidRes}\u002F${file}\"\n  }\n\n}\n```\n\n## Running with Gradle\n\nWe recommend using the [Localazy Gradle plugin](\u002Fdocs\u002Fandroid\u002Flocalazy-gradle-plugin) that automatically handles uploads, downloads and adds code for [OTA (over-the-air) updates](\u002Fdocs\u002Fandroid\u002Fonly-ota-updates-that-really-work).\n\nHowever, you can run the CLI tool directly from your Gradle build script. Just place the CLI binary to the app's module folder along with the configuration file `localazy.json` and create task:   \n\n```groovy\n\u002F\u002F Create task for running Localazy CLI. \ntask downloadTranslations(type: Exec) {\n    executable \".\u002Flocalazy\"\n    args \"download\", \"-q\"\n} \n\n\u002F\u002F Run the Localazy CLI task only for release versions. \nandroid.applicationVariants.all { variant ->\n    if (!variant.buildType.debuggable) {\n        variant.preBuildProvider.get().dependsOn(downloadTranslations)\n    }\n}\n```\n\n## Encoding of new lines\n\nBy default, new lines are represented by actual new lines. If you prefer escape them using `\\n`, add `escape_new_lines` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n___CLI_LINKS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2646,"featured_icon":2647},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2651,2653],{"id":2315,"status":8,"title":2316,"content":2317,"slug":2318,"created_on":2319,"modified_on":2320,"owner":2121,"meta_title":7,"category":2652},{"id":5,"status":8,"created_on":2104,"sort":5,"slug":2322,"label":2323,"on_faq_index":17},{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2654},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2657],{"id":261,"documentation_id":261,"languages_code":812,"slug":2641,"title":2642,"content":2644,"meta_title":2642,"meta_description":2643,"excerpt":2643},[],{"id":221,"status":8,"sort":2660,"created_on":1856,"modified_on":2544,"slug":2661,"title":2662,"excerpt":2663,"content":2664,"meta_title":2662,"meta_description":2663,"pinned":15,"main_image":7,"section":2665,"subsection":2668,"cta":2669,"faq":2670,"dictionary":2673,"translations":2674,"documentation_id":221,"blog_articles":2676},"32020","ios-format","File Format - iOS \u002F macOS","Learn how to use Localazy CLI for localization of your iOS and macOS apps.","If you are looking for the **XCode Strings Catalog** format, navigate to its [**dedicated page**](\u002Fdocs\u002Fcli\u002Fxcstrings-format).\n\nFor iOS and macOS apps, Localazy supports **.strings**, **.stringsdict**, **.plist** and [**XLIFF**](\u002Fdocs\u002Fcli\u002Fxliff-12-format) files. \n\nThe XLIFF format is supported including the Apple's extension for plurals and [is described in its own article](\u002Fdocs\u002Fcli\u002Fxliff-12-format).\n\n## .strings and .stringsdict\n\n**Typical usage:**\n\n```\n{\n\n  \u002F\u002F ... other parts omitted for brevity ...\n\n  \"upload\": {    \n    \"features\": [\"parse_array\", \"parse_plurals\"],\n    \"files\": [\n      {\n        \"type\": \"ios-strings\",\n        \"pattern\": \"Base.lproj\u002FLocalizable.strings\"\n      },\n      {\n        \"type\": \"ios-stringsdict\",\n        \"pattern\": \"Base.lproj\u002FLocalizable.stringsdict\"\n      }\n    ]\n  },\n\n  \"download\": {\n    \"files\": \"${iosLprojFolder}\u002F${file}\"\n  }\n\n}\n```\n\nUsing the **features**, you can change the encoding, enable plurals and arrays. \n\n### Encoding of .strings files\n\nThe default encoding is **auto**. You can change it by including **encoding={encoding}** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. Available options are: `utf8`, `utf16`, `utf16le`, `utf16be`.\n\nIf you need BOM (byte order mark) to be exported in the output file, please add **add_bom** to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n### Arrays in .strings\n\nArrays are good but beware of changing the number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nIt's possible to enable support for arrays using the feature `parse_array`. The file below will be parsed as an array instead of separate strings:\n\n```\n\"array[7]\" = \"Array 7\";\n\"array[11]\" = \"Array 11\";\n\"array[27]\" = \"Array 27\";\n\"array[30]\" = \"Array 30\";\n```\n\nAdditional metadata is stored, so Localazy can restore the indexes correctly. All valid indexes are processed where the valid index is a non-negative integer value.  \n\n### Plurals in .strings\n\nIt's possible to enable support for plurals using the feature `parse_plurals`. The file below will be parsed as a plural string instead of separate strings:\n\n```\n\"plural[one]\" = \"You have 1 item.\";\n\"plural[other]\" = \"You have {count} items.\";\n```\n\nWhen parsed as plural, the translated file may contain different quantities (eg. for the Czech language). Your app should be prepared for it.    \n\n```\n\"plural[one]\" = \"Máte 1 položku.\";\n\"plural[few]\" = \"Máte {count} položky.\";\n\"plural[other]\" = \"Máte {count} položek.\";\n```\n\n### .stringsdict\n\nAs .stringsdict format is based on .plist, it's possible to use it for more than just plurals. Localazy can handle also other data and can be used for parsing structured translations (as described below in .plist chapter). You can disable this behavior by disabling the feature `parse_others` (use `!parse_others` for disabling). \n\nLocalazy can correctly parse and translate complex plurals such as: \n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n\n\u003Ckey>geese.landed.ct\u003C\u002Fkey>\n\u003Cdict>\n  \u003Ckey>NSStringLocalizedFormatKey\u003C\u002Fkey>\n  \u003Cstring>%1$#@geese@ landed on %2$#@fields@\u003C\u002Fstring>\n  \u003Ckey>geese\u003C\u002Fkey>\n  \u003Cdict>\n    \u003Ckey>NSStringFormatSpecTypeKey\u003C\u002Fkey>\n    \u003Cstring>NSStringPluralRuleType\u003C\u002Fstring>\n    \u003Ckey>NSStringFormatValueTypeKey\u003C\u002Fkey>\n    \u003Cstring>d\u003C\u002Fstring>\n    \u003Ckey>one\u003C\u002Fkey>\n    \u003Cstring>A goose\u003C\u002Fstring>\n    \u003Ckey>other\u003C\u002Fkey>\n    \u003Cstring>%d geese\u003C\u002Fstring>\n  \u003C\u002Fdict>\n  \u003Ckey>fields\u003C\u002Fkey>\n  \u003Cdict>\n    \u003Ckey>NSStringFormatSpecTypeKey\u003C\u002Fkey>\n    \u003Cstring>NSStringPluralRuleType\u003C\u002Fstring>\n    \u003Ckey>NSStringFormatValueTypeKey\u003C\u002Fkey>\n    \u003Cstring>d\u003C\u002Fstring>\n    \u003Ckey>one\u003C\u002Fkey>\n    \u003Cstring>1 field\u003C\u002Fstring>\n    \u003Ckey>other\u003C\u002Fkey>\n    \u003Cstring>%d fields\u003C\u002Fstring>\n  \u003C\u002Fdict>\n\u003C\u002Fdict>\n\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n```\n  \n## .plist\n\nStructured .plist files can be imported for translating. Elements `\u003Carray>` are parsed as arrays in Localazy. No extra configuration is necessary.\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n\n    \u003C!-- Comment for the strings test_key_1. -->\n    \u003Ckey>test_key_1\u003C\u002Fkey>\n    \u003Cstring>Test String 1\u003C\u002Fstring>\n\n    \u003C!-- Comment for the strings test_key_2. -->\n    \u003Ckey>test_key_2\u003C\u002Fkey>\n    \u003Cstring>Test String 2\u003C\u002Fstring>\n\n    \u003Ckey>test_obj\u003C\u002Fkey>\n    \u003Cdict>\n\n        \u003Ckey>test_obj_key_1\u003C\u002Fkey>\n        \u003Cstring>Test Obj Key 1\u003C\u002Fstring>\n\n        \u003Ckey>test_obj_key_2\u003C\u002Fkey>\n        \u003Cstring>Tet Obj key 2\u003C\u002Fstring>\n\n        \u003Ckey>test_inner\u003C\u002Fkey>\n        \u003Cdict>\n            \u003Ckey>test_inner_key_1\u003C\u002Fkey>\n            \u003Cstring>Test Inner Key 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n\n    \u003C\u002Fdict>\n\n    \u003Ckey>test_array\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cstring>Array Test 1\u003C\u002Fstring>\n        \u003Cstring>Array Test 2\u003C\u002Fstring>\n        \u003Cstring>Array Test 3\u003C\u002Fstring>\n    \u003C\u002Farray>\n\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n```\n\nBy default, the .plist parser process plurals that are in the format compatible with .stringsdict as plurals. You can disable this behavior by disabling feature `parse_plurals` (use `!parse_plurals` for disabling) or skip plurals completely by leaving `parse_plurals` and adding `skip_plurals`. \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n___CLI_LINKS___ ",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2666,"featured_icon":2667},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2671],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2672},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2675],{"id":221,"documentation_id":221,"languages_code":812,"slug":2661,"title":2662,"content":2664,"meta_title":2662,"meta_description":2663,"excerpt":2663},[],{"id":2678,"status":8,"sort":2679,"created_on":2680,"modified_on":2681,"slug":2682,"title":2683,"excerpt":2684,"content":2685,"meta_title":2683,"meta_description":2684,"pinned":15,"main_image":7,"section":2686,"subsection":2689,"cta":2690,"faq":2691,"dictionary":2692,"translations":2693,"documentation_id":2678,"blog_articles":2696},225,"32021","2024-01-08T19:31:23.000Z","2024-07-17T05:45:10.000Z","xcstrings-format","File Format - XCode Strings Catalog","Learn how to use Localazy CLI for localization of your XCode Strings Catalogs (xcstrings).","All the features of XCode Strings Catalogs are supported, including simple values, variants, substitutions and plurals. \n\nNo extra configuration is necessary as all the features are supported out of the box. \n\n## Example\n\n```json\n{\n  \"sourceLanguage\" : \"en\",\n  \"strings\" : {\n    \"simple_key\" : {\n      \"comment\" : \"This is a comment for translators.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Default Value\"\n          }\n        }\n      }\n    },\n    \"device_variant\" : {\n      \"extractionState\" : \"manual\",\n      \"comment\": \"More complex example with device variants.\",\n      \"localizations\" : {\n        \"en\" : {\n          \"variations\" : {\n            \"device\" : {\n              \"ipad\" : {\n                \"stringUnit\" : {\n                  \"state\" : \"translated\",\n                  \"value\" : \"ipad\"\n                }\n              },\n              \"mac\" : {\n                \"stringUnit\" : {\n                  \"state\" : \"translated\",\n                  \"value\" : \"macOS\"\n                }\n              },\n              \"other\" : {\n                \"stringUnit\" : {\n                  \"state\" : \"translated\",\n                  \"value\" : \"Other\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"plural\" : {\n      \"extractionState\" : \"manual\",\n      \"comment\": \"Comment for pluralized text.\",\n      \"localizations\" : {\n        \"en\" : {\n          \"variations\" : {\n            \"plural\" : {\n              \"one\" : {\n                \"stringUnit\" : {\n                  \"state\" : \"translated\",\n                  \"value\" : \"You have one item.\"\n                }\n              },\n              \"other\" : {\n                \"stringUnit\" : {\n                  \"state\" : \"translated\",\n                  \"value\" : \"You have %lld items.\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"substitution\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%lld: People liked %#@count@ posts.\"\n          },\n          \"substitutions\" : {\n            \"count\" : {\n              \"argNum\" : 2,\n              \"formatSpecifier\" : \"lld\",\n              \"variations\" : {\n                \"plural\" : {\n                  \"one\" : {\n                    \"stringUnit\" : {\n                      \"state\" : \"translated\",\n                      \"value\" : \"%arg\"\n                    }\n                  },\n                  \"other\" : {\n                    \"stringUnit\" : {\n                      \"state\" : \"translated\",\n                      \"value\" : \"%arg\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"version\" : \"1.0\"\n}   \n```\n\n## Use key when source translation is unavailable\n\nBy default, strings without the source language content are skipped to avoid importing ID-based keys as value for the source language.\n\nWith files from XCode like the example below, add `use_key_for_source` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to use the key value (**My String** in the examle) for the source language content. \n\n```\n{  \n  \"sourceLanguage\" : \"en\",  \n  \"strings\" : {    \n     \"My String\" : {}\n  }\n}\n```\n\n## Keep comments\n\nBy default, we don't keep comments in exported files. They are usually not necessary and many times even undesired (e.g., when delivering files over CDN).\n\nTo preserve comments for your xcstrings files, add `keep_comments` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reupload the files. \n\nPlease note, with `keep_comments` enabled, comments from the input file are used and changes made on Localazy are not reflected. It allows for having different comments added by developers to help them navigate the content of the file, and different comments for translators on Localazy.\n\n## Omit state and extractionState\n\nWhen `extractionState` is provided, Localazy stores it and add it to the exported files. If you don't want this property to be included in exported files,  add `omit_extraction` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reupload the files. \n\nIn the same way, you can omit `state` property by adding `omit_state` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reupload the files. \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. ",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2687,"featured_icon":2688},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2694],{"id":2695,"documentation_id":2678,"languages_code":812,"slug":2682,"title":2683,"content":2685,"meta_title":2683,"meta_description":2684,"excerpt":2684},223,[],{"id":1608,"status":8,"sort":2698,"created_on":1856,"modified_on":2699,"slug":2700,"title":2701,"excerpt":2702,"content":2703,"meta_title":2701,"meta_description":2702,"pinned":15,"main_image":7,"section":2704,"subsection":2707,"cta":2708,"faq":2709,"dictionary":2712,"translations":2713,"documentation_id":1608,"blog_articles":2715},"32030","2025-02-27T21:19:59.000Z","flutter-format","File Format - Flutter ARB","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. \n\n## Generate @@locale\n\n\nAdd `arb_locale_full` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to generate full locale. Example for `cs_CZ`:\n\n```json\n{\n  \"@@locale\": \"cs_CZ\"\n}\n```\n\nAdd `arb_locale_lang` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to generate language only. Example for `cs_CZ`:\n\n\n```json\n{\n  \"@@locale\": \"cs\"\n}\n```\n\n\n## Context information\n\nAllows defining additional metadata for the string using `@key` notation.\n\nBy default, Localazy extracts content from `description`, `context` and `placeholders` and presents it to the translators to provide better context and improve translation quality.\n\nYou can disable metadata in the output files by adding `arb_dont_export_metadata` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\nFor plurals and arrays, metadata can be defined using the base form without the suffix. \n\n```json\n{\n\n  \"singleString\": \"This is just a normal string.\",\n  \"@singleString\": {\n    \"context\": \"views:Home page\",\n    \"description\": \"Comment for the single string.\"\n  },\n\n  \"datePickerMinuteOne\": \"1 minute\",\n  \"datePickerMinuteOther\": \"$minute minutes\",\n  \"@datePickerMinute\": {    \n    \"description\": \"Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'\",\n    \"plural\": \"minute\",\n    \"placeholders\": {\n      \"minute\": {\n        \"description\": \"the number of minutes\",\n        \"example\": \"15\"\n      }\n    }\n  }\n\n}\n```\n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```json\n{\n  \"category\": {\n    \"my_key\": \"This is a text of my key.\",\n    \"@@localazy:comment:my_key\": \"This is a comment for translators.\",\n    \"@@localazy:limit:my_key\": \"100\"\n  }\n}\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware of changing the number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThere are two ways how to define arrays.  \n\n### JSON Arrays\n\nStandard JSON arrays are recognized as arrays and stored with Localazy in a corresponding way.\n\nThis feature can be enabled by adding `array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```json\n{\n  \"game.difficulty\": [\n    \"easy\",\n    \"medium\",\n    \"hard\"\n  ]\n}\n```\n\n### Arrays defined by suffix\n\nAs using JSON arrays in ARB is not common, Localazy parses automatically also the suffixed variant shown below and presents it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```json\n{\n  \"difficulty[0]\": \"easy\",\n  \"difficulty[4]\": \"normal\",\n  \"difficulty[7]\": \"hard\",\n  \"difficulty[9]\": \"extreme\"\n}\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```json\n\u002F\u002F English has only two plural forms:\n{\n  \"pluralOne\": \"You have 1 item.\",\n  \"pluralOther\": \"You have %d items.\"\n}\n\n\u002F\u002F Czech has three plural forms:\n{\n  \"pluralOne\": \"Máte 1 položku.\",\n  \"pluralFew\": \"Máte %d položky.\",\n  \"pluralOther\": \"Máte %d položek.\"\n}\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n### Suffixed with camelCase\n\nThis feature can be disabled by adding `!plural_postfix_cc` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n**Example:**\n\n```json\n{\n\n  \"camelCase\": {\n    \"usersOne\": \"There is one user.\",\n    \"usersOther\": \"There are $number users.\"  \n  }\n\n}\n```\n\n### Suffixed with brackets\n\nThis feature can be disabled by adding `!plural_postfix_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n \n**Example:**\n\n```json\n{\n\n  \"brackets\": {\n    \"users[one]\": \"There is one user.\",\n    \"users[other]\": \"There are $number users.\"  \n  }\n\n}\n```\n\n### Defined using ICU\n\nThis feature can be disabled by adding `!plural_icu` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```json\n{\n  \"users\": \"There are {COUNT, plural, one {one user} other {# users}}.\"\n}\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n### Defined using pipeline\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```json\n{\n  \"key_plural\": \"one | other\"\n}\n```\n\n## JSON parser compatibility\n\nOur ARB parser is based on top of [our JSON support](\u002Fdocs\u002Fcli\u002Fjson-format) and so you can additionally enable any other feature you need.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2705,"featured_icon":2706},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2710],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2711},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2714],{"id":1608,"documentation_id":1608,"languages_code":812,"slug":2700,"title":2701,"content":2703,"meta_title":2701,"meta_description":2702,"excerpt":2702},[],{"id":1664,"status":8,"sort":2717,"created_on":1856,"modified_on":2449,"slug":2718,"title":2719,"excerpt":2720,"content":2721,"meta_title":2719,"meta_description":2720,"pinned":15,"main_image":7,"section":2722,"subsection":2725,"cta":2726,"faq":2727,"dictionary":2734,"translations":2735,"documentation_id":1664,"blog_articles":2737},"32040","json-format","File Format - JSON","Learn how to use Localazy CLI for app and software localization with translations in JSON files. ","Localazy doesn't come with small parsers for each of the different flavors of JSON files used for app and software localization. Instead, it comes with flexible and configurable solution and you can fine-tune it for your specific needs. \n\n## Plain JSONs\n\nThe most common JSON format for apps and sofware localization is simple plain JSON as shown below. It's supported out-of-the-box and no extra configuration is necessary.  \n\n```json\n{\n  \"key1\": \"Text 1\",\n  \"key2\": \"Text 2\"\n}\n```\n\n## Structured JSONs\n\nStructured JSONs are supported by default and no configuration is necessary. \n\n```json\n{\n  \"parent\": {\n    \"child\": {\n      \"another_nested_level\": \"All is supported.\"\n    }\n  }\n}\n```\n\n## Multilingual JSONs\n\nMultilingual JSONs allow defining more languages inside a single file. Localazy supports multilingual JSONs with all the features describe in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```json\n{\n\n  \"en\": {\n    \"key\": \"in English\"\n  },\n\n  \"cs\": {\n    \"key\": \"in Czech\"\n  }\n\n}\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name** (English, German, Czech, ...)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n\n## Mozilla\u002FChrome i18n\n\nBy including `content_as_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable parsing of more complex JSON files often referred as Mozilla i18n or Chrome i18n.  \n\n```json\n{\n  \"key\": {\n    \"message\": \"String content\",\n    \"description\": \"Optional additional comment for translators.\"\n  }\n}\n```\n\nInstead of `message`, you can use `string`, `value`, `text`, `content` or `translation`. Localazy remembers the field name and generates exactly the same document - just translated - for each of languages.  \n\nFor the context information, instead of `description`, any of `context`, `comment` and `developer_comment` can be used. \n\n::: info\nAll other features describe in this document are still available including structured JSONs, arrays and plurals parsing, etc. \n:::\n   \n## Array notation (i18next)\n\nAnother commonly used JSON format is an array of objects. Enable it by listing `content_as_array` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```json\n[\n  {\n    \"id\": \"string1\",\n    \"content\": \"String 1\",\n    \"description\": \"Information for the translator.\"\n  },\n  {\n    \"id\": \"string2\",\n    \"content\": \"String 2\",\n    \"description\": \"Information for the translator.\"\n  }\n]\n```\n\nAs with the Mozilla\u002FChrome i18n, you can use different names for fields. See the table below.\n\n| Type | Variants |\n| --- | --- |\n| String Id \u002F key | `id`, `key`, `name` |\n| Text content | `message`, `string`, `text`, `value`, `content`, `translation` |\n| Comment | `description`, `context`, `comment`, `developer_comment` |\n\n::: info\nAll other features describe in this document are still available including structured JSONs, arrays and plurals parsing, etc.  \n:::\n\n## RequireJS\n\nFor RequireJS files with the format shown below, you can use our JSON parser. Just add `requirejs` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and it will correctly remove `define(...);` wrapping before parsing and add it back when generating output files.\n\n```javascript\ndefine({\n    \"root\": {\n        \"red\": \"red\",\n        \"blue\": \"blue\",\n        \"green\": \"green\"\n    }\n});\n```\n\n::: info\nAll other features describe in this document are still available including structured JSONs, arrays and plurals parsing, etc. \n:::\n\n## ARB-style metadata\n\nAllows defining additional metadata for the string using `@key` notation.\n\nWith `arb_metadata` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable ARB-style metadata. With the feature enabled, Localazy extracts content from `description`, `context` and `placeholders` and presents it to the translators to provide better context and improve translation quality.\n\nFor plurals and arrays, metadata can be defined using the base form without the suffix. \n\n```json\n{\n\n  \"singleString\": \"This is just a normal string.\",\n  \"@singleString\": {\n    \"context\": \"views:Home page\",\n    \"description\": \"Comment for the single string.\"\n  },\n\n  \"datePickerMinuteOne\": \"1 minute\",\n  \"datePickerMinuteOther\": \"$minute minutes\",\n  \"@datePickerMinute\": {    \n    \"description\": \"Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'\",\n    \"plural\": \"minute\",\n    \"placeholders\": {\n      \"minute\": {\n        \"description\": \"the number of minutes\",\n        \"example\": \"15\"\n      }\n    }\n  }\n\n}\n```\n\n## Context information\n\nIt's possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```json\n{\n  \"category\": {\n    \"my_key\": \"This is a text of my key.\",\n    \"@@localazy:comment:my_key\": \"This is a comment for translators.\",\n    \"@@localazy:limit:my_key\": \"100\"\n  }\n}\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThere are two ways how to define arrays.  \n\n### JSON Arrays\n\nStandard JSON arrays are recognized as arrays and stored with Localazy in corresponding way.\n\nThis feature can be enabled by adding `array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```json\n{\n  \"game.difficulty\": [\n    \"easy\",\n    \"medium\",\n    \"hard\"\n  ]\n}\n```\n\n### Arrays defined by suffix\n\nLocalazy parses automatically also the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```json\n{\n  \"difficulty[0]\": \"easy\",\n  \"difficulty[4]\": \"normal\",\n  \"difficulty[7]\": \"hard\",\n  \"difficulty[9]\": \"extreme\"\n}\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n\n \n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```json\n\u002F\u002F English has only two plural forms:\n{\n  \"pluralOne\": \"You have 1 item.\",\n  \"pluralOther\": \"You have %d items.\"\n}\n\n\u002F\u002F Czech has three plural forms:\n{\n  \"pluralOne\": \"Máte 1 položku.\",\n  \"pluralFew\": \"Máte %d položky.\",\n  \"pluralOther\": \"Máte %d položek.\"\n}\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n\n### Defined as array\n\nEnabled by `plural_array` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```json\n{\n  \"users\": [\n    {\n      \"quantity\": \"one\",\n      \"content\": \"There is one user.\"\n    },\n    {\n      \"quantity\": \"other\",\n      \"content\": \"There are %d users.\"\n    }\n  ]\n}\n```\n\nIt's also possible to use `type`, `t` or `q` instead of `quantity` and `value`, `v` or `c` instead of `content` for shorter form.  \n\nIf the exact structure is not met, the array is not considered plural and is read as structured JSON instead. \n\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section: \n\n* `plural_postfix_sd` for single dot variant.\n* `plural_postfix_dd` for colon variant.\n* `plural_postfix_us` for underscore variant.\n* `plural_postfix_cc` for camelCase variant.\n* `plural_postfix_br` for [brackets] variant.\n\n**Examples:**\n \n```json\n{\n\n  \"single_dot\": {\n    \"users.one\": \"There is one user.\",\n    \"users.other\": \"There are $number users.\"\n  },\n\n  \"colon\": {\n    \"users:one\": \"There is one user.\",\n    \"users:other\": \"There are $number users.\"\n  },\n\n  \"underscore\": {\n    \"users_one\": \"There is one user.\",\n    \"users_other\": \"There are $number users.\"\n  },\n\n  \"camelCase\": {\n    \"usersOne\": \"There is one user.\",\n    \"usersOther\": \"There are $number users.\"  \n  },\n\n  \"brackets\": {\n    \"users[one]\": \"There is one user.\",\n    \"users[other]\": \"There are $number users.\"  \n  }\n\n}\n```\n\n### Defined as object\n\nEnabled by `plural_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```json\n{\n\n  \"users\": {\n    \"one\": \"There is one user.\",\n    \"other\": \"There are $number users.\"\n  }\n\n}\n```\n\nThe object is considered plural if and only if all items are key-value strings with keys being valid plural types (zero, one, two, few, many, other).\n\nIf the condition above is not met, the object is not considered plural and is parsed as a structured JSON.\n\n### Defined using i18Next plural\n\nEnabled by `plural_i18next` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```json\n{\n  \"key\": \"item\",\n  \"key_plural\": \"items\"\n}\n```\n\nAll plural forms:\n\n```json\n{\n  \"key_0\": \"zero\",\n  \"key_1\": \"singular\",\n  \"key_2\": \"two\",\n  \"key_3\": \"few\",\n  \"key_4\": \"many\",\n  \"key_5\": \"other\"\n}\n```\n\n### Defined using ICU\n\nEnabled by `plural_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```json\n{\n  \"users\": \"There are {COUNT, plural, one {one user} other {# users}}.\"\n}\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n### Defined using pipeline\n\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```json\n{\n  \"key_plural\": \"one | other\"\n}\n```\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Using key as the source translation\n\nThere is a special format where the key is also the source language translation. It's possible to enable the support for this format by adding `source_is_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```json\n{\n  \"Text in the source language\": \"Translation in the defined language\"\n}\n```\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add **add_bom** to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Features overview\n\nThe table below is a summary of all available features for JSON parser.\n\n| Feature | Description |\n| --- | --- |\n| `content_as_object` | Enable content as a JSON object; also known as Mozilla\u002FChrome i18n. |\n| `content_as_array` | Enable content as objects in an array; older format of i18next. |\n| `requirejs` | Enable support of RequireJS format. |\n| `multilingual` | Enable support of multilingual JSON files. |\n| `lang_format=xxx` | Define how to output locales for multilingual files. |\n| `array` | Parse JSON arrays as arrays and not as list of single strings. |\n| `array_br` | Parse strings with keys suffixed by `[x]` as arrays. |\n| `plural_array` | Enable plurals defined as arrays. |\n| `plural_postfix_dd` | Parse strings with keys suffixed by `:type` as plural. |\n| `plural_postfix_us` | Parse strings with keys suffixed by `_type` as plural. |\n| `plural_postfix_cc` | Parse strings with keys suffixed by `Type` as plural. |\n| `plural_postfix_br` | Parse strings with keys suffixed by `[type]` as plural. |\n| `plural_postfix_sd` | Parse strings with keys suffixed by `.type` as plural. |\n| `plural_object` | Enable plurals defined as objects. |\n| `plural_i18next` | Enable i18Next plurals. |\n| `plural_icu` | Enable support for ICU plurals. |\n| `plural_pipeline` | Enable support for pipeline plurals. |\n| `arb_metadata` | Enable support for ARB-style metadata. |\n| `filter_untranslated` | Don't use the source language texts for missing translations. |\n| `skip_empty` | Consider empty translations as untranslated. |\n| `source_is_key` | Use the key as the source translation. |\n| `add_bom` | Include byte order mark in the output file. |\n\n___CLI_LINKS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2723,"featured_icon":2724},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2728,2730,2732],{"id":2315,"status":8,"title":2316,"content":2317,"slug":2318,"created_on":2319,"modified_on":2320,"owner":2121,"meta_title":7,"category":2729},{"id":5,"status":8,"created_on":2104,"sort":5,"slug":2322,"label":2323,"on_faq_index":17},{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2731},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},{"id":2245,"status":8,"title":2246,"content":2247,"slug":2248,"created_on":2249,"modified_on":2250,"owner":2121,"meta_title":7,"category":2733},{"id":291,"status":8,"created_on":1277,"sort":7,"slug":521,"label":522,"on_faq_index":15},[],[2736],{"id":1664,"documentation_id":1664,"languages_code":812,"slug":2718,"title":2719,"content":2721,"meta_title":2719,"meta_description":2720,"excerpt":2720},[],{"id":269,"status":8,"sort":2739,"created_on":1856,"modified_on":2740,"slug":2741,"title":2742,"excerpt":2743,"content":2744,"meta_title":2742,"meta_description":2743,"pinned":15,"main_image":7,"section":2745,"subsection":2748,"cta":2749,"faq":2750,"dictionary":2753,"translations":2754,"documentation_id":269,"blog_articles":2756},"32050","2024-07-16T15:14:44.000Z","javascript-format","File Format - Javascript","Learn how to use Localazy CLI for app and software localization with translations in Javascript files. ","You can use Localazy to directly localize Javascript files with various formats supported, and with a configurable parser based on [our JSON support](\u002Fdocs\u002Fcli\u002Fjson-format). \n\n## The format\n\nOur parser can adapt to many formats of JS files that follow the rule `PREFIX { localizable content } SUFFIX` such as the examples below.\n\nPlease note that **functions**, **imports**, **lambdas**, **explicit types** (for TypeScript), **string concatenation**, etc. are not supported in the localizable content part. Also, there can be only one localizable part in the file. \n\nFor multiline strings, you can use backticks. \n\n\n```js\nexport default {\n  parent1: {\n    \u002F\u002F Comment is used as a context information for translator.\n    child_1: \"Text 1\",\n    child_2: \"Text 2\",\n    child_3: \"Text 3\",\n  },\n  parent2: {\n    ...\n  } \n};\n```\n\n---\n\n```js\nvar translations = {\n  parent: {\n    child: \"Text 1\"\n  }\n}\n```\n---\n\n```js\ndefine({\n  parent: {\n    child: \"Text 1\"\n  }\n});\n```\n\n## Forcing double quotes\n\nBy default, the variable names are not double-quoted. We only use double quotes when the variable name contains unsupported characters to prevent issues with the generated file.\n\nYou can add `force_quotes` to the **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to force using double quotes for all variable names. \n\n\n## Available features\n\n**[All features supported by Localazy for JSON](\u002Fdocs\u002Fcli\u002Fjson-format)** are available including plurals, arrays, multilingual files, etc. Only the support for `requirejs` is not available.   \n\n\n## Context information\n\nIt's possible to use comments. They are parsed and stored as context information for translators. \n\n```js\nexport default {\n  \n  \u002F\u002F Please keep translation short.\n  short_name: \"Short Name\",\n\n  \u002F*\n  Multi-line comments are allowed as well.\n  *\u002F\n  long_name: \"Long Name\"\n\n};\n```\n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```js\nexport default {\n  category: {\n    my_key: \"This is a text of my key.\",\n    \"@@localazy:comment:my_key\": \"This is a comment for translators.\",\n    \"@@localazy:limit:my_key\": \"100\"\n  }\n}\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2746,"featured_icon":2747},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2751],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2752},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2755],{"id":269,"documentation_id":269,"languages_code":812,"slug":2741,"title":2742,"content":2744,"meta_title":2742,"meta_description":2743,"excerpt":2743},[],{"id":299,"status":8,"sort":2758,"created_on":1856,"modified_on":2759,"slug":2760,"title":2761,"excerpt":2762,"content":2763,"meta_title":2761,"meta_description":2762,"pinned":15,"main_image":7,"section":2764,"subsection":2767,"cta":2768,"faq":2769,"dictionary":2794,"translations":2795,"documentation_id":299,"blog_articles":2797},"32060","2025-02-27T21:37:26.000Z","xliff-12-format","File Format - XLIFF 1.2","Learn how to use Localazy CLI for app and software localization with XLIFF 1.2.","Selected elements of XLIFF 1.2 are supported, and the format is fully compliant with Apple's XLIFF files generated by XCode including Apple's plural extension (described below).  \n\n**Example:**\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cxliff xmlns=\"urn:oasis:names:tc:xliff:document:1.2\"       \n       version=\"1.2\">\n\n  \u003Cfile original=\"Interface.storyboard\" source-language=\"en\" target-language=\"en\" datatype=\"plaintext\">\n    \u003Cbody>\n      \u003Ctrans-unit id=\"text1\" xml:space=\"preserve\">\n        \u003Csource>Source Text 1\u003C\u002Fsource>\n        \u003Ctarget>Translated Text 1\u003C\u002Ftarget>\n        \u003Cnote>Comment for the translator.\u003C\u002Fnote>\n      \u003C\u002Ftrans-unit>\n      \u003Ctrans-unit id=\"text2\" xml:space=\"preserve\">\n        \u003Csource>Source Text 2\u003C\u002Fsource>\n        \u003Ctarget>Translated Text 2\u003C\u002Ftarget>\n      \u003C\u002Ftrans-unit>\n    \u003C\u002Fbody>\n  \u003C\u002Ffile>\n\n\u003C\u002Fxliff>\n```\n\n## Supported elements\n\n### &lt;file&gt;\n\nAttributes `original`, `source-language`, `target-language`, and `datatype` are used for obtaining locale information and retained. \n\n### &lt;body&gt;\n\nNo extra functionality is provided.\n\n### &lt;trans-unit&gt;\n\nIf the attribute **translate** is set to **no** or **false**, the phrase is skipped.\n\n```xml\n\u003Ctrans-unit id=\"skipped_text1\" xml:space=\"preserve\" translate=\"yes\">\n  \u003Csource>Skipped Source Text 1\u003C\u002Fsource>\n  \u003Ctarget>Skipped Translated Text 1\u003C\u002Ftarget>\n\u003C\u002Ftrans-unit>\n```\n\nSub-elements `source`, `target` and `note` are supported.\n\n### &lt;group&gt;\n\nIf the group element contains **id**, it's retained, and stored data is structured accordingly. Without **id**, the group is just removed.\n\nIf the attribute **translate** is set to **no** or **false**, the whole group is skipped.\n  \n```xml\n\u003Cgroup id=\"\" translate=\"yes\">\n  \u003Ctrans-unit id=\"inner_text1\" xml:space=\"preserve\">\n    \u003Csource>Inner Source Text 1\u003C\u002Fsource>\n    \u003Ctarget>Inner Translated Text 1\u003C\u002Ftarget>\n  \u003C\u002Ftrans-unit>\n\u003C\u002Fgroup>\n```\n\n## Prevent  &lt;file original=\"...\"&gt; from being parsed\n\nBy default, Localazy stores several attributes from the **file** tag such as the languages, datatype and original filename making the reference to the **file** tag unique. \n\nIf your framework or library generates XLIFF files with the different **original** attribute per language, it's not possible to correctly link translations together and thus it's necessary to ignore it during the upload. \n\nThis feature can be enabled by adding `ignore_original` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nIn such case, if the **original** attribute is required, you need to introduce a custom logic to restore the parameter as needed by your framework. \n\n## Prevent  &lt;file id=\"...\"&gt; from being parsed\n\nSimilarly to the previous chapter, if the **id** attribute is different per language, you can stop processing it. \n\nThis feature can be enabled by adding `ignore_id` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Support for Unity\n\nXLIFF files generated by Unity have different **original** and **id** attributes for the **file** tag per language. \n\nAdd `ignore_original` and `ignore_id` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to upload existing translations from Unity and link them correctly. \n\nEverything else works out of the box. \n\n## Handling locales\n\nBy default, both source and target strings are processed and the locale is taken from the XLIFF file with fuzzy match being applied for the source language. \n\nBy adding `dont_fuzzy_match_lang` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, no fuzzy match is applied to the source langauge. And you can also change how languages are obtained from the XLIFF file by adding features mentioned in the table below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n| Feature | Description |\n| --- | --- |\n| dont_parse_source | Do not parse *source* strings. |\n| dont_parse_target | Do not parse *target* strings. |\n| use_project_lang | Use the project base language for *source* strings. |\n| use_defined_lang_for_source | Use language defined for the uploaded file for *source* strings. |\n| use_defined_lang_for_target | Use language defined for the uploaded file for *target* strings. |\n\nFeatures `use_project_lang`, `use_defined_lang_for_source` and `use_defined_lang_for_target` cannot be combined and they are processed in the same order as mentioned. \n\n## XML entities\n\nBy default, XML entities are converted while importing your file. They may not be converted back while exporting it, because it's not necessary. \n\nIt's possible to output certain XML 1.1 entities (such as &amp;apos;) in the final file. This feature can be enabled by adding `output_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nThis feature is useful for **Angular** to get the output in the same format as input. \n\n## HTML entities\n\nHTML entities are not allowed in XLIFF files because they are not defined in the XML standard. Localazy can convert HTML entities to their Unicode representation when the file is imported. This feature can be enabled by adding `decode_html_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nBy default, tags are imported as tags and entities **&amp;lt;** and **&amp;gt;** are kept as entities and not decoded. We do so to preserve the exact form in the output file. If you are sure that you don't need this feature, you can add `decode_tags` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to force decoding tag entities. \n\n## Unicode entities\n\nBy default, Unicode entities are encoded using the `#&nnnn;` format. To export Unicode entities as characters (e.g., smilies), which is necessary for XCode, add `use_unicode` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. However, this setting only applies to a known HTML entities. \n\nYou can also add `encode_output` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to force all the `#&nnnn;` entities to be encoded as Unicode characters in the output file.\n\n## Key in source\n\nSome frameworks such as Symfony, use the `\u003Csource>` tag for string keys. You can enable support for this by adding `source_is_key` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nThis feature can be used together with **use_project_lang** or **use_defined_lang_for_source**.\n\nBy default, **id** from the `\u003Ctrans-unit id=\"..\">` tag is included in the string key. You can enable the **omit_id_for_source_is_key** feature to remove it. With this feature enabled, numeric **id** is generated for each of the `\u003Ctrans-unit>` tags.\n\n## Attributes of the translation unit\n\nBy default, Localazy doesn't store attributes of the `\u003Ctrans-unit>`, except for important ones such as **id**. If you want to store all the attributes, add **store_attrs** feature. \n\nThis feature is only necessary for some frameworks that populate `\u003Ctrans-unit>` with additional parameters. \n\n## Array support\n\nArrays are good but beware of changing the number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThis feature can be enabled by adding `parse_array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n\n```xml\n\u003Ctrans-unit id=\"array[1]\" xml:space=\"preserve\">\n  \u003Csource>Array Item 1\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n\n\u003Ctrans-unit id=\"array[13]\" xml:space=\"preserve\">\n  \u003Csource>Array Item 13\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n\n\u003Ctrans-unit id=\"array[27]\" xml:space=\"preserve\">\n  \u003Csource>Array Item 27\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where the valid index is a non-negative integer value.  \n\n## Plurals support\n\nThis feature can be enabled by adding `parse_plurals` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```xml\n\u003Ctrans-unit id=\"plural[one]\" xml:space=\"preserve\">\n  \u003Csource>You have 1 item.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n\n\u003Ctrans-unit id=\"plural[other]\" xml:space=\"preserve\">\n  \u003Csource>You have {count} items.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```\n\n## Apple's plural extension\n\nThe plural format below is fully supported. Enable the support with `parse_plurals_ios` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```xml\n\u003Ctrans-unit id=\"\u002Fplural string:dict\u002Fcount:dict\u002Fone:dict\u002F:string\" xml:space=\"preserve\">\n  \u003Csource>You have 1 item.\u003C\u002Fsource>\n  \u003Ctarget>Máte 1 položku.\u003C\u002Ftarget>\n\u003C\u002Ftrans-unit>\n\n\u003Ctrans-unit id=\"\u002Fplural string:dict\u002Fcount:dict\u002Fother:dict\u002F:string\" xml:space=\"preserve\">\n  \u003Csource>You have {count} item.\u003C\u002Fsource>\n  \u003Ctarget>Máte {count} položek.\u003C\u002Ftarget>\n\u003C\u002Ftrans-unit>\n```\n\n## ICU plurals\n\nEnabled by `parse_plurals_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```xml\n\u003Ctrans-unit id=\"icu_plural\" xml:space=\"preserve\">\n  \u003Csource>You {count, plural, one {have # project} other {have # projects}}.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2765,"featured_icon":2766},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2770,2772,2783],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2771},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},{"id":2773,"status":8,"title":2774,"content":2775,"slug":2776,"created_on":2777,"modified_on":2778,"owner":2121,"meta_title":7,"category":2779},317,"How to translate Articulate Rise 360 courses with Localazy?","To translate your Articulate Rise 360 course content, follow these steps:\n\n1. **Duplicate Your Content**:  Duplicate the content you want to translate. Each duplicate becomes a translated version. For multiple languages, create a copy for each.\n\n2. **Export Content as XLIFF**:  Open the duplicate content, navigate to *Settings > Translations*, and export as an XLIFF file. We recommend you include the HTML formatting. Save the file to your computer.\n\n3. **Export Labels as XLIFF**: Open the content you want to edit, then click *Settings* in the upper right corner of the screen, and select the *Labels* tab.\n\n4. **Upload All XLIFF Files to Localazy:** [Sign up](\u002Fregister), create a project and [upload your files to Localazy](\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files). \n\n5. **Translate with Localazy:** Add the languages you want to translate your courses into. You can now [translate your course content and labels using the available tools in Localazy](\u002Fdocs\u002Fgeneral\u002Ftranslating-strings), [invite your team](\u002Fdocs\u002Fgeneral\u002Forganizations#invite-teammates) or [order professional translations](\u002Fdocs\u002Fgeneral\u002Fcontinuous-localization-team) directly inside the platform. \n\n6. **Address any errors**, ensuring the file matches the original content. Use [validation checks](\u002Fdocs\u002Fgeneral\u002Fqa-checks) in the translation table to spot any invalid translations. \n\n7. **Download Translated XLIFF Files:** Once your translations are finished, go to the File Management section in Localazy and click *Export & Download* to save the translated files on your device.\n\n8. **Import Translated Files Back to Rise 360**: Open the duplicate content you created in Step 1, go to *Settings > Translations*, and import the translated XLIFF file. For labels, go to the drop-down list at the top of the label editor, click *Upload from XLIFF* and choose the respective files.\n\n> ⚠️ **Note**: Each course duplicate will generate a different source file, translating one course’s content and uploading it into a duplicated course will not work, because Articulate generates different key IDs for each course! Always prepare a duplicate course and download its files before translating it.\n\nRead the full guide **[How to translate Articulate Rise 360 courses with Localazy](https:\u002F\u002Flocalazy.com\u002Fblog\u002Fhow-to-translate-articulate-rise-360-courses-with-localazy)** on the Localazy blog.\n\n\n\n","how-to-translate-articulate-rise-360-courses-with-localazy","2024-01-06T16:45:05.000Z","2026-02-20T09:18:38.000Z",{"id":278,"status":8,"created_on":2780,"sort":7,"slug":2781,"label":2782,"on_faq_index":7},"2024-01-06T16:23:56.000Z","articulate-rise-360-localization","Articulate Rise 360 Localization",{"id":2784,"status":8,"title":2785,"content":2786,"slug":2787,"created_on":2788,"modified_on":2789,"owner":2374,"meta_title":7,"category":2790},333,"How to translate iSpring Suite courses with Localazy?","To translate your iSpring Suite courses, please follow these steps:\n\n1. **Export Content as XLIFF**:\n- Open your course. Then click on the Translation button and choose *Export text.*\n- Select the language of your source text, and click on Export. \n\n2. **Create a Project in Localazy and Upload XLIFF Files to Localazy**:\n- [Sign up](\u002Fregister) to your Localazy account.\n- Create a new project and [upload your files to Localazy](\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files).\n- Fill in the necessary details such as project name, source language, and any specific settings.\n\n3. **Translate with Localazy:** \n- Add the languages you want to translate your content into. \n- You can now [translate your course content and labels using the available tools in Localazy](\u002Fdocs\u002Fgeneral\u002Ftranslating-strings).\n- [Invite your team](\u002Fdocs\u002Fgeneral\u002Forganizations#invite-teammates) or [order professional translations](\u002Fdocs\u002Fgeneral\u002Fcontinuous-localization-team) directly inside the platform. \n\n4. **Download Translated XLIFF Files**:\n- Once translations are completed, navigate to *File Management section > Export & Download* to save the translated files on your device.\n\n5. **Import Translated Files Back to iSpring Suite**:\n- Return to iSpring Suite. Click on Translation, and choose *Import Text.*\n- Select the translated file and click *Import* and save your localized course as a copy. ","how-to-translate-i-spring-suite-courses-with-localazy","2024-05-27T07:17:41.000Z","2024-06-11T11:32:18.000Z",{"id":838,"status":8,"created_on":2791,"sort":7,"slug":2792,"label":2793,"on_faq_index":7},"2024-05-27T06:57:49.000Z","ispring-suite-localization","iSpring Suite Localization",[],[2796],{"id":299,"documentation_id":299,"languages_code":812,"slug":2760,"title":2761,"content":2763,"meta_title":2761,"meta_description":2762,"excerpt":2762},[],{"id":1667,"status":8,"sort":2799,"created_on":1856,"modified_on":2800,"slug":2801,"title":2802,"excerpt":2803,"content":2804,"meta_title":2802,"meta_description":2803,"pinned":15,"main_image":7,"section":2805,"subsection":2808,"cta":2809,"faq":2810,"dictionary":2815,"translations":2816,"documentation_id":1667,"blog_articles":2818},"32070","2025-02-27T21:38:07.000Z","xliff-20-format","File Format - XLIFF 2.0","Learn how to use Localazy CLI for app and software localization with XLIFF 2.0.","Selected elements of XLIFF 2.0 are supported, and we added extra support for Apple's plural extension, arrays, and other forms of plurals.  \n \n**Example:**\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cxliff xmlns=\"urn:oasis:names:tc:xliff:document:2.0\" version=\"2.0\" srcLang=\"en\" trgLang=\"cs\">\n\n  \u003Cfile id=\"f1\" original=\"soubor.cs\" datatype=\"plaintext\">\n\n    \u003Cunit id=\"string_key\">\n\n      \u003Cnotes>\n        \u003Cnote id=\"comment_1\">Comment for translator.\u003C\u002Fnote>\n      \u003C\u002Fnotes>\n  \n      \u003Csegment id=\"seg_1\">\n        \u003Csource>PART 1 EN\u003C\u002Fsource>\n        \u003Ctarget>PART 1 CS\u003C\u002Ftarget>\n      \u003C\u002Fsegment>\n\n      \u003Csegment id=\"seg_2\">\n        \u003Csource>PART 2 EN\u003C\u002Fsource>\n        \u003Ctarget>PART 2 CS\u003C\u002Ftarget>\n      \u003C\u002Fsegment>\n\n    \u003C\u002Funit>\n\n  \u003C\u002Ffile>\n\u003C\u002Fxliff>\n```\n\n## Supported elements\n\n### &lt;xliff&gt;\n\nAttributes `srcLang` and `trgLang` are used for obtaining locale information.\n\n### &lt;file&gt;\n\nAttributes `id`, `original`, and `datatype` are stored and retained in translated files.\n\n\n### &lt;unit&gt;\n\nIf the attribute **translate** is set to **no** or **false**, the phrase is skipped.\n\n```xml\n\u003Cunit id=\"skipped_text1\" translate=\"yes\">\n  ...\n\u003C\u002Funit>\n```\n\n### &lt;notes&gt; and &lt;note&gt;\n\nAllows defining comments and context information for translators. \n\n```xml\n\u003Cunit id=\"string_key\">\n\n  \u003Cnotes>\n    \u003Cnote id=\"comment_1\">Comment for translator.\u003C\u002Fnote>\n  \u003C\u002Fnotes>\n \n  ...\n\n\u003C\u002Funit>\n```\n\n### &lt;segment&gt;\n\nMultiple segments inside one `\u003Cunit>` are supported, but the segments are imported as a separate string.  \n\n```xml\n\u003Cunit id=\"string_key\">\n\n  \u003Csegment id=\"segment_1\">\n    \u003Csource>Original String: Segment 1\u003C\u002Fsource>\n    \u003Ctarget>Translated String: Segment 1\u003C\u002Ftarget>\n  \u003C\u002Fsegment>\n\n  \u003Csegment id=\"segment_2\">\n    \u003Csource>Original String: Segment 2\u003C\u002Fsource>\n    \u003Ctarget>Translated String: Segment 2\u003C\u002Ftarget>\n  \u003C\u002Fsegment>\n\n\u003C\u002Funit>\n```\n\n### &lt;group&gt;\n\nIf the group element contains **id**, it's retained, and stored data is structured accordingly. Without **id**, the group is just removed.\n\nIf the attribute **translate** is set to **no** or **false**, the whole group is skipped.\n  \n```xml\n\u003Cgroup id=\"\" translate=\"yes\">\n  ...\n\u003C\u002Fgroup>\n```\n\n## Prevent  &lt;file original=\"...\"&gt; from being parsed\n\nBy default, Localazy stores several attributes from the **file** tag such as the languages, datatype and original filename making the reference to the **file** tag unique. \n\nIf your framework or library generates XLIFF files with the different **original** attribute per language, it's not possible to correctly link translations together and thus it's necessary to ignore it during the upload. \n\nThis feature can be enabled by adding `ignore_original` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nIn such case, if the **original** attribute is required, you need to introduce a custom logic to restore the parameter as needed by your framework. \n\n## Prevent  &lt;file id=\"...\"&gt; from being parsed\n\nSimilarly to the previous chapter, if the **id** attribute is different per language, you can stop processing it. \n\nThis feature can be enabled by adding `ignore_id` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Support for Unity\n\nXLIFF files generated by Unity have different **original** and **id** attributes for the **file** tag per language. \n\nAdd `ignore_original` and `ignore_id` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to upload existing translations from Unity and link them correctly. \n\nEverything else works out of the box. \n\n## Handling locales\n\nBy default, both source and target strings are processed and the locale is taken from the XLIFF file with fuzzy match being applied for the source language. \n\nBy adding `dont_fuzzy_match_lang` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, no fuzzy match is applied to the source langauge. And you can also change how languages are obtained from the XLIFF file by adding features mentioned in the table below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n| Feature | Description |\n| --- | --- |\n| dont_parse_source | Do not parse *source* strings. |\n| dont_parse_target | Do not parse *target* strings. |\n| use_project_lang | Use the project base language for *source* strings. |\n| use_defined_lang_for_source | Use language defined for the uploaded file for *source* strings. |\n| use_defined_lang_for_target | Use language defined for the uploaded file for *target* strings. |\n\nFeatures `use_project_lang`, `use_defined_lang_for_source` and `use_defined_lang_for_target` cannot be combined and they are processed in the same order as mentioned. \n\n## XML entities\n\nBy default, XML entities are converted while importing your file. They may not be converted back while exporting it, because it's not necessary. \n\nIt's possible to output certain XML 1.1 entities (such as &amp;apos;) in the final file. This feature can be enabled by adding `output_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nThis feature is useful for **Angular** to get the output in the same format as input. \n\n## HTML entities\n\nHTML entities are not allowed in XLIFF files because they are not defined in the XML standard. Localazy can convert HTML entities to their Unicode representation when the file is imported. This feature can be enabled by adding `decode_html_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nBy default, tags are imported as tags and entities **&amp;lt;** and **&amp;gt;** are kept as entities and not decoded. We do so to preserve the exact form in the output file. If you are sure that you don't need this feature, you can add `decode_tags` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to force decoding tag entities. \n\n## Unicode entities\n\nBy default, Unicode entities are encoded using the `#&nnnn;` format. To export Unicode entities as characters (e.g., smilies), which is necessary for XCode, add `use_unicode` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. However, this setting only applies to a known HTML entities. \n\nYou can also add `encode_output` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to force all the `#&nnnn;` entities to be encoded as Unicode characters in the output file.\n\n## Key in source\n\nSome frameworks such as Symfony, use the `\u003Csource>` tag for string keys. You can enable support for this by adding `source_is_key` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nThis feature can be used together with **use_project_lang** or **use_defined_lang_for_source**.\n\nBy default, **id** from the `\u003Cunit id=\"..\">` tag is included in the string key. You can enable the **omit_id_for_source_is_key** feature to remove it. Please note that it can have some consequences related to multiple segments as it's no longer possible to group them by key. With this feature enabled, numeric **id** is generated for each of the `\u003Cunit>` tags.\n\n## Attributes of the translation unit\n\nBy default, Localazy doesn't store attributes of the `\u003Cunit>`, except for important ones such as **id**. If you want to store all the attributes, add **store_attrs** feature. \n\nThis feature is only necessary for some frameworks that populate `\u003Cunit>` with additional parameters. \n\n## Array support\n\nArrays are good but beware of changing the number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThis feature can be enabled by adding `parse_array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n\n```xml\n\u003Cunit id=\"array[1]\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>Array Item 1\u003C\u002Fsource>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n\n\u003Cunit id=\"array[13]\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>Array Item 13\u003C\u002Fsource>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n\n\u003Cunit id=\"array[27]\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>Array Item 27\u003C\u002Fsource>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where the valid index is a non-negative integer value.  \n\n## Plurals support\n\nThis feature can be enabled by adding `parse_plurals` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```xml\n\u003Cunit id=\"plural[one]\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>You have 1 item.\u003C\u002Fsource>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n\n\u003Cunit id=\"plural[other]\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>You have {count} items.\u003C\u002Fsource>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n```\n\n## Apple's plural extension\n\nThe plural format below is fully supported. Enable the support with `parse_plurals_ios` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```xml\n\u003Cunit id=\"\u002Fplural string:dict\u002Fcount:dict\u002Fone:dict\u002F:string\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>You have 1 item.\u003C\u002Fsource>\n    \u003Ctarget>Máte 1 položku.\u003C\u002Ftarget>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n\n\u003Cunit id=\"\u002Fplural string:dict\u002Fcount:dict\u002Fother:dict\u002F:string\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>You have {count} item.\u003C\u002Fsource>\n    \u003Ctarget>Máte {count} položek.\u003C\u002Ftarget>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n```\n\n## ICU plurals\n\nEnabled by `parse_plurals_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```xml\n\u003Cunit id=\"icu_plural\" xml:space=\"preserve\">\n  \u003Csegment id=\"s1\">\n    \u003Csource>You {count, plural, one {have # project} other {have # projects}}.\u003C\u002Fsource>\n  \u003C\u002Fsegment>\n\u003C\u002Funit>\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2806,"featured_icon":2807},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2811,2813],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2812},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},{"id":2784,"status":8,"title":2785,"content":2786,"slug":2787,"created_on":2788,"modified_on":2789,"owner":2374,"meta_title":7,"category":2814},{"id":838,"status":8,"created_on":2791,"sort":7,"slug":2792,"label":2793,"on_faq_index":7},[],[2817],{"id":1667,"documentation_id":1667,"languages_code":812,"slug":2801,"title":2802,"content":2804,"meta_title":2802,"meta_description":2803,"excerpt":2803},[],{"id":2820,"status":8,"sort":2821,"created_on":2822,"modified_on":2823,"slug":2824,"title":2825,"excerpt":2826,"content":2827,"meta_title":2825,"meta_description":2826,"pinned":15,"main_image":7,"section":2828,"subsection":2831,"cta":2832,"faq":2833,"dictionary":2834,"translations":2835,"documentation_id":2820,"blog_articles":2838},222,"32075","2024-01-04T16:56:07.000Z","2024-07-17T05:45:08.000Z","tmx-format","File Format - TMX (Translation Memory)","Learn how to use Localazy CLI for uploading your Translation Memory eXchange (TMX) files.","TMX (Translation Memory eXchange) files are supported in the same way as all other localizable formats. There's also a custom implementation for pluralized items.\n\nTMX files up to version 1.4b are supported. \n## Example\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Ctmx version=\"1.4\">\n  \u003Cheader \n    adminlang=\"en\" \n    creationtool=\"localazy.com\" \n    datatype=\"PlainText\" \n    o-tmf=\"Localazy\" \n    segtype=\"sentence\" \n    srclang=\"en\"\n  \u002F>\n  \u003Cbody>\n    \u003Ctu>\n      \u003Ctuv xml:lang=\"en\">\n        \u003Cseg>Hello world!\u003C\u002Fseg>\n      \u003C\u002Ftuv>\n      \u003Ctuv xml:lang=\"fr\">\n        \u003Cseg>Bonjour tout le monde!\u003C\u002Fseg>\n      \u003C\u002Ftuv>\n    \u003C\u002Ftu>\n  \u003C\u002Fbody>\n\u003C\u002Ftmx>\n```\n\n## Plurals\n\nThere are two different way how to define plurals. Using plural groups and with our own extension to TMX. Please note that to the output file, we automatically output both variants at the same time. \n### Plural groups\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Ctmx version=\"1.4\">\n  \u003Cheader \n    adminlang=\"en\" \n    creationtool=\"localazy.com\" \n    datatype=\"PlainText\" \n    o-tmf=\"Localazy\" \n    segtype=\"sentence\" \n    srclang=\"en\"\n  \u002F>\n  \u003Cbody>\n    \u003Ctu>\n        \u003Cprop type=\"x-Plural-Source-Group\">src-plural-id\u003C\u002Fprop>\n        \u003Cprop type=\"x-Plural-Rule\">one\u003C\u002Fprop>\n        \u003Ctuv xml:lang=\"en-US\">\n          \u003Cseg>{count} file\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"fr-FR\">\n          \u003Cprop type=\"x-Plural-Translation-Group\">tr-plural-id-1\u003C\u002Fprop>\n          \u003Cseg>{count] dossier\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"es-ES\">\n          \u003Cprop type=\"x-Plural-Translation-Group\">tr-plural-id-2\u003C\u002Fprop>\n          \u003Cseg>{count} archivo\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n      \u003C\u002Ftu>\n      \u003Ctu>\n        \u003Cprop type=\"x-Plural-Source-Group\">src-plural-id\u003C\u002Fprop>\n        \u003Cprop type=\"x-Plural-Rule\">other\u003C\u002Fprop>\n        \u003Ctuv xml:lang=\"en-US\">\n          \u003Cseg>{count} files\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"fr-FR\">\n          \u003Cprop type=\"x-Plural-Translation-Group\">tr-plural-id-1\u003C\u002Fprop>\n          \u003Cseg>{count] dossiers\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"es-ES\">\n          \u003Cprop type=\"x-Plural-Translation-Group\">tr-plural-id-2\u003C\u002Fprop>\n          \u003Cseg>{count} archivos\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n      \u003C\u002Ftu>\n  \u003C\u002Fbody>\n\u003C\u002Ftmx>\n```\n\n### Localazy extension\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Ctmx version=\"1.4\">\n  \u003Cheader \n    adminlang=\"en\" \n    creationtool=\"localazy.com\" \n    datatype=\"PlainText\" \n    o-tmf=\"Localazy\" \n    segtype=\"sentence\" \n    srclang=\"en\"\n  \u002F>\n  \u003Cbody>\n    \u003Ctu>\n        \u003Cprop type=\"x-localazy-plural-id\">plural-id\u003C\u002Fprop>\n        \u003Cprop type=\"x-localazy-plural-form\">one\u003C\u002Fprop>\n        \u003Ctuv xml:lang=\"en-US\">\n          \u003Cseg>{count} file\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"fr-FR\">\n          \u003Cseg>{count] dossier\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"es-ES\">\n          \u003Cseg>{count} archivo\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n      \u003C\u002Ftu>\n      \u003Ctu>\n        \u003Cprop type=\"x-localazy-plural-id\">plural-id\u003C\u002Fprop>\n        \u003Cprop type=\"x-localazy-plural-form\">other\u003C\u002Fprop>\n        \u003Ctuv xml:lang=\"en-US\">\n          \u003Cseg>{count} files\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"fr-FR\">\n          \u003Cseg>{count] dossiers\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n        \u003Ctuv xml:lang=\"es-ES\">\n          \u003Cseg>{count} archivos\u003C\u002Fseg>\n        \u003C\u002Ftuv>\n      \u003C\u002Ftu>\n  \u003C\u002Fbody>\n\u003C\u002Ftmx>\n```\n\n## HTML entities\n\nHTML entities are not allowed in XML files because they are not defined in the XML standard. Localazy can convert HTML entities to their Unicode representation when the file is imported.\n\nThis feature can be enabled by adding `decode_html_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2829,"featured_icon":2830},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2836],{"id":2837,"documentation_id":2820,"languages_code":812,"slug":2824,"title":2825,"content":2827,"meta_title":2825,"meta_description":2826,"excerpt":2826},221,[],{"id":536,"status":8,"sort":2840,"created_on":1856,"modified_on":2841,"slug":2842,"title":2843,"excerpt":2844,"content":2845,"meta_title":2843,"meta_description":2844,"pinned":15,"main_image":7,"section":2846,"subsection":2849,"cta":2850,"faq":2851,"dictionary":2856,"translations":2857,"documentation_id":536,"blog_articles":2859},"32080","2025-03-03T10:19:16.000Z","po-format","File Format - PO\u002FPOT","Learn how to use Localazy CLI for app and software localization with translations in PO\u002FPOT files. ","Gettext PO\u002FPOT format is fully supported including plurals and context information. \n\nSee [the full specification](https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fhtml_node\u002FPO-Files.html) for more details.\n\n## Context information\n\nThese comments are parsed and processed:\n\n- `#` - general comment\n- `#.` - extracted comment\n- `#:` - reference\n\nBy default, comments are not restored in the output file. If you want to preserve them, enable **preserve_comments** in **features** in the [upload section](\u002Fdocs\u002Fcli\u002Fupload-reference). \n\n## Texts\n\nThe standard format for single and multi-line line strings is fully supported. \n\n```text\n# Single line\nmsgctxt \"Context\"\nmsgid \"Input text\"\nmsgstr \"Translation\"\n\n# Multiple lines\nmsgid \"\"\n\"The input text\\n\"\n\"splitted to several\\n\"\n\"lines\"\nmsgstr \"Translation\\n\"\n\"can also be splitted.\"\n```\n\n## Plurals\n\nPlurals are fully supported in the standard form described below.\n\n```text\nmsgid \"\"\nmsgstr \"\"\n\"...\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\"...\"\n\nmsgid \"Just one user online\"\nmsgid_plural \"There are %d users online\"\nmsgstr[0] \"Un seul utilisateur en ligne\"\nmsgstr[1] \"Il y a %d utilisateurs en ligne\"\n```\n\n::: info\nWe generate `Plural-Forms` field in the header from the latest CLDR data, so the formula may be a bit different. However, it should be accurate and recent.  \n:::\n\n## Use msgid for ID\u002Fkey\n\nBy default, Localazy parses **po** files the way they are planned to be used. The content of **msgid** is used for the source language and **msgstr** for the target language. \n\nIf you use **msgid** for ID\u002Fkey and don't want to parse **msgid** for the source language, enable **skip_source** in **features** in the [upload section](\u002Fdocs\u002Fcli\u002Fupload-reference). This way, **msgid** is used for the key and **msgstr** for content. \n\n## Use key for missing texts\n\nEnable **use_key_for_content** in **features** in the [upload section](\u002Fdocs\u002Fcli\u002Fupload-reference) to use the **msgid** as a content where **msgstr** is empty.\n\n## Working with empty translations\n\nIf you, for some reason, need to preserve empty translations, you will need two options that you can use in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n| Feature | Description |\n| --- | --- |\n| `ignore_blank_content` | By default, empty translations in the input file are considered a valid empty translation. There are many reasons when using empty translation is a valid case. With this option enabled, empty translations are filtered out and the string is considered untranslated. |\n| `empty_untranslated` | This feature tells Localazy to output untranslated strings as empty translation. |\n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Generating MO\n\nYou can instruct Localazy to generate binary MO files instead of PO files. Add `output_mo` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable it. \n\nIf you need both PO and MO files, you can use [Format Conversions](\u002Fdocs\u002Fcli\u002Fformat-conversions) in your `localazy.json`. For example:\n\n```json\n{\n  \"readKey\": \"---\",\n  \"writeKey\": \"---\",\n\n  \"upload\": {\n  \t\"files\": \"locales\u002Fen.po\"     \n  },\n\n  \"download\": {   \n    \"files\": \"my_po_files\u002F${lang}.po\"\n  },\n  \n  \"conversion\": {\n    \"actions\": {\n      \"type\": \"mo\",\n      \"output\": \"my_mo_files\u002F${lang}.mo\"\n    }\n  }\n\n}\n```\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2847,"featured_icon":2848},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2852,2854],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2853},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},{"id":2230,"status":8,"title":2231,"content":2232,"slug":2233,"created_on":2111,"modified_on":2234,"owner":1855,"meta_title":7,"category":2855},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2858],{"id":536,"documentation_id":536,"languages_code":812,"slug":2842,"title":2843,"content":2845,"meta_title":2843,"meta_description":2844,"excerpt":2844},[],{"id":311,"status":8,"sort":2861,"created_on":1856,"modified_on":2862,"slug":2863,"title":2864,"excerpt":2865,"content":2866,"meta_title":2864,"meta_description":2865,"pinned":15,"main_image":7,"section":2867,"subsection":2870,"cta":2871,"faq":2872,"dictionary":2875,"translations":2876,"documentation_id":311,"blog_articles":2878},"32090","2024-07-16T15:14:43.000Z","resx-format","File Format - RESX","Learn how to use Localazy CLI for app and software localization with translations in RESX files. ","RESX format is supported and with Localazy, it's possible to use also plurals and arrays for more comfortable and accurate translations.  \n\n## Context information\n\nBy default, Localazy extracts content from preceding XML comments and from sub-elements `description`, `context`, `comment`, and `developer_comment` and presents it to the translators to provide better context and improve translation quality.\n\n```xml\n\u003Croot>\n\n    \u003C!-- Context information. -->\n    \u003Cdata name=\"string_key\">\n        \u003Cvalue>The translated content\u003C\u002Fvalue>       \n        \u003Ccomment>Another way to specify context information.\u003C\u002Fcomment>\n    \u003C\u002Fdata>\n\n\u003C\u002Froot>\n```\n\n## HTML entities\n\nHTML entities are not allowed in RESX files because they are not defined in the XML standard. Localazy can convert HTML entities to their Unicode representation when the file is imported.\n\nThis feature can be enabled by adding `decode_html_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Arrays\n\nArrays are good but beware of changing the number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nUsing arrays in RESX is not a standard. However, Localazy can parse the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```xml\n\u003Croot>\n\n    \u003Cdata name=\"difficulty[0]\">\n        \u003Cvalue>easy\u003C\u002Fvalue>\n    \u003C\u002Fdata>\n\n    \u003Cdata name=\"difficulty[4]\">\n        \u003Cvalue>normal\u003C\u002Fvalue>\n    \u003C\u002Fdata>\n\n    \u003Cdata name=\"difficulty[7]\">\n        \u003Cvalue>hard\u003C\u002Fvalue>\n    \u003C\u002Fdata>\n\n    \u003Cdata name=\"difficulty[9]\">\n        \u003Cvalue>extreme\u003C\u002Fvalue>\n    \u003C\u002Fdata>\n\n\u003C\u002Froot>\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where the valid index is a non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different outputs for translated files due to how plurals are handled in different languages. \n\n```xml\n\u003Croot>\n\n  \u003C!-- English has only two plural forms: -->\n  \n  \u003Cdata name=\"items[one]\">\n    \u003Cvalue>You have 1 item.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n  \u003Cdata name=\"items[other]\">\n    \u003Cvalue>You have %d items.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n  \u003C!-- Czech has three plural forms: -->\n  \n  \u003Cdata name=\"items[one]\">\n    \u003Cvalue>Máte 1 položku.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n  \u003Cdata name=\"items[few]\">\n    \u003Cvalue>Máte %d položky.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n  \u003Cdata name=\"items[other]\">\n    \u003Cvalue>Máte %d položek.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n\u003C\u002Froot>\n```\n\nLocalazy knows the rules for different languages and adapts its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n### Suffixed with camelCase\n\nThis feature can be enabled by adding `plural_postfix_cc` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n**Example:**\n\n```xml\n\u003Croot>\n  \n  \u003Cdata name=\"usersOne\">\n    \u003Cvalue>There is one user.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n  \u003Cdata name=\"usersOther\">\n    \u003Cvalue>There are $number users.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n\u003C\u002Froot>\n```\n\n### Suffixed with brackets\n\nThis feature can be enabled by adding `plural_postfix_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n \n**Example:**\n\n```xml\n\u003Croot>\n  \n  \u003Cdata name=\"users[one]\">\n    \u003Cvalue>There is one user.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n  \u003Cdata name=\"users[other]\">\n    \u003Cvalue>There are $number users.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\n\u003C\u002Froot>\n```\n\n### Defined using ICU\n\nThis feature can enabled by adding `plural_icu` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```xml\n\u003Croot> \n  \u003Cdata name=\"users\">\n    \u003Cvalue>There are {COUNT, plural, one {one user} other {# users}}.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\u003C\u002Froot>\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2868,"featured_icon":2869},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2873],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2874},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2877],{"id":311,"documentation_id":311,"languages_code":812,"slug":2863,"title":2864,"content":2866,"meta_title":2864,"meta_description":2865,"excerpt":2865},[],{"id":891,"status":8,"sort":2880,"created_on":1856,"modified_on":2881,"slug":2882,"title":2883,"excerpt":2884,"content":2885,"meta_title":2883,"meta_description":2884,"pinned":15,"main_image":7,"section":2886,"subsection":2889,"cta":2890,"faq":2891,"dictionary":2894,"translations":2895,"documentation_id":891,"blog_articles":2897},"32100","2024-07-16T15:14:58.000Z","yaml-format","File Format - YAML","Learn how to use Localazy CLI for app and software localization with translations in YAML files. ","Localazy doesn't come with small parsers for each of the different flavors of YAML files used for app and software localization. Instead, it comes with a flexible and configurable solution and you can fine-tune it for your specific needs. \n\n## Plain YAMLs\n\nSimple plain YAML files are supported out-of-the-box and no extra configuration is necessary.  \n\n```yaml\nkey1: Key 1\nkey2: Key 2\n```\n\n## Structured YAMLs\n\nStructured YAMLs are supported by default and no configuration is necessary. \n\n```yaml\nparent:\n  child:\n    another_nested_level: All is supported.\n```\n\n## Rails i18n YAML\n\nThe support for Rails i18n YAML can be enabled by including `lang_root` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nIf enabled, there must be only one root node. It's removed when the file is parsed, and restored again with the correct locale code when translated files are produced. \n\n```yaml\n---\nen-US:\n  parent:\n    child:\n      another_nested_level: All is supported.\n```\n\n## Multilingual YAML\n\nMultilingual YAMLs allow defining more languages inside a single file. Localazy supports multilingual YAMLs with all the features describe in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```yaml\nen: \n  key: in English\n\ncs:\n  key: in Czech\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name**  (English, German, Czech, …)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n \n## Object-based YAML\n\nBy including `content_as_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable parsing of more complex YAML files where the content is based on sub-structures.  \n\n```yaml\nkey:\n  message: String content\n  description: Optional additional comment for translators.\n```\n\nInstead of `message`, you can use `string`, `value`, `text`, `content` or `translation`. Localazy remembers the field name and generates exactly the same document - just translated - for each of languages.  \n\nFor the context information, instead of `description`, any of `context`, `comment` and `developer_comment` can be used. \n\n::: info\nAll other features describe in this document are still available including structured YAML, arrays and plurals parsing, etc. \n:::\n   \n## Array-based YAML\n\nAnother used YAML format is an array of objects. Enable it by listing `content_as_array` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\n- id: string1\n  content: String 1\n  description: Information for the translator.\n\n- id: string2\n  content: String 2\n  description: Information for the translator.\n```\n\nAs with the object-based YAML above, you can use different names for fields. See the table below.\n\n| Type | Variants |\n| --- | --- |\n| String Id \u002F key | `id`, `key`, `name` |\n| Text content | `message`, `string`, `text`, `value`, `content`, `translation` |\n| Comment | `description`, `context`, `comment`, `developer_comment` |\n\n::: info\nAll other features describe in this document are still available including structured YAMLs, arrays and plurals parsing, etc.  \n:::\n\n## Contextual metadata\n\nWe have adopted metadata format from ARB files to our YAML support allowing to define additional metadata for the string using `@key` notation.\n\nWith `arb_metadata` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable ARB-style metadata. With the feature enabled, Localazy extracts content from `description`, `context` and `placeholders` and presents it to the translators to provide better context and improve translation quality.\n\nFor plurals and arrays, metadata can be defined using the base form without the suffix. \n\n```yaml\nsingleString: This is just a normal string.\n\"@singleString\": \n  context: views:Home page\n  description: Comment for the single string.\n  \ndatePickerMinuteOne: 1 minute\ndatePickerMinuteOther: \"%minute minutes\"\n\"@datePickerMinute\":\n  description: Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'\n  plural: minute\n  placeholders:\n    minute:\n      description: the number of minutes\n      example: 15\n```\n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```yaml\ncategory:\n  my_key: This is a text of my key.\n  \"@@localazy:comment:my_key\": This is a comment for translators.\n  \"@@localazy:limit:my_key\": 100\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThere are two ways how to define arrays.  \n\n### YAML Arrays\n\nStandard YAML arrays are recognized as arrays and stored with Localazy in corresponding way.\n\nThis feature can be enabled by adding `array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```yaml\ngame.difficulty:\n  - easy\n  - medium\n  - hard\n```\n\n### Arrays defined by suffix\n\nLocalazy parses automatically also the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```yaml\ndifficulty[0]: easy\ndifficulty[4]: normal\ndifficulty[7]: hard\ndifficulty[9]: extreme\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```yaml\n# English has only two plural forms:\npluralOne: You have 1 item.\npluralOther: You have %d items.\n\n# Czech has three plural forms:\npluralOne: Máte 1 položku.\npluralFew: Máte %d položky.\npluralOther: Máte %d položek.\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n\n### Defined as array\n\nEnabled by `plural_array` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```yaml\nusers:\n  - quantity: one\n    content: There is one user.\n  - quantity: other\n    content: There are %d users.\n```\n\nIt's also possible to use `type`, `t` or `q` instead of `quantity` and `value`, `v` or `c` instead of `content` for shorter form.  \n\nIf the exact structure is not met, the array is not considered plural and is read as structured YAML instead. \n\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section: \n\n* `plural_postfix_sd` for single dot variant.\n* `plural_postfix_us` for underscore variant.\n* `plural_postfix_cc` for camelCase variant.\n* `plural_postfix_br` for [brackets] variant.\n\n**Examples:**\n \n```yaml\nsingle_dot: \n  users.one: There is one user.\n  users.other: There are $number users.\n\nunderscore: \n  users_one: There is one user.\n  users_other: There are $number users.\n\ncamelCase: \n  usersOne: There is one user.\n  usersOther: There are $number users.\n\nbrackets: \n  users[one]: There is one user.\n  users[other]: There are $number users.\n```\n\n### Defined as object\n\nEnabled by `plural_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\nusers: \n  one: There is one user.\n  other: There are $number users.\n```\n\nThe object is considered plural if and only if all items are key-value strings with keys being valid plural types (zero, one, two, few, many, other).\n\nIf the condition above is not met, the object is not considered plural and is parsed as a structured YAML.\n\n\n### Defined using i18Next plural\n\nEnabled by `plural_i18next` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```yaml\nkey: item\nkey_plural: items\n```\n\nAll plural forms:\n\n```yaml\nkey_0: zero\nkey_1: singular\nkey_2: two\nkey_3: few\nkey_4: many\nkey_5: other\n```\n\n### Defined using ICU\n\nEnabled by `plural_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\nusers: There are {COUNT, plural, one {one user} other {# users}}.\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n### Defined using pipeline\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```yaml\n{\n  key_plural: one | other\n}\n```\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Using key as the source translation\n\nThere is a special format where the key is also the source language translation. It's possible to enable the support for this format by adding `source_is_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\n\"Text in the source language\": \"Translation in the defined\"\n```\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Features overview\n\nThe table below is a summary of all available features for YAML parser.\n\n| Feature | Description |\n| --- | --- |\n| `lang_root` | Parses\u002Fproduces files with root node being the locale code (Rails i18n). |  \n| `content_as_object` | Enable object-based YAML. |\n| `content_as_array` | Enable array-based YAML. |\n| `multilingual` | Enable support of multilingual YAML files. |\n| `lang_format=xxx` | Define how to output locales for multilingual files. |\n| `array` | Parse YAML arrays as arrays and not as list of single strings. |\n| `array_br` | Parse strings with keys suffixed by `[x]` as arrays. |\n| `plural_array` | Enable plurals defined as arrays. |\n| `plural_postfix_us` | Parse strings with keys suffixed by `_type` as plural. |\n| `plural_postfix_cc` | Parse strings with keys suffixed by `Type` as plural. |\n| `plural_postfix_br` | Parse strings with keys suffixed by `[type]` as plural. |\n| `plural_postfix_sd` | Parse strings with keys suffixed by `.type` as plural. |\n| `plural_object` | Enable plurals defined as objects. |\n| `plural_i18next` | Enable i18Next plurals. |\n| `plural_icu` | Enable support for ICU plurals. |\n| `plural_pipeline` | Enable support for plurals defined using pipeline. |\n| `arb_metadata` | Enable support for ARB-style metadata. |\n| `skip_empty` | Consider empty translations as untranslated. |\n| `filter_untranslated` | Don't use the source language texts for missing translations. |\n| `source_is_key` | Use the key as the source translation. |\n| `add_bom` | Include byte order mark in the output file. |\n\n___CLI_LINKS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2887,"featured_icon":2888},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2892],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2893},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2896],{"id":891,"documentation_id":891,"languages_code":812,"slug":2882,"title":2883,"content":2885,"meta_title":2883,"meta_description":2884,"excerpt":2884},[],{"id":2899,"status":8,"sort":2900,"created_on":1856,"modified_on":2901,"slug":2902,"title":2903,"excerpt":2904,"content":2905,"meta_title":2903,"meta_description":2904,"pinned":15,"main_image":7,"section":2906,"subsection":2909,"cta":2910,"faq":2911,"dictionary":2914,"translations":2915,"documentation_id":2899,"blog_articles":2917},80,"32105","2024-07-16T15:14:53.000Z","php-format","File Format - PHP","Learn how to use Localazy CLI for app and software localization with translations in PHP files. ","\nLocalazy allows using PHP files based on associative arrays such as those commonly used with Laravel framework. As an addition, we support for many different features - plurals, ICU, etc.  \n\n\n## Plain PHP\n\nSimple plain PHP files are supported out-of-the-box and no extra configuration is necessary.  \n\n```php\n\u003C?php\nreturn [\n  \"key1\" => \"Key 1\",\n  \"key2\" => \"Key 2\"\n];\n?>\n```\n\nIt's possible to use `array()` method instead of the short `[]` notation:\n\n```php\n\u003C?php\nreturn array(\n  \"key1\" => \"Key 1\",\n  \"key2\" => \"Key 2\"\n);\n?>\n```\n\nPlease note that we always output files with the short `[]` notation.\n\nLocalazy is able to parse string and integer keys:\n\n```php\n\u003C?php\nreturn array(\n  \"key1\" => \"String Key 1\",\n  \"key2\" => \"String Key 2\",\n  1 => \"Integer Key 1\",\n  2 => \"Integer Key 2\"\n);\n?>\n```\n\n## Structured PHP\n\nStructured PHP files are supported by default and no configuration is necessary. \n\n```php\n\u003C?php\nreturn [\n  \"parent\" => [\n    \"child\" => array(\n       \"another_nested_level\" => \"All is supported.\"\n    )\n  ]\n];\n?>  \n```\n\n## Multilingual PHP\n\nMultilingual PHP files allow defining more languages inside a single file. Localazy supports multilingual PHP files with all the features describe in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```php\n\u003C?php\nreturn [\n  \"en\" => [\n    \"key\" => \"in English\"\n  ],\n  \"cs\" => [\n    \"key\" => \"in Czech\"\n  ]\n];\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name**  (English, German, Czech, …)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n \n## Object-based PHP\n\nBy including `content_as_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable parsing of more complex PHP files where the content is based on sub-structures.  \n\n```php\n\u003C?php\nreturn [\n  \"key\" => [\n    \"message\" => \"String content\",\n    \"description\" => \"Optional additional comment for translators.\"\n  ]\n];\n?>\n```\n\nInstead of `message`, you can use `string`, `value`, `text`, `content` or `translation`. Localazy remembers the field name and generates exactly the same document - just translated - for each of languages.  \n\nFor the context information, instead of `description`, any of `context`, `comment` and `developer_comment` can be used. \n\n::: info\nAll other features describe in this document are still available including structured PHP, arrays and plurals parsing, etc. \n:::\n   \n## Context information\n\nIt's possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```json\n\u003C?php\nreturn [\n  \"category\" => [\n    \"my_key\" => \"This is a text of my key.\",\n    \"@@localazy:comment:my_key\" => \"This is a comment for translators.\",\n    \"@@localazy:limit:my_key\" => \"100\"\n  ]\n];\n?>\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\n\n### Arrays defined by suffix\n\nLocalazy parses automatically also the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```php\n\u003C?php\nreturn [\n  \"difficulty[0]\" => \"easy\",\n  \"difficulty[4]\" => \"normal\",\n  \"difficulty[7]\" => \"hard\",\n  \"difficulty[9]\" => \"extreme\"\n];\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```php\n\u003C?php\nreturn [\n  \u002F\u002F English has only two plural forms:\n  \"pluralOne\" => \"You have 1 item.\",\n  \"pluralOther\" => \"You have %d items.\"\n\n  \u002F\u002F Czech has three plural forms:\n  \"pluralOne\" => \"Máte 1 položku.\",\n  \"pluralFew\" => \"Máte %d položky.\",\n  \"pluralOther\" => \"Máte %d položek.\"\n];\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section: \n\n* `plural_postfix_sd` for single dot variant.\n* `plural_postfix_us` for underscore variant.\n* `plural_postfix_cc` for camelCase variant.\n* `plural_postfix_br` for [brackets] variant.\n\n**Examples:**\n \n```php\n\u003C?php\nreturn [\n\n  \"single_dot\" => [\n    \"users.one\" => \"There is one user.\",\n    \"users.other\" => \"There are {{number}} users.\"\n  ],\n\n  \"underscore\" => [\n    \"users_one\" => \"There is one user.\",\n    \"users_other\" => \"There are {{number}} users.\"\n  ],\n\n  \"camelCase\" => [\n    \"usersOne\" => \"There is one user.\",\n    \"usersOther\" => \"There are {{number}} users.\"\n  ],  \n\n  \"brackets\" => [\n    \"users[one]\" => \"There is one user.\",\n    \"users[other]\" => \"There are {{number}} users.\"\n  ],\n];\n```\n\n\n### Defined as object\n\nEnabled by `plural_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```php\n\u003C?php\nreturn [\n  \"users\" => [\n    \"one\" => \"There is one user.\",\n    \"other\" => \"There are $number users.\"\n  ]\n];\n```\n\nThe object is considered plural if and only if all items are key-value strings with keys being valid plural types (zero, one, two, few, many, other).\n\nIf the condition above is not met, the object is not considered plural and is parsed as a structured PHP.\n\n### Defined using i18Next plural\n\nEnabled by `plural_i18next` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```php\n\u003C?php\nreturn [\n  \"key\" => \"item\",\n  \"key_plural\" => \"items\"\n];\n```\n\nAll plural forms:\n\n```php\n\u003C?php\nreturn [\n  \"key_0\" => \"zero\",\n  \"key_1\" => \"singular\",\n  \"key_2\" => \"two\",\n  \"key_3\" => \"few\",\n  \"key_4\" => \"many\",\n  \"key_5\" => \"other\"\n];\n```\n\n### Defined using ICU\n\nEnabled by `plural_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```php\n\u003C?php\nreturn [\n  \"users\" => \"There are {COUNT, plural, one {one user} other {# users}}.\"\n];\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n ### Defined using pipeline\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n```php\n\u003C?php\nreturn [\n  \"key_plural\" => \"one | other\"\n];\n```\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n\n## Using key as the source translation\n\nThere is a special format where the key is also the source language translation. It's possible to enable the support for this format by adding `source_is_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```php\n\u003C?php\nreturn [\n  \"Text in the source language\" => \"Translation in the defined language\"\n];\n```\n\n## String concatenation \u002F variables\n\nIt's possible to use string interpolation with variables. \n\n**This is supported:**\n\n```php\n\u003C?php\nreturn [\n  \"key\" => \"String with variable: $variable\"\n];\n```\n\nIt's possible to use string concatenation, but only without variables. \n\n**This is supported:**\n\n```php\n\u003C?php\nreturn [\n  \"key\" => \"multiline\" .\n           \"strings\" .\n           \"can\" .\n           \"be\" .\n           \"concatenated\"\n];\n```\n\nVariables in concatenation are not supported.\n\n**This is NOT supported:**\n\n```php\n\u003C?php\nreturn [\n  \"key\" => \"There is \" . VARIABLE . \" items.\"\n];\n```\n\nPlease use string interpolation or placeholders instead.\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Features overview\n\nThe table below is a summary of all available features for PHP parser.\n\n| Feature | Description |\n| --- | --- |\n| `content_as_object` | Enable object-based PHP. |\n| `multilingual` | Enable support of multilingual PHP files. |\n| `lang_format=xxx` | Define how to output locales for multilingual files. |\n| `array_br` | Parse strings with keys suffixed by `[x]` as arrays. |\n| `plural_postfix_us` | Parse strings with keys suffixed by `_type` as plural. |\n| `plural_postfix_cc` | Parse strings with keys suffixed by `Type` as plural. |\n| `plural_postfix_br` | Parse strings with keys suffixed by `[type]` as plural. |\n| `plural_postfix_sd` | Parse strings with keys suffixed by `.type` as plural. |\n| `plural_object` | Enable plurals defined as objects. |\n| `plural_i18next` | Enable i18Next plurals. |\n| `plural_icu` | Enable support for ICU plurals. |\n| `plural_pipeline` | Enable plurals defined using pipeline. |\n| `skip_empty` | Consider empty translations as untranslated. |\n| `filter_untranslated` | Don't use the source language texts for missing translations. |\n| `source_is_key` | Use the key as the source translation. |\n| `add_bom` | Include byte order mark in the output file. |\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2907,"featured_icon":2908},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2912],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2913},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2916],{"id":2899,"documentation_id":2899,"languages_code":812,"slug":2902,"title":2903,"content":2905,"meta_title":2903,"meta_description":2904,"excerpt":2904},[],{"id":1415,"status":8,"sort":1854,"created_on":1856,"modified_on":1857,"slug":1858,"title":1859,"excerpt":1860,"content":1900,"meta_title":1859,"meta_description":1860,"pinned":15,"main_image":7,"section":2919,"subsection":2922,"cta":2923,"faq":2924,"dictionary":2927,"translations":2928,"documentation_id":1415,"blog_articles":2930},{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2920,"featured_icon":2921},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2925],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2926},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2929],{"id":1415,"documentation_id":1415,"languages_code":812,"slug":1858,"title":1859,"content":1900,"meta_title":1859,"meta_description":1860,"excerpt":1860},[],{"id":2932,"status":8,"sort":2933,"created_on":1856,"modified_on":1857,"slug":2934,"title":2935,"excerpt":2936,"content":2937,"meta_title":2935,"meta_description":2936,"pinned":15,"main_image":7,"section":2938,"subsection":2941,"cta":2942,"faq":2943,"dictionary":2944,"translations":2945,"documentation_id":2932,"blog_articles":2947},107,"32115","neon-format","File Format - NEON","Learn how to use Localazy CLI for app and software localization with translations in NEON (Nette Object Notation) files. ","[NEON (Nette Object Notation)](https:\u002F\u002Fdoc.nette.org\u002Fen\u002F3.1\u002Fneon) is a popular format for [Nette framework](https:\u002F\u002Fnette.org) and with Localazy, you can use it out-of-the-box. Localazy NEON parser is a flexible and configurable solution and you can fine-tune it for your specific needs. \n\n## Plain NEONs\n\nSimple plain NEON files are supported out-of-the-box and no extra configuration is necessary.  \n\n```yaml\nkey1: Key 1\nkey2: Key 2\n```\n\n## Structured NEONs\n\nStructured NEONs are supported by default and no configuration is necessary. \n\n```yaml\nparent:\n  child:\n    another_nested_level: All is supported.\n```\n\n## Multilingual NEON\n\nMultilingual NEONs allow defining more languages inside a single file. Localazy supports multilingual NEON with all the features described in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```yaml\nen: \n  key: in English\n\ncs:\n  key: in Czech\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name**  (English, German, Czech, …)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n \n## Object-based NEON\n\nBy including `content_as_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable parsing of more complex NEON files where the content is based on sub-structures.  \n\n```yaml\nkey:\n  message: String content\n  description: Optional additional comment for translators.\n```\n\nInstead of `message`, you can use `string`, `value`, `text`, `content` or `translation`. Localazy remembers the field name and generates exactly the same document - just translated - for each of languages.  \n\nFor the context information, instead of `description`, any of `context`, `comment` and `developer_comment` can be used. \n\n::: info\nAll other features described in this document are still available including structured NEON, arrays and plurals parsing, etc. \n:::\n   \n## Array-based NEON\n\nAnother NEON format is an array of objects. Enable it by listing `content_as_array` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\n- id: string1\n  content: String 1\n  description: Information for the translator.\n\n- id: string2\n  content: String 2\n  description: Information for the translator.\n```\n\nAs with the object-based NEON above, you can use different names for fields. See the table below.\n\n| Type | Variants |\n| --- | --- |\n| String Id \u002F key | `id`, `key`, `name` |\n| Text content | `message`, `string`, `text`, `value`, `content`, `translation` |\n| Comment | `description`, `context`, `comment`, `developer_comment` |\n\n::: info\nAll other features described in this document are still available including structured NEON, arrays and plurals parsing, etc.  \n:::\n\n## Contextual metadata\n\nWe have adopted metadata format from ARB files to our NEON support allowing to define additional metadata for the string using `@key` notation.\n\nWith `arb_metadata` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can enable ARB-style metadata. With the feature enabled, Localazy extracts content from `description`, `context` and `placeholders` and presents it to the translators to provide better context and improve translation quality.\n\nFor plurals and arrays, metadata can be defined using the base form without the suffix. \n\n```yaml\nsingleString: This is just a normal string.\n\"@singleString\": \n  context: views:Home page\n  description: Comment for the single string.\n  \ndatePickerMinuteOne: 1 minute\ndatePickerMinuteOther: \"%minute minutes\"\n\"@datePickerMinute\":\n  description: Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'\n  plural: minute\n  placeholders:\n    minute:\n      description: the number of minutes\n      example: 15\n```\n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```yaml\ncategory:\n  my_key: This is a text of my key.\n  \"@@localazy:comment:my_key\": This is a comment for translators.\n  \"@@localazy:limit:my_key\": \"100\"\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nThere are two ways how to define arrays.  \n\n### NEON Arrays\n\nStandard NEON arrays are recognized as arrays and stored with Localazy in corresponding way.\n\nThis feature can be enabled by adding `array` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```yaml\ngame.difficulty:\n  - easy\n  - medium\n  - hard\n```\n\n### Arrays defined by suffix\n\nLocalazy parses automatically also the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```yaml\ndifficulty[0]: easy\ndifficulty[4]: normal\ndifficulty[7]: hard\ndifficulty[9]: extreme\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```yaml\n# English has only two plural forms:\npluralOne: You have 1 item.\npluralOther: You have %d items.\n\n# Czech has three plural forms:\npluralOne: Máte 1 položku.\npluralFew: Máte %d položky.\npluralOther: Máte %d položek.\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n\n### Defined as array\n\nEnabled by `plural_array` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```yaml\nusers:\n  - quantity: one\n    content: There is one user.\n  - quantity: other\n    content: There are %d users.\n```\n\nIt's also possible to use `type`, `t` or `q` instead of `quantity` and `value`, `v` or `c` instead of `content` for shorter form.  \n\nIf the exact structure is not met, the array is not considered plural and is read as structured NEON instead. \n\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section: \n\n* `plural_postfix_sd` for single dot variant.\n* `plural_postfix_us` for underscore variant.\n* `plural_postfix_cc` for camelCase variant.\n* `plural_postfix_br` for [brackets] variant.\n\n**Examples:**\n \n```yaml\nsingle_dot: \n  users.one: There is one user.\n  users.other: There are $number users.\n\nunderscore: \n  users_one: There is one user.\n  users_other: There are $number users.\n\ncamelCase: \n  usersOne: There is one user.\n  usersOther: There are $number users.\n\nbrackets: \n  \"users[one]\": There is one user.\n  \"users[other]\": There are $number users.\n```\n\n### Defined as object\n\nEnabled by `plural_object` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\nusers: \n  one: There is one user.\n  other: There are $number users.\n```\n\nThe object is considered plural if and only if all items are key-value strings with keys being valid plural types (zero, one, two, few, many, other).\n\nIf the condition above is not met, the object is not considered plural and is parsed as a structured NEON.\n\n\n### Defined using i18Next plural\n\nEnabled by `plural_i18next` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nSingular\u002Fplural variant:\n\n```yaml\nkey: item\nkey_plural: items\n```\n\nAll plural forms:\n\n```yaml\nkey_0: zero\nkey_1: singular\nkey_2: two\nkey_3: few\nkey_4: many\nkey_5: other\n```\n\n### Defined using ICU\n\nEnabled by `plural_icu` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\nusers: There are {COUNT, plural, one {one user} other {# users}}.\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n ### Defined using pipeline\nEnabled by `plural_pipeline` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\nSingular\u002Fplural variant:\n```yaml\n{\n  key_plural: one | other\n}\n```\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Using key as the source translation\n\nThere is a special format where the key is also the source language translation. It's possible to enable the support for this format by adding `source_is_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```yaml\n\"Text in the source language\": \"Translation in the defined\"\n```\n\n## Limitations\n\nTwo features specific to NEON format are not support at the moment. \n\n### Entities\n\nNEON entities are not supported.\n\n```neon\n# This is unsupported feature of NEON.\nentity: PDO(\"server\", \"port\", \"user\", \"password\")\n```\n\n### Mixed indexed\u002Fkey-based arrays\n\nThe format below mixing key-based values with indexes is not supported.\n\n```neon\nkey1: Value 1\n- Value 2\nkey2: Value 3\n- Value 4\n```\n\n## Output format\n\nThe Localazy NEON parser generates the output files in JSON-like format. Since every JSON is also valid NEON, the output files are valid NEON ones even if they have a slightly different formatting.\n\nLocalazy don't preserve the input formatting and by producing JSON-like output, it ensures that output files are to be widely supported. \n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add **add_bom** to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Features overview\n\nThe table below is a summary of all available features for NEON parser.\n\n| Feature | Description |\n| --- | --- |\n| `content_as_object` | Enable object-based NEON. |\n| `content_as_array` | Enable array-based NEON. |\n| `multilingual` | Enable support of multilingual NEON files. |\n| `lang_format=xxx` | Define how to output locales for multilingual files. |\n| `array` | Parse NEON arrays as arrays and not as list of single strings. |\n| `array_br` | Parse strings with keys suffixed by `[x]` as arrays. |\n| `plural_array` | Enable plurals defined as arrays. |\n| `plural_postfix_us` | Parse strings with keys suffixed by `_type` as plural. |\n| `plural_postfix_cc` | Parse strings with keys suffixed by `Type` as plural. |\n| `plural_postfix_br` | Parse strings with keys suffixed by `[type]` as plural. |\n| `plural_postfix_sd` | Parse strings with keys suffixed by `.type` as plural. |\n| `plural_object` | Enable plurals defined as objects. |\n| `plural_i18next` | Enable i18Next plurals. |\n| `plural_icu` | Enable support for ICU plurals. |\n| `plural_pipeline` | Enable plurals defined using pipeline. |\n| `arb_metadata` | Enable support for ARB-style metadata. |\n| `skip_empty` | Consider empty translations as untranslated. |\n| `filter_untranslated` | Don't use the source language texts for missing translations. |\n| `source_is_key` | Use the key as the source translation. |\n| `add_bom` | Include byte order mark in the output file. |\n\n___CLI_LINKS___\n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2939,"featured_icon":2940},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[2946],{"id":2932,"documentation_id":2932,"languages_code":812,"slug":2934,"title":2935,"content":2937,"meta_title":2935,"meta_description":2936,"excerpt":2936},[],{"id":1500,"status":8,"sort":2949,"created_on":2950,"modified_on":2951,"slug":2952,"title":2953,"excerpt":2954,"content":2955,"meta_title":2953,"meta_description":2954,"pinned":15,"main_image":7,"section":2956,"subsection":2959,"cta":2960,"faq":2961,"dictionary":2970,"translations":2971,"documentation_id":1500,"blog_articles":2973},"32120","2022-03-18T07:51:27.000Z","2024-07-17T05:44:29.000Z","csv-format","File Format - CSV\u002FTSV","Learn how to use Localazy CLI for app and software localization with translations in CSV\u002FTSV files. ","With Localazy, you can parse CSV\u002FTSV files and configure the parser to handle almost any of the widely used formats. Also, Localazy can help you with processing plurals and arrays in a translator-friendly way and export them correctly based on language requirements. \n\n## Input format\n\n### Delimiter\n\nThe comma (`,`) is used as the default delimiter for columns. Add `delimiter_tab` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to use tab (`\\t`), or `delimiter_semicolon` for semicolon (`;`).\n\n### Quotes\n\nDouble quotes (`\"`) are used as the default quoting character. Add `quote_single` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to use single quotes (`'`), or `quote_backslash` for backslash (`\\`).\n\nQuotes are only used when necessary, but by adding `force_quotes`, you can enforce using them for all texts. \n\n### New lines\n\nYou can use different combinations of characters for defining new lines. Add one of the options below to the `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable the given combination.\n\n| Feature | Description |\n| --- | --- |\n| `line_rn` | New lines are defined by `\\r\\n`. _Default option._ |\n| `line_r` | New lines are defined by `\\r`. |\n| `line_n` | New lines are defined by `\\n`. |\n| `line_nr` | New lines are defined by `\\n\\r` |\n\n### Header\n\nBy default, Localazy expects the first row to be a header. If your file doesn't have the header, you can notify Localazy that it shouldn't skip the first line by adding `no_header` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\nThe header is always required for multilingual files (see below) as it's used for determining the language.\n\n## Columns\n\n### Multilingual files\n\nAdd `multilingual` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable support for multilingual files. In multilingual files, instead of having one file per language, each language has its own column. \n\n### Defining columns\n\nYou can define how to read the file - which column is the key, which one is the comment for the translator, and where to look for translations. \n\nTo define the configuration, add `columns=key,content` to the `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section. These types can be used for defining the configuration:\n\n| Type | Description |\n| --- | --- |\n| `key` | Mark the column from which to read the key. _Must be defined and can be used only once_. |\n| `key:1` | Mark the column as the first part of the key if the key spans across two columns. |\n| `key:2` | Mark the column as the second part of the key if the key spans across two columns. |\n| `comment` | Mark the column from which to read the comment for the translator. _Optional and can be used only once if defined_. |\n| `-` | Mark the column to skip. _Optional, can be used multiple times_. |\n| `content` | Mark the column (for single-language files) or more columns (for multilingual files) from which to read translations. _Must be defined and can be used only once_. |\n\nThe default configuration is `columns=key,content`.\n\nFor single-language files, the columns are defined from left to right. For multilingual files, the columns are also defined from the left to right, but `content` is spread across as many columns as possible.\n\n#### Single-language file example\n\nLet's suppose that the input file has this format:\n\n| key | comment | line | english | czech |\n| --- | --- | --- | --- | --- |\n| Key 1 | Comment for Key 1 | 105 | English for Key 1 | Czech for Key 1 |\n\nWith configuration `columns=key,comment,-,content`, the first column is used as the key, the second one as a comment for the translator, the third one is skipped, the fourth is the actual translation and the rest of the file is ignored. \n\n**The language for the translation is determined from the configuration in CLI and not from what is in the header!**\n\n#### Multilingual file example\n\nLet's suppose that the input file has this format:\n\n| key | line | en | cs | fr | comment | reference |\n| --- | --- | --- | --- | --- | --- | --- |\n| Key 1 | 105 | Text EN | Text CS | Text FR | Comment 1 | ref #1 |\n\nTo read this file correctly, it's necessary to use configuration `columns=key,-,content,comment,-`. \n\nThe first column is used as the key, the second one is skipped. The last column is skipped and the sixth column is used as the comment for the translator. All columns in between are processed as translations in English, Czech, and French. \n\n**The language for the translation is determined from the file header and not from the configuration of CLI!**\n\n#### Multi-column key\n\nLet's suppose that the input file has this format:\n\n| key1 | key2 | content |\n| --- | --- | --- |\n| dashboard | title | Welcome! |\n| dashboard | text | Welcome to our awesome app. |\n\nTo read this file correctly, it's necessary to use configuration `columns=key:1,key:2,content`. \n\nThe first two columns are used as the composite key, the third column is used as the content. \n\n### Using key as the source translation\n\nIf the key is also the source language translation, it’s possible to enable support for this format by adding `source_is_key` to `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n**Example file:**\n\n| en | cs |\n| --- | --- |\n| Hello world | Ahoj světe |\n\nWith `source_is_key` and configuration `columns=key,content`, the first column `en` is parsed both as key and as the source language translation.\n\n## Arrays\n\nAdd `array_br` to `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable parsing of the following format as an array.\n\n| key | translation |\n| --- | --- |\n| key[0] | Item 1 |\n| key[1] | Item 2 |\n| key[2] | Item 3 |\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages (see below in **output format**).\n\nLocalazy knows the rules for different languages and adapts its interface to assist translators to correctly translate all mandatory forms.\n\nAllowed plurals types are:  **zero**,  **one**,  **two**,  **few**,  **many**,  **other**.\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to  **features**  in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference)  section:\n\n-   `plural_postfix_sd`  for single dot variant.\n-   `plural_postfix_dd`  for colon variant.\n-   `plural_postfix_us`  for underscore variant.\n-   `plural_postfix_cc`  for camelCase variant.\n-   `plural_postfix_br`  for [brackets] variant.\n\n**Examples:**\n\n| Key | Translation |\n| --- | --- |\n| single_dot[one] | There is one user. |\n| single_dot[other] | There are $number users. |\n| colon:one | There is one user. |\n| colon:other | There are $number users. |\n| underscore_one | There is one user. |\n| underscore_other | There are $number users. |\n| camelCaseOne | There is one user. |\n| camelCaseOther | There are $number users. |\n| brackets[one] | There is one user. |\n| brackets[other] | There are $number users. |\n\n### Defined using ICU\n\nEnabled by  `plural_icu`  in  **features**  in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference)  section.\n\n| Key | Translation |\n| --- | --- |\n| users | There are {COUNT, plural, one {one user} other {# users}}. |\n\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn’t be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n\nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n\n## Output format\n\nAs Localazy extracts the localizable assets from the file without additional data such as formatting, column order, etc., the output file is always generated in the following format:\n\n### Single-language files\n\n| key | xx |\n| --- | --- |\n| Key1 | translation in XX |\n| Key2 | translation in XX |\n\nThe header row is omitted if the input format didn't contain the header. \n\n\n### Multilingual files\n\n| key | en | fr | pl |\n| --- | --- | --- | --- |\n| Row1 | EN translation | FR translation | PL translation |\n| Row2 | EN translation | FR translation | PL translation |\n\n### Locale format\n\nYou can change the locale format in the header by adding `lang_format=xx` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xx` is one of:\n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nFor example, if you add `lang_format=locale_name`, the output file will be like:\n\n| key | English | French | Polish |\n| --- | --- | --- | --- |\n| Row1 | EN translation | FR translation | PL translation |\n| Row2 | EN translation | FR translation | PL translation |\n\n### Plurals\n\nPlural forms for languages that don't support them are kept empty like in the example below. \n\n| key | English | Czech |\n| --- | --- | --- |\n| row[one] | One user | Jeden uživatel |\n| row[few] |  | {count} uživatelé |\n| row[other] | {count} users | {count} uživatelů |\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2957,"featured_icon":2958},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2962],{"id":2963,"status":8,"title":2964,"content":2965,"slug":2966,"created_on":2111,"modified_on":2967,"owner":1855,"meta_title":2968,"category":2969},154,"We are managing translations in sheets. Can you help?","You can forget about managing translations using spreadsheets. Simply upload your last file into Localazy and let your translators do the job while you have full control and drastically reduced management overhead. In case you need help, feel free to [contact us](\u002Fcontact).","we-are-managing-translations-in-sheets-can-you-help","2022-07-20T10:03:26.000Z","Forget about sheets to translate product descriptions",{"id":441,"status":8,"created_on":1890,"sort":7,"slug":169,"label":165,"on_faq_index":15},[],[2972],{"id":1500,"documentation_id":1500,"languages_code":812,"slug":2952,"title":2953,"content":2955,"meta_title":2953,"meta_description":2954,"excerpt":2954},[],{"id":1566,"status":8,"sort":2975,"created_on":1856,"modified_on":2976,"slug":2977,"title":2978,"excerpt":2979,"content":2980,"meta_title":2978,"meta_description":2979,"pinned":15,"main_image":7,"section":2981,"subsection":2984,"cta":2985,"faq":2986,"dictionary":2989,"translations":2990,"documentation_id":1566,"blog_articles":2992},"32140","2024-07-16T15:14:54.000Z","ini-format","File Format - INI","Learn how to use Localazy CLI for app and software localization with translations in INI files. ","INI files are supported and with Localazy, it's possible to use also plurals and arrays for more comfortable and accurate translations.  \n\n## Encoding\n\nThe default encoding is **auto**. You can change it by including **encoding={encoding}** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. Available options are: `utf8`, `utf16`, `utf16le`, `utf16be`, `ansi`.\n\nIf you need BOM (byte order mark) to be exported in the output file, please add **add_bom** to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Multilingual INIs\n\nMultilingual INIs allow defining more languages inside a single file. Localazy supports multilingual INIs with all the features described in this document. \n\nThe top-level elements must be locale codes, and the corresponding source language as set in the project must be included. \n\nThe multilingual support must be enabled by adding `multilingual` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.   \n\n```ini\n[en]\nkey = in English\n\n[cs]\nkey = in Czech\n```\n\nLocale codes can be defined using one of the supported methods:\n\n* **LL_RR_Scrp**\n* **LL_Scrp_RR**\n* **LL_RR#Scrp**\n* **LL-RR-Scrp**\n* **LL-Scrp-RR**\n* **LL-RR#Scrp**\n* **LL+RR+Scrp**\n* **LL+Scrp+RR**\n* **Locale name**  (English, German, Czech, …)\n\nWhere **LL** is the language code (ISO 639-1), **RR** is the region code (ISO 3166-2), **Scrp** is the script code (ISO 15924). Parameters **RR** and **Scrp** can be omitted. \n\nIf the locale is not known to Localazy, it's skipped during the processing of uploaded files. \n\nYou can define the output format by adding `lang_format=xxx` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xxx` is one of the following: \n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nIt's a good practice to define the output format since it may not be inherited from the input file.  \n\n## Arrays\n\nArrays are good but beware of changing the number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nUsing arrays in INI is not standard. However, Localazy can parse the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```ini\n[game]\ndifficulty[0]=easy\ndifficulty[4]=normal\ndifficulty[7]=hard\ndifficulty[9]=extreme\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```ini\n# English has only two plural forms:\nitems[one]=You have 1 item.\nitems[other]=You have %d items.\n  \n# Czech has three plural forms:\nitems[one]=Máte 1 položku.\nitems[few]=Máte %d položky.\nitems[other]=Máte %d položek.\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n### Suffixed with camelCase\n\nThis feature can be enabled by adding `plural_postfix_cc` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n**Example:**\n\n```properties\nusersOne=There is one user.\nusersOther=There are $number users.\n```\n\n### Suffixed with brackets\n\nThis feature can be enabled by adding `plural_postfix_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n \n**Example:**\n\n```properties\nusers[one]=There is one user.\nusers[other]=There are $number users.\n```\n\n### Defined using ICU\n\nThis feature can enabled by adding `plural_icu` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```properties\nusers=There are {COUNT, plural, one {one user} other {# users}}.\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n## Forced escaping\n\nBy default, the output file doesn't use escaping sequences if not required. By adding `force_escaping` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can force more aggressive escaping for better compatibility. \n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":2982,"featured_icon":2983},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[2987],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":2988},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[2991],{"id":1566,"documentation_id":1566,"languages_code":812,"slug":2977,"title":2978,"content":2980,"meta_title":2978,"meta_description":2979,"excerpt":2979},[],{"id":2994,"status":8,"sort":2995,"created_on":1856,"modified_on":2901,"slug":2996,"title":2997,"excerpt":2998,"content":2999,"meta_title":2997,"meta_description":3000,"pinned":15,"main_image":7,"section":3001,"subsection":3004,"cta":3005,"faq":3006,"dictionary":3009,"translations":3010,"documentation_id":2994,"blog_articles":3012},82,"32150","qt-ts-format","File Format - Qt TS","Learn how to use Localazy CLI for app and software localization with translations in Qt's Linguist .TS files. ","Qt's Linguist .TS files are fully supported by Localazy.\n\n## id-based files\n\nBy default, Localazy prefer `message id` as the identifier and in such a situation, the `source` is not required.  \n\n```xml\n\u003C!DOCTYPE TS>\n  \u003CTS>\n    \u003Ccontext>\n      \u003Cmessage id=\"file_identifier\">\n        \u003Csource>\u003C\u002Fsource>\n        \u003Ctranslation>Translations of the given string\u003C\u002Ftranslation>\n    \u003C\u002Fmessage>\n  \u003C\u002Fcontext>\n\u003C\u002FTS>\n```\n\nBy default, in the output file, the `source` is kept empty, but you can include `include_source` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section to tell Localazy to output the source language translation.\n\nAlso, you can add `prefer_message_id` to prefer output of the `message id` even when the key is inherited from `source`. \n\n## source-based files\n\nIf the `message id` is not provided or if you specify `prefer_source_as_key` in **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, the content of `source` is used as the key instead.\n\n\n```xml\n\u003C!DOCTYPE TS>\n  \u003CTS>\n    \u003Ccontext>\n      \u003Cmessage>\n        \u003Csource>source string or identifier\u003C\u002Fsource>\n        \u003Ctranslation>Translations of the given string\u003C\u002Ftranslation>\n    \u003C\u002Fmessage>\n  \u003C\u002Fcontext>\n\u003C\u002FTS>\n```\n\nIn such a situation, it's not replaced with the current source language translation when generating the translated file. \n\n\n## Using the source translation\n\nThe common situation is that there is no file for the source language, and the source translation is instead provided in the translated files like this:\n\n```xml\n\u003C!DOCTYPE TS>\n  \u003CTS>\n    \u003Ccontext>\n      \u003Cmessage id=\"string_id\">\n        \u003Csource>Source language translation\u003C\u002Fsource>\n        \u003Ctranslation>Translations of the given string\u003C\u002Ftranslation>\n    \u003C\u002Fmessage>\n  \u003C\u002Fcontext>\n\u003C\u002FTS>\n```\n\nBy adding `source_is_content` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, you can tell Localazy, to use content from `source` as the source language translation. \n\n\n## ICU plurals\n\nThis feature can enabled by adding `plural_icu` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```xml\n\u003C!DOCTYPE TS>\n  \u003CTS>\n    \u003Ccontext>\n      \u003Cmessage id=\"icu_plural\">\n        \u003Csource>\u003C\u002Fsource>\n        \u003Ctranslation>There are {COUNT, plural, one {one user} other {# users}}.\u003C\u002Ftranslation>\n    \u003C\u002Fmessage>\n  \u003C\u002Fcontext>\n\u003C\u002FTS>\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n\n## HTML entities\n\nHTML entities are not allowed in TS files because they are not defined in the XML standard. Localazy can convert HTML entities to their Unicode representation when the file is imported.\n\nThis feature can be enabled by adding `decode_html_entities` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Skipping empty translations\n\nBy default, empty translations are imported as empty strings. If your format use empty translations for untranslated texts, add `skip_empty` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.  \n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n\n___CLI_LINKS___","Learn how to use Localazy CLI for app and software localization with translations in Qt's Linguist .TS  files. ",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3002,"featured_icon":3003},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[3007],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":3008},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[3011],{"id":2994,"documentation_id":2994,"languages_code":812,"slug":2996,"title":2997,"content":2999,"meta_title":2997,"meta_description":3000,"excerpt":2998},[],{"id":327,"status":8,"sort":3014,"created_on":1856,"modified_on":2740,"slug":3015,"title":3016,"excerpt":3017,"content":3018,"meta_title":3016,"meta_description":3017,"pinned":15,"main_image":7,"section":3019,"subsection":3022,"cta":3023,"faq":3024,"dictionary":3027,"translations":3028,"documentation_id":327,"blog_articles":3030},"32160","properties-format","File Format - Java Properties","Learn how to use Localazy CLI for app and software localization with translations in Java Properties files. ","Java Properties files are supported and with Localazy, it's possible to use also plurals and arrays for more comfortable and accurate translations.  \n\n## Encoding\n\nThe default encoding is **UTF-8** which is a new standard from Java 9. \n\nYou can switch to **ISO-8859-1 (Latin 1)** encoding by adding `latin1` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nIf you need BOM (byte order mark) to be exported in the output file, please add **add_bom** to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Arrays\n\nArrays are good but beware changing number of items to prevent mismatching translations. If your files contain incomplete arrays, don't use array features at all. \n\nUsing arrays in Java Properties is not a standard. However, Localazy can parse the suffixed variant shown below and present it to translators in a way that keeps items together and thus improves context and translation quality. \n\nThis feature can be enabled by adding `array_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n```properties\ndifficulty[0]=easy\ndifficulty[4]=normal\ndifficulty[7]=hard\ndifficulty[9]=extreme\n```\n\nThe code above will be processed as an array and additional metadata will be stored, so Localazy can restore the indexes correctly.\n\nAll valid indexes are processed where valid index is non-negative integer value.  \n\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages. \n\n```properties\n# English has only two plural forms:\nitems[one]=You have 1 item.\nitems[other]=You have %d items.\n  \n# Czech has three plural forms:\nitems[one]=Máte 1 položku.\nitems[few]=Máte %d položky.\nitems[other]=Máte %d položek.\n```\n\nLocalazy knows the rules for different languages and adapt its interface to assist translators to correctly translate all mandatory forms.\n\nYour app should be able to handle this. We are also working on SDK to help you with this task. \n\nAllowed plurals types are: **zero**, **one**, **two**, **few**, **many**, **other**. \n\n### Suffixed with camelCase\n\nThis feature can be enabled by adding `plural_postfix_cc` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\n**Example:**\n\n```properties\nusersOne=There is one user.\nusersOther=There are $number users.\n```\n\n### Suffixed with brackets\n\nThis feature can be enabled by adding `plural_postfix_br` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n \n**Example:**\n\n```properties\nusers[one]=There is one user.\nusers[other]=There are $number users.\n```\n\n### Defined using ICU\n\nThis feature can enabled by adding `plural_icu` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n```properties\nusers=There are {COUNT, plural, one {one user} other {# users}}.\n```\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn't be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n \nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n## Filtering untranslated strings\n\nBy default, when the output file is generated, Localazy uses texts from the source languages when the translation in the exported language is missing. \n\nThis approach is safeguarding you from missing keys that can lead to crashes in some solutions\u002Fframeworks. \n\nThis feature can be disable by adding `filter_untranslated` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section and reuploading your source language file. \n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3020,"featured_icon":3021},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[3025],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":3026},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[3029],{"id":327,"documentation_id":327,"languages_code":812,"slug":3015,"title":3016,"content":3018,"meta_title":3016,"meta_description":3017,"excerpt":3017},[],{"id":445,"status":8,"sort":3032,"created_on":1856,"modified_on":3033,"slug":3034,"title":3035,"excerpt":3036,"content":3037,"meta_title":3035,"meta_description":3036,"pinned":15,"main_image":7,"section":3038,"subsection":3041,"cta":3042,"faq":3043,"dictionary":3046,"translations":3047,"documentation_id":445,"blog_articles":3049},"32165","2024-07-16T15:14:45.000Z","json5-format","File Format - JSON5","Learn how to use Localazy CLI for app and software localization with translations in JSON5 files. ","Localazy comes with support for modern formats such as [JSON5](https:\u002F\u002Fjson5.org) for human-friendly localization. \n\n## Available features\n\n**[All features supported by Localazy for JSON](\u002Fdocs\u002Fcli\u002Fjson-format)** are available including plurals, arrays, multilingual files, etc. Only the support for `requirejs` is not available. \n\n## Context information\n\nIt's possible to use JSON5 comments. They are parsed and stored as a context information for translators. \n\n```json5\n{\n\n  \u002F\u002F Please keep translation short.\n  short_name: \"Short Name\",\n\n  \u002F*\n  Multi-line comments are allowed as well\n  as multi-line strings. \n  *\u002F\n  multiline_string: \"This string spans \\\nacross more lines.\"\n \n}\n```\n\nIt's also possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```json5\n{\n  category: {\n    my_key: \"This is a text of my key.\",\n    \"@@localazy:comment:my_key\": \"This is a comment for translators.\",\n    \"@@localazy:limit:my_key\": \"100\"\n  }\n}\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n\n## Output format\n\nThe output format is compatible with standard JSON files allowing to use our JSON5 support for human-friendly localization of software based on older JSON standard.\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3039,"featured_icon":3040},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[3044],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":3045},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[3048],{"id":445,"documentation_id":445,"languages_code":812,"slug":3034,"title":3035,"content":3037,"meta_title":3035,"meta_description":3036,"excerpt":3036},[],{"id":336,"status":8,"sort":3051,"created_on":1856,"modified_on":3033,"slug":3052,"title":3053,"excerpt":3054,"content":3055,"meta_title":3053,"meta_description":3054,"pinned":15,"main_image":7,"section":3056,"subsection":3059,"cta":3060,"faq":3061,"dictionary":3064,"translations":3065,"documentation_id":336,"blog_articles":3067},"32166","hjson-format","File Format - HJSON","Learn how to use Localazy CLI for app and software localization with translations in HJSON files. ","Localazy comes with support for modern formats such as [HJSON](https:\u002F\u002Fhjson.github.io) for human-friendly localization. \n\n## Available features\n\n**[All features supported by Localazy for JSON](\u002Fdocs\u002Fcli\u002Fjson-format)** are available including plurals, arrays, multilingual files, etc. Only the support for `requirejs` is not available.   \n\n## Context information\n\n```json5\n{\n  \n  \u002F\u002F It's possible to include comments in the HJSON file\n  \u002F\u002F but due to a limitation of the HJSON parser, they are \n  \u002F\u002F not used as context information for translators. \n\n}\n```\n\nIt's possible to specify context information (a comment for translators and character limit) using our own extension:\n\n```json5\n{\n  \"category\": {\n    \"my_key\": \"This is a text of my key.\",\n    \"@@localazy:comment:my_key\": \"This is a comment for translators.\",\n    \"@@localazy:limit:my_key\": \"100\"\n  }\n}\n```\n\n::: info\nPlease note that keys starting with `@@localazy` will not be exported to the output files. Do not overwrite your source files. \n:::\n\n\n## Output format\n\nBy default, output format is HJSON.\n\nYou can switch to the standard JSON by adding `output_json` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\nOutputting the standard JSON allows using our HJSON support for human-friendly localization of software based on older JSON standard.\n\n## Add BOM (for UTF encoding)\n\nIf you need BOM (byte order mark) to be exported in the output file, please add `add_bom` to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n___CLI_LINKS___",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3057,"featured_icon":3058},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[3062],{"id":66,"status":8,"title":1884,"content":1885,"slug":1886,"created_on":1887,"modified_on":1888,"owner":1855,"meta_title":7,"category":3063},{"id":59,"status":8,"created_on":1890,"sort":7,"slug":1891,"label":1892,"on_faq_index":17},[],[3066],{"id":336,"documentation_id":336,"languages_code":812,"slug":3052,"title":3053,"content":3055,"meta_title":3053,"meta_description":3054,"excerpt":3054},[],{"id":3069,"status":8,"sort":3070,"created_on":2950,"modified_on":2951,"slug":3071,"title":3072,"excerpt":3073,"content":3074,"meta_title":3072,"meta_description":3073,"pinned":15,"main_image":7,"section":3075,"subsection":3078,"cta":3079,"faq":3080,"dictionary":3083,"translations":3084,"documentation_id":3069,"blog_articles":3086},109,"32195","excel-format","File Format - Microsoft Excel","Learn how to use Localazy CLI for app and software localization with translations in Microsoft Excel (XLS, XLSX) files. ","With Localazy, you easily use Microsoft Excel files (both XLS and XLSX) to localize your mobile, web, or desktop apps as well as marketing materials, tags, social posts, documentation, etc. \n\n## Input format\n\nLocalazy automatically detects file type for old XLS (Microsoft Excel 2003 and below) and new XLSX (Microsoft Excel 2007+) and parses it accordingly. No extra configuration is necessary. The output file is generated in the same format as the input.\n\nThe expected format is as shown below. See **Columns** for details on how to configure multilingual support and the column order. \n\n| Key | Translation | Comment |\n| --- | --- | --- |\n| Key 1 | Translation | Comment for translator\n| Key 2 | Translation | |\n| Key 3 | Translation | |\n\nLocalazy extracts localizable assets but doesn't store information about formatting, number format, etc. It also doesn't calculate formulas - they are parsed as text only. Therefore, the output format (as described below) can be slightly different. \n\n**Only the first sheet is used.** Other sheets are ignored.\n\n### Header\n\nBy default, Localazy expects the first row to be a header. If your file doesn't have the header, you can notify Localazy that it shouldn't skip the first line by adding `no_header` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\nThe header is always required for multilingual files (see below) as it's used for determining the language.\n\n## Columns\n\n### Multilingual files\n\nAdd `multilingual` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable support for multilingual files. In multilingual files, instead of having one file per language, each language has its own column. \n\n### Defining columns\n\nYou can define how to read the file - which column is the key, which one is the comment for the translator, and where to look for translations. \n\nTo define the configuration, add `columns=key,content` to the `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section. These types can be used for defining the configuration:\n\n| Type | Description |\n| --- | --- |\n| `key` | Mark the column from which to read the key. _Must be defined and can be used only once_. |\n| `key:1` | Mark the column as the first part of the key if the key spans across two columns. |\n| `key:2` | Mark the column as the second part of the key if the key spans across two columns. |\n| `comment` | Mark the column from which to read the comment for the translator. _Optional and can be used only once if defined_. |\n| `-` | Mark the column to skip. _Optional, can be used multiple times_. |\n| `content` | Mark the column (for single-language files) or more columns (for multilingual files) from which to read translations. _Must be defined and can be used only once_. |\n\nThe default configuration is `columns=key,content`.\n\nFor single-language files, the columns are defined from left to right. For multilingual files, the columns are also defined from the left to right, but `content` is spread across as many columns as possible.\n\n#### Single-language file example\n\nLet's suppose that the input file has this format:\n\n| key | comment | line | english | czech |\n| --- | --- | --- | --- | --- |\n| Key 1 | Comment for Key 1 | 105 | English for Key 1 | Czech for Key 1 |\n\nWith configuration `columns=key,comment,-,content`, the first column is used as the key, the second one as a comment for the translator, the third one is skipped, the fourth is the actual translation and the rest of the file is ignored. \n\n**The language for the translation is determined from the configuration in CLI and not from what is in the header!**\n\n#### Multilingual file example\n\nLet's suppose that the input file has this format:\n\n| key | line | en | cs | fr | comment | reference |\n| --- | --- | --- | --- | --- | --- | --- |\n| Key 1 | 105 | Text EN | Text CS | Text FR | Comment 1 | ref #1 |\n\nTo read this file correctly, it's necessary to use configuration `columns=key,-,content,comment,-`. \n\nThe first column is used as the key, the second one is skipped. The last column is skipped and the sixth column is used as the comment for the translator. All columns in between are processed as translations in English, Czech, and French. \n\n**The language for the translation is determined from the file header and not from the configuration of CLI!**\n\n#### Multi-column key\n\nLet's suppose that the input file has this format:\n\n| key1 | key2 | content |\n| --- | --- | --- |\n| dashboard | title | Welcome! |\n| dashboard | text | Welcome to our awesome app. |\n\nTo read this file correctly, it's necessary to use configuration `columns=key:1,key:2,content`. \n\nThe first two columns are used as the composite key, the third column is used as the content. \n\n### Using key as the source translation\n\nIf the key is also the source language translation, it’s possible to enable support for this format by adding `source_is_key` to `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n**Example file:**\n\n| en | cs |\n| --- | --- |\n| Hello world | Ahoj světe |\n\nWith `source_is_key` and configuration `columns=key,content`, the first column `en` is parsed both as key and as the source language translation.\n\n## Arrays\n\nAdd `array_br` to `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable parsing of the following format as an array.\n\n| key | translation |\n| --- | --- |\n| key[0] | Item 1 |\n| key[1] | Item 2 |\n| key[2] | Item 3 |\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages (see below in **output format**).\n\nLocalazy knows the rules for different languages and adapts its interface to assist translators to correctly translate all mandatory forms.\n\nAllowed plurals types are:  **zero**,  **one**,  **two**,  **few**,  **many**,  **other**.\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to  **features**  in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference)  section:\n\n-   `plural_postfix_sd`  for single dot variant.\n-   `plural_postfix_dd`  for colon variant.\n-   `plural_postfix_us`  for underscore variant.\n-   `plural_postfix_cc`  for camelCase variant.\n-   `plural_postfix_br`  for [brackets] variant.\n\n**Examples:**\n\n| Key | Translation |\n| --- | --- |\n| single_dot.one | There is one user. |\n| single_dot.other | There are $number users. |\n| colon:one | There is one user. |\n| colon:other | There are $number users. |\n| underscore_one | There is one user. |\n| underscore_other | There are $number users. |\n| camelCaseOne | There is one user. |\n| camelCaseOther | There are $number users. |\n| brackets[one] | There is one user. |\n| brackets[other] | There are $number users. |\n\n### Defined using ICU\n\nEnabled by  `plural_icu`  in  **features**  in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference)  section.\n\n| Key | Translation |\n| --- | --- |\n| users | There are {COUNT, plural, one {one user} other {# users}}. |\n\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn’t be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n\nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n\n## Output format\n\nAs Localazy extracts the localizable assets from the file without additional data such as formatting, column order, etc., the output file is always generated in the following format:\n\n### Single-language files\n\n| key | xx |\n| --- | --- |\n| Key1 | translation in XX |\n| Key2 | translation in XX |\n\nThe header row is omitted if the input format didn't contain the header. \n\n\n### Multilingual files\n\n| key | en | fr | pl |\n| --- | --- | --- | --- |\n| Row1 | EN translation | FR translation | PL translation |\n| Row2 | EN translation | FR translation | PL translation |\n\n### Locale format\n\nYou can change the locale format in the header by adding `lang_format=xx` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xx` is one of:\n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nFor example, if you add `lang_format=locale_name`, the output file will be like:\n\n| key | English | French | Polish |\n| --- | --- | --- | --- |\n| Row1 | EN translation | FR translation | PL translation |\n| Row2 | EN translation | FR translation | PL translation |\n\n### Plurals\n\nPlural forms for languages that don't support them are kept empty like in the example below. \n\n| key | English | Czech |\n| --- | --- | --- |\n| row[one] | One user | Jeden uživatel |\n| row[few] |  | {count} uživatelé |\n| row[other] | {count} users | {count} uživatelů |",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3076,"featured_icon":3077},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[3081],{"id":2963,"status":8,"title":2964,"content":2965,"slug":2966,"created_on":2111,"modified_on":2967,"owner":1855,"meta_title":2968,"category":3082},{"id":441,"status":8,"created_on":1890,"sort":7,"slug":169,"label":165,"on_faq_index":15},[],[3085],{"id":3069,"documentation_id":3069,"languages_code":812,"slug":3071,"title":3072,"content":3074,"meta_title":3072,"meta_description":3073,"excerpt":3073},[],{"id":3088,"status":8,"sort":3089,"created_on":2950,"modified_on":2951,"slug":3090,"title":3091,"excerpt":3092,"content":3093,"meta_title":3091,"meta_description":3092,"pinned":15,"main_image":7,"section":3094,"subsection":3097,"cta":3098,"faq":3099,"dictionary":3102,"translations":3103,"documentation_id":3088,"blog_articles":3105},110,"32197","ods-format","File Format - OpenOffice","Learn how to use Localazy CLI for app and software localization with translations in OpenOffice\u002FLibreOffice (ODS) files. ","With Localazy, you easily use OpenOffice\u002FLibreOffice Spreadsheets (ODS) to localize your mobile, web, or desktop apps as well as marketing materials, tags, social posts, documentation, etc. \n\n## Input format\n\nAny OpenDocument Spreadsheet (OpenOffice\u002FLibreOffice) is supported.\n\nThe expected format is as shown below. See **Columns** for details on how to configure multilingual support and the column order. \n\n| Key | Translation | Comment |\n| --- | --- | --- |\n| Key 1 | Translation | Comment for translator\n| Key 2 | Translation | |\n| Key 3 | Translation | |\n\nLocalazy extracts localizable assets but doesn't store information about formatting, number format, etc. It also doesn't calculate formulas - they are parsed as text only. Therefore, the output format (as described below) can be slightly different. \n\n**Only the first sheet is used.** Other sheets are ignored.\n\n### Header\n\nBy default, Localazy expects the first row to be a header. If your file doesn't have the header, you can notify Localazy that it shouldn't skip the first line by adding `no_header` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section. \n\nThe header is always required for multilingual files (see below) as it's used for determining the language.\n\n## Columns\n\n### Multilingual files\n\nAdd `multilingual` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable support for multilingual files. In multilingual files, instead of having one file per language, each language has its own column. \n\n### Defining columns\n\nYou can define how to read the file - which column is the key, which one is the comment for the translator, and where to look for translations. \n\nTo define the configuration, add `columns=key,content` to the `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section. These types can be used for defining the configuration:\n\n| Type | Description |\n| --- | --- |\n| `key` | Mark the column from which to read the key. _Must be defined and can be used only once_. |\n| `key:1` | Mark the column as the first part of the key if the key spans across two columns. |\n| `key:2` | Mark the column as the second part of the key if the key spans across two columns. |\n| `comment` | Mark the column from which to read the comment for the translator. _Optional and can be used only once if defined_. |\n| `-` | Mark the column to skip. _Optional, can be used multiple times_. |\n| `content` | Mark the column (for single-language files) or more columns (for multilingual files) from which to read translations. _Must be defined and can be used only once_. |\n\nThe default configuration is `columns=key,content`.\n\nFor single-language files, the columns are defined from left to right. For multilingual files, the columns are also defined from the left to right, but `content` is spread across as many columns as possible.\n\n#### Single-language file example\n\nLet's suppose that the input file has this format:\n\n| key | comment | line | english | czech |\n| --- | --- | --- | --- | --- |\n| Key 1 | Comment for Key 1 | 105 | English for Key 1 | Czech for Key 1 |\n\nWith configuration `columns=key,comment,-,content`, the first column is used as the key, the second one as a comment for the translator, the third one is skipped, the fourth is the actual translation and the rest of the file is ignored. \n\n**The language for the translation is determined from the configuration in CLI and not from what is in the header!**\n\n#### Multilingual file example\n\nLet's suppose that the input file has this format:\n\n| key | line | en | cs | fr | comment | reference |\n| --- | --- | --- | --- | --- | --- | --- |\n| Key 1 | 105 | Text EN | Text CS | Text FR | Comment 1 | ref #1 |\n\nTo read this file correctly, it's necessary to use configuration `columns=key,-,content,comment,-`. \n\nThe first column is used as the key, the second one is skipped. The last column is skipped and the sixth column is used as the comment for the translator. All columns in between are processed as translations in English, Czech, and French. \n\n**The language for the translation is determined from the file header and not from the configuration of CLI!**\n\n#### Multi-column key\n\nLet's suppose that the input file has this format:\n\n| key1 | key2 | content |\n| --- | --- | --- |\n| dashboard | title | Welcome! |\n| dashboard | text | Welcome to our awesome app. |\n\nTo read this file correctly, it's necessary to use configuration `columns=key:1,key:2,content`. \n\nThe first two columns are used as the composite key, the third column is used as the content. \n\n### Using key as the source translation\n\nIf the key is also the source language translation, it’s possible to enable support for this format by adding `source_is_key` to `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n**Example file:**\n\n| en | cs |\n| --- | --- |\n| Hello world | Ahoj světe |\n\nWith `source_is_key` and configuration `columns=key,content`, the first column `en` is parsed both as key and as the source language translation.\n\n## Arrays\n\nAdd `array_br` to `features` in the [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section to enable parsing of the following format as an array.\n\n| key | translation |\n| --- | --- |\n| key[0] | Item 1 |\n| key[1] | Item 2 |\n| key[2] | Item 3 |\n\n## Plurals\n\nBeware that plurals may lead to different output for translated files due to how plurals are handled in different languages (see below in **output format**).\n\nLocalazy knows the rules for different languages and adapts its interface to assist translators to correctly translate all mandatory forms.\n\nAllowed plurals types are:  **zero**,  **one**,  **two**,  **few**,  **many**,  **other**.\n\n### Defined by suffix\n\nSeveral variants are available, and you can enable any of them and even combine them together. Localazy remembers how the plurals are formatted in the input file and keeps the same format for the translated files.\n\nAdd desired variants below to  **features**  in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference)  section:\n\n-   `plural_postfix_sd`  for single dot variant.\n-   `plural_postfix_dd`  for colon variant.\n-   `plural_postfix_us`  for underscore variant.\n-   `plural_postfix_cc`  for camelCase variant.\n-   `plural_postfix_br`  for [brackets] variant.\n\n**Examples:**\n\n| Key | Translation |\n| --- | --- |\n| single_dot[one] | There is one user. |\n| single_dot[other] | There are $number users. |\n| colon:one | There is one user. |\n| colon:other | There are $number users. |\n| underscore_one | There is one user. |\n| underscore_other | There are $number users. |\n| camelCaseOne | There is one user. |\n| camelCaseOther | There are $number users. |\n| brackets[one] | There is one user. |\n| brackets[other] | There are $number users. |\n\n### Defined using ICU\n\nEnabled by  `plural_icu`  in  **features**  in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference)  section.\n\n| Key | Translation |\n| --- | --- |\n| users | There are {COUNT, plural, one {one user} other {# users}}. |\n\n\nOnly one ICU plural can be used in the string as otherwise, it wouldn’t be possible to convert it to a specific Localazy plural structure. If more than two ICU plurals are contained, the string is kept in the original form.\n\nAllowed plurals types are: zero (=0), one (=1), two (=2), few, many, other.\n\nOther ICU types like gender, number, etc. can be used but will not be converted and will be kept in string in the original form.\n\n\n## Output format\n\nAs Localazy extracts the localizable assets from the file without additional data such as formatting, column order, etc., the output file is always generated in the following format:\n\n### Single-language files\n\n| key | xx |\n| --- | --- |\n| Key1 | translation in XX |\n| Key2 | translation in XX |\n\nThe header row is omitted if the input format didn't contain the header. \n\n\n### Multilingual files\n\n| key | en | fr | pl |\n| --- | --- | --- | --- |\n| Row1 | EN translation | FR translation | PL translation |\n| Row2 | EN translation | FR translation | PL translation |\n\n### Locale format\n\nYou can change the locale format in the header by adding `lang_format=xx` to `features` in the  [upload](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fupload-reference) section where `xx` is one of:\n\n* **ll-rr#scrp**\n* **ll-rr-scrp**\n* **ll-scrp-rr**\n* **ll-scrp_rr**\n* **ll_rr_scrp**\n* **ll_scrp_rr**\n* **ll+rr+scrp**\n* **ll+scrp+rr**\n* **locale_name**\n* **bcp**\n* **android_noscript**\n* **android**\n\nFor example, if you add `lang_format=locale_name`, the output file will be like:\n\n| key | English | French | Polish |\n| --- | --- | --- | --- |\n| Row1 | EN translation | FR translation | PL translation |\n| Row2 | EN translation | FR translation | PL translation |\n\n### Plurals\n\nPlural forms for languages that don't support them are kept empty like in the example below. \n\n| key | English | Czech |\n| --- | --- | --- |\n| row[one] | One user | Jeden uživatel |\n| row[few] |  | {count} uživatelé |\n| row[other] | {count} users | {count} uživatelů |",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3095,"featured_icon":3096},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[3100],{"id":2963,"status":8,"title":2964,"content":2965,"slug":2966,"created_on":2111,"modified_on":2967,"owner":1855,"meta_title":2968,"category":3101},{"id":441,"status":8,"created_on":1890,"sort":7,"slug":169,"label":165,"on_faq_index":15},[],[3104],{"id":3088,"documentation_id":3088,"languages_code":812,"slug":3090,"title":3091,"content":3093,"meta_title":3091,"meta_description":3092,"excerpt":3092},[],{"id":1502,"status":8,"sort":3107,"created_on":2950,"modified_on":3108,"slug":3109,"title":3110,"excerpt":3111,"content":3112,"meta_title":3110,"meta_description":3111,"pinned":15,"main_image":7,"section":3113,"subsection":3116,"cta":3117,"faq":3118,"dictionary":3119,"translations":3120,"documentation_id":1502,"blog_articles":3122},"32199","2025-02-17T14:49:40.000Z","srt-format","File Format - SRT Subtitles","Translate SRT (SubRip Text) subtitles with Localazy.","Upload SRT (SubRip Text) files with subtitles to Localazy and manage your translations easily. \n\n## Format\n\nThe standard SubRip (SubRip Text) files in the format shown below are supported.\n\n```\n1\n00:02:16,612 --> 00:02:19,376\nSenator, we're making\nour final approach into Coruscant.\n\n2\n00:02:19,482 --> 00:02:21,609\nVery good, Lieutenant.\n\n3\n00:03:13,336 --> 00:03:15,167\nWe made it.\n\n4\n00:03:18,608 --> 00:03:20,371\nI guess I was wrong.\n\n5\n00:03:20,476 --> 00:03:22,671\nThere was no danger at all.\n```\n\n## Encoding\n\nYou can force encoding for the input\u002Foutput files by adding `encoding=XXX` to **features** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section, where `XXX` can be:\n\n- win-1252\n- iso-8859-1\n- utf8 \n- utf16\n- utf16le\n- utf16be\n- ansi\n\nBy default, Localazy tries to autodetect the character encoding. \n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3114,"featured_icon":3115},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[3121],{"id":1502,"documentation_id":1502,"languages_code":812,"slug":3109,"title":3110,"content":3112,"meta_title":3110,"meta_description":3111,"excerpt":3111},[],{"id":3124,"status":8,"sort":3125,"created_on":1856,"modified_on":3126,"slug":3127,"title":3128,"excerpt":3129,"content":3130,"meta_title":3128,"meta_description":3129,"pinned":15,"main_image":7,"section":3131,"subsection":3134,"cta":3135,"faq":3136,"dictionary":3137,"translations":3138,"documentation_id":3124,"blog_articles":3140},105,"32200","2025-02-17T14:49:38.000Z","plain-text-format","File Format - Plain Texts","Localize text & markdown files, app store description, marketing materials, and more with Localazy.","You can manage plain text files with Localazy which is useful for:\n\n- App Store description\n- Play Store description\n- marketing texts\n- release notes\n- README files\n- manuals and documentation\n- etc.\n\n## Encoding\n\nThe default encoding is **auto**. You can change it by including **encoding={encoding}** in the [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section. Available options are: `utf8`, `utf16`, `utf16le`, `utf16be`, `ansi`.\n\nIf you need BOM (byte order mark) to be exported in the output file, please add **add_bom** to features in the  [upload](\u002Fdocs\u002Fcli\u002Fupload-reference) section.\n\n## Storage format\n\nIn Localazy, the file is stored as a file with a single key `content`. \n\n## PRO Tip\n\nWith support for plain text files in Localazy, you can use [fastlane](https:\u002F\u002Ffastlane.tools) to automate the deployment of the localized version of App Store descriptions. \n",{"id":12,"status":8,"sort":5,"created_on":1864,"slug":411,"name":643,"subtitle":1865,"meta_title":1866,"meta_description":1867,"hidden":15,"icon":3132,"featured_icon":3133},{"id":648},{"id":651},{"id":147,"status":8,"sort":12,"created_on":1872,"name":1218},{"id":5,"status":370,"created_on":1875,"modified_on":1876,"icon":1877,"header":1878,"description":1879,"button_label":1878,"link":1880},[],[],[3139],{"id":3124,"documentation_id":3124,"languages_code":812,"slug":3127,"title":3128,"content":3130,"meta_title":3128,"meta_description":3129,"excerpt":3129},[],[],[3143,3164,3184],{"id":3144,"owner":3145,"created_by":7,"sort":7,"title":3150,"slug":3151,"modified_on":764,"created_on":3152,"pinned":15,"badge":7,"priority":1824,"main_image":3153,"status":8,"tags":3154,"dictionary":3163,"reading_time":1838,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"64347aaa047091000193b03f",{"id":3146,"first_name":3147,"last_name":764,"slug":3148,"avatar":3149},"61dc4e87df4bcb00010bd508","Mary Okosun","mary-okosun","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fokosun.png","How to use Localazy CLI to streamline your localization workflow","how-to-use-localazy-cli-to-streamline-your-localization-workflow","2023-05-16T17:18:35.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F05\u002Fultimate-localazy-CLI-guide.png",[3155,3157,3160],{"id":319,"created_on":3156,"status":8,"label":643,"slug":411,"on_index_page":15},"2026-05-28 17:55:51",{"id":319,"created_on":3156,"status":8,"label":3158,"slug":3159,"on_index_page":15},"Continuous Localization","continuous-localization",{"id":319,"created_on":3156,"status":8,"label":3161,"slug":3162,"on_index_page":15},"Guide","guide",[],{"id":3165,"owner":3166,"created_by":7,"sort":7,"title":3167,"slug":3168,"modified_on":764,"created_on":3169,"pinned":15,"badge":7,"priority":1824,"main_image":3170,"status":8,"tags":3171,"dictionary":3183,"reading_time":1838,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"64de83bc047091000193e4b7",{"id":3146,"first_name":3147,"last_name":764,"slug":3148,"avatar":3149},"How to automate translations when working with evolving content to save time? ⏰","how-to-automate-translations-when-working-with-evolving-content-to-save-time","2023-11-20T08:00:00.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F09\u002FHow-to-automate-translations-2.png",[3172,3175,3176,3180],{"id":319,"created_on":3156,"status":8,"label":3173,"slug":3174,"on_index_page":15},"Automated Localization","automated-localization",{"id":319,"created_on":3156,"status":8,"label":643,"slug":411,"on_index_page":15},{"id":3177,"created_on":3156,"status":8,"label":3178,"slug":3179,"on_index_page":15},6556628,"Workflows","workflows",{"id":319,"created_on":3156,"status":8,"label":3181,"slug":3182,"on_index_page":15},"HowTo","howto",[],{"id":3185,"owner":3186,"created_by":7,"sort":7,"title":3191,"slug":3192,"modified_on":764,"created_on":3193,"pinned":15,"badge":7,"priority":1824,"main_image":3194,"status":8,"tags":3195,"dictionary":3202,"reading_time":1838,"excerpt":-1,"og_title":764,"og_description":764,"og_image":764},"649de936047091000193d3a3",{"id":3187,"first_name":3188,"last_name":764,"slug":3189,"avatar":3190},"619d2332df4bcb00010bc032","Moyinoluwa Adenuga","moyinoluwa-adenuga","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fadenuga.png","How to integrate Localazy into Vercel builds for frontend applications","how-to-integrate-localazy-into-vercel-builds-for-frontend-applications","2023-07-12T11:36:54.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F06\u002FVercel.png",[3196,3199,3200,3201],{"id":269,"created_on":3156,"status":8,"label":3197,"slug":3198,"on_index_page":15},"Vercel","vercel",{"id":319,"created_on":3156,"status":8,"label":3181,"slug":3182,"on_index_page":15},{"id":319,"created_on":3156,"status":8,"label":643,"slug":411,"on_index_page":15},{"id":319,"created_on":3156,"status":8,"label":480,"slug":479,"on_index_page":15},[],[3204],["Reactive",1883]]