[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-settings":3,"main-navigation":153,"footer-homepage":836,"footer-integrations":903,"blog-post-nav-[USE LATEST FEATURED]":1814,"blog-post-nav-nav":1839,"blog-automated-localization-laravel-projects-localazy-github-actions":1857},{"id":4,"status":5,"security_section_title":6,"loved_section_title":7,"columns":8,"social_links":113,"policy_links":143},1,"published","Secured & trusted","Loved by users",[9,28,48,74,78],{"id":4,"status":5,"sort":10,"title":11,"column_key":12,"links":13},null,"Localazy","connect",[14,18,23],{"id":15,"status":5,"sort":4,"title":16,"url":17},11,"Book a demo","___LOCALAZY_MEETING_URL___",{"id":19,"status":5,"sort":20,"title":21,"url":22},12,2,"Contact","\u002Fcontact",{"id":24,"status":5,"sort":25,"title":26,"url":27},21,3,"About us","\u002Fabout-us",{"id":20,"status":5,"sort":10,"title":29,"column_key":30,"links":31},"Programs","programs",[32,36,40,44],{"id":4,"status":5,"sort":33,"title":34,"url":35},4,"Partner Program","\u002Fpartnership",{"id":20,"status":5,"sort":37,"title":38,"url":39},5,"Ambassador Program","\u002Fambassador",{"id":25,"status":5,"sort":41,"title":42,"url":43},6,"Startup Program","\u002Ffor\u002Fstartups",{"id":33,"status":5,"sort":45,"title":46,"url":47},7,"Nonprofits","\u002Ffor\u002Fnonprofit",{"id":25,"status":5,"sort":10,"title":49,"column_key":50,"links":51},"Use Cases","use_cases",[52,56,60,64,67,70],{"id":37,"status":5,"sort":53,"title":54,"url":55},8,"Software Localization","\u002Fterm\u002Fsoftware-localization",{"id":41,"status":5,"sort":57,"title":58,"url":59},9,"Machine Translation Services","\u002Ffeatures\u002Fmachine-translation",{"id":45,"status":5,"sort":61,"title":62,"url":63},10,"Translation API","\u002Ffeatures\u002Ftranslation-api",{"id":53,"status":5,"sort":15,"title":65,"url":66},"Crowdsourced Translations","\u002Ffeatures\u002Fshare-tm",{"id":57,"status":5,"sort":19,"title":68,"url":69},"Figma i18n & localization","\u002Ffeatures\u002Ffigma-localization-plugin",{"id":61,"status":5,"sort":71,"title":72,"url":73},13,"Translation as a Service","\u002Fterm\u002Ftranslation-service",{"id":33,"status":5,"sort":10,"title":75,"column_key":76,"links":77},"Integrations","integrations",[],{"id":37,"status":5,"sort":10,"title":79,"column_key":80,"links":81},"Resources","resources",[82,86,90,94,98,102,106,110],{"id":71,"status":5,"sort":83,"title":84,"url":85},14,"Documentation","\u002Fdocs",{"id":83,"status":5,"sort":87,"title":88,"url":89},15,"Dictionary","\u002Fdictionary",{"id":87,"status":5,"sort":91,"title":92,"url":93},16,"Case Studies","\u002Fcase-study",{"id":91,"status":5,"sort":95,"title":96,"url":97},17,"Discussion forum","___DISCUSS_URL___",{"id":95,"status":5,"sort":99,"title":100,"url":101},18,"Localization Blog","\u002Fblog",{"id":99,"status":5,"sort":103,"title":104,"url":105},19,"FAQ","\u002Ffaq",{"id":103,"status":5,"sort":107,"title":108,"url":109},20,"Pricing","\u002Fpricing",{"id":107,"status":5,"sort":24,"title":111,"url":112},"Brand assets","https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1tZqsZHBlGelz7A2FwTsiwrs4j3sd9HTk",[114,119,124,129,134,139],{"id":4,"status":5,"sort":10,"platform":115,"icon":116,"url":117,"label":118},"feed","rss","\u002Ffeed.xml","Localazy RSS Feed",{"id":20,"status":5,"sort":10,"platform":120,"icon":121,"url":122,"label":123},"facebook","fb-logo","https:\u002F\u002Fwww.facebook.com\u002Flocalazy\u002F","Localazy facebook",{"id":25,"status":5,"sort":10,"platform":125,"icon":126,"url":127,"label":128},"github","github-logo","https:\u002F\u002Fgithub.com\u002Flocalazy","Localazy GitHub",{"id":33,"status":5,"sort":10,"platform":130,"icon":131,"url":132,"label":133},"x","x-twitter","https:\u002F\u002Fx.com\u002Flocalazy","Localazy X",{"id":37,"status":5,"sort":10,"platform":135,"icon":136,"url":137,"label":138},"linkedin","linkedin-logo","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002F37836599\u002F","Localazy LinkedIn",{"id":41,"status":5,"sort":10,"platform":140,"icon":141,"url":97,"label":142},"discourse","discourse-logo","Localazy Discourse",[144,147,150],{"id":4,"status":5,"sort":10,"title":145,"url":146,"action":10},"Privacy policy","\u002Fprivacy-policy",{"id":20,"status":5,"sort":10,"title":148,"url":149,"action":10},"Terms & Conditions","\u002Fterms-and-conditions",{"id":25,"status":5,"sort":10,"title":151,"url":10,"action":152},"Cookies","cookie-consent",[154,347,580,708,831,833],{"id":20,"name":155,"url":10,"url_text":10,"status":5,"groups":156},"Solutions",[157,168,239,274],{"navigation_items_group_id":158},{"id":25,"sort":37,"status":5,"name":159,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":162,"show_all_url":10,"represent_as_tile":160,"items":163},"Featured Article",false,"top",true,[164],{"collection":165,"item":166},"blog_post_navigation_item_type",{"id":33,"status":5,"sort":10,"show_author_img":162,"blog_post_tag":167,"description":10},"nav",{"navigation_items_group_id":169},{"id":37,"sort":4,"status":5,"name":170,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":171,"represent_as_tile":162,"items":172},"Your Role","\u002Froles",[173,185,195,205,216,228],{"collection":174,"item":175},"relation_navigation_item_type",{"id":4,"status":5,"sort":10,"name":176,"item":177},"CMO",[178],{"collection":179,"item":180},"personas",{"id":4,"status":5,"sort":10,"slug":181,"icon":182},"chief-marketing-officers",{"id":183,"title":184},"526097d8-176f-48e5-83d3-2fc4d77061f9","La Mail Bulk",{"collection":174,"item":186},{"id":25,"status":5,"sort":10,"name":187,"item":188},"CTO",[189],{"collection":179,"item":190},{"id":33,"status":5,"sort":10,"slug":191,"icon":192},"chief-technical-officers",{"id":193,"title":194},"f808fdf0-c78b-4294-ba59-fe25f46fe825","La Mechanic",{"collection":174,"item":196},{"id":107,"status":5,"sort":10,"name":197,"item":198},"Product Manager",[199],{"collection":179,"item":200},{"id":99,"status":5,"sort":10,"slug":201,"icon":202},"product-managers",{"id":203,"title":204},"ea39586a-21fc-4b34-ba87-496028e5198f","La Worker",{"collection":174,"item":206},{"id":207,"status":5,"sort":10,"name":208,"item":209},37,"Translator",[210],{"collection":179,"item":211},{"id":107,"status":5,"sort":10,"slug":212,"icon":213},"professional-translators",{"id":214,"title":215},"07945171-d51d-4ca8-96c0-21cde9db258f","La Chat",{"collection":174,"item":217},{"id":218,"status":5,"sort":10,"name":219,"item":220},38,"Developer",[221],{"collection":179,"item":222},{"id":223,"status":5,"sort":10,"slug":224,"icon":225},30,"software-developers",{"id":226,"title":227},"1806e46d-c551-4845-bf42-4407344d229e","La Terminal",{"collection":174,"item":229},{"id":230,"status":5,"sort":10,"name":231,"item":232},27,"Localization Manager",[233],{"collection":179,"item":234},{"id":41,"status":5,"sort":10,"slug":235,"icon":236},"localization-managers",{"id":237,"title":238},"dac69bd1-bf5d-41d0-87d4-dd13e314698a","La Language",{"navigation_items_group_id":240},{"id":57,"sort":25,"status":5,"name":241,"render_show_all_url":160,"show_all_url_position":242,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":243},"Use cases","bottom",[244,250,255,260,264,269],{"collection":245,"item":246},"simple_link_navigation_item_type",{"id":247,"status":5,"sort":10,"url":248,"url_text":249,"show_favorite_icon":160},24,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fsoftware-localization","Software localization",{"collection":245,"item":251},{"id":252,"status":5,"sort":10,"url":253,"url_text":254,"show_favorite_icon":160},26,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fmobile-app-localization","Mobile app localization",{"collection":245,"item":256},{"id":257,"status":5,"sort":10,"url":258,"url_text":259,"show_favorite_icon":160},25,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fwebsite-localization","Website localization",{"collection":245,"item":261},{"id":230,"status":5,"sort":10,"url":262,"url_text":263,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fdesign-localization","Design localization",{"collection":245,"item":265},{"id":266,"status":5,"sort":10,"url":267,"url_text":268,"show_favorite_icon":160},28,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fgame-localization","Game localization",{"collection":245,"item":270},{"id":271,"status":5,"sort":10,"url":272,"url_text":273,"show_favorite_icon":160},29,"https:\u002F\u002Flocalazy.com\u002Fuse-cases\u002Fhelp-and-docs-localization","Help & docs localization",{"navigation_items_group_id":275},{"id":53,"sort":20,"status":5,"name":276,"render_show_all_url":160,"show_all_url_position":242,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":277},"Industry",[278,289,300,310,320,329,340],{"collection":174,"item":279},{"id":280,"status":5,"sort":10,"name":281,"item":282},23,"Digital Agencies",[283],{"collection":179,"item":284},{"id":45,"status":5,"sort":10,"slug":285,"icon":286},"digital-agencies",{"id":287,"title":288},"547f5619-b21d-4b29-86f1-8b2200313cde","La Digi Agency",{"collection":174,"item":290},{"id":291,"status":5,"sort":10,"name":292,"item":293},39,"Startups & SaaS",[294],{"collection":179,"item":295},{"id":20,"status":5,"sort":10,"slug":296,"icon":297},"startups",{"id":298,"title":299},"da1516e2-4afc-40a2-bcbf-a8161e2d610d","La Saa S",{"collection":174,"item":301},{"id":20,"status":5,"sort":10,"name":302,"item":303},"E-commerce",[304],{"collection":179,"item":305},{"id":37,"status":5,"sort":10,"slug":306,"icon":307},"e-commerce",{"id":308,"title":309},"a3d09cd2-054f-4bb5-a0a2-d3d207db65df","La Ecommerce",{"collection":174,"item":311},{"id":103,"status":5,"sort":10,"name":312,"item":313},"FinTech Platforms",[314],{"collection":179,"item":315},{"id":230,"status":5,"sort":10,"slug":316,"icon":317},"fintech",{"id":318,"title":319},"147339ba-07d1-4e5e-baad-23d27e60c919","La Money",{"collection":174,"item":321},{"id":247,"status":5,"sort":10,"name":322,"item":323},"Translation Agencies",[324],{"collection":179,"item":325},{"id":247,"status":5,"sort":10,"slug":326,"icon":327},"translation-agencies",{"id":328,"title":238},"15d6fe33-2af8-4d6e-933d-5caa64394511",{"collection":174,"item":330},{"id":331,"status":5,"sort":10,"name":332,"item":333},22,"Travel & Tourism",[334],{"collection":179,"item":335},{"id":25,"status":5,"sort":10,"slug":336,"icon":337},"tourism",{"id":338,"title":339},"23a785e8-0ae5-4c4b-8452-aab1b58182a6","La Travel",{"collection":174,"item":341},{"id":257,"status":5,"sort":10,"name":342,"item":343},"Nonprofit Causes",[344],{"collection":179,"item":345},{"id":266,"status":5,"sort":10,"slug":346,"icon":10},"nonprofit",{"id":37,"name":348,"url":10,"url_text":10,"status":5,"groups":349},"Features",[350,417,474,523],{"navigation_items_group_id":351},{"id":15,"sort":41,"status":5,"name":352,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":353},"Localization",[354,363,372,380,388,392,400,409],{"collection":174,"item":355},{"id":356,"status":5,"sort":10,"name":357,"item":358},44,"Localization services",[359],{"collection":360,"item":361},"products",{"id":57,"status":5,"slug":362},"continuous-localization-team",{"collection":174,"item":364},{"id":365,"status":5,"sort":10,"name":366,"item":367},45,"Translation management",[368],{"collection":369,"item":370},"term_landing_page",{"id":271,"status":5,"slug":371},"translation-management-system",{"collection":174,"item":373},{"id":374,"status":5,"sort":10,"name":375,"item":376},46,"Context Screenshots",[377],{"collection":360,"item":378},{"id":71,"status":5,"slug":379},"context-screenshots-ocr",{"collection":174,"item":381},{"id":382,"status":5,"sort":10,"name":383,"item":384},47,"Translation Glossary",[385],{"collection":360,"item":386},{"id":95,"status":5,"slug":387},"glossary",{"collection":245,"item":389},{"id":33,"status":5,"sort":10,"url":390,"url_text":391,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Freviewing-translations","Quality control",{"collection":174,"item":393},{"id":394,"status":5,"sort":10,"name":395,"item":396},34,"Connected Projects",[397],{"collection":360,"item":398},{"id":4,"status":5,"slug":399},"connected-projects",{"collection":174,"item":401},{"id":402,"status":5,"sort":10,"name":403,"item":404},64,"Plural handling",[405],{"collection":360,"item":406},{"id":407,"status":5,"slug":408},32,"plurals",{"collection":174,"item":410},{"id":411,"status":5,"sort":10,"name":412,"item":413},65,"Style guides",[414],{"collection":360,"item":415},{"id":218,"status":5,"slug":416},"style-guide",{"navigation_items_group_id":418},{"id":19,"sort":45,"status":5,"name":419,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":420},"Translation",[421,429,437,441,449,457,466],{"collection":174,"item":422},{"id":423,"status":5,"sort":10,"name":424,"item":425},36,"Professional translations",[426],{"collection":369,"item":427},{"id":223,"status":5,"slug":428},"professional-translation-services",{"collection":174,"item":430},{"id":431,"status":5,"sort":10,"name":432,"item":433},48,"Crowdsourced translations",[434],{"collection":360,"item":435},{"id":53,"status":5,"slug":436},"share-tm",{"collection":245,"item":438},{"id":37,"status":5,"sort":10,"url":439,"url_text":440,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings","Translation interface",{"collection":174,"item":442},{"id":443,"status":5,"sort":10,"name":444,"item":445},55,"Machine translations",[446],{"collection":360,"item":447},{"id":37,"status":5,"slug":448},"machine-translation",{"collection":174,"item":450},{"id":451,"status":5,"sort":10,"name":452,"item":453},60,"Localazy AI translation",[454],{"collection":360,"item":455},{"id":271,"status":5,"slug":456},"localazy-ai",{"collection":174,"item":458},{"id":459,"status":5,"sort":10,"name":460,"item":461},61,"Translation Memory",[462],{"collection":360,"item":463},{"id":464,"status":5,"slug":465},35,"translation-memory",{"collection":174,"item":467},{"id":468,"status":5,"sort":10,"name":469,"item":470},63,"Code & placeholders",[471],{"collection":360,"item":472},{"id":223,"status":5,"slug":473},"code-and-placeholders",{"navigation_items_group_id":475},{"id":71,"sort":53,"status":5,"name":476,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":477},"Management",[478,482,490,498,507,515,519],{"collection":245,"item":479},{"id":53,"status":5,"sort":10,"url":480,"url_text":481,"show_favorite_icon":160},"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles","User roles",{"collection":174,"item":483},{"id":484,"status":5,"sort":10,"name":485,"item":486},51,"Duplicity Linking",[487],{"collection":360,"item":488},{"id":103,"status":5,"slug":489},"duplicity-linking",{"collection":174,"item":491},{"id":492,"status":5,"sort":10,"name":493,"item":494},52,"Language Permissions",[495],{"collection":360,"item":496},{"id":24,"status":5,"slug":497},"language-permissions",{"collection":174,"item":499},{"id":500,"status":501,"sort":10,"name":502,"item":503},53,"draft","Automations",[504],{"collection":360,"item":505},{"id":107,"status":5,"slug":506},"automations",{"collection":174,"item":508},{"id":509,"status":5,"sort":10,"name":510,"item":511},58,"Branching",[512],{"collection":360,"item":513},{"id":230,"status":5,"slug":514},"branching",{"collection":245,"item":516},{"id":24,"status":501,"sort":10,"url":517,"url_text":518,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fsso-configuration","SSO",{"collection":245,"item":520},{"id":331,"status":501,"sort":10,"url":521,"url_text":522,"show_favorite_icon":160},"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Flanguage-statistics","Reporting",{"navigation_items_group_id":524},{"id":83,"sort":57,"status":5,"name":525,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":526},"Development",[527,533,541,548,555,563,572],{"collection":174,"item":528},{"id":271,"status":5,"sort":10,"name":62,"item":529},[530],{"collection":360,"item":531},{"id":15,"status":5,"slug":532},"translation-api",{"collection":174,"item":534},{"id":535,"status":5,"sort":10,"name":536,"item":537},33,"Localazy CLI",[538],{"collection":360,"item":539},{"id":45,"status":5,"slug":540},"cli",{"collection":174,"item":542},{"id":407,"status":5,"sort":10,"name":543,"item":544},"Language CDN",[545],{"collection":360,"item":546},{"id":33,"status":5,"slug":547},"language-cdn",{"collection":174,"item":549},{"id":266,"status":5,"sort":10,"name":550,"item":551},"Releases",[552],{"collection":360,"item":553},{"id":41,"status":5,"slug":554},"releases",{"collection":174,"item":556},{"id":557,"status":501,"sort":10,"name":558,"item":559},57,"Format Conversions",[560],{"collection":360,"item":561},{"id":20,"status":5,"slug":562},"format-conversions",{"collection":174,"item":564},{"id":565,"status":5,"sort":10,"name":566,"item":567},59,"Webhooks",[568],{"collection":360,"item":569},{"id":570,"status":5,"slug":571},31,"webhooks",{"collection":174,"item":573},{"id":574,"status":5,"sort":10,"name":575,"item":576},62,"Export Aliases",[577],{"collection":360,"item":578},{"id":535,"status":5,"slug":579},"export-aliases",{"id":33,"name":75,"url":10,"url_text":10,"status":5,"groups":581},[582,698],{"navigation_items_group_id":583},{"id":45,"sort":61,"status":5,"name":584,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":585},"Most popular",[586],{"collection":174,"item":587},{"id":19,"status":5,"sort":10,"name":75,"item":588},[589,597,604,611,618,624,631,638,645,652,659,668,675,682,690],{"collection":590,"item":591},"platforms",{"id":41,"status":5,"sort":4,"slug":592,"name":593,"icon":594},"android","Android",{"id":595,"title":596},"ff965add-53b0-44ad-b27c-ea4ef641d384","Ic Outline Android",{"collection":590,"item":598},{"id":45,"status":5,"sort":20,"slug":599,"name":600,"icon":601},"ios","iOS",{"id":602,"title":603},"886285d7-816a-4430-b5a5-edfe307b238e","Ios",{"collection":590,"item":605},{"id":535,"status":5,"sort":25,"slug":606,"name":607,"icon":608},"react","React",{"id":609,"title":610},"26757a90-88a3-4a94-b587-9f38614ed3bd","Logos React",{"collection":590,"item":612},{"id":103,"status":5,"sort":33,"slug":613,"name":614,"icon":615},"vuejs","Vue.js",{"id":616,"title":617},"6180b41f-3249-47d3-adcd-50fe1cf11bf1","Vue",{"collection":590,"item":619},{"id":91,"status":5,"sort":37,"slug":620,"name":621,"icon":622},"angular","Angular",{"id":623,"title":621},"2a31a97a-48c5-4531-aa36-41c9dd0bdbef",{"collection":590,"item":625},{"id":4,"status":5,"sort":41,"slug":626,"name":627,"icon":628},"flutter","Flutter",{"id":629,"title":630},"b9f13a11-9328-4a03-86cf-b20de0685606","Logos Flutter",{"collection":590,"item":632},{"id":25,"status":5,"sort":15,"slug":633,"name":634,"icon":635},"typescript","TypeScript",{"id":636,"title":637},"8d1319b5-8a96-4199-8407-00add3418b1f","Logos Typescript Icon",{"collection":590,"item":639},{"id":570,"status":5,"sort":19,"slug":640,"name":641,"icon":642},"javascript","JavaScript",{"id":643,"title":644},"4218d0c9-7e6b-494d-9663-37ceaf93ee8c","Logos Javascript",{"collection":590,"item":646},{"id":19,"status":5,"sort":107,"slug":647,"name":648,"icon":649},"json","JSON",{"id":650,"title":651},"99ac3b7c-dba5-4693-a4f4-1f27a6d7782d","Logos Json",{"collection":590,"item":653},{"id":24,"status":5,"sort":24,"slug":654,"name":655,"icon":656},"xliff","XLIFF",{"id":657,"title":658},"ca424cc8-e8a7-4aef-8dca-ef4a4d1334fc","Format",{"collection":590,"item":660},{"id":661,"status":5,"sort":662,"slug":663,"name":664,"icon":665},72,54,"strapi","Strapi",{"id":666,"title":667},"cde7f1d0-f2e0-4243-929e-a3f8f9146e69","Strapi Logo Purple",{"collection":590,"item":669},{"id":451,"status":5,"sort":443,"slug":670,"name":671,"icon":672},"figma","Figma",{"id":673,"title":674},"813745a4-a77d-4735-93b7-e0dd731b2304","Figma Icon",{"collection":590,"item":676},{"id":484,"status":5,"sort":382,"slug":677,"name":678,"icon":679},"microsoft-excel","Microsoft Excel",{"id":680,"title":681},"7a175955-7b96-4561-939f-a0e1924faa40","Excel",{"collection":590,"item":683},{"id":684,"status":5,"sort":459,"slug":685,"name":686,"icon":687},66,"github-actions","GitHub Actions",{"id":688,"title":689},"da17554f-ac6d-443d-9bac-1f29645ec1c6","Github Icon",{"collection":590,"item":691},{"id":692,"status":5,"sort":693,"slug":694,"name":695,"icon":696},97,999,"webflow","Webflow",{"id":697,"title":695},"ff43a386-52f8-499f-b77c-ab9a30f4a77e",{"navigation_items_group_id":699},{"id":33,"sort":15,"status":5,"name":700,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":701},"Explore more",[702],{"collection":703,"item":704},"text_link_navigation_item_type",{"id":4,"status":5,"sort":10,"text":705,"url":706,"url_text":707},"Localazy is a technology-agnostic platform supporting 50+ frameworks, file formats & popular tools.","\u002Fintegrations","See all integrations",{"id":4,"name":79,"url":10,"url_text":10,"status":5,"groups":709},[710,734,740],{"navigation_items_group_id":711},{"id":4,"sort":19,"status":5,"name":712,"render_show_all_url":160,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":10,"represent_as_tile":160,"items":713},"Helpful Links",[714,717,719,723,725,728,730],{"collection":245,"item":715},{"id":71,"status":5,"sort":10,"url":101,"url_text":716,"show_favorite_icon":162},"Localazy Blog",{"collection":245,"item":718},{"id":83,"status":5,"sort":10,"url":85,"url_text":84,"show_favorite_icon":162},{"collection":245,"item":720},{"id":4,"status":5,"sort":10,"url":721,"url_text":722,"show_favorite_icon":160},"https:\u002F\u002Fdiscuss.localazy.com\u002F","Discussion Forum",{"collection":245,"item":724},{"id":19,"status":5,"sort":10,"url":93,"url_text":92,"show_favorite_icon":160},{"collection":245,"item":726},{"id":25,"status":5,"sort":10,"url":35,"url_text":727,"show_favorite_icon":160},"Become a Partner",{"collection":245,"item":729},{"id":87,"status":5,"sort":10,"url":105,"url_text":104,"show_favorite_icon":160},{"collection":245,"item":731},{"id":95,"status":5,"sort":10,"url":732,"url_text":733,"show_favorite_icon":160},"\u002Ftags\u002Frelease-update","Release Updates",{"navigation_items_group_id":735},{"id":20,"sort":83,"status":5,"name":716,"render_show_all_url":162,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":101,"represent_as_tile":160,"items":736},[737],{"collection":165,"item":738},{"id":25,"status":5,"sort":10,"show_author_img":160,"blog_post_tag":739,"description":10},"[USE LATEST FEATURED]",{"navigation_items_group_id":741},{"id":41,"sort":71,"status":5,"name":84,"render_show_all_url":162,"show_all_url_position":161,"show_favorite_icon":160,"show_all_url":85,"represent_as_tile":160,"items":742},[743,757,769,780,792,802,813,821],{"collection":174,"item":744},{"id":33,"status":5,"sort":10,"name":745,"item":746},"General",[747],{"collection":748,"item":749},"docs_section",{"id":20,"status":5,"sort":4,"slug":750,"name":745,"icon":751,"featured_icon":754},"general",{"id":752,"title":753},"423101f1-308c-42f1-8dfe-53272019e7cb","Global",{"id":755,"title":756},"0f7ca4cb-dc3b-4f62-b476-132ed5c4931f","General Doc",{"collection":174,"item":758},{"id":37,"status":5,"sort":10,"name":759,"item":760},"CLI",[761],{"collection":748,"item":762},{"id":25,"status":5,"sort":20,"slug":540,"name":759,"icon":763,"featured_icon":766},{"id":764,"title":765},"2f7a4573-8265-4d76-8d55-ce0cc79b8983","Cli",{"id":767,"title":768},"3f76ff7b-0e74-4046-bb03-4ca99c3b66d5","Doc Cat Cli",{"collection":174,"item":770},{"id":53,"status":5,"sort":10,"name":771,"item":772},"API",[773],{"collection":748,"item":774},{"id":107,"status":5,"sort":25,"slug":775,"name":771,"icon":776,"featured_icon":777},"api",{"id":764,"title":765},{"id":778,"title":779},"20866781-e69b-4e01-9456-05437487b75c","API Doc",{"collection":174,"item":781},{"id":782,"status":5,"sort":10,"name":783,"item":784},50,"CDN",[785],{"collection":748,"item":786},{"id":252,"status":5,"sort":33,"slug":787,"name":783,"icon":788,"featured_icon":789},"cdn",{"id":752,"title":753},{"id":790,"title":791},"a8ee9cb7-4e02-41f0-b595-eb518c3085b6","Doc Cat Cdn",{"collection":174,"item":793},{"id":41,"status":5,"sort":10,"name":593,"item":794},[795],{"collection":748,"item":796},{"id":4,"status":5,"sort":37,"slug":592,"name":593,"icon":797,"featured_icon":799},{"id":798,"title":593},"fb8329ae-0c0c-4fbc-bcdc-83f2eeda1039",{"id":800,"title":801},"f7c0dec8-5b42-4943-ab3a-e3665723ad6f","Doc Cat Android",{"collection":174,"item":803},{"id":45,"status":5,"sort":10,"name":600,"item":804},[805],{"collection":748,"item":806},{"id":33,"status":5,"sort":41,"slug":599,"name":600,"icon":807,"featured_icon":810},{"id":808,"title":809},"289e136c-55df-4d51-847b-1782a2308ee4","Ios Blue",{"id":811,"title":812},"2968d3f0-14b5-4427-82e7-f1ea2de17846","Doc Cat Ios",{"collection":174,"item":814},{"id":57,"status":5,"sort":10,"name":671,"item":815},[816],{"collection":748,"item":817},{"id":24,"status":5,"sort":45,"slug":670,"name":671,"icon":818,"featured_icon":819},{"id":764,"title":765},{"id":820,"title":671},"f5e66b5b-a439-47f6-af4a-6ad261de2e87",{"collection":174,"item":822},{"id":61,"status":5,"sort":10,"name":664,"item":823},[824],{"collection":748,"item":825},{"id":280,"status":5,"sort":53,"slug":663,"name":664,"icon":826,"featured_icon":828},{"id":827,"title":664},"3b4b03c7-e131-49e6-a014-c8c2c8a2751e",{"id":829,"title":830},"1dd05c76-e517-4aea-a3d8-49cfddb40056","Strapi Doc",{"id":25,"name":108,"url":109,"url_text":108,"status":5,"groups":832},[],{"id":41,"name":16,"url":834,"url_text":16,"status":5,"groups":835},"\u002Fbook-demo",[],{"status":5,"header_badges":837,"footer_badges":855,"footer_secured_badges":861,"slider_badges":873},[838,845,850],{"id":4,"status":5,"sort":10,"link":839,"title":840,"badgeType":841,"badgeName":842,"metadata":10,"image":843},"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Flocalazy\u002Freviews","Best meets requirements","Other","G2-winter-24-best-meets-requirments",{"id":844},"8d5dd6fd-6995-4c92-8219-a6ed5ba6acdc",{"id":20,"status":5,"sort":10,"link":839,"title":846,"badgeType":841,"badgeName":847,"metadata":10,"image":848},"Best support","G2-winter-24-best-support",{"id":849},"e59dd465-84d9-45c7-987d-dd4048fd6992",{"id":25,"status":5,"sort":10,"link":839,"title":851,"badgeType":841,"badgeName":852,"metadata":10,"image":853},"Easiest admin","G2-winter-24-easiest-admin",{"id":854},"5f12c4c8-bec0-47cf-87b4-a4502e9f1bd2",[856],{"id":19,"status":5,"sort":10,"link":839,"title":857,"badgeType":841,"badgeName":858,"metadata":10,"image":859},"Users love us","Users love us 25",{"id":860},"232416a5-86ba-4be6-85a5-b88802003d53",[862,868],{"id":15,"status":5,"sort":10,"link":863,"title":864,"badgeType":841,"badgeName":865,"metadata":10,"image":866},"https:\u002F\u002Fsprinto.com\u002Fget-iso-27001\u002F","Sprinto ISO 27001","Sprinto ISO 27001 certificate",{"id":867},"c1c6c06c-6caf-4b78-8a7e-9606c395eb61",{"id":71,"status":5,"sort":10,"link":869,"title":870,"badgeType":841,"badgeName":870,"metadata":10,"image":871},"https:\u002F\u002Fwww.aicpa.org\u002Fsoc4so","SOC certificate",{"id":872},"4f4bc0a6-09a0-41df-8295-8f990d96d941",[874,880,884,888,892,896,901],{"id":37,"status":5,"sort":10,"link":839,"title":875,"badgeType":841,"badgeName":876,"metadata":877,"image":878},"Most likely to recommend","a","",{"id":879},"da055731-3f11-4fc7-96f2-c11c0b84c831",{"id":41,"status":5,"sort":10,"link":839,"title":881,"badgeType":841,"badgeName":10,"metadata":10,"image":882},"EMEA High Performer",{"id":883},"586fb488-81f2-41db-a4e8-ef309e50c0e6",{"id":45,"status":5,"sort":10,"link":839,"title":885,"badgeType":841,"badgeName":10,"metadata":10,"image":886},"Ease of Doing Business With",{"id":887},"bfa26865-430e-463d-9886-cb56a8a8ecf6",{"id":53,"status":5,"sort":10,"link":839,"title":889,"badgeType":841,"badgeName":10,"metadata":10,"image":890},"High Performer",{"id":891},"2cc1ba0f-c23a-4c97-ad4a-a655c97466fe",{"id":57,"status":5,"sort":10,"link":839,"title":893,"badgeType":841,"badgeName":10,"metadata":10,"image":894},"Fastest Implementation",{"id":895},"6f297758-1c95-45f4-a6e9-528319897132",{"id":61,"status":5,"sort":10,"link":897,"title":898,"badgeType":841,"badgeName":10,"metadata":10,"image":899},"https:\u002F\u002Fwww.intercert.com\u002Fservices\u002Fgovernance-risk-compliance\u002Fiso-iec-27001","Intercert ISO 27001",{"id":900},"0521a5f1-e1f2-4da6-a2bc-dc92773f2a7b",{"id":15,"status":5,"sort":10,"link":863,"title":864,"badgeType":841,"badgeName":865,"metadata":10,"image":902},{"id":867},[904,1044,1122,1228,1314,1393,1482,1573,1660,1759],{"id":535,"status":5,"created_on":905,"modified_on":906,"name":607,"slug":606,"description":907,"docs_link":908,"priority":10,"has_sdk":160,"sort":25,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":909,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":911,"tile_description":912,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":913,"upload_features":914,"icon":915,"meta_image":916,"primary_tag":918,"tags":934,"integration_methods":952,"recommended_methods":1028,"default_integration_method":1029,"faq_categories":1036,"translations":1042,"platforms_id":535},"2022-03-18T08:09:24.000Z","2025-02-26T13:36:08.000Z","Manage your React app translations with Localazy, a continuous localization tool. React i18n done right. ","\u002Fdocs\u002Fcli\u002Fjson-format","JSON format support","CLI support","react-i18next and more","Use Localazy to translate your React projects with your favorite i18n library.",{"json":647},[],{"id":609},{"id":917},"a97492ec-ee8d-429c-bf66-d0fe59b6e5c9",{"id":37,"status":5,"sort":20,"created_on":919,"label":920,"hidden":160,"icon":921,"translations":923},"2022-03-17T12:23:44.000Z","Web apps",{"id":922},"c9e70e4f-8136-432a-8d82-53c3501a9eb4",[924,926,929,932],{"id":37,"languages_code":925,"label":920},"xxa",{"id":365,"languages_code":927,"label":928},"es","Aplicaciones web",{"id":782,"languages_code":930,"label":931},"cs","Webové aplikace",{"id":565,"languages_code":933,"label":920},"en",[935,942],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":936,"translations":937},{"id":922},[938,939,940,941],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":53,"status":5,"sort":57,"label":943,"hidden":160,"created_on":944,"icon":10,"translations":945},"Framework","2022-03-17T12:23:45.000Z",[946,947,949,950],{"id":53,"languages_code":925,"label":943},{"id":500,"languages_code":927,"label":948},"Marco",{"id":451,"languages_code":930,"label":943},{"id":951,"languages_code":933,"label":943},67,[953,965,990,1011],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":956},"Translate strings directly or upload them into your Localazy project.","\u002Fdocs\u002Fapi\u002Fintroduction",[957,958,961,963],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},40,"Utilice la API para exportar traducciones e importar contenido de\u002Fa Localazy mediante programación.",{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},"Choose between translating strings directly or uploading them into Localazy.",{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},"Pomocí rozhraní API můžete programovaně exportovat překlady a importovat obsah z\u002Fdo Localazy.",{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":971},"Create source keys online","add-keys-manually","Add source keys via the web interface online and sync them into your project later.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#add-new-keys-in-ui","vpn-key-outline",[972,973,976,977,980,983,984,985],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},"Cree claves fuente en línea","Añada claves fuente a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},"Vytvářejte zdrojové klíče online","Přidejte zdrojové klíče přes webové rozhraní online a synchronizujte je do svého projektu později.",{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},"Cree claves de origen en línea","Añada claves de origen a través de la interfaz web en línea y sincronícelas posteriormente en su proyecto.",{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},88,"de","Erstellen Sie Quellschlüssel online","Fügen Sie Quellschlüssel über die Weboberfläche online hinzu und synchronisieren Sie sie später mit Ihrem Projekt.",{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":997},"Direct file upload","File upload","web-upload","Upload your texts and existing translations in any format directly to start quickly.","\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files","file-upload",[998,999,1002,1003,1007],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},"Carga directa de archivos","Cargue sus textos y traducciones existentes en cualquier formato directamente para empezar rápidamente.",{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},56,"Přímé nahrávání souborů","Nahrajte přímo své texty a stávající překlady v libovolném formátu a začněte pracovat ihned.",{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},85,"Direkter Datei-Upload","Laden Sie Ihre Texte und vorhandenen Übersetzungen in einem beliebigen Format direkt hoch, um schnell loszulegen.",{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1015},"Command Line Interface","The best option for developers that want to make localization an automated part of their workflow.","\u002Fdocs\u002Fcli\u002Fthe-basics",[1016,1017,1020,1021,1024],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},"Interfaz de Línea de Comandos","La mejor opción para los desarrolladores que deseen hacer de la localización una parte automatizada de su flujo de trabajo.",{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},"Rozhraní Příkazového Řádku","Nejlepší volba pro vývojáře, kteří chtějí, aby se lokalizace stala automatizovanou součástí jejich pracovních postupů.",{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},87,"Befehlszeilenschnittstelle","Die beste Option für Entwickler, die die Lokalisierung zu einem automatisierten Teil ihres Arbeitsablaufs machen möchten.",[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1030},[1031,1032,1033,1034,1035],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1037],{"id":1038,"status":5,"created_on":1039,"sort":10,"slug":1040,"label":1041,"on_faq_index":10},76,"2025-02-26T12:44:29.000Z","front-end-common","Front-end Common",[1043],{"languages_code":925,"name":607,"slug":606,"description":907,"support_type":909,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":911,"tile_description":912,"id":535,"platforms_id":535,"docs_link":908},{"id":103,"status":5,"created_on":905,"modified_on":1045,"name":614,"slug":613,"description":1046,"docs_link":908,"priority":10,"has_sdk":160,"sort":33,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":909,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1047,"tile_description":1048,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1049,"upload_features":1050,"icon":1051,"meta_image":1052,"primary_tag":1054,"tags":1061,"integration_methods":1075,"recommended_methods":1106,"default_integration_method":1107,"faq_categories":1114,"translations":1120,"platforms_id":103},"2025-02-26T13:35:41.000Z","Online Vue.js project localization tool for your translation management. Enjoy true continuous localization with Localazy & translate your JSON files automatically.","Vue.js & JSON","Enjoy true continuous localization with Localazy & translate your Vue projects automatically.",{"json":647},[],{"id":616},{"id":1053},"8171b836-d6b8-4354-8db3-34ccd384970d",{"id":37,"status":5,"sort":20,"created_on":919,"label":920,"hidden":160,"icon":1055,"translations":1056},{"id":922},[1057,1058,1059,1060],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},[1062,1069],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1063,"translations":1064},{"id":922},[1065,1066,1067,1068],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":53,"status":5,"sort":57,"label":943,"hidden":160,"created_on":944,"icon":10,"translations":1070},[1071,1072,1073,1074],{"id":53,"languages_code":925,"label":943},{"id":500,"languages_code":927,"label":948},{"id":451,"languages_code":930,"label":943},{"id":951,"languages_code":933,"label":943},[1076,1082,1092,1099],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1077},[1078,1079,1080,1081],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1083},[1084,1085,1086,1087,1088,1089,1090,1091],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1093},[1094,1095,1096,1097,1098],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1100},[1101,1102,1103,1104,1105],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1108},[1109,1110,1111,1112,1113],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1115,1119],{"id":1004,"status":5,"created_on":1116,"sort":10,"slug":1117,"label":1118,"on_faq_index":10},"2023-03-01T11:21:41.000Z","vue-localization","Vue.js Localization",{"id":1038,"status":5,"created_on":1039,"sort":10,"slug":1040,"label":1041,"on_faq_index":10},[1121],{"languages_code":925,"name":614,"slug":613,"description":1046,"support_type":909,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1047,"tile_description":1048,"id":103,"platforms_id":103,"docs_link":908},{"id":4,"status":5,"created_on":905,"modified_on":1123,"name":627,"slug":626,"description":1124,"docs_link":1125,"priority":10,"has_sdk":160,"sort":41,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1126,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1126,"tile_description":1127,"is_enterprise":160,"is_popular":160,"primary_use_case":1128,"hierarchy_handling":1129,"best_for":1130,"file_extension":1131,"format_code_example":1132,"format_to_extension":1133,"upload_features":1135,"icon":1136,"meta_image":1137,"primary_tag":1139,"tags":1150,"integration_methods":1186,"recommended_methods":1217,"default_integration_method":1218,"faq_categories":1225,"translations":1226,"platforms_id":4},"2025-07-03T14:21:42.000Z","Learn how to use Localazy CLI for localization of Flutter app. Flutter’s ARB format is fully supported including arrays, plurals, and selected context information. No extra configuration is necessary, but you can enable certain features if you want to.","\u002Fdocs\u002Fcli\u002Fflutter-format","ARB format support","Use the Localazy CLI for localization of Flutter projects. Flutter’s ARB format is fully supported.","Supports metadata like placeholders","JSON-like key-value","Flutter apps",".arb","```\n{\n  \"localazy_message\": \"Go international, today. With Localazy.\"\n}\n```",{"arb":1134},"arb",[],{"id":629},{"id":1138},"c2674666-4371-4aa4-9a65-438c7363fafe",{"id":41,"status":5,"sort":53,"created_on":944,"label":1140,"hidden":160,"icon":1141,"translations":1143},"Mobile apps",{"id":1142},"c9c7e1f5-8b59-4016-ae0c-6fba9469cd55",[1144,1145,1147,1149],{"id":41,"languages_code":925,"label":1140},{"id":374,"languages_code":927,"label":1146},"Aplicaciones móviles",{"id":443,"languages_code":930,"label":1148},"Mobilní aplikace",{"id":411,"languages_code":933,"label":1140},[1151,1162,1169,1176],{"id":45,"status":5,"sort":103,"label":1152,"hidden":160,"created_on":944,"icon":1153,"translations":1155},"Desktop & Games",{"id":1154},"65b04533-5b4c-430c-b8a4-ecce84754200",[1156,1157,1159,1161],{"id":45,"languages_code":925,"label":1152},{"id":382,"languages_code":927,"label":1158},"Escritorio y Juegos",{"id":1004,"languages_code":930,"label":1160},"Stolní počítače & Hry",{"id":684,"languages_code":933,"label":1152},{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1163,"translations":1164},{"id":922},[1165,1166,1167,1168],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":41,"status":5,"sort":53,"label":1140,"hidden":160,"created_on":944,"icon":1170,"translations":1171},{"id":1142},[1172,1173,1174,1175],{"id":41,"languages_code":925,"label":1140},{"id":374,"languages_code":927,"label":1146},{"id":443,"languages_code":930,"label":1148},{"id":411,"languages_code":933,"label":1140},{"id":223,"status":5,"sort":407,"label":1177,"hidden":162,"created_on":944,"icon":10,"translations":1178},"ARB",[1179,1180,1182,1184],{"id":223,"languages_code":925,"label":1177},{"id":1181,"languages_code":927,"label":1177},120,{"id":1183,"languages_code":930,"label":1177},125,{"id":1185,"languages_code":933,"label":1177},130,[1187,1193,1203,1210],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1188},[1189,1190,1191,1192],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1194},[1195,1196,1197,1198,1199,1200,1201,1202],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1204},[1205,1206,1207,1208,1209],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1211},[1212,1213,1214,1215,1216],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1219},[1220,1221,1222,1223,1224],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1227],{"languages_code":925,"name":627,"slug":626,"description":1124,"support_type":1126,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1126,"tile_description":1127,"id":4,"platforms_id":4,"docs_link":1125},{"id":570,"status":5,"created_on":1229,"modified_on":1230,"name":641,"slug":640,"description":1231,"docs_link":1232,"priority":10,"has_sdk":160,"sort":19,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1233,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1233,"tile_description":1234,"is_enterprise":160,"is_popular":160,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1235,"upload_features":1237,"icon":1238,"meta_image":1239,"primary_tag":1241,"tags":1254,"integration_methods":1269,"recommended_methods":1300,"default_integration_method":1301,"faq_categories":1308,"translations":1312,"platforms_id":570},"2022-03-18T08:09:25.000Z","2024-07-17T07:43:22.000Z","Localize your app with JavaScript localizations and Localazy CLI.\nUpload JavaScript files with strings to Localazy and manage your translations easily. Download translated files back.","\u002Fdocs\u002Fcli\u002Fjavascript-format","JS file support","Translating JS files is easy as a pie with Localazy!",{"js":1236},"js",[],{"id":643},{"id":1240},"2c6699eb-1d80-4772-8268-5597dbcead8c",{"id":61,"status":5,"sort":61,"created_on":944,"label":1242,"hidden":160,"icon":1243,"translations":1245},"Programming Languages",{"id":1244},"8c5836bb-1fbe-49c5-9330-8f931838c457",[1246,1247,1249,1252],{"id":61,"languages_code":925,"label":1242},{"id":468,"languages_code":927,"label":1248},"Lenguajes de Programación",{"id":1250,"languages_code":930,"label":1251},68,"Programovací Jazyky",{"id":1253,"languages_code":933,"label":1242},70,[1255,1262],{"id":37,"status":5,"sort":20,"label":920,"hidden":160,"created_on":919,"icon":1256,"translations":1257},{"id":922},[1258,1259,1260,1261],{"id":37,"languages_code":925,"label":920},{"id":365,"languages_code":927,"label":928},{"id":782,"languages_code":930,"label":931},{"id":565,"languages_code":933,"label":920},{"id":61,"status":5,"sort":61,"label":1242,"hidden":160,"created_on":944,"icon":1263,"translations":1264},{"id":1244},[1265,1266,1267,1268],{"id":61,"languages_code":925,"label":1242},{"id":468,"languages_code":927,"label":1248},{"id":1250,"languages_code":930,"label":1251},{"id":1253,"languages_code":933,"label":1242},[1270,1276,1286,1293],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1271},[1272,1273,1274,1275],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1277},[1278,1279,1280,1281,1282,1283,1284,1285],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1287},[1288,1289,1290,1291,1292],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1294},[1295,1296,1297,1298,1299],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1302},[1303,1304,1305,1306,1307],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1309],{"id":464,"status":5,"created_on":1310,"sort":10,"slug":1311,"label":641,"on_faq_index":160},"2022-06-10T09:49:33.000Z","javascript-i18n-localization",[1313],{"languages_code":925,"name":641,"slug":640,"description":1231,"support_type":1233,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1233,"tile_description":1234,"id":570,"platforms_id":570,"docs_link":1232},{"id":19,"status":5,"created_on":1229,"modified_on":1315,"name":648,"slug":647,"description":1316,"docs_link":908,"priority":10,"has_sdk":160,"sort":107,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1317,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1318,"tile_description":1319,"is_enterprise":160,"is_popular":162,"primary_use_case":1320,"hierarchy_handling":1321,"best_for":1322,"file_extension":1323,"format_code_example":1324,"format_to_extension":1325,"upload_features":1326,"icon":1327,"meta_image":1328,"primary_tag":1330,"tags":1341,"integration_methods":1349,"recommended_methods":1380,"default_integration_method":1381,"faq_categories":1388,"translations":1391,"platforms_id":19},"2025-10-14T11:22:29.000Z","Online JSON translator you will love. Comfortable JSON language files editor with powerful CLI under your fingers for continuous localization.","Advanced format support","{Objectively the best}","Translate any JSON files with Localazy, with the best in class plural and array support.","Used for structured data storage and APIs","Uses key-value pairs","Web & mobile apps, APIs",".json","```\n{\n  \"parent\": {\n    \"child\": {\n      \"another_nested_level\": \"All is supported.\"\n    }\n  }\n}\n```",{"json":647},[],{"id":650},{"id":1329},"8d614c20-667e-4bee-a64d-7d7ce9c0ee0a",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1332,"translations":1334},"File formats",{"id":1333},"ab7c8f89-dcce-45ab-9e21-8605aef289c3",[1335,1336,1338,1340],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},"Formatos de archivo",{"id":484,"languages_code":930,"label":1339},"Formáty souborů",{"id":574,"languages_code":933,"label":1331},[1342],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1343,"translations":1344},{"id":1333},[1345,1346,1347,1348],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1350,1356,1366,1373],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1351},[1352,1353,1354,1355],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1357},[1358,1359,1360,1361,1362,1363,1364,1365],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1367},[1368,1369,1370,1371,1372],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1374},[1375,1376,1377,1378,1379],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1382},[1383,1384,1385,1386,1387],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1389],{"id":423,"status":5,"created_on":1390,"sort":10,"slug":647,"label":648,"on_faq_index":160},"2022-06-10T10:49:07.000Z",[1392],{"languages_code":925,"name":648,"slug":647,"description":1316,"support_type":1317,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1318,"tile_description":1319,"id":19,"platforms_id":19,"docs_link":908},{"id":24,"status":5,"created_on":1229,"modified_on":1394,"name":655,"slug":654,"description":1395,"docs_link":1396,"priority":10,"has_sdk":160,"sort":24,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":160,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":910,"tile_subtitle":1398,"tile_description":1399,"is_enterprise":160,"is_popular":162,"primary_use_case":1400,"hierarchy_handling":1401,"best_for":1402,"file_extension":1403,"format_code_example":1404,"format_to_extension":1405,"upload_features":1407,"icon":1408,"meta_image":1409,"primary_tag":1411,"tags":1418,"integration_methods":1440,"recommended_methods":1471,"default_integration_method":1472,"faq_categories":1479,"translations":1480,"platforms_id":24},"2025-07-03T14:28:31.000Z","XLIFF is meant for localization. Enjoy Localazy - an online XLIFF editor for your translation management. Integrate your XLIFF files with Localazy to achieve true continuous localization and translate XLIFF files on autopilot.","\u002Fdocs\u002Fcli\u002Fxliff-12-format","File format support","Meant for localization","XLIFF stands for XML Localization Interchange File Format - and Localazy is the best way to manage XLIFF files.","Used in translation pipelines","XML-based exchange format","Translation & software",".xliff","```\n\u003Ctrans-unit id=\"localazy_message\">\n    \u003Csource>Go international, today. With Localazy.\u003C\u002Fsource>\n\u003C\u002Ftrans-unit>\n```",{"xliff":1406},"xlf",[],{"id":657},{"id":1410},"889970a6-cce8-4055-b96a-9c3f292aa67f",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1412,"translations":1413},{"id":1333},[1414,1415,1416,1417],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1419,1426,1433],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1420,"translations":1421},{"id":1333},[1422,1423,1424,1425],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1427,"translations":1428},{"id":1333},[1429,1430,1431,1432],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1434,"translations":1435},{"id":1333},[1436,1437,1438,1439],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1441,1447,1457,1464],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1442},[1443,1444,1445,1446],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1448},[1449,1450,1451,1452,1453,1454,1455,1456],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1458},[1459,1460,1461,1462,1463],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1465},[1466,1467,1468,1469,1470],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1473},[1474,1475,1476,1477,1478],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1481],{"languages_code":925,"name":655,"slug":654,"description":1395,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1398,"tile_description":1399,"id":24,"platforms_id":24,"docs_link":1396},{"id":107,"status":5,"created_on":1483,"modified_on":1483,"name":1484,"slug":1485,"description":1486,"docs_link":1487,"priority":10,"has_sdk":160,"sort":247,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1488,"tile_description":1489,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":1490,"upload_features":1491,"icon":1492,"meta_image":1494,"primary_tag":1496,"tags":1503,"integration_methods":1531,"recommended_methods":1562,"default_integration_method":1563,"faq_categories":1570,"translations":1571,"platforms_id":107},"2026-05-21T20:49:09.000Z","PO","po","Edit .po and .pot files with your team, automate translation with AI, and ship faster.","\u002Fdocs\u002Fcli\u002Fpo-format","Seamless integration","Upload, edit and translate PO files with Localazy.",{"po":1485},[],{"id":1493},"25f317fe-0c10-4f0b-92cd-f80d1f3c6a67",{"id":1495},"490022f9-d91a-4e1a-9e79-db374ec997c2",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1497,"translations":1498},{"id":1333},[1499,1500,1501,1502],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1504,1511,1521],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1505,"translations":1506},{"id":1333},[1507,1508,1509,1510],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":394,"status":5,"sort":394,"label":1512,"hidden":162,"created_on":944,"icon":10,"translations":1513},"C++",[1514,1515,1517,1519],{"id":394,"languages_code":925,"label":1512},{"id":1516,"languages_code":927,"label":1512},135,{"id":1518,"languages_code":930,"label":1512},140,{"id":1520,"languages_code":933,"label":1512},144,{"id":24,"status":5,"sort":247,"label":1522,"hidden":162,"created_on":944,"icon":10,"translations":1523},"Gettext",[1524,1525,1527,1529],{"id":24,"languages_code":925,"label":1522},{"id":1526,"languages_code":927,"label":1522},101,{"id":1528,"languages_code":930,"label":1522},106,{"id":1530,"languages_code":933,"label":1522},111,[1532,1538,1548,1555],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1533},[1534,1535,1536,1537],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1539},[1540,1541,1542,1543,1544,1545,1546,1547],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1549},[1550,1551,1552,1553,1554],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1556},[1557,1558,1559,1560,1561],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1564},[1565,1566,1567,1568,1569],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],[1572],{"languages_code":925,"name":1484,"slug":1485,"description":1486,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1488,"tile_description":1489,"id":107,"platforms_id":107,"docs_link":1487},{"id":252,"status":5,"created_on":1229,"modified_on":1574,"name":1575,"slug":1576,"description":1577,"docs_link":1578,"priority":10,"has_sdk":160,"sort":230,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1397,"show_in_spa":162,"is_file_format":162,"meta_title":10,"meta_description":10,"featured_on_web":160,"marketing_subtitle":910,"tile_subtitle":1579,"tile_description":1580,"is_enterprise":160,"is_popular":160,"primary_use_case":1581,"hierarchy_handling":1582,"best_for":1583,"file_extension":1584,"format_code_example":1585,"format_to_extension":1586,"upload_features":1587,"icon":1588,"meta_image":1589,"primary_tag":1591,"tags":1598,"integration_methods":1616,"recommended_methods":1647,"default_integration_method":1648,"faq_categories":1655,"translations":1658,"platforms_id":252},"2025-10-02T08:32:44.000Z","RESX","resx","Quickly translate and manage your RESX files with Localazy or integrate Localazy with your .NET project and enjoy a fully automated localization process. ","\u002Fdocs\u002Fcli\u002Fresx-format",".NET localization","Translate .NET projects using RESX files and Localazy.","Standard format for Windows\u002F.NET localization","Flat key-value structure",".NET applications",".resx","```\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Croot>\n  \u003Cdata name=\"localazy_message\" xml:space=\"preserve\">\n    \u003Cvalue>Go international, today. With Localazy.\u003C\u002Fvalue>\n  \u003C\u002Fdata>\n\u003C\u002Froot>\n```",{"resx":1576},[],{"id":1493},{"id":1590},"1f07bf83-9363-47d6-b21b-a5121c0efaf6",{"id":33,"status":5,"sort":37,"created_on":944,"label":1331,"hidden":160,"icon":1592,"translations":1593},{"id":1333},[1594,1595,1596,1597],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},[1599,1606],{"id":33,"status":5,"sort":37,"label":1331,"hidden":160,"created_on":944,"icon":1600,"translations":1601},{"id":1333},[1602,1603,1604,1605],{"id":33,"languages_code":925,"label":1331},{"id":356,"languages_code":927,"label":1337},{"id":484,"languages_code":930,"label":1339},{"id":574,"languages_code":933,"label":1331},{"id":247,"status":5,"sort":252,"label":1607,"hidden":162,"created_on":944,"icon":10,"translations":1608},"C#",[1609,1610,1612,1614],{"id":247,"languages_code":925,"label":1607},{"id":1611,"languages_code":927,"label":1607},103,{"id":1613,"languages_code":930,"label":1607},108,{"id":1615,"languages_code":933,"label":1607},113,[1617,1623,1633,1640],{"id":33,"status":5,"sort":41,"label":771,"alternative_label":10,"slug":775,"description":954,"documentation_link":955,"loc_icon":775,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1618},[1619,1620,1621,1622],{"id":33,"languages_code":925,"label":771,"description":954,"slug":775},{"id":959,"languages_code":927,"label":771,"description":960,"slug":775},{"id":782,"languages_code":933,"label":771,"description":962,"slug":775},{"id":565,"languages_code":930,"label":771,"description":964,"slug":775},{"id":25,"status":5,"sort":37,"label":966,"alternative_label":10,"slug":967,"description":968,"documentation_link":969,"loc_icon":970,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1624},[1625,1626,1627,1628,1629,1630,1631,1632],{"id":25,"languages_code":925,"label":966,"description":968,"slug":967},{"id":291,"languages_code":927,"label":974,"description":975,"slug":10},{"id":484,"languages_code":933,"label":966,"description":968,"slug":967},{"id":451,"languages_code":930,"label":978,"description":979,"slug":10},{"id":402,"languages_code":927,"label":981,"description":982,"slug":967},{"id":411,"languages_code":933,"label":966,"description":968,"slug":967},{"id":684,"languages_code":930,"label":978,"description":979,"slug":967},{"id":986,"languages_code":987,"label":988,"description":989,"slug":10},{"id":20,"status":5,"sort":33,"label":991,"alternative_label":992,"slug":993,"description":994,"documentation_link":995,"loc_icon":996,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1634},[1635,1636,1637,1638,1639],{"id":20,"languages_code":925,"label":991,"description":994,"slug":993},{"id":218,"languages_code":927,"label":1000,"description":1001,"slug":10},{"id":382,"languages_code":933,"label":991,"description":994,"slug":993},{"id":1004,"languages_code":930,"label":1005,"description":1006,"slug":10},{"id":1008,"languages_code":987,"label":1009,"description":1010,"slug":10},{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1641},[1642,1643,1644,1645,1646],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[],{"id":4,"status":5,"sort":25,"label":1012,"alternative_label":759,"slug":540,"description":1013,"documentation_link":1014,"loc_icon":540,"is_official_plugin":160,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1649},[1650,1651,1652,1653,1654],{"id":4,"languages_code":925,"label":1012,"description":1013,"slug":540},{"id":207,"languages_code":927,"label":1018,"description":1019,"slug":540},{"id":374,"languages_code":933,"label":1012,"description":1013,"slug":540},{"id":443,"languages_code":930,"label":1022,"description":1023,"slug":540},{"id":1025,"languages_code":987,"label":1026,"description":1027,"slug":10},[1656],{"id":356,"status":5,"created_on":1657,"sort":10,"slug":1576,"label":1575,"on_faq_index":10},"2022-08-01T16:44:06.000Z",[1659],{"languages_code":925,"name":1575,"slug":1576,"description":1577,"support_type":1397,"meta_title":10,"meta_description":10,"marketing_subtitle":910,"tile_subtitle":1579,"tile_description":1580,"id":252,"platforms_id":252,"docs_link":1578},{"id":661,"status":5,"created_on":1661,"modified_on":1662,"name":664,"slug":663,"description":1663,"docs_link":1664,"priority":10,"has_sdk":10,"sort":662,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1665,"show_in_spa":162,"is_file_format":10,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":1665,"tile_subtitle":1665,"tile_description":1666,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":10,"upload_features":10,"icon":1667,"meta_image":1668,"primary_tag":1670,"tags":1682,"integration_methods":1726,"recommended_methods":1746,"default_integration_method":1747,"faq_categories":1754,"translations":1757,"platforms_id":661},"2022-06-16T09:08:11.000Z","2026-04-27T18:16:54.000Z","Enjoy seamless integration of Strapi & Localazy and translate your website efficiently. Download the official Localazy plugin in the Strapi Marketplace to get started!","\u002Fdocs\u002Fstrapi\u002Fstrapi-plugin-introduction","Localization Plugin","Localize your Strapi website with our official localization plugin. Easy setup and installation.",{"id":666},{"id":1669},"5995b721-a2ea-487e-ad4b-298a489bbd24",{"id":19,"status":5,"sort":15,"created_on":944,"label":1671,"hidden":160,"icon":1672,"translations":1674},"CMS",{"id":1673},"1172a655-928c-4594-9263-d8afdfd9cd79",[1675,1676,1678,1680],{"id":19,"languages_code":925,"label":1671},{"id":1677,"languages_code":927,"label":1671},73,{"id":1679,"languages_code":930,"label":1671},81,{"id":1681,"languages_code":933,"label":1671},84,[1683,1695,1707,1714],{"id":99,"status":5,"sort":95,"label":1684,"hidden":160,"created_on":944,"icon":10,"translations":1685},"Multilingual SEO",[1686,1687,1690,1693],{"id":99,"languages_code":925,"label":1684},{"id":1688,"languages_code":927,"label":1689},89,"SEO multilingüe",{"id":1691,"languages_code":930,"label":1692},94,"Vícejazyčné SEO",{"id":1694,"languages_code":933,"label":1684},99,{"id":535,"status":5,"sort":535,"label":302,"hidden":160,"created_on":944,"icon":1696,"translations":1698},{"id":1697},"e782ed3f-d954-45ca-8b17-5bf5fe95f30a",[1699,1700,1703,1705],{"id":535,"languages_code":925,"label":302},{"id":1701,"languages_code":927,"label":1702},132,"Comercio electrónico",{"id":1704,"languages_code":930,"label":302},137,{"id":1706,"languages_code":933,"label":302},142,{"id":19,"status":5,"sort":15,"label":1671,"hidden":160,"created_on":944,"icon":1708,"translations":1709},{"id":1673},[1710,1711,1712,1713],{"id":19,"languages_code":925,"label":1671},{"id":1677,"languages_code":927,"label":1671},{"id":1679,"languages_code":930,"label":1671},{"id":1681,"languages_code":933,"label":1671},{"id":20,"status":5,"sort":41,"label":1715,"hidden":160,"created_on":944,"icon":1716,"translations":1718},"Marketing tools",{"id":1717},"098fe6a4-dd2e-42d8-937e-2d8121e6e266",[1719,1720,1723,1725],{"id":20,"languages_code":925,"label":1715},{"id":1721,"languages_code":927,"label":1722},43,"Herramientas de marketing",{"id":431,"languages_code":930,"label":1724},"Marketingové nástroje",{"id":509,"languages_code":933,"label":1715},[1727],{"id":53,"status":5,"sort":10,"label":1728,"alternative_label":1729,"slug":1730,"description":1731,"documentation_link":1732,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1734},"Official Strapi Plugin","Official Plugin","official-strapi-plugin","Our developers maintain an official Strapi localization plugin. Start in a few clicks!","\u002Fdocs\u002Fstrapi","localazy-box",[1735,1736,1739,1740,1743],{"id":53,"languages_code":925,"label":1728,"description":1731,"slug":1730},{"id":1721,"languages_code":927,"label":1737,"description":1738,"slug":10},"Complemento Oficial de Strapi","Nuestros desarrolladores mantienen un complemento oficial de localización de Strapi. ¡Empiece en unos pocos clics!",{"id":500,"languages_code":933,"label":1728,"description":1731,"slug":1730},{"id":574,"languages_code":930,"label":1741,"description":1742,"slug":10},"Oficiál Plugin Strapi","Naši vývojáři udržují a neustále vylepšují oficiální lokalizační plugin Strapi. Začněte několika kliknutími!",{"id":1688,"languages_code":987,"label":1744,"description":1745,"slug":10},"Offizielles Strapi-Plugin","Unsere Entwickler pflegen ein offizielles Strapi-Lokalisierungs-Plugin. Starten Sie mit ein paar Klicks!",[],{"id":53,"status":5,"sort":10,"label":1728,"alternative_label":1729,"slug":1730,"description":1731,"documentation_link":1732,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1748},[1749,1750,1751,1752,1753],{"id":53,"languages_code":925,"label":1728,"description":1731,"slug":1730},{"id":1721,"languages_code":927,"label":1737,"description":1738,"slug":10},{"id":500,"languages_code":933,"label":1728,"description":1731,"slug":1730},{"id":574,"languages_code":930,"label":1741,"description":1742,"slug":10},{"id":1688,"languages_code":987,"label":1744,"description":1745,"slug":10},[1755],{"id":207,"status":5,"created_on":1756,"sort":10,"slug":663,"label":664,"on_faq_index":10},"2022-06-16T09:24:13.000Z",[1758],{"languages_code":925,"name":664,"slug":663,"description":1663,"support_type":1665,"meta_title":10,"meta_description":10,"marketing_subtitle":1665,"tile_subtitle":1665,"tile_description":1666,"id":661,"platforms_id":661,"docs_link":1664},{"id":451,"status":5,"created_on":1229,"modified_on":1760,"name":671,"slug":670,"description":10,"docs_link":1761,"priority":10,"has_sdk":160,"sort":443,"highlighted":160,"in_menu":162,"changefreq":10,"support_type":1762,"show_in_spa":162,"is_file_format":160,"meta_title":10,"meta_description":10,"featured_on_web":162,"marketing_subtitle":1763,"tile_subtitle":1764,"tile_description":1765,"is_enterprise":160,"is_popular":162,"primary_use_case":10,"hierarchy_handling":10,"best_for":10,"file_extension":10,"format_code_example":10,"format_to_extension":10,"upload_features":1766,"icon":1767,"meta_image":1768,"primary_tag":1770,"tags":1783,"integration_methods":1791,"recommended_methods":1804,"default_integration_method":1805,"faq_categories":1811,"translations":1812,"platforms_id":451},"2024-12-20T15:00:22.000Z","\u002Fdocs\u002Fintegrations\u002Fquick-start-figma","plugin","Figma plugin","Localization plugin","Quickly translate your Figma designs and seamlessly reuse the translations during the development of your project.",[],{"id":673},{"id":1769},"7573fed6-8817-4cb4-84d2-be327e6c4891",{"id":25,"status":5,"sort":45,"created_on":944,"label":1771,"hidden":160,"icon":1772,"translations":1774},"Design tools",{"id":1773},"1053d863-b690-4fbd-aadf-dbf2ba282768",[1775,1776,1779,1782],{"id":25,"languages_code":925,"label":1771},{"id":1777,"languages_code":927,"label":1778},42,"Herramientas de diseño",{"id":1780,"languages_code":930,"label":1781},49,"Nástroje pro návrh",{"id":557,"languages_code":933,"label":1771},[1784],{"id":25,"status":5,"sort":45,"label":1771,"hidden":160,"created_on":944,"icon":1785,"translations":1786},{"id":1773},[1787,1788,1789,1790],{"id":25,"languages_code":925,"label":1771},{"id":1777,"languages_code":927,"label":1778},{"id":1780,"languages_code":930,"label":1781},{"id":557,"languages_code":933,"label":1771},[1792],{"id":45,"status":5,"sort":10,"label":1729,"alternative_label":1729,"slug":1793,"description":1794,"documentation_link":85,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1795},"official-plugin","Our developers maintain an official plugin for this integration. Start in a few clicks!",[1796,1797,1800,1801],{"id":45,"languages_code":925,"label":1729,"description":1794,"slug":1793},{"id":280,"languages_code":927,"label":1798,"description":1799,"slug":10},"Plugin Oficial","Nuestros desarrolladores mantienen un plugin oficial para esta integración. ¡Empiece con unos pocos clics!",{"id":271,"languages_code":933,"label":1729,"description":1794,"slug":1793},{"id":464,"languages_code":930,"label":1802,"description":1803,"slug":10},"Oficiální Plugin","Naši vývojáři udržují a neustále vylepšují oficiální plugin pro tuto integraci. Začněte několika kliknutími!",[],{"id":45,"status":5,"sort":10,"label":1729,"alternative_label":1729,"slug":1793,"description":1794,"documentation_link":85,"loc_icon":1733,"is_official_plugin":162,"is_universal_plugin":160,"universal_plugin_vendor":10,"translations":1806},[1807,1808,1809,1810],{"id":45,"languages_code":925,"label":1729,"description":1794,"slug":1793},{"id":280,"languages_code":927,"label":1798,"description":1799,"slug":10},{"id":271,"languages_code":933,"label":1729,"description":1794,"slug":1793},{"id":464,"languages_code":930,"label":1802,"description":1803,"slug":10},[],[1813],{"languages_code":925,"name":671,"slug":670,"description":10,"support_type":1762,"meta_title":10,"meta_description":10,"marketing_subtitle":1763,"tile_subtitle":1764,"tile_description":1765,"id":451,"platforms_id":451,"docs_link":1761},{"id":1815,"owner":1816,"created_by":10,"sort":10,"title":1821,"slug":1822,"modified_on":877,"created_on":1823,"pinned":160,"badge":10,"priority":1824,"main_image":1825,"status":5,"tags":1826,"dictionary":1837,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"69e62c567ab1270001ede506",{"id":1817,"first_name":1818,"last_name":877,"slug":1819,"avatar":1820},"6824a22d63350c0001d5a5d4","Stephanie Casale","stephanie-casale","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F03\u002FStephanie.png","4 Arabic localization assumptions that fail in the real world, told by a Marine Corps linguist","4-arabic-localization-assumptions-that-fail-told-by-a-marine-corps-linguist","2026-06-09T17:41:36.000+02:00","0.7","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F06\u002FArabicLocal---Marine-Corps-5.png",[1827,1830,1834],{"id":451,"created_on":1828,"status":5,"label":352,"slug":1829,"on_index_page":162},"2026-06-10 14:08:25","localization",{"id":1831,"created_on":1828,"status":5,"label":1832,"slug":1833,"on_index_page":160},646,"Business Development","business-development",{"id":451,"created_on":1828,"status":5,"label":1835,"slug":1836,"on_index_page":160},"Locales","locales",[],0,{"id":1840,"owner":1841,"created_by":10,"sort":10,"title":1846,"slug":1847,"modified_on":877,"created_on":1848,"pinned":160,"badge":10,"priority":1824,"main_image":1849,"status":5,"tags":1850,"dictionary":1856,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"69d78a237ab1270001eddabf",{"id":1842,"first_name":1843,"last_name":877,"slug":1844,"avatar":1845},"606c233dcf7b6a0001d1da93","Petr Hodný","petr-hodny","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fpetr.png","Translation API: Translate your content on the fly with Localazy AI!","translation-api-translate-your-content-on-the-fly-with-localazy-ai","2026-04-24T09:27:26.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2026\u002F04\u002FLocalazy-AI-translation-api.png",[1851,1852,1855],{"id":451,"created_on":1828,"status":5,"label":771,"slug":775,"on_index_page":160},{"id":402,"created_on":1828,"status":5,"label":1853,"slug":1854,"on_index_page":162},"AI","ai",{"id":451,"created_on":1828,"status":5,"label":352,"slug":1829,"on_index_page":162},[],{"post":1858,"relatedPosts":2074,"banner":2134},{"id":1859,"owner":1860,"created_by":10,"sort":10,"title":1865,"slug":1866,"modified_on":1867,"created_on":1868,"pinned":162,"badge":10,"priority":1824,"main_image":1869,"status":5,"tags":1870,"dictionary":1883,"reading_time":99,"excerpt":1976,"og_title":877,"og_description":877,"og_image":877,"content":1977,"meta_title":877,"meta_description":877,"canonical":1978,"cta":1979,"fullGhostPost":1987},"62456353df4bcb00010bf0f7",{"id":1861,"first_name":1862,"last_name":877,"slug":1863,"avatar":1864},"6092822ecf7b6a0001d1dab3","David Václavek","david-vaclavek","\u002F\u002Fwww.gravatar.com\u002Favatar\u002F90788a3f3dc9558a151a87d7fe096592?s=250&d=mm&r=x","Automated Localization of Laravel Projects with Localazy and GitHub Actions","automated-localization-laravel-projects-localazy-github-actions","2026-04-16T16:23:53.000+02:00","2022-04-07T14:02:04.000+02:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FLaravel-GH.png",[1871,1874,1878,1880],{"id":451,"created_on":1828,"status":5,"label":1872,"slug":1873,"on_index_page":160},"Laravel","laravel",{"id":1875,"created_on":1828,"status":5,"label":1876,"slug":1877,"on_index_page":160},613703526,"PHP","php",{"id":451,"created_on":1828,"status":5,"label":1879,"slug":125,"on_index_page":160},"GitHub",{"id":451,"created_on":1828,"status":5,"label":1881,"slug":1882,"on_index_page":160},"HowTo","howto",[1884,1891,1904,1918,1932,1943,1958,1967],{"id":1885,"status":5,"owner":1886,"created_on":1887,"title":1872,"excerpt":1888,"content":1889,"slug":1873,"meta_title":10,"meta_description":10,"canonical":10,"related_terms":1890},86,"2bac48a8-b362-482f-b574-3bc71dca4c5b","2022-03-17T12:22:55.000Z","Laravel is an open-source PHP framework for web application development. ","Laravel is among the most used PHP frameworks for web development, available for free as an open-source project under the MIT license. The first release was published by Laravel's founder, Taylor Otwell, in February 2012.\n\nLearn more about Laravel on the official website: https:\u002F\u002Flaravel.com\u002F \n\nLocalize your [Laravel](\u002Flaravel) app and integrate it with Localazy.  ",[],{"id":468,"status":5,"owner":1886,"created_on":1892,"title":1893,"excerpt":1894,"content":1895,"slug":1896,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1897},"2026-05-12T07:09:23.000Z","Integrated Development Environment (IDE)","A software application that provides developers with a complete set of tools for writing, testing, and debugging code in one place.","An IDE (Integrated Development Environment) typically includes a source code editor, compiler or interpreter, build automation tools (such as Gradle for Android), a debugger, and a system for managing libraries and plugins.\n\nThese features let the IDEs streamline the software development process and reduce the need to switch between multiple standalone tools.\n\n### 🧩 What are the core features of IDEs?\n\n* **Source code editor**: Syntax highlighting, auto-completion, and error detection.\n* **Compiler\u002FInterpreter**: Translates code into executable programs.\n* **Build automation**: Tools like Gradle or Maven to manage builds and dependencies.\n* **Debugger**: Identifies and resolves code errors step by step.\n* **Plugin & library support**: Extend functionality for specific frameworks or languages.\n* **Version control integration**: Built-in Git support for collaboration.\n\n### ⚙️ Examples of IDEs\n\n* [**Android Studio**](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fandroid-studio): The official IDE for Android development.\n* [**IntelliJ IDEA**](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fintellij-idea): Popular for Java, Kotlin, and multi-language support.\n* [**NetBeans**](https:\u002F\u002Fwww.oracle.com\u002Ftools\u002Ftechnologies\u002Fnetbeans-ide.html): Open-source, focused on Java and PHP development.\n* [**Eclipse**](https:\u002F\u002Feclipseide.org\u002F): Widely used, extensible through plugins, especially in enterprise projects.\n\nPlacing the full toolkit in one environment allows IDEs to accelerate coding tasks, simplify project management, and raise code consistency.","integrated-development-kit-ide",[1898,1900,1902],{"id":331,"slug":1899},"gradle",{"id":257,"slug":1901},"android-studio",{"id":574,"slug":1903},"intellij-idea",{"id":1905,"status":5,"owner":1886,"created_on":1892,"title":1906,"excerpt":1907,"content":1908,"slug":1909,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1910},79,"Internationalization (i18n)","The process of making your software localizable.","Internationalization (i18n) is the process of preparing software, digital products, and content so they can be easily adapted for various languages, regions, and cultures without requiring extensive reengineering.\n\nThis foundational step ensures that a product can be efficiently localized to meet the needs of different global markets. To internationalize your software, you need to pay attention to technical requirements. The code structure and design has to be prepared to allow for [localization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Flocalization).\n\nIt involves considering various linguistic and cultural factors during the initial design and development phases. This process should start, ideally, in the design phase. For example, you may want to have externalised strings so you can bring your strings to the translation management tool.\n\nEvery business looking to expand their reach and provide User Experiences (UX) across diverse markets needs to consider internationalization and then localization.\n\n## 🌐 Key points about internationalization (i18n): \n\n* Internationalization involves creating flexible and adaptable designs that accommodate various languages, scripts, and cultural norms.\n* By preparing content and software for localization, internationalization simplifies the process of translating and adapting products for specific markets.\n* This process includes using Unicode, supporting different character sets, and ensuring compatibility with various regional formats (dates, currencies, etc.).\n* Investing in internationalization upfront reduces the time and cost associated with localizing products for multiple markets.\n\nBy prioritizing internationalization, companies can create products that are more versatile and ready for global distribution, ensuring they meet the needs of international users effectively.","internationalization",[1911,1912,1914,1916],{"id":20,"slug":1829},{"id":33,"slug":1913},"translation",{"id":37,"slug":1915},"globalization",{"id":57,"slug":1917},"gilt",{"id":1613,"status":5,"owner":1886,"created_on":1919,"title":648,"excerpt":1920,"content":1921,"slug":647,"meta_title":10,"meta_description":10,"canonical":10,"related_terms":1922},"2022-03-17T12:22:56.000Z","JSON stands for JavaScript Object Notation and it's a widely used file format.","JSON is a lightweight format for storing and transporting data originally specified by Douglas Crockford in the early 2000s. It is often used when data is sent from a server to a web page.  It is \"self-describing\" and highly understandable, as it is easy for humans to read and write and for machines to parse and generate.\n\nThis programming language is independent but it is derived from the JavaScript\u002FECMAScript programming language and uses the conventions familiar to programmers of the C series of languages ​​(including C, C++, C#, Java, JavaScript, Perl, and Python).\n\nJSON is one of the best localizable file formats you can use to store your project's externalized strings. Localazy fully supports and lets you manage and translate your JSON files. \n\n## Further reading:\n- [Quick Start - JSON](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fquick-start-json)\n- [File Format - JSON](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\u002Fjson-format)\n- [JavaScript app localization with i18next and Localazy](https:\u002F\u002Flocalazy.com\u002Fblog\u002Fjavascript-app-localization-i18next-localazy)",[1923,1925,1927,1929],{"id":252,"slug":1924},"java",{"id":451,"slug":1926},"externalized-string",{"id":1928,"slug":640},75,{"id":1930,"slug":1931},83,"python",{"id":20,"status":5,"owner":1886,"created_on":1933,"title":352,"excerpt":1934,"content":1935,"slug":1829,"meta_title":10,"meta_description":10,"canonical":10,"related_terms":1936},"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.",[1937,1938,1939,1940,1942],{"id":20,"slug":1829},{"id":33,"slug":1913},{"id":57,"slug":1917},{"id":291,"slug":1941},"translation-management-system-tms",{"id":1905,"slug":1909},{"id":71,"status":5,"owner":1886,"created_on":1944,"title":1945,"excerpt":1946,"content":1947,"slug":448,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1948},"2026-05-12T07:09:22.000Z","Machine translation (MT)","The process of translating using computational linguistics.","A machine translation engine is a software tool that translates a text from one language to another without the help of human translators.\n\nMachine translation, also known as MT, is widely used as the first round of translations and is frequently very effective for short strings. However, it can produce unsatisfactory results when context knowledge is required, and thus, a human review is always advised.\n\n### 💬 Methods used in machine translation\n\nMachine translation engines recently experienced huge improvements related to the advanced use of neural networks, but they generally rely on these different methods:\n\n* [Statistical machine translation (SMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fstatistical-machine-translation\u002F \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fstatistical-machine-translation\u002F\")\n* [Example-based machine translation (EBMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fexample-based-machine-translation \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fexample-based-machine-translation\")\n* [Hybrid machine translation (HMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fhybrid-machine-translation \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fhybrid-machine-translation\")\n* [Neural machine translation (NMT)](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fneural-machine-translation\u002F \"https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fneural-machine-translation\u002F\")\n\nNeural machine translation (used by [AI-powered translation](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fai-powered-translation) engines) is the most sophisticated type of instant translation today. It uses machine learning to improve its translation capabilities. As the engine translates more text with each request, the better results it produces with time by learning. Most instant translation services use this technology.\n\n### 🔍 What's the difference between HAMT and MAHT?\n\nWithin the realm of machine translation, it’s important to distinguish between **Human-Assisted Machine Translation (HAMT)** and **Machine-Assisted Human Translation (MAHT)**:\n\n* [**Human-Assisted Machine Translation (HAMT)**](\u002Fdictionary\u002Fhuman-assisted-mt): This process involves a human reviewing translations generated by machine translation (MT) engines. It is also known as MT plus post-editing and\u002For pre-editing. The machine handles the initial translation, which is then edited by a human to improve accuracy and context. This approach is useful for projects with repetitive content and where budget or time constraints are significant.\n* [**Machine-Assisted Human Translation (MAHT)**](\u002Fdictionary\u002Fmaht): In this method, human translators use computer software to aid their work. Translators receive machine translation suggestions, but they decide how to use them. This approach allows for high translation accuracy while benefiting from features like translation glossaries and memories, which enhance the efficiency and consistency of the translation process.\n\n### 🦾 MT engines available in Localazy \n\nLocalazy users can use the most popular and advanced [MT engines](https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fmachine-translation \"https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Fmachine-translation\") to translate their content:\n\n* Amazon Translate (available for free)\n* Google Translate\n* DeepL\n* Azure Translator\n* OpenAI (ChatGPT), with your own API key\n\n> *Users can unlock different engines depending on the plan they buy. See our [pricing](https:\u002F\u002Flocalazy.com\u002Fpricing) and [docs](https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fadditional-mt-engines?srsltid=AfmBOoo--lURSBHDiHEoe3rYL3xSQHaZcTsl6kd7wwUYRGC-sGTTmG94 \"https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fgeneral\u002Fadditional-mt-engines?srsltid=AfmBOoo--lURSBHDiHEoe3rYL3xSQHaZcTsl6kd7wwUYRGC-sGTTmG94\") for more details.*\n\n### 📚 Additional resources:\n\n* [What is machine translation?](https:\u002F\u002Fwww.gala-global.org\u002Fwhat-machine-translation)\n* [History of machine translation](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHistory_of_machine_translation)",[1949,1951,1953,1955],{"id":570,"slug":1950},"maht",{"id":1681,"slug":1952},"mtpe-machine-translation-post-editing",{"id":1615,"slug":1954},"deepl",{"id":1956,"slug":1957},136,"human-assisted-mt",{"id":33,"status":5,"owner":1886,"created_on":1933,"title":419,"excerpt":1959,"content":1960,"slug":1913,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1961},"The process of transforming a text into another language.","Translation (t9n) helps people understand a given term in their native language and is a vital part of the [localization](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Flocalization) (l10n) process.\n\nThe localization process is often the most tedious one during software developement, as you can’t just introduce a few locale-based rules in your source code.\n\nTranslating texts to another language is hard. You need to know context\u002Fmeaning. You can translate a word quickly, but without context, you can translate it the wrong way. For example, the term “book” can mean “reserve” or “piece of literature” in the Czech language. Both translations are correct, but which one is valid for a button? Context provides the right meaning.\n\n## [ISO definition of the term \"translation\"](https:\u002F\u002Fwww.iso.org\u002Fobp\u002Fui\u002F#iso:std:iso:17100:ed-1:v1:en)\n\nSet of processes to render source language content into target language content in written form.",[1962,1963,1964,1965,1966],{"id":20,"slug":1829},{"id":45,"slug":465},{"id":71,"slug":448},{"id":291,"slug":1941},{"id":1905,"slug":1909},{"id":291,"status":5,"owner":1886,"created_on":1887,"title":1968,"excerpt":1969,"content":1970,"slug":1941,"meta_title":877,"meta_description":877,"canonical":877,"related_terms":1971},"Translation Management System (TMS)","A software for translation process automation.","TMS help increase production efficiency by eliminating, automating, and delegating both one-time and repetitive tasks during the translation process. Translation management systems help teams manage multilingual content, assign tasks, track progress, and maintain translation quality. TMS platforms are widely used in localization projects to handle large amounts of text efficiently. \n\nThey support features like translation memories, glossaries, and automated workflows. This makes the translation process faster and more consistent, especially for businesses that need content in multiple languages. [CAT tools](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fcat-tool) are a subtype of TMSs.\n\nTranslation management systems [like Localazy](https:\u002F\u002Flocalazy.com\u002Fterm\u002Ftranslation-management-system) usually consist of two parts. One takes care of workflow management and the second one aids with the translation process using different technologies and methods, such as:\n\n* [Machine translation](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fmachine-translation)\n* [Translation Memory](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Ftranslation-memory)\n\nThese systems are ideal for large-scale translation projects, as they provide a vast range of features. \n\n## ☝️ Top features of a TMS:\n\n* Centralizes translation tasks in one platform.\n* Assigns jobs to translators and tracks progress.\n* Uses a translation memory to avoid repeated translations.\n* Ensures consistency with built-in term bases.\n* Helps companies scale content across languages.\n\nWith a TMS, teams can work together smoothly to manage translations. It provides the tools needed to keep projects on track and ensures high-quality results every time. However, they can be pricey for single users or small teams who may benefit from them as well, especially for [quality assurance](https:\u002F\u002Flocalazy.com\u002Fdictionary\u002Fqa-quality-assurance) processes.",[1972,1973,1975],{"id":45,"slug":465},{"id":15,"slug":1974},"cat-tool",{"id":71,"slug":448},"Learn how to fully automate the localization of your Laravel projects with Localazy and GitHub actions in this article. ","\u003Ch2 id=\"introduction\">👋 Introduction \u003Ca class=\"markdownit-header-anchor\" href=\"#introduction\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Any developer who has encountered the challenge of localization at least once will tell you that it's a tedious job. I think we can agree that taking care of multiple language versions just isn't as fun as introducing new features to the product you love. And we are not talking only about internationalization but also about managing translators, handling different versions, translation ping-pong, and the countless revisions. That's why localization is often neglected and buried deep in the backlog. \u003C\u002Fp>\u003Cp>What if we told you that you could completely automate the localization process with \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002F\">Localazy\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions\">GitHub Actions\u003C\u002Fa>? And by completely, we mean \u003Cstrong>completely\u003C\u002Fstrong>. \u003C\u002Fp>\u003Cblockquote>❓ \u003Cstrong>What's Localazy?\u003C\u002Fstrong> Localazy is a complete localization suite built with developers in mind. Localazy allows you to fully automate the localization of your Laravel projects. Set it up once and forget about the hassle forever.\u003C\u002Fblockquote>\u003Cp>\u003Cstrong>You will learn how to:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>install the Laravel Framework and run your first application,\u003C\u002Fli>\u003Cli>set up your Git repository,\u003C\u002Fli>\u003Cli>prepare your Laravel project for localization,\u003C\u002Fli>\u003Cli>connect it with Localazy and translate it into multiple languages,\u003C\u002Fli>\u003Cli>automate string uploads and translation downloads with GitHub Actions.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"install-laravel-framework\">⌨️ Install Laravel framework \u003Ca class=\"markdownit-header-anchor\" href=\"#install-laravel-framework\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>There are a couple of ways to \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Finstallation\">install\u003C\u002Fa> Laravel (choose the one that suits you and your OS). Typically, you'd probably use composer to install the framework. But as I use macOS and want to keep my laptop as clean as possible, I chose to install Laravel via \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Finstallation#getting-started-on-macos\">curl\u003C\u002Fa>, which downloads a containerized application. \u003C\u002Fp>\u003Cp>This is a huge advantage if you're developing on a Mac and have \u003Ca href=\"https:\u002F\u002Fwww.docker.com\u002Fproducts\u002Fdocker-desktop\">Docker Desktop\u003C\u002Fa> up and running - and we know the benefits of dockerized applications (for everyone interested, I recommend reading \u003Ca href=\"https:\u002F\u002Fwww.amazon.com\u002Fdp\u002FB01LXWQUFF\">Docker Deep Dive: Zero to Docker in a single book\u003C\u002Fa>).\u003C\u002Fp>\u003Cp>Let's install the application. I typed \u003Ccode>laravel-i18n-gh-actions-example\u003C\u002Fcode> as the name of my app.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">curl -s \"https:\u002F\u002Flaravel.build\u002Flaravel-i18n-gh-actions-example\" | bash\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1293\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Installing Laravel via curl\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>The application is shipped with \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fsail#introduction\">Laravel Sail\u003C\u002Fa>, which was introduced with Laravel 8. It's a command-line interface for interacting with Laravel's default Docker development environment. Sail provides a way for building a Laravel application without requiring prior Docker experience.\u003C\u002Fp>\u003Ch2 id=\"run-the-laravel-application\">🕹️ Run the Laravel application \u003Ca class=\"markdownit-header-anchor\" href=\"#run-the-laravel-application\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Alright, the project is created. It's time to run the application. Navigate to the application directory and start Laravel Sail.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">cd laravel-i18n-gh-actions-example &amp;&amp; .\u002Fvendor\u002Fbin\u002Fsail up\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1293\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Running the Laravel Sail\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>This process runs the application. It can take a while for the first time as application containers need to be built, so be patient. It's good to note - if you're a Docker expert - everything about Sail can be customized using the \u003Ccode>docker-compose.yml\u003C\u002Fcode> file included with Laravel. \u003C\u002Fp>\u003Cp>After the application's Docker containers have been started, you can access the application in your web browser at: \u003Ca href=\"http:\u002F\u002Flocalhost\u002F\">\u003Ccode>http:\u002F\u002Flocalhost\u003C\u002Fcode>\u003C\u002Fa>. You should see a screen similar to the one below.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Laravel application up and running\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"setup-git-what-do-we-want-to-achieve\">🏷️ Setup Git - what do we want to achieve? \u003Ca class=\"markdownit-header-anchor\" href=\"#setup-git-what-do-we-want-to-achieve\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>In the following steps, we'll prepare our git repository for the workflow we'll set up later. As you can imagine, there are dozens of workflows suitable for different types of apps - it all depends on your needs.\u003C\u002Fp>\u003Cp>I'd like to show you a relatively simple example so that you can understand the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions\">GitHub Actions\u003C\u002Fa>. The following steps won't make much sense if you don't know what I want to achieve. So what is it?\u003C\u002Fp>\u003Cp>\u003Cstrong>Imagine this workflow: \u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>We have two main branches, \u003Ccode>develop\u003C\u002Fcode> and \u003Ccode>master\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>then, for every task we work on, we create a new branch (depending on the task title - name it \u003Ccode>foo\u003C\u002Fcode> for our \u003Cem>foo simple task\u003C\u002Fem>),\u003C\u002Fli>\u003Cli>in \u003Ccode>foo\u003C\u002Fcode> branch, we define new \u003Ca href=\"\u002Ffaq\u002Fpricing\u002Fwhat-are-source-keys\">source keys\u003C\u002Fa> as we work on the task,\u003C\u002Fli>\u003Cli>when it's ready, we create a pull request to \u003Ccode>develop\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>at this point, we want the source keys to be uploaded &amp; synced to Localazy for translation,\u003C\u002Fli>\u003Cli>meanwhile, translators can work on translations,\u003C\u002Fli>\u003Cli>then, when it's time to release the app, we will create a pull request from \u003Ccode>develop\u003C\u002Fcode> to \u003Ccode>master\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>now, when we accept the PR and therefore push to \u003Ccode>master\u003C\u002Fcode> branch, we want to download the translations (in localization files) and push them to master with the code, and most likely run some other tasks (like test the app, build\u002Fship the app, ...) - depending on your needs,\u003C\u002Fli>\u003Cli>then, everything is ready.\u003C\u002Fli>\u003C\u002Ful>\u003Ch3 id=\"create-and-initialize-the-git-repository\">Create & initialize the Git repository \u003Ca class=\"markdownit-header-anchor\" href=\"#create-and-initialize-the-git-repository\">🔗\u003C\u002Fa>\u003C\u002Fh3>\u003Cp>Now we need to set up a Git. Go to your GitHub and create an empty repository. Copy the remote address and init git in our Laravel project.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git init\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, add a new remote and paste the copied address.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git remote add origin git@github.com:localazy\u002Flaravel-i18n-gh-actions-example.git\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Let's push the project to \u003Ccode>master\u003C\u002Fcode> branch. I use VSCode, so I've done it all in the user interface as it's more convenient, at least for me.\u003C\u002Fp>\u003Cp> Then, create a \u003Ccode>develop\u003C\u002Fcode> branch and switch to it. Publish the branch to remote.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git switch -c develop\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now, create a \u003Ccode>foo\u003C\u002Fcode> branch and switch there. Our Laravel-related code things will be happening here. We'll get there in a moment.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git switch -c foo\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"prepare-blade-templates-and-source-translation-files\">🍃 Prepare Blade templates & source translation file(s) \u003Ca class=\"markdownit-header-anchor\" href=\"#prepare-blade-templates-and-source-translation-files\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>We're in the \u003Ccode>foo\u003C\u002Fcode> branch, it's time to prepare the \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fblade#introduction\">Blade template\u003C\u002Fa> for \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#introduction\">localization\u003C\u002Fa>. There are two main approaches to localizing Laravel applications. One uses \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#using-translation-strings-as-keys\">PHP files\u003C\u002Fa>, and the second one uses \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#using-translation-strings-as-keys\">JSON files\u003C\u002Fa>. You can also combine them both together, which might also be a use case in your project.\u003C\u002Fp>\u003Cp>Anyway, in this example, we're going to use \u003Ccode>php\u003C\u002Fcode> files. Translation files are located in the \u003Ccode>lang\u003C\u002Fcode> directory in the application root. As our source language is English, create a new file in the \u003Ccode>en\u003C\u002Fcode> directory called \u003Ccode>welcome.php\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-php\">return [\n    'laravel' =&gt; 'Laravel',\n    'home' =&gt; 'Home',\n    'log_in' =&gt; 'Log in',\n    'register' =&gt; 'Register',\n    'documentation' =&gt; 'Documentation',\n    'documentation_text' =&gt; 'Laravel has wonderful, thorough documentation covering every aspect of the framework. Whether you are new to the framework or have previous experience with Laravel, we recommend reading all of the documentation from beginning to end.',\n    'laracasts' =&gt; 'Laracasts',\n    'laracasts_text' =&gt; 'Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.',\n    'laravel_news' =&gt; 'Laravel News',\n    'laravel_news_text' =&gt; 'Laravel News is a community driven portal and newsletter aggregating all of the latest and most important news in the Laravel ecosystem, including new package releases and tutorials.',\n    'vibrant_ecosystem' =&gt; 'Vibrant Ecosystem',\n    'vibrant_ecosystem_text' =&gt; 'Laravel\\'s robust library of first-party tools and libraries, such as &lt;a href=\"https:\u002F\u002Fforge.laravel.com\" class=\"underline\"&gt;Forge&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Fvapor.laravel.com\" class=\"underline\"&gt;Vapor&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Fnova.laravel.com\" class=\"underline\"&gt;Nova&lt;\u002Fa&gt;, and &lt;a href=\"https:\u002F\u002Fenvoyer.io\" class=\"underline\"&gt;Envoyer&lt;\u002Fa&gt; help you take your projects to the next level. Pair them with powerful open source libraries like &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fbilling\" class=\"underline\"&gt;Cashier&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fdusk\" class=\"underline\"&gt;Dusk&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fbroadcasting\" class=\"underline\"&gt;Echo&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fhorizon\" class=\"underline\"&gt;Horizon&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fsanctum\" class=\"underline\"&gt;Sanctum&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Ftelescope\" class=\"underline\"&gt;Telescope&lt;\u002Fa&gt;, and more.',\n    'shop' =&gt; 'Shop',\n    'sponsor' =&gt; 'Sponsor',\n    'laravel_version' =&gt; 'Laravel v:version',\n    'php_version' =&gt; '(PHP v:version)',\n];\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>lang\u002Fen\u002Fwelcome.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>For the sake of being specific, we can ignore \u003Ccode>json\u003C\u002Fcode> translation files, so create a \u003Ccode>.gitignore\u003C\u002Fcode> in the \u003Ccode>lang\u003C\u002Fcode> directory.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-plaintext\"># ignore json files\n*.json\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>lang\u002F.gitignore\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>As you can notice, the \u003Ccode>welcome.php\u003C\u002Fcode> file now contains keyed texts from the \u003Ccode>welcome.blade.php\u003C\u002Fcode> template. Now, replace the strings in the template for the keys we're just defined. Let me mention a couple of examples:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>&lt;title&gt;Laravel&lt;\u002Ftitle&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;title&gt;{{ __('welcome.laravel') }}\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>&lt;div ...&gt;&lt;a ...&gt;Documentation&lt;\u002Fa&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;div ...&gt;&lt;a ...{{ __('welcome.documentation') }}&lt;\u002Fa&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>&lt;div ...&gt;Laravel's robust library of...&lt;\u002Fdiv&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;div ...&gt;{!! __('welcome.vibrant_ecosystem_text') !!}&lt;\u002Fdiv&gt;\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>&lt;div ...&gt;Laravel v{{ Illuminate\\Foundation\\Application::VERSION }} (PHP v{{ PHP_VERSION }})&lt;\u002Fdiv&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;div ...&gt;{ __('welcome.laravel_version', ['version' =&gt; Illuminate\\Foundation\\Application::VERSION]) }} {{ __('welcome.php_version', ['version' =&gt; PHP_VERSION]) }}&lt;\u002Fdiv&gt;\u003C\u002Fcode>.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>The first two examples are pretty straightforward; this is standard syntax for displaying the translation string.\u003C\u002Fp>\u003Cp>In the third example, we have to tell Blade not to escape the data. Although, you should be careful when echoing unescaped content as your app might then be vulnerable to XSS attacks.\u003C\u002Fp>\u003Cp>Fourth example replaces placeholders we use in the \u003Ccode>welcome.php\u003C\u002Fcode> source language file (\u003Ccode>:version\u003C\u002Fcode>). To replace the placeholder in the Blade template, pass an array of replacements as the second argument to the \u003Ccode>__\u003C\u002Fcode> function.\u003C\u002Fp>\u003Cblockquote>You can find even more examples including plurals, creating a language switcher (and more detailed explanation) in a great article about \u003Ca href=\"\u002Fblog\u002Flaravel-multilingual-i18n-php-localazy\">How to build a multilingual PHP app with Localazy and Laravel\u003C\u002Fa> written by \u003Ca href=\"\u002Fblog\u002Fauthor\u002Ffrancisco-melo\">Francisco Melo\u003C\u002Fa>, which was my starting point and an inspiration for composing this post.\u003C\u002Fblockquote>\u003Cp>Just to test it out, if we refresh our page now - it should look exactly the same as before externalization.\u003C\u002Fp>\u003Ch2 id=\"connect-laravel-application-to-localazy-project\">💞 Connect Laravel application to Localazy project \u003Ca class=\"markdownit-header-anchor\" href=\"#connect-laravel-application-to-localazy-project\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Go to the \u003Ca href=\"\u002Fregister\">Localazy signup\u003C\u002Fa> page and create a free account or \u003Ca href=\"\u002Flogin\">log in\u003C\u002Fa> (if you have already joined our community). Then, name your organization and create a new project. \u003C\u002Fp>\u003Cp>Select English as the source language. Also, you can enable the \u003Cem>Use community translations (\u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-sharetm\">ShareTM\u003C\u002Fa>) \u003C\u002Fem>option to get some strings translated automatically by Localazy.\u003C\u002Fp>\u003Cp>On the integrations page, select \u003Ca href=\"\u002Flaravel\">Laravel integration\u003C\u002Fa>. Copy the piece of code to the clipboard.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy.com - Laravel integration page\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>In your project root, create a file called \u003Ccode>localazy.json\u003C\u002Fcode>. This file serves as a config file for \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fthe-basics\">Localazy CLI\u003C\u002Fa>. The example above (which we'll modify to our needs) is one of the simplest forms of config. There are many ways how to adjust the \u003Ccode>localazy.json\u003C\u002Fcode> file to your needs, everything is described in detail in our \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fthe-basics\">documentation\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Paste the code into \u003Ccode>localazy.json\u003C\u002Fcode>. This file should be pushed to the Git repository. Although, we should not push the secrets like \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode>. What do we do? Create one more file in the project root named \u003Ccode>localazy.keys.json\u003C\u002Fcode>, then cut &amp; paste keys into it. After that, add the latter file to \u003Ccode>.gitignore\u003C\u002Fcode>, also located in the project root.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-plaintext\"># other .gitignore contents...\n\n# Localazy keys\nlocalazy.keys.json\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>.gitignore\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"update-localazyjson-to-fit-our-application\">⚙️ Update localazy.json to fit our application \u003Ca class=\"markdownit-header-anchor\" href=\"#update-localazyjson-to-fit-our-application\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Next, we have to tweak the \u003Ccode>localazy.json\u003C\u002Fcode> file a little bit in order for everything to work correctly. This is the final look:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-json\">{\n    \"upload\": {\n      \"type\": \"php\",\n      \"files\": \"lang\u002Fen\u002F**.php\"\n    },\n    \"download\": {\n      \"files\": \"lang\u002F${lang}\u002F${file}\"\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy.json\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Let me explain: As I've already mentioned, I moved the \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode> to a separate file, so it's not here anymore. Property called \u003Ccode>upload.files\u003C\u002Fcode> has changed. The value says that we want to upload all the \u003Ccode>php\u003C\u002Fcode> files from \u003Ccode>lang\u002Fen\u003C\u002Fcode> directory. Files serve as source language files. A detailed explanation can be found in the \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fupload-reference\">Upload reference\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>There's a similar change in the \u003Ccode>download.files\u003C\u002Fcode> section as well. The value of this property instructs CLI to download files with the same name as the uploaded file (placeholder \u003Ccode>${file}\u003C\u002Fcode>). Also, files should be grouped into folders by language (placeholder \u003Ccode>${lang}\u003C\u002Fcode>). All possible options described in detail can be found in the \u003Ca href=\"\u002Fdocs\u002Fcli\u002Fdownload-reference\">Download reference\u003C\u002Fa>. \u003C\u002Fp>\u003Cp>Alright, commit and push our progress; it's time for the next step.\u003C\u002Fp>\u003Ch2 id=\"optional-test-upload-locally\">☝️ Optional: Test upload locally \u003Ca class=\"markdownit-header-anchor\" href=\"#optional-test-upload-locally\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Just a reminder - we want to automate our workflow with GitHub Actions. If you don't want to test it locally, skip to the next section. But sometimes, developers would like to test the translations during development (I also wanted to make sure I set up everything properly before getting into GitHub actions). So, if you're interested, I'll show you how.\u003C\u002Fp>\u003Cp>There are many ways to \u003Ca href=\"\u002Fdocs\u002Fcli\u002Finstallation\">install the Localazy CLI\u003C\u002Fa> (depending on several factors). I wanted to use the \u003Ca href=\"\u002Fdocs\u002Fcli\u002Finstallation#docker\">Docker image\u003C\u002Fa> to test it out, but unfortunately, Apple Silicon chips are not supported yet, therefore I used an \u003Ca href=\"\u002Fdocs\u002Fcli\u002Finstallation#npm\">installation via NPM\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Localazy advises to install the package to the system globally, although I installed it in the project folder.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npm install @localazy\u002Fcli\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>After that, to test the upload, use:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy upload -s\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The parameter \u003Ccode>-s\u003C\u002Fcode> stands for simulate. It won't actually upload the strings to Localazy, but CLI will certainly tell you if anything possibly went wrong. All good, everything is set up correctly! We can proceed to GitHub Actions.\u003C\u002Fp>\u003Ch2 id=\"add-secrets-to-our-repository\">🤫 Add secrets to our repository \u003Ca class=\"markdownit-header-anchor\" href=\"#add-secrets-to-our-repository\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>To make GitHub Actions work, we need to create secrets in our repository. Why? Later, when we will be using \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Flocalazy-upload\">Localazy Upload\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Flocalazy-download\">Localazy Download\u003C\u002Fa> Actions, we need them to read \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode> from somewhere (in order to access our Localazy project properly). And as we do not want them to be pushed into the repository (reasons described earlier in the article), we'll add them as secrets.\u003C\u002Fp>\u003Cp>In repo, navigate to \u003Ccode>Settings -&gt; Secrets -&gt; Actions\u003C\u002Fcode>. I named the secrets \u003Ccode>LOCALAZY_READ_KEY\u003C\u002Fcode> and \u003Ccode>LOCALAZY_WRITE_KEY\u003C\u002Fcode> respectively. Assign both its \u003Ccode>readKey\u003C\u002Fcode>\u002F\u003Ccode>writeKey\u003C\u002Fcode> value, our configuration should look like this.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1564\" height=\"382\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png 1564w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>laravel-i18n-gh-actions-example repository secrets\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"automate-upload-with-github-actions\">📤 Automate Upload with GitHub Actions \u003Ca class=\"markdownit-header-anchor\" href=\"#automate-upload-with-github-actions\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>In our IDE, create a \u003Ccode>.github\u002Fworkflows\u002Fupload.yml\u003C\u002Fcode> file. Alternatively, you could do it all from a repository, go to \u003Ccode>Actions -&gt; New workflow -&gt; Setup a workflow yourself\u003C\u002Fcode>. Name it \u003Ccode>upload.yml\u003C\u002Fcode>, add the workflow code below and just push it. \u003C\u002Fp>\u003Cp>This is what the code should look like:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-yml\">name: Localazy Upload\n\non:\n  push:\n    branches: [ develop ]\n    paths: [ lang\u002Fen\u002F**.php ]\n\n  pull_request:\n    branches: [ develop ]\n    paths: [ lang\u002Fen\u002F**.php ]\n\n  workflow_dispatch:\n\njobs:\n  localazy-upload:\n    name: Upload source language strings to Localazy\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\u002Fcheckout@v3\n      - uses: localazy\u002Fupload@v1\n        with:\n          read_key: ${{ secrets.LOCALAZY_READ_KEY }}\n          write_key: ${{ secrets.LOCALAZY_WRITE_KEY }}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>.github\u002Fworkflows\u002Fupload.yml\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Let's dig into the file and explain it. Just to remind you, the general purpose of this action is to upload new source language strings to Localazy on \u003Ccode>push\u003C\u002Fcode> or \u003Ccode>pull_request\u003C\u002Fcode> in(to) \u003Ccode>develop\u003C\u002Fcode> branch. \u003C\u002Fp>\u003Cp>Facts:\u003C\u002Fp>\u003Cul>\u003Cli>We assigned a human-readable name \u003Cem>Localazy Upload\u003C\u002Fem> to the action,\u003C\u002Fli>\u003Cli>the \u003Ccode>on\u003C\u002Fcode> controls when the workflow will run,\u003C\u002Fli>\u003Cli>we want to trigger the workflow on \u003Ccode>push\u003C\u002Fcode> or \u003Ccode>pull_request\u003C\u002Fcode> into \u003Ccode>develop\u003C\u002Fcode> branch (given by \u003Ccode>branches: [ develop ]\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>at the same time, we want to trigger the workflow only if any of the source language files changed (given by \u003Ccode>paths: [ lang\u002Fen\u002F**.php ]\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we'd also like to allow running the workflow manually from the Actions tab (\u003Ccode>workflow_dispatch:\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we defined one \u003Ccode>job\u003C\u002Fcode> (a workflow run is made up of one or more jobs that can run sequentially or in parallel),\u003C\u002Fli>\u003Cli>this \u003Ccode>job\u003C\u002Fcode> is called \u003Ccode>localazy-upload\u003C\u002Fcode> and has it's human-readable name \u003Cem>Upload source language strings to Localazy\u003C\u002Fem> (which then is displayed in GitHub Actions Workflow),\u003C\u002Fli>\u003Cli>we specified that the type of runner that the job will run on is \u003Ccode>ubuntu-latest\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>job\u003C\u002Fcode> consists of two steps - a sequence of tasks that will be executed as part of the job,\u003C\u002Fli>\u003Cli>first step \u003Ccode>actions\u002Fcheckout@v3\u003C\u002Fcode> checks out your repository under \u003Ccode>$GITHUB_WORKSPACE\u003C\u002Fcode>, so your job can access it (documentation \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fcheckout\">here\u003C\u002Fa>)\u003C\u002Fli>\u003Cli>second step \u003Ccode>localazy\u002Fupload@v1\u003C\u002Fcode> reads the config from \u003Ccode>localazy.json\u003C\u002Fcode> and processes upload \u003Ccode>with\u003C\u002Fcode> using \u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode> values are read from \u003Ccode>secrets.LOCALAZY_READ_KEY\u003C\u002Fcode> and \u003Ccode>secrets.LOCALAZY_WRITE_KEY\u003C\u002Fcode> variables respectively.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Let's test the workflow now. In our \u003Ccode>foo\u003C\u002Fcode> branch, commit and push all the changes we've made. Go to GitHub and make a pull request to \u003Ccode>develop\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1156\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Create pull request develop &lt;- foo\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>As soon as the pull request is created, our workflow is triggered. You can tell by \u003Cem>Some checks haven't completed yet\u003C\u002Fem>. Also, there's an orange circle next to \u003Cem>Localazy Upload\u003C\u002Fem> workflow, which means it's running.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1155\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Pull request with running workflow\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Clicking on \u003Cem>Details\u003C\u002Fem>, we can display the details of the steps of the workflow which is currently running.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1154\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Upload workflow result\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Everything processed correctly! You can also click on an arrow next to each step to see its details. For example, if we click on \u003Cem>Run localazy\u002Fupload@v1\u003C\u002Fem> action output.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-plaintext\">Localazy CLI, v1.6.0\nCommand-line tool for the Localazy platform.\n\nRead more information at https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\n\nParameters:\n  - deprecate missing: no\n  - import as new: false\n  - force current: false\n  - filter source: true\n  - app version: 0\n  - groups: (default only)\n  - folder: .\n\nProcessing files...\n\nlang\u002Fen\u002Fwelcome.php\n(file: welcome.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fvalidation.php\n(file: validation.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fauth.php\n(file: auth.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fpasswords.php\n(file: passwords.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fpagination.php\n(file: pagination.php, lang: inherited, type: php)\n\nVerifying...\n\nValidating...\n\nUploading 3 kB...\n\nUpload results: 126 added, 0 updated, 0 deprecated\nUsing 397 out of 45000 source keys\n\nYour app on Localazy: https:\u002F\u002Flocalazy.com\u002Fp\u002Flaravel-i18n-gh-action-example\n\nDone.\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy\u002Fupload@v1 action output\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Great, let's go to the application in Localazy and check the \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#importing-through-file-management\">File Management\u003C\u002Fa> section. As we could see, all files are available there.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1153\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy - File management\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"translate-your-texts-in-localazy\">🚩 Translate your texts in Localazy \u003Ca class=\"markdownit-header-anchor\" href=\"#translate-your-texts-in-localazy\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Now, add a couple of languages and translate and approve some phrases. \u003C\u002Fp>\u003Cp>Localazy offers three approaches to choose from and combine to translate your project: \u003C\u002Fp>\u003Col>\u003Cli>💪🏻 \u003Cstrong>Translate on your own or invite contributors - \u003C\u002Fstrong>You can \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings\">start translating on your own\u003C\u002Fa> and use our built-in suggestion system. \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Ftranslating-strings#:~:text=a%20different%20purpose.-,Suggestions,-%2D%20translations%20from%20ShareTM\">Suggestions\u003C\u002Fa> are drawn from the most popular \u003Ca href=\"\u002Fdictionary\u002Fmachine-translation\">machine translation\u003C\u002Fa> engines and the ShareTM mentioned above. To get some additional help as your project grows, you can \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles\">invite volunteers or translators you already know\u003C\u002Fa>.\u003C\u002Fli>\u003Cli>🦾 \u003Cstrong>Translate everything in bulk via machine translation - \u003C\u002Fstrong>With the Localazy \u003Ca href=\"\u002Ftiers\u002Fautopilot\">Autopilot plan\u003C\u002Fa>, you can translate whole files instantly by \u003Ca href=\"\u002Fdocs\u002Fgeneral\u002Fadditional-mt-engines#mt-pre-translate\">running a machine translation over the content\u003C\u002Fa>. This is great for the first iteration and localization testing. \u003C\u002Fli>\u003Cli>🚩 \u003Cstrong>Fully automate the translation process with the \u003Ca href=\"\u002Ffeatures\u002Fcontinuous-localization-team\">Continuous Localization\u003C\u002Fa> services\u003C\u002Fstrong> - Once your Localazy integration is set up, you can order translations from our vetted translators and get your project translated by professionals automatically. The service is also proactive, so you don't have to micromanage translators, and you can visit Localazy only once in a while to check the progress.\u003C\u002Fli>\u003C\u002Fol>\u003Cp>For our purposes, I translated \u003Ccode>welcome.php\u003C\u002Fcode> it into \u003Cem>Czech\u003C\u002Fem>,\u003Cem> German, \u003C\u002Fem>and\u003Cem> Spanish.\u003C\u002Fem> You can see it all in the following two screenshots.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1156\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy - List of languages\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1157\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy - Language phrases list\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>To summarize, from now on, on every pull request or push to develop, all new or updated source keys will be uploaded to Localazy ready to be translated.\u003C\u002Fp>\u003Cp>Now, we can merge the pull request and close the \u003Ccode>foo\u003C\u002Fcode> branch. Then in our IDE, switch back to \u003Ccode>develop\u003C\u002Fcode> branch and \u003Ccode>pull\u003C\u002Fcode> updates.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git switch develop &amp;&amp; git pull\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"automate-download-with-github-actions\">📥 Automate Download with GitHub Actions \u003Ca class=\"markdownit-header-anchor\" href=\"#automate-download-with-github-actions\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>Similarly to upload, we need to create another workflow. Go to the project IDE and create a \u003Ccode>download.yml\u003C\u002Fcode> file in \u003Ccode>.github\u002Fworkflows\u003C\u002Fcode> directory.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-yml\">name: Localazy Download\non:\n  push:\n    branches: [ master ]\n    \n  workflow_dispatch:\n\njobs:\n  localazy-download:\n    name: Download strings from Localazy\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v3\n        with:\n          fetch-depth: 0\n      - uses: localazy\u002Fdownload@v1\n        with:\n          read_key: ${{ secrets.LOCALAZY_READ_KEY }}\n          write_key: ${{ secrets.LOCALAZY_WRITE_KEY }}\n      - run: |\n          ls lang\u002F**\u002F**.php\n      - run: |\n          git config --local user.email \"david@localazy.com\"\n          git config --local user.name \"david-vaclavek[bot]\"\n          git add lang\n          git commit -m \"Add locale files\" -a\n      - uses: ad-m\u002Fgithub-push-action@master\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          branch: master\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>.github\u002Fworkflows\u002Fdownload.yml\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>To have the workflows in our blood, let's go through the file once again:\u003C\u002Fp>\u003Cul>\u003Cli>We assigned a human-readable name \u003Cem>Localazy Download\u003C\u002Fem> to the action,\u003C\u002Fli>\u003Cli>the \u003Ccode>on\u003C\u002Fcode> controls when the workflow will run,\u003C\u002Fli>\u003Cli>we want to trigger the workflow on \u003Ccode>push\u003C\u002Fcode> to \u003Ccode>master\u003C\u002Fcode> branch (given by \u003Ccode>branches: [ master ]\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we like to allow to run the workflow manually from the Actions tab (\u003Ccode>workflow_dispatch:\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we defined one \u003Ccode>job\u003C\u002Fcode> (a workflow run is made up of one or more jobs that can run sequentially or in parallel),\u003C\u002Fli>\u003Cli>this \u003Ccode>job\u003C\u002Fcode> is called \u003Ccode>localazy-download\u003C\u002Fcode> and has its human-readable name \u003Cem>Download strings from Localazy\u003C\u002Fem> (which then is displayed in GitHub Actions Workflow),\u003C\u002Fli>\u003Cli>we specified that the type of runner that the job will run on is \u003Ccode>ubuntu-latest\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>job\u003C\u002Fcode> consists of five steps - a sequence of tasks that will be executed as part of the job,\u003C\u002Fli>\u003Cli>first step \u003Ccode>actions\u002Fcheckout@v3\u003C\u002Fcode> checks out your repository under \u003Ccode>$GITHUB_WORKSPACE\u003C\u002Fcode>, so your job can access it (documentation \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fcheckout\">here\u003C\u002Fa>)\u003C\u002Fli>\u003Cli>because we will be pushing into another repository, we need to use it \u003Ccode>with\u003C\u002Fcode> \u003Ccode>fetch-depth: 0\u003C\u002Fcode> to prevent errors pushing refs to the destination repository (more information on that can be found in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fgithub-push\">GitHub Push\u003C\u002Fa> action documentation),\u003C\u002Fli>\u003Cli>the second step \u003Ccode>localazy\u002Fdownload@v1\u003C\u002Fcode> reads the \u003Ccode>download\u003C\u002Fcode> config from \u003Ccode>localazy.json\u003C\u002Fcode> and processes download from Localazy \u003Ccode>with\u003C\u002Fcode> using \u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode> values are read from \u003Ccode>secrets.LOCALAZY_READ_KEY\u003C\u002Fcode> and \u003Ccode>secrets.LOCALAZY_WRITE_KEY\u003C\u002Fcode> variables respectively,\u003C\u002Fli>\u003Cli>the third step can be skipped, but I just wanted to show you a list of files that were downloaded (\u003Ccode>ls lang\u002F**\u002F.php\u003C\u002Fcode> command),\u003C\u002Fli>\u003Cli>the fourth step sets up a git configuration (\u003Ccode>user.email\u003C\u002Fcode>, \u003Ccode>user.name\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>it also adds all the (new) files from \u003Ccode>lang\u003C\u002Fcode> repository into staging area (\u003Ccode>git add lang\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>then it commits all the added files,\u003C\u002Fli>\u003Cli>fifth step uses action called \u003Ccode>ad-m\u002Fgithub-push-action@master\u003C\u002Fcode>, which I've found browsing \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace?category=&amp;query=&amp;type=actions&amp;verification=\">GitHub Actions Marketplace\u003C\u002Fa> and is documented \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fgithub-push\">here\u003C\u002Fa>,\u003C\u002Fli>\u003Cli>this action pushes previously committed files into \u003Ccode>master\u003C\u002Fcode> branch using \u003Ccode>secrets.GITHUB_TOKEN\u003C\u002Fcode> variable (\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fautomatic-token-authentication#about-the-github_token-secret\">more info about \u003C\u002Fa>\u003Ccode>\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fautomatic-token-authentication#about-the-github_token-secret\">GITHUB_TOKEN\u003C\u002Fa>\u003C\u002Fcode>\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fautomatic-token-authentication#about-the-github_token-secret\"> secret\u003C\u002Fa>).\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Generally speaking, \u003Ccode>GITHUB_TOKEN\u003C\u002Fcode> secret is here for security reasons and is created at the start of each workflow run by GitHub. It can be used to authenticate in a workflow run. When the \u003Ccode>job\u003C\u002Fcode> finishes, it expires.\u003C\u002Fp>\u003Cp>Okay, now it's time to test our workflow. First, push the newly created file \u003Ccode>download.yml\u003C\u002Fcode> to remote. Let's create another pull request, this time to \u003Ccode>master\u003C\u002Fcode>. This time, there's no workflow running when we create a pull request - that's exactly what we wanted.\u003C\u002Fp>\u003Cp>But as soon as we merge the pull request, our workflow will be triggered. When it finishes, we can go through the details of each step. For example, we can see what files we downloaded by \u003Ccode>localazy\u002Fdownload@v1\u003C\u002Fcode> action.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1155\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Download workflow result\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>When we check our repository, we can see that the \u003Ccode>master\u003C\u002Fcode> branch was updated with the new localization files, leaving the \u003Ccode>develop\u003C\u002Fcode> branch without them. And that's exactly what we wanted to do in this example.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1156\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>lang folder in the master branch\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cblockquote>Most of the steps regarding GitHub Actions were taken from \u003Ca href=\"\u002Fblog\u002Fautomated-localization-github-actions-localazy\">Automated Localization: GitHub Actions ❤ Localazy\u003C\u002Fa> article made by \u003Ca href=\"\u002Fblog\u002Fauthor\u002Fvaclav-hodek\">Václav Hodek\u003C\u002Fa> - thank you for the inspiration.\u003C\u002Fblockquote>\u003Ch2 id=\"the-last-step-see-our-translated-application\">🎉 The last step - see our translated application \u003Ca class=\"markdownit-header-anchor\" href=\"#the-last-step-see-our-translated-application\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>We got to the end of this article. But it wouldn't be completed without showing you the result. We need to tweak the Laravel web \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Frouting#basic-routing\">routing\u003C\u002Fa> a bit so it takes passed language into account. Normally, you'd work in a separate branch (maybe \u003Ccode>foo2\u003C\u002Fcode>?), merge it to \u003Ccode>develop\u003C\u002Fcode>, test it, then merge it to \u003Ccode>master\u003C\u002Fcode> or so... But for our purposes, let's just quickly test it.\u003C\u002Fp>\u003Cp>Let's switch to \u003Ccode>master\u003C\u002Fcode> in your IDE and \u003Ccode>git pull\u003C\u002Fcode> the changes. Go to \u003Ccode>routes\u002Fweb.php\u003C\u002Fcode>. In this file, you can register web routes for the application. Update the code:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-php\">&lt;?php\n\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::get('\u002F{locale?}', function ($locale = null) {\n    if (isset($locale)) {\n        app()-&gt;setLocale($locale);\n    }\n\n    return view('welcome');\n});\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>routes\u002Fweb.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>With the code above, we tell the app to set its locale if there's a \u003Ccode>locale\u003C\u002Fcode> parameter in the path. That's it, the rest of it is done automatically. Try some of these URLs:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fen\">localhost\u002Fen\u003C\u002Fa>\u003C\u002Fcode> (or simply \u003Ccode>\u003Ca href=\"localhost\">localhost\u003C\u002Fa>\u003C\u002Fcode>)\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in English, the source language\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fes\">localhost\u002Fes\u003C\u002Fa>\u003C\u002Fcode>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in Spanish, translated by Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fde\">localhost\u002Fde\u003C\u002Fa>\u003C\u002Fcode>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in German, translated by Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cul>\u003Cli>\u003Ca href=\"localhost\u002Fcs\">\u003Ccode>localhost\u002Fcs\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1123\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in Czech, translated by Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fpl\">localhost\u002Fpl\u003C\u002Fa>\u003C\u002Fcode> - oops, there's a fallback to English, which is set as a default language (more on that \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#configuring-the-locale\">here\u003C\u002Fa>)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>To see if some translations are missing without visiting Localazy, you can use the \u003Ca href=\"https:\u002F\u002Flaravel-news.com\u002Flaravel-translations-checker\">Laravel Translation Checker\u003C\u002Fa>. This way, you can be comfortably tucked in your IDE and fully focus on building your Laravel project. But we hope you will say hi and see what's new inside Localazy from time to time. \u003C\u002Fp>\u003Ch2 id=\"source-code\">🎁 Source Code \u003Ca class=\"markdownit-header-anchor\" href=\"#source-code\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>The source code of this demo project is available on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flocalazy\u002Flaravel-i18n-gh-actions-example\">GitHub\u003C\u002Fa>. Do not forget to explore the content of the \u003Ccode>.github\u002Fworkflows\u003C\u002Fcode> folder!\u003C\u002Fp>\u003Ch2 id=\"localize-your-laravel-project-and-get-rewarded\">🏆 Localize your Laravel project and get rewarded! \u003Ca class=\"markdownit-header-anchor\" href=\"#localize-your-laravel-project-and-get-rewarded\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>If you were looking for a way to finally localize your Laravel project and got inspired by this article, we would love to hear your story and \u003Ca href=\"\u002Ftags\u002Finterview\">feature your product on our blog\u003C\u002Fa>. Bookmark this article and \u003Ca href=\"\u002Fcommunity\u002Fshake-hands\u002Fpublish-interview\">fill in the interview form\u003C\u002Fa> once you get Localazy up and running.\u003C\u002Fp>\u003Cp>💰 \u003Cstrong>Bounty offer\u003C\u002Fstrong>: If you think you could find a better way of integrating Localazy with the Laravel Framework and would like to develop your own integration, library, or utility, \u003Ca href=\"\u002Fcommunity\u002Fb2b-partnerships\u002Fcustom-integrations\">let us know\u003C\u002Fa>!\u003C\u002Fp>\u003Ch2 id=\"lessstronggreaterconclusionlessstronggreater\">✔️ \u003Cstrong>Conclusion\u003C\u002Fstrong> \u003Ca class=\"markdownit-header-anchor\" href=\"#lessstronggreaterconclusionlessstronggreater\">🔗\u003C\u002Fa>\u003C\u002Fh2>\u003Cp>We hope you liked this article showing the power of Localazy and GitHub Actions for Laravel localization. We believe that anything that can be automated, should be automated, and localization is one of those things.\u003C\u002Fp>\u003Cp>Feel free to contact us at \u003Ca href=\"mailto:team@localazy.com\" rel=\"noopener noreferrer\">team@localazy.com\u003C\u002Fa> if you have any questions regarding this tutorial or Localazy in general. You can also \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FCAVhHrh\" rel=\"noopener noreferrer\">join the Localazy Discord\u003C\u002Fa> to see what other developers using Localazy are up to or \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FLocalazy-Community\" rel=\"noopener noreferrer\">accept our invitation to the Localazy Community on GitHub\u003C\u002Fa> where you will find more community-sourced assets for your Laravel projects you can contribute to. Looking forward to meeting you there!\u003C\u002Fp>","https:\u002F\u002Flaravel-news.com\u002Flocalazy-github-actions",{"id":19,"status":5,"created_on":1980,"modified_on":1981,"icon":1982,"header":1983,"description":1984,"button_label":1985,"link":1986},"2022-03-17T12:23:03.000Z","2023-01-19T11:50:04.000Z","member","Automate your localization today! ⚙️","Translate your project in a breeze, utilize the advanced features and fully automate your localization process with Localazy! ","Join Localazy","register",{"slug":1866,"id":1859,"uuid":1988,"title":1865,"html":1989,"comment_id":1859,"feature_image":1869,"featured":162,"visibility":1990,"email_recipient_filter":1991,"created_at":1992,"updated_at":1867,"published_at":1868,"custom_excerpt":1976,"codeinjection_head":1993,"codeinjection_foot":10,"custom_template":10,"canonical_url":1978,"authors":1994,"tags":2000,"primary_author":2071,"primary_tag":2072,"url":2073,"excerpt":1976,"reading_time":95,"access":162,"send_email_when_published":160,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"email_subject":10,"frontmatter":10,"dictionary":1883,"cta":1979,"plainTags":1870},"7b17dda7-9daa-4dff-acef-e31e2b701fcf","\u003Ch2 id=\"%F0%9F%91%8B-introduction\">👋 Introduction\u003C\u002Fh2>\u003Cp>Any developer who has encountered the challenge of localization at least once will tell you that it's a tedious job. I think we can agree that taking care of multiple language versions just isn't as fun as introducing new features to the product you love. And we are not talking only about internationalization but also about managing translators, handling different versions, translation ping-pong, and the countless revisions. That's why localization is often neglected and buried deep in the backlog. \u003C\u002Fp>\u003Cp>What if we told you that you could completely automate the localization process with \u003Ca href=\"https:\u002F\u002Flocalazy.com\u002F\">Localazy\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions\">GitHub Actions\u003C\u002Fa>? And by completely, we mean \u003Cstrong>completely\u003C\u002Fstrong>. \u003C\u002Fp>\u003Cblockquote>❓ \u003Cstrong>What's Localazy?\u003C\u002Fstrong> Localazy is a complete localization suite built with developers in mind. Localazy allows you to fully automate the localization of your Laravel projects. Set it up once and forget about the hassle forever.\u003C\u002Fblockquote>\u003Cp>\u003Cstrong>You will learn how to:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>install the Laravel Framework and run your first application,\u003C\u002Fli>\u003Cli>set up your Git repository,\u003C\u002Fli>\u003Cli>prepare your Laravel project for localization,\u003C\u002Fli>\u003Cli>connect it with Localazy and translate it into multiple languages,\u003C\u002Fli>\u003Cli>automate string uploads and translation downloads with GitHub Actions.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"%E2%8C%A8%EF%B8%8F-install-laravel-framework\">⌨️ Install Laravel framework\u003C\u002Fh2>\u003Cp>There are a couple of ways to \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Finstallation\">install\u003C\u002Fa> Laravel (choose the one that suits you and your OS). Typically, you'd probably use composer to install the framework. But as I use macOS and want to keep my laptop as clean as possible, I chose to install Laravel via \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Finstallation#getting-started-on-macos\">curl\u003C\u002Fa>, which downloads a containerized application. \u003C\u002Fp>\u003Cp>This is a huge advantage if you're developing on a Mac and have \u003Ca href=\"https:\u002F\u002Fwww.docker.com\u002Fproducts\u002Fdocker-desktop\">Docker Desktop\u003C\u002Fa> up and running - and we know the benefits of dockerized applications (for everyone interested, I recommend reading \u003Ca href=\"https:\u002F\u002Fwww.amazon.com\u002Fdp\u002FB01LXWQUFF\">Docker Deep Dive: Zero to Docker in a single book\u003C\u002Fa>).\u003C\u002Fp>\u003Cp>Let's install the application. I typed \u003Ccode>laravel-i18n-gh-actions-example\u003C\u002Fcode> as the name of my app.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">curl -s \"https:\u002F\u002Flaravel.build\u002Flaravel-i18n-gh-actions-example\" | bash\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1293\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.53.50.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Installing Laravel via curl\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>The application is shipped with \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fsail#introduction\">Laravel Sail\u003C\u002Fa>, which was introduced with Laravel 8. It's a command-line interface for interacting with Laravel's default Docker development environment. Sail provides a way for building a Laravel application without requiring prior Docker experience.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%95%B9%EF%B8%8F-run-the-laravel-application\">🕹️ Run the Laravel application\u003C\u002Fh2>\u003Cp>Alright, the project is created. It's time to run the application. Navigate to the application directory and start Laravel Sail.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">cd laravel-i18n-gh-actions-example &amp;&amp; .\u002Fvendor\u002Fbin\u002Fsail up\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1293\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-14.54.41.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Running the Laravel Sail\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>This process runs the application. It can take a while for the first time as application containers need to be built, so be patient. It's good to note - if you're a Docker expert - everything about Sail can be customized using the \u003Ccode>docker-compose.yml\u003C\u002Fcode> file included with Laravel. \u003C\u002Fp>\u003Cp>After the application's Docker containers have been started, you can access the application in your web browser at: \u003Ca href=\"http:\u002F\u002Flocalhost\u002F\">\u003Ccode>http:\u002F\u002Flocalhost\u003C\u002Fcode>\u003C\u002Fa>. You should see a screen similar to the one below.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-11.09.17.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Laravel application up and running\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"%F0%9F%8F%B7%EF%B8%8F-setup-gitwhat-do-we-want-to-achieve\">🏷️ Setup Git - what do we want to achieve?\u003C\u002Fh2>\u003Cp>In the following steps, we'll prepare our git repository for the workflow we'll set up later. As you can imagine, there are dozens of workflows suitable for different types of apps - it all depends on your needs.\u003C\u002Fp>\u003Cp>I'd like to show you a relatively simple example so that you can understand the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions\">GitHub Actions\u003C\u002Fa>. The following steps won't make much sense if you don't know what I want to achieve. So what is it?\u003C\u002Fp>\u003Cp>\u003Cstrong>Imagine this workflow: \u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>We have two main branches, \u003Ccode>develop\u003C\u002Fcode> and \u003Ccode>master\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>then, for every task we work on, we create a new branch (depending on the task title - name it \u003Ccode>foo\u003C\u002Fcode> for our \u003Cem>foo simple task\u003C\u002Fem>),\u003C\u002Fli>\u003Cli>in \u003Ccode>foo\u003C\u002Fcode> branch, we define new \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Ffaq\u002Fpricing\u002Fwhat-are-source-keys\">source keys\u003C\u002Fa> as we work on the task,\u003C\u002Fli>\u003Cli>when it's ready, we create a pull request to \u003Ccode>develop\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>at this point, we want the source keys to be uploaded &amp; synced to Localazy for translation,\u003C\u002Fli>\u003Cli>meanwhile, translators can work on translations,\u003C\u002Fli>\u003Cli>then, when it's time to release the app, we will create a pull request from \u003Ccode>develop\u003C\u002Fcode> to \u003Ccode>master\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>now, when we accept the PR and therefore push to \u003Ccode>master\u003C\u002Fcode> branch, we want to download the translations (in localization files) and push them to master with the code, and most likely run some other tasks (like test the app, build\u002Fship the app, ...) - depending on your needs,\u003C\u002Fli>\u003Cli>then, everything is ready.\u003C\u002Fli>\u003C\u002Ful>\u003Ch3 id=\"create-initialize-the-git-repository\">Create &amp; initialize the Git repository\u003C\u002Fh3>\u003Cp>Now we need to set up a Git. Go to your GitHub and create an empty repository. Copy the remote address and init git in our Laravel project.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git init\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, add a new remote and paste the copied address.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git remote add origin git@github.com:localazy\u002Flaravel-i18n-gh-actions-example.git\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Let's push the project to \u003Ccode>master\u003C\u002Fcode> branch. I use VSCode, so I've done it all in the user interface as it's more convenient, at least for me.\u003C\u002Fp>\u003Cp> Then, create a \u003Ccode>develop\u003C\u002Fcode> branch and switch to it. Publish the branch to remote.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git switch -c develop\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now, create a \u003Ccode>foo\u003C\u002Fcode> branch and switch there. Our Laravel-related code things will be happening here. We'll get there in a moment.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git switch -c foo\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"%F0%9F%8D%83-prepare-blade-templates-source-translation-files\">🍃 Prepare Blade templates &amp; source translation file(s)\u003C\u002Fh2>\u003Cp>We're in the \u003Ccode>foo\u003C\u002Fcode> branch, it's time to prepare the \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fblade#introduction\">Blade template\u003C\u002Fa> for \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#introduction\">localization\u003C\u002Fa>. There are two main approaches to localizing Laravel applications. One uses \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#using-translation-strings-as-keys\">PHP files\u003C\u002Fa>, and the second one uses \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#using-translation-strings-as-keys\">JSON files\u003C\u002Fa>. You can also combine them both together, which might also be a use case in your project.\u003C\u002Fp>\u003Cp>Anyway, in this example, we're going to use \u003Ccode>php\u003C\u002Fcode> files. Translation files are located in the \u003Ccode>lang\u003C\u002Fcode> directory in the application root. As our source language is English, create a new file in the \u003Ccode>en\u003C\u002Fcode> directory called \u003Ccode>welcome.php\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-php\">return [\n    'laravel' =&gt; 'Laravel',\n    'home' =&gt; 'Home',\n    'log_in' =&gt; 'Log in',\n    'register' =&gt; 'Register',\n    'documentation' =&gt; 'Documentation',\n    'documentation_text' =&gt; 'Laravel has wonderful, thorough documentation covering every aspect of the framework. Whether you are new to the framework or have previous experience with Laravel, we recommend reading all of the documentation from beginning to end.',\n    'laracasts' =&gt; 'Laracasts',\n    'laracasts_text' =&gt; 'Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.',\n    'laravel_news' =&gt; 'Laravel News',\n    'laravel_news_text' =&gt; 'Laravel News is a community driven portal and newsletter aggregating all of the latest and most important news in the Laravel ecosystem, including new package releases and tutorials.',\n    'vibrant_ecosystem' =&gt; 'Vibrant Ecosystem',\n    'vibrant_ecosystem_text' =&gt; 'Laravel\\'s robust library of first-party tools and libraries, such as &lt;a href=\"https:\u002F\u002Fforge.laravel.com\" class=\"underline\"&gt;Forge&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Fvapor.laravel.com\" class=\"underline\"&gt;Vapor&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Fnova.laravel.com\" class=\"underline\"&gt;Nova&lt;\u002Fa&gt;, and &lt;a href=\"https:\u002F\u002Fenvoyer.io\" class=\"underline\"&gt;Envoyer&lt;\u002Fa&gt; help you take your projects to the next level. Pair them with powerful open source libraries like &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fbilling\" class=\"underline\"&gt;Cashier&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fdusk\" class=\"underline\"&gt;Dusk&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fbroadcasting\" class=\"underline\"&gt;Echo&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fhorizon\" class=\"underline\"&gt;Horizon&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Fsanctum\" class=\"underline\"&gt;Sanctum&lt;\u002Fa&gt;, &lt;a href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002Ftelescope\" class=\"underline\"&gt;Telescope&lt;\u002Fa&gt;, and more.',\n    'shop' =&gt; 'Shop',\n    'sponsor' =&gt; 'Sponsor',\n    'laravel_version' =&gt; 'Laravel v:version',\n    'php_version' =&gt; '(PHP v:version)',\n];\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>lang\u002Fen\u002Fwelcome.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>For the sake of being specific, we can ignore \u003Ccode>json\u003C\u002Fcode> translation files, so create a \u003Ccode>.gitignore\u003C\u002Fcode> in the \u003Ccode>lang\u003C\u002Fcode> directory.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-plaintext\"># ignore json files\n*.json\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>lang\u002F.gitignore\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>As you can notice, the \u003Ccode>welcome.php\u003C\u002Fcode> file now contains keyed texts from the \u003Ccode>welcome.blade.php\u003C\u002Fcode> template. Now, replace the strings in the template for the keys we're just defined. Let me mention a couple of examples:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>&lt;title&gt;Laravel&lt;\u002Ftitle&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;title&gt;{{ __('welcome.laravel') }}\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>&lt;div ...&gt;&lt;a ...&gt;Documentation&lt;\u002Fa&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;div ...&gt;&lt;a ...{{ __('welcome.documentation') }}&lt;\u002Fa&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>&lt;div ...&gt;Laravel's robust library of...&lt;\u002Fdiv&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;div ...&gt;{!! __('welcome.vibrant_ecosystem_text') !!}&lt;\u002Fdiv&gt;\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>&lt;div ...&gt;Laravel v{{ Illuminate\\Foundation\\Application::VERSION }} (PHP v{{ PHP_VERSION }})&lt;\u002Fdiv&gt;\u003C\u002Fcode> ➡️ \u003Ccode>&lt;div ...&gt;{ __('welcome.laravel_version', ['version' =&gt; Illuminate\\Foundation\\Application::VERSION]) }} {{ __('welcome.php_version', ['version' =&gt; PHP_VERSION]) }}&lt;\u002Fdiv&gt;\u003C\u002Fcode>.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>The first two examples are pretty straightforward; this is standard syntax for displaying the translation string.\u003C\u002Fp>\u003Cp>In the third example, we have to tell Blade not to escape the data. Although, you should be careful when echoing unescaped content as your app might then be vulnerable to XSS attacks.\u003C\u002Fp>\u003Cp>Fourth example replaces placeholders we use in the \u003Ccode>welcome.php\u003C\u002Fcode> source language file (\u003Ccode>:version\u003C\u002Fcode>). To replace the placeholder in the Blade template, pass an array of replacements as the second argument to the \u003Ccode>__\u003C\u002Fcode> function.\u003C\u002Fp>\u003Cblockquote>You can find even more examples including plurals, creating a language switcher (and more detailed explanation) in a great article about \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fblog\u002Flaravel-multilingual-i18n-php-localazy\">How to build a multilingual PHP app with Localazy and Laravel\u003C\u002Fa> written by \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fblog\u002Fauthor\u002Ffrancisco-melo\">Francisco Melo\u003C\u002Fa>, which was my starting point and an inspiration for composing this post.\u003C\u002Fblockquote>\u003Cp>Just to test it out, if we refresh our page now - it should look exactly the same as before externalization.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%92%9E-connect-laravel-application-to-localazy-project\">💞 Connect Laravel application to Localazy project\u003C\u002Fh2>\u003Cp>Go to the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fregister\">Localazy signup\u003C\u002Fa> page and create a free account or \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Flogin\">log in\u003C\u002Fa> (if you have already joined our community). Then, name your organization and create a new project. \u003C\u002Fp>\u003Cp>Select English as the source language. Also, you can enable the \u003Cem>Use community translations (\u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Fwhat-is-localazy-sharetm\">ShareTM\u003C\u002Fa>) \u003C\u002Fem>option to get some strings translated automatically by Localazy.\u003C\u002Fp>\u003Cp>On the integrations page, select \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Flaravel\">Laravel integration\u003C\u002Fa>. Copy the piece of code to the clipboard.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-19.00.34.jpg 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy.com - Laravel integration page\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>In your project root, create a file called \u003Ccode>localazy.json\u003C\u002Fcode>. This file serves as a config file for \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fthe-basics\">Localazy CLI\u003C\u002Fa>. The example above (which we'll modify to our needs) is one of the simplest forms of config. There are many ways how to adjust the \u003Ccode>localazy.json\u003C\u002Fcode> file to your needs, everything is described in detail in our \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fthe-basics\">documentation\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Paste the code into \u003Ccode>localazy.json\u003C\u002Fcode>. This file should be pushed to the Git repository. Although, we should not push the secrets like \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode>. What do we do? Create one more file in the project root named \u003Ccode>localazy.keys.json\u003C\u002Fcode>, then cut &amp; paste keys into it. After that, add the latter file to \u003Ccode>.gitignore\u003C\u002Fcode>, also located in the project root.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-plaintext\"># other .gitignore contents...\n\n# Localazy keys\nlocalazy.keys.json\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>.gitignore\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"%E2%9A%99%EF%B8%8F-update-localazyjson-to-fit-our-application\">⚙️ Update localazy.json to fit our application\u003C\u002Fh2>\u003Cp>Next, we have to tweak the \u003Ccode>localazy.json\u003C\u002Fcode> file a little bit in order for everything to work correctly. This is the final look:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-json\">{\n    \"upload\": {\n      \"type\": \"php\",\n      \"files\": \"lang\u002Fen\u002F**.php\"\n    },\n    \"download\": {\n      \"files\": \"lang\u002F${lang}\u002F${file}\"\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy.json\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Let me explain: As I've already mentioned, I moved the \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode> to a separate file, so it's not here anymore. Property called \u003Ccode>upload.files\u003C\u002Fcode> has changed. The value says that we want to upload all the \u003Ccode>php\u003C\u002Fcode> files from \u003Ccode>lang\u002Fen\u003C\u002Fcode> directory. Files serve as source language files. A detailed explanation can be found in the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fupload-reference\">Upload reference\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>There's a similar change in the \u003Ccode>download.files\u003C\u002Fcode> section as well. The value of this property instructs CLI to download files with the same name as the uploaded file (placeholder \u003Ccode>${file}\u003C\u002Fcode>). Also, files should be grouped into folders by language (placeholder \u003Ccode>${lang}\u003C\u002Fcode>). All possible options described in detail can be found in the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Fdownload-reference\">Download reference\u003C\u002Fa>. \u003C\u002Fp>\u003Cp>Alright, commit and push our progress; it's time for the next step.\u003C\u002Fp>\u003Ch2 id=\"%E2%98%9D%EF%B8%8F-optional-test-upload-locally\">☝️ Optional: Test upload locally\u003C\u002Fh2>\u003Cp>Just a reminder - we want to automate our workflow with GitHub Actions. If you don't want to test it locally, skip to the next section. But sometimes, developers would like to test the translations during development (I also wanted to make sure I set up everything properly before getting into GitHub actions). So, if you're interested, I'll show you how.\u003C\u002Fp>\u003Cp>There are many ways to \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Finstallation\">install the Localazy CLI\u003C\u002Fa> (depending on several factors). I wanted to use the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Finstallation#docker\">Docker image\u003C\u002Fa> to test it out, but unfortunately, Apple Silicon chips are not supported yet, therefore I used an \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fcli\u002Finstallation#npm\">installation via NPM\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Localazy advises to install the package to the system globally, although I installed it in the project folder.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npm install @localazy\u002Fcli\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>After that, to test the upload, use:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">npx localazy upload -s\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>The parameter \u003Ccode>-s\u003C\u002Fcode> stands for simulate. It won't actually upload the strings to Localazy, but CLI will certainly tell you if anything possibly went wrong. All good, everything is set up correctly! We can proceed to GitHub Actions.\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%A4%AB-add-secrets-to-our-repository\">🤫 Add secrets to our repository\u003C\u002Fh2>\u003Cp>To make GitHub Actions work, we need to create secrets in our repository. Why? Later, when we will be using \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Flocalazy-upload\">Localazy Upload\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Flocalazy-download\">Localazy Download\u003C\u002Fa> Actions, we need them to read \u003Ccode>writeKey\u003C\u002Fcode> and \u003Ccode>readKey\u003C\u002Fcode> from somewhere (in order to access our Localazy project properly). And as we do not want them to be pushed into the repository (reasons described earlier in the article), we'll add them as secrets.\u003C\u002Fp>\u003Cp>In repo, navigate to \u003Ccode>Settings -&gt; Secrets -&gt; Actions\u003C\u002Fcode>. I named the secrets \u003Ccode>LOCALAZY_READ_KEY\u003C\u002Fcode> and \u003Ccode>LOCALAZY_WRITE_KEY\u003C\u002Fcode> respectively. Assign both its \u003Ccode>readKey\u003C\u002Fcode>\u002F\u003Ccode>writeKey\u003C\u002Fcode> value, our configuration should look like this.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"1564\" height=\"382\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-30-at-20.03.29.png 1564w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>laravel-i18n-gh-actions-example repository secrets\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"%F0%9F%93%A4-automate-upload-with-github-actions\">📤 Automate Upload with GitHub Actions\u003C\u002Fh2>\u003Cp>In our IDE, create a \u003Ccode>.github\u002Fworkflows\u002Fupload.yml\u003C\u002Fcode> file. Alternatively, you could do it all from a repository, go to \u003Ccode>Actions -&gt; New workflow -&gt; Setup a workflow yourself\u003C\u002Fcode>. Name it \u003Ccode>upload.yml\u003C\u002Fcode>, add the workflow code below and just push it. \u003C\u002Fp>\u003Cp>This is what the code should look like:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-yml\">name: Localazy Upload\n\non:\n  push:\n    branches: [ develop ]\n    paths: [ lang\u002Fen\u002F**.php ]\n\n  pull_request:\n    branches: [ develop ]\n    paths: [ lang\u002Fen\u002F**.php ]\n\n  workflow_dispatch:\n\njobs:\n  localazy-upload:\n    name: Upload source language strings to Localazy\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\u002Fcheckout@v3\n      - uses: localazy\u002Fupload@v1\n        with:\n          read_key: ${{ secrets.LOCALAZY_READ_KEY }}\n          write_key: ${{ secrets.LOCALAZY_WRITE_KEY }}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>.github\u002Fworkflows\u002Fupload.yml\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Let's dig into the file and explain it. Just to remind you, the general purpose of this action is to upload new source language strings to Localazy on \u003Ccode>push\u003C\u002Fcode> or \u003Ccode>pull_request\u003C\u002Fcode> in(to) \u003Ccode>develop\u003C\u002Fcode> branch. \u003C\u002Fp>\u003Cp>Facts:\u003C\u002Fp>\u003Cul>\u003Cli>We assigned a human-readable name \u003Cem>Localazy Upload\u003C\u002Fem> to the action,\u003C\u002Fli>\u003Cli>the \u003Ccode>on\u003C\u002Fcode> controls when the workflow will run,\u003C\u002Fli>\u003Cli>we want to trigger the workflow on \u003Ccode>push\u003C\u002Fcode> or \u003Ccode>pull_request\u003C\u002Fcode> into \u003Ccode>develop\u003C\u002Fcode> branch (given by \u003Ccode>branches: [ develop ]\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>at the same time, we want to trigger the workflow only if any of the source language files changed (given by \u003Ccode>paths: [ lang\u002Fen\u002F**.php ]\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we'd also like to allow running the workflow manually from the Actions tab (\u003Ccode>workflow_dispatch:\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we defined one \u003Ccode>job\u003C\u002Fcode> (a workflow run is made up of one or more jobs that can run sequentially or in parallel),\u003C\u002Fli>\u003Cli>this \u003Ccode>job\u003C\u002Fcode> is called \u003Ccode>localazy-upload\u003C\u002Fcode> and has it's human-readable name \u003Cem>Upload source language strings to Localazy\u003C\u002Fem> (which then is displayed in GitHub Actions Workflow),\u003C\u002Fli>\u003Cli>we specified that the type of runner that the job will run on is \u003Ccode>ubuntu-latest\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>job\u003C\u002Fcode> consists of two steps - a sequence of tasks that will be executed as part of the job,\u003C\u002Fli>\u003Cli>first step \u003Ccode>actions\u002Fcheckout@v3\u003C\u002Fcode> checks out your repository under \u003Ccode>$GITHUB_WORKSPACE\u003C\u002Fcode>, so your job can access it (documentation \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fcheckout\">here\u003C\u002Fa>)\u003C\u002Fli>\u003Cli>second step \u003Ccode>localazy\u002Fupload@v1\u003C\u002Fcode> reads the config from \u003Ccode>localazy.json\u003C\u002Fcode> and processes upload \u003Ccode>with\u003C\u002Fcode> using \u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode> values are read from \u003Ccode>secrets.LOCALAZY_READ_KEY\u003C\u002Fcode> and \u003Ccode>secrets.LOCALAZY_WRITE_KEY\u003C\u002Fcode> variables respectively.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Let's test the workflow now. In our \u003Ccode>foo\u003C\u002Fcode> branch, commit and push all the changes we've made. Go to GitHub and make a pull request to \u003Ccode>develop\u003C\u002Fcode>.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1156\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.02.36.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Create pull request develop &lt;- foo\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>As soon as the pull request is created, our workflow is triggered. You can tell by \u003Cem>Some checks haven't completed yet\u003C\u002Fem>. Also, there's an orange circle next to \u003Cem>Localazy Upload\u003C\u002Fem> workflow, which means it's running.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1155\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.12.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Pull request with running workflow\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Clicking on \u003Cem>Details\u003C\u002Fem>, we can display the details of the steps of the workflow which is currently running.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1154\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.09.43.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Upload workflow result\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Everything processed correctly! You can also click on an arrow next to each step to see its details. For example, if we click on \u003Cem>Run localazy\u002Fupload@v1\u003C\u002Fem> action output.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-plaintext\">Localazy CLI, v1.6.0\nCommand-line tool for the Localazy platform.\n\nRead more information at https:\u002F\u002Flocalazy.com\u002Fdocs\u002Fcli\n\nParameters:\n  - deprecate missing: no\n  - import as new: false\n  - force current: false\n  - filter source: true\n  - app version: 0\n  - groups: (default only)\n  - folder: .\n\nProcessing files...\n\nlang\u002Fen\u002Fwelcome.php\n(file: welcome.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fvalidation.php\n(file: validation.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fauth.php\n(file: auth.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fpasswords.php\n(file: passwords.php, lang: inherited, type: php)\n\nlang\u002Fen\u002Fpagination.php\n(file: pagination.php, lang: inherited, type: php)\n\nVerifying...\n\nValidating...\n\nUploading 3 kB...\n\nUpload results: 126 added, 0 updated, 0 deprecated\nUsing 397 out of 45000 source keys\n\nYour app on Localazy: https:\u002F\u002Flocalazy.com\u002Fp\u002Flaravel-i18n-gh-action-example\n\nDone.\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>localazy\u002Fupload@v1 action output\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Great, let's go to the application in Localazy and check the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Fimporting-localization-files#importing-through-file-management\">File Management\u003C\u002Fa> section. As we could see, all files are available there.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1153\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.27.23.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy - File management\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Ch2 id=\"%F0%9F%9A%A9-translate-your-texts-in-localazy\">🚩 Translate your texts in Localazy\u003C\u002Fh2>\u003Cp>Now, add a couple of languages and translate and approve some phrases. \u003C\u002Fp>\u003Cp>Localazy offers three approaches to choose from and combine to translate your project: \u003C\u002Fp>\u003Col>\u003Cli>💪🏻 \u003Cstrong>Translate on your own or invite contributors - \u003C\u002Fstrong>You can \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Ftranslating-strings\">start translating on your own\u003C\u002Fa> and use our built-in suggestion system. \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Ftranslating-strings#:~:text=a%20different%20purpose.-,Suggestions,-%2D%20translations%20from%20ShareTM\">Suggestions\u003C\u002Fa> are drawn from the most popular \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdictionary\u002Fmachine-translation\">machine translation\u003C\u002Fa> engines and the ShareTM mentioned above. To get some additional help as your project grows, you can \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Fdefining-user-roles\">invite volunteers or translators you already know\u003C\u002Fa>.\u003C\u002Fli>\u003Cli>🦾 \u003Cstrong>Translate everything in bulk via machine translation - \u003C\u002Fstrong>With the Localazy \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Ftiers\u002Fautopilot\">Autopilot plan\u003C\u002Fa>, you can translate whole files instantly by \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fdocs\u002Fgeneral\u002Fadditional-mt-engines#mt-pre-translate\">running a machine translation over the content\u003C\u002Fa>. This is great for the first iteration and localization testing. \u003C\u002Fli>\u003Cli>🚩 \u003Cstrong>Fully automate the translation process with the \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Ffeatures\u002Fcontinuous-localization-team\">Continuous Localization\u003C\u002Fa> services\u003C\u002Fstrong> - Once your Localazy integration is set up, you can order translations from our vetted translators and get your project translated by professionals automatically. The service is also proactive, so you don't have to micromanage translators, and you can visit Localazy only once in a while to check the progress.\u003C\u002Fli>\u003C\u002Fol>\u003Cp>For our purposes, I translated \u003Ccode>welcome.php\u003C\u002Fcode> it into \u003Cem>Czech\u003C\u002Fem>,\u003Cem> German, \u003C\u002Fem>and\u003Cem> Spanish.\u003C\u002Fem> You can see it all in the following two screenshots.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1156\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.13.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy - List of languages\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1157\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-17.31.40.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Localazy - Language phrases list\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>To summarize, from now on, on every pull request or push to develop, all new or updated source keys will be uploaded to Localazy ready to be translated.\u003C\u002Fp>\u003Cp>Now, we can merge the pull request and close the \u003Ccode>foo\u003C\u002Fcode> branch. Then in our IDE, switch back to \u003Ccode>develop\u003C\u002Fcode> branch and \u003Ccode>pull\u003C\u002Fcode> updates.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">git switch develop &amp;&amp; git pull\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"%F0%9F%93%A5-automate-download-with-github-actions\">📥 Automate Download with GitHub Actions\u003C\u002Fh2>\u003Cp>Similarly to upload, we need to create another workflow. Go to the project IDE and create a \u003Ccode>download.yml\u003C\u002Fcode> file in \u003Ccode>.github\u002Fworkflows\u003C\u002Fcode> directory.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-yml\">name: Localazy Download\non:\n  push:\n    branches: [ master ]\n    \n  workflow_dispatch:\n\njobs:\n  localazy-download:\n    name: Download strings from Localazy\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v3\n        with:\n          fetch-depth: 0\n      - uses: localazy\u002Fdownload@v1\n        with:\n          read_key: ${{ secrets.LOCALAZY_READ_KEY }}\n          write_key: ${{ secrets.LOCALAZY_WRITE_KEY }}\n      - run: |\n          ls lang\u002F**\u002F**.php\n      - run: |\n          git config --local user.email \"david@localazy.com\"\n          git config --local user.name \"david-vaclavek[bot]\"\n          git add lang\n          git commit -m \"Add locale files\" -a\n      - uses: ad-m\u002Fgithub-push-action@master\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          branch: master\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>.github\u002Fworkflows\u002Fdownload.yml\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>To have the workflows in our blood, let's go through the file once again:\u003C\u002Fp>\u003Cul>\u003Cli>We assigned a human-readable name \u003Cem>Localazy Download\u003C\u002Fem> to the action,\u003C\u002Fli>\u003Cli>the \u003Ccode>on\u003C\u002Fcode> controls when the workflow will run,\u003C\u002Fli>\u003Cli>we want to trigger the workflow on \u003Ccode>push\u003C\u002Fcode> to \u003Ccode>master\u003C\u002Fcode> branch (given by \u003Ccode>branches: [ master ]\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we like to allow to run the workflow manually from the Actions tab (\u003Ccode>workflow_dispatch:\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>we defined one \u003Ccode>job\u003C\u002Fcode> (a workflow run is made up of one or more jobs that can run sequentially or in parallel),\u003C\u002Fli>\u003Cli>this \u003Ccode>job\u003C\u002Fcode> is called \u003Ccode>localazy-download\u003C\u002Fcode> and has its human-readable name \u003Cem>Download strings from Localazy\u003C\u002Fem> (which then is displayed in GitHub Actions Workflow),\u003C\u002Fli>\u003Cli>we specified that the type of runner that the job will run on is \u003Ccode>ubuntu-latest\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>job\u003C\u002Fcode> consists of five steps - a sequence of tasks that will be executed as part of the job,\u003C\u002Fli>\u003Cli>first step \u003Ccode>actions\u002Fcheckout@v3\u003C\u002Fcode> checks out your repository under \u003Ccode>$GITHUB_WORKSPACE\u003C\u002Fcode>, so your job can access it (documentation \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fcheckout\">here\u003C\u002Fa>)\u003C\u002Fli>\u003Cli>because we will be pushing into another repository, we need to use it \u003Ccode>with\u003C\u002Fcode> \u003Ccode>fetch-depth: 0\u003C\u002Fcode> to prevent errors pushing refs to the destination repository (more information on that can be found in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fgithub-push\">GitHub Push\u003C\u002Fa> action documentation),\u003C\u002Fli>\u003Cli>the second step \u003Ccode>localazy\u002Fdownload@v1\u003C\u002Fcode> reads the \u003Ccode>download\u003C\u002Fcode> config from \u003Ccode>localazy.json\u003C\u002Fcode> and processes download from Localazy \u003Ccode>with\u003C\u002Fcode> using \u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode>,\u003C\u002Fli>\u003Cli>\u003Ccode>read_key\u003C\u002Fcode> and \u003Ccode>write_key\u003C\u002Fcode> values are read from \u003Ccode>secrets.LOCALAZY_READ_KEY\u003C\u002Fcode> and \u003Ccode>secrets.LOCALAZY_WRITE_KEY\u003C\u002Fcode> variables respectively,\u003C\u002Fli>\u003Cli>the third step can be skipped, but I just wanted to show you a list of files that were downloaded (\u003Ccode>ls lang\u002F**\u002F.php\u003C\u002Fcode> command),\u003C\u002Fli>\u003Cli>the fourth step sets up a git configuration (\u003Ccode>user.email\u003C\u002Fcode>, \u003Ccode>user.name\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>it also adds all the (new) files from \u003Ccode>lang\u003C\u002Fcode> repository into staging area (\u003Ccode>git add lang\u003C\u002Fcode>),\u003C\u002Fli>\u003Cli>then it commits all the added files,\u003C\u002Fli>\u003Cli>fifth step uses action called \u003Ccode>ad-m\u002Fgithub-push-action@master\u003C\u002Fcode>, which I've found browsing \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace?category=&amp;query=&amp;type=actions&amp;verification=\">GitHub Actions Marketplace\u003C\u002Fa> and is documented \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarketplace\u002Factions\u002Fgithub-push\">here\u003C\u002Fa>,\u003C\u002Fli>\u003Cli>this action pushes previously committed files into \u003Ccode>master\u003C\u002Fcode> branch using \u003Ccode>secrets.GITHUB_TOKEN\u003C\u002Fcode> variable (\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fautomatic-token-authentication#about-the-github_token-secret\">more info about \u003C\u002Fa>\u003Ccode>\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fautomatic-token-authentication#about-the-github_token-secret\">GITHUB_TOKEN\u003C\u002Fa>\u003C\u002Fcode>\u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fautomatic-token-authentication#about-the-github_token-secret\"> secret\u003C\u002Fa>).\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Generally speaking, \u003Ccode>GITHUB_TOKEN\u003C\u002Fcode> secret is here for security reasons and is created at the start of each workflow run by GitHub. It can be used to authenticate in a workflow run. When the \u003Ccode>job\u003C\u002Fcode> finishes, it expires.\u003C\u002Fp>\u003Cp>Okay, now it's time to test our workflow. First, push the newly created file \u003Ccode>download.yml\u003C\u002Fcode> to remote. Let's create another pull request, this time to \u003Ccode>master\u003C\u002Fcode>. This time, there's no workflow running when we create a pull request - that's exactly what we wanted.\u003C\u002Fp>\u003Cp>But as soon as we merge the pull request, our workflow will be triggered. When it finishes, we can go through the details of each step. For example, we can see what files we downloaded by \u003Ccode>localazy\u002Fdownload@v1\u003C\u002Fcode> action.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1155\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.24.36.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Download workflow result\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>When we check our repository, we can see that the \u003Ccode>master\u003C\u002Fcode> branch was updated with the new localization files, leaving the \u003Ccode>develop\u003C\u002Fcode> branch without them. And that's exactly what we wanted to do in this example.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1156\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.28.42.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>lang folder in the master branch\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cblockquote>Most of the steps regarding GitHub Actions were taken from \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fblog\u002Fautomated-localization-github-actions-localazy\">Automated Localization: GitHub Actions ❤ Localazy\u003C\u002Fa> article made by \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fblog\u002Fauthor\u002Fvaclav-hodek\">Václav Hodek\u003C\u002Fa> - thank you for the inspiration.\u003C\u002Fblockquote>\u003Ch2 id=\"%F0%9F%8E%89-the-last-stepsee-our-translated-application\">🎉 The last step - see our translated application\u003C\u002Fh2>\u003Cp>We got to the end of this article. But it wouldn't be completed without showing you the result. We need to tweak the Laravel web \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Frouting#basic-routing\">routing\u003C\u002Fa> a bit so it takes passed language into account. Normally, you'd work in a separate branch (maybe \u003Ccode>foo2\u003C\u002Fcode>?), merge it to \u003Ccode>develop\u003C\u002Fcode>, test it, then merge it to \u003Ccode>master\u003C\u002Fcode> or so... But for our purposes, let's just quickly test it.\u003C\u002Fp>\u003Cp>Let's switch to \u003Ccode>master\u003C\u002Fcode> in your IDE and \u003Ccode>git pull\u003C\u002Fcode> the changes. Go to \u003Ccode>routes\u002Fweb.php\u003C\u002Fcode>. In this file, you can register web routes for the application. Update the code:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode class=\"language-php\">&lt;?php\n\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::get('\u002F{locale?}', function ($locale = null) {\n    if (isset($locale)) {\n        app()-&gt;setLocale($locale);\n    }\n\n    return view('welcome');\n});\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>routes\u002Fweb.php\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>With the code above, we tell the app to set its locale if there's a \u003Ccode>locale\u003C\u002Fcode> parameter in the path. That's it, the rest of it is done automatically. Try some of these URLs:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fen\">localhost\u002Fen\u003C\u002Fa>\u003C\u002Fcode> (or simply \u003Ccode>\u003Ca href=\"localhost\">localhost\u003C\u002Fa>\u003C\u002Fcode>)\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.10.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in English, the source language\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fes\">localhost\u002Fes\u003C\u002Fa>\u003C\u002Fcode>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.39.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in Spanish, translated by Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fde\">localhost\u002Fde\u003C\u002Fa>\u003C\u002Fcode>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1122\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.45.00.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in German, translated by Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cul>\u003Cli>\u003Ca href=\"localhost\u002Fcs\">\u003Ccode>localhost\u002Fcs\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png\" class=\"kg-image\" alt loading=\"lazy\" width=\"2000\" height=\"1123\" srcset=\"https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 1000w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw1600\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 1600w, https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002Fsize\u002Fw2400\u002F2022\u002F03\u002FScreenshot-2022-03-31-at-18.44.22-1.png 2400w\" sizes=\"(min-width: 720px) 720px\">\u003Cfigcaption>Our application in Czech, translated by Localazy\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode>\u003Ca href=\"localhost\u002Fpl\">localhost\u002Fpl\u003C\u002Fa>\u003C\u002Fcode> - oops, there's a fallback to English, which is set as a default language (more on that \u003Ca href=\"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Flocalization#configuring-the-locale\">here\u003C\u002Fa>)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>To see if some translations are missing without visiting Localazy, you can use the \u003Ca href=\"https:\u002F\u002Flaravel-news.com\u002Flaravel-translations-checker\">Laravel Translation Checker\u003C\u002Fa>. This way, you can be comfortably tucked in your IDE and fully focus on building your Laravel project. But we hope you will say hi and see what's new inside Localazy from time to time. \u003C\u002Fp>\u003Ch2 id=\"%F0%9F%8E%81-source-code\">🎁 Source Code\u003C\u002Fh2>\u003Cp>The source code of this demo project is available on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flocalazy\u002Flaravel-i18n-gh-actions-example\">GitHub\u003C\u002Fa>. Do not forget to explore the content of the \u003Ccode>.github\u002Fworkflows\u003C\u002Fcode> folder!\u003C\u002Fp>\u003Ch2 id=\"%F0%9F%8F%86-localize-your-laravel-project-and-get-rewarded\">🏆 Localize your Laravel project and get rewarded!\u003C\u002Fh2>\u003Cp>If you were looking for a way to finally localize your Laravel project and got inspired by this article, we would love to hear your story and \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Ftags\u002Finterview\">feature your product on our blog\u003C\u002Fa>. Bookmark this article and \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fcommunity\u002Fshake-hands\u002Fpublish-interview\">fill in the interview form\u003C\u002Fa> once you get Localazy up and running.\u003C\u002Fp>\u003Cp>💰 \u003Cstrong>Bounty offer\u003C\u002Fstrong>: If you think you could find a better way of integrating Localazy with the Laravel Framework and would like to develop your own integration, library, or utility, \u003Ca href=\"https:\u002F\u002Fghost.localazy.com\u002Fcommunity\u002Fb2b-partnerships\u002Fcustom-integrations\">let us know\u003C\u002Fa>!\u003C\u002Fp>\u003Ch2 id=\"%E2%9C%94%EF%B8%8F-conclusion\">✔️ \u003Cstrong>Conclusion\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>We hope you liked this article showing the power of Localazy and GitHub Actions for Laravel localization. We believe that anything that can be automated, should be automated, and localization is one of those things.\u003C\u002Fp>\u003Cp>Feel free to contact us at \u003Ca href=\"mailto:team@localazy.com\" rel=\"noopener noreferrer\">team@localazy.com\u003C\u002Fa> if you have any questions regarding this tutorial or Localazy in general. You can also \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FCAVhHrh\" rel=\"noopener noreferrer\">join the Localazy Discord\u003C\u002Fa> to see what other developers using Localazy are up to or \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FLocalazy-Community\" rel=\"noopener noreferrer\">accept our invitation to the Localazy Community on GitHub\u003C\u002Fa> where you will find more community-sourced assets for your Laravel projects you can contribute to. Looking forward to meeting you there!\u003C\u002Fp>","public","none","2022-03-31T10:16:19.000+02:00","{\"intercomArticleUrl\":\"\"}",[1995],{"id":1861,"name":1862,"slug":1863,"profile_image":1864,"cover_image":10,"bio":10,"website":1996,"location":1997,"facebook":10,"twitter":1998,"meta_title":10,"meta_description":10,"url":1999},"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdavid-vaclavek\u002F","Katowice, Poland","@dave_vaclavek","https:\u002F\u002Fghost.localazy.com\u002Fauthor\u002Fdavid-vaclavek\u002F",[2001,2004,2007,2010,2013,2018,2024,2029,2034,2040,2046,2051,2056,2061,2066],{"id":2002,"name":1872,"slug":1873,"description":1872,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2003},"60a37fc7cf7b6a0001d1f10d","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Flaravel\u002F",{"id":2005,"name":1876,"slug":1877,"description":10,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2006},"613703526f8ebe0001bda3c5","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fphp\u002F",{"id":2008,"name":1879,"slug":125,"description":1879,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2009},"60a37fc7cf7b6a0001d1f0fb","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fgithub\u002F",{"id":2011,"name":1881,"slug":1882,"description":1881,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2012},"60a37fc7cf7b6a0001d1f0fa","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fhowto\u002F",{"id":2014,"name":2015,"slug":2016,"description":1888,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2017},"60a37fc7cf7b6a0001d1f173","[DICT] Laravel","term-86","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-86\u002F",{"id":2019,"name":2020,"slug":2021,"description":2022,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2023},"60a37fc7cf7b6a0001d1f11a","[CTA] Automate your localization today! ⚙️","cta-12","Use all core localization features for free and automate your localization process with Localazy!","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fcta-12\u002F",{"id":2025,"name":2026,"slug":2027,"description":1894,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2028},"60a37fc7cf7b6a0001d1f15c","[DICT] Integrated Development Environment (IDE)","term-63","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-63\u002F",{"id":2030,"name":2031,"slug":2032,"description":1907,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2033},"60a37fc7cf7b6a0001d1f16c","[DICT] Internationalization (i18n)","term-79","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-79\u002F",{"id":2035,"name":2036,"slug":2037,"description":2038,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2039},"61af9d57df4bcb00010bc95b","[DICT] JSON","term-108","JSON stands for JavaScript Object Notation and it's a widely used File Format.","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-108\u002F",{"id":2041,"name":2042,"slug":2043,"description":2044,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2045},"60a37fc7cf7b6a0001d1f11f","[DICT] Localization","term-2","Localization is a process of preparing a product for a particular market.","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-2\u002F",{"id":2047,"name":2048,"slug":2049,"description":1946,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2050},"60a37fc7cf7b6a0001d1f12a","[DICT] Machine translation (MT)","term-13","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-13\u002F",{"id":2052,"name":2053,"slug":2054,"description":1959,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2055},"60a37fc7cf7b6a0001d1f121","[DICT] Translation","term-4","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-4\u002F",{"id":2057,"name":2058,"slug":2059,"description":1969,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2060},"60a37fc7cf7b6a0001d1f144","[DICT] Translation Management System (TMS)","term-39","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fterm-39\u002F",{"id":2062,"name":2063,"slug":2064,"description":10,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2065},"61a0daffdf4bcb00010bc50c","[SYNDICATE]","syndicate","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fsyndicate\u002F",{"id":2067,"name":2068,"slug":2069,"description":10,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2070},"64710a2f047091000193ca3d","[INTERCOM]","intercom","https:\u002F\u002Fghost.localazy.com\u002Ftag\u002Fintercom\u002F",{"id":1861,"name":1862,"slug":1863,"profile_image":1864,"cover_image":10,"bio":10,"website":1996,"location":1997,"facebook":10,"twitter":1998,"meta_title":10,"meta_description":10,"url":1999},{"id":2002,"name":1872,"slug":1873,"description":1872,"feature_image":10,"visibility":1990,"og_image":10,"og_title":10,"og_description":10,"twitter_image":10,"twitter_title":10,"twitter_description":10,"meta_title":10,"meta_description":10,"codeinjection_head":10,"codeinjection_foot":10,"canonical_url":10,"accent_color":10,"url":2003},"https:\u002F\u002Fghost.localazy.com\u002Fautomated-localization-laravel-projects-localazy-github-actions\u002F",[2075,2097,2118],{"id":2076,"owner":2077,"created_by":10,"sort":10,"title":2082,"slug":2083,"modified_on":877,"created_on":2084,"pinned":160,"badge":10,"priority":1824,"main_image":2085,"status":5,"tags":2086,"dictionary":2096,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"6372308e04709100019374c9",{"id":2078,"first_name":2079,"last_name":877,"slug":2080,"avatar":2081},"6061ffdd2a37af00016d413d","Daniel Charvát","daniel-charvat","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fdan-1.png","Figma in Localization: Figma as a Source of Truth","figma-series-figma-as-source-of-truth","2023-02-08T20:43:55.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F01\u002FFigma-Series-3.png",[2087,2089,2090,2093],{"id":2088,"created_on":1828,"status":5,"label":671,"slug":670,"on_index_page":162},6183,{"id":451,"created_on":1828,"status":5,"label":1881,"slug":1882,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":2091,"slug":2092,"on_index_page":162},"DevTips","devtips",{"id":411,"created_on":1828,"status":5,"label":2094,"slug":2095,"on_index_page":160},"Design","design",[],{"id":2098,"owner":2099,"created_by":10,"sort":10,"title":2104,"slug":2105,"modified_on":877,"created_on":2106,"pinned":160,"badge":10,"priority":1824,"main_image":2107,"status":5,"tags":2108,"dictionary":2117,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"63dd1bf30470910001939f8b",{"id":2100,"first_name":2101,"last_name":877,"slug":2102,"avatar":2103},"61dc4e87df4bcb00010bd508","Mary Okosun","mary-okosun","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fokosun.png","The ultimate guide to Localazy API","the-ultimate-guide-to-localazy-api","2023-03-15T10:00:00.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F03\u002Fultimate-localazy-api-guide.png",[2109,2110,2113,2114],{"id":451,"created_on":1828,"status":5,"label":771,"slug":775,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":2111,"slug":2112,"on_index_page":160},"Automated Localization","automated-localization",{"id":451,"created_on":1828,"status":5,"label":1881,"slug":1882,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":2115,"slug":2116,"on_index_page":160},"Guide","guide",[],{"id":2119,"owner":2120,"created_by":10,"sort":10,"title":2125,"slug":2126,"modified_on":877,"created_on":2127,"pinned":160,"badge":10,"priority":1824,"main_image":2128,"status":5,"tags":2129,"dictionary":2133,"reading_time":1838,"excerpt":-1,"og_title":877,"og_description":877,"og_image":877},"60a37fc7cf7b6a0001d1f18c",{"id":2121,"first_name":2122,"last_name":877,"slug":2123,"avatar":2124},"1","Václav Hodek","vaclav-hodek","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2023\u002F12\u002Fvasek.png","Quick guide to Android localization with Localazy","quick-guide-to-android-localization-localazy","2022-02-09T09:00:00.000+01:00","https:\u002F\u002Fghost.localazy.com\u002Fcontent\u002Fimages\u002F2021\u002F09\u002FHow-to-lokalize-Android-app.png",[2130,2131,2132],{"id":451,"created_on":1828,"status":5,"label":593,"slug":592,"on_index_page":160},{"id":451,"created_on":1828,"status":5,"label":352,"slug":1829,"on_index_page":162},{"id":451,"created_on":1828,"status":5,"label":1881,"slug":1882,"on_index_page":160},[],{"id":4,"sort":10,"created_on":2135,"name":2136,"cta_link":2137,"banner_image":2138},"2022-03-17T12:23:14.000Z","default","https:\u002F\u002Flocalazy.com\u002Ffeatures\u002Flocalazy-ai",{"id":2139},"72defd59-a21d-44b9-822c-4e183ca62b99"]