Changelog

Latest features, fixes, and improvements. Update via Composer or download the ZIP file.
Download v3.18.0

v3.18.0

🚀 Features

  • Translate language variables: The Translator button can now be added to Kirby's language view, where it translates the language's variables, or those of several languages at once. See Language Variables.

🐞 Bug Fixes

  • Text in parentheses is translated: A parenthetical that starts like a KirbyTag, such as (Note: closed on Sundays) or (10:00 – 18:00), kept its source text. Only a tag type Kirby has registered, its own or a plugin's, now counts as a KirbyTag.

v3.17.0

A translation started from a view can now take its related pages and files along – module pages, for example, or anything else a Kirby query names.

🚀 Features

  • Translate related pages and files: The new cascade blueprint option names further pages and files with a Kirby query, and every translation started from the view translates them too. They are saved directly, the dialog before a translation counts them, and the report names each one. See Translate Related Pages and Files, with an example for Kirby Modules.

🐞 Bug Fixes

  • A translation stays on its page: Opening another page or switching the language mid-run could put the result into the wrong page or language. A run now finishes where it started, or stops before it changes anything.
  • A renamed page is translated under its new title: After renaming a page from its parent's pages section, an import or batch translation of that page could still use the old title.
  • A renamed site is translated under its new title: The same applied to the site title.
  • kirbyTags matches tag types in any spelling: A tag type written as Link in the kirbyTags option was translated from PHP, but not in the Panel.

v3.16.0

🚀 Features

  • A batch report per language: When a language was not translated or not saved, the run ends in a dialog that names it with the reason, such as DeepL's exhausted quota. See Translation Results.
  • Notifications name the fields: When some texts kept their source text, the notification names their fields – in a batch run, each language with its fields.
  • Slugs follow the target language: A translated slug follows the slug rules of the target language.

🐞 Bug Fixes

  • A validation error no longer loses a language: A required field left empty or a translation longer than a field's maxlength used to fail the whole language. The translation is saved, and the dialog names the field.
  • Batch runs respect locks and permissions: When another user edits the content, or you may not edit it, a batch run stops, and the dialog says why. A language with unsaved changes is not saved over, so your own edits stay.
  • Code blocks stay as written: Kirby's code block is no longer translated.

v3.15.0

A translation run now reports what it left behind: which field kept its source text, and why – in the Panel, in the console, and as a return value in PHP.

🚀 Features

  • PHP runs return a result: translateContent() hands back what it translated and what it dropped, each drop naming its field and reason. See Translator.
  • Custom strategies can report a failed segment: A strategy can mark a single segment as failed instead of quietly passing its source text through. See Strategies.

🐞 Bug Fixes

  • A failed title no longer overwrites a translated one: A rejected title or slug translation used to write the source-language text into the target language, silently replacing a title you had translated by hand. It now leaves both untouched.
  • A segment the AI provider skipped is now reported: It was written back as source text and counted as translated, so the run claimed a completeness it did not have. It is now counted as a segment that kept its source text.

v3.14.0

🚀 Features

  • Runs report what they translated: A run that leaves segments in the source language now says how many. A run whose provider fails outright is reported as an error instead. See Translation Results.

🐞 Bug Fixes

  • No more false success messages in the Panel: Runs and imports used to end in "Content translated" even when nothing was touched. They now say when there was nothing to translate or import.
  • KirbyTags survive translation: Text with a KirbyTag kept its source text when the provider added a space inside the tag's placeholder. It now translates, and a translation that repeats one tag and drops another keeps its source text instead of losing the tag.
  • One failure no longer sinks the run: A failed title or a failed language is reported as untranslated instead of ending the run. Everything else still translates and stays written.

v3.13.0

🚀 Features

  • Full DeepL language catalogue: Languages such as Catalan, Serbian, Swahili, Cantonese, and Welsh now translate instead of failing with an unsupported-language error. See the DeepL documentation.
  • Language code overrides: The new targetLanguageOverrides config option maps a Kirby language code to any DeepL target code – including codes DeepL releases after this version. See the DeepL documentation.

🐞 Bug Fixes

  • Regional variants follow the language code: A de-ch language now translates to Swiss German and zh-tw to Traditional Chinese, even when the server locale disagrees. Previously the locale won, so sites with both a Simplified and a Traditional language received identical translations for the two. Thanks to @gutschik for the report.

v3.12.0

🚀 Features

  • Kirby Copilot v3.9.0 for AI translations: Update Kirby Copilot to v3.9.0 or later to keep translating with AI. With an older version, an AI translation stops with a message asking you to update Copilot. See the AI translation documentation.

v3.11.0

🚀 Features

  • Pluggable translation strategies: New johannschopplich.content-translator.strategy config option accepts 'deepl', 'ai', a Closure, or a custom Strategy instance. See the strategies documentation.
  • PHP classes: First-class PHP API for programmatic translation. Run translations from CLI, hooks, or any custom workflow. See the PHP classes documentation.

⚠️ Deprecated

  • translateFn config option: Use 'strategy' => $closure instead – the closure signature is identical. Will be removed in v4. See the migration guide.

v3.10.0

Kirby PanelLanguages
Deutsch
100%
All pages translated
Español
21%
15 incomplete pages
Français
64%
5 incomplete pages

🚀 Features

  • Translation Coverage view: A new Panel dashboard on /panel/languages showing per-language completion percentages and a pruned tree of pages still missing translations. See the translation coverage documentation.

🐛 Fixes

  • KirbyTag handling: KirbyTags are now extracted structurally before translation. Only their translatable parts (such as link text) are sent to the provider, while attributes, file references, and tag syntax are preserved verbatim.
  • File and site translation: A file has no title or slug of its own, and the site has no slug, so translating one with the title or slug option enabled ended in an error. Each option is now ignored where it does not apply.

v3.9.0

AI-powered translations are here! Kirby Content Translator now integrates with Kirby Copilot to offer AI translation alongside DeepL. When both are configured, choose your preferred provider for each translation.

🚀 Features

  • AI translations: Kirby Copilot integration for AI-powered translations using OpenAI's GPT models, Google Gemini, Anthropic Claude, or Mistral models.
  • UX Improvements: Loading indicator during translation requests for better user feedback.
  • System view license management: View your license key, activation status, and version compatibility directly in the Kirby Panel system view. Activate new licenses without leaving the Panel – no more manual file editing required.
  • Provider selection: Provider selection dialog when both DeepL and Copilot are configured – choose your translation backend per request.
Kirby Panel
3
Options
Content from English will be translated and saved to all selected languages. This may take a few seconds.
Options

v3.8.1

🚀 Features

  • View button theming: Customize the appearance of the Content Translator view button with the new theme prop. Available themes match Kirby's button styles (e.g., positive, negative, blue-icon).

🐞 Bug Fixes

  • Respect translate: false in blocks: Importing content overwrote block fields marked translate: false. Import now skips them.

v3.8.0

Major performance overhaul! Batch translation is now enabled by default when using DeepL, eliminating single API requests and dramatically improving translation speed. Up to 50 texts can now be translated in a single request to DeepL.

🚀 Features

  • Chunked translations: Texts now go to DeepL in chunks of up to 50, so a translation needs far fewer requests and finishes faster.

v3.7.0

🚀 Features

buttons:
  preview: true
  content-translator:
    title: true
    slug: true
    excludeFields:
      - description
  languages: true
  • Batch concurrency: Global batchConcurrency option to set a maximum number of concurrent translations in batch mode (default: 2).

v3.6.0

🚀 Features

  • Kirby Table plugin support: Added translation support for the Kirby Table plugin by Bogdan Condorachi. Table cell content is now properly translated in both Panel (client-side) and programmatic (server-side) translation modes.

🐞 Bug Fixes

  • Batch translation works for files: A batch translation started from a file failed with an error. The file's metadata now translates.

v3.5.0

🚀 Features

  • KirbyTags translation: KirbyTags translation support with selective attribute translation while preserving tag structure and functionality.
  • Translation hooks: Translation hooks for customizing translation behavior with content-translator.translate:before and content-translator.translate:after hooks.

v3.4.0

🚀 Features

  • Kirby 5 license status integration: The plugin now displays its license status on the Panel's system page, following Kirby 5's plugin license management conventions.

v3.3.0

🚀 Features

  • Locale-based language resolution: Use the language's LC_ALL locale (if available) to resolve the DeepL target language.
  • Language code validation: Validate language code against DeepL's supported target languages.

v3.2.0

♻️ Refactorings

  • Option renamed: bulk → batch: The bulk option is now called batch. bulk still works, but switch your blueprints to batch.

v3.1.0

🚀 Features

  • Language selection: Select the languages to translate the content into when using the batch translation feature.

v3.0.0

Kirby Content Translator v3 is a major release with full support for Kirby 5. This major release requires a new license key. If you already have a license, you receive a 50% discount on your new license. Head over to the Kirby Tools Hub to get your discount or read more in the license compatibility guide.

🚀 Features

  • Panel view button: A view button puts the translation actions in the view header, as an alternative to the section.

v2.5.0

🚀 Features

  • Improved HTML translation: Enabled HTML handling for DeepL API requests, ensuring HTML content (like rich text with formatting) is translated correctly while preserving tags and structure.
  • Markdown Field plugin support: Added compatibility with the community-driven Markdown Field plugin by Fabian Michael. Markdown content is now properly handled during translation.
  • Custom DeepL options: The new DeepL.requestOptions configuration option lets you set custom request options for the DeepL API, such as formality level or specific glossary IDs.

v2.4.0

🚀 Features

  • Tags field translation: The tags field type is now supported for translation. Each tag value is translated individually while preserving the comma-separated structure.

v2.3.0

🚀 Features

  • Slug translation API: New translateSlug PHP API method.
  • Batch translation mode: Batch translation mode overwrites the content of all secondary languages with the data of the default language and then translates into the respective language.
Kirby Panel

Unlike per-language translation, a batch run is not reversible in the Panel and may take a while, so a confirmation dialog asks first.

If this new feature breaks your workflow, you can disable it by setting batch: false in the plugin configuration.

🐞 Bug Fixes

  • Home page translation skips the slug: Translating the home page with slug enabled ended in an error, since Kirby does not let the home page's slug change. The slug is now skipped.

v2.2.2

🚀 Features

  • DeepL error visibility: A wrong API key, an exhausted quota, too large a request, or too many requests now each show their own error message in the Panel.

v2.2.0

🚀 Features

  • Kirby 5 alpha: The plugin runs on the Kirby 5 alpha, for testing only.

v2.1.0

🚀 Features

  • Field-level translation control: Skip translating specific fields by setting translate: false in your blueprint field options. This is useful for fields that contain code, identifiers, or other content that should remain unchanged across languages.
blueprint.yml
fields:
  code:
    type: textarea
    translate: false # This field will not be translated
  • Improved button labels: Translation button texts have been updated to more clearly indicate their action (Import/Translate).

v2.0.0

Kirby Content Translator v2 is a major release and the first to require a license.

🚀 Features

  • New Panel section UI: Redesigned translation interface with clearer actions for importing and translating content.
  • Improved DeepL integration: Enhanced API handling with better error messages and support for all DeepL-supported languages.
  • Structure-aware translation: Properly handles blocks, layouts, structures, and nested fields while preserving their structure.