world-game/kirby/src/Content/Translation.php
2026-01-13 10:21:41 +01:00

191 lines
3.9 KiB
PHP

<?php
namespace Kirby\Content;
use Kirby\Cms\Helpers;
use Kirby\Cms\Language;
use Kirby\Cms\ModelWithContent;
use Kirby\Exception\Exception;
/**
* Each page, file or site can have multiple
* translated versions of their content,
* represented by this class
*
* @package Kirby Content
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier
* @license https://getkirby.com/license
*/
class Translation
{
/**
* Creates a new translation object
*/
public function __construct(
protected ModelWithContent $model,
protected Version $version,
protected Language $language
) {
}
/**
* Improve `var_dump` output
* @codeCoverageIgnore
*/
public function __debugInfo(): array
{
return $this->toArray();
}
/**
* Returns the language code of the
* translation
*/
public function code(): string
{
return $this->language->code();
}
/**
* Returns the translation content
* as plain array
*/
public function content(): array
{
return $this->version->content($this->language)->toArray();
}
/**
* Absolute path to the translation content file
*
* @deprecated 5.0.0
*/
public function contentFile(): string
{
Helpers::deprecated('`$translation->contentFile()` has been deprecated. Please let us know if you have a use case for a replacement.', 'translation-methods');
return $this->version->contentFile($this->language);
}
/**
* Creates a new Translation for the given model
*
* @todo Needs to be refactored as soon as Version::create becomes static
* (see https://github.com/getkirby/kirby/pull/6491#discussion_r1652264408)
*/
public static function create(
ModelWithContent $model,
Version $version,
Language $language,
array $fields,
string|null $slug = null
): static {
// add the custom slug to the fields array
if ($slug !== null) {
$fields['slug'] = $slug;
}
$version->save($fields, $language);
return new static(
model: $model,
version: $version,
language: $language,
);
}
/**
* Checks if the translation file exists
*/
public function exists(): bool
{
return $this->version->exists($this->language);
}
/**
* Returns the translation code as id
*/
public function id(): string
{
return $this->language->code();
}
/**
* Checks if the this is the default translation
* of the model
*
* @deprecated 5.0.0 Use `::language()->isDefault()` instead
*/
public function isDefault(): bool
{
Helpers::deprecated('`$translation->isDefault()` has been deprecated. Use `$translation->language()->isDefault()` instead.', 'translation-methods');
return $this->language->isDefault();
}
/**
* Returns the language
*/
public function language(): Language
{
return $this->language;
}
/**
* Returns the parent page, file or site object
*/
public function model(): ModelWithContent
{
return $this->model;
}
/**
* @deprecated 5.0.0 Use `$translation->model()` instead
*/
public function parent(): ModelWithContent
{
throw new Exception(
message: '`$translation->parent()` has been deprecated. Please use `$translation->model()` instead'
);
}
/**
* Returns the custom translation slug
*/
public function slug(): string|null
{
return $this->version->read($this->language)['slug'] ?? null;
}
/**
* Converts the most important translation
* props to an array
*/
public function toArray(): array
{
return [
'code' => $this->language->code(),
'content' => $this->content(),
'exists' => $this->exists(),
'slug' => $this->slug(),
];
}
/**
* @deprecated 5.0.0 Use `$model->version()->update()` instead
*/
public function update(array|null $data = null, bool $overwrite = false): static
{
throw new Exception(
message: '`$translation->update()` has been deprecated. Please use `$model->version()->update()` instead'
);
}
/**
* Returns the version
*/
public function version(): Version
{
return $this->version;
}
}