Batch Pages

Translate all children of a page or every page on the site recursively – ideal for large multilingual launches.

For larger translation tasks, you can translate multiple pages at once or even the entire website content.

Prerequisites

Install the Kirby CLI and create a site/commands folder if it does not exist yet.

Translate All Children of a Page

Translate all children of a specific page to a target language:

site/commands/translate-children.php
use Kirby\CLI\CLI;

return [
    'description' => 'Translates the content of all children of a specific page.',
    'args' => [
        'language' => [
            'description' => 'The target language to translate the content to.',
            'defaultValue' => 'de'
        ]
    ],
    'command' => static function (CLI $cli): void {
        $kirby = $cli->kirby();
        $defaultLanguage = $kirby->defaultLanguage()->code();
        $targetLanguage = $cli->arg('language');

        $siteChildren = $kirby->site()->children();
        $input = $cli->radio(
            'Which page\'s children should be translated?',
            $siteChildren->pluck('title')
        );
        $response = $input->prompt();
        $cli->success('Selected parent page: ' . $response);

        $page = $siteChildren->findBy('title', $response);

        foreach ($page->children()->listed() as $child) {
            $translator = $child->translator();
            $translator->copyContent($targetLanguage, $defaultLanguage);
            $translator->translateContent($targetLanguage, $targetLanguage, $defaultLanguage);
            $cli->out('Translated ' . $child->id());
        }

        $cli->success('Successfully translated all ' . $page->id() . ' children');
    }
];

Usage

# Translate all children of a selected page to German
kirby translate-children de

Translate Entire Website

For large projects, translate the content of the whole website from the primary language to secondary languages:

site/commands/translate-all.php
use Kirby\CLI\CLI;
use Kirby\Cms\Language;

$defaultAllLanguagesLabel = 'All Languages';

return [
    'description' => 'Translates the content of the whole website',
    'args' => [],
    'command' => static function (CLI $cli) use ($defaultAllLanguagesLabel): void {
        $kirby = $cli->kirby();
        $defaultLanguage = $kirby->defaultLanguage()->code();
        $nonDefaultLanguages = $kirby->languages()->filter(fn (Language $language) => !$language->isDefault());

        $input = $cli->radio(
            'Content of which language/languages should be translated?',
            [
                $defaultAllLanguagesLabel,
                ...$nonDefaultLanguages->pluck('name')
            ]
        );

        $targetLanguage = $input->prompt();
        $hasAllLanguagesSelected = $targetLanguage === $defaultAllLanguagesLabel;
        $selectedLanguages = $hasAllLanguagesSelected
            ? $nonDefaultLanguages
            : $nonDefaultLanguages->filter(fn (Language $language) => $language->name() === $targetLanguage);

        $cli->success('Translating to: ' . implode(', ', $selectedLanguages->pluck('name')));

        // Translate all site translations
        foreach ($selectedLanguages as $language) {
            /** @var \JohannSchopplich\ContentTranslator\Translator */
            $translator = $kirby->site()->translator();

            $translator->copyContent($language->code(), $defaultLanguage);
            $translator->translateContent($language->code(), $language->code(), $defaultLanguage);
            $cli->{$hasAllLanguagesSelected ? 'out' : 'success'}('Translated site data to ' . $language->name());
        }

        if ($hasAllLanguagesSelected) {
            $cli->success('Successfully translated all ' . $kirby->site()->title() . ' site data');
        }

        // Recursively translate all pages
        foreach ($kirby->site()->index() as $page) {
            /** @var \JohannSchopplich\ContentTranslator\Translator */
            $translator = $page->translator();

            foreach ($selectedLanguages as $language) {
                /** @var \Kirby\Cms\Language $language */
                $translator->copyContent($language->code(), $defaultLanguage);
                $translator->translateContent($language->code(), $language->code(), $defaultLanguage);
                $translator->translateTitle($language->code(), $language->code(), $defaultLanguage);
            }

            $cli->out('Translated ' . $page->id());
        }

        $cli->success('Successfully translated all ' . $kirby->site()->title() . ' pages');
    }
];

Usage

# Translate all pages to selected language(s)
kirby translate-all