[{"data":1,"prerenderedAt":590},["ShallowReactive",2],{"content-translator-navigation":3,"mdc-o8y00b-key":146,"content-translator-version":188,"\u002Fdocs\u002Fcontent-translator\u002Fpanel\u002Flanguage-variables":191,"\u002Fdocs\u002Fcontent-translator\u002Fpanel\u002Flanguage-variables-surround":585},[4,19,33,50,67,104,121],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","\u002Fdocs\u002Fcontent-translator\u002Fgetting-started","1.docs\u002F2.content-translator\u002F1.getting-started\u002F1.index",[9,11,15],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Installation","\u002Fdocs\u002Fcontent-translator\u002Fgetting-started\u002Finstallation","1.docs\u002F2.content-translator\u002F1.getting-started\u002F2.installation",{"title":16,"path":17,"stem":18},"Migration","\u002Fdocs\u002Fcontent-translator\u002Fgetting-started\u002Fmigration","1.docs\u002F2.content-translator\u002F1.getting-started\u002F3.migration",{"title":20,"path":21,"stem":22,"children":23,"page":32},"Configuration","\u002Fdocs\u002Fcontent-translator\u002Fconfiguration","1.docs\u002F2.content-translator\u002F2.configuration",[24,28],{"title":25,"path":26,"stem":27},"Global Configuration","\u002Fdocs\u002Fcontent-translator\u002Fconfiguration\u002Fglobal","1.docs\u002F2.content-translator\u002F2.configuration\u002F1.global",{"title":29,"path":30,"stem":31},"View Button & Section Configuration","\u002Fdocs\u002Fcontent-translator\u002Fconfiguration\u002Flocal","1.docs\u002F2.content-translator\u002F2.configuration\u002F2.local",false,{"title":34,"path":35,"stem":36,"children":37,"page":32},"Translation Strategies","\u002Fdocs\u002Fcontent-translator\u002Fproviders","1.docs\u002F2.content-translator\u002F3.providers",[38,42,46],{"title":39,"path":40,"stem":41},"DeepL","\u002Fdocs\u002Fcontent-translator\u002Fproviders\u002Fdeepl","1.docs\u002F2.content-translator\u002F3.providers\u002F1.deepl",{"title":43,"path":44,"stem":45},"AI Translation","\u002Fdocs\u002Fcontent-translator\u002Fproviders\u002Fai-translation","1.docs\u002F2.content-translator\u002F3.providers\u002F2.ai-translation",{"title":47,"path":48,"stem":49},"Custom Translator","\u002Fdocs\u002Fcontent-translator\u002Fproviders\u002Fcustom-translator","1.docs\u002F2.content-translator\u002F3.providers\u002F3.custom-translator",{"title":51,"path":52,"stem":53,"children":54,"page":32},"Panel","\u002Fdocs\u002Fcontent-translator\u002Fpanel","1.docs\u002F2.content-translator\u002F4.panel",[55,59,63],{"title":56,"path":57,"stem":58},"Translation Coverage","\u002Fdocs\u002Fcontent-translator\u002Fpanel\u002Ftranslation-coverage","1.docs\u002F2.content-translator\u002F4.panel\u002F1.translation-coverage",{"title":60,"path":61,"stem":62},"Translation Results","\u002Fdocs\u002Fcontent-translator\u002Fpanel\u002Ftranslation-results","1.docs\u002F2.content-translator\u002F4.panel\u002F2.translation-results",{"title":64,"path":65,"stem":66},"Language Variables","\u002Fdocs\u002Fcontent-translator\u002Fpanel\u002Flanguage-variables","1.docs\u002F2.content-translator\u002F4.panel\u002F3.language-variables",{"title":68,"path":69,"stem":70,"children":71},"PHP Classes","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes","1.docs\u002F2.content-translator\u002F5.php-classes\u002F1.index",[72,74,78,96,100],{"title":73,"path":69,"stem":70},"Overview",{"title":75,"path":76,"stem":77},"Translator","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Ftranslator","1.docs\u002F2.content-translator\u002F5.php-classes\u002F2.translator",{"title":79,"path":80,"stem":81,"children":82,"defaultOpen":32},"Strategies","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F1.index",[83,84,88,92],{"title":73,"path":80,"stem":81},{"title":85,"path":86,"stem":87},"DeepLStrategy","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies\u002Fdeepl-strategy","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F2.deepl-strategy",{"title":89,"path":90,"stem":91},"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":93,"path":94,"stem":95},"CallableStrategy","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fstrategies\u002Fcallable-strategy","1.docs\u002F2.content-translator\u002F5.php-classes\u002F3.strategies\u002F4.callable-strategy",{"title":97,"path":98,"stem":99},"Exceptions","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fexceptions","1.docs\u002F2.content-translator\u002F5.php-classes\u002F4.exceptions",{"title":101,"path":102,"stem":103},"DeepL Client","\u002Fdocs\u002Fcontent-translator\u002Fphp-classes\u002Fdeepl-client","1.docs\u002F2.content-translator\u002F5.php-classes\u002F5.deepl-client",{"title":105,"path":106,"stem":107,"children":108,"page":32},"Advanced","\u002Fdocs\u002Fcontent-translator\u002Fadvanced","1.docs\u002F2.content-translator\u002F6.advanced",[109,113,117],{"title":110,"path":111,"stem":112},"KirbyTags","\u002Fdocs\u002Fcontent-translator\u002Fadvanced\u002Fkirbytags","1.docs\u002F2.content-translator\u002F6.advanced\u002F1.kirbytags",{"title":114,"path":115,"stem":116},"Hooks","\u002Fdocs\u002Fcontent-translator\u002Fadvanced\u002Fhooks","1.docs\u002F2.content-translator\u002F6.advanced\u002F2.hooks",{"title":118,"path":119,"stem":120},"Translate Related Pages and Files","\u002Fdocs\u002Fcontent-translator\u002Fadvanced\u002Fcascade","1.docs\u002F2.content-translator\u002F6.advanced\u002F3.cascade",{"title":122,"path":123,"stem":124,"children":125,"page":32},"CLI & Automation","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation","1.docs\u002F2.content-translator\u002F7.cli-automation",[126,130,134,138,142],{"title":127,"path":128,"stem":129},"Single Page","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fsingle-page","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F1.single-page",{"title":131,"path":132,"stem":133},"Batch Pages","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fbatch-pages","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F2.batch-pages",{"title":135,"path":136,"stem":137},"File Metadata","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Ffile-metadata","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F3.file-metadata",{"title":139,"path":140,"stem":141},"Janitor Integration","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fjanitor","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F4.janitor",{"title":143,"path":144,"stem":145},"AI Strategy Override","\u002Fdocs\u002Fcontent-translator\u002Fcli-automation\u002Fai-strategy","1.docs\u002F2.content-translator\u002F7.cli-automation\u002F5.ai-strategy",{"data":147,"body":148},{},{"type":149,"children":150},"root",[151],{"type":152,"tag":153,"props":154,"children":155},"element","p",{},[156,159,168,170,177,179,186],{"type":157,"value":158},"text","Kirby Tools is built on ",{"type":152,"tag":160,"props":161,"children":165},"a",{"href":162,"rel":163},"https:\u002F\u002Fgetkirby.com",[164],"nofollow",[166],{"type":157,"value":167},"Kirby",{"type":157,"value":169}," – with gratitude to the team and community who make it. Help me improve the plugins: share feedback in ",{"type":152,"tag":160,"props":171,"children":174},{"href":172,"rel":173},"https:\u002F\u002Fgithub.com\u002Fkirby-tools\u002Fcommunity\u002Fdiscussions",[164],[175],{"type":157,"value":176},"Discussions",{"type":157,"value":178}," or report bugs via ",{"type":152,"tag":160,"props":180,"children":183},{"href":181,"rel":182},"https:\u002F\u002Fgithub.com\u002Fkirby-tools\u002Fcommunity\u002Fissues",[164],[184],{"type":157,"value":185},"Issues",{"type":157,"value":187},".",{"title":189,"date":190},"v3.18.0","2026-10-06",{"id":192,"title":64,"body":193,"description":579,"extension":580,"meta":581,"navigation":582,"path":65,"seo":583,"stem":66,"__hash__":584},"docs\u002F1.docs\u002F2.content-translator\u002F4.panel\u002F3.language-variables.md",{"type":194,"value":195,"toc":572},"minimark",[196,213,218,226,329,336,350,447,457,461,471,482,493,500,504,519,523,538,542,568],[153,197,198,199,203,204,209,210,212],{},"Open a language from Kirby's ",[200,201,202],"strong",{},"Languages"," view to see its ",[160,205,208],{"href":206,"rel":207},"https:\u002F\u002Fgetkirby.com\u002Fdocs\u002Fguide\u002Flanguages\u002Fcustom-language-variables",[164],"language variables",". The ",[200,211,75],{}," button in a language's view translates the variables that are still untranslated and saves them directly – into the language you're looking at, or from the default language into several secondary languages at once.",[214,215,217],"h2",{"id":216},"add-the-button","Add the Button",[153,219,220,221,225],{},"Kirby's language view has no blueprint, so the button goes into the ",[222,223,224],"code",{},"panel.viewButtons.language"," option:",[227,228,234],"pre",{"className":229,"code":230,"filename":231,"language":232,"meta":233,"style":233},"language-php shiki shiki-themes github-light github-light github-dark","return [\n    'panel' => [\n        'viewButtons' => [\n            \u002F\u002F Kirby's default buttons, plus `content-translator`\n            'language' => ['open', 'content-translator', 'settings', 'delete']\n        ]\n    ]\n];\n","site\u002Fconfig\u002Fconfig.php","php","",[222,235,236,249,261,271,278,311,317,323],{"__ignoreMap":233},[237,238,241,245],"span",{"class":239,"line":240},"line",1,[237,242,244],{"class":243},"s8jYJ","return",[237,246,248],{"class":247},"sxrX7"," [\n",[237,250,252,256,259],{"class":239,"line":251},2,[237,253,255],{"class":254},"sIIMD","    'panel'",[237,257,258],{"class":243}," =>",[237,260,248],{"class":247},[237,262,264,267,269],{"class":239,"line":263},3,[237,265,266],{"class":254},"        'viewButtons'",[237,268,258],{"class":243},[237,270,248],{"class":247},[237,272,274],{"class":239,"line":273},4,[237,275,277],{"class":276},"sCsY4","            \u002F\u002F Kirby's default buttons, plus `content-translator`\n",[237,279,281,284,286,289,292,295,298,300,303,305,308],{"class":239,"line":280},5,[237,282,283],{"class":254},"            'language'",[237,285,258],{"class":243},[237,287,288],{"class":247}," [",[237,290,291],{"class":254},"'open'",[237,293,294],{"class":247},", ",[237,296,297],{"class":254},"'content-translator'",[237,299,294],{"class":247},[237,301,302],{"class":254},"'settings'",[237,304,294],{"class":247},[237,306,307],{"class":254},"'delete'",[237,309,310],{"class":247},"]\n",[237,312,314],{"class":239,"line":313},6,[237,315,316],{"class":247},"        ]\n",[237,318,320],{"class":239,"line":319},7,[237,321,322],{"class":247},"    ]\n",[237,324,326],{"class":239,"line":325},8,[237,327,328],{"class":247},"];\n",[153,330,331,332,335],{},"The list replaces Kirby's defaults, so keep naming every button you want. The button appears in the view of every language, and its actions are disabled for a role without the ",[222,333,334],{},"languages.update"," permission.",[153,337,338,339,342,343,349],{},"The button reads the plugin's ",[160,340,341],{"href":26},"global options",". A button entry with options overrides them for the language view, such as ",[160,344,346],{"href":345},"\u002Fdocs\u002Fcontent-translator\u002Fconfiguration\u002Flocal#batch",[222,347,348],{},"batch"," to hide the batch run:",[227,351,353],{"className":229,"code":352,"filename":231,"language":232,"meta":233,"style":233},"return [\n    'panel' => [\n        'viewButtons' => [\n            'language' => [\n                'open',\n                'content-translator' => ['batch' => false],\n                'settings',\n                'delete'\n            ]\n        ]\n    ]\n];\n",[222,354,355,361,369,377,385,393,414,421,426,432,437,442],{"__ignoreMap":233},[237,356,357,359],{"class":239,"line":240},[237,358,244],{"class":243},[237,360,248],{"class":247},[237,362,363,365,367],{"class":239,"line":251},[237,364,255],{"class":254},[237,366,258],{"class":243},[237,368,248],{"class":247},[237,370,371,373,375],{"class":239,"line":263},[237,372,266],{"class":254},[237,374,258],{"class":243},[237,376,248],{"class":247},[237,378,379,381,383],{"class":239,"line":273},[237,380,283],{"class":254},[237,382,258],{"class":243},[237,384,248],{"class":247},[237,386,387,390],{"class":239,"line":280},[237,388,389],{"class":254},"                'open'",[237,391,392],{"class":247},",\n",[237,394,395,398,400,402,405,407,411],{"class":239,"line":313},[237,396,397],{"class":254},"                'content-translator'",[237,399,258],{"class":243},[237,401,288],{"class":247},[237,403,404],{"class":254},"'batch'",[237,406,258],{"class":243},[237,408,410],{"class":409},"sBjJW"," false",[237,412,413],{"class":247},"],\n",[237,415,416,419],{"class":239,"line":319},[237,417,418],{"class":254},"                'settings'",[237,420,392],{"class":247},[237,422,423],{"class":239,"line":325},[237,424,425],{"class":254},"                'delete'\n",[237,427,429],{"class":239,"line":428},9,[237,430,431],{"class":247},"            ]\n",[237,433,435],{"class":239,"line":434},10,[237,436,316],{"class":247},[237,438,440],{"class":239,"line":439},11,[237,441,322],{"class":247},[237,443,445],{"class":239,"line":444},12,[237,446,328],{"class":247},[448,449,450],"warning",{},[153,451,452,453,456],{},"Kirby saves language variables into the language definition file in ",[222,454,455],{},"site\u002Flanguages\u002F",". A language file that builds its variables in PHP, such as by loading a YAML file, is rewritten as a plain array – as with every variable you edit in the Panel.",[214,458,460],{"id":459},"translate-one-language","Translate One Language",[153,462,463,464,467,468,470],{},"In a secondary language's view, ",[200,465,466],{},"Translate → DE"," in the ",[200,469,75],{}," dropdown opens a dialog that counts the variables to translate:",[472,473,474],"panel-mock",{},[475,476],"panel-dialog",{":cancelButton":477,":fields":478,":submitButton":479,":value":480,"size":481},"true","{\"help\":{\"type\":\"info\",\"text\":\"7 of 8 variables are missing in Deutsch or still identical to English. They will be translated and saved directly.\"},\"strategyName\":{\"type\":\"toggles\",\"label\":\"Translate with\",\"labels\":true,\"grow\":true,\"options\":[{\"value\":\"deepl\",\"text\":\"DeepL\",\"icon\":\"translate\"},{\"value\":\"ai\",\"text\":\"ChatGPT\",\"icon\":\"content-translator-openai\"}]}}","{\"icon\":\"translate\",\"theme\":\"positive\",\"text\":\"Translate\"}","{\"strategyName\":\"deepl\"}","medium",[153,483,484,485,488,489,492],{},"The provider choice appears when ",[160,486,487],{"href":44},"both are configured",". ",[200,490,491],{},"Translate"," saves the translations directly, and the view shows them.",[153,494,495,496,499],{},"When every variable already has its own translation, a notification says ",[200,497,498],{},"Every variable in Deutsch has its own translation"," instead of opening the dialog.",[214,501,503],{"id":502},"translate-several-languages","Translate Several Languages",[153,505,506,507,467,510,512,513,516,517,187],{},"In the default language's view, ",[200,508,509],{},"EN → All Languages",[200,511,75],{}," dropdown opens the batch dialog. Each selected language is saved on its own, so a language that fails leaves the others saved. The run ends in ",[200,514,515],{},"Variables translated for the selected languages",", or in a dialog naming each language that needs attention – see ",[160,518,60],{"href":61},[214,520,522],{"id":521},"what-gets-translated","What Gets Translated",[153,524,525,526,529,530,533,534,537],{},"A variable is translated when it is missing or empty in the language, or still identical to the default language's. A variable with its own translation stays as it is. Each value of a countable variable is translated. A variable without text to translate, such as a number, a URL, or a lone ",[222,527,528],{},"{count}",", is left out. On Kirby 5.6 and later, a variable named like one of Kirby's own translation strings, such as ",[222,531,532],{},"search"," or ",[222,535,536],{},"next",", is left out too, since Kirby refuses to save it from the Panel.",[214,539,541],{"id":540},"variable-placeholders-and-kirbytags","Variable Placeholders and KirbyTags",[153,543,544,545,533,547,550,551,554,555,558,559,562,563,187],{},"Variable placeholders such as ",[222,546,528],{},[222,548,549],{},"{{ name }}",", which ",[222,552,553],{},"tt()"," and ",[222,556,557],{},"tc()"," fill in, come back as written. When a translation loses or changes one, the variable is not saved, and the notification names it: ",[200,560,561],{},"1 of 7 variables was not translated: cart.items",". A KirbyTag in a variable is translated like one in a field: only the attributes named in ",[160,564,565],{"href":111},[222,566,567],{},"kirbyTags",[569,570,571],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":233,"searchDepth":251,"depth":251,"links":573},[574,575,576,577,578],{"id":216,"depth":251,"text":217},{"id":459,"depth":251,"text":460},{"id":502,"depth":251,"text":503},{"id":521,"depth":251,"text":522},{"id":540,"depth":251,"text":541},"Translate the language variables a language is missing into one secondary language or several, from Kirby's language view.","md",{},true,{"title":64,"description":579},"5k7I-WDoBZJknIYRVVOOTdfaoV7k_2P2Cpo5c7Jqw_U",[586,588],{"title":60,"path":61,"stem":62,"description":587,"children":-1},"The notification or dialog a translation run ends in – and where to find the reason a field kept its source language.",{"title":73,"path":69,"stem":70,"description":589,"children":-1},"Translate Kirby pages, files, and site content from PHP – the same pipeline the Panel uses, exposed as a public API.",1791313944447]