PHPackages                             medienbaecker/kirby-translation-progress - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. medienbaecker/kirby-translation-progress

ActiveKirby-plugin[Localization &amp; i18n](/categories/localization)

medienbaecker/kirby-translation-progress
========================================

Translation status overview for the Kirby Panel

1.1.1(1mo ago)137↑328.6%MITPHPPHP ^8.2

Since Apr 7Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/medienbaecker/kirby-translation-progress)[ Packagist](https://packagist.org/packages/medienbaecker/kirby-translation-progress)[ RSS](/packages/medienbaecker-kirby-translation-progress/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (5)Dependencies (1)Versions (6)Used By (0)

Kirby Translation Progress
==========================

[](#kirby-translation-progress)

Extends the Panel's Languages view with a translation overview: a completion percentage per language and a collapsible page tree showing per-page progress.

[![The Languages view with a Translation Progress section showing per-language percentages and a page tree with translation progress per page and language](.github/screenshot.png)](.github/screenshot.png)

Installation
------------

[](#installation)

### Composer

[](#composer)

```
composer require medienbaecker/kirby-translation-progress
```

### Manual

[](#manual)

Download and extract to `site/plugins/kirby-translation-progress`.

Requirements
------------

[](#requirements)

- Kirby 5+
- PHP 8.2+
- Multi-language setup

How it works
------------

[](#how-it-works)

The plugin reads Kirby's content files, compares them field by field against the default language, and reports a percentage.

Pages *without* a content file for a language are marked as **missing**. A field is considered **translated** when its content differs from the default language. A field that's empty in the translation counts as **untranslated**. A field that's identical to the default language is where it gets tricky:

### Identical content

[](#identical-content)

When a field has the same value in both languages, is it translated or not? "API" in English is "API" in German and that's fine. But a full paragraph that's identical in both languages probably hasn't been translated yet.

The plugin uses a length heuristic: identical values shorter than `minValueLength` (default: 50 characters) are assumed to be loan words or proper nouns. Longer identical values are flagged as untranslated.

### Field types

[](#field-types)

The plugin reads the blueprint to find translatable fields. Fields with `translate: false` are excluded, and so are non-text types (`files`, `pages`, `users`, `link`, `color`, `date`, `time`) that don't contain translatable content.

For complex fields, the plugin extracts text before comparing:

Field typeWhat gets compared`text`, `textarea`The raw value`writer`, `list`HTML with tags stripped`blocks`Text from each block's content fields`layout`Text from blocks inside each column`structure`Each sub-field per row, individually`object`Each sub-field individually`tiptap`Text nodes from ProseMirror JSONObject and structure fields are expanded recursively, nested compounds (e.g. a structure inside an object) should work too.

### Language variables

[](#language-variables)

The `translations` array from your language files is also compared, shown as a separate row. Disable it with `languageVariables: false`.

Options
-------

[](#options)

```
'medienbaecker.translation-progress' => [
    'minValueLength'    => 50,
    'languageVariables' => true,
    'ignoreFieldTypes'  => ['files', 'pages', 'users', 'link', 'color', 'date', 'time'],
    'adapters'          => [],
],
```

Tip

Use Kirby's built-in `translate: false` option in your blueprints to exclude specific fields from secondary languages:

```
fields:
  category:
    type: select
    translate: false
```

Custom adapters
---------------

[](#custom-adapters)

For third-party field types that store text in a custom format, register an adapter that returns plain text:

```
'medienbaecker.translation-progress' => [
    'adapters' => [
        'my-field' => function (string $value): string {
            $data = json_decode($value, true);
            return strip_tags($data['html'] ?? '');
        },
    ],
],
```

Built-in adapters cover `writer`, `list`, `blocks`, `layout`, `structure`, `object`, and my `tiptap` plugin. A custom adapter with the same name overrides the built-in one.

Limitations
-----------

[](#limitations)

- The plugin can't know if identical content was intentional. The `minValueLength` threshold is a best guess.
- Blocks and layouts count as one field. The plugin doesn't track individual blocks across languages since they can be reordered, added, or removed independently.

License
-------

[](#license)

[MIT](./LICENSE)

###  Health Score

43

—

FairBetter than 91% of packages

Maintenance94

Actively maintained with recent releases

Popularity13

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

5

Last Release

32d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/7975568?v=4)[Thomas Günther](/maintainers/medienbaecker)[@medienbaecker](https://github.com/medienbaecker)

---

Top Contributors

[![medienbaecker](https://avatars.githubusercontent.com/u/7975568?v=4)](https://github.com/medienbaecker "medienbaecker (8 commits)")

---

Tags

i18ntranslationmultilanguagekirbykirby-pluginpanel

### Embed Badge

![Health badge](/badges/medienbaecker-kirby-translation-progress/health.svg)

```
[![Health](https://phpackages.com/badges/medienbaecker-kirby-translation-progress/health.svg)](https://phpackages.com/packages/medienbaecker-kirby-translation-progress)
```

###  Alternatives

[jms/translation-bundle

Puts the Symfony Translation Component on steroids

42510.8M63](/packages/jms-translation-bundle)[gettext/gettext

PHP gettext manager

70530.2M102](/packages/gettext-gettext)[inpsyde/multilingual-press

Simply THE multisite-based free open source plugin for your multilingual websites.

2414.0k1](/packages/inpsyde-multilingual-press)[johannschopplich/kirby-content-translator

DeepL &amp; AI-powered content translation for Kirby CMS

208.1k](/packages/johannschopplich-kirby-content-translator)[instaclick/translation-editor-bundle

Web editor UI to manage Symfony2 translations (Symfony2 bundle)

2019.5k](/packages/instaclick-translation-editor-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
