[{"data":1,"prerenderedAt":1888},["ShallowReactive",2],{"navigation":3,"content-translator-navigation":552,"content-translator-version":593,"mdc--4zkox4-key":705,"\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies":735,"\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies-surround":1883},[4,139,265,303,320,384,395,531],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":38},"Copilot","i-ri-sparkling-line","\u002Fdocs\u002Fcopilot","1.docs\u002F1.copilot",[10,21,39,60,85,122],{"title":11,"path":12,"stem":13,"children":14},"Getting Started","\u002Fdocs\u002Fcopilot\u002Fgetting-started","1.docs\u002F1.copilot\u002F1.getting-started\u002F1.index",[15,17],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fcopilot\u002Fgetting-started\u002Finstallation","1.docs\u002F1.copilot\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24,"children":25,"page":38},"Configuration","\u002Fdocs\u002Fcopilot\u002Fconfiguration","1.docs\u002F1.copilot\u002F2.configuration",[26,30,34],{"title":27,"path":28,"stem":29},"Global Configuration","\u002Fdocs\u002Fcopilot\u002Fconfiguration\u002Fglobal","1.docs\u002F1.copilot\u002F2.configuration\u002F1.global",{"title":31,"path":32,"stem":33},"View Button & Field Configuration","\u002Fdocs\u002Fcopilot\u002Fconfiguration\u002Flocal","1.docs\u002F1.copilot\u002F2.configuration\u002F2.local",{"title":35,"path":36,"stem":37},"System Prompt","\u002Fdocs\u002Fcopilot\u002Fconfiguration\u002Fsystem-prompt","1.docs\u002F1.copilot\u002F2.configuration\u002F3.system-prompt",false,{"title":40,"path":41,"stem":42,"children":43,"page":38},"Usage","\u002Fdocs\u002Fcopilot\u002Fusage","1.docs\u002F1.copilot\u002F3.usage",[44,48,52,56],{"title":45,"path":46,"stem":47},"Panel View Button","\u002Fdocs\u002Fcopilot\u002Fusage\u002Fview-button","1.docs\u002F1.copilot\u002F3.usage\u002F1.view-button",{"title":49,"path":50,"stem":51},"Toolbar Buttons","\u002Fdocs\u002Fcopilot\u002Fusage\u002Ftoolbar-buttons","1.docs\u002F1.copilot\u002F3.usage\u002F2.toolbar-buttons",{"title":53,"path":54,"stem":55},"Inline Suggestions","\u002Fdocs\u002Fcopilot\u002Fusage\u002Finline-suggestions","1.docs\u002F1.copilot\u002F3.usage\u002F3.inline-suggestions",{"title":57,"path":58,"stem":59},"Copilot Section","\u002Fdocs\u002Fcopilot\u002Fusage\u002Fsection","1.docs\u002F1.copilot\u002F3.usage\u002F4.section",{"title":61,"path":62,"stem":63,"children":64,"page":38},"Prompt Dialog","\u002Fdocs\u002Fcopilot\u002Fprompt-dialog","1.docs\u002F1.copilot\u002F4.prompt-dialog",[65,69,73,77,81],{"title":66,"path":67,"stem":68},"Field Placeholders","\u002Fdocs\u002Fcopilot\u002Fprompt-dialog\u002Fplaceholders","1.docs\u002F1.copilot\u002F4.prompt-dialog\u002F1.placeholders",{"title":70,"path":71,"stem":72},"Prompt Templates","\u002Fdocs\u002Fcopilot\u002Fprompt-dialog\u002Ftemplates","1.docs\u002F1.copilot\u002F4.prompt-dialog\u002F2.templates",{"title":74,"path":75,"stem":76},"File Attachments","\u002Fdocs\u002Fcopilot\u002Fprompt-dialog\u002Ffiles","1.docs\u002F1.copilot\u002F4.prompt-dialog\u002F3.files",{"title":78,"path":79,"stem":80},"Page References","\u002Fdocs\u002Fcopilot\u002Fprompt-dialog\u002Fpage-references","1.docs\u002F1.copilot\u002F4.prompt-dialog\u002F4.page-references",{"title":82,"path":83,"stem":84},"Skills","\u002Fdocs\u002Fcopilot\u002Fprompt-dialog\u002Fskills","1.docs\u002F1.copilot\u002F4.prompt-dialog\u002F5.skills",{"title":86,"path":87,"stem":88,"children":89},"PHP Classes","\u002Fdocs\u002Fcopilot\u002Fphp-classes","1.docs\u002F1.copilot\u002F5.php-classes\u002F1.index",[90,92,96,118],{"title":91,"path":87,"stem":88},"Overview",{"title":93,"path":94,"stem":95},"Client","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fclient","1.docs\u002F1.copilot\u002F5.php-classes\u002F2.client",{"title":97,"path":98,"stem":99,"children":100,"defaultOpen":38},"Providers","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fproviders","1.docs\u002F1.copilot\u002F5.php-classes\u002F3.providers\u002F1.index",[101,102,106,110,114],{"title":91,"path":98,"stem":99},{"title":103,"path":104,"stem":105},"OpenAIProvider","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fproviders\u002Fopenai","1.docs\u002F1.copilot\u002F5.php-classes\u002F3.providers\u002F2.openai",{"title":107,"path":108,"stem":109},"AnthropicProvider","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fproviders\u002Fanthropic","1.docs\u002F1.copilot\u002F5.php-classes\u002F3.providers\u002F3.anthropic",{"title":111,"path":112,"stem":113},"GeminiProvider","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fproviders\u002Fgemini","1.docs\u002F1.copilot\u002F5.php-classes\u002F3.providers\u002F4.gemini",{"title":115,"path":116,"stem":117},"MistralProvider","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fproviders\u002Fmistral","1.docs\u002F1.copilot\u002F5.php-classes\u002F3.providers\u002F5.mistral",{"title":119,"path":120,"stem":121},"Exceptions","\u002Fdocs\u002Fcopilot\u002Fphp-classes\u002Fexceptions","1.docs\u002F1.copilot\u002F5.php-classes\u002F4.exceptions",{"title":123,"path":124,"stem":125,"children":126,"page":38},"Advanced","\u002Fdocs\u002Fcopilot\u002Fadvanced","1.docs\u002F1.copilot\u002F6.advanced",[127,131,135],{"title":128,"path":129,"stem":130},"Blocks & Layouts","\u002Fdocs\u002Fcopilot\u002Fadvanced\u002Fblocks-and-layouts","1.docs\u002F1.copilot\u002F6.advanced\u002F1.blocks-and-layouts",{"title":132,"path":133,"stem":134},"Quick Reference","\u002Fdocs\u002Fcopilot\u002Fadvanced\u002Freference","1.docs\u002F1.copilot\u002F6.advanced\u002F2.reference",{"title":136,"path":137,"stem":138},"Troubleshooting","\u002Fdocs\u002Fcopilot\u002Fadvanced\u002Ftroubleshooting","1.docs\u002F1.copilot\u002F6.advanced\u002F3.troubleshooting",{"title":140,"icon":141,"path":142,"stem":143,"children":144,"page":38},"Content Translator","i-ri-translate","\u002Fdocs\u002Fcontent-translator","1.docs\u002F2.content-translator",[145,157,168,185,194,228,240],{"title":11,"path":146,"stem":147,"children":148},"\u002Fdocs\u002Fcontent-translator\u002Fgetting-started","1.docs\u002F2.content-translator\u002F1.getting-started\u002F1.index",[149,150,153],{"title":16,"path":146,"stem":147},{"title":18,"path":151,"stem":152},"\u002Fdocs\u002Fcontent-translator\u002Fgetting-started\u002Finstallation","1.docs\u002F2.content-translator\u002F1.getting-started\u002F2.installation",{"title":154,"path":155,"stem":156},"Migration","\u002Fdocs\u002Fcontent-translator\u002Fgetting-started\u002Fmigration","1.docs\u002F2.content-translator\u002F1.getting-started\u002F3.migration",{"title":22,"path":158,"stem":159,"children":160,"page":38},"\u002Fdocs\u002Fcontent-translator\u002Fconfiguration","1.docs\u002F2.content-translator\u002F2.configuration",[161,164],{"title":27,"path":162,"stem":163},"\u002Fdocs\u002Fcontent-translator\u002Fconfiguration\u002Fglobal","1.docs\u002F2.content-translator\u002F2.configuration\u002F1.global",{"title":165,"path":166,"stem":167},"View Button & Section Configuration","\u002Fdocs\u002Fcontent-translator\u002Fconfiguration\u002Flocal","1.docs\u002F2.content-translator\u002F2.configuration\u002F2.local",{"title":169,"path":170,"stem":171,"children":172,"page":38},"Translation Providers","\u002Fdocs\u002Fcontent-translator\u002Fproviders","1.docs\u002F2.content-translator\u002F3.providers",[173,177,181],{"title":174,"path":175,"stem":176},"DeepL","\u002Fdocs\u002Fcontent-translator\u002Fproviders\u002Fdeepl","1.docs\u002F2.content-translator\u002F3.providers\u002F1.deepl",{"title":178,"path":179,"stem":180},"AI Translation","\u002Fdocs\u002Fcontent-translator\u002Fproviders\u002Fai-translation","1.docs\u002F2.content-translator\u002F3.providers\u002F2.ai-translation",{"title":182,"path":183,"stem":184},"Custom Translator","\u002Fdocs\u002Fcontent-translator\u002Fproviders\u002Fcustom-translator","1.docs\u002F2.content-translator\u002F3.providers\u002F3.custom-translator",{"title":186,"path":187,"stem":188,"children":189,"page":38},"Panel","\u002Fdocs\u002Fcontent-translator\u002Fpanel","1.docs\u002F2.content-translator\u002F4.panel",[190],{"title":191,"path":192,"stem":193},"Translation Coverage","\u002Fdocs\u002Fcontent-translator\u002Fpanel\u002Ftranslation-coverage","1.docs\u002F2.content-translator\u002F4.panel\u002F1.translation-coverage",{"title":86,"path":195,"stem":196,"children":197},"\u002Fdocs\u002Fcontent-translator\u002Fphp-classes","1.docs\u002F2.content-translator\u002F5.php-classes\u002F1.index",[198,199,203,221,224],{"title":91,"path":195,"stem":196},{"title":200,"path":201,"stem":202},"Translator","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Ftranslator","1.docs\u002F2.content-translator\u002F5.php-classes\u002F2.translator",{"title":204,"path":205,"stem":206,"children":207,"defaultOpen":38},"Strategies","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F1.index",[208,209,213,217],{"title":91,"path":205,"stem":206},{"title":210,"path":211,"stem":212},"DeepLStrategy","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies\u002Fdeepl-strategy","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F2.deepl-strategy",{"title":214,"path":215,"stem":216},"CopilotAIStrategy","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies\u002Fcopilot-ai-strategy","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F3.copilot-ai-strategy",{"title":218,"path":219,"stem":220},"CallableStrategy","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies\u002Fcallable-strategy","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F4.callable-strategy",{"title":119,"path":222,"stem":223},"\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fexceptions","1.docs\u002F2.content-translator\u002F5.php-classes\u002F4.exceptions",{"title":225,"path":226,"stem":227},"DeepL Client","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fdeepl-client","1.docs\u002F2.content-translator\u002F5.php-classes\u002F5.deepl-client",{"title":123,"path":229,"stem":230,"children":231,"page":38},"\u002Fdocs\u002Fcontent-translator\u002Fadvanced","1.docs\u002F2.content-translator\u002F6.advanced",[232,236],{"title":233,"path":234,"stem":235},"KirbyTags","\u002Fdocs\u002Fcontent-translator\u002Fadvanced\u002Fkirbytags","1.docs\u002F2.content-translator\u002F6.advanced\u002F1.kirbytags",{"title":237,"path":238,"stem":239},"Hooks","\u002Fdocs\u002Fcontent-translator\u002Fadvanced\u002Fhooks","1.docs\u002F2.content-translator\u002F6.advanced\u002F2.hooks",{"title":241,"path":242,"stem":243,"children":244,"page":38},"CLI & Automation","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation","1.docs\u002F2.content-translator\u002F7.cli-automation",[245,249,253,257,261],{"title":246,"path":247,"stem":248},"Single Page","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fsingle-page","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F1.single-page",{"title":250,"path":251,"stem":252},"Batch Pages","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fbatch-pages","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F2.batch-pages",{"title":254,"path":255,"stem":256},"File Metadata","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Ffile-metadata","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F3.file-metadata",{"title":258,"path":259,"stem":260},"Janitor Integration","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fjanitor","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F4.janitor",{"title":262,"path":263,"stem":264},"AI Strategy Override","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fai-strategy","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F5.ai-strategy",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":38},"SEO Audit","i-ri-seo-line","\u002Fdocs\u002Fseo-audit","1.docs\u002F3.seo-audit",[271,279,290],{"title":11,"path":272,"stem":273,"children":274},"\u002Fdocs\u002Fseo-audit\u002Fgetting-started","1.docs\u002F3.seo-audit\u002F1.getting-started\u002F1.index",[275,276],{"title":16,"path":272,"stem":273},{"title":18,"path":277,"stem":278},"\u002Fdocs\u002Fseo-audit\u002Fgetting-started\u002Finstallation","1.docs\u002F3.seo-audit\u002F1.getting-started\u002F2.installation",{"title":22,"path":280,"stem":281,"children":282,"page":38},"\u002Fdocs\u002Fseo-audit\u002Fconfiguration","1.docs\u002F3.seo-audit\u002F2.configuration",[283,286],{"title":27,"path":284,"stem":285},"\u002Fdocs\u002Fseo-audit\u002Fconfiguration\u002Fglobal","1.docs\u002F3.seo-audit\u002F2.configuration\u002F1.global",{"title":287,"path":288,"stem":289},"View Button & Section","\u002Fdocs\u002Fseo-audit\u002Fconfiguration\u002Flocal","1.docs\u002F3.seo-audit\u002F2.configuration\u002F2.local",{"title":291,"path":292,"stem":293,"children":294,"page":38},"Guide","\u002Fdocs\u002Fseo-audit\u002Fguide","1.docs\u002F3.seo-audit\u002F3.guide",[295,299],{"title":296,"path":297,"stem":298},"Assessments for SEO and Readability","\u002Fdocs\u002Fseo-audit\u002Fguide\u002Fassessments","1.docs\u002F3.seo-audit\u002F3.guide\u002F1.assessments",{"title":300,"path":301,"stem":302},"Audit URL","\u002Fdocs\u002Fseo-audit\u002Fguide\u002Faudit-url","1.docs\u002F3.seo-audit\u002F3.guide\u002F2.audit-url",{"title":304,"path":305,"stem":306,"children":307,"icon":319},"Live Preview","\u002Fdocs\u002Flive-preview","1.docs\u002F4.live-preview\u002F1.index",[308,309,312,316],{"title":11,"path":305,"stem":306},{"title":22,"path":310,"stem":311},"\u002Fdocs\u002Flive-preview\u002Fconfiguration","1.docs\u002F4.live-preview\u002F2.configuration",{"title":313,"path":314,"stem":315},"Preview Mode","\u002Fdocs\u002Flive-preview\u002Fpreview-mode","1.docs\u002F4.live-preview\u002F3.preview-mode",{"title":136,"path":317,"stem":318},"\u002Fdocs\u002Flive-preview\u002Ftroubleshooting","1.docs\u002F4.live-preview\u002F4.troubleshooting","i-ri-picture-in-picture-line",{"title":321,"icon":322,"path":323,"stem":324,"children":325,"page":38},"Headless","i-ri-code-block","\u002Fdocs\u002Fheadless","1.docs\u002F5.headless",[326,334,350,370,378],{"title":11,"path":327,"stem":328,"children":329},"\u002Fdocs\u002Fheadless\u002Fgetting-started","1.docs\u002F5.headless\u002F1.getting-started\u002F1.index",[330,331],{"title":16,"path":327,"stem":328},{"title":18,"path":332,"stem":333},"\u002Fdocs\u002Fheadless\u002Fgetting-started\u002Finstallation","1.docs\u002F5.headless\u002F1.getting-started\u002F2.installation",{"title":22,"path":335,"stem":336,"children":337,"page":38},"\u002Fdocs\u002Fheadless\u002Fconfiguration","1.docs\u002F5.headless\u002F2.configuration",[338,342,346],{"title":339,"path":340,"stem":341},"Authentication","\u002Fdocs\u002Fheadless\u002Fconfiguration\u002Fauthentication","1.docs\u002F5.headless\u002F2.configuration\u002F1.authentication",{"title":343,"path":344,"stem":345},"CORS","\u002Fdocs\u002Fheadless\u002Fconfiguration\u002Fcors","1.docs\u002F5.headless\u002F2.configuration\u002F2.cors",{"title":347,"path":348,"stem":349},"Panel Configuration","\u002Fdocs\u002Fheadless\u002Fconfiguration\u002Fpanel","1.docs\u002F5.headless\u002F2.configuration\u002F3.panel",{"title":40,"path":351,"stem":352,"children":353,"page":38},"\u002Fdocs\u002Fheadless\u002Fusage","1.docs\u002F5.headless\u002F3.usage",[354,358,362,366],{"title":355,"path":356,"stem":357},"KQL (Kirby Query Language)","\u002Fdocs\u002Fheadless\u002Fusage\u002Fkql","1.docs\u002F5.headless\u002F3.usage\u002F1.kql",{"title":359,"path":360,"stem":361},"JSON Templates","\u002Fdocs\u002Fheadless\u002Fusage\u002Fjson-templates","1.docs\u002F5.headless\u002F3.usage\u002F2.json-templates",{"title":363,"path":364,"stem":365},"Field Methods","\u002Fdocs\u002Fheadless\u002Fusage\u002Ffield-methods","1.docs\u002F5.headless\u002F3.usage\u002F3.field-methods",{"title":367,"path":368,"stem":369},"Page Methods","\u002Fdocs\u002Fheadless\u002Fusage\u002Fpage-methods","1.docs\u002F5.headless\u002F3.usage\u002F4.page-methods",{"title":123,"path":371,"stem":372,"children":373,"page":38},"\u002Fdocs\u002Fheadless\u002Fadvanced","1.docs\u002F5.headless\u002F4.advanced",[374],{"title":375,"path":376,"stem":377},"API Builder","\u002Fdocs\u002Fheadless\u002Fadvanced\u002Fapi-builder","1.docs\u002F5.headless\u002F4.advanced\u002F1.api-builder",{"title":154,"path":379,"stem":380,"children":381},"\u002Fdocs\u002Fheadless\u002Fmigration","1.docs\u002F5.headless\u002F5.migration\u002F1.index",[382],{"title":383,"path":379,"stem":380},"Version Migration",{"title":385,"path":386,"stem":387,"children":388,"icon":394},"Minimap","\u002Fdocs\u002Fminimap","1.docs\u002F6.minimap\u002F1.index",[389,390],{"title":11,"path":386,"stem":387},{"title":391,"path":392,"stem":393},"Fields Support","\u002Fdocs\u002Fminimap\u002Ffields-support","1.docs\u002F6.minimap\u002F2.fields-support","i-ri-timeline-view",{"title":396,"icon":397,"path":398,"stem":399,"children":400,"page":38},"Documentation","i-ri-book-open-line","\u002Fdocs","1.docs",[401,442,484,498,504,527],{"title":5,"icon":6,"path":7,"stem":8,"children":402,"page":38},[403,407,412,418,425,437],{"title":11,"path":12,"stem":13,"children":404},[405,406],{"title":16,"path":12,"stem":13},{"title":18,"path":19,"stem":20},{"title":22,"path":23,"stem":24,"children":408,"page":38},[409,410,411],{"title":27,"path":28,"stem":29},{"title":31,"path":32,"stem":33},{"title":35,"path":36,"stem":37},{"title":40,"path":41,"stem":42,"children":413,"page":38},[414,415,416,417],{"title":45,"path":46,"stem":47},{"title":49,"path":50,"stem":51},{"title":53,"path":54,"stem":55},{"title":57,"path":58,"stem":59},{"title":61,"path":62,"stem":63,"children":419,"page":38},[420,421,422,423,424],{"title":66,"path":67,"stem":68},{"title":70,"path":71,"stem":72},{"title":74,"path":75,"stem":76},{"title":78,"path":79,"stem":80},{"title":82,"path":83,"stem":84},{"title":86,"path":87,"stem":88,"children":426},[427,428,429,436],{"title":91,"path":87,"stem":88},{"title":93,"path":94,"stem":95},{"title":97,"path":98,"stem":99,"children":430,"defaultOpen":38},[431,432,433,434,435],{"title":91,"path":98,"stem":99},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125,"children":438,"page":38},[439,440,441],{"title":128,"path":129,"stem":130},{"title":132,"path":133,"stem":134},{"title":136,"path":137,"stem":138},{"title":140,"icon":141,"path":142,"stem":143,"children":443,"page":38},[444,449,453,458,461,473,477],{"title":11,"path":146,"stem":147,"children":445},[446,447,448],{"title":16,"path":146,"stem":147},{"title":18,"path":151,"stem":152},{"title":154,"path":155,"stem":156},{"title":22,"path":158,"stem":159,"children":450,"page":38},[451,452],{"title":27,"path":162,"stem":163},{"title":165,"path":166,"stem":167},{"title":169,"path":170,"stem":171,"children":454,"page":38},[455,456,457],{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188,"children":459,"page":38},[460],{"title":191,"path":192,"stem":193},{"title":86,"path":195,"stem":196,"children":462},[463,464,465,471,472],{"title":91,"path":195,"stem":196},{"title":200,"path":201,"stem":202},{"title":204,"path":205,"stem":206,"children":466,"defaultOpen":38},[467,468,469,470],{"title":91,"path":205,"stem":206},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":218,"path":219,"stem":220},{"title":119,"path":222,"stem":223},{"title":225,"path":226,"stem":227},{"title":123,"path":229,"stem":230,"children":474,"page":38},[475,476],{"title":233,"path":234,"stem":235},{"title":237,"path":238,"stem":239},{"title":241,"path":242,"stem":243,"children":478,"page":38},[479,480,481,482,483],{"title":246,"path":247,"stem":248},{"title":250,"path":251,"stem":252},{"title":254,"path":255,"stem":256},{"title":258,"path":259,"stem":260},{"title":262,"path":263,"stem":264},{"title":266,"icon":267,"path":268,"stem":269,"children":485,"page":38},[486,490,494],{"title":11,"path":272,"stem":273,"children":487},[488,489],{"title":16,"path":272,"stem":273},{"title":18,"path":277,"stem":278},{"title":22,"path":280,"stem":281,"children":491,"page":38},[492,493],{"title":27,"path":284,"stem":285},{"title":287,"path":288,"stem":289},{"title":291,"path":292,"stem":293,"children":495,"page":38},[496,497],{"title":296,"path":297,"stem":298},{"title":300,"path":301,"stem":302},{"title":304,"path":305,"stem":306,"children":499,"icon":319},[500,501,502,503],{"title":11,"path":305,"stem":306},{"title":22,"path":310,"stem":311},{"title":313,"path":314,"stem":315},{"title":136,"path":317,"stem":318},{"title":321,"icon":322,"path":323,"stem":324,"children":505,"page":38},[506,510,515,521,524],{"title":11,"path":327,"stem":328,"children":507},[508,509],{"title":16,"path":327,"stem":328},{"title":18,"path":332,"stem":333},{"title":22,"path":335,"stem":336,"children":511,"page":38},[512,513,514],{"title":339,"path":340,"stem":341},{"title":343,"path":344,"stem":345},{"title":347,"path":348,"stem":349},{"title":40,"path":351,"stem":352,"children":516,"page":38},[517,518,519,520],{"title":355,"path":356,"stem":357},{"title":359,"path":360,"stem":361},{"title":363,"path":364,"stem":365},{"title":367,"path":368,"stem":369},{"title":123,"path":371,"stem":372,"children":522,"page":38},[523],{"title":375,"path":376,"stem":377},{"title":154,"path":379,"stem":380,"children":525},[526],{"title":383,"path":379,"stem":380},{"title":385,"path":386,"stem":387,"children":528,"icon":394},[529,530],{"title":11,"path":386,"stem":387},{"title":391,"path":392,"stem":393},{"title":532,"path":533,"stem":534,"children":535,"page":38},"Blog","\u002Fblog","blog",[536,540,544,548],{"title":537,"path":538,"stem":539},"Kirby Copilot v2.5 – Beyond Single Fields","\u002Fblog\u002Fcopilot-v25","blog\u002Fcopilot-v25",{"title":541,"path":542,"stem":543},"Kirby Copilot v3 – Your Quiet Co-Writer","\u002Fblog\u002Fcopilot-v3","blog\u002Fcopilot-v3",{"title":545,"path":546,"stem":547},"Going Open Source with Commercial Plugins","\u002Fblog\u002Fgoing-open-source","blog\u002Fgoing-open-source",{"title":549,"path":550,"stem":551},"Moving to Paddle","\u002Fblog\u002Fpaddle-migration","blog\u002Fpaddle-migration",[553,558,562,567,570,582,586],{"title":11,"path":146,"stem":147,"children":554},[555,556,557],{"title":16,"path":146,"stem":147},{"title":18,"path":151,"stem":152},{"title":154,"path":155,"stem":156},{"title":22,"path":158,"stem":159,"children":559,"page":38},[560,561],{"title":27,"path":162,"stem":163},{"title":165,"path":166,"stem":167},{"title":169,"path":170,"stem":171,"children":563,"page":38},[564,565,566],{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188,"children":568,"page":38},[569],{"title":191,"path":192,"stem":193},{"title":86,"path":195,"stem":196,"children":571},[572,573,574,580,581],{"title":91,"path":195,"stem":196},{"title":200,"path":201,"stem":202},{"title":204,"path":205,"stem":206,"children":575,"defaultOpen":38},[576,577,578,579],{"title":91,"path":205,"stem":206},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":218,"path":219,"stem":220},{"title":119,"path":222,"stem":223},{"title":225,"path":226,"stem":227},{"title":123,"path":229,"stem":230,"children":583,"page":38},[584,585],{"title":233,"path":234,"stem":235},{"title":237,"path":238,"stem":239},{"title":241,"path":242,"stem":243,"children":587,"page":38},[588,589,590,591,592],{"title":246,"path":247,"stem":248},{"title":250,"path":251,"stem":252},{"title":254,"path":255,"stem":256},{"title":258,"path":259,"stem":260},{"title":262,"path":263,"stem":264},{"id":594,"title":595,"body":596,"date":697,"description":694,"extension":698,"meta":699,"navigation":700,"path":701,"seo":702,"stem":703,"__hash__":704},"versions\u002F3.content-translator\u002Fchangelog\u002Fv3.11.0.md","v3.11.0",{"type":597,"value":598,"toc":693},"minimark",[599,621,627,669,674],[600,601,602],"tip",{},[603,604,605,606,610,611,616,617,620],"p",{},"Translation backends are now pluggable. The new ",[607,608,609],"code",{},"strategy"," config accepts DeepL, AI (via ",[612,613,615],"a",{"href":614},"\u002Fcopilot","Kirby Copilot","), or any custom ",[607,618,619],{},"Strategy"," implementation – including a closure for one-off integrations.",[603,622,623],{},[624,625,626],"strong",{},"🚀 Features",[628,629,630,660],"ul",{},[631,632,633,636,637,640,641,644,645,648,649,652,653,655,656,659],"li",{},[624,634,635],{},"Pluggable translation strategies",": New ",[607,638,639],{},"johannschopplich.content-translator.strategy"," config option accepts ",[607,642,643],{},"'deepl'",", ",[607,646,647],{},"'ai'",", a ",[607,650,651],{},"Closure",", or a custom ",[607,654,619],{}," instance. See the ",[612,657,658],{"href":205},"strategies documentation",".",[631,661,662,665,666,659],{},[624,663,664],{},"PHP classes",": First-class PHP API for programmatic translation. Run translations from CLI, hooks, or any custom workflow. See the ",[612,667,668],{"href":195},"PHP classes documentation",[603,670,671],{},[624,672,673],{},"⚠️ Deprecated",[628,675,676],{},[631,677,678,684,685,688,689,659],{},[624,679,680,683],{},[607,681,682],{},"translateFn"," config option",": Use ",[607,686,687],{},"'strategy' => $closure"," instead – the closure signature is identical. Will be removed in v4. See the ",[612,690,692],{"href":691},"\u002Fdocs\u002Fcontent-translator\u002Fgetting-started\u002Fmigration#translatefn--strategy","migration guide",{"title":694,"searchDepth":695,"depth":695,"links":696},"",2,[],"2026-05-03","md",{},true,"\u002Fcontent-translator\u002Fchangelog\u002Fv3.11.0",{"title":595,"description":694},"3.content-translator\u002Fchangelog\u002Fv3.11.0","g15HkUy6spEKsZAy_6y3Vb7JFY6PDYfN8WRGNEJna-A",{"data":706,"body":707},{},{"type":708,"children":709},"root",[710],{"type":711,"tag":603,"props":712,"children":713},"element",{},[714,717,725,727,734],{"type":715,"value":716},"text","We love Kirby – our plugins wouldn't exist without it. Help us improve: share feedback in ",{"type":711,"tag":612,"props":718,"children":722},{"href":719,"rel":720},"https:\u002F\u002Fgithub.com\u002Fkirby-tools\u002Fcommunity\u002Fdiscussions",[721],"nofollow",[723],{"type":715,"value":724},"Discussions",{"type":715,"value":726}," or report bugs via ",{"type":711,"tag":612,"props":728,"children":731},{"href":729,"rel":730},"https:\u002F\u002Fgithub.com\u002Fkirby-tools\u002Fcommunity\u002Fissues",[721],[732],{"type":715,"value":733},"Issues",{"type":715,"value":659},{"id":736,"title":91,"body":737,"description":1879,"extension":698,"meta":1880,"navigation":700,"path":205,"seo":1881,"stem":206,"__hash__":1882},"docs\u002F1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F1.index.md",{"type":597,"value":738,"toc":1866},[739,745,756,761,920,944,948,979,983,988,1219,1238,1242,1248,1766,1769,1799,1802,1841,1862],[603,740,741,742,744],{},"A strategy is the translation backend Kirby Content Translator routes through. Pick a built-in (DeepL, Copilot AI, callable) or implement ",[607,743,619],{}," to plug in any service.",[746,747,748],"note",{},[603,749,750,751,753,754,659],{},"Available since v3.11. The deprecated ",[607,752,682],{}," config option still works and is wrapped automatically in a ",[607,755,218],{},[757,758,760],"h2",{"id":759},"the-interface","The Interface",[762,763,767],"pre",{"className":764,"code":765,"language":766,"meta":694,"style":694},"language-php shiki shiki-themes github-light github-light github-dark","namespace JohannSchopplich\\ContentTranslator\\Translation;\n\ninterface Strategy\n{\n    \u002F**\n     * @param list\u003CTranslationUnit> $units\n     * @return list\u003Cstring>\n     *\n     * @throws TranslationException When zero units could be translated.\n     *\u002F\n    public function execute(array $units, ExecutionOptions $options): array;\n}\n","php",[607,768,769,786,791,800,806,813,835,853,859,873,879,914],{"__ignoreMap":694},[770,771,774,778,782],"span",{"class":772,"line":773},"line",1,[770,775,777],{"class":776},"s8jYJ","namespace",[770,779,781],{"class":780},"snPdu"," JohannSchopplich\\ContentTranslator\\Translation",[770,783,785],{"class":784},"sxrX7",";\n",[770,787,788],{"class":772,"line":695},[770,789,790],{"emptyLinePlaceholder":700},"\n",[770,792,794,797],{"class":772,"line":793},3,[770,795,796],{"class":776},"interface",[770,798,799],{"class":780}," Strategy\n",[770,801,803],{"class":772,"line":802},4,[770,804,805],{"class":784},"{\n",[770,807,809],{"class":772,"line":808},5,[770,810,812],{"class":811},"sCsY4","    \u002F**\n",[770,814,816,819,822,826,829,832],{"class":772,"line":815},6,[770,817,818],{"class":811},"     * ",[770,820,821],{"class":776},"@param",[770,823,825],{"class":824},"sBjJW"," list",[770,827,828],{"class":811},"\u003C",[770,830,831],{"class":824},"TranslationUnit",[770,833,834],{"class":811},"> $units\n",[770,836,838,840,843,845,847,850],{"class":772,"line":837},7,[770,839,818],{"class":811},[770,841,842],{"class":776},"@return",[770,844,825],{"class":824},[770,846,828],{"class":811},[770,848,849],{"class":776},"string",[770,851,852],{"class":811},">\n",[770,854,856],{"class":772,"line":855},8,[770,857,858],{"class":811},"     *\n",[770,860,862,864,867,870],{"class":772,"line":861},9,[770,863,818],{"class":811},[770,865,866],{"class":776},"@throws",[770,868,869],{"class":824}," TranslationException",[770,871,872],{"class":811}," When zero units could be translated.\n",[770,874,876],{"class":772,"line":875},10,[770,877,878],{"class":811},"     *\u002F\n",[770,880,882,885,888,891,894,897,900,903,906,909,912],{"class":772,"line":881},11,[770,883,884],{"class":776},"    public",[770,886,887],{"class":776}," function",[770,889,890],{"class":780}," execute",[770,892,893],{"class":784},"(",[770,895,896],{"class":776},"array",[770,898,899],{"class":784}," $units, ",[770,901,902],{"class":824},"ExecutionOptions",[770,904,905],{"class":784}," $options)",[770,907,908],{"class":776},":",[770,910,911],{"class":776}," array",[770,913,785],{"class":784},[770,915,917],{"class":772,"line":916},12,[770,918,919],{"class":784},"}\n",[603,921,922,923,926,927,931,932,935,936,644,938,940,941,659],{},"The contract is short: return one translation per input in the same order, and stay stateless across calls. Throw ",[607,924,925],{},"TranslationException"," only when ",[928,929,930],"em",{},"zero"," units survived – per-unit failures keep the source text and trigger ",[607,933,934],{},"content-translator.translate:warning",". The typed payloads passed in are ",[607,937,831],{},[607,939,902],{},", and ",[607,942,943],{},"TranslationMode",[757,945,947],{"id":946},"built-in-implementations","Built-in Implementations",[949,950,951,964,969],"card-group",{},[952,953,955],"card",{"icon":954,"title":210,"to":211},"i-simple-icons-deepl",[603,956,957,958,960,961,659],{},"Default. Wraps the ",[607,959,174],{}," HTTP client, batches up to 50 texts per request, falls back to single requests for ",[607,962,963],{},"TranslationMode::Single",[952,965,966],{"icon":6,"title":214,"to":215},[603,967,968],{},"Routes through Kirby Copilot. Chunks by item count and char budget, validates placeholder counts, drops responses with mismatched lengths.",[952,970,972],{"icon":971,"title":218,"to":219},"i-ri-function-line",[603,973,974,975,978],{},"Adapts a ",[607,976,977],{},"Closure(string $text, string $target, ?string $source): string"," to the strategy contract.",[757,980,982],{"id":981},"strategy-resolution","Strategy Resolution",[603,984,985,987],{},[607,986,200],{}," resolves the active strategy in this order, first match wins:",[989,990,992,997,1013,1054,1061,1067,1188,1204,1210,1214],"steps",{"level":991},"3",[993,994,996],"h3",{"id":995},"_1-method-parameter","1. Method Parameter",[603,998,999,1000,1003,1004,644,1007,940,1010,659],{},"The ",[607,1001,1002],{},"?Strategy $strategy"," argument on ",[607,1005,1006],{},"translateText",[607,1008,1009],{},"translateTexts",[607,1011,1012],{},"translateContent",[762,1014,1016],{"className":764,"code":1015,"language":766,"meta":694,"style":694},"Translator::translateText('Hello', 'de', 'en', new DeepLStrategy());\n",[607,1017,1018],{"__ignoreMap":694},[770,1019,1020,1022,1025,1027,1029,1033,1035,1038,1040,1043,1045,1048,1051],{"class":772,"line":773},[770,1021,200],{"class":824},[770,1023,1024],{"class":776},"::",[770,1026,1006],{"class":780},[770,1028,893],{"class":784},[770,1030,1032],{"class":1031},"sIIMD","'Hello'",[770,1034,644],{"class":784},[770,1036,1037],{"class":1031},"'de'",[770,1039,644],{"class":784},[770,1041,1042],{"class":1031},"'en'",[770,1044,644],{"class":784},[770,1046,1047],{"class":776},"new",[770,1049,1050],{"class":824}," DeepLStrategy",[770,1052,1053],{"class":784},"());\n",[993,1055,1057,1058,1060],{"id":1056},"_2-strategy-config-option","2. ",[607,1059,609],{}," Config Option",[603,1062,1063,1064,1066],{},"Accepts a string preset, a closure, or a ",[607,1065,619],{}," instance.",[762,1068,1071],{"className":764,"code":1069,"filename":1070,"language":766,"meta":694,"style":694},"return [\n    'johannschopplich.content-translator' => [\n        \u002F\u002F String presets\n        'strategy' => 'deepl', \u002F\u002F or 'ai' (requires kirby-copilot)\n\n        \u002F\u002F …or a closure\n        'strategy' => fn (string $text, string $target, ?string $source) => \u002F* … *\u002F,\n\n        \u002F\u002F …or a Strategy instance\n        'strategy' => new MyCustomStrategy(),\n    ],\n];\n","config.php",[607,1072,1073,1081,1091,1096,1111,1115,1120,1154,1158,1163,1178,1183],{"__ignoreMap":694},[770,1074,1075,1078],{"class":772,"line":773},[770,1076,1077],{"class":776},"return",[770,1079,1080],{"class":784}," [\n",[770,1082,1083,1086,1089],{"class":772,"line":695},[770,1084,1085],{"class":1031},"    'johannschopplich.content-translator'",[770,1087,1088],{"class":776}," =>",[770,1090,1080],{"class":784},[770,1092,1093],{"class":772,"line":793},[770,1094,1095],{"class":811},"        \u002F\u002F String presets\n",[770,1097,1098,1101,1103,1106,1108],{"class":772,"line":802},[770,1099,1100],{"class":1031},"        'strategy'",[770,1102,1088],{"class":776},[770,1104,1105],{"class":1031}," 'deepl'",[770,1107,644],{"class":784},[770,1109,1110],{"class":811},"\u002F\u002F or 'ai' (requires kirby-copilot)\n",[770,1112,1113],{"class":772,"line":808},[770,1114,790],{"emptyLinePlaceholder":700},[770,1116,1117],{"class":772,"line":815},[770,1118,1119],{"class":811},"        \u002F\u002F …or a closure\n",[770,1121,1122,1124,1126,1129,1132,1134,1137,1139,1142,1145,1148,1151],{"class":772,"line":837},[770,1123,1100],{"class":1031},[770,1125,1088],{"class":776},[770,1127,1128],{"class":776}," fn",[770,1130,1131],{"class":784}," (",[770,1133,849],{"class":776},[770,1135,1136],{"class":784}," $text, ",[770,1138,849],{"class":776},[770,1140,1141],{"class":784}," $target, ",[770,1143,1144],{"class":776},"?string",[770,1146,1147],{"class":784}," $source) => ",[770,1149,1150],{"class":811},"\u002F* … *\u002F",[770,1152,1153],{"class":784},",\n",[770,1155,1156],{"class":772,"line":855},[770,1157,790],{"emptyLinePlaceholder":700},[770,1159,1160],{"class":772,"line":861},[770,1161,1162],{"class":811},"        \u002F\u002F …or a Strategy instance\n",[770,1164,1165,1167,1169,1172,1175],{"class":772,"line":875},[770,1166,1100],{"class":1031},[770,1168,1088],{"class":776},[770,1170,1171],{"class":776}," new",[770,1173,1174],{"class":824}," MyCustomStrategy",[770,1176,1177],{"class":784},"(),\n",[770,1179,1180],{"class":772,"line":881},[770,1181,1182],{"class":784},"    ],\n",[770,1184,1185],{"class":772,"line":916},[770,1186,1187],{"class":784},"];\n",[993,1189,1191,1192,1194,1195],{"id":1190},"_3-legacy-translatefn","3. Legacy ",[607,1193,682],{}," ",[1196,1197],"u-badge",{"className":1198,"label":1202,"variant":1203},[1199,1200,1201],"align-middle","ml-2","rounded-full!","deprecated","subtle",[603,1205,1206,1207,1209],{},"Kept for back-compat. Wrapped in ",[607,1208,218],{}," automatically.",[993,1211,1213],{"id":1212},"_4-default","4. Default",[603,1215,1216,659],{},[607,1217,1218],{},"new DeepLStrategy()",[1220,1221,1222],"warning",{},[603,1223,1224,1227,1228,1231,1232,1234,1235,659],{},[607,1225,1226],{},"'strategy' => 'ai'"," throws ",[607,1229,1230],{},"LogicException"," when ",[612,1233,615],{"href":7}," is not installed. An unknown string throws ",[607,1236,1237],{},"LogicException('Unknown strategy \"\u003Cname>\"')",[757,1239,1241],{"id":1240},"implementing-a-custom-strategy","Implementing a Custom Strategy",[603,1243,1244,1245,1247],{},"Implement the interface, attempt each unit, and only throw when ",[928,1246,930],{}," units survive – matching the failure pattern of the built-in strategies:",[1249,1250,1251],"code-collapse",{},[762,1252,1254],{"className":764,"code":1253,"language":766,"meta":694,"style":694},"use JohannSchopplich\\ContentTranslator\\Translation\\Exception\\TranslationException;\nuse JohannSchopplich\\ContentTranslator\\Translation\\ExecutionOptions;\nuse JohannSchopplich\\ContentTranslator\\Translation\\Strategy;\nuse JohannSchopplich\\ContentTranslator\\Translation\\TranslationUnit;\nuse Kirby\\Cms\\App;\n\nfinal class MyApiStrategy implements Strategy\n{\n    public function execute(array $units, ExecutionOptions $options): array\n    {\n        \u002F\u002F Pre-fill with source so failed units keep the original text\n        $results = array_map(fn (TranslationUnit $u) => $u->text, $units);\n        $translatedCount = 0;\n        $lastError = null;\n\n        foreach ($units as $i => $unit) {\n            try {\n                $results[$i] = myTranslate(\n                    text: $unit->text,\n                    target: $options->targetLanguage->code,\n                    source: $options->sourceLanguage?->code,\n                );\n                $translatedCount++;\n            } catch (Throwable $error) {\n                $lastError = $error;\n                App::instance()->trigger('content-translator.translate:warning', [\n                    'unit' => $unit,\n                    'reason' => $error->getMessage(),\n                    'previous' => $error,\n                ]);\n            }\n        }\n\n        if ($translatedCount === 0) {\n            throw new TranslationException(\n                strategy: 'my-api',\n                reason: $lastError?->getMessage() ?? 'unknown error',\n                unitsAttempted: count($units),\n            );\n        }\n\n        return $results;\n    }\n}\n",[607,1255,1256,1266,1275,1284,1293,1302,1306,1322,1326,1349,1354,1359,1388,1401,1414,1419,1440,1449,1463,1477,1496,1514,1520,1531,1548,1559,1586,1597,1615,1626,1632,1638,1644,1649,1666,1678,1692,1716,1730,1736,1741,1746,1755,1761],{"__ignoreMap":694},[770,1257,1258,1261,1264],{"class":772,"line":773},[770,1259,1260],{"class":776},"use",[770,1262,1263],{"class":824}," JohannSchopplich\\ContentTranslator\\Translation\\Exception\\TranslationException",[770,1265,785],{"class":784},[770,1267,1268,1270,1273],{"class":772,"line":695},[770,1269,1260],{"class":776},[770,1271,1272],{"class":824}," JohannSchopplich\\ContentTranslator\\Translation\\ExecutionOptions",[770,1274,785],{"class":784},[770,1276,1277,1279,1282],{"class":772,"line":793},[770,1278,1260],{"class":776},[770,1280,1281],{"class":824}," JohannSchopplich\\ContentTranslator\\Translation\\Strategy",[770,1283,785],{"class":784},[770,1285,1286,1288,1291],{"class":772,"line":802},[770,1287,1260],{"class":776},[770,1289,1290],{"class":824}," JohannSchopplich\\ContentTranslator\\Translation\\TranslationUnit",[770,1292,785],{"class":784},[770,1294,1295,1297,1300],{"class":772,"line":808},[770,1296,1260],{"class":776},[770,1298,1299],{"class":824}," Kirby\\Cms\\App",[770,1301,785],{"class":784},[770,1303,1304],{"class":772,"line":815},[770,1305,790],{"emptyLinePlaceholder":700},[770,1307,1308,1311,1314,1317,1320],{"class":772,"line":837},[770,1309,1310],{"class":776},"final",[770,1312,1313],{"class":776}," class",[770,1315,1316],{"class":780}," MyApiStrategy",[770,1318,1319],{"class":776}," implements",[770,1321,799],{"class":780},[770,1323,1324],{"class":772,"line":855},[770,1325,805],{"class":784},[770,1327,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346],{"class":772,"line":861},[770,1329,884],{"class":776},[770,1331,887],{"class":776},[770,1333,890],{"class":780},[770,1335,893],{"class":784},[770,1337,896],{"class":776},[770,1339,899],{"class":784},[770,1341,902],{"class":824},[770,1343,905],{"class":784},[770,1345,908],{"class":776},[770,1347,1348],{"class":776}," array\n",[770,1350,1351],{"class":772,"line":875},[770,1352,1353],{"class":784},"    {\n",[770,1355,1356],{"class":772,"line":881},[770,1357,1358],{"class":811},"        \u002F\u002F Pre-fill with source so failed units keep the original text\n",[770,1360,1361,1364,1367,1370,1372,1375,1377,1379,1382,1385],{"class":772,"line":916},[770,1362,1363],{"class":784},"        $results ",[770,1365,1366],{"class":776},"=",[770,1368,1369],{"class":824}," array_map",[770,1371,893],{"class":784},[770,1373,1374],{"class":776},"fn",[770,1376,1131],{"class":784},[770,1378,831],{"class":824},[770,1380,1381],{"class":784}," $u) => $u",[770,1383,1384],{"class":776},"->",[770,1386,1387],{"class":784},"text, $units);\n",[770,1389,1391,1394,1396,1399],{"class":772,"line":1390},13,[770,1392,1393],{"class":784},"        $translatedCount ",[770,1395,1366],{"class":776},[770,1397,1398],{"class":824}," 0",[770,1400,785],{"class":784},[770,1402,1404,1407,1409,1412],{"class":772,"line":1403},14,[770,1405,1406],{"class":784},"        $lastError ",[770,1408,1366],{"class":776},[770,1410,1411],{"class":824}," null",[770,1413,785],{"class":784},[770,1415,1417],{"class":772,"line":1416},15,[770,1418,790],{"emptyLinePlaceholder":700},[770,1420,1422,1425,1428,1431,1434,1437],{"class":772,"line":1421},16,[770,1423,1424],{"class":776},"        foreach",[770,1426,1427],{"class":784}," ($units ",[770,1429,1430],{"class":776},"as",[770,1432,1433],{"class":784}," $i ",[770,1435,1436],{"class":776},"=>",[770,1438,1439],{"class":784}," $unit) {\n",[770,1441,1443,1446],{"class":772,"line":1442},17,[770,1444,1445],{"class":776},"            try",[770,1447,1448],{"class":784}," {\n",[770,1450,1452,1455,1457,1460],{"class":772,"line":1451},18,[770,1453,1454],{"class":784},"                $results[$i] ",[770,1456,1366],{"class":776},[770,1458,1459],{"class":780}," myTranslate",[770,1461,1462],{"class":784},"(\n",[770,1464,1466,1469,1472,1474],{"class":772,"line":1465},19,[770,1467,1468],{"class":780},"                    text",[770,1470,1471],{"class":784},": $unit",[770,1473,1384],{"class":776},[770,1475,1476],{"class":784},"text,\n",[770,1478,1480,1483,1486,1488,1491,1493],{"class":772,"line":1479},20,[770,1481,1482],{"class":780},"                    target",[770,1484,1485],{"class":784},": $options",[770,1487,1384],{"class":776},[770,1489,1490],{"class":784},"targetLanguage",[770,1492,1384],{"class":776},[770,1494,1495],{"class":784},"code,\n",[770,1497,1499,1502,1504,1506,1509,1512],{"class":772,"line":1498},21,[770,1500,1501],{"class":780},"                    source",[770,1503,1485],{"class":784},[770,1505,1384],{"class":776},[770,1507,1508],{"class":784},"sourceLanguage",[770,1510,1511],{"class":776},"?->",[770,1513,1495],{"class":784},[770,1515,1517],{"class":772,"line":1516},22,[770,1518,1519],{"class":784},"                );\n",[770,1521,1523,1526,1529],{"class":772,"line":1522},23,[770,1524,1525],{"class":784},"                $translatedCount",[770,1527,1528],{"class":776},"++",[770,1530,785],{"class":784},[770,1532,1534,1537,1540,1542,1545],{"class":772,"line":1533},24,[770,1535,1536],{"class":784},"            } ",[770,1538,1539],{"class":776},"catch",[770,1541,1131],{"class":784},[770,1543,1544],{"class":824},"Throwable",[770,1546,1547],{"class":784}," $error) {\n",[770,1549,1551,1554,1556],{"class":772,"line":1550},25,[770,1552,1553],{"class":784},"                $lastError ",[770,1555,1366],{"class":776},[770,1557,1558],{"class":784}," $error;\n",[770,1560,1562,1565,1567,1570,1573,1575,1578,1580,1583],{"class":772,"line":1561},26,[770,1563,1564],{"class":824},"                App",[770,1566,1024],{"class":776},[770,1568,1569],{"class":780},"instance",[770,1571,1572],{"class":784},"()",[770,1574,1384],{"class":776},[770,1576,1577],{"class":780},"trigger",[770,1579,893],{"class":784},[770,1581,1582],{"class":1031},"'content-translator.translate:warning'",[770,1584,1585],{"class":784},", [\n",[770,1587,1589,1592,1594],{"class":772,"line":1588},27,[770,1590,1591],{"class":1031},"                    'unit'",[770,1593,1088],{"class":776},[770,1595,1596],{"class":784}," $unit,\n",[770,1598,1600,1603,1605,1608,1610,1613],{"class":772,"line":1599},28,[770,1601,1602],{"class":1031},"                    'reason'",[770,1604,1088],{"class":776},[770,1606,1607],{"class":784}," $error",[770,1609,1384],{"class":776},[770,1611,1612],{"class":780},"getMessage",[770,1614,1177],{"class":784},[770,1616,1618,1621,1623],{"class":772,"line":1617},29,[770,1619,1620],{"class":1031},"                    'previous'",[770,1622,1088],{"class":776},[770,1624,1625],{"class":784}," $error,\n",[770,1627,1629],{"class":772,"line":1628},30,[770,1630,1631],{"class":784},"                ]);\n",[770,1633,1635],{"class":772,"line":1634},31,[770,1636,1637],{"class":784},"            }\n",[770,1639,1641],{"class":772,"line":1640},32,[770,1642,1643],{"class":784},"        }\n",[770,1645,1647],{"class":772,"line":1646},33,[770,1648,790],{"emptyLinePlaceholder":700},[770,1650,1652,1655,1658,1661,1663],{"class":772,"line":1651},34,[770,1653,1654],{"class":776},"        if",[770,1656,1657],{"class":784}," ($translatedCount ",[770,1659,1660],{"class":776},"===",[770,1662,1398],{"class":824},[770,1664,1665],{"class":784},") {\n",[770,1667,1669,1672,1674,1676],{"class":772,"line":1668},35,[770,1670,1671],{"class":776},"            throw",[770,1673,1171],{"class":776},[770,1675,869],{"class":824},[770,1677,1462],{"class":784},[770,1679,1681,1684,1687,1690],{"class":772,"line":1680},36,[770,1682,1683],{"class":780},"                strategy",[770,1685,1686],{"class":784},": ",[770,1688,1689],{"class":1031},"'my-api'",[770,1691,1153],{"class":784},[770,1693,1695,1698,1701,1703,1705,1708,1711,1714],{"class":772,"line":1694},37,[770,1696,1697],{"class":780},"                reason",[770,1699,1700],{"class":784},": $lastError",[770,1702,1511],{"class":776},[770,1704,1612],{"class":780},[770,1706,1707],{"class":784},"() ",[770,1709,1710],{"class":776},"??",[770,1712,1713],{"class":1031}," 'unknown error'",[770,1715,1153],{"class":784},[770,1717,1719,1722,1724,1727],{"class":772,"line":1718},38,[770,1720,1721],{"class":780},"                unitsAttempted",[770,1723,1686],{"class":784},[770,1725,1726],{"class":824},"count",[770,1728,1729],{"class":784},"($units),\n",[770,1731,1733],{"class":772,"line":1732},39,[770,1734,1735],{"class":784},"            );\n",[770,1737,1739],{"class":772,"line":1738},40,[770,1740,1643],{"class":784},[770,1742,1744],{"class":772,"line":1743},41,[770,1745,790],{"emptyLinePlaceholder":700},[770,1747,1749,1752],{"class":772,"line":1748},42,[770,1750,1751],{"class":776},"        return",[770,1753,1754],{"class":784}," $results;\n",[770,1756,1758],{"class":772,"line":1757},43,[770,1759,1760],{"class":784},"    }\n",[770,1762,1764],{"class":772,"line":1763},44,[770,1765,919],{"class":784},[603,1767,1768],{},"The three moves to remember:",[1770,1771,1772,1782,1790],"ol",{},[631,1773,1774,1781],{},[624,1775,1776,1777,1780],{},"Pre-fill ",[607,1778,1779],{},"$results"," with source text"," so a per-unit failure preserves the existing content.",[631,1783,1784,1789],{},[624,1785,1786,1787],{},"Emit ",[607,1788,934],{}," for each dropped unit – listeners can log or alert.",[631,1791,1792,1798],{},[624,1793,1794,1795,1797],{},"Throw ",[607,1796,925],{}," only when zero units survived"," – partial success is success.",[603,1800,1801],{},"Wire it up:",[762,1803,1805],{"className":764,"code":1804,"filename":1070,"language":766,"meta":694,"style":694},"return [\n    'johannschopplich.content-translator' => [\n        'strategy' => new MyApiStrategy(),\n    ],\n];\n",[607,1806,1807,1813,1821,1833,1837],{"__ignoreMap":694},[770,1808,1809,1811],{"class":772,"line":773},[770,1810,1077],{"class":776},[770,1812,1080],{"class":784},[770,1814,1815,1817,1819],{"class":772,"line":695},[770,1816,1085],{"class":1031},[770,1818,1088],{"class":776},[770,1820,1080],{"class":784},[770,1822,1823,1825,1827,1829,1831],{"class":772,"line":793},[770,1824,1100],{"class":1031},[770,1826,1088],{"class":776},[770,1828,1171],{"class":776},[770,1830,1316],{"class":824},[770,1832,1177],{"class":784},[770,1834,1835],{"class":772,"line":802},[770,1836,1182],{"class":784},[770,1838,1839],{"class":772,"line":808},[770,1840,1187],{"class":784},[600,1842,1843],{},[603,1844,1845,1846,1848,1849,1851,1852,1854,1855,1857,1858,1861],{},"If your backend supports batching, prefer implementing ",[607,1847,619],{}," directly over passing a closure. ",[607,1850,218],{}," translates one text at a time and ignores ",[607,1853,943],{},"; a real ",[607,1856,619],{}," receives the full unit array, can batch, can route via ",[607,1859,1860],{},"fieldKey",", and can decide per-unit whether to translate or pass through.",[1863,1864,1865],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":694,"searchDepth":695,"depth":695,"links":1867},[1868,1869,1870,1878],{"id":759,"depth":695,"text":760},{"id":946,"depth":695,"text":947},{"id":981,"depth":695,"text":982,"children":1871},[1872,1873,1875,1877],{"id":995,"depth":793,"text":996},{"id":1056,"depth":793,"text":1874},"2. strategy Config Option",{"id":1190,"depth":793,"text":1876},"3. Legacy translateFn ",{"id":1212,"depth":793,"text":1213},{"id":1240,"depth":695,"text":1241},"Pluggable translation backends – pick DeepL, Copilot AI, or a callable, or implement your own to route through any service.",{},{"title":91,"description":1879},"u2z3a1Lz7UeNQeDki2-LgFt3nELZCQaK9mBhz34S0Z8",[1884,1886],{"title":200,"path":201,"stem":202,"description":1885,"children":-1},"Translate any page, file, or site model in place from PHP – with static helpers when you only have raw strings.",{"title":210,"path":211,"stem":212,"description":1887,"children":-1},"Translate via DeepL with automatic batching and retries – the default strategy when DeepL is configured.",1778009921359]