For larger translation tasks, you can translate multiple pages at once or even the entire website content.
Install the Kirby CLI and create a site/commands folder if it does not exist yet.
Translate all children of a specific page to a target language:
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');
}
];
# Translate all children of a selected page to German
kirby translate-children de
For large projects, translate the content of the whole website from the primary language to secondary languages:
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');
}
];
# Translate all pages to selected language(s)
kirby translate-all