Batch Pages

Translate multiple pages or the entire website via CLI.

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