1"use strict";(self.webpackChunkcodeandweb=self.webpackChunkcodeandweb||[]).push([[3276],{20221:function(e,t,a){a.d(t,{H:function(){return i},j:function(){return c}});var n=a(96540),l=a(81851);const c=function(e,t){void 0===t&&(t="ignore"),"undefined"!=typeof window&&localStorage.setItem("exit intent "+e,t)},i=e=>{let{name:t,children:a,variant:c}=e;const{0:i,1:o}=(0,n.useState)(!1),s=()=>"undefined"!=typeof window&&"#force-popup"===window.location.hash;(0,n.useEffect)((()=>{if(!s()){const e=document.referrer,a=window.location.hostname,n=e&&!e.includes(a);if(null!==localStorage.getItem("exit intent "+t)||!n)return}const e=function(e){const t=t=>{t.clientY<0&&(a(),e())},a=()=>{document.removeEventListener("mouseout",t)};return document.addEventListener("mouseout",t,!1),a}((()=>{o(!0),localStorage.setItem("exit intent "+t,"fired"),s()||l.mm.event("exit intent fired",{name:null!=c?c:t})}));return()=>{e()}}),[t]);return i?n.createElement("div",{className:"bg-white dark:bg-slate-900 h-screen w-screen overflow-hidden z-50 fixed inset-0",tabIndex:-1},n.createElement("button",{className:"absolute top-2 right-4 text-2xl text-gray-400 z-10",onClick:()=>o(!1)},"Ã"),a):null}},26319:function(e){e.exports=JSON.parse('{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADbUlEQVR42o1UTa/TRhQNRVCpQiBBK3hPINggsSs/oJW6bRfNFnVVqeIHsGDFgl+AxIIN/AB2LNi8HUt+wUtekvfij3Hi2C+2Y8eOHScez+XccZIX0Up0pCOP7Tvnnjn3zrSI6BKj9Y2BmMuz2exGnud3SyofrdfrX6WUT6RcP1ssFq/zPHubJMnNbfBV4BZwH3gM/CHl6ikWvayq6h0WfVytVp/X1bpflmWE7zUpIqUU1XWNGVEt6xDJDltGx/3F98+7YHfjWbyqKkkKMRzcBCpar6SeZ2lO6TyjeZKSsFw1i2YqDKPKHU9I2I4PpQetNE3by2JFURirKJqRObQJAWoy8WoEy4nrVbYtqjAMpe/5te/7IAlpMplQEASEufJ8n0zTDIUQhy0hzD8dYdE0CGSeL0Dk8k+ybYsMPHkR1FMcxzSfzzdICEK274r/CccJe0xY5rN2HE4I6hT8IBhPw+GQRqORXlAUxQ7L5ZLgoQbPGdimGjkOBIhGYVWW7SDw8cFWvEhnE46GA9I4ZhUpVM4xT/4FFsJqXddtCOF1u8hzOj09bQihsHfSIcsa0nTqUZbFUDffQ6qxXDZYLBLleR572lSZCXkLlmUptIbeshB9Go978M+ECgG/xnsY7cGB8rFCoXhHFwqXRUa+7+k+mQZTVovCWCB1oTKEygJYaKQpI9sBlij2mrfc6/UaQikrLB5rwiiKkE2QA6NZLbaxQ1FcYL8oDuJRgwuFXF1UShOy/OPjYxpA5elgQOfn57ptmPy/gCLuirJTuIKHhjFUrIJ7jFsGAZoICnTP7fWd7oRtEhPec7xpGheEXF3LMnWD8kIuEs4w4fDzWdXHcIvtaM6x5O0rTorju9c2IHScUYV5hcxS2HaNraosy3bqGPzOaPzcNnuhaiRelmUYcNtASZvbJYkTnZ6VccYkiYm/740a7xWIZV4UNch03yKB4h3he4hjetg6OTk5QIWeohgv4Nsb4APmn1F1A82aMsFXxF+PrQ8BcNDaXLBXj46OvgfZD8CPZ2dn90bD4UM0++N+v/87nn+jjZ7D/Ffw6T0SfYIlXdw0EXxfs0IkbU7K3o38Hd/KG1yB6ToB5oxreL/ON7ZhGLeR4AHwaDAY/Izkv3U6nb+63e4/eF5r/d+xSagTbZLc2NzyPwG3gTss5gsNplDL2RXu8wAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/b4d580d0bf435c9d0d51a440ad29a98e/03a26/Try-BabelEdit%402x.png","srcSet":"/static/b4d580d0bf435c9d0d51a440ad29a98e/0eb0f/Try-BabelEdit%402x.png 336w,\\n/static/b4d580d0bf435c9d0d51a440ad29a98e/a6461/Try-BabelEdit%402x.png 672w,\\n/static/b4d580d0bf435c9d0d51a440ad29a98e/03a26/Try-BabelEdit%402x.png 1344w","sizes":"(min-width: 1344px) 1344px, 100vw"},"sources":[{"srcSet":"/static/b4d580d0bf435c9d0d51a440ad29a98e/54a7c/Try-BabelEdit%402x.webp 336w,\\n/static/b4d580d0bf435c9d0d51a440ad29a98e/cd0f4/Try-BabelEdit%402x.webp 672w,\\n/static/b4d580d0bf435c9d0d51a440ad29a98e/843fb/Try-BabelEdit%402x.webp 1344w","type":"image/webp","sizes":"(min-width: 1344px) 1344px, 100vw"}]},"width":1344,"height":1367}')},42854:function(e,t,a){a.d(t,{J:function(){return o}});var n=a(96540),l=a(94296),c=a(32532),i=a(20221);function o(e){let{name:t,text:o,title:s="Try BabelEdit"}=e;return n.createElement(i.H,{name:t},n.createElement("div",{className:"fixed inset-0 z-10 overflow-y-auto max-w-4xl mx-auto"},n.createElement("div",{className:"flex min-h-full justify-start p-4 items-center"},n.createElement("div",{className:"absolute top-0 py-16 right-0 w-2/3 md:w-1/2 h-screen flex justify-center items-center"},n.createElement(c.S,{className:"z-5 opacity-50 md:opacity-100 p-16",layout:"constrained",placeholder:"blurred",src:"./[email protected]",alt:"",__imageData:a(26319)})),n.createElement("div",{className:"z-10 p-8 bg-linear-to-r from-white w-full sm:w-2/3 md:w-1/2"},n.createElement("div",{className:"text-5xl text-babeledit-600 font-semibold"},s),n.createElement("div",{className:"text-2xl text-gray-500 py-8"},o),n.createElement("div",{className:"mt-8 flex justify-start"},n.createElement(l.f,{product:"babeledit"}))))))}},85316:function(e,t,a){a.r(t),a.d(t,{Head:function(){return b},default:function(){return g}});var n=a(28453),l=a(96540),c=a(34429),i=a(98587);const o=["className"];var s=e=>{let{className:t}=e,a=(0,i.A)(e,o);return l.createElement("svg",Object.assign({viewBox:"0 0 1280 720",xmlns:"http://www.w3.org/2000/svg",fillRule:"evenodd",clipRule:"evenodd",fill:"currentColor"},a,{className:t||"inline-block h-4"})," ",l.createElement("path",{d:"M20 360h110l27.5 27.5V520H20V360Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M130 360v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"M72.025 431.2c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M92.375 443.6v-5.75h-6.7v5.75h-1.65v-12.4h1.65v5.25h6.7v-5.25h1.7v12.4h-1.7M96.975 431.2c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9",fillRule:"nonzero"})," ",l.createElement("path",{d:"M295 360h110l27.5 27.5V520H295V360Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M405 360v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"M332.05 388c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85h-1.65V388Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M347.55 390.7c3.1-.05 4.25 1.85 4.25 4.95.05 3.15-1.35 4.95-4.3 4.95-2.95 0-4.15-1.95-4.2-4.95 0-3.3 1.4-4.95 4.25-4.95Zm-.05 8.7c2.2.05 2.65-1.55 2.65-3.75 0-2.15-.4-3.75-2.55-3.75s-2.65 1.6-2.65 3.75.5 3.7 2.55 3.75M358.25 392.25c-3.9-.8-2.65 4.55-2.85 8.15h-1.6l-.05-9.5h1.5c.05.6-.05 1.45.1 1.95.3-1.35 1.15-2.45 2.9-2.05v1.45M361.45 398.05c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M370.55 398.6c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M379.25 390.7c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.5
15 3.8 0 2.15.5 3.65 2.55 3.65M384.7 400.4v-13.05h1.6v13.05h-1.6M392.45 390.7c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M345.025 409.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M357.775 412.3c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6V414c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M363.225 410.45v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V412.5h1.6v10.7c.1 2-1.15 2.9-3.25 2.45v-1.2M370.975 412.3c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M380.775 413.55c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M387.925 419.65c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M333.925 432.6v11h-1.7v-11h-4.25v-1.4h10.2v1.4h-4.25M341.525 433.9c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M357.025 435.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M367.225 433.9c2.75.05 3.5 2.05 3.5 4.9 0 2.85-.8 4.9-3.5 5-1.55 0-2.45-.65-3-1.7l.05 5.25h-1.6l-.05-13.25h1.55l.1 1.5c.5-1.05 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75s-.3-3.65-2.25-3.7c-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M372.675 443.6v-13.05h1.6v13.05h-1.6M382.475 441.8c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M388.375 441.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M395.425 433.9c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M343.925 490.55c-1.9-2.1-3.25-4.6-3.25-8.45 0-3.8 1.4-6.3 3.25-8.35h1.55c-1.9 2.05-3.2 4.6-3.2 8.4 0 3.8 1.3 6.35 3.2 8.4h-1.55M347.025 474.4c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M364.525 474.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M377.875 475.8v11h-1.7v-11h-4.25v-1.4h10.2v1.4h-4.25M384.125 473.75c1.9 2.05 3.25 4.6 3.25 8.4 0 3.8-1.35 6.35-3.25 8.4h-1.55c1.85-2.05 3.2-4.6 3.2-8.4 0-3.8-1.35-6.35-3.2-8.4h1.55",fillRule:"nonzero"})," ",l.createElement("path",{d:"M665.95 160h110l27.5 27.5V320h-137.5V160Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M775.95 160v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"M703 198.8c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85H703v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M718.5 201.5c3.1-.05 4.25 1.85 4.25 4.95.05 3.15-1.35 4.95-4.3 4.95-2.95 0-4.15-1.95-4.2-4.95 0-3.3 1.4-4.95 4.25-4.95Zm-.05 8.7c2.2.05 2.65-1.55 2.65-3.75 0-2.15-.4-3.75-2.55-3.75s-2.65 1.6-2.65 3.75.5 3.7 2.55 3.75M729.2 203.05c-3.9-.8-2.65 4.55-2.85 8.15h-1.6l-.05-9.5h1.5c.05.6-.05 1.45.1 1.95.3-1.35 1.15-2.45 2.9-2.05v1.45M732.4 208.85c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M741.5 209.4c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M750.2 201.5c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.5
15 3.8 0 2.15.5 3.65 2.55 3.65M755.65 211.2v-13.05h1.6v13.05h-1.6M763.4 201.5c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4H766M715.975 220.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M728.725 223.1c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M734.175 221.25v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V223.3h1.6V234c.1 2-1.15 2.9-3.25 2.45v-1.2M741.925 223.1c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M751.725 224.35c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M758.875 230.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M723.45 263.6c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8V276h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M740.95 263.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05",fillRule:"nonzero"})," ",l.createElement("path",{d:"M940.95 160h110l27.5 27.5V320h-137.5V160Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M1050.95 160v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"m988 211.2.1-10.9c-1.15 3.8-2.7 7.25-4 10.9h-1.15l-4.05-10.9.05 10.9h-1.45v-12.4h2.2l3.85 10.55c1.05-3.75 2.55-7 3.8-10.55h2.15v12.4H988M998 209.4c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M1005.75 202.75c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1015.25 202.75c-3.6 0-2.2 5.1-2.45 8.45h-1.6v-13.05h1.6l-.05 5.15c.6-1.05 1.4-1.8 3.05-1.8 4.45 0 2.65 5.8 3 9.7h-1.6v-6.05c.1-1.6-.4-2.45-1.95-2.4M1021.15 199.65v-1.5h1.6v1.5h-1.6Zm0 11.55v-9.5h1.6v9.5h-1.6M1029.75 201.5c4.45-.2 2.65 5.8 3 9.7h-1.6v-6.05c0-1.55-.4-2.45-1.95-2.4-3.6.1-2.2 5.1-2.45 8.45h-1.6l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.55-1.1 1.45-1.75 3.05-1.8M1038.9 201.5c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M990.975 220.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M1003.73 223.1c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M1009.18 221.25v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V223.3h1.6V234c.1 2-1.15 2.9-3.25 2.45v-1.2M1016.93 223.1c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M1026.72 224.35c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1033.88 230.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M1007.48 276l.1-10.9c-1.15 3.8-2.7 7.25-4 10.9h-1.15l-4.05-10.9.05 10.9h-1.45v-12.4h2.2l3.85 10.55c1.05-3.75 2.55-7 3.8-10.55h2.15V276h-1.5M1017.43 263.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05",fillRule:"nonzero"})," ",l.createElement("path",{d:"M159.5 440h116",fill:"none",fillRule:"nonzero",stroke:"#000",strokeWidth:"2px"})," ",l.createElement("path",{fillRule:"nonzero",d:"M158.5 439h1.03v2h-1.03z"})," ",l.createElement("path",{d:"m290.76 440-14.26 4.64v-9.28l14.26 4.64Z",fillRule:"nonzero",stroke:"#000",strokeWidth:"2px"})," ",l.createElement("path",{d:"M842.75 241h-37.3v-2h37.3v2Zm78.7 0h-19.8v-2h19.8v2Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"M805.48 241h-1.03v-2h1.03v2Zm131.22-1-14.25 4.64v-9.28L936.7 240Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"m939.95 240-18.5 6v-12l18.5 6Zm-16.5 3.26 10.03-3.26-10.03-3.26v6.52ZM853.25 235.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45H844l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7H855v-6.
105c0-1.45-.25-2.45-1.75-2.4M864.45 236.45c-.15-1.7-4.3-1.9-4.35 0 .75 2.65 5.75.6 5.95 4.5.2 3.9-7.5 3.7-7.85.4l1.4-.25c.2 1.8 4.85 2.25 4.9 0-.5-2.8-5.65-.75-5.9-4.5-.2-2.85 4.1-3.15 6.1-2.1.6.35 1.05.95 1.2 1.75M875.55 234.1c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M881.75 231.9c-1.55-.45-2.1.5-1.9 2.2h1.9v1.15h-1.9v8.35h-1.55v-8.35h-1.35v-1.15h1.35c-.35-2.6.85-4.1 3.45-3.4v1.2M892.2 235.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M899.6 241.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6",fillRule:"nonzero"})," ",l.createElement("path",{fill:"none",fillRule:"nonzero",d:"M100 400h240v60H100z"})," ",l.createElement("path",{d:"m195.55 433.6-2.55-3.9-2.6 3.9h-1.7l3.4-4.9-3.25-4.6h1.75l2.4 3.7 2.35-3.7h1.75l-3.2 4.6 3.4 4.9h-1.75M206.35 424.1c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M212.5 423.9c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M220.45 431.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M225.45 431.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M232.5 423.9c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M244.55 433.6l-2.55-3.9-2.6 3.9h-1.7l3.4-4.9-3.25-4.6h1.75l2.4 3.7 2.35-3.7h1.75l-3.2 4.6 3.4 4.9h-1.75M249.45 431.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6",fillRule:"nonzero"})," ",l.createElement("path",{fill:"none",fillRule:"nonzero",d:"M300 20h540v154H300z"})," ",l.createElement("path",{d:"M371.61 83.889c-1.111 13.889 4.556 32.555-12.222 29-2.555-.667-4.222-2.222-4.888-4.778l3.555-.555c1.667 5.222 11.111 3.555 9.889-3.112v-3.333c-1.222 2.333-3.222 4-6.778 4-6 0-7.555-4.555-7.555-10.666 0-6.223 1.777-10.778 7.888-10.889 3.223-.111 5.334 1.778 6.556 3.889.111-1.111 0-2.556.222-3.556h3.333Zm-9.222 18.667c4 0 5.556-3.556 5.556-8.111 0-4.667-1.556-8.334-5.556-8.334-4.333 0-5.111 3.778-5.111 8.334 0 4.555.667 8.111 5.111 8.111M385.277 83.445c7 0 9.555 4.666 9.333 11.777h-15c0 4.445 1.556 7.445 5.889 7.556 2.889.111 4.778-1.334 5.445-3.222l3.111.888c-1.223 3.112-4.111 5-8.556 5-6.444 0-9.777-4.111-9.666-11.111.111-6.777 2.889-10.888 9.444-10.888Zm5.778 9c.666-6.667-8.445-8.556-10.778-3.112-.333.778-.667 1.889-.667 3.112h11.445M402.943 99.778c-.222 2.666 2 3.222 4.223 2.444v2.667c-3.667 1.111-7.778.555-7.778-4.333V86.445h-2.444v-2.556h2.666l1-4.778h2.333v4.778h3.889v2.556h-3.889v13.333M414.055 99.778c-.222 2.666 2 3.222 4.223 2.444v2.667c-3.667 1.111-7.778.555-7.778-4.333V86.445h-2.444v-2.556h2.666l1-4.778h2.333v4.778h3.889v2.556h-3.889v13.333M429.722 83.445c7 0 9.555 4.666 9.333 11.777h-15c0 4.445 1.556 7.445 5.889 7.556 2.889.111 4.778-1.334 5.445-3.222l3.111.888c-1.223 3.112-4.111 5-8.556 5-6.444 0-9.777-4.111-9.666-11.111.111-6.777 2.889-10.888 9.444-10.888Zm5.778 9c.666-6.667-8.445-8.556-10.778-3.112-.333.778-.667 1.889-.667 3.112H435.5M456.5 105l-5.667-8.667-5.778 8.667h-3.778l7.556-10.889-7.222-10.222h3.889l5.333 8.222 5.222-8.222h3.889l-7.111 10.222L460.388 105H456.5M467.388 99.778c-.222 2.666 2 3.222 4.223 2.444v2.667c-3.667 1.111-7.778.555-7.778-4.333V86.445h-2.444v-2.556h2.666l1-4.778h2.333v4.778h3.889v2.556h-3.889v13.333M505.945 105h-4L497.5 86.778 492.945 105h-4l-6-21.111h3.555l4.334 18.222 4.777-18.222h3.778l4.556 18.222 4.666-18.222h3.445M522.945 83.445c6.889-.111 9.444 4.111 9.444 11 .111 6.999-3 10.999-9.555 10.999-6.556 0-9.222-4.333-9.333-10.999 0-7.334 3.111-11 9.444-11Zm-.111 19.333c4.889.111 5.889-3.445 5.889-8.333 0-4.778-.889-8.334-5.667-8.334s-5.889 3.556-5.889 8.334c0 4.777 1.111 8.222 5.667 8.333M546.723 86.889C538.056 85.111 540.834 97 540.389 105h-3.555l-.111-21.111h3.333c.111 1.333-.111 3.222.222 4.333.667-3 2.556-5.444 6.445-4.555v3.222M563.167 105l-7.111-9.667-2.556 2.112V105h-3.555V76h3.555v18.111l9.222-10.222h4.111L558.278 93l9.111 12h-4.222M578.5 79c-3.444
1-1-4.667 1.111-4.222 4.889h4.222v2.556h-4.222V105h-3.444V86.445h-3v-2.556h3c-.778-5.778 1.888-9.111 7.666-7.555V79M581.056 105V76h3.555v29h-3.555M598.278 83.445c6.889-.111 9.444 4.111 9.444 11 .111 6.999-3 10.999-9.555 10.999-6.556 0-9.222-4.333-9.333-10.999 0-7.334 3.111-11 9.444-11Zm-.111 19.333c4.889.111 5.889-3.445 5.889-8.333 0-4.778-.889-8.334-5.667-8.334s-5.889 3.556-5.889 8.334c0 4.777 1.111 8.222 5.667 8.333M632.278 105h-4l-4.445-18.222L619.278 105h-4l-6-21.111h3.555l4.334 18.222 4.777-18.222h3.778l4.556 18.222 4.666-18.222h3.445M660.5 79c-3.444-1-4.667 1.111-4.222 4.889h4.222v2.556h-4.222V105h-3.444V86.445h-3v-2.556h3c-.778-5.778 1.888-9.111 7.666-7.555V79M671.5 83.445c6.889-.111 9.444 4.111 9.444 11 .111 6.999-3 10.999-9.555 10.999-6.556 0-9.222-4.333-9.333-10.999 0-7.334 3.111-11 9.444-11Zm-.111 19.333c4.889.111 5.889-3.445 5.889-8.333 0-4.778-.889-8.334-5.667-8.334s-5.889 3.556-5.889 8.334c0 4.777 1.111 8.222 5.667 8.333M695.278 86.889C686.611 85.111 689.389 97 688.944 105h-3.555l-.111-21.111h3.333c.111 1.333-.111 3.222.222 4.333.667-3 2.556-5.444 6.445-4.555v3.222M710.277 77.445c9.667.111 21.222-1.667 21.222 8.333 0 8.667-8.555 8.889-17.555 8.444V105h-3.667V77.445Zm3.667 13.888c6.333 0 13.778 1.223 13.778-5.555 0-6.556-7.556-5.222-13.778-5.333v10.888M755.5 105V92.222h-14.889V105h-3.667V77.445h3.667v11.666H755.5V77.445h3.777V105H755.5M765.721 77.445c9.667.111 21.222-1.667 21.222 8.333 0 8.667-8.555 8.889-17.555 8.444V105h-3.667V77.445Zm3.667 13.888c6.333 0 13.778 1.223 13.778-5.555 0-6.556-7.556-5.222-13.778-5.333v10.888",fillRule:"nonzero"})," ",l.createElement("path",{d:"M665.95 360h110l27.5 27.5V520h-137.5V360Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M775.95 360v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"M703 398.8c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85H703v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M718.5 401.5c3.1-.05 4.25 1.85 4.25 4.95.05 3.15-1.35 4.95-4.3 4.95-2.95 0-4.15-1.95-4.2-4.95 0-3.3 1.4-4.95 4.25-4.95Zm-.05 8.7c2.2.05 2.65-1.55 2.65-3.75 0-2.15-.4-3.75-2.55-3.75s-2.65 1.6-2.65 3.75.5 3.7 2.55 3.75M729.2 403.05c-3.9-.8-2.65 4.55-2.85 8.15h-1.6l-.05-9.5h1.5c.05.6-.05 1.45.1 1.95.3-1.35 1.15-2.45 2.9-2.05v1.45M732.4 408.85c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M741.5 409.4c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M750.2 401.5c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M755.65 411.2v-13.05h1.6v13.05h-1.6M763.4 401.5c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4H766M715.975 420.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M728.725 423.1c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M734.175 421.25v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V423.3h1.6V434c.1 2-1.15 2.9-3.25 2.45v-1.2M741.925 423.1c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M751.725 424.35c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M758.875 430.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M723.45 463.6c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8V476h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M740.95 463.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05",fillRule:"nonzero"})," ",l.createElement("path",{d:"M940.95 360h110l27.5 27.5V520h-137.5V360Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M1050.95 360v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"m988 411.2.1-10.9c-1.15 3.8-2.7 7.25-4 10.9h-1.15l-4.05-10.9.05 10.9h-1.45v-12.4h2.2l3.85 10.55c1.05-3.75 2.55-7 3.8-10.55h2.15v12.4H988M998 409.4c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M1005.75 402.75c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1015.25 402.75c-3.6 0-2.2 5.1-2.45 8.45h-1.6v-13.05h1.6l-.05 5.15c.6-1.05 1.4-1.8 3.05-1.8 4.45 0 2.65 5.8 3 9.7h-1.6v-6.05c.1-1.6-.4-2.45-1.95-2.4M1021.15 399.65v-1.5h1.6v1.5h-1.6Zm0 11.55v-9.5h1.6v9.5h-1.6M1029.75 401.5c4.45-.2 2.65 5.8 3 9.7h-1.6v-6.05c0-1.55-.4-2.45-1.95-2.4-3.6.1-2.2 5.1-2.45 8.45h-1.6l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.55-1.1 1.45-1.75 3.05-1.8M1038.9 401.5c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M990.975 420.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M1003.73 423.1c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.5
15 3.8 0 2.15.5 3.65 2.55 3.65M1009.18 421.25v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V423.3h1.6V434c.1 2-1.15 2.9-3.25 2.45v-1.2M1016.93 423.1c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M1026.72 424.35c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1033.88 430.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M1007.48 476l.1-10.9c-1.15 3.8-2.7 7.25-4 10.9h-1.15l-4.05-10.9.05 10.9h-1.45v-12.4h2.2l3.85 10.55c1.05-3.75 2.55-7 3.8-10.55h2.15V476h-1.5M1017.43 463.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M472.24 441H434.5v-2h37.74v2Zm174.2 0H557.1v-2h89.35l-.01 2Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"M434.53 441h-1.03v-2h1.03v2Zm227.17-1-14.25 4.64v-9.28L661.7 440Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"m664.95 440-18.5 6v-12l18.5 6Zm-16.5 3.26 10.03-3.26-10.03-3.26v6.52ZM482.742 424.35c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M493.942 425.65c-.15-1.7-4.3-1.9-4.35 0 .75 2.65 5.75.6 5.95 4.5.2 3.9-7.5 3.7-7.85.4l1.4-.25c.2 1.8 4.85 2.25 4.9 0-.5-2.8-5.65-.75-5.9-4.5-.2-2.85 4.1-3.15 6.1-2.1.6.35 1.05.95 1.2 1.75M505.042 423.3c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M507.392 421.25v-1.5h1.6v1.5h-1.6Zm0 11.55v-9.5h1.6v9.5h-1.6M515.992 423.1c4.45-.2 2.65 5.8 3 9.7h-1.6v-6.05c0-1.55-.4-2.45-1.95-2.4-3.6.1-2.2 5.1-2.45 8.45h-1.6l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.55-1.1 1.45-1.75 3.05-1.8M521.342 421.25v-1.5h1.6v1.5h-1.6Zm0 11.55v-9.5h1.6v9.5h-1.6M527.042 430.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M482.742 445.95c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M493.942 447.25c-.15-1.7-4.3-1.9-4.35 0 .75 2.65 5.75.6 5.95 4.5.2 3.9-7.5 3.7-7.85.4l1.4-.25c.2 1.8 4.85 2.25 4.9 0-.5-2.8-5.65-.75-5.9-4.5-.2-2.85 4.1-3.15 6.1-2.1.6.35 1.05.95 1.2 1.75M505.042 444.9c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M516.692 445.95c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M526.142 444.7c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M536.842 446.25c-3.9-.8-2.65 4.55-2.85 8.15h-1.6l-.05-9.5h1.5c.05.6-.05 1.45.1 1.95.3-1.35 1.15-2.45 2.9-2.05v1.45M545.942 444.9c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M552.092 444.7c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M842.75 441h-37.3v-2h37.3v2Zm78.7 0h-19.8v-2h19.8v2Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"M805.48 441h-1.03v-2h1.03v2Zm131.22-1-14.25 4.64v-9.28L936.7 440Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"m939.95 440-18.5 6v-12l18.5 6Zm-16.5 3.26 10.03-3.26-10.03-3.26v6.52ZM853.25 435.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45H844l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7H855v-6.
105c0-1.45-.25-2.45-1.75-2.4M864.45 436.45c-.15-1.7-4.3-1.9-4.35 0 .75 2.65 5.75.6 5.95 4.5.2 3.9-7.5 3.7-7.85.4l1.4-.25c.2 1.8 4.85 2.25 4.9 0-.5-2.8-5.65-.75-5.9-4.5-.2-2.85 4.1-3.15 6.1-2.1.6.35 1.05.95 1.2 1.75M875.55 434.1c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M881.75 431.9c-1.55-.45-2.1.5-1.9 2.2h1.9v1.15h-1.9v8.35h-1.55v-8.35h-1.35v-1.15h1.35c-.35-2.6.85-4.1 3.45-3.4v1.2M892.2 435.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M899.6 441.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M841.9 621h-37.3v-2h37.3v2Zm78.7 0h-19.8v-2h19.8v2Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"M804.62 621h-1.03v-2h1.02l.01 2Zm131.23-1-14.26 4.64v-9.28l14.26 4.64Z",fillRule:"nonzero"})," ",l.createElement("path",{d:"m939.1 620-18.5 6v-12l18.5 6Zm-16.5 3.26 10.02-3.26-10.03-3.26.01 6.52ZM852.39 615.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M863.59 616.45c-.15-1.7-4.3-1.9-4.35 0 .75 2.65 5.75.6 5.95 4.5.2 3.9-7.5 3.7-7.85.4l1.4-.25c.2 1.8 4.85 2.25 4.9 0-.5-2.8-5.65-.75-5.9-4.5-.2-2.85 4.1-3.15 6.1-2.1.6.35 1.05.95 1.2 1.75M874.69 614.1c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M880.89 611.9c-1.55-.45-2.1.5-1.9 2.2h1.9v1.15h-1.9v8.35h-1.55v-8.35h-1.35v-1.15h1.35c-.35-2.6.85-4.1 3.45-3.4v1.2M891.34 615.15c-3.35.15-1.9 5.25-2.2 8.45h-1.55v-6.05c0-1.45-.25-2.5-1.75-2.4-3.3.2-1.9 5.2-2.2 8.45h-1.55l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.5-2.2 4.95-2.5 5.35 0 .55-1.05 1.35-1.75 2.9-1.8 4.25-.1 2.35 5.95 2.75 9.7h-1.55v-6.05c0-1.45-.25-2.45-1.75-2.4M898.74 621.25c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6",fillRule:"nonzero"})," ",l.createElement("path",{d:"M665.1 540h110l27.5 27.5V700H665.1V540Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M775.1 540v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"M702.14 578.8c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8v4.85h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M717.64 581.5c3.1-.05 4.25 1.85 4.25 4.95.05 3.15-1.35 4.95-4.3 4.95-2.95 0-4.15-1.95-4.2-4.95 0-3.3 1.4-4.95 4.25-4.95Zm-.05 8.7c2.2.05 2.65-1.55 2.65-3.75 0-2.15-.4-3.75-2.55-3.75s-2.65 1.6-2.65 3.75.5 3.7 2.55 3.75M728.34 583.05c-3.9-.8-2.65 4.55-2.85 8.15h-1.6l-.05-9.5h1.5c.05.6-.05 1.45.1 1.95.3-1.35 1.15-2.45 2.9-2.05v1.45M731.54 588.85c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M740.64 589.4c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M749.34 581.5c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M754.79 591.2v-13.05h1.6v13.05h-1.6M762.54 581.5c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M715.116 600.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M727.866 603.1c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.5
15 3.8 0 2.15.5 3.65 2.55 3.65M733.316 601.25v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V603.3h1.6V614c.1 2-1.15 2.9-3.25 2.45v-1.2M741.066 603.1c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M750.866 604.35c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M758.016 610.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M722.59 643.6c4.35.05 9.55-.75 9.55 3.75 0 3.9-3.85 4-7.9 3.8V656h-1.65v-12.4Zm1.65 6.25c2.85 0 6.2.55 6.2-2.5 0-2.95-3.4-2.35-6.2-2.4v4.9M740.09 643.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05",fillRule:"nonzero"})," ",l.createElement("path",{d:"M940.1 540h110l27.5 27.5V700H940.1V540Z",fill:"#b391b5",fillRule:"nonzero",stroke:"#987b9a",strokeWidth:"2px"})," ",l.createElement("path",{d:"M1050.1 540v27.5h27.5",fill:"#987b9a",fillRule:"nonzero"})," ",l.createElement("path",{d:"m987.14 591.2.1-10.9c-1.15 3.8-2.7 7.25-4 10.9h-1.15l-4.05-10.9.05 10.9h-1.45v-12.4h2.2l3.85 10.55c1.05-3.75 2.55-7 3.8-10.55h2.15v12.4h-1.5M997.14 589.4c-.75 1.05-1.55 2.05-3.4 2-1.8-.05-2.9-1.05-2.9-2.85-.05-3.2 3.15-3.15 6.25-3.15.15-1.75-.45-2.7-2.05-2.7-1.2.05-2.05.35-2.1 1.55l-1.65-.15c.25-1.85 1.65-2.6 3.8-2.6 2.25 0 3.6 1 3.6 3.2v4.1c-.05 1 .35 1.6 1.4 1.35v1c-1.55.45-3.05-.1-2.95-1.75Zm-4.65-.85c0 1 .6 1.65 1.6 1.65 2.05-.15 3.15-1.45 3-3.7-2.15.1-4.6-.25-4.6 2.05M1004.89 582.75c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1014.39 582.75c-3.6 0-2.2 5.1-2.45 8.45h-1.6v-13.05h1.6l-.05 5.15c.6-1.05 1.4-1.8 3.05-1.8 4.45 0 2.65 5.8 3 9.7h-1.6v-6.05c.1-1.6-.4-2.45-1.95-2.4M1020.29 579.65v-1.5h1.6v1.5h-1.6Zm0 11.55v-9.5h1.6v9.5h-1.6M1028.89 581.5c4.45-.2 2.65 5.8 3 9.7h-1.6v-6.05c0-1.55-.4-2.45-1.95-2.4-3.6.1-2.2 5.1-2.45 8.45h-1.6l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.55-1.1 1.45-1.75 3.05-1.8M1038.04 581.5c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M990.116 600.25c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05M1002.87 603.1c2.65 0 3.45 1.95 3.5 4.9 0 3.3-1.15 5-3.5 5-1.55-.05-2.45-.55-2.95-1.7l-.1 1.5h-1.55l.05-13.05h1.6v5.05c.5-1.15 1.4-1.7 2.95-1.7Zm-.4 8.7c2 0 2.25-1.7 2.25-3.75 0-2-.25-3.75-2.25-3.7-2.1 0-2.55 1.6-2.55 3.8 0 2.15.5 3.65 2.55 3.65M1008.32 601.25v-1.5h1.6v1.5h-1.6Zm-1.65 14c1.2.2 1.65-.3 1.65-1.5V603.3h1.6V614c.1 2-1.15 2.9-3.25 2.45v-1.2M1016.07 603.1c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M1025.87 604.35c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1033.02 610.45c-.1 1.2.9 1.45 1.9 1.1v1.2c-1.65.5-3.5.25-3.5-1.95v-6.35h-1.1v-1.15h1.2l.45-2.15h1.05v2.15h1.75v1.15h-1.75v6M1006.62 656l.1-10.9c-1.15 3.8-2.7 7.25-4 10.9h-1.15l-4.05-10.9.05 10.9h-1.45v-12.4h2.2l3.85 10.55c1.05-3.75 2.55-7 3.8-10.55h2.15V656h-1.5M1016.57 643.45c4.05 0 6.15 2.3 6.15 6.3 0 3.95-2.2 6.45-6.15 6.45-4.05 0-6.15-2.45-6.15-6.45s2.1-6.3 6.15-6.3Zm0 11.35c3.15 0 4.45-2.05 4.45-5.05s-1.45-4.95-4.45-4.95c-3.05 0-4.45 1.95-4.45 4.95s1.4 5 4.45 5.05",fillRule:"nonzero"})," ",l.createElement("path",{d:"M600 439V240h46.45M600 438.97V440",fill:"none",fillRule:"nonzero",stroke:"#000",strokeWidth:"2px"})," ",l.createElement("path",{d:"m661.7 240-14.25 4.64v-9.28L661.7 240Z",fillRule:"nonzero",stroke:"#000",strokeWidth:"2px"})," ",l.createElement("path",{d:"M600 441v179h45.6M600 441.03V440",fill:"none",fillRule:"nonzero",stroke:"#000",strokeWidth:"2px"})," ",l.createElement("path",{d:"m660.85 620-14.26 4.64v-9.28l14.26 4.64Z",fillRule:"nonzero",stroke:"#000",strokeWidth:"2px"})," ",l.createElement("path",{fill:"none",fillRule:"nonzero",d:"M1020 210h240v60h-240z"})," ",l.createElement("path",{d:"M1112.05 243.6v-12.4h9.35v1.4h-7.7v3.95h7.2v1.35h-7.2v4.35h8.1v1.35h-9.75M1128.4 233.9c4.45-.2 2.65 5.8 3 9.7h-1.6v-6.05c0-1.55-.4-2.45-1.95-2.4-3.6.1-2.2 5.1-2.45 8.45h-1.6l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.55-1.1 1.45-1.75 3.05-1.8M1141.4 234.1c-.5 6.25 2.05 14.65-5.5 13.05-1.15-.3-1.9-1-2.2-2.15l1.6-.25c.75 2.35 5 1.6 4.45-1.4v-1.5c-.55 1.05-1.45 1.8-3.05 1.8-2.7 0-3.4-2.05-3.4-4.8 0-2.8.8-4.85 3.55-4.9 1.45-.05 2.4.8 2.95 1.75.05-.5 0-1.15.1-1.6h1.5Zm-4.15 8.4c1.8 0 2.5-1.6 2.5-3.65 0-2.1-.7-3.75-2.5-3.75-1.95 0-2.3 1.7-2.3 3.75s.3 3.65 2.3 3.65M1143.75 243.6v-13.05h1.6v13.05h-1.6M1147.7 232.05v-1.5h1.6v1.5h-1.6Zm0 11.55v-9.5h1.6v9.5h-1.6M1157.2 236.45c-.15-1.7-4.3-1.9-4.35 0 .75 2.65 5.75.6 5.95 4.5.2 3.9-7.5 3.7-7.85.4l1.4-.25c.2 1.8 4.85 2.25 4.9 0-.5-2.8-5.65-.75-5.9-4.5-.2-2.85 4.1-3.15 6.1-2.1.6.35 1.05.95 1.2 1.75M1164.75 235.15c-3.6 0-2.2 5.1-2.45 8.45h-1.6v-13.05h1.6l-.05 5.15c.6-1.05 1.4-1.8 3.05-1.8 4.45 0 2.65 5.8 3 9.7h-1.6v-6.05c.1-1.6-.4-2.45-1.95-2.4",fillRule:"nonzero"})," ",l.createElement("path",{fill:"none",fillRule:"nonzero",d:"M1020 420h240v60h-240z"})," ",l.createElement("path",{d:"M1115.2 442.6v4.6h6.9v1.4h-6.9v5h-1.65v-12.4h8.75v1.4h-7.1M1128.7 445.45c-3.9-.8-2.65 4.55-2.85 8.15h-1.6l-.05-9.5h1.5c.05.6-.05 1.45.1 1.95.3-1.35 1.15-2.45 2.9-2.05v1.45M1133.95 443.9c3.15 0 4.3 2.1 4.2 5.3h-6.75c0 2 .7 3.35 2.65 3.4 1.3.05 2.15-.6 2.45-1.45l1.4.4c-.55 1.4-1.85 2.25-3.85 2.25-2.9 0-4.4-1.85-4.35-5 .05-3.05 1.3-4.9 4.25-4.9Zm2.6 4.05c.3-3-3.8-3.85-4.85-1.4-.15.35-.3.85-.3 1.4h5.15M1144.8 443.9c4.45-.2 2.65 5.8 3 9.7h-1.6v-6.05c0-1.55-.4-2.45-1.95-2.4-3.6.1-2.2 5.1-2.45 8.45h-1.6l-.05-9.5h1.5c.05.5-.05 1.2.1 1.6.55-1.1 1.45-1.75 3.05-1.8M1153.75 445.15c-2 0-2.4 1.65-2.4 3.65s.45 3.75 2.4 3.75c1.2 0 2.05-.7 2.15-1.9l1.6.1c-.3 1.85-1.55 3.05-3.7 3.05-2.95 0-3.8-2.05-4.1-4.95-.5-4.65 5.05-6.55 7.35-3.2.2.35.25.7.35 1.1l-1.6.15c-.2-1.05-.8-1.75-2.05-1.75M1163.25 445.15c-3.6 0-2.2 5.1-2.45 8.45h-1.6v-13.05h1.6l-.05 5.15c.6-1.05 1.4-1.8 3.05-1.8 4.45 0 2.65 5.8 3 9.7h-1.6v-6.05c.1-1.6-.4-2.45-1.95-2.4",fillRule:"nonzero"})," ",l.createElement("path",{fill:"none",fillRule:"nonzero",d:"M1020 590h240v60h-240z"})," ",l.createElement("path",{d:"M1134.15 623.6v-1.9h1.7v1.9h-1.7M1139.15 623.6v-1.9h1.7v1.9h-1.7M1144.15 623.6v-1.9h1.7v1.9h-1.7",fillRule:"nonzero"}))},r=a(42854),h=a(94296);function m(e){const t=Object.assign({strong:"strong",p:"p",ul:"ul",li:"li",code:"code",a:"a",h2:"h2",span:"span",ol
1:"ol",h3:"h3",pre:"pre"},(0,n.R)(),e.components);return l.createElement(l.Fragment,null,l.createElement(r.J,{name:"translation-with-gettext-and-php",text:l.createElement(l.Fragment,null,"Use BabelEdit to translate your ",l.createElement(t.strong,null,"po files")," faster with a ",l.createElement(t.strong,null,"clean UI"),", ",l.createElement(t.strong,null,"AI-powered translations"),", and consistency checks that catch errors before they reach production.")}),"\n",l.createElement(t.p,null,"Gettext is the standard way to localize plain PHP applications. In this hands-on tutorial, youâll learn how to:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"Prepare your PHP app for translations"),"\n",l.createElement(t.li,null,"Extract messages with ",l.createElement(t.code,null,"xgettext")),"\n",l.createElement(t.li,null,"Translate PO files quickly with BabelEdit"),"\n",l.createElement(t.li,null,"Compile MO files"),"\n",l.createElement(t.li,null,"Handle updates, pluralization, and caching without headaches"),"\n"),"\n",l.createElement(t.p,null,"Using a PHP framework? Many ship their own i18n tooling. If thatâs you, check out this guide instead:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,l.createElement(t.a,{href:"/babeledit/tutorials/how-to-translate-your-laravel-project"},"Laravel translation tutorial: How to translate your web app"),"."),"\n"),"\n",l.createElement(t.h2,{id:"the-translation-workflow",style:{position:"relative"}},"The translation workflow",l.createElement(t.a,{href:"#the-translation-workflow","aria-label":"the translation workflow permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Hereâs the big picture of the gettext workflow for PHP.\nYouâll cycle through these steps during development:"),"\n",l.createElement(t.ol,null,"\n",l.createElement(t.li,null,"Extract translatable messages with ",l.createElement(t.code,null,"xgettext")," â Portable Object Template (.pot)"),"\n",l.createElement(t.li,null,"Create or update language files with ",l.createElement(t.code,null,"msginit"),"/",l.createElement(t.code,null,"msgmerge")," â Portable Object (.po)"),"\n",l.createElement(t.li,null,"Compile PO files to fast, binary catalogs with ",l.createElement(t.code,null,"msgfmt")," â Machine Object (.mo)"),"\n"),"\n",l.createElement(s,{className:"w-full"}),"\n",l.createElement(t.h2,{id:"prepare-your-php-app-for-translations",style:{position:"relative"}},"Prepare your PHP app for translations",l.createElement(t.a,{href:"#prepare-your-php-app-for-translations","aria-label":"prepare your php app for translations permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Before you start, make sure gettext will work on both your development and production machines:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"PHP extensions ",l.createElement(t.code,null,"gettext")," and ",l.createElement(t.code,null,"mbstring")," are installed and enabled"),"\n",l.createElement(t.li,null,"The locales you plan to support are installed on the OS"),"\n"),"\n",l.createElement(t.p,null,"The next 2 sections show you how to verify both requirements."),"\n",l.createElement(t.h3,{id:"check-php-modules",style:{position:"relative"}}
1,"Check PHP modules",l.createElement(t.a,{href:"#check-php-modules","aria-label":"check php modules permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"PHP needs the ",l.createElement(t.code,null,"gettext")," and ",l.createElement(t.code,null,"mbstring")," extensions for translations.\nCreate a tiny script with ",l.createElement(t.code,null,"phpinfo()")," to confirm theyâre enabled.\nIf one is missing, install/enable it in your ",l.createElement(t.code,null,"php.ini")," (or via your package manager/container image)."),"\n",l.createElement(t.h3,{id:"set-the-language",style:{position:"relative"}},"Set the language",l.createElement(t.a,{href:"#set-the-language","aria-label":"set the language permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Start by setting the locale you want to display â and do it before your first translation lookup.\nGettext resolves translations at runtime, so the locale must be set first."),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-php"},"setlocale(LC_ALL, 'de_DE.UTF-8');\n")),"\n",l.createElement(t.p,null,"The gettext module in PHP only supports languages and language identifiers that\nare installed on your server."),"\n",l.createElement(t.p,null,"Check the available locales by calling"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"locale -a\n")),"\n",l.createElement(t.p,null,"on the command line of your server (e.g., by logging in with SSH)."),"\n",l.createElement(t.p,null,"You can install missing locales with"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"locale-gen <language>\n")),"\n",l.createElement(t.p,null,"This command may require admin privileges and might not be available on shared hosting.\nIf your target locale isnât installed, ask your admin to add it or consider using a framework-level i18n solution."),"\n",l.createElement(t.h3,{id:"set-the-translation-files",style:{position:"relative"}},"Set the translation files",l.createElement(t.a,{href:"#set-the-translation-files","aria-label":"set the translation files permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Tell PHP where to find your translations and which encoding to use:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-php"},'bindtextdomain("myapp", "locale");\nbind_textdomain_codeset("myapp", "UTF-8");\n')),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,l.createElement(t.code,null,"myapp")," is the text domain (it also becomes the translation file name).\nYou can bind multiple domains if you split translations across files."),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"locale")," is the base directory that contains your language folders.\nThe path is relative to the PHP file unless you use an absolute path."),"\n",l.createElement(t.li,null,l.createElement(t.code,null,'bind_textdomain_codeset("myapp", "UTF-8")')," makes sure gettext reads and returns UTFâ8 strings."),"\n"),"\n",l.createElement(t.p,null,"In our example PHP will try to load the following translation file: ",l.createElement(t.strong,null,"locale/de_DE.UTF-8/LC_MESSAGES/myapp.mo")),"\n",l.createElement(t.p,null,l.createElement(t.code,null,"LC_MESSAGES")," is a predefined folder name, it is mandatory."),"\n",l.createElement(t.p,null,l.createElement(t.code,null,"de_DE.UTF-8")," is the locale identifier you've passed to ",l.createElement(t.code,null,"setlocale()")," before.\nIn the folder name, country code, and the encoding are optional. The\nfile loader will also try to find these translation files:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,l.createElement(t.strong,null,"locale/de_DE/LC_MESSAGES/myapp.mo")),"\n",l.createElement(t.li,null,l.createElement(t.strong,null,"locale/de/LC_MESSAGES/myapp.mo")),"\n"),"\n",l.createElement(t.h3,{id:"set-the-active-text-domain",style:{position:"relative"}}
1,"Set the active text domain",l.createElement(t.a,{href:"#set-the-active-text-domain","aria-label":"set the active text domain permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Choose which domain gettext should use for subsequent ",l.createElement(t.code,null,"_()")," lookups:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-php"},'textdomain("myapp");\n')),"\n",l.createElement(t.p,null,"The domain name must have been bound with ",l.createElement(t.code,null,"bindtextdomain()")," first (see above)."),"\n",l.createElement(t.h3,{id:"add-text-markup",style:{position:"relative"}},"Add text markup",l.createElement(t.a,{href:"#add-text-markup","aria-label":"add text markup permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Now wrap translatable strings with the ",l.createElement(t.code,null,"_()")," helper (an alias of ",l.createElement(t.code,null,"gettext"),").\nIt returns the translation for the locale you set via ",l.createElement(t.code,null,"setlocale()"),":"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-php"},'<?php\n$language = \'fr\';\nputenv("LANG=$language");\nsetlocale(LC_ALL, $language);\n\n$domain = \'myapp\';\nbindtextdomain($domain, "./locale");\nbind_textdomain_codeset("myapp", "UTF-8");\ntextdomain($domain);\n\necho _("Hello World")."\\n";\n\n// This comment is extracted and displayed in BabelEdit\necho _("How are you?")."\\n";echo _("How are you?")."\\n";\n')),"\n",l.createElement(t.p,null,"The ",l.createElement(t.code,null,"_()")," function is also used to extract translatable strings from your source\ncode automatically."),"\n",l.createElement(t.p,null,"A comment above the ",l.createElement(t.code,null,"_()")," call is extracted by ",l.createElement(t.code,null,"xgettext")," and displayed in BabelEdit.\nUse it to give translators context and useful hints."),"\n",l.createElement(t.p,null,"On the command line, you can use ",l.createElement(t.code,null,"putenv()")," to set the ",l.createElement(t.code,null,"LANG")," environment variable.\nIn web apps, ",l.createElement(t.code,null,"setlocale()")," is usually enough. Environments vary across OS/PHP versions,\nso using both during development is a safe, portable choice."),"\n",l.createElement(t.h2,{id:"create-and-manage-translation-files",style:{position:"relative"}},"Create and manage translation files",l.createElement(t.a,{href:"#create-and-manage-translation-files","aria-label":"create and manage translation files permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.h3,{id:"extract-strings-with-xgettext",style:{position:"relative"}}
1,"Extract strings with ",l.createElement(t.code,null,"xgettext"),l.createElement(t.a,{href:"#extract-strings-with-xgettext","aria-label":"extract strings with xgettext permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Use ",l.createElement(t.code,null,"xgettext")," to scan your PHP files and extract every ",l.createElement(t.code,null,"_()")," and ",l.createElement(t.code,null,"ngettext()")," string.\nIt writes a Portable Object Template (.pot) file.\nDonât hand-edit the POT file â ",l.createElement(t.code,null,"xgettext")," regenerates it each time."),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"xgettext --from-code UTF-8 --add-comments *.php -o myapp.pot\n")),"\n",l.createElement(t.p,null,"With the ",l.createElement(t.code,null,"--add-comments")," option, comment blocks preceding the ",l.createElement(t.code,null,"_(...)")," expression\nare copied from the source code to the .pot file. Use these comments to give translators\nhelpful context."),"\n",l.createElement(c.pl,null,l.createElement(t.p,null,l.createElement(t.code,null,"xgettext")," will set a placeholder for the charset (",l.createElement(t.code,null,"CHARSET"),"), even if you set it to UTF-8.",l.createElement("br"),"\nSearch for ",l.createElement(t.code,null,"Content-Type: text/plain; charset=CHARSET")," and replace ",l.createElement(t.code,null,"CHARSET")," with ",l.createElement(t.code,null,"UTF-8"),".")),"\n",l.createElement(t.h3,{id:"create-initial-po-files-with-msginit",style:{position:"relative"}},"Create initial PO files with ",l.createElement(t.code,null,"msginit"),l.createElement(t.a,{href:"#create-initial-po-files-with-msginit","aria-label":"create initial po files with msginit permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"The POT file is the template file used to create a new PO file for each target language.\nPlace them in directories as mentioned above:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"mkdir locale locale/de locale/fr locale/de/LC_MESSAGES locale/fr/LC_MESSAGES\nmsginit --locale de.UTF-8 --input myapp.pot --output locale/de/LC_MESSAGES/myapp.po\nmsginit --locale fr.UTF-8 --input myapp.pot --output locale/fr/LC_MESSAGES/myapp.po\n")),"\n",l.createElement(t.p,null,"This step is only needed once when you set up your project. As ",l.createElement(t.code,null,"msginit"),"\noverwrites an existing PO file, you shouldn't call it if you have already PO files\ncontaining translations. In this case use ",l.createElement(t.code,null,"msgmerge")," as described later."),"\n",l.createElement(t.h3,{id:"translate-the-po-files",style:{position:"relative"}},"Translate the PO files",l.createElement(t.a,{href:"#translate-the-po-files","aria-label":"translate the po files permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"The easiest way to translate PO files is with ",l.createElement(t.a,{href:"/babeledit"},"BabelEdit"),".\nDownload it here:"),"\n",l.createElement(h.f,{product:"babeledit"}),"\n",l.createElement(t.p,null,"Then:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"Drag and drop your ",l.createElement(t.code,null,"locale")," folder into BabelEdit (it will detect your PO files)."),"\n",l.createElement(t.li,null,"Confirm the auto-detected languages (you can adjust them if needed), then click ",l.createElement(t.strong,null,"OK"),"."),"\n"),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<span\n class="gatsby-resp-image-wrapper"\n style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 832px; "\n >
1\n <span\n class="gatsby-resp-image-background-image"\n style="padding-bottom: 72.11538461538461%; position: relative; bottom: 0; left: 0; display: block;"\n ></span>\n <picture>\n <source\n srcset="/static/0681b1c418a57fdb0776f3e352f6248d/b4f21/configuring-a-po-file-project%402x.avif 208w,\n/static/0681b1c418a57fdb0776f3e352f6248d/a7f15/configuring-a-po-file-project%402x.avif 416w,\n/static/0681b1c418a57fdb0776f3e352f6248d/01fa0/configuring-a-po-file-project%402x.avif 832w,\n/static/0681b1c418a57fdb0776f3e352f6248d/acbef/configuring-a-po-file-project%402x.avif 1248w,\n/static/0681b1c418a57fdb0776f3e352f6248d/6ba7a/configuring-a-po-file-project%402x.avif 1664w,\n/static/0681b1c418a57fdb0776f3e352f6248d/5ad23/configuring-a-po-file-project%402x.avif 2176w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/avif"\n /><source\n srcset="/static/0681b1c418a57fdb0776f3e352f6248d/6abcd/configuring-a-po-file-project%402x.webp 208w,\n/static/0681b1c418a57fdb0776f3e352f6248d/69edf/configuring-a-po-file-project%402x.webp 416w,\n/static/0681b1c418a57fdb0776f3e352f6248d/da8f3/configuring-a-po-file-project%402x.webp 832w,\n/static/0681b1c418a57fdb0776f3e352f6248d/28eb2/configuring-a-po-file-project%402x.webp 1248w,\n/static/0681b1c418a57fdb0776f3e352f6248d/dcb2d/configuring-a-po-file-project%402x.webp 1664w,\n/static/0681b1c418a57fdb0776f3e352f6248d/48b22/configuring-a-po-file-project%402x.webp 2176w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/webp"\n />\n <source\n srcset="/static/0681b1c418a57fdb0776f3e352f6248d/3697c/configuring-a-po-file-project%402x.png 208w,\n/static/0681b1c418a57fdb0776f3e352f6248d/e3e0f/configuring-a-po-file-project%402x.png 416w,\n/static/0681b1c418a57fdb0776f3e352f6248d/283d3/configuring-a-po-file-project%402x.png 832w,\n/static/0681b1c418a57fdb0776f3e352f6248d/b19d7/configuring-a-po-file-project%402x.png 1248w,\n/static/0681b1c418a57fdb0776f3e352f6248d/fe2bb/configuring-a-po-file-project%402x.png 1664w,\n/static/0681b1c418a57fdb0776f3e352f6248d/e4795/configuring-a-po-file-project%402x.png 2176w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/png"\n />\n <img\n class="gatsby-resp-image-image"\n src="/static/0681b1c418a57fdb0776f3e352f6248d/283d3/configuring-a-po-file-project%402x.png"\n alt="Configuring a po file project in BabelEdit"\n title=""\n loading="lazy"\n decoding="async"\n style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"\n />\n </picture>\n </span>'}}),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"Select all items on the left and click ",l.createElement(t.strong,null,"Pre Translate")," in the toolbar."),"\n",l.createElement(t.li,null,"Keep the default preset and click ",l.createElement(t.strong,null,"Translate")," to fill in French and German automatically."),"\n"),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<figure class="gatsby-resp-image-figure" style="">\n <span\n class="gatsby-resp-image-wrapper"\n style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 832px; "\n >
1\n <span\n class="gatsby-resp-image-background-image"\n style="padding-bottom: 65.86538461538461%; position: relative; bottom: 0; left: 0; display: block;"\n ></span>\n <picture>\n <source\n srcset="/static/7876706241157aaa2ee29a3ac4fabcdb/b4f21/editing-po-files-with-babeledit%402x.avif 208w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/a7f15/editing-po-files-with-babeledit%402x.avif 416w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/01fa0/editing-po-files-with-babeledit%402x.avif 832w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/acbef/editing-po-files-with-babeledit%402x.avif 1248w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/6ba7a/editing-po-files-with-babeledit%402x.avif 1664w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/20824/editing-po-files-with-babeledit%402x.avif 2350w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/avif"\n /><source\n srcset="/static/7876706241157aaa2ee29a3ac4fabcdb/6abcd/editing-po-files-with-babeledit%402x.webp 208w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/69edf/editing-po-files-with-babeledit%402x.webp 416w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/da8f3/editing-po-files-with-babeledit%402x.webp 832w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/28eb2/editing-po-files-with-babeledit%402x.webp 1248w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/dcb2d/editing-po-files-with-babeledit%402x.webp 1664w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/a3a11/editing-po-files-with-babeledit%402x.webp 2350w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/webp"\n />\n <source\n srcset="/static/7876706241157aaa2ee29a3ac4fabcdb/3697c/editing-po-files-with-babeledit%402x.png 208w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/e3e0f/editing-po-files-with-babeledit%402x.png 416w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/283d3/editing-po-files-with-babeledit%402x.png 832w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/b19d7/editing-po-files-with-babeledit%402x.png 1248w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/fe2bb/editing-po-files-with-babeledit%402x.png 1664w,\n/static/7876706241157aaa2ee29a3ac4fabcdb/7388f/editing-po-files-with-babeledit%402x.png 2350w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/png"\n />\n <img\n class="gatsby-resp-image-image"\n src="/static/7876706241157aaa2ee29a3ac4fabcdb/283d3/editing-po-files-with-babeledit%402x.png"\n alt="Editing po files with BabelEdit"\n title="Editing po files with BabelEdit"\n loading="lazy"\n decoding="async"\n style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"\n />\n </picture>\n </span>\n <figcaption class="gatsby-resp-image-figcaption">Editing po files with BabelEdit</figcaption>\n </figure>'}}),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"Review and tweak the suggestions where necessary."),"\n",l.createElement(t.li,null,"Click ",l.createElement(t.strong,null,"Save"),". BabelEdit will ask you for a project file name â it stores your language/file setup so you can reopen everything later with one click."),"\n"),"\n",l.createElement(t.h3,{id:"convert-po-to-mo-files-using-msgfmt",style:{position:"relative"}},"Convert PO to MO files using ",l.createElement(t.code,null,"msgfmt"),l.createElement(t.a,{href:"#convert-po-to-mo-files-using-msgfmt","aria-label":"convert po to mo files using msgfmt permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,'To use the translated strings in your PHP script, you have to convert the PO files\ninto "Machine Object" files (with the extension .mo).'),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"msgfmt locale/de/LC_MESSAGES/myapp.po --output-file=locale/de/LC_MESSAGES/myapp.mo\nmsgfmt locale/fr/LC_MESSAGES/myapp.po --output-file=locale/fr/LC_MESSAGES/myapp.mo\n")),"\n",l.createElement(t.h3,{id:"test-the-app",style:{position:"relative"}}
1,"Test the app",l.createElement(t.a,{href:"#test-the-app","aria-label":"test the app permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Run your PHP script and you should see translated output.\nHeads-up: gettext caches translations. If you add, remove, or update MO files,\nyou may need to reload/restart your web server to see the changes."),"\n",l.createElement(t.p,null,"We offer a solution to this without restarting the server later in this tutorial!"),"\n",l.createElement(t.h3,{id:"managing-changes-with-msgmerge",style:{position:"relative"}},"Managing changes with ",l.createElement(t.code,null,"msgmerge"),l.createElement(t.a,{href:"#managing-changes-with-msgmerge","aria-label":"managing changes with msgmerge permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"When your PHP code changes, your translations often need to keep up.\nUse ",l.createElement(t.code,null,"msgmerge")," â the gettext tool that syncs your template and language files â to update your PO/MO files."),"\n",l.createElement(t.p,null,"First, you have to extract the\ntranslatable strings from the new PHP sources using ",l.createElement(t.code,null,"xgettext"),". This overwrites\nyour old POT file with a new one."),"\n",l.createElement(t.p,null,"Then you can merge the changes into the language-specific PO files:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"xgettext --add-comments *.php -o myapp.pot\nmsgmerge --update locale/de/LC_MESSAGES/myapp.po myapp.pot\nmsgmerge --update locale/fr/LC_MESSAGES/myapp.po myapp.pot\n")),"\n",l.createElement(t.p,null,"... translate new / changed texts in myapp.po ..."),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-bash"},"msgfmt locale/de/LC_MESSAGES/myapp.po --output-file=locale/de/LC_MESSAGES/myapp.mo\n")),"\n",l.createElement(t.p,null,l.createElement(t.code,null,"msgmerge"),' updates your PO files with any new or changed messages.\nFor minor edits, it keeps the match and marks the entry as "fuzzy" â a reminder to review the translation.'),"\n",l.createElement(t.p,null,'Example: If you change "Hello World" to "Hello World!" (with the added ',l.createElement(t.code,null,"!"),") you will see this in BabelEdit:"),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<figure class="gatsby-resp-image-figure" style="">\n <span\n class="gatsby-resp-image-wrapper"\n style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 832px; "\n >
1\n <span\n class="gatsby-resp-image-background-image"\n style="padding-bottom: 61.53846153846154%; position: relative; bottom: 0; left: 0; display: block;"\n ></span>\n <picture>\n <source\n srcset="/static/5a6c5ba90cf1bde83c751999a101fb35/b4f21/fuzzy-flags-in-po-files%402x.avif 208w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/a7f15/fuzzy-flags-in-po-files%402x.avif 416w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/01fa0/fuzzy-flags-in-po-files%402x.avif 832w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/acbef/fuzzy-flags-in-po-files%402x.avif 1248w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/6ba7a/fuzzy-flags-in-po-files%402x.avif 1664w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/8e2fb/fuzzy-flags-in-po-files%402x.avif 2184w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/avif"\n /><source\n srcset="/static/5a6c5ba90cf1bde83c751999a101fb35/6abcd/fuzzy-flags-in-po-files%402x.webp 208w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/69edf/fuzzy-flags-in-po-files%402x.webp 416w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/da8f3/fuzzy-flags-in-po-files%402x.webp 832w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/28eb2/fuzzy-flags-in-po-files%402x.webp 1248w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/dcb2d/fuzzy-flags-in-po-files%402x.webp 1664w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/39e43/fuzzy-flags-in-po-files%402x.webp 2184w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/webp"\n />\n <source\n srcset="/static/5a6c5ba90cf1bde83c751999a101fb35/3697c/fuzzy-flags-in-po-files%402x.png 208w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/e3e0f/fuzzy-flags-in-po-files%402x.png 416w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/283d3/fuzzy-flags-in-po-files%402x.png 832w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/b19d7/fuzzy-flags-in-po-files%402x.png 1248w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/fe2bb/fuzzy-flags-in-po-files%402x.png 1664w,\n/static/5a6c5ba90cf1bde83c751999a101fb35/b4dfc/fuzzy-flags-in-po-files%402x.png 2184w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/png"\n />\n <img\n class="gatsby-resp-image-image"\n src="/static/5a6c5ba90cf1bde83c751999a101fb35/283d3/fuzzy-flags-in-po-files%402x.png"\n alt="Fuzzy flags in PO files"\n title="BabelEdit shows a warning symbol for translations in which the source text changed."\n loading="lazy"\n decoding="async"\n style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"\n />\n </picture>\n </span>\n <figcaption class="gatsby-resp-image-figcaption">BabelEdit shows a warning symbol for translations in which the source text changed.</figcaption>\n </figure>'}}),"\n",l.createElement(t.p,null,"Click on the warning symbol to clear it."),"\n",l.createElement(t.p,null,"Bigger changes in a source message are treated as new messages."),"\n",l.createElement(t.h3,{id:"pluralization",style:{position:"relative"}},"Pluralization",l.createElement(t.a,{href:"#pluralization","aria-label":"pluralization permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"Pluralization selects the correct translation for a given number. This is supported by the\n",l.createElement(t.code,null,"ngettext()")," function:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-php"},'for ($i = 0; $i <= 3; $i++)\n{\n $msg = ngettext(\n "You have one new message",\n "You have %d new messages",\n $i\n );\n printf($msg. "\\n", $i) ;\n}\n')),"\n",l.createElement(t.p,null,"The first argument is the singular form, the second is the plural form,\nand the third is the number. The function returns the correct form for that number â\nbut it doesnât insert the number for you.\nFormat it yourself with ",l.createElement(t.code,null,"printf()")," or ",l.createElement(t.code,null,"sprintf()"),"."),"\n",l.createElement(t.p,null,"In BabelEdit, pluralization looks like this:"),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<figure class="gatsby-resp-image-figure" style="">\n <span\n class="gatsby-resp-image-wrapper"\n style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 832px; "\n >
1\n <span\n class="gatsby-resp-image-background-image"\n style="padding-bottom: 52.88461538461539%; position: relative; bottom: 0; left: 0; display: block;"\n ></span>\n <picture>\n <source\n srcset="/static/1078fd5a1b3477625f326aa04d4f99a3/b4f21/pluralization-with-po-files%402x.avif 208w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/a7f15/pluralization-with-po-files%402x.avif 416w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/01fa0/pluralization-with-po-files%402x.avif 832w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/acbef/pluralization-with-po-files%402x.avif 1248w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/6ba7a/pluralization-with-po-files%402x.avif 1664w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/1b4e2/pluralization-with-po-files%402x.avif 2118w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/avif"\n /><source\n srcset="/static/1078fd5a1b3477625f326aa04d4f99a3/6abcd/pluralization-with-po-files%402x.webp 208w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/69edf/pluralization-with-po-files%402x.webp 416w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/da8f3/pluralization-with-po-files%402x.webp 832w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/28eb2/pluralization-with-po-files%402x.webp 1248w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/dcb2d/pluralization-with-po-files%402x.webp 1664w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/7649a/pluralization-with-po-files%402x.webp 2118w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/webp"\n />\n <source\n srcset="/static/1078fd5a1b3477625f326aa04d4f99a3/3697c/pluralization-with-po-files%402x.png 208w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/e3e0f/pluralization-with-po-files%402x.png 416w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/283d3/pluralization-with-po-files%402x.png 832w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/b19d7/pluralization-with-po-files%402x.png 1248w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/fe2bb/pluralization-with-po-files%402x.png 1664w,\n/static/1078fd5a1b3477625f326aa04d4f99a3/ea318/pluralization-with-po-files%402x.png 2118w"\n sizes="(max-width: 832px) 100vw, 832px"\n type="image/png"\n />\n <img\n class="gatsby-resp-image-image"\n src="/static/1078fd5a1b3477625f326aa04d4f99a3/283d3/pluralization-with-po-files%402x.png"\n alt="Pluralization in PO files"\n title="Pluralization in PO files"\n loading="lazy"\n decoding="async"\n style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"\n />\n </picture>\n </span>\n <figcaption class="gatsby-resp-image-figcaption">Pluralization in PO files</figcaption>\n </figure>'}}),"\n",l.createElement(t.h2,{id:"practical-tips-for-using-gettext-with-php",style:{position:"relative"}},"Practical tips for using gettext with PHP",l.createElement(t.a,{href:"#practical-tips-for-using-gettext-with-php","aria-label":"practical tips for using gettext with php permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.h3,{id:"i-updated-my-po-and-mo-files-but-why-do-i-see-no-changes-in-the-browser",style:{position:"relative"}},"I updated my PO and MO files, but why do I see no changes in the browser?",l.createElement(t.a,{href:"#i-updated-my-po-and-mo-files-but-why-do-i-see-no-changes-in-the-browser","aria-label":"i updated my po and mo files but why do i see no changes in the browser permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"On servers, gettext can be confusing at first because it caches translations in memory.\nThat cache persists across requests and doesnât notice file changes â so you may see outdated strings."),"\n",l.createElement(t.p,null,"Clearing your browser cache wonât help (the cache is on the server).\nThereâs no perfect fix, but this helper function works very well in practice:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-php"},"function setLocaleWithCacheBusting($locale): void\n{\n $domain_base = 'myapp';\n\n $locale_path = __DIR__ . \"/locale/$locale/LC_MESSAGES/\";\n $mo_file = $locale_path . $domain_base . '.mo';\n\n if (file_exists($mo_file))\n {\n $mtime = filemtime($mo_file);\n $domain = $domain_base . '_' . $mtime;\n $moLink = $locale_path . $domain . '.mo';\n if(!file_exists( $moLink ))\n {\n symlink($mo_file, $locale_path . $domain . '.mo');\n }\n }\n else\n {\n $domain = $domain_base;\n }\n\n bindtextdomain($domain, __DIR__ . \"/locale\");
1\n bind_textdomain_codeset($domain, 'UTF-8');\n\n setlocale(LC_ALL, $locale);\n\n textdomain($domain);\n}\n")),"\n",l.createElement(t.p,null,"In short, it checks the MO fileâs modification time and creates a versioned symlink.\nThat way gettext loads a ânewâ domain whenever the file changes, busting the cache."),"\n",l.createElement(t.h3,{id:"simplifying-extraction-and-compilation",style:{position:"relative"}},"Simplifying extraction and compilation",l.createElement(t.a,{href:"#simplifying-extraction-and-compilation","aria-label":"simplifying extraction and compilation permalink",className:"anchor after"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}}))),"\n",l.createElement(t.p,null,"This ",l.createElement(t.strong,null,"Makefile")," makes extracting and compiling PO files easy on Linux, macOS, and Windows (via WSL)."),"\n",l.createElement(t.p,null,"Adjust the variables at the top:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,null,"DOMAIN = myapp\nLANGUAGES = de fr\n")),"\n",l.createElement(t.p,null,"To extract translatable strings from PHP files, run:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,null,"make extract\n")),"\n",l.createElement(t.p,null,"This also updates the PO files with new messages or creates new ones when adding a language."),"\n",l.createElement(t.p,null,"To compile PO files into MO files, run:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,null,"make compile\n")),"\n",l.createElement(t.p,null,"Here's the complete Makefile:"),"\n",l.createElement(t.pre,null,l.createElement(t.code,{className:"language-makefile:title=Makefile"},'# Variables\nDOMAIN = myapp\nLANGUAGES = de fr\n\nPOTFILE = $(DOMAIN).pot\nPHPFILES = phpfilelist.txt\n\n# Show help\nhelp:\n\t@echo "Available targets:"\n\t@echo " extract - Extract translations to $(POTFILE) and update the PO files"\n\t@echo " compile - Compile PO files to MO files"\n\t@echo " help - Show this help message"\n\t@echo " "\n\t@echo "Workflow:"\n\t@echo " - run \'make extract\' to update the PO files with new IDs"\n\t@echo " - edit the PO files"\n\t@echo " - run \'make compile\' to compile the PO files into MO files"\n\n.PHONY: all extract update compile clean help\n\nextract: extract-pot update-po\n\n# 1) Extract messages and add them to the myapp.pot\nextract-pot:\n\t@echo "Extracting translatable strings from PHP files..."\n\tfind . -name \'*.php\' >$(PHPFILES)\n\t@xgettext --language=PHP \\\n\t\t--keyword=_ \\\n\t\t--keyword=ngettext:1,2 \\\n\t\t--from-code=UTF-8 \\\n --add-comments \\\n\t\t--output=$(POTFILE) \\\n\t\t--package-name=$(DOMAIN) \\\n\t\t--package-version=1.0 \\\n\t\[email protected] \\\n\t\t--files-from=$(PHPFILES)\n\t@sed -i.bak \'s/charset=CHARSET/charset=UTF-8/\' $(POTFILE)\n\t@rm -f $(POTFILE).bak\n\t@echo "Messages extracted to $(POTFILE)"\n\n# 2) Update the po files for all languages\nupdate-po:\n\t@echo "Updating PO files with new messages..."\n\t@for lang in $(LANGUAGES); do \\\n\t\tpo=locale/$$lang/LC_MESSAGES/$(DOMAIN).po; \\\n\t\techo "Updating $$po..."; \\\n\t\tif [ -f "$$po" ]; then \\\n\t\t\tmsgmerge --update --backup=off $$po $(POTFILE); \\\n\t\telse \\\n\t\t\techo "Warning: $$po does not exist, creating from $(POTFILE)"; \\\n\t\t\tmkdir -p $$(dirname $$po); \\\n\t\t\tmsginit --input=$(POTFILE) \\\n\t\t\t\t--output-file=$$po \\\n\t\t\t\t--locale="$$lang.UTF-8"; \\\n\t\tfi; \\\n\tdone\n\t@echo "PO files updated"\n\n# 3) Compile the po files into mo files\ncompile:\n\t@echo "Compiling PO files to MO files..."\n\t@for lang in $(LANGUAGES); do \\\n\t\tpo=locale/$$lang/LC_MESSAGES/$(DOMAIN).po; \\\n\t\tmo=locale/$$lang/LC_MESSAGES/$(DOMAIN).mo; \\\n\t\tfind locale/$$lang/LC_MESSAGES/ -name "$(DOMAIN)_*.mo" -type link -exec rm {} +; \\\n\t\techo "Compiling $$po -> $$mo"; \\\n\t\tmsgfmt --output-file=$$mo $$po; \\\n\tdone\n\t@echo "MO files compiled"\n')))}var d=function(e){void 0===e&&(e={});const{wrapper:t}=Object.assign({},(0,n.R)(),e.components);return t?l.createElement(t,e,l.createElement(m,e)):m(e)},p=a(11042),f=a(77891),u=a(74110);function v(e){let{data:t,pageContext:a,children:n}=e;const c=a.pageData,i=t.mdx,o=i.tableOfContents,s=i.frontmatter.noTitleImage?null:i.frontmatter.image;return l.createElement(f.W,null,l.createElement(u.n,{pageData:c,image:s,onPageItems:o.items},n))}function g(e){return l.createElement(v,e,l.createElement(d,e))}const b=e=>{let{pageContext:t}=e;return l.createElement(l.Fragment,null,l.createElement(p.A,{pageData:t.pageData}))}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.