Changelog

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

v3.17.0

A translation now reaches the pages and files that belong to the open view – module pages, its files, or anything 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

A batch run now reports every language on its own: what was saved, what was not, and why.

🚀 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. Server-side callers still report through the warning hook, not a return value.
  • KirbyTags survive translation: A stray space in the internal marker no longer discards the translation, and a translation that repeats one link while dropping another is now caught.
  • 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

  • AI translations via Copilot's plugin API: Content Translator now talks to Kirby Copilot through its versioned plugin API, keeping both plugins compatible as they evolve independently. Requires Kirby Copilot v3.9.0+. See the AI translation documentation.

v3.11.0

Translation backends are now pluggable. The new strategy config accepts DeepL, AI (via Kirby Copilot), or any custom Strategy implementation – including a closure for one-off integrations.

🚀 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: Translating a file or the site model no longer attempts title and slug patches that don't apply to those models. Title and slug updates are now scoped to pages, where they belong.

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: Fields marked with translate: false inside blocks are now correctly skipped during content synchronization (import). Previously, these fields were being imported even when marked as non-translatable, causing unwanted content overwrites.

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 are now sent to DeepL in chunks for translation by default when no custom translator function is set. This significantly improves performance by reducing the number of API calls to DeepL.

v3.7.0

🚀 Features

  • View button props: Support props for Content Translator view button (Kirby 5+) to customize its behavior per blueprint. See the View Button & Section Configuration guide for details.
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

  • File metadata batch translation: Batch translation of file metadata is now working correctly again. Previously, file metadata (like title, alt text) was skipped during batch operations.

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. This provides a unified view of all plugin licenses alongside Kirby's own license information.

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.
For example, if you set LC_ALL to en_UK, the target language for DeepL will still be EN, since EN-UK is not supported by DeepL. If you set LC_ALL to en_GB instead, then the Content Translator will send EN-GB as the target language to DeepL.

v3.2.0

♻️ Refactorings

  • Option renamed: bulk → batch: The bulk configuration option has been renamed to batch for clearer terminology. The old bulk option name continues to work for backward compatibility, but update your blueprints to batch for consistency with the documentation.

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: Panel view button as an alternative to the section. Including backward compatibility for Kirby 4 🎉.
  • Kirby 5: Full compatibility with Kirby 5 including the new Panel architecture.

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. This is useful for translating categories, labels, or keywords stored in tags fields.

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, this translation process is not reversible in the Panel and is handled server-side. Use it with caution, as it may take a while to translate all content. When the button is clicked, a confirmation dialog is displayed to prevent accidental batch translation.

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

🐞 Bug Fixes

  • Homepage slug protection: Disallow changing the slug on the homepage page ID.

v2.2.2

🚀 Features

  • DeepL error visibility: Common DeepL API errors are now displayed in the Panel instead of failing silently. This includes quota exceeded errors, character limit warnings, and authentication issues. Editors will see clear error messages when translations fail, making it easier to diagnose and resolve issues.

v2.2.0

🚀 Features

  • Kirby 5 alpha: Added compatibility with the Kirby 5 alpha release for developers who want to test with the upcoming Kirby version.
This is alpha support for testing purposes. Future Kirby 5 alpha releases may introduce breaking changes. Content Translator v3 will be released alongside the final Kirby 5 release with full, stable support.

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 with a complete overhaul of the plugin architecture. This release introduces a modern Panel section interface and streamlined translation workflows.

🚀 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.
  • Field-level control: Skip specific fields from translation by setting translate: false in blueprint options.