Upgrade to 4.3.0

This commit is contained in:
Bastian Allgeier
2024-06-13 12:13:00 +02:00
parent 4b55753c46
commit e50c0341fc
87 changed files with 643 additions and 430 deletions

View File

@@ -3,7 +3,7 @@
"description": "The Kirby core", "description": "The Kirby core",
"license": "proprietary", "license": "proprietary",
"type": "kirby-cms", "type": "kirby-cms",
"version": "4.2.0", "version": "4.3.0",
"keywords": [ "keywords": [
"kirby", "kirby",
"cms", "cms",
@@ -37,7 +37,7 @@
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-openssl": "*", "ext-openssl": "*",
"christian-riesen/base32": "1.6.0", "christian-riesen/base32": "1.6.0",
"claviska/simpleimage": "4.1.0", "claviska/simpleimage": "4.2.0",
"composer/semver": "3.4.0", "composer/semver": "3.4.0",
"filp/whoops": "2.15.4", "filp/whoops": "2.15.4",
"getkirby/composer-installer": "^1.2.1", "getkirby/composer-installer": "^1.2.1",
@@ -46,7 +46,7 @@
"phpmailer/phpmailer": "6.9.1", "phpmailer/phpmailer": "6.9.1",
"symfony/polyfill-intl-idn": "1.29.0", "symfony/polyfill-intl-idn": "1.29.0",
"symfony/polyfill-mbstring": "1.29.0", "symfony/polyfill-mbstring": "1.29.0",
"symfony/yaml": "6.4.3" "symfony/yaml": "6.4.8"
}, },
"replace": { "replace": {
"symfony/polyfill-php72": "*" "symfony/polyfill-php72": "*"

40
kirby/composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "43b28f916503f0f7a7fcfaf5ce174692", "content-hash": "c551d482274b5418356af010c4845227",
"packages": [ "packages": [
{ {
"name": "christian-riesen/base32", "name": "christian-riesen/base32",
@@ -67,16 +67,16 @@
}, },
{ {
"name": "claviska/simpleimage", "name": "claviska/simpleimage",
"version": "4.1.0", "version": "4.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/claviska/SimpleImage.git", "url": "https://github.com/claviska/SimpleImage.git",
"reference": "1dcb9c785c44960890970d26e25c437a2a252bbf" "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/1dcb9c785c44960890970d26e25c437a2a252bbf", "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/dfbe53c01dae8467468ef2b817c09b786a7839d2",
"reference": "1dcb9c785c44960890970d26e25c437a2a252bbf", "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -108,7 +108,7 @@
"description": "A PHP class that makes working with images as simple as possible.", "description": "A PHP class that makes working with images as simple as possible.",
"support": { "support": {
"issues": "https://github.com/claviska/SimpleImage/issues", "issues": "https://github.com/claviska/SimpleImage/issues",
"source": "https://github.com/claviska/SimpleImage/tree/4.1.0" "source": "https://github.com/claviska/SimpleImage/tree/4.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -116,7 +116,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-04T15:41:11+00:00" "time": "2024-04-15T16:07:16+00:00"
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
@@ -627,16 +627,16 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.4.0", "version": "v3.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -645,7 +645,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@@ -674,7 +674,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
}, },
"funding": [ "funding": [
{ {
@@ -690,7 +690,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-23T14:45:45+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@@ -1018,16 +1018,16 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v6.4.3", "version": "v6.4.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "d75715985f0f94f978e3a8fa42533e10db921b90" "reference": "52903de178d542850f6f341ba92995d3d63e60c9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9",
"reference": "d75715985f0f94f978e3a8fa42533e10db921b90", "reference": "52903de178d542850f6f341ba92995d3d63e60c9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1070,7 +1070,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v6.4.3" "source": "https://github.com/symfony/yaml/tree/v6.4.8"
}, },
"funding": [ "funding": [
{ {
@@ -1086,7 +1086,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-23T14:51:35+00:00" "time": "2024-05-31T14:49:08+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],

View File

@@ -22,7 +22,7 @@ return [
'text' => Escape::html($page->title()->value()), 'text' => Escape::html($page->title()->value()),
'link' => $page->panel()->url(true), 'link' => $page->panel()->url(true),
'info' => Escape::html($page->id()), 'info' => Escape::html($page->id()),
'uuid' => $page->uuid()->toString(), 'uuid' => $page->uuid()?->toString(),
]), ]),
'pagination' => $pages->pagination()->toArray() 'pagination' => $pages->pagination()->toArray()
]; ];

View File

@@ -85,6 +85,7 @@ return [
'props' => [ 'props' => [
'environment' => $environment, 'environment' => $environment,
'exceptions' => $kirby->option('debug') === true ? $exceptions : [], 'exceptions' => $kirby->option('debug') === true ? $exceptions : [],
'info' => $system->info(),
'plugins' => $plugins, 'plugins' => $plugins,
'security' => $security, 'security' => $security,
'urls' => [ 'urls' => [

View File

@@ -44,7 +44,7 @@ return function ($props) {
} }
if (empty($sidebar) === true) { if (empty($sidebar) === true) {
$props['fields'] = $props['fields'] ?? []; $props['fields'] ??= [];
unset( unset(
$props['files'], $props['files'],

View File

@@ -26,7 +26,7 @@ return function (array $props) {
// inject the global templates definition // inject the global templates definition
if (empty($templates) === false) { if (empty($templates) === false) {
$props['templates'] = $props['templates'] ?? $templates; $props['templates'] ??= $templates;
} }
return array_replace_recursive($defaults, $props); return array_replace_recursive($defaults, $props);

View File

@@ -232,11 +232,39 @@ return [
return false; return false;
} }
if (in_array($this->status, ['draft', 'all']) === false) { if ($this->isFull() === true) {
return false; return false;
} }
if ($this->isFull() === true) { // form here on, we need to check with which status
// the pages are created and if the section can show
// these newly created pages
// if the section shows pages no matter what status they have,
// we can always show the add button
if ($this->status === 'all') {
return true;
}
// collect all statuses of the blueprints
// that are allowed to be created
$statuses = [];
foreach ($this->blueprintNames() as $blueprint) {
try {
$props = Blueprint::load('pages/' . $blueprint);
$statuses[] = $props['create']['status'] ?? 'draft';
} catch (Throwable) {
$statuses[] = 'draft'; // @codeCoverageIgnore
}
}
$statuses = array_unique($statuses);
// if there are multiple statuses or if the section is showing
// a different status than new pages would be created with,
// we cannot show the add button
if (count($statuses) > 1 || $this->status !== $statuses[0]) {
return false; return false;
} }
@@ -249,22 +277,12 @@ return [
'methods' => [ 'methods' => [
'blueprints' => function () { 'blueprints' => function () {
$blueprints = []; $blueprints = [];
$templates = empty($this->create) === false ? A::wrap($this->create) : $this->templates;
if (empty($templates) === true) {
$templates = $this->kirby()->blueprints();
}
// excludes ignored templates
if ($templatesIgnore = $this->templatesIgnore) {
$templates = array_diff($templates, $templatesIgnore);
}
// convert every template to a usable option array // convert every template to a usable option array
// for the template select box // for the template select box
foreach ($templates as $template) { foreach ($this->blueprintNames() as $blueprint) {
try { try {
$props = Blueprint::load('pages/' . $template); $props = Blueprint::load('pages/' . $blueprint);
$blueprints[] = [ $blueprints[] = [
'name' => basename($props['name']), 'name' => basename($props['name']),
@@ -272,14 +290,28 @@ return [
]; ];
} catch (Throwable) { } catch (Throwable) {
$blueprints[] = [ $blueprints[] = [
'name' => basename($template), 'name' => basename($blueprint),
'title' => ucfirst($template), 'title' => ucfirst($blueprint),
]; ];
} }
} }
return $blueprints; return $blueprints;
} },
'blueprintNames' => function () {
$blueprints = empty($this->create) === false ? A::wrap($this->create) : $this->templates;
if (empty($blueprints) === true) {
$blueprints = $this->kirby()->blueprints();
}
// excludes ignored templates
if ($templatesIgnore = $this->templatesIgnore) {
$blueprints = array_diff($blueprints, $templatesIgnore);
}
return $blueprints;
},
], ],
'toArray' => function () { 'toArray' => function () {
return [ return [

View File

@@ -252,6 +252,7 @@ return [
'caption', 'caption',
'controls', 'controls',
'class', 'class',
'disablepictureinpicture',
'height', 'height',
'loop', 'loop',
'muted', 'muted',
@@ -294,12 +295,15 @@ return [
// don't use attributes that iframe doesn't support // don't use attributes that iframe doesn't support
if ($isProviderVideo === false) { if ($isProviderVideo === false) {
// converts tag attributes to supported formats (listed below) to output correct html // convert tag attributes to supported formats (bool, string)
// booleans: autoplay, controls, loop, muted // to output correct html attributes
// strings : poster, preload //
// for ex : `autoplay` will not work if `false` is a `string` instead of a `boolean` // for ex:
// `autoplay` will not work if `false` is a string
// instead of a boolean
$attrs['autoplay'] = $autoplay = Str::toType($tag->autoplay, 'bool'); $attrs['autoplay'] = $autoplay = Str::toType($tag->autoplay, 'bool');
$attrs['controls'] = Str::toType($tag->controls ?? true, 'bool'); $attrs['controls'] = Str::toType($tag->controls ?? true, 'bool');
$attrs['disablepictureinpicture'] = Str::toType($tag->disablepictureinpicture ?? false, 'bool');
$attrs['loop'] = Str::toType($tag->loop, 'bool'); $attrs['loop'] = Str::toType($tag->loop, 'bool');
$attrs['muted'] = Str::toType($tag->muted ?? $autoplay, 'bool'); $attrs['muted'] = Str::toType($tag->muted ?? $autoplay, 'bool');
$attrs['playsinline'] = Str::toType($tag->playsinline ?? $autoplay, 'bool'); $attrs['playsinline'] = Str::toType($tag->playsinline ?? $autoplay, 'bool');

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Изисква се разширението <code>MB String</code>", "installation.issues.mbstring": "Изисква се разширението <code>MB String</code>",
"installation.issues.media": "Папката <code>/media</code> не съществува или няма права за запис", "installation.issues.media": "Папката <code>/media</code> не съществува или няма права за запис",
"installation.issues.php": "Бъдете сигурни, че използвате <code>PHP 8+</code>", "installation.issues.php": "Бъдете сигурни, че използвате <code>PHP 8+</code>",
"installation.issues.server": "Kirby изисква <code>Apache</code>, <code>Nginx</code> или <code>Caddy</code>",
"installation.issues.sessions": "The <code>/site/sessions</code> folder does not exist or is not writable", "installation.issues.sessions": "The <code>/site/sessions</code> folder does not exist or is not writable",
"language": "\u0415\u0437\u0438\u043a", "language": "\u0415\u0437\u0438\u043a",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Es requereix l'extensió de <code>MB String</code>", "installation.issues.mbstring": "Es requereix l'extensió de <code>MB String</code>",
"installation.issues.media": "La carpeta <code>/media</code> no existeix o no es pot escriure", "installation.issues.media": "La carpeta <code>/media</code> no existeix o no es pot escriure",
"installation.issues.php": "Assegureu-vos d'utilitzar <code>PHP 8+</code>", "installation.issues.php": "Assegureu-vos d'utilitzar <code>PHP 8+</code>",
"installation.issues.server": "Kirby requereix <code>Apache</code>, <code>Nginx</code> o <code>Caddy</code>",
"installation.issues.sessions": "La carpeta <code>/site/sessions</code> no existeix o no es pot escriure", "installation.issues.sessions": "La carpeta <code>/site/sessions</code> no existeix o no es pot escriure",
"language": "Idioma", "language": "Idioma",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Estat", "status": "Estat",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Je vyžadováno rozšíření<code>MB String</code>", "installation.issues.mbstring": "Je vyžadováno rozšíření<code>MB String</code>",
"installation.issues.media": "Složka<code>/media</code> neexistuje, nebo nemá povolený zápis", "installation.issues.media": "Složka<code>/media</code> neexistuje, nebo nemá povolený zápis",
"installation.issues.php": "Ujistěte se, že používáte<code>PHP 8+</code>", "installation.issues.php": "Ujistěte se, že používáte<code>PHP 8+</code>",
"installation.issues.server": "Kirby vyžaduje<code>Apache</code>, <code>Nginx</code> nebo<code>Caddy</code>",
"installation.issues.sessions": "Složka<code>/site/sessions</code> neexistuje, nebo nemá povolený zápis", "installation.issues.sessions": "Složka<code>/site/sessions</code> neexistuje, nebo nemá povolený zápis",
"language": "Jazyk", "language": "Jazyk",
@@ -618,6 +617,8 @@
"stats.empty": "Žádná hlášení", "stats.empty": "Žádná hlášení",
"status": "Stav", "status": "Stav",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Složka content je zřejmě přístupná zvenčí", "system.issues.content": "Složka content je zřejmě přístupná zvenčí",
"system.issues.eol.kirby": "Instalovaná verze Kirby dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace", "system.issues.eol.kirby": "Instalovaná verze Kirby dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace",
"system.issues.eol.plugin": "Instalovaná verze doplňku { plugin } dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace", "system.issues.eol.plugin": "Instalovaná verze doplňku { plugin } dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "<code>MB String</code> extension er påkrævet", "installation.issues.mbstring": "<code>MB String</code> extension er påkrævet",
"installation.issues.media": "<code>/media</code> mappen eksisterer ikke eller er ikke skrivbar", "installation.issues.media": "<code>/media</code> mappen eksisterer ikke eller er ikke skrivbar",
"installation.issues.php": "Sikre dig at der benyttes <code>PHP 8+</code>", "installation.issues.php": "Sikre dig at der benyttes <code>PHP 8+</code>",
"installation.issues.server": "Kirby kræver <code>Apache</code>, <code>Nginx</code> eller <code>Caddy</code>",
"installation.issues.sessions": "/site/sessions mappen eksisterer ikke eller er ikke skrivbar", "installation.issues.sessions": "/site/sessions mappen eksisterer ikke eller er ikke skrivbar",
"language": "Sprog", "language": "Sprog",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Die <code>MB String</code> Erweiterung wird benötigt", "installation.issues.mbstring": "Die <code>MB String</code> Erweiterung wird benötigt",
"installation.issues.media": "Der <code>/media</code> Ordner ist nicht beschreibbar", "installation.issues.media": "Der <code>/media</code> Ordner ist nicht beschreibbar",
"installation.issues.php": "Bitte verwende <code>PHP 8+</code>", "installation.issues.php": "Bitte verwende <code>PHP 8+</code>",
"installation.issues.server": "Kirby benötigt <code>Apache</code>, <code>Nginx</code> or <code>Caddy</code>",
"installation.issues.sessions": "<code>/site/sessions</code> ist nicht beschreibbar", "installation.issues.sessions": "<code>/site/sessions</code> ist nicht beschreibbar",
"language": "Sprache", "language": "Sprache",
@@ -618,6 +617,8 @@
"stats.empty": "Keine Daten", "stats.empty": "Keine Daten",
"status": "Status", "status": "Status",
"system.info.copy": "Info kopieren",
"system.info.copied": "System Info wurde kopiert",
"system.issues.content": "Der content Ordner scheint öffentlich zugänglich zu sein", "system.issues.content": "Der content Ordner scheint öffentlich zugänglich zu sein",
"system.issues.eol.kirby": "Deine Kirby Installation ist veraltet und erhält keine weiteren Sicherheitsupdates", "system.issues.eol.kirby": "Deine Kirby Installation ist veraltet und erhält keine weiteren Sicherheitsupdates",
"system.issues.eol.plugin": "Deine Version des { plugin } Plugins ist veraltet und erhält keine weiteren Sicherheitsupdates", "system.issues.eol.plugin": "Deine Version des { plugin } Plugins ist veraltet und erhält keine weiteren Sicherheitsupdates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Απαιτείται η επέκταση <code>MB String</code> ", "installation.issues.mbstring": "Απαιτείται η επέκταση <code>MB String</code> ",
"installation.issues.media": "Ο φάκελος <code>/media</code> δεν υπάρχει ή δεν είναι εγγράψιμος", "installation.issues.media": "Ο φάκελος <code>/media</code> δεν υπάρχει ή δεν είναι εγγράψιμος",
"installation.issues.php": "Βεβαιωθείτε ότι χρησιμοποιήτε <code>PHP 8+</code>", "installation.issues.php": "Βεβαιωθείτε ότι χρησιμοποιήτε <code>PHP 8+</code>",
"installation.issues.server": "To Kirby απαιτεί <code>Apache</code>, <code>Nginx</code> ή <code>Caddy</code>",
"installation.issues.sessions": "Ο φάκελος <code>/site/sessions</code> δεν υπάρχει ή δεν είναι εγγράψιμος", "installation.issues.sessions": "Ο φάκελος <code>/site/sessions</code> δεν υπάρχει ή δεν είναι εγγράψιμος",
"language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1", "language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Kατάσταση", "status": "Kατάσταση",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "The <code>MB String</code> extension is required", "installation.issues.mbstring": "The <code>MB String</code> extension is required",
"installation.issues.media": "The <code>/media</code> folder does not exist or is not writable", "installation.issues.media": "The <code>/media</code> folder does not exist or is not writable",
"installation.issues.php": "Make sure to use <code>PHP 8+</code>", "installation.issues.php": "Make sure to use <code>PHP 8+</code>",
"installation.issues.server": "Kirby requires <code>Apache</code>, <code>Nginx</code> or <code>Caddy</code>",
"installation.issues.sessions": "The <code>/site/sessions</code> folder does not exist or is not writable", "installation.issues.sessions": "The <code>/site/sessions</code> folder does not exist or is not writable",
"language": "Language", "language": "Language",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "La kromprogramo <code>MB String</code> estas deviga", "installation.issues.mbstring": "La kromprogramo <code>MB String</code> estas deviga",
"installation.issues.media": "La dosierujo <code>/media</code> ne ekzistas, aũ ne estas skribebla", "installation.issues.media": "La dosierujo <code>/media</code> ne ekzistas, aũ ne estas skribebla",
"installation.issues.php": "Nepre uzu <code>PHP 8+</code>", "installation.issues.php": "Nepre uzu <code>PHP 8+</code>",
"installation.issues.server": "Kirby bezonas <code>Apache</code>, <code>Nginx</code> aŭ <code>Caddy</code>",
"installation.issues.sessions": "La dosierujo <code>/site/sessions</code> ne ekzistas, aŭ ne estas skribebla", "installation.issues.sessions": "La dosierujo <code>/site/sessions</code> ne ekzistas, aŭ ne estas skribebla",
"language": "Lingvo", "language": "Lingvo",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Stato", "status": "Stato",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Se requiere la extensión <code>MB String</code>.", "installation.issues.mbstring": "Se requiere la extensión <code>MB String</code>.",
"installation.issues.media": "La carpeta <code>/media</code> no existe o no posee permisos de escritura.", "installation.issues.media": "La carpeta <code>/media</code> no existe o no posee permisos de escritura.",
"installation.issues.php": "Asegurese de estar usando <code>PHP 8+</code>", "installation.issues.php": "Asegurese de estar usando <code>PHP 8+</code>",
"installation.issues.server": "Kirby requiere <code>Apache</code>, <code>Nginx</code>, <code>Caddy</code>",
"installation.issues.sessions": "La carpeta <code>/site/sessions</code> no existe o no posee permisos de escritura.", "installation.issues.sessions": "La carpeta <code>/site/sessions</code> no existe o no posee permisos de escritura.",
"language": "Idioma", "language": "Idioma",
@@ -618,6 +617,8 @@
"stats.empty": "Sin informes", "stats.empty": "Sin informes",
"status": "Estado", "status": "Estado",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "La carpeta content parece estar expuesta", "system.issues.content": "La carpeta content parece estar expuesta",
"system.issues.eol.kirby": "La versión de Kirby que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", "system.issues.eol.kirby": "La versión de Kirby que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.",
"system.issues.eol.plugin": "Tu versión instalada del plugin { plugin } ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", "system.issues.eol.plugin": "Tu versión instalada del plugin { plugin } ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "La extension <code>MB String</code> es requerida", "installation.issues.mbstring": "La extension <code>MB String</code> es requerida",
"installation.issues.media": "La carpeta <code>/media</code> no existe o no se puede escribir", "installation.issues.media": "La carpeta <code>/media</code> no existe o no se puede escribir",
"installation.issues.php": "Asegurese de estar usando <code>PHP 8+</code>", "installation.issues.php": "Asegurese de estar usando <code>PHP 8+</code>",
"installation.issues.server": "Kirby requiere <code>Apache</code>, <code>Nginx</code> o <code>Caddy</code>",
"installation.issues.sessions": "La carpeta <code>/site/sessions</code> no existe o no se puede escribir", "installation.issues.sessions": "La carpeta <code>/site/sessions</code> no existe o no se puede escribir",
"language": "Idioma", "language": "Idioma",
@@ -618,6 +617,8 @@
"stats.empty": "Sin informes", "stats.empty": "Sin informes",
"status": "Estado", "status": "Estado",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "La carpeta content parece estar expuesta", "system.issues.content": "La carpeta content parece estar expuesta",
"system.issues.eol.kirby": "La versión de Kirby que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", "system.issues.eol.kirby": "La versión de Kirby que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.",
"system.issues.eol.plugin": "La versión del plugin { plugin } que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.", "system.issues.eol.plugin": "La versión del plugin { plugin } que tienes instalada ha llegado al final de su vida útil y no recibirá más actualizaciones de seguridad.",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "افزونه <code>MB String</code> مورد نیاز است", "installation.issues.mbstring": "افزونه <code>MB String</code> مورد نیاز است",
"installation.issues.media": "پوشه <code>/media</code> موجود نیست یا قابل نوشتن نیست", "installation.issues.media": "پوشه <code>/media</code> موجود نیست یا قابل نوشتن نیست",
"installation.issues.php": "لطفا از پی‌اچ‌پی 8 یا بالاتر استفاده کنید", "installation.issues.php": "لطفا از پی‌اچ‌پی 8 یا بالاتر استفاده کنید",
"installation.issues.server": "کربی نیاز به <code>Apache</code>، <code>Nginx</code> یا <code>Caddy</code> دارد",
"installation.issues.sessions": "پوشه <code>/site/sessions</code> وجود ندارد یا قابل نوشتن نیست", "installation.issues.sessions": "پوشه <code>/site/sessions</code> وجود ندارد یا قابل نوشتن نیست",
"language": "\u0632\u0628\u0627\u0646", "language": "\u0632\u0628\u0627\u0646",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "وضعیت", "status": "وضعیت",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "<code>MB String</code>-laajennos on pakollinen", "installation.issues.mbstring": "<code>MB String</code>-laajennos on pakollinen",
"installation.issues.media": "<code>/media</code> -kansio ei ole olemassa tai siihen ei voi kirjoittaa", "installation.issues.media": "<code>/media</code> -kansio ei ole olemassa tai siihen ei voi kirjoittaa",
"installation.issues.php": "Varmista että <code>PHP 8+</code> on käytössä", "installation.issues.php": "Varmista että <code>PHP 8+</code> on käytössä",
"installation.issues.server": "Kirby tarvitsee jonkun seuraavista: <code>Apache</code>, <code>Nginx</code> tai <code>Caddy</code>",
"installation.issues.sessions": "<code>/site/sessions</code> -kansio ei ole olemassa tai siihen ei voi kirjoittaa", "installation.issues.sessions": "<code>/site/sessions</code> -kansio ei ole olemassa tai siihen ei voi kirjoittaa",
"language": "Kieli", "language": "Kieli",
@@ -618,6 +617,8 @@
"stats.empty": "Ei raportteja", "stats.empty": "Ei raportteja",
"status": "Tila", "status": "Tila",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Content-kansio näyttäisi olevan julkinen", "system.issues.content": "Content-kansio näyttäisi olevan julkinen",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Lextension <code>MB String</code> est requise", "installation.issues.mbstring": "Lextension <code>MB String</code> est requise",
"installation.issues.media": "Le dossier <code>/media</code> nexiste pas ou nest pas accessible en écriture", "installation.issues.media": "Le dossier <code>/media</code> nexiste pas ou nest pas accessible en écriture",
"installation.issues.php": "Veuillez utiliser <code>PHP 8+</code>", "installation.issues.php": "Veuillez utiliser <code>PHP 8+</code>",
"installation.issues.server": "Kirby requiert <code>Apache</code>, <code>Nginx</code> ou <code>Caddy</code>",
"installation.issues.sessions": "Le dossier <code>/site/sessions</code> nexiste pas ou nest pas accessible en écriture", "installation.issues.sessions": "Le dossier <code>/site/sessions</code> nexiste pas ou nest pas accessible en écriture",
"language": "Langue", "language": "Langue",
@@ -618,6 +617,8 @@
"stats.empty": "Aucun rapport", "stats.empty": "Aucun rapport",
"status": "Statut", "status": "Statut",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Le dossier content semble exposé", "system.issues.content": "Le dossier content semble exposé",
"system.issues.eol.kirby": "La version de Kirby installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité", "system.issues.eol.kirby": "La version de Kirby installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité",
"system.issues.eol.plugin": "La version du plugin { plugin } installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité", "system.issues.eol.plugin": "La version du plugin { plugin } installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Az <code>MB String</code> bővítmény engedélyezése szükséges", "installation.issues.mbstring": "Az <code>MB String</code> bővítmény engedélyezése szükséges",
"installation.issues.media": "A <code>/media</code> mappa nem létezik vagy nem írható", "installation.issues.media": "A <code>/media</code> mappa nem létezik vagy nem írható",
"installation.issues.php": "Bizonyosodj meg róla, hogy az általad használt PHP-verzió <code>PHP 8+</code>", "installation.issues.php": "Bizonyosodj meg róla, hogy az általad használt PHP-verzió <code>PHP 8+</code>",
"installation.issues.server": "A Kirby az alábbi szervereken futtatható: <code>Apache</code>, <code>Nginx</code> vagy <code>Caddy</code>",
"installation.issues.sessions": "A <code>/site/sessions</code> könyvtár nem létezik vagy nem írható", "installation.issues.sessions": "A <code>/site/sessions</code> könyvtár nem létezik vagy nem írható",
"language": "Nyelv", "language": "Nyelv",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Állapot", "status": "Állapot",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Ekstensi <code>MB String</code> diperlukan", "installation.issues.mbstring": "Ekstensi <code>MB String</code> diperlukan",
"installation.issues.media": "Folder <code>/media</code> tidak ada atau tidak dapat ditulis", "installation.issues.media": "Folder <code>/media</code> tidak ada atau tidak dapat ditulis",
"installation.issues.php": "Pastikan Anda menggunakan <code>PHP 8+</code>", "installation.issues.php": "Pastikan Anda menggunakan <code>PHP 8+</code>",
"installation.issues.server": "Kirby memerlukan <code>Apache</code>, <code>Nginx</code>, atau <code>Caddy</code>",
"installation.issues.sessions": "Folder <code>/site/sessions</code> tidak ada atau tidak dapat ditulis", "installation.issues.sessions": "Folder <code>/site/sessions</code> tidak ada atau tidak dapat ditulis",
"language": "Bahasa", "language": "Bahasa",
@@ -618,6 +617,8 @@
"stats.empty": "Tidak ada laporan", "stats.empty": "Tidak ada laporan",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Folder konten nampaknya terekspos", "system.issues.content": "Folder konten nampaknya terekspos",
"system.issues.eol.kirby": "Versi instalasi Kirby Anda sudah mencapai akhir dan tidak akan lagi mendapat pembaruan keamanan", "system.issues.eol.kirby": "Versi instalasi Kirby Anda sudah mencapai akhir dan tidak akan lagi mendapat pembaruan keamanan",
"system.issues.eol.plugin": "Versi instalasi plugin { plugin } Anda sudah mencapai akhir dan tidak akan lagi mendapatkan pembaruan keamanan", "system.issues.eol.plugin": "Versi instalasi plugin { plugin } Anda sudah mencapai akhir dan tidak akan lagi mendapatkan pembaruan keamanan",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "<code>MB String</code> er hér bráðnauðsynleg", "installation.issues.mbstring": "<code>MB String</code> er hér bráðnauðsynleg",
"installation.issues.media": "<code>/media</code> mappan er annaðhvort ekki til eða er ekki skrifanleg", "installation.issues.media": "<code>/media</code> mappan er annaðhvort ekki til eða er ekki skrifanleg",
"installation.issues.php": "Notaðu <code>PHP 8+</code>", "installation.issues.php": "Notaðu <code>PHP 8+</code>",
"installation.issues.server": "Kirby krefst <code>Apache</code>, <code>Nginx</code> eða <code>Caddy</code>",
"installation.issues.sessions": "<code>/site/sessions</code> mappan er annaðhvort ekki til eða er ekki skrifanleg", "installation.issues.sessions": "<code>/site/sessions</code> mappan er annaðhvort ekki til eða er ekki skrifanleg",
"language": "Tungumál", "language": "Tungumál",
@@ -556,14 +555,14 @@
"page.status.draft.description": "Þessi síða er uppkast og er aðeins sýnileg vefstjórum eða gegnum laumu tengil.", "page.status.draft.description": "Þessi síða er uppkast og er aðeins sýnileg vefstjórum eða gegnum laumu tengil.",
"page.status.listed": "Útgefin og listuð", "page.status.listed": "Útgefin og listuð",
"page.status.listed.description": "Síðan er útgefin og listuð.", "page.status.listed.description": "Síðan er útgefin og listuð.",
"page.status.unlisted": "Útgefin", "page.status.unlisted": "Útgefin en ólistuð",
"page.status.unlisted.description": "Síðan er útgefin en þó ólistuð.", "page.status.unlisted.description": "Síðan er útgefin en þó ólistuð.",
"pages": "Síður", "pages": "Síður",
"pages.empty": "Engar síður enn", "pages.empty": "Engar síður enn",
"pages.status.draft": "Uppköst", "pages.status.draft": "Uppköst",
"pages.status.listed": "Útgefnar og listaðar", "pages.status.listed": "Útgefnar og listaðar",
"pages.status.unlisted": "Útgefnar", "pages.status.unlisted": "Útgefnar en ólistaðar",
"pagination.page": "Síða", "pagination.page": "Síða",
@@ -618,6 +617,8 @@
"stats.empty": "Engar skýrslur", "stats.empty": "Engar skýrslur",
"status": "Staða", "status": "Staða",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Efnismappan virðist vera berskjölduð", "system.issues.content": "Efnismappan virðist vera berskjölduð",
"system.issues.eol.kirby": "Uppsett Kirby eintak þitt hefur runnið sitt skeið á enda og mun ekki verða uppfært framar", "system.issues.eol.kirby": "Uppsett Kirby eintak þitt hefur runnið sitt skeið á enda og mun ekki verða uppfært framar",
"system.issues.eol.plugin": "Uppsett eintak þitt af viðbótinni { plugin } hefur runnið sitt skeið á enda og mun ekki verða uppfærð framar", "system.issues.eol.plugin": "Uppsett eintak þitt af viðbótinni { plugin } hefur runnið sitt skeið á enda og mun ekki verða uppfærð framar",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "È necessaria l'estensione <code>MB String</code>", "installation.issues.mbstring": "È necessaria l'estensione <code>MB String</code>",
"installation.issues.media": "La cartella <code>/media</code> non esiste o non dispone dei permessi di scrittura", "installation.issues.media": "La cartella <code>/media</code> non esiste o non dispone dei permessi di scrittura",
"installation.issues.php": "Assicurati di utilizzare <code>PHP 8+</code>", "installation.issues.php": "Assicurati di utilizzare <code>PHP 8+</code>",
"installation.issues.server": "Kirby necessita di <code>Apache</code>, <code>Nginx</code> o <code>Caddy</code>",
"installation.issues.sessions": "La cartella <code>/site/sessions</code>non esiste o non dispone dei permessi di scrittura", "installation.issues.sessions": "La cartella <code>/site/sessions</code>non esiste o non dispone dei permessi di scrittura",
"language": "Lingua", "language": "Lingua",
@@ -618,6 +617,8 @@
"stats.empty": "Nessuna segnalazione", "stats.empty": "Nessuna segnalazione",
"status": "Stato", "status": "Stato",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "La cartella content sembra essere esposta", "system.issues.content": "La cartella content sembra essere esposta",
"system.issues.eol.kirby": "La versione di Kirby installata è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza ", "system.issues.eol.kirby": "La versione di Kirby installata è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza ",
"system.issues.eol.plugin": "La versione installata del plugin { plugin } è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza", "system.issues.eol.plugin": "La versione installata del plugin { plugin } è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza",

View File

@@ -317,16 +317,16 @@
"field.blocks.quote.citation.placeholder": "출처", "field.blocks.quote.citation.placeholder": "출처",
"field.blocks.text.name": "텍스트", "field.blocks.text.name": "텍스트",
"field.blocks.text.placeholder": "텍스트", "field.blocks.text.placeholder": "텍스트",
"field.blocks.video.autoplay": "Autoplay", "field.blocks.video.autoplay": "자동 재생",
"field.blocks.video.caption": "캡션", "field.blocks.video.caption": "캡션",
"field.blocks.video.controls": "Controls", "field.blocks.video.controls": "제어 도구",
"field.blocks.video.location": "위치", "field.blocks.video.location": "위치",
"field.blocks.video.loop": "Loop", "field.blocks.video.loop": "반복",
"field.blocks.video.muted": "Muted", "field.blocks.video.muted": "음소거",
"field.blocks.video.name": "영상", "field.blocks.video.name": "영상",
"field.blocks.video.placeholder": "영상 URL 입력", "field.blocks.video.placeholder": "영상 URL 입력",
"field.blocks.video.poster": "Poster", "field.blocks.video.poster": "대표 이미지",
"field.blocks.video.preload": "Preload", "field.blocks.video.preload": "미리 로드",
"field.blocks.video.url.label": "영상 URL", "field.blocks.video.url.label": "영상 URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=", "field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -386,7 +386,6 @@
"installation.issues.mbstring": "<code>MB String</code> 확장 모듈이 필요합니다.", "installation.issues.mbstring": "<code>MB String</code> 확장 모듈이 필요합니다.",
"installation.issues.media": "<code>/media</code> 폴더의 쓰기 권한을 확인하세요.", "installation.issues.media": "<code>/media</code> 폴더의 쓰기 권한을 확인하세요.",
"installation.issues.php": "<code>PHP</code> 버전이 8 이상인지 확인하세요.", "installation.issues.php": "<code>PHP</code> 버전이 8 이상인지 확인하세요.",
"installation.issues.server": "Kirby를 실행하려면 <code>Apache</code>, <code>Nginx</code>, 또는 <code>Caddy</code>가 필요합니다.",
"installation.issues.sessions": "<code>/site/sessions</code> 폴더의 쓰기 권한을 확인하세요.", "installation.issues.sessions": "<code>/site/sessions</code> 폴더의 쓰기 권한을 확인하세요.",
"language": "\uc5b8\uc5b4", "language": "\uc5b8\uc5b4",
@@ -618,6 +617,8 @@
"stats.empty": "관련 기록이 없습니다.", "stats.empty": "관련 기록이 없습니다.",
"status": "상태", "status": "상태",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "<code>/content</code> 폴더의 권한을 확인하세요.", "system.issues.content": "<code>/content</code> 폴더의 권한을 확인하세요.",
"system.issues.eol.kirby": "설치된 Kirby 버전이 만료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.", "system.issues.eol.kirby": "설치된 Kirby 버전이 만료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.",
"system.issues.eol.plugin": "설치된 플러그인({plugin}의 지원이 종료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.", "system.issues.eol.plugin": "설치된 플러그인({plugin}의 지원이 종료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Plėtinys <code>MB String</code> yra privalomas", "installation.issues.mbstring": "Plėtinys <code>MB String</code> yra privalomas",
"installation.issues.media": "Katalogas <code>/media</code> neegzistuoja arba neturi įrašymo teisių", "installation.issues.media": "Katalogas <code>/media</code> neegzistuoja arba neturi įrašymo teisių",
"installation.issues.php": "Įsitikinkite, kad naudojama <code>PHP 8+</code>", "installation.issues.php": "Įsitikinkite, kad naudojama <code>PHP 8+</code>",
"installation.issues.server": "Kirby reikalauja <code>Apache</code>, <code>Nginx</code> arba <code>Caddy</code>",
"installation.issues.sessions": "Katalogas <code>/site/sessions</code> neegzistuoja arba neturi įrašymo teisių", "installation.issues.sessions": "Katalogas <code>/site/sessions</code> neegzistuoja arba neturi įrašymo teisių",
"language": "Kalba", "language": "Kalba",
@@ -618,6 +617,8 @@
"stats.empty": "Nėra pranešimų", "stats.empty": "Nėra pranešimų",
"status": "Statusas", "status": "Statusas",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Utvidelsen <code>MB String</code> er nødvendig", "installation.issues.mbstring": "Utvidelsen <code>MB String</code> er nødvendig",
"installation.issues.media": "Mappen <code>/media</code> eksisterer ikke eller er ikke skrivbar", "installation.issues.media": "Mappen <code>/media</code> eksisterer ikke eller er ikke skrivbar",
"installation.issues.php": "Pass på at du bruker <code>PHP 8+</code>", "installation.issues.php": "Pass på at du bruker <code>PHP 8+</code>",
"installation.issues.server": "Kirby krever <code>Apache</code>, <code>Nginx</code> eller <code>Caddy</code>",
"installation.issues.sessions": "Mappen <code>/site/sessions</code> eksisterer ikke eller er ikke skrivbar", "installation.issues.sessions": "Mappen <code>/site/sessions</code> eksisterer ikke eller er ikke skrivbar",
"language": "Spr\u00e5k", "language": "Spr\u00e5k",
@@ -618,6 +617,8 @@
"stats.empty": "Ingen rapporter", "stats.empty": "Ingen rapporter",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "content-mappen ser ut til å være eksponert", "system.issues.content": "content-mappen ser ut til å være eksponert",
"system.issues.eol.kirby": "Din installerte Kirby versjon har nådd sitt end-of-life, og vil ikke lenger motta sikkerhetsoppdateringer", "system.issues.eol.kirby": "Din installerte Kirby versjon har nådd sitt end-of-life, og vil ikke lenger motta sikkerhetsoppdateringer",
"system.issues.eol.plugin": "Din installerte plugin { plugin } har nådd sitt end-of-life og vil ikke lenger motta sikkerhetsoppdateringer", "system.issues.eol.plugin": "Din installerte plugin { plugin } har nådd sitt end-of-life og vil ikke lenger motta sikkerhetsoppdateringer",

View File

@@ -114,7 +114,7 @@
"error.file.minheight": "De hoogte van de afbeelding moet minimaal {height} pixels zijn", "error.file.minheight": "De hoogte van de afbeelding moet minimaal {height} pixels zijn",
"error.file.minsize": "Het bestand is te klein", "error.file.minsize": "Het bestand is te klein",
"error.file.minwidth": "De breedte van de afbeelding moet minimaal {width} pixels zijn", "error.file.minwidth": "De breedte van de afbeelding moet minimaal {width} pixels zijn",
"error.file.name.unique": "The filename must be unique", "error.file.name.unique": "De bestandsnaam moet uniek zijn",
"error.file.name.missing": "De bestandsnaam mag niet leeg zijn", "error.file.name.missing": "De bestandsnaam mag niet leeg zijn",
"error.file.notFound": "Het bestand kan niet worden gevonden", "error.file.notFound": "Het bestand kan niet worden gevonden",
"error.file.orientation": "De oriëntatie van de afbeelding moet \"{orientation}\" zijn", "error.file.orientation": "De oriëntatie van de afbeelding moet \"{orientation}\" zijn",
@@ -386,7 +386,6 @@
"installation.issues.mbstring": "De <code>MB String</code> extensie is verplicht", "installation.issues.mbstring": "De <code>MB String</code> extensie is verplicht",
"installation.issues.media": "De map <code>/media</code>bestaat niet of heeft geen schrijfrechten", "installation.issues.media": "De map <code>/media</code>bestaat niet of heeft geen schrijfrechten",
"installation.issues.php": "Gebruik <code>PHP8+</code>", "installation.issues.php": "Gebruik <code>PHP8+</code>",
"installation.issues.server": "Kirby vereist <code>Apache</code>, <code>Nginx</code> of <code>Caddy</code>",
"installation.issues.sessions": "De map <code>/site/sessions</code> bestaat niet of heeft geen schrijfrechten", "installation.issues.sessions": "De map <code>/site/sessions</code> bestaat niet of heeft geen schrijfrechten",
"language": "Taal", "language": "Taal",
@@ -618,6 +617,8 @@
"stats.empty": "Geen rapporten", "stats.empty": "Geen rapporten",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "De content map lijkt zichtbaar te zijn", "system.issues.content": "De content map lijkt zichtbaar te zijn",
"system.issues.eol.kirby": "De geïnstalleerde Kirby versie is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.", "system.issues.eol.kirby": "De geïnstalleerde Kirby versie is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.",
"system.issues.eol.plugin": "De geïnstalleerde versie van plugin { plugin } is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.", "system.issues.eol.plugin": "De geïnstalleerde versie van plugin { plugin } is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Wymagane jest rozszerzenie <code>MB String</code>", "installation.issues.mbstring": "Wymagane jest rozszerzenie <code>MB String</code>",
"installation.issues.media": "Folder <code>/media</code> nie istnieje lub nie ma uprawnień do zapisu", "installation.issues.media": "Folder <code>/media</code> nie istnieje lub nie ma uprawnień do zapisu",
"installation.issues.php": "Upewnij się, że używasz <code>PHP 8+</code>", "installation.issues.php": "Upewnij się, że używasz <code>PHP 8+</code>",
"installation.issues.server": "Kirby wymaga <code>Apache</code>, <code>Nginx</code> lub <code>Caddy</code>",
"installation.issues.sessions": "Folder <code>/site/sessions</code> nie istnieje lub nie ma uprawnień do zapisu", "installation.issues.sessions": "Folder <code>/site/sessions</code> nie istnieje lub nie ma uprawnień do zapisu",
"language": "J\u0119zyk", "language": "J\u0119zyk",
@@ -618,6 +617,8 @@
"stats.empty": "Brak raportów", "stats.empty": "Brak raportów",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Zdaje się, że folder „content” jest wystawiony na publiczny dostęp", "system.issues.content": "Zdaje się, że folder „content” jest wystawiony na publiczny dostęp",
"system.issues.eol.kirby": "Twoja zainstalowana wersja Kirby osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń", "system.issues.eol.kirby": "Twoja zainstalowana wersja Kirby osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń",
"system.issues.eol.plugin": "Twoja zainstalowana wersja wtyczki { plugin } osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń", "system.issues.eol.plugin": "Twoja zainstalowana wersja wtyczki { plugin } osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "A extensão <code>MB String</code> é necessária", "installation.issues.mbstring": "A extensão <code>MB String</code> é necessária",
"installation.issues.media": "A pasta <code>/media</code> não existe ou não possui permissão de escrita", "installation.issues.media": "A pasta <code>/media</code> não existe ou não possui permissão de escrita",
"installation.issues.php": "Certifique-se que você está usando o <code>PHP 8+</code>", "installation.issues.php": "Certifique-se que você está usando o <code>PHP 8+</code>",
"installation.issues.server": "Kirby necessita do <code>Apache</code>, <code>Nginx</code> ou <code>Caddy</code>",
"installation.issues.sessions": "A pasta <code>/site/sessions</code> não existe ou não possui permissão de escrita", "installation.issues.sessions": "A pasta <code>/site/sessions</code> não existe ou não possui permissão de escrita",
"language": "Idioma", "language": "Idioma",
@@ -618,6 +617,8 @@
"stats.empty": "Nenhum relatório", "stats.empty": "Nenhum relatório",
"status": "Estado", "status": "Estado",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "A pasta \"content\" parece não estar protegida", "system.issues.content": "A pasta \"content\" parece não estar protegida",
"system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", "system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",
"system.issues.eol.plugin": "A versão instalada do plugin {plugin} chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", "system.issues.eol.plugin": "A versão instalada do plugin {plugin} chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "A extensão <code>MB String</code> é necessária", "installation.issues.mbstring": "A extensão <code>MB String</code> é necessária",
"installation.issues.media": "A pasta <code>/media</code> não existe ou não tem permissão de escrita", "installation.issues.media": "A pasta <code>/media</code> não existe ou não tem permissão de escrita",
"installation.issues.php": "Certifique-se que está a usar o <code>PHP 8+</code>", "installation.issues.php": "Certifique-se que está a usar o <code>PHP 8+</code>",
"installation.issues.server": "O Kirby necessita do <code>Apache</code>, <code>Nginx</code> ou <code>Caddy</code>",
"installation.issues.sessions": "A pasta <code>/site/sessions</code> não existe ou não tem permissão de escrita", "installation.issues.sessions": "A pasta <code>/site/sessions</code> não existe ou não tem permissão de escrita",
"language": "Idioma", "language": "Idioma",
@@ -618,6 +617,8 @@
"stats.empty": "Sem relatórios", "stats.empty": "Sem relatórios",
"status": "Estado", "status": "Estado",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "A pasta content parece não estar protegida", "system.issues.content": "A pasta content parece não estar protegida",
"system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", "system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",
"system.issues.eol.plugin": "A versão instalada do plugin { plugin } chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança", "system.issues.eol.plugin": "A versão instalada do plugin { plugin } chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",

View File

@@ -3,7 +3,7 @@
"account.delete": "Șterge-ți contul", "account.delete": "Șterge-ți contul",
"account.delete.confirm": "Chiar vrei să îți ștergi contul? Vei fi deconectat imediat. Contul nu poate fi recuperat.", "account.delete.confirm": "Chiar vrei să îți ștergi contul? Vei fi deconectat imediat. Contul nu poate fi recuperat.",
"activate": "Activați", "activate": "Activează",
"add": "Adaug\u0103", "add": "Adaug\u0103",
"alpha": "Alfa", "alpha": "Alfa",
"author": "Autor", "author": "Autor",
@@ -20,7 +20,7 @@
"coordinates": "Coordonate", "coordinates": "Coordonate",
"copy": "Copiază", "copy": "Copiază",
"copy.all": "Copiază toate", "copy.all": "Copiază toate",
"copy.success": "copiat {count}!", "copy.success": "Copiat {count}!",
"create": "Creează", "create": "Creează",
"custom": "Personalizat", "custom": "Personalizat",
@@ -63,17 +63,17 @@
"email": "E-mail", "email": "E-mail",
"email.placeholder": "email@exemplu.com", "email.placeholder": "email@exemplu.com",
"enter": "Enter", "enter": "Introdu",
"entries": "Întregistrări", "entries": "Întregistrări",
"entry": "Înregistrare", "entry": "Înregistrare",
"environment": "Mediu", "environment": "Mediu",
"error": "Eroare", "error": "Eroare",
"error.access.code": "Cod invalid", "error.access.code": "Cod nevalid",
"error.access.login": "Conectare invalidă", "error.access.login": "Conectare nevalidă",
"error.access.panel": "Nu aveți voie să accesi panoul", "error.access.panel": "Nu ai voie să accesezi panoul",
"error.access.view": "Nu vi se permite să accesi această parte a panoului", "error.access.view": "Nu ai voie să accesezi această parte a panoului",
"error.avatar.create.fail": "Imaginea de profil nu a putut fi încărcată", "error.avatar.create.fail": "Imaginea de profil nu a putut fi încărcată",
"error.avatar.delete.fail": "Imaginea de profil nu a putut fi ștearsă", "error.avatar.delete.fail": "Imaginea de profil nu a putut fi ștearsă",
@@ -88,11 +88,11 @@
"error.blocks.min.singular": "Trebuie să adaugi cel puțin un bloc", "error.blocks.min.singular": "Trebuie să adaugi cel puțin un bloc",
"error.blocks.validation": "Există o eroare la câmpul \"{field}\" în blocul {index} care folosește tipul de bloc \"{fieldset}\"", "error.blocks.validation": "Există o eroare la câmpul \"{field}\" în blocul {index} care folosește tipul de bloc \"{fieldset}\"",
"error.cache.type.invalid": "Tipul de cache \"{type}\" este invalid", "error.cache.type.invalid": "Tipul de cache \"{type}\" este nevalid",
"error.email.preset.notFound": "Preset-ul de e-mail \"{name}\" nu a fost găsit", "error.email.preset.notFound": "Preset-ul de e-mail \"{name}\" nu a fost găsit",
"error.field.converter.invalid": "Convertorul \"{converter}\" invalid", "error.field.converter.invalid": "Convertorul \"{converter}\" nu este valid",
"error.field.type.missing": "Câmpul \"{ name }\": Tipul de câmp \"{ type }\" nu există", "error.field.type.missing": "Câmpul \"{ name }\": Tipul de câmp \"{ type }\" nu există",
"error.file.changeName.empty": "Numele nu trebuie să fie gol", "error.file.changeName.empty": "Numele nu trebuie să fie gol",
@@ -102,14 +102,14 @@
"error.file.duplicate": "Există deja un fișier cu numele \"{filename}\"", "error.file.duplicate": "Există deja un fișier cu numele \"{filename}\"",
"error.file.extension.forbidden": "Extensia de fișier \"{extension}\" nu este permisă", "error.file.extension.forbidden": "Extensia de fișier \"{extension}\" nu este permisă",
"error.file.extension.invalid": "Extensie de fișier invalidă: {extension}", "error.file.extension.invalid": "Extensie de fișier nevalidă: {extension}",
"error.file.extension.missing": "Extensia de fișier pentru \"{filename}\" lipsește", "error.file.extension.missing": "Extensia de fișier pentru \"{filename}\" lipsește",
"error.file.maxheight": "Înălțimea imaginii nu poate depăși {height} pixeli", "error.file.maxheight": "Înălțimea imaginii nu poate depăși {height} pixeli",
"error.file.maxsize": "Fișierul este prea mare", "error.file.maxsize": "Fișierul este prea mare",
"error.file.maxwidth": "Lățimea imaginii nu poate depăși {width} pixeli", "error.file.maxwidth": "Lățimea imaginii nu poate depăși {width} pixeli",
"error.file.mime.differs": "Fișierul încărcat trebuie să aibă același tip mime \"{mime}\"", "error.file.mime.differs": "Fișierul încărcat trebuie să aibă același tip mime \"{mime}\"",
"error.file.mime.forbidden": "Tipul media \"{mime}\" nu este permis", "error.file.mime.forbidden": "Tipul media \"{mime}\" nu este permis",
"error.file.mime.invalid": "Tip mime invalid: {mime}", "error.file.mime.invalid": "Tip mime nevalid: {mime}",
"error.file.mime.missing": "Tipul media pentru \"{filename}\" nu poate fi detectat", "error.file.mime.missing": "Tipul media pentru \"{filename}\" nu poate fi detectat",
"error.file.minheight": "Imaginea trebuie să aibă înălțimea de minim {height} pixeli", "error.file.minheight": "Imaginea trebuie să aibă înălțimea de minim {height} pixeli",
"error.file.minsize": "Fișierul este prea mic", "error.file.minsize": "Fișierul este prea mic",
@@ -118,8 +118,8 @@
"error.file.name.missing": "Numele fișierului nu poate fi gol", "error.file.name.missing": "Numele fișierului nu poate fi gol",
"error.file.notFound": "Fișierul \"{filename}\" nu a fost găsit", "error.file.notFound": "Fișierul \"{filename}\" nu a fost găsit",
"error.file.orientation": "Orientarea imaginii trebuie să fie \"{orientation}\"", "error.file.orientation": "Orientarea imaginii trebuie să fie \"{orientation}\"",
"error.file.type.forbidden": "Nu ai permisiunea să încarci fișiere {type}", "error.file.type.forbidden": "Nu ai voie să încarci fișiere {type}",
"error.file.type.invalid": "Tip invalid de fișier: {type}", "error.file.type.invalid": "Tip nevalid de fișier: {type}",
"error.file.undefined": "Fișierul nu a fost găsit", "error.file.undefined": "Fișierul nu a fost găsit",
"error.form.incomplete": "Te rog repară toate erorile din formular…", "error.form.incomplete": "Te rog repară toate erorile din formular…",
@@ -138,7 +138,7 @@
"error.license.format": "Te rog introdu un cod de licență valid", "error.license.format": "Te rog introdu un cod de licență valid",
"error.license.verification": "Licența nu a putut fi verificată", "error.license.verification": "Licența nu a putut fi verificată",
"error.login.totp.confirm.invalid": "Cod invalid", "error.login.totp.confirm.invalid": "Cod nevalid",
"error.login.totp.confirm.missing": "Vă rugăm să introduceți codul curent", "error.login.totp.confirm.missing": "Vă rugăm să introduceți codul curent",
"error.object.validation": "Există o eroare la câmpul \"{label}\":\n{message}", "error.object.validation": "Există o eroare la câmpul \"{label}\":\n{message}",
@@ -148,7 +148,7 @@
"error.page.changeSlug.permission": "Nu ai voie să schimbi apendicele URL pentru \"{slug}\"", "error.page.changeSlug.permission": "Nu ai voie să schimbi apendicele URL pentru \"{slug}\"",
"error.page.changeSlug.reserved": "Calea paginilor de la primul nivel nu poate să înceapă cu \"{path}\"", "error.page.changeSlug.reserved": "Calea paginilor de la primul nivel nu poate să înceapă cu \"{path}\"",
"error.page.changeStatus.incomplete": "Pagina are erori și nu poate fi publicată", "error.page.changeStatus.incomplete": "Pagina are erori și nu poate fi publicată",
"error.page.changeStatus.permission": "Statusul acestei pagini nu poate fi schimbat", "error.page.changeStatus.permission": "Starea acestei pagini nu poate fi schimbată",
"error.page.changeStatus.toDraft.invalid": "Pagina \"{slug}\" nu poate fi schimbată în ciornă", "error.page.changeStatus.toDraft.invalid": "Pagina \"{slug}\" nu poate fi schimbată în ciornă",
"error.page.changeTemplate.invalid": "Șablonul paginii \"{slug}\" nu poate fi schimbat", "error.page.changeTemplate.invalid": "Șablonul paginii \"{slug}\" nu poate fi schimbat",
"error.page.changeTemplate.permission": "Nu ai voie să schimbi șablonul pentru \"{slug}\"", "error.page.changeTemplate.permission": "Nu ai voie să schimbi șablonul pentru \"{slug}\"",
@@ -162,7 +162,7 @@
"error.page.draft.duplicate": "Există deja o ciornă cu apendicele URL \"{slug}\"", "error.page.draft.duplicate": "Există deja o ciornă cu apendicele URL \"{slug}\"",
"error.page.duplicate": "Există deja o pagină cu apendicele URL \"{slug}\"", "error.page.duplicate": "Există deja o pagină cu apendicele URL \"{slug}\"",
"error.page.duplicate.permission": "Nu ai voie să duplici \"{slug}\"", "error.page.duplicate.permission": "Nu ai voie să duplici \"{slug}\"",
"error.page.move.ancestor": "Pagina nu poate fi mutată în ea însăși.", "error.page.move.ancestor": "Pagina nu poate fi mutată în ea însăși",
"error.page.move.directory": "Directorul de pagini nu poate fi mutat", "error.page.move.directory": "Directorul de pagini nu poate fi mutat",
"error.page.move.duplicate": "Există deja o sub-pagină cu apendicele URL \"{slug}\"", "error.page.move.duplicate": "Există deja o sub-pagină cu apendicele URL \"{slug}\"",
"error.page.move.notFound": "Pagina mutată nu a fost găsită", "error.page.move.notFound": "Pagina mutată nu a fost găsită",
@@ -173,7 +173,7 @@
"error.page.slug.invalid": "Te rog introdu un apendice URL valid", "error.page.slug.invalid": "Te rog introdu un apendice URL valid",
"error.page.slug.maxlength": "Lungimea slug-ului nu poate depăși \"{length}\"", "error.page.slug.maxlength": "Lungimea slug-ului nu poate depăși \"{length}\"",
"error.page.sort.permission": "Pagina \"{slug}\" nu poate fi sortată", "error.page.sort.permission": "Pagina \"{slug}\" nu poate fi sortată",
"error.page.status.invalid": "Te rog stabilește un status valid pentru pagină", "error.page.status.invalid": "Te rog stabilește o stare validă pentru pagină",
"error.page.undefined": "Pagina nu a fost găsită", "error.page.undefined": "Pagina nu a fost găsită",
"error.page.update.permission": "Nu ai voie să actualizezi \"{slug}\"", "error.page.update.permission": "Nu ai voie să actualizezi \"{slug}\"",
@@ -274,7 +274,7 @@
"expand": "Extinde", "expand": "Extinde",
"expand.all": "Extinde toate", "expand.all": "Extinde toate",
"field.invalid": "Câmpul este invalid", "field.invalid": "Câmpul este nevalid",
"field.required": "Acest câmp este necesar", "field.required": "Acest câmp este necesar",
"field.blocks.changeType": "Schimbă tipul", "field.blocks.changeType": "Schimbă tipul",
"field.blocks.code.name": "Cod", "field.blocks.code.name": "Cod",
@@ -317,16 +317,16 @@
"field.blocks.quote.citation.placeholder": "de …", "field.blocks.quote.citation.placeholder": "de …",
"field.blocks.text.name": "Text", "field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …", "field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay", "field.blocks.video.autoplay": "Autoredare",
"field.blocks.video.caption": "Etichetă", "field.blocks.video.caption": "Etichetă",
"field.blocks.video.controls": "Controls", "field.blocks.video.controls": "Controale",
"field.blocks.video.location": "Localizare", "field.blocks.video.location": "Localizare",
"field.blocks.video.loop": "Loop", "field.blocks.video.loop": "În buclă",
"field.blocks.video.muted": "Muted", "field.blocks.video.muted": "Fără sonor",
"field.blocks.video.name": "Video", "field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Introdu URL-ul video-ului", "field.blocks.video.placeholder": "Introdu URL-ul video-ului",
"field.blocks.video.poster": "Poster", "field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload", "field.blocks.video.preload": "Preîncarcă",
"field.blocks.video.url.label": "URL-ul video-ului", "field.blocks.video.url.label": "URL-ul video-ului",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=", "field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Extensia <code>MB String</code> este necesară", "installation.issues.mbstring": "Extensia <code>MB String</code> este necesară",
"installation.issues.media": "Directorul <code>/media</code> nu există sau nu are permisiuni de scriere", "installation.issues.media": "Directorul <code>/media</code> nu există sau nu are permisiuni de scriere",
"installation.issues.php": "Asigură-te că folosești <code>PHP 8+</code>", "installation.issues.php": "Asigură-te că folosești <code>PHP 8+</code>",
"installation.issues.server": "Kirby are nevoie de <code>Apache</code>, <code>Nginx</code> sau <code>Caddy</code>",
"installation.issues.sessions": "Directorul <code>/site/sessions</code> folder nu există sau nu are permisiuni de scriere", "installation.issues.sessions": "Directorul <code>/site/sessions</code> folder nu există sau nu are permisiuni de scriere",
"language": "Limba", "language": "Limba",
@@ -537,9 +536,9 @@
"page.blueprint": "Această pagină nu are încă un Blueprint. Poți să-l definești în <strong>/site/blueprints/pages/{blueprint}.yml</strong>", "page.blueprint": "Această pagină nu are încă un Blueprint. Poți să-l definești în <strong>/site/blueprints/pages/{blueprint}.yml</strong>",
"page.changeSlug": "Schimbă URL-ul", "page.changeSlug": "Schimbă URL-ul",
"page.changeSlug.fromTitle": "Creează din titlu", "page.changeSlug.fromTitle": "Creează din titlu",
"page.changeStatus": "Schimbă statusul", "page.changeStatus": "Schimbă starea",
"page.changeStatus.position": "Te rog alege o poziție", "page.changeStatus.position": "Te rog alege o poziție",
"page.changeStatus.select": "Alege un status nou", "page.changeStatus.select": "Alege o stare nouă",
"page.changeTemplate": "Schimbă șablonul", "page.changeTemplate": "Schimbă șablonul",
"page.changeTemplate.notice": "Schimbarea șablonului paginii va înlătura conținutul câmpurilor care nu se potrivesc ca tip. Folosește cu prudență.", "page.changeTemplate.notice": "Schimbarea șablonului paginii va înlătura conținutul câmpurilor care nu se potrivesc ca tip. Folosește cu prudență.",
"page.create": "Creează ca {status}", "page.create": "Creează ca {status}",
@@ -551,7 +550,7 @@
"page.duplicate.pages": "Copiază paginile", "page.duplicate.pages": "Copiază paginile",
"page.move": "Mută pagina", "page.move": "Mută pagina",
"page.sort": "Schimbă poziția", "page.sort": "Schimbă poziția",
"page.status": "Status", "page.status": "Stare",
"page.status.draft": "Ciornă", "page.status.draft": "Ciornă",
"page.status.draft.description": "Pagina este în modul ciornă și va fi vizibilă doar editorilor conectați sau printr-un link secret", "page.status.draft.description": "Pagina este în modul ciornă și va fi vizibilă doar editorilor conectați sau printr-un link secret",
"page.status.listed": "Publică", "page.status.listed": "Publică",
@@ -600,7 +599,7 @@
"search.all": "Afișați toate {count} rezultatele", "search.all": "Afișați toate {count} rezultatele",
"search.results.none": "Niciun rezultat", "search.results.none": "Niciun rezultat",
"section.invalid": "Secțiunea este invalidă", "section.invalid": "Secțiunea este nevalidă",
"section.required": "Această secțiune este necesară", "section.required": "Această secțiune este necesară",
"security": "Securitate", "security": "Securitate",
@@ -616,8 +615,10 @@
"split": "Împarte", "split": "Împarte",
"stats.empty": "Niciun raport", "stats.empty": "Niciun raport",
"status": "Status", "status": "Stare",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Directorul de conținut pare să fie expus", "system.issues.content": "Directorul de conținut pare să fie expus",
"system.issues.eol.kirby": "Versiunea instalată de Kirby a ajuns la sfârșitul vieții utile și nu va mai primi actualizări de securitate.", "system.issues.eol.kirby": "Versiunea instalată de Kirby a ajuns la sfârșitul vieții utile și nu va mai primi actualizări de securitate.",
"system.issues.eol.plugin": "Versiunea instalată a plugin-ului { plugin } a ajuns la sfârșitul vieții utile și nu va mai primi actualizări de securitate.", "system.issues.eol.plugin": "Versiunea instalată a plugin-ului { plugin } a ajuns la sfârșitul vieții utile și nu va mai primi actualizări de securitate.",
@@ -629,7 +630,7 @@
"system.issues.site": "Directorul site pare să fie expus", "system.issues.site": "Directorul site pare să fie expus",
"system.issues.vulnerability.kirby": "Instalarea ta ar putea fi afectată de următoarea vulnerabilitate ({ severity } severity): { description }", "system.issues.vulnerability.kirby": "Instalarea ta ar putea fi afectată de următoarea vulnerabilitate ({ severity } severity): { description }",
"system.issues.vulnerability.plugin": "Instalarea ta ar putea fi afectată de următoarea vulnerabilitate în plugin-ul { plugin } ({ severity } severity): { description }", "system.issues.vulnerability.plugin": "Instalarea ta ar putea fi afectată de următoarea vulnerabilitate în plugin-ul { plugin } ({ severity } severity): { description }",
"system.updateStatus": "Status actualizare", "system.updateStatus": "Starea actualizării",
"system.updateStatus.error": "Nu am putut căuta actualizări", "system.updateStatus.error": "Nu am putut căuta actualizări",
"system.updateStatus.not-vulnerable": "Nicio vulnerabilitate cunoscută", "system.updateStatus.not-vulnerable": "Nicio vulnerabilitate cunoscută",
"system.updateStatus.security-update": "Actualizare gratuită de securitate { version } disponibilă", "system.updateStatus.security-update": "Actualizare gratuită de securitate { version } disponibilă",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Расширение <code>MB String</code> необходимо", "installation.issues.mbstring": "Расширение <code>MB String</code> необходимо",
"installation.issues.media": "Каталог <code>/media</code> не существует или нет прав записи", "installation.issues.media": "Каталог <code>/media</code> не существует или нет прав записи",
"installation.issues.php": "Убедитесь, что используется <code>PHP 8+</code>", "installation.issues.php": "Убедитесь, что используется <code>PHP 8+</code>",
"installation.issues.server": "Kirby требует <code>Apache</code>, <code>Nginx</code> или <code>Caddy</code> ",
"installation.issues.sessions": "Каталог <code>/site/sessions</code> не существует или нет прав записи", "installation.issues.sessions": "Каталог <code>/site/sessions</code> не существует или нет прав записи",
"language": "\u042f\u0437\u044b\u043a", "language": "\u042f\u0437\u044b\u043a",
@@ -618,6 +617,8 @@
"stats.empty": "Статистики нет", "stats.empty": "Статистики нет",
"status": "Статус", "status": "Статус",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Похоже, к папке content есть несанкционированный доступ", "system.issues.content": "Похоже, к папке content есть несанкционированный доступ",
"system.issues.eol.kirby": "Срок службы установленной вами версии Kirby истек, и она больше не будет получать обновления для системы безопасности", "system.issues.eol.kirby": "Срок службы установленной вами версии Kirby истек, и она больше не будет получать обновления для системы безопасности",
"system.issues.eol.plugin": "Срок службы установленной вами версии плагина { plugin } истек, и он не будет получать дальнейших обновлений для системы безопасности", "system.issues.eol.plugin": "Срок службы установленной вами версии плагина { plugin } истек, и он не будет получать дальнейших обновлений для системы безопасности",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "<code>MB String</code> rozšírenie je povinné", "installation.issues.mbstring": "<code>MB String</code> rozšírenie je povinné",
"installation.issues.media": "Priečinok <code>/media</code> neexistuje alebo nie je nastavený ako zapisovateľný", "installation.issues.media": "Priečinok <code>/media</code> neexistuje alebo nie je nastavený ako zapisovateľný",
"installation.issues.php": "Uistite sa, že používate <code>PHP 8+</code>", "installation.issues.php": "Uistite sa, že používate <code>PHP 8+</code>",
"installation.issues.server": "Kirby vyžaduje <code>Apache</code>, <code>Nginx</code> alebo <code>Caddy</code>",
"installation.issues.sessions": "Priečinok <code>/site/sessions</code> neexistuje alebo nie je nastavený ako zapisovateľný", "installation.issues.sessions": "Priečinok <code>/site/sessions</code> neexistuje alebo nie je nastavený ako zapisovateľný",
"language": "Jazyk", "language": "Jazyk",
@@ -618,6 +617,8 @@
"stats.empty": "No reports", "stats.empty": "No reports",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed", "system.issues.content": "The content folder seems to be exposed",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates", "system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates", "system.issues.eol.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",

View File

@@ -135,7 +135,7 @@
"error.license.domain": "Domänen för licensen saknas", "error.license.domain": "Domänen för licensen saknas",
"error.license.email": "Ange en giltig e-postadress", "error.license.email": "Ange en giltig e-postadress",
"error.license.format": "Please enter a valid license code", "error.license.format": "Ange en giltig licenskod",
"error.license.verification": "Licensen kunde inte verifieras", "error.license.verification": "Licensen kunde inte verifieras",
"error.login.totp.confirm.invalid": "Ogiltig kod", "error.login.totp.confirm.invalid": "Ogiltig kod",
@@ -317,16 +317,16 @@
"field.blocks.quote.citation.placeholder": "av …", "field.blocks.quote.citation.placeholder": "av …",
"field.blocks.text.name": "Text", "field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …", "field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay", "field.blocks.video.autoplay": "Autospela",
"field.blocks.video.caption": "Rubrik", "field.blocks.video.caption": "Rubrik",
"field.blocks.video.controls": "Controls", "field.blocks.video.controls": "Kontroller",
"field.blocks.video.location": "Plats", "field.blocks.video.location": "Plats",
"field.blocks.video.loop": "Loop", "field.blocks.video.loop": "Loopa",
"field.blocks.video.muted": "Muted", "field.blocks.video.muted": "Ljud av",
"field.blocks.video.name": "Video", "field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Ange en URL till en video", "field.blocks.video.placeholder": "Ange en URL till en video",
"field.blocks.video.poster": "Poster", "field.blocks.video.poster": "Stillbild",
"field.blocks.video.preload": "Preload", "field.blocks.video.preload": "Förladda",
"field.blocks.video.url.label": "Video-URL", "field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=", "field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -386,7 +386,6 @@
"installation.issues.mbstring": "Tillägget <code>MB String</code> krävs", "installation.issues.mbstring": "Tillägget <code>MB String</code> krävs",
"installation.issues.media": "Mappen <code>/media</code> finns inte eller är inte skrivbar", "installation.issues.media": "Mappen <code>/media</code> finns inte eller är inte skrivbar",
"installation.issues.php": "Se till att du använder <code>PHP 8+</code>", "installation.issues.php": "Se till att du använder <code>PHP 8+</code>",
"installation.issues.server": "Kirby kräver <code>Apache</code>, <code>Nginx</code> eller <code>Caddy</code>",
"installation.issues.sessions": "Mappen <code>/site/sessions</code> finns inte eller är inte skrivbar", "installation.issues.sessions": "Mappen <code>/site/sessions</code> finns inte eller är inte skrivbar",
"language": "Spr\u00e5k", "language": "Spr\u00e5k",
@@ -432,7 +431,7 @@
"license.code.label": "Ange din licenskod", "license.code.label": "Ange din licenskod",
"license.status.active.info": "Inkluderar nya större versioner fram till {date}", "license.status.active.info": "Inkluderar nya större versioner fram till {date}",
"license.status.active.label": "Giltig licens", "license.status.active.label": "Giltig licens",
"license.status.demo.info": "This is a demo installation", "license.status.demo.info": "Detta är en demoinstallation",
"license.status.demo.label": "Demo", "license.status.demo.label": "Demo",
"license.status.inactive.info": "Förnya licensen för att uppdatera till nyare större versioner", "license.status.inactive.info": "Förnya licensen för att uppdatera till nyare större versioner",
"license.status.inactive.label": "Inga nya större versioner", "license.status.inactive.label": "Inga nya större versioner",
@@ -618,6 +617,8 @@
"stats.empty": "Inga rapporter", "stats.empty": "Inga rapporter",
"status": "Status", "status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Mappen content verkar vara exponerad", "system.issues.content": "Mappen content verkar vara exponerad",
"system.issues.eol.kirby": "Din installerade Kirby-version har nått slutet av sin livscykel och kommer inte att få fler säkerhetsuppdateringar", "system.issues.eol.kirby": "Din installerade Kirby-version har nått slutet av sin livscykel och kommer inte att få fler säkerhetsuppdateringar",
"system.issues.eol.plugin": "Den installerade versionen av tillägget { plugin } har nått slutet på sin livscykel och kommer inte att få fler säkerhetsuppdateringar.", "system.issues.eol.plugin": "Den installerade versionen av tillägget { plugin } har nått slutet på sin livscykel och kommer inte att få fler säkerhetsuppdateringar.",

View File

@@ -386,7 +386,6 @@
"installation.issues.mbstring": "<code>MB String</code> eklentisi gerekli", "installation.issues.mbstring": "<code>MB String</code> eklentisi gerekli",
"installation.issues.media": "<code>/media</code> klasörü yok yada yazılamaz", "installation.issues.media": "<code>/media</code> klasörü yok yada yazılamaz",
"installation.issues.php": "<code>PHP 8+</code> kullandığınızdan emin olun. ", "installation.issues.php": "<code>PHP 8+</code> kullandığınızdan emin olun. ",
"installation.issues.server": "Kirby <code>Apache</code>, <code>Nginx</code> veya <code>Caddy</code> gerektirir",
"installation.issues.sessions": "<code>/site/sessions</code> klasörü mevcut değil veya yazılabilir değil", "installation.issues.sessions": "<code>/site/sessions</code> klasörü mevcut değil veya yazılabilir değil",
"language": "Dil", "language": "Dil",
@@ -618,6 +617,8 @@
"stats.empty": "Rapor yok", "stats.empty": "Rapor yok",
"status": "Durum", "status": "Durum",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "İçerik klasörü açığa çıkmış görünüyor", "system.issues.content": "İçerik klasörü açığa çıkmış görünüyor",
"system.issues.eol.kirby": "Yüklü Kirby sürümünüz kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak", "system.issues.eol.kirby": "Yüklü Kirby sürümünüz kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak",
"system.issues.eol.plugin": "{ plugin } eklentisinin yüklü sürümü kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak", "system.issues.eol.plugin": "{ plugin } eklentisinin yüklü sürümü kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak",

File diff suppressed because one or more lines are too long

View File

@@ -406,24 +406,16 @@
<path d="M10 6V8H5V19H16V14H18V20C18 20.5523 17.5523 21 17 21H4C3.44772 21 3 20.5523 3 20V7C3 6.44772 3.44772 6 4 6H10ZM21 3V11H19L18.9999 6.413L11.2071 14.2071L9.79289 12.7929L17.5849 5H13V3H21Z"/> <path d="M10 6V8H5V19H16V14H18V20C18 20.5523 17.5523 21 17 21H4C3.44772 21 3 20.5523 3 20V7C3 6.44772 3.44772 6 4 6H10ZM21 3V11H19L18.9999 6.413L11.2071 14.2071L9.79289 12.7929L17.5849 5H13V3H21Z"/>
</symbol> </symbol>
<symbol id="icon-order-alpha-asc" viewBox="0 0 24 24"> <symbol id="icon-order-alpha-asc" viewBox="0 0 24 24">
<path d="M 9.336546 1 L 12.936545 10 L 11.173365 10 L 10.190728 7.545454 L 6.844365 7.545454 L 5.863364 10 L 4.101 10 L 7.700182 1 Z M 8.518364 3.360619 L 7.498092 5.90909 L 9.537002 5.90909 Z"/> <path d="M4.86885 11H2.6665L6 3H8L11.3334 11H9.13113L8.7213 10H5.27869L4.86885 11ZM6.09836 8H7.90163L7 5.8L6.09836 8ZM18.9999 16V3H16.9999V16H13.9999L17.9999 21L21.9999 16H18.9999ZM10.9999 13H2.99992V15H7.85414L2.99992 19V21H10.9999V19H6.14605L10.9999 15V13Z" />
<path d="M 12 13 L 12 14.75 L 7.338525 20 L 12 20 L 12 21.75 L 5 21.75 L 5 20 L 9.6599 14.75 L 5 14.75 L 5 13 Z"/>
<path d="M 20 4 L 20 16 L 23 16 L 19 21 L 15 16 L 18 16 L 18 4 Z"/>
</symbol> </symbol>
<symbol id="icon-order-alpha-desc" viewBox="0 0 24 24"> <symbol id="icon-order-alpha-desc" viewBox="0 0 24 24">
<path d="M 9.336546 1 L 12.936545 10 L 11.173365 10 L 10.190728 7.545454 L 6.844365 7.545454 L 5.863364 10 L 4.101 10 L 7.700182 1 Z M 8.518364 3.360619 L 7.498092 5.90909 L 9.537002 5.90909 Z"/> <path d="M4.86885 11H2.6665L6 3H8L11.3334 11H9.13113L8.7213 10H5.27869L4.86885 11ZM6.09836 8H7.90163L7 5.8L6.09836 8ZM21.9999 8L17.9999 3L13.9999 8H16.9999V21H18.9999V8H21.9999ZM10.9999 13H2.99992V15H7.85414L2.99992 19V21H10.9999V19H6.14605L10.9999 15V13Z" />
<path d="M 12 13 L 12 14.75 L 7.338525 20 L 12 20 L 12 21.75 L 5 21.75 L 5 20 L 9.6599 14.75 L 5 14.75 L 5 13 Z"/>
<path d="M 19 3 L 23 8 L 20 8 L 20 20 L 18 20 L 18 8 L 15 8 Z"/>
</symbol> </symbol>
<symbol id="icon-order-num-asc" viewBox="0 0 24 24"> <symbol id="icon-order-num-asc" viewBox="0 0 24 24">
<path d="M 6.6224 22 L 8.7008 18.4 C 6.932719 18.4 5.5 16.967279 5.5 15.2 C 5.5 13.432719 6.932719 12 8.7 12 C 10.46728 12 11.9 13.432719 11.9 15.2 C 11.9 15.78912 11.7408 16.34104 11.46312 16.815121 L 8.4696 22 Z M 8.7 16.799999 C 9.583681 16.799999 10.3 16.083679 10.3 15.2 C 10.3 14.316319 9.583681 13.6 8.7 13.6 C 7.816319 13.6 7.1 14.316319 7.1 15.2 C 7.1 16.083679 7.816319 16.799999 8.7 16.799999 Z"/> <path d="M9.00054 3L9 11H7V5.41L5 5.9485V3.61978L7.31304 3H9.00054ZM19 3V16H22L18 21L14 16H17V3H19ZM11 15.5C11 16.0645 10.8441 16.5926 10.5729 17.0436L8.28871 21H5.97931L7.45156 18.45C6.05661 18.1923 5 16.9695 5 15.5C5 13.8431 6.34315 12.5 8 12.5C9.65685 12.5 11 13.8431 11 15.5ZM8 16.5C8.55228 16.5 9 16.0523 9 15.5C9 14.9477 8.55228 14.5 8 14.5C7.44772 14.5 7 14.9477 7 15.5C7 16.0523 7.44772 16.5 8 16.5Z" />
<path d="M 10 1 L 10 9.998876 L 8.500187 9.998876 L 8.499813 2.652794 L 7 3.054743 L 7 1.502438 L 8.87514 1 Z"/>
<path d="M 20 4 L 20 16 L 23 16 L 19 21 L 15 16 L 18 16 L 18 4 Z"/>
</symbol> </symbol>
<symbol id="icon-order-num-desc" viewBox="0 0 24 24"> <symbol id="icon-order-num-desc" viewBox="0 0 24 24">
<path d="M 6.6224 22 L 8.7008 18.4 C 6.932719 18.4 5.5 16.967279 5.5 15.2 C 5.5 13.432719 6.932719 12 8.7 12 C 10.46728 12 11.9 13.432719 11.9 15.2 C 11.9 15.78912 11.7408 16.34104 11.46312 16.815121 L 8.4696 22 Z M 8.7 16.799999 C 9.583681 16.799999 10.3 16.083679 10.3 15.2 C 10.3 14.316319 9.583681 13.6 8.7 13.6 C 7.816319 13.6 7.1 14.316319 7.1 15.2 C 7.1 16.083679 7.816319 16.799999 8.7 16.799999 Z"/> <path d="M9 11L9.00054 3H7.31304L5 3.61978V5.9485L7 5.41V11H9ZM22 8L18 3L14 8H17V21H19V8H22ZM8 16.5C7.44772 16.5 7 16.0523 7 15.5C7 14.9477 7.44772 14.5 8 14.5C8.55228 14.5 9 14.9477 9 15.5C9 16.0523 8.55228 16.5 8 16.5ZM10.5729 17.0436C10.8441 16.5926 11 16.0645 11 15.5C11 13.8431 9.65685 12.5 8 12.5C6.34315 12.5 5 13.8431 5 15.5C5 16.9695 6.05661 18.1923 7.45156 18.45L5.97931 21H8.28871L10.5729 17.0436Z" />
<path d="M 10 1 L 10 9.998876 L 8.500187 9.998876 L 8.499813 2.652794 L 7 3.054743 L 7 1.502438 L 8.87514 1 Z"/>
<path d="M 19 3 L 23 8 L 20 8 L 20 20 L 18 20 L 18 8 L 15 8 Z"/>
</symbol> </symbol>
<symbol id="icon-page" viewBox="0 0 24 24"> <symbol id="icon-page" viewBox="0 0 24 24">
<use href="#icon-document" /> <use href="#icon-document" />
@@ -578,6 +570,15 @@
</symbol> </symbol>
<symbol id="icon-text-right" viewBox="0 0 24 24"> <symbol id="icon-text-right" viewBox="0 0 24 24">
<path d="M3 4H21V6H3V4ZM7 19H21V21H7V19ZM3 14H21V16H3V14ZM7 9H21V11H7V9Z"/> <path d="M3 4H21V6H3V4ZM7 19H21V21H7V19ZM3 14H21V16H3V14ZM7 9H21V11H7V9Z"/>
</symbol>
<symbol id="icon-text-top" viewBox="0 0 24 24">
<path d="M3 3H21V5H3V3ZM8 11V21H6V11H3L7 7L11 11H8ZM18 11V21H16V11H13L17 7L21 11H18Z"/>
</symbol>
<symbol id="icon-text-middle" viewBox="0 0 24 24">
<path d="M3 11H21V13H3V11ZM18 18V21H16V18H13L17 14L21 18H18ZM8 18V21H6V18H3L7 14L11 18H8ZM18 6H21L17 10L13 6H16V3H18V6ZM8 6H11L7 10L3 6H6V3H8V6Z" />
</symbol>
<symbol id="icon-text-bottom" viewBox="0 0 24 24">
<path d="M3 19H21V21H3V19ZM8 13H11L7 17L3 13H6V3H8V13ZM18 13H21L17 17L13 13H16V3H18V13Z" />
</symbol> </symbol>
<symbol id="icon-ticket" viewBox="0 0 24 24"> <symbol id="icon-ticket" viewBox="0 0 24 24">
<path d="M2.00488 9.5V4C2.00488 3.44772 2.4526 3 3.00488 3H21.0049C21.5572 3 22.0049 3.44772 22.0049 4V9.5C20.6242 9.5 19.5049 10.6193 19.5049 12C19.5049 13.3807 20.6242 14.5 22.0049 14.5V20C22.0049 20.5523 21.5572 21 21.0049 21H3.00488C2.4526 21 2.00488 20.5523 2.00488 20V14.5C3.38559 14.5 4.50488 13.3807 4.50488 12C4.50488 10.6193 3.38559 9.5 2.00488 9.5ZM4.00488 7.96776C5.4866 8.70411 6.50488 10.2331 6.50488 12C6.50488 13.7669 5.4866 15.2959 4.00488 16.0322V19H20.0049V16.0322C18.5232 15.2959 17.5049 13.7669 17.5049 12C17.5049 10.2331 18.5232 8.70411 20.0049 7.96776V5H4.00488V7.96776ZM9.00488 9H15.0049V11H9.00488V9ZM9.00488 13H15.0049V15H9.00488V13Z"/> <path d="M2.00488 9.5V4C2.00488 3.44772 2.4526 3 3.00488 3H21.0049C21.5572 3 22.0049 3.44772 22.0049 4V9.5C20.6242 9.5 19.5049 10.6193 19.5049 12C19.5049 13.3807 20.6242 14.5 22.0049 14.5V20C22.0049 20.5523 21.5572 21 21.0049 21H3.00488C2.4526 21 2.00488 20.5523 2.00488 20V14.5C3.38559 14.5 4.50488 13.3807 4.50488 12C4.50488 10.6193 3.38559 9.5 2.00488 9.5ZM4.00488 7.96776C5.4866 8.70411 6.50488 10.2331 6.50488 12C6.50488 13.7669 5.4866 15.2959 4.00488 16.0322V19H20.0049V16.0322C18.5232 15.2959 17.5049 13.7669 17.5049 12C17.5049 10.2331 18.5232 8.70411 20.0049 7.96776V5H4.00488V7.96776ZM9.00488 9H15.0049V11H9.00488V9ZM9.00488 13H15.0049V15H9.00488V13Z"/>

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -1,7 +1 @@
function __vite__mapDeps(indexes) { import{D as t}from"./Docs.min.js";import{n as e}from"./index.min.js";import"./vendor.min.js";const n=e({props:{docs:Object},emits:["cancel"],computed:{options(){const t=[{icon:"expand",link:"lab/docs/"+this.docs.component}];return this.docs.github&&t.unshift({icon:"github",link:this.docs.github,target:"_blank"}),t}}},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-form-drawer",attrs:{options:t.options},on:{submit:function(e){return t.$emit("cancel")}}},"k-drawer",t.$attrs,!1),[e("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;const l=e({props:{code:{type:Boolean,default:!0},label:String,flex:Boolean},data:()=>({mode:"preview"}),computed:{component(){return window.UiExamples[this.label]}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-lab-example",attrs:{"data-flex":t.flex,tabindex:"0"}},[e("header",{staticClass:"k-lab-example-header"},[e("h3",{staticClass:"k-lab-example-label"},[t._v(t._s(t.label))]),t.code?e("k-button-group",{staticClass:"k-lab-example-inspector",attrs:{layout:"collapsed"}},[e("k-button",{attrs:{theme:"preview"===t.mode?"info":null,icon:"preview",size:"xs",title:"Preview"},on:{click:function(e){t.mode="preview"}}}),e("k-button",{attrs:{theme:"inspect"===t.mode?"info":null,icon:"code",size:"xs",title:"Vue code"},on:{click:function(e){t.mode="inspect"}}})],1):t._e()],1),"preview"===t.mode?e("div",{staticClass:"k-lab-example-canvas"},[t._t("default")],2):t._e(),"inspect"===t.mode?e("div",{staticClass:"k-lab-example-code"},[e("k-code",{attrs:{language:"html"}},[t._v(t._s(t.component))])],1):t._e()])}),[],!1,null,null,null,null).exports;const a=e({},(function(){return(0,this._self._c)("div",{staticClass:"k-lab-examples"},[this._t("default")],2)}),[],!1,null,null,null,null).exports;const o=e({methods:{submit(t){const e=Object.fromEntries(new FormData(t));this.$panel.dialog.open({component:"k-lab-output-dialog",props:{code:JSON.stringify(e,null,2)}})}}},(function(){var t=this,e=t._self._c;return e("form",{staticClass:"k-lab-form",on:{submit:function(e){return e.preventDefault(),t.submit(e.target)}}},[t._t("default"),e("footer",[e("k-button",{attrs:{type:"submit",icon:"check",theme:"positive",variant:"filled"}},[t._v(" Submit ")])],1)],2)}),[],!1,null,null,null,null).exports;const s=e({props:{code:String,language:{default:"js",type:String}},emits:["cancel"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({attrs:{size:"large","cancel-button":!1,"submit-button":!1},on:{cancel:function(e){return t.$emit("cancel")}}},"k-dialog",t.$attrs,!1),[e("k-code",{attrs:{language:t.language}},[t._v(t._s(t.code))])],1)}),[],!1,null,null,null,null).exports;const i=e({},(function(){var t=this._self._c;return t("div",{staticClass:"k-table"},[t("table",[t("tbody",[t("tr",[t("td",{staticClass:"k-table-cell",attrs:{"data-mobile":"true"}},[this._t("default")],2)])])])])}),[],!1,null,null,null,null).exports;Vue.component("k-lab-docs",t),Vue.component("k-lab-docs-drawer",n),Vue.component("k-lab-example",l),Vue.component("k-lab-examples",a),Vue.component("k-lab-form",o),Vue.component("k-lab-output-dialog",s),Vue.component("k-lab-table-cell",i);const r=e({props:{docs:String,examples:[Object,Array],file:String,github:String,props:[Object,Array],styles:String,tab:String,tabs:{type:Array,default:()=>[]},template:String,title:String},data:()=>({component:null}),watch:{tab:{handler(){this.createComponent()},immediate:!0}},mounted(){this.$panel.view.path.replace(/lab\//,"")},methods:{async createComponent(){if(!this.file)return;const{default:t}=await import(this.$panel.url(this.file)+"?cache="+Date.now());t.template=this.template,this.component={...t},window.UiExamples=this.examples},openDocs(){this.$panel.drawer.open(`lab/docs/${this.docs}`)},async reloadComponent(){await this.$panel.view.refresh(),this.createComponent()},reloadDocs(){this.$panel.drawer.isOpen&&this.$panel.drawer.refresh()}}},(function(){var t=this,e=t._self._c;return e("k-panel-inside",{staticClass:"k-lab-playground-view",attrs:{"data-has-tabs":t.tabs.length>1}},[e("k-header",{scopedSlots:t._u([{key:"buttons",fn:function(){return[t.docs||t.github?e("k-button-group",[t.docs?e("k-button",{attrs:{text:t.docs,icon:"book",size:"sm",variant:"filled"},on:{click:t.openDocs}}):t._e(),t.github?e("k-button",{attrs:{link:t.github,icon:"github",size:"sm",target:"_blank",variant:"filled"}}):t._e()],1):t._e()]},proxy:!0}])},[t._v(" "+t._s(t.title)+" ")]),e("k-tabs",{attrs:{tab:t.tab,tabs:t.tabs}}),t.component?e(t.component,t._b({tag:"component"},"component",t.props,!1)):t._e(),t.styles?e("style",{tag:"component",domProps:{innerHTML:t._s(t.styles)}}):t._e()],1)}),[],!1,null,null,null,null).exports;export{r as default};
if (!__vite__mapDeps.viteFileDeps) {
__vite__mapDeps.viteFileDeps = []
}
return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
}
import{n as t,_ as e}from"./index.min.js";import{D as n}from"./Docs.min.js";import"./vendor.min.js";const l=t({props:{docs:Object},emits:["cancel"],computed:{options(){const t=[{icon:"expand",link:"lab/docs/"+this.docs.component}];return this.docs.github&&t.unshift({icon:"github",link:this.docs.github,target:"_blank"}),t}}},(function(){var t=this,e=t._self._c;return e("k-drawer",t._b({ref:"drawer",staticClass:"k-form-drawer",attrs:{options:t.options},on:{submit:function(e){return t.$emit("cancel")}}},"k-drawer",t.$attrs,!1),[e("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;const a=t({props:{code:{type:Boolean,default:!0},label:String,flex:Boolean},data:()=>({mode:"preview"}),computed:{component(){return window.UiExamples[this.label]}}},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"k-lab-example",attrs:{"data-flex":t.flex,tabindex:"0"}},[e("header",{staticClass:"k-lab-example-header"},[e("h3",{staticClass:"k-lab-example-label"},[t._v(t._s(t.label))]),t.code?e("k-button-group",{staticClass:"k-lab-example-inspector",attrs:{layout:"collapsed"}},[e("k-button",{attrs:{theme:"preview"===t.mode?"info":null,icon:"preview",size:"xs",title:"Preview"},on:{click:function(e){t.mode="preview"}}}),e("k-button",{attrs:{theme:"inspect"===t.mode?"info":null,icon:"code",size:"xs",title:"Vue code"},on:{click:function(e){t.mode="inspect"}}})],1):t._e()],1),"preview"===t.mode?e("div",{staticClass:"k-lab-example-canvas"},[t._t("default")],2):t._e(),"inspect"===t.mode?e("div",{staticClass:"k-lab-example-code"},[e("k-code",{attrs:{language:"html"}},[t._v(t._s(t.component))])],1):t._e()])}),[],!1,null,null,null,null).exports;const o=t({},(function(){return(0,this._self._c)("div",{staticClass:"k-lab-examples"},[this._t("default")],2)}),[],!1,null,null,null,null).exports;const s=t({methods:{submit(t){const e=Object.fromEntries(new FormData(t));this.$panel.dialog.open({component:"k-lab-output-dialog",props:{code:JSON.stringify(e,null,2)}})}}},(function(){var t=this,e=t._self._c;return e("form",{staticClass:"k-lab-form",on:{submit:function(e){return e.preventDefault(),t.submit(e.target)}}},[t._t("default"),e("footer",[e("k-button",{attrs:{type:"submit",icon:"check",theme:"positive",variant:"filled"}},[t._v(" Submit ")])],1)],2)}),[],!1,null,null,null,null).exports;const i=t({props:{code:String,language:{default:"js",type:String}},emits:["cancel"]},(function(){var t=this,e=t._self._c;return e("k-dialog",t._b({attrs:{size:"large","cancel-button":!1,"submit-button":!1},on:{cancel:function(e){return t.$emit("cancel")}}},"k-dialog",t.$attrs,!1),[e("k-code",{attrs:{language:t.language}},[t._v(t._s(t.code))])],1)}),[],!1,null,null,null,null).exports;const r=t({},(function(){var t=this._self._c;return t("div",{staticClass:"k-table"},[t("table",[t("tbody",[t("tr",[t("td",{staticClass:"k-table-cell",attrs:{"data-mobile":"true"}},[this._t("default")],2)])])])])}),[],!1,null,null,null,null).exports;Vue.component("k-lab-docs",n),Vue.component("k-lab-docs-drawer",l),Vue.component("k-lab-example",a),Vue.component("k-lab-examples",o),Vue.component("k-lab-form",s),Vue.component("k-lab-output-dialog",i),Vue.component("k-lab-table-cell",r);const c=t({props:{docs:String,examples:[Object,Array],file:String,github:String,props:[Object,Array],styles:String,tab:String,tabs:{type:Array,default:()=>[]},template:String,title:String},data:()=>({component:null}),watch:{tab:{handler(){this.createComponent()},immediate:!0}},mounted(){this.$panel.view.path.replace(/lab\//,"")},methods:{async createComponent(){if(!this.file)return;const{default:t}=await e((()=>import(this.$panel.url(this.file)+"?cache="+Date.now())),__vite__mapDeps([]),import.meta.url);t.template=this.template,this.component={...t},window.UiExamples=this.examples},openDocs(){this.$panel.drawer.open(`lab/docs/${this.docs}`)},async reloadComponent(){await this.$panel.view.refresh(),this.createComponent()},reloadDocs(){this.$panel.drawer.isOpen&&this.$panel.drawer.refresh()}}},(function(){var t=this,e=t._self._c;return e("k-panel-inside",{staticClass:"k-lab-playground-view",attrs:{"data-has-tabs":t.tabs.length>1}},[e("k-header",{scopedSlots:t._u([{key:"buttons",fn:function(){return[t.docs||t.github?e("k-button-group",[t.docs?e("k-button",{attrs:{text:t.docs,icon:"book",size:"sm",variant:"filled"},on:{click:t.openDocs}}):t._e(),t.github?e("k-button",{attrs:{link:t.github,icon:"github",size:"sm",target:"_blank",variant:"filled"}}):t._e()],1):t._e()]},proxy:!0}])},[t._v(" "+t._s(t.title)+" ")]),e("k-tabs",{attrs:{tab:t.tab,tabs:t.tabs}}),t.component?e(t.component,t._b({tag:"component"},"component",t.props,!1)):t._e(),t.styles?e("style",{tag:"component",domProps:{innerHTML:t._s(t.styles)}}):t._e()],1)}),[],!1,null,null,null,null).exports;export{c as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,28 @@
import js from "@eslint/js";
import prettier from "eslint-config-prettier";
import vue from "eslint-plugin-vue";
export default [
js.configs.recommended,
...vue.configs["flat/vue2-recommended"],
prettier,
{
rules: {
"vue/attributes-order": "error",
"vue/component-definition-name-casing": "off",
"vue/html-closing-bracket-newline": [
"error",
{
singleline: "never",
multiline: "always"
}
],
"vue/multi-word-component-names": "off",
"vue/require-default-prop": "off",
"vue/require-prop-types": "error"
},
languageOptions: {
ecmaVersion: 2022
}
}
];

View File

@@ -1,11 +1,12 @@
<?php <?php
$uri = urldecode( // prepend a fake host to ensure that PHP can parse the path even if it contains weird stuff;
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) // afterwards just take the plain path back out from the parsed result
); $uri = parse_url('https://getkirby.com/' . ltrim($_SERVER['REQUEST_URI'], '/'), PHP_URL_PATH) ?? '/';
$uri = urldecode($uri);
// Emulate Apache's `mod_rewrite` functionality // Emulate Apache's `mod_rewrite` functionality
if ($uri !== '/' && file_exists($_SERVER['DOCUMENT_ROOT'] . '/' . $uri)) { if ($uri !== '/' && file_exists($_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($uri, '/'))) {
return false; return false;
} }

View File

@@ -59,7 +59,11 @@ class Model
isset($schema['type']) === true && isset($schema['type']) === true &&
$this->data instanceof $schema['type'] === false $this->data instanceof $schema['type'] === false
) { ) {
throw new Exception(sprintf('Invalid model type "%s" expected: "%s"', get_class($this->data), $schema['type'])); $class = match ($this->data) {
null => 'null',
default => get_class($this->data),
};
throw new Exception(sprintf('Invalid model type "%s" expected: "%s"', $class, $schema['type']));
} }
} }

View File

@@ -30,6 +30,7 @@ use Kirby\Toolkit\A;
use Kirby\Toolkit\Config; use Kirby\Toolkit\Config;
use Kirby\Toolkit\Controller; use Kirby\Toolkit\Controller;
use Kirby\Toolkit\LazyValue; use Kirby\Toolkit\LazyValue;
use Kirby\Toolkit\Locale;
use Kirby\Toolkit\Str; use Kirby\Toolkit\Str;
use Kirby\Uuid\Uuid; use Kirby\Uuid\Uuid;
use Throwable; use Throwable;
@@ -170,7 +171,7 @@ class App
'roots' => $this->roots(), 'roots' => $this->roots(),
'site' => $this->site(), 'site' => $this->site(),
'urls' => $this->urls(), 'urls' => $this->urls(),
'version' => $this->version(), 'version' => static::version(),
]; ];
} }
@@ -255,7 +256,7 @@ class App
foreach ($this->options as $key => $value) { foreach ($this->options as $key => $value) {
// detect option keys with the `vendor.plugin.option` format // detect option keys with the `vendor.plugin.option` format
if (preg_match('/^([a-z0-9-]+\.[a-z0-9-]+)\.(.*)$/i', $key, $matches) === 1) { if (preg_match('/^([a-z0-9-]+\.[a-z0-9-]+)\.(.*)$/i', $key, $matches) === 1) {
list(, $plugin, $option) = $matches; [, $plugin, $option] = $matches;
// verify that it's really a plugin option // verify that it's really a plugin option
if (isset(static::$plugins[str_replace('.', '/', $plugin)]) !== true) { if (isset(static::$plugins[str_replace('.', '/', $plugin)]) !== true) {
@@ -538,6 +539,14 @@ class App
return false; return false;
} }
/**
* Returns the current language, if set by `static::setCurrentLanguage`
*/
public function currentLanguage(): Language|null
{
return $this->language ??= $this->defaultLanguage();
}
/** /**
* Returns the default language object * Returns the default language object
*/ */
@@ -623,7 +632,7 @@ class App
return Uuid::for($path, $parent?->files())->model(); return Uuid::for($path, $parent?->files())->model();
} }
$parent = $parent ?? $this->site(); $parent ??= $this->site();
$id = dirname($path); $id = dirname($path);
$filename = basename($path); $filename = basename($path);
@@ -879,7 +888,8 @@ class App
} }
/** /**
* Returns the current language * Returns the language by code or shortcut (`default`, `current`).
* Passing `null` is an alias for passing `current`
*/ */
public function language(string $code = null): Language|null public function language(string $code = null): Language|null
{ {
@@ -887,19 +897,11 @@ class App
return null; return null;
} }
if ($code === 'default') { return match ($code ?? 'current') {
return $this->defaultLanguage(); 'default' => $this->defaultLanguage(),
} 'current' => $this->currentLanguage(),
default => $this->languages()->find($code)
// if requesting a non-default language, };
// find it but don't cache it
if ($code !== null) {
return $this->languages()->find($code);
}
// otherwise return language set by `AppTranslation::setCurrentLanguage`
// or default language
return $this->language ??= $this->defaultLanguage();
} }
/** /**
@@ -1141,7 +1143,7 @@ class App
return null; return null;
} }
$parent = $parent ?? $this->site(); $parent ??= $this->site();
if ($page = $parent->find($id)) { if ($page = $parent->find($id)) {
/** /**
@@ -1212,7 +1214,7 @@ class App
* @internal * @internal
* @throws \Kirby\Exception\NotFoundException if the home page cannot be found * @throws \Kirby\Exception\NotFoundException if the home page cannot be found
*/ */
public function resolve(string $path = null, string $language = null): mixed public function resolve(string|null $path = null, string|null $language = null): mixed
{ {
// set the current translation // set the current translation
$this->setCurrentTranslation($language); $this->setCurrentTranslation($language);
@@ -1410,6 +1412,30 @@ class App
); );
} }
/**
* Load and set the current language if it exists
* Otherwise fall back to the default language
*
* @internal
*/
public function setCurrentLanguage(
string|null $languageCode = null
): Language|null {
if ($this->multilang() === false) {
Locale::set($this->option('locale', 'en_US.utf-8'));
return $this->language = null;
}
$this->language = $this->language($languageCode) ?? $this->defaultLanguage();
Locale::set($this->language->locale());
// add language slug rules to Str class
Str::$language = $this->language->rules();
return $this->language;
}
/** /**
* Create your own set of languages * Create your own set of languages
* *

View File

@@ -713,17 +713,25 @@ trait AppPlugins
*/ */
public static function plugin( public static function plugin(
string $name, string $name,
array $extends = null array $extends = null,
array $info = [],
string|null $root = null,
string|null $version = null
): PLugin|null { ): PLugin|null {
if ($extends === null) { if ($extends === null) {
return static::$plugins[$name] ?? null; return static::$plugins[$name] ?? null;
} }
// get the correct root for the plugin $plugin = new Plugin(
$extends['root'] = $extends['root'] ?? dirname(debug_backtrace()[0]['file']); name: $name,
extends: $extends,
info: $info,
// TODO: Remove fallback to $extends in v7
root: $root ?? $extends['root'] ?? dirname(debug_backtrace()[0]['file']),
version: $version
);
$plugin = new Plugin($name, $extends); $name = $plugin->name();
$name = $plugin->name();
if (isset(static::$plugins[$name]) === true) { if (isset(static::$plugins[$name]) === true) {
throw new DuplicateException('The plugin "' . $name . '" has already been registered'); throw new DuplicateException('The plugin "' . $name . '" has already been registered');
@@ -792,7 +800,11 @@ trait AppPlugins
// register as anonymous plugin (without actual extensions) // register as anonymous plugin (without actual extensions)
// to be picked up by the Panel\Document class when // to be picked up by the Panel\Document class when
// rendering the Panel view // rendering the Panel view
static::plugin('plugins/' . $dirname, ['root' => $dir]); static::plugin(
name: 'plugins/' . $dirname,
extends: [],
root: $dir
);
} else { } else {
continue; continue;
} }

View File

@@ -3,7 +3,6 @@
namespace Kirby\Cms; namespace Kirby\Cms;
use Kirby\Toolkit\I18n; use Kirby\Toolkit\I18n;
use Kirby\Toolkit\Locale;
use Kirby\Toolkit\Str; use Kirby\Toolkit\Str;
/** /**
@@ -104,33 +103,6 @@ trait AppTranslations
return $this->option('panel.language', $defaultCode); return $this->option('panel.language', $defaultCode);
} }
/**
* Load and set the current language if it exists
* Otherwise fall back to the default language
*
* @internal
*/
public function setCurrentLanguage(
string $languageCode = null
): Language|null {
if ($this->multilang() === false) {
Locale::set($this->option('locale', 'en_US.utf-8'));
return $this->language = null;
}
$this->language = $this->language($languageCode);
$this->language ??= $this->defaultLanguage();
if ($this->language) {
Locale::set($this->language->locale());
}
// add language slug rules to Str class
Str::$language = $this->language->rules();
return $this->language;
}
/** /**
* Set the current translation * Set the current translation
* *
@@ -148,7 +120,7 @@ trait AppTranslations
*/ */
public function translation(string|null $locale = null): Translation public function translation(string|null $locale = null): Translation
{ {
$locale = $locale ?? I18n::locale(); $locale ??= I18n::locale();
$locale = basename($locale); $locale = basename($locale);
// prefer loading them from the translations collection // prefer loading them from the translations collection

View File

@@ -575,8 +575,8 @@ class Auth
} }
// ensure that the category arrays are defined // ensure that the category arrays are defined
$log['by-ip'] = $log['by-ip'] ?? []; $log['by-ip'] ??= [];
$log['by-email'] = $log['by-email'] ?? []; $log['by-email'] ??= [];
// remove all elements on the top level with different keys (old structure) // remove all elements on the top level with different keys (old structure)
$log = array_intersect_key($log, array_flip(['by-ip', 'by-email'])); $log = array_intersect_key($log, array_flip(['by-ip', 'by-email']));

View File

@@ -65,7 +65,7 @@ class Blueprint
unset($props['model']); unset($props['model']);
// extend the blueprint in general // extend the blueprint in general
$props = $this->extend($props); $props = static::extend($props);
// apply any blueprint preset // apply any blueprint preset
$props = $this->preset($props); $props = $this->preset($props);
@@ -652,7 +652,7 @@ class Blueprint
} }
// extend options if possible // extend options if possible
$options = $this->extend($options); $options = static::extend($options);
foreach ($options as $key => $value) { foreach ($options as $key => $value) {
$alias = $aliases[$key] ?? null; $alias = $aliases[$key] ?? null;
@@ -686,7 +686,7 @@ class Blueprint
} }
// inject all section extensions // inject all section extensions
$sectionProps = $this->extend($sectionProps); $sectionProps = static::extend($sectionProps);
$sections[$sectionName] = $sectionProps = [ $sections[$sectionName] = $sectionProps = [
...$sectionProps, ...$sectionProps,
@@ -699,14 +699,14 @@ class Blueprint
'name' => $sectionName, 'name' => $sectionName,
'label' => 'Invalid section type for section "' . $sectionName . '"', 'label' => 'Invalid section type for section "' . $sectionName . '"',
'type' => 'info', 'type' => 'info',
'text' => 'The following section types are available: ' . $this->helpList(array_keys(Section::$types)) 'text' => 'The following section types are available: ' . static::helpList(array_keys(Section::$types))
]; ];
} elseif (isset(Section::$types[$type]) === false) { } elseif (isset(Section::$types[$type]) === false) {
$sections[$sectionName] = [ $sections[$sectionName] = [
'name' => $sectionName, 'name' => $sectionName,
'label' => 'Invalid section type ("' . $type . '")', 'label' => 'Invalid section type ("' . $type . '")',
'type' => 'info', 'type' => 'info',
'text' => 'The following section types are available: ' . $this->helpList(array_keys(Section::$types)) 'text' => 'The following section types are available: ' . static::helpList(array_keys(Section::$types))
]; ];
} }
@@ -764,7 +764,7 @@ class Blueprint
} }
// inject all tab extensions // inject all tab extensions
$tabProps = $this->extend($tabProps); $tabProps = static::extend($tabProps);
// inject a preset if available // inject a preset if available
$tabProps = $this->preset($tabProps); $tabProps = $this->preset($tabProps);

View File

@@ -47,7 +47,9 @@ trait FileActions
string|null $extension = null string|null $extension = null
): static { ): static {
if ($sanitize === true) { if ($sanitize === true) {
$name = F::safeName($name); // sanitize the basename part only
// as the extension isn't included in $name
$name = F::safeBasename($name, false);
} }
// if no extension is passed, make sure to maintain current one // if no extension is passed, make sure to maintain current one
@@ -139,8 +141,8 @@ trait FileActions
// rename and/or resize the file if configured by new blueprint // rename and/or resize the file if configured by new blueprint
$create = $file->blueprint()->create(); $create = $file->blueprint()->create();
$file = $file->manipulate($create);
$file = $file->changeExtension($file, $create['format'] ?? null); $file = $file->changeExtension($file, $create['format'] ?? null);
$file->manipulate($create);
return $file; return $file;
}); });
@@ -266,7 +268,6 @@ trait FileActions
// we need to already rename it so that the correct file rules // we need to already rename it so that the correct file rules
// are applied // are applied
$create = $file->blueprint()->create(); $create = $file->blueprint()->create();
$file = $file->changeExtension($file, $create['format'] ?? null);
// run the hook // run the hook
$arguments = compact('file', 'upload'); $arguments = compact('file', 'upload');
@@ -284,6 +285,7 @@ trait FileActions
// resize the file on upload if configured // resize the file on upload if configured
$file = $file->manipulate($create); $file = $file->manipulate($create);
$file = $file->changeExtension($file, $create['format'] ?? null);
// store the content if necessary // store the content if necessary
// (always create files in the default language) // (always create files in the default language)
@@ -384,8 +386,8 @@ trait FileActions
// apply the resizing/crop options from the blueprint // apply the resizing/crop options from the blueprint
$create = $file->blueprint()->create(); $create = $file->blueprint()->create();
$file = $file->changeExtension($file, $create['format'] ?? null);
$file = $file->manipulate($create); $file = $file->manipulate($create);
$file = $file->changeExtension($file, $create['format'] ?? null);
// return a fresh clone // return a fresh clone
return $file->clone(); return $file->clone();

View File

@@ -50,7 +50,7 @@ class FileVersion
// content fields // content fields
if ($this->original() instanceof File) { if ($this->original() instanceof File) {
return $this->original()->content()->get($method, $arguments); return $this->original()->content()->get($method);
} }
} }

View File

@@ -29,14 +29,20 @@ class Helpers
* ``` * ```
*/ */
public static $deprecations = [ public static $deprecations = [
// The internal `$model->contentFile*()` methods have been deprecated
'model-content-file' => true,
// Passing an `info` array inside the `extends` array
// has been deprecated. Pass the individual entries (e.g. root, version)
// directly as named arguments.
// TODO: switch to true in v6
'plugin-extends-root' => false,
// Passing a single space as value to `Xml::attr()` has been // Passing a single space as value to `Xml::attr()` has been
// deprecated. In a future version, passing a single space won't // deprecated. In a future version, passing a single space won't
// render an empty value anymore but a single space. // render an empty value anymore but a single space.
// To render an empty value, please pass an empty string. // To render an empty value, please pass an empty string.
'xml-attr-single-space' => true, 'xml-attr-single-space' => true,
// The internal `$model->contentFile*()` methods have been deprecated
'model-content-file' => true,
]; ];
/** /**

View File

@@ -42,7 +42,7 @@ class LanguageRules
/** /**
* Validates if the language can be updated * Validates if the language can be updated
*/ */
public static function update(Language $language) public static function update(Language $language): void
{ {
static::validLanguageCode($language); static::validLanguageCode($language);
static::validLanguageName($language); static::validLanguageName($language);

View File

@@ -57,7 +57,12 @@ class Media
} }
// try to generate a thumb for the file // try to generate a thumb for the file
return static::thumb($model, $hash, $filename); try {
return static::thumb($model, $hash, $filename);
} catch (NotFoundException) {
// render the error page if there is no job for this filename
return false;
}
} }
/** /**

View File

@@ -46,7 +46,7 @@ abstract class ModelWithContent implements Identifiable
public static App $kirby; public static App $kirby;
protected Site|null $site; protected Site|null $site;
protected ContentStorage $storage; protected ContentStorage $storage;
public Collection|null $translations; public Collection|null $translations = null;
/** /**
* Store values used to initilaize object * Store values used to initilaize object

View File

@@ -22,7 +22,7 @@ class PagePicker extends Picker
// remove once our implementation is better // remove once our implementation is better
protected Pages|null $items = null; protected Pages|null $items = null;
protected Pages|null $itemsForQuery = null; protected Pages|null $itemsForQuery = null;
protected Page|Site|null $parent; protected Page|Site|null $parent = null;
/** /**
* Extends the basic defaults * Extends the basic defaults

View File

@@ -26,12 +26,6 @@ use Throwable;
class Plugin class Plugin
{ {
protected PluginAssets $assets; protected PluginAssets $assets;
protected array $extends;
protected string $name;
protected string $root;
// caches
protected array|null $info = null;
protected UpdateStatus|null $updateStatus = null; protected UpdateStatus|null $updateStatus = null;
/** /**
@@ -40,16 +34,44 @@ class Plugin
* *
* @throws \Kirby\Exception\InvalidArgumentException If the plugin name has an invalid format * @throws \Kirby\Exception\InvalidArgumentException If the plugin name has an invalid format
*/ */
public function __construct(string $name, array $extends = []) public function __construct(
{ protected string $name,
protected array $extends = [],
protected array $info = [],
protected string|null $root = null,
protected string|null $version = null,
) {
static::validateName($name); static::validateName($name);
$this->name = $name; // TODO: Remove in v7
$this->extends = $extends; if ($root = $extends['root'] ?? null) {
$this->root = $extends['root'] ?? dirname(debug_backtrace()[0]['file']); Helpers::deprecated('Plugin "' . $name . '": Passing the `root` inside the `extends` array has been deprecated. Pass it directly as named argument `root`.', 'plugin-extends-root');
$this->info = empty($extends['info']) === false && is_array($extends['info']) ? $extends['info'] : null; $this->root ??= $root;
unset($this->extends['root']);
}
unset($this->extends['root'], $this->extends['info']); $this->root ??= dirname(debug_backtrace()[0]['file']);
// TODO: Remove in v7
if ($info = $extends['info'] ?? null) {
Helpers::deprecated('Plugin "' . $name . '": Passing an `info` array inside the `extends` array has been deprecated. Pass the individual entries directly as named `info` argument.', 'plugin-extends-root');
if (empty($info) === false && is_array($info) === true) {
$this->info = [...$info, ...$this->info];
}
unset($this->extends['info']);
}
// read composer.json and use as info fallback
try {
$info = Data::read($this->manifest());
} catch (Exception) {
// there is no manifest file or it is invalid
$info = [];
}
$this->info = [...$info, ...$this->info];
} }
/** /**
@@ -117,22 +139,11 @@ class Plugin
} }
/** /**
* Returns the raw data from composer.json * Returns the info data (from composer.json)
*/ */
public function info(): array public function info(): array
{ {
if (is_array($this->info) === true) { return $this->info;
return $this->info;
}
try {
$info = Data::read($this->manifest());
} catch (Exception) {
// there is no manifest file or it is invalid
$info = [];
}
return $this->info = $info;
} }
/** /**
@@ -295,17 +306,20 @@ class Plugin
*/ */
public function version(): string|null public function version(): string|null
{ {
$composerName = $this->info()['name'] ?? null; $name = $this->info()['name'] ?? null;
$version = $this->info()['version'] ?? null;
try { try {
// if plugin doesn't have version key in composer.json file // try to get version from "vendor/composer/installed.php",
// try to get version from "vendor/composer/installed.php" // this is the most reliable source for the version
$version ??= InstalledVersions::getPrettyVersion($composerName); $version = InstalledVersions::getPrettyVersion($name);
} catch (Throwable) { } catch (Throwable) {
return null; $version = null;
} }
// fallback to the version provided in the plugin's index.php: as named
// argument, entry in the info array or from the composer.json file
$version ??= $this->version ?? $this->info()['version'] ?? null;
if ( if (
is_string($version) !== true || is_string($version) !== true ||
$version === '' || $version === '' ||

View File

@@ -162,6 +162,24 @@ class System
->toString(); ->toString();
} }
/**
* Returns an array with relevant system information
* used for debugging
* @since 4.3.0
*/
public function info(): array
{
return [
'kirby' => $this->app->version(),
'php' => phpversion(),
'server' => $this->serverSoftware(),
'license' => $this->license()->label(),
'languages' => $this->app->languages()->values(
fn ($lang) => $lang->code()
)
];
}
/** /**
* Create the most important folders * Create the most important folders
* if they don't exist yet * if they don't exist yet
@@ -379,32 +397,12 @@ class System
return true; return true;
} }
/**
* Check for a valid server environment
*/
public function server(): bool
{
return $this->serverSoftware() !== null;
}
/** /**
* Returns the detected server software * Returns the detected server software
*/ */
public function serverSoftware(): string|null public function serverSoftware(): string
{ {
$servers = $this->app->option('servers', [ return $this->app->environment()->get('SERVER_SOFTWARE', '');
'apache',
'caddy',
'litespeed',
'nginx',
'php'
]);
$software = $this->app->environment()->get('SERVER_SOFTWARE', '');
preg_match('!(' . implode('|', A::wrap($servers)) . ')!i', $software, $matches);
return $matches[0] ?? null;
} }
/** /**
@@ -421,14 +419,13 @@ class System
public function status(): array public function status(): array
{ {
return [ return [
'accounts' => $this->accounts(), 'accounts' => $this->accounts(),
'content' => $this->content(), 'content' => $this->content(),
'curl' => $this->curl(), 'curl' => $this->curl(),
'sessions' => $this->sessions(), 'sessions' => $this->sessions(),
'mbstring' => $this->mbstring(), 'mbstring' => $this->mbstring(),
'media' => $this->media(), 'media' => $this->media(),
'php' => $this->php(), 'php' => $this->php()
'server' => $this->server(),
]; ];
} }

View File

@@ -392,6 +392,46 @@ class UpdateStatus
}); });
} }
/**
* Finds the maximum possible major update
* that is included with the current license
*
* @return string|null Version number of the update or
* `null` if no free update is possible
*/
protected function findMaximumFreeUpdate(): string|null
{
// get the timestamp of included updates
$renewal = $this->app->system()->license()->renewal();
if ($renewal === null || $this->data === null) {
return null;
}
foreach ($this->data['versions'] ?? [] as $entry) {
$initialRelease = $entry['initialRelease'] ?? null;
$latest = $entry['latest'] ?? '';
// skip entries of irrelevant releases
if (
is_string($initialRelease) !== true ||
version_compare($latest, $this->currentVersion, '<=') === true
) {
continue;
}
$timestamp = strtotime($initialRelease);
// update is free if the initial release was before the
// license renewal date
if (is_int($timestamp) === true && $timestamp < $renewal) {
return $latest;
}
}
return null;
}
/** /**
* Finds the minimum possible security update * Finds the minimum possible security update
* to fix all known vulnerabilities * to fix all known vulnerabilities
@@ -655,7 +695,7 @@ class UpdateStatus
]; ];
} }
// check if free updates are possible from the current version // check if updates within the same major version are possible
$latest = $versionEntry['latest'] ?? null; $latest = $versionEntry['latest'] ?? null;
if (is_string($latest) === true && $latest !== $this->currentVersion) { if (is_string($latest) === true && $latest !== $this->currentVersion) {
return $this->targetData = [ return $this->targetData = [
@@ -665,6 +705,19 @@ class UpdateStatus
]; ];
} }
// check if the license includes updates to a newer major version
if ($version = $this->findMaximumFreeUpdate()) {
// extract the part before the first dot
// to find the major release page URL
preg_match('/^(\w+)\./', $version, $matches);
return $this->targetData = [
'status' => 'update',
'url' => $this->urlFor($matches[1] . '.0', 'changes'),
'version' => $version
];
}
// no free update is possible, but we are not on the latest version, // no free update is possible, but we are not on the latest version,
// so the overall latest version must be an upgrade // so the overall latest version must be an upgrade
return $this->targetData = [ return $this->targetData = [

View File

@@ -112,7 +112,7 @@ abstract class Sql
public function columnName(string $table, string $column, bool $enforceQualified = false): string|null public function columnName(string $table, string $column, bool $enforceQualified = false): string|null
{ {
// ensure we have clean $table and $column values without qualified identifiers // ensure we have clean $table and $column values without qualified identifiers
list($table, $column) = $this->splitIdentifier($table, $column); [$table, $column] = $this->splitIdentifier($table, $column);
// combine the identifiers again // combine the identifiers again
if ($this->database->validateColumn($table, $column) === true) { if ($this->database->validateColumn($table, $column) === true) {
@@ -624,7 +624,7 @@ abstract class Sql
$result = []; $result = [];
foreach ($columns as $column) { foreach ($columns as $column) {
list($table, $columnPart) = $this->splitIdentifier($table, $column); [$table, $columnPart] = $this->splitIdentifier($table, $column);
if ($this->validateColumn($table, $columnPart) === true) { if ($this->validateColumn($table, $columnPart) === true) {
$result[] = $this->combineIdentifier($table, $columnPart); $result[] = $this->combineIdentifier($table, $columnPart);

View File

@@ -580,7 +580,7 @@ class F
} }
// the math magic // the math magic
$size = round($size / pow(1024, ($unit = floor(log($size, 1024)))), 2); $size = round($size / 1024 ** ($unit = floor(log($size, 1024))), 2);
// format the number if requested // format the number if requested
if ($locale !== false) { if ($locale !== false) {
@@ -756,20 +756,32 @@ class F
* Sanitize a file's name (without extension) * Sanitize a file's name (without extension)
* @since 4.0.0 * @since 4.0.0
*/ */
public static function safeBasename(string $string): string public static function safeBasename(
{ string $string,
$name = static::name($string); bool $extract = true
return Str::slug($name, '-', 'a-z0-9@._-'); ): string {
// extract only the name part from whole filename string
if ($extract === true) {
$string = static::name($string);
}
return Str::slug($string, '-', 'a-z0-9@._-');
} }
/** /**
* Sanitize a file's extension * Sanitize a file's extension
* @since 4.0.0 * @since 4.0.0
*/ */
public static function safeExtension(string $string): string public static function safeExtension(
{ string $string,
$extension = static::extension($string); bool $extract = true
return Str::slug($extension); ): string {
// extract only the extension part from whole filename string
if ($extract === true) {
$string = static::extension($string);
}
return Str::slug($string);
} }
/** /**

View File

@@ -20,7 +20,7 @@ class Query
/** /**
* The Query data array * The Query data array
*/ */
protected array|null $data; protected array|null $data = null;
/** /**
* Creates a new Query object. * Creates a new Query object.

View File

@@ -59,13 +59,15 @@ class QrCode
* @param int|null $size Image width/height in pixels, defaults to a size per module of 4x4 * @param int|null $size Image width/height in pixels, defaults to a size per module of 4x4
* @param string $color Foreground color in hex format * @param string $color Foreground color in hex format
* @param string $back Background color in hex format * @param string $back Background color in hex format
* @param int $border Border size in number of modules
*/ */
public function toDataUri( public function toDataUri(
int|null $size = null, int|null $size = null,
string $color = '#000000', string $color = '#000000',
string $back = '#ffffff' string $back = '#ffffff',
int $border = 4
): string { ): string {
$image = $this->toImage($size, $color, $back); $image = $this->toImage($size, $color, $back, $border);
ob_start(); ob_start();
imagepng($image); imagepng($image);
@@ -82,14 +84,16 @@ class QrCode
* @param int|null $size Image width/height in pixels, defaults to a size per module of 4x4 * @param int|null $size Image width/height in pixels, defaults to a size per module of 4x4
* @param string $color Foreground color in hex format * @param string $color Foreground color in hex format
* @param string $back Background color in hex format * @param string $back Background color in hex format
* @param int $border Border size in number of modules
*/ */
public function toImage( public function toImage(
int|null $size = null, int|null $size = null,
string $color = '#000000', string $color = '#000000',
string $back = '#ffffff' string $back = '#ffffff',
int $border = 4
): GdImage { ): GdImage {
// get code and size measurements // get code and size measurements
$code = $this->encode(); $code = $this->encode($border);
[$width, $height] = $this->measure($code); [$width, $height] = $this->measure($code);
$size ??= ceil($width * 4); $size ??= ceil($width * 4);
$ws = $size / $width; $ws = $size / $width;
@@ -132,13 +136,15 @@ class QrCode
* @param int|string|null $size Optional CSS width of the `<svg>` element * @param int|string|null $size Optional CSS width of the `<svg>` element
* @param string $color Foreground color in hex format * @param string $color Foreground color in hex format
* @param string $back Background color in hex format * @param string $back Background color in hex format
* @param int $border Border size in number of modules
*/ */
public function toSvg( public function toSvg(
int|string|null $size = null, int|string|null $size = null,
string $color = '#000000', string $color = '#000000',
string $back = '#ffffff' string $back = '#ffffff',
int $border = 4
): string { ): string {
$code = $this->encode(); $code = $this->encode($border);
[$vbw, $vbh] = $this->measure($code); [$vbw, $vbh] = $this->measure($code);
$modules = $this->eachModuleGroup( $modules = $this->eachModuleGroup(
@@ -167,15 +173,17 @@ class QrCode
* @param int|string|null $size Optional image width/height in pixels (defaults to a size per module of 4x4) or CSS width of the `<svg>` element * @param int|string|null $size Optional image width/height in pixels (defaults to a size per module of 4x4) or CSS width of the `<svg>` element
* @param string $color Foreground color in hex format * @param string $color Foreground color in hex format
* @param string $back Background color in hex format * @param string $back Background color in hex format
* @param int $border Border size in number of modules
*/ */
public function write( public function write(
string $file, string $file,
int|string|null $size = null, int|string|null $size = null,
string $color = '#000000', string $color = '#000000',
string $back = '#ffffff' string $back = '#ffffff',
int $border = 4
): void { ): void {
$format = F::extension($file); $format = F::extension($file);
$args = [$size, $color, $back]; $args = [$size, $color, $back, $border];
match ($format) { match ($format) {
'gif' => imagegif($this->toImage(...$args), $file), 'gif' => imagegif($this->toImage(...$args), $file),
@@ -395,7 +403,7 @@ class QrCode
return $result; return $result;
} }
protected function encode(): array protected function encode(int $q = 4): array
{ {
[$data, $version, $ecl, $ec] = $this->encodeData(); [$data, $version, $ecl, $ec] = $this->encodeData();
$data = $this->encodeErrorCorrection($data, $ec, $version); $data = $this->encodeErrorCorrection($data, $ec, $version);
@@ -404,7 +412,7 @@ class QrCode
$mtx = $this->finalizeMatrix($mtx, $size, $ecl, $mask, $version); $mtx = $this->finalizeMatrix($mtx, $size, $ecl, $mask, $version);
return [ return [
'q' => [4, 4, 4, 4], 'q' => [$q, $q, $q, $q],
'size' => [$size, $size], 'size' => [$size, $size],
'bits' => $mtx 'bits' => $mtx
]; ];

View File

@@ -56,13 +56,11 @@ class Assets
*/ */
public function css(): array public function css(): array
{ {
$css = A::merge( $css = [
[ 'index' => $this->url . '/css/style.min.css',
'index' => $this->url . '/css/style.min.css', 'plugins' => $this->plugins->url('css'),
'plugins' => $this->plugins->url('css') ...$this->custom('panel.css')
], ];
$this->custom('panel.css')
);
// during dev mode we do not need to load // during dev mode we do not need to load
// the general stylesheet (as styling will be inlined) // the general stylesheet (as styling will be inlined)
@@ -201,8 +199,8 @@ class Assets
*/ */
public function icons(): string public function icons(): string
{ {
$dir = $this->kirby->root('panel') . '/'; $dir = $this->kirby->root('panel') . '/';
$dir .= $this->dev ? 'public' : 'dist'; $dir .= $this->dev ? 'public' : 'dist';
$icons = F::read($dir . '/img/icons.svg'); $icons = F::read($dir . '/img/icons.svg');
$icons = preg_replace('/<!--(.|\s)*?-->/', '', $icons); $icons = preg_replace('/<!--(.|\s)*?-->/', '', $icons);
return $icons; return $icons;
@@ -213,64 +211,55 @@ class Assets
*/ */
public function js(): array public function js(): array
{ {
$js = A::merge( $js = [
[ 'vue' => [
'vue' => [ 'nonce' => $this->nonce,
'nonce' => $this->nonce, 'src' => $this->url . '/js/vue.min.js'
'src' => $this->url . '/js/vue.min.js'
],
'vendor' => [
'nonce' => $this->nonce,
'src' => $this->url . '/js/vendor.min.js',
'type' => 'module'
],
'pluginloader' => [
'nonce' => $this->nonce,
'src' => $this->url . '/js/plugins.js',
'type' => 'module'
],
'plugins' => [
'nonce' => $this->nonce,
'src' => $this->plugins->url('js'),
'defer' => true
]
], ],
A::map($this->custom('panel.js'), fn ($src) => [ 'vendor' => [
'nonce' => $this->nonce,
'src' => $this->url . '/js/vendor.min.js',
'type' => 'module'
],
'pluginloader' => [
'nonce' => $this->nonce,
'src' => $this->url . '/js/plugins.js',
'type' => 'module'
],
'plugins' => [
'nonce' => $this->nonce,
'src' => $this->plugins->url('js'),
'defer' => true
],
...A::map($this->custom('panel.js'), fn ($src) => [
'nonce' => $this->nonce, 'nonce' => $this->nonce,
'src' => $src, 'src' => $src,
'type' => 'module' 'type' => 'module'
]), ]),
[ 'index' => [
'index' => [ 'nonce' => $this->nonce,
'nonce' => $this->nonce, 'src' => $this->url . '/js/index.min.js',
'src' => $this->url . '/js/index.min.js', 'type' => 'module'
'type' => 'module' ],
], ];
]
);
// during dev mode, add vite client and adapt // during dev mode, add vite client and adapt
// path to `index.js` - vendor does not need // path to `index.js` - vendor does not need
// to be loaded in dev mode // to be loaded in dev mode
if ($this->dev === true) { if ($this->dev === true) {
// load the non-minified index.js, remove vendor script and
// development version of Vue
$js['vendor']['src'] = null;
$js['index']['src'] = $this->url . '/src/index.js';
$js['vue']['src'] = $this->url . '/node_modules/vue/dist/vue.js';
// add vite dev client
$js['vite'] = [ $js['vite'] = [
'nonce' => $this->nonce, 'nonce' => $this->nonce,
'src' => $this->url . '/@vite/client', 'src' => $this->url . '/@vite/client',
'type' => 'module' 'type' => 'module'
]; ];
$js['index'] = [
'nonce' => $this->nonce,
'src' => $this->url . '/src/index.js',
'type' => 'module'
];
// load the development version of Vue
$js['vue']['src'] = $this->url . '/node_modules/vue/dist/vue.js';
// remove the vendor script
$js['vendor']['src'] = null;
} }
return array_filter($js, fn ($js) => empty($js['src']) === false); return array_filter($js, fn ($js) => empty($js['src']) === false);

View File

@@ -219,9 +219,11 @@ class Example
$tail = $matches[2][$key]; $tail = $matches[2][$key];
$code = $matches[3][$key]; $code = $matches[3][$key];
$scriptId = trim(preg_replace_callback('!script="(.*?)"!', function ($match) { $scriptId = trim(preg_replace_callback(
return trim($match[1]); '!script="(.*?)"!',
}, $tail)); fn ($match) => trim($match[1]),
$tail
));
$scriptBlock = $scripts[$scriptId] ?? null; $scriptBlock = $scripts[$scriptId] ?? null;

View File

@@ -218,7 +218,7 @@ class Sessions
* @internal * @internal
* @param \Kirby\Session\Session $session Session instance to push to the cache * @param \Kirby\Session\Session $session Session instance to push to the cache
*/ */
public function updateCache(Session $session) public function updateCache(Session $session): void
{ {
$this->cache[$session->token()] = $session; $this->cache[$session->token()] = $session;
} }

View File

@@ -177,7 +177,7 @@ class KirbyTag
} }
$pos = strpos($tag, ':'); $pos = strpos($tag, ':');
$type = trim(substr($tag, 0, $pos ? $pos : null)); $type = trim(substr($tag, 0, $pos ?: null));
$type = strtolower($type); $type = strtolower($type);
$attr = static::$types[$type]['attr'] ?? []; $attr = static::$types[$type]['attr'] ?? [];

View File

@@ -76,7 +76,7 @@ class Component
} }
$this->attrs = $attrs; $this->attrs = $attrs;
$this->options = $options = $this->setup($type); $this->options = $options = static::setup($type);
$this->methods = $methods = $options['methods'] ?? []; $this->methods = $methods = $options['methods'] ?? [];
foreach ($attrs as $attrName => $attrValue) { foreach ($attrs as $attrName => $attrValue) {

View File

@@ -464,7 +464,7 @@ class Dom
$namespaceUri = null; $namespaceUri = null;
$itemLocal = $item; $itemLocal = $item;
if (Str::contains($item, ':') === true) { if (Str::contains($item, ':') === true) {
list($namespaceName, $itemLocal) = explode(':', $item); [$namespaceName, $itemLocal] = explode(':', $item);
$namespaceUri = $allowedNamespaces[$namespaceName] ?? null; $namespaceUri = $allowedNamespaces[$namespaceName] ?? null;
} else { } else {
// list items without namespace are from the default namespace // list items without namespace are from the default namespace

View File

@@ -26,7 +26,7 @@ class Escape
/** /**
* The internal singleton escaper instance * The internal singleton escaper instance
*/ */
protected static Escaper|null $escaper; protected static Escaper|null $escaper = null;
/** /**
* Escape common HTML attributes data * Escape common HTML attributes data

View File

@@ -20,7 +20,7 @@ class Html extends Xml
/** /**
* An internal store for an HTML entities translation table * An internal store for an HTML entities translation table
*/ */
public static array|null $entities; public static array|null $entities = null;
/** /**
* List of HTML tags that can be used inline * List of HTML tags that can be used inline

View File

@@ -386,10 +386,13 @@ class Str
$encoded = ''; $encoded = '';
for ($i = 0; $i < static::length($string); $i++) { for ($i = 0; $i < static::length($string); $i++) {
$char = static::substr($string, $i, 1); $char = static::substr($string, $i, 1);
$char = mb_convert_encoding($char, 'UCS-4BE', 'UTF-8'); $char = mb_convert_encoding($char, 'UCS-4BE', 'UTF-8');
list(, $code) = unpack('N', $char); [, $code] = unpack('N', $char);
$encoded .= rand(1, 2) === 1 ? '&#' . $code . ';' : '&#x' . dechex($code) . ';'; $encoded .= match (random_int(1, 2)) {
1 => '&#' . $code . ';',
2 => '&#x' . dechex($code) . ';'
};
} }
return $encoded; return $encoded;

View File

@@ -26,7 +26,7 @@ class BlockUuid extends FieldUuid
/** /**
* @var \Kirby\Cms\Block|null * @var \Kirby\Cms\Block|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/** /**
* Converts content field to a Blocks collection * Converts content field to a Blocks collection

View File

@@ -47,7 +47,7 @@ abstract class FieldUuid extends Uuid
$parent = Uuid::for($value['parent'])->model(); $parent = Uuid::for($value['parent'])->model();
if ($field = $parent?->content()->get($value['field'])) { if ($field = $parent?->content()->get($value['field'])) {
return $this->fieldToCollection($field)->get($value['id']); return static::fieldToCollection($field)->get($value['id']);
} }
} }
} }

View File

@@ -22,7 +22,7 @@ class FileUuid extends ModelUuid
/** /**
* @var \Kirby\Cms\File|null * @var \Kirby\Cms\File|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/** /**
* Looks up UUID in cache and resolves to file object; * Looks up UUID in cache and resolves to file object;

View File

@@ -20,7 +20,7 @@ abstract class ModelUuid extends Uuid
/** /**
* @var \Kirby\Cms\ModelWithContent|null * @var \Kirby\Cms\ModelWithContent|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/** /**
* Looks up UUID in local and global index * Looks up UUID in local and global index

View File

@@ -23,7 +23,7 @@ class PageUuid extends ModelUuid
/** /**
* @var \Kirby\Cms\Page|null * @var \Kirby\Cms\Page|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/** /**
* Looks up UUID in cache and resolves * Looks up UUID in cache and resolves

View File

@@ -23,7 +23,7 @@ class SiteUuid extends Uuid
/** /**
* @var \Kirby\Cms\Site|null * @var \Kirby\Cms\Site|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/* /*
* Returns empty string since * Returns empty string since

View File

@@ -26,7 +26,7 @@ class StructureUuid extends FieldUuid
/** /**
* @var \Kirby\Cms\StructureObject|null * @var \Kirby\Cms\StructureObject|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/** /**
* Converts content field to a Structure collection * Converts content field to a Structure collection

View File

@@ -23,7 +23,7 @@ class UserUuid extends Uuid
/** /**
* @var \Kirby\Cms\User|null * @var \Kirby\Cms\User|null
*/ */
public Identifiable|null $model; public Identifiable|null $model = null;
/* /*
* Returns the user ID * Returns the user ID

5
kirby/vendor/bin/yaml-lint.bat vendored Normal file
View File

@@ -0,0 +1,5 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/yaml-lint
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
php "%BIN_TARGET%" %*

View File

@@ -116,15 +116,33 @@ class SimpleImage
*/ */
public function __destruct() public function __destruct()
{ {
if ($this->image instanceof GdImage) { $this->reset();
imagedestroy($this->image);
}
} }
////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////
// Helper functions // Helper functions
////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Checks if the SimpleImage object has loaded an image.
*/
public function hasImage(): bool
{
return $this->image instanceof GdImage;
}
/**
* Destroys the image resource.
*/
public function reset(): static
{
if ($this->hasImage()) {
imagedestroy($this->image);
}
return $this;
}
/** /**
* Set flag value. * Set flag value.
* *
@@ -313,7 +331,7 @@ class SimpleImage
* *
* @throws Exception Thrown when WEBP support is not enabled or unsupported format. * @throws Exception Thrown when WEBP support is not enabled or unsupported format.
*/ */
protected function generate(string $mimeType = null, array|int $options = []): array public function generate(string $mimeType = null, array|int $options = 100): array
{ {
// Format defaults to the original mime type // Format defaults to the original mime type
$mimeType = $mimeType ?: $this->mimeType; $mimeType = $mimeType ?: $this->mimeType;

View File

@@ -64,17 +64,17 @@
}, },
{ {
"name": "claviska/simpleimage", "name": "claviska/simpleimage",
"version": "4.1.0", "version": "4.2.0",
"version_normalized": "4.1.0.0", "version_normalized": "4.2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/claviska/SimpleImage.git", "url": "https://github.com/claviska/SimpleImage.git",
"reference": "1dcb9c785c44960890970d26e25c437a2a252bbf" "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/1dcb9c785c44960890970d26e25c437a2a252bbf", "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/dfbe53c01dae8467468ef2b817c09b786a7839d2",
"reference": "1dcb9c785c44960890970d26e25c437a2a252bbf", "reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -86,7 +86,7 @@
"laravel/pint": "^1.5", "laravel/pint": "^1.5",
"phpstan/phpstan": "^1.10" "phpstan/phpstan": "^1.10"
}, },
"time": "2024-03-04T15:41:11+00:00", "time": "2024-04-15T16:07:16+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -108,7 +108,7 @@
"description": "A PHP class that makes working with images as simple as possible.", "description": "A PHP class that makes working with images as simple as possible.",
"support": { "support": {
"issues": "https://github.com/claviska/SimpleImage/issues", "issues": "https://github.com/claviska/SimpleImage/issues",
"source": "https://github.com/claviska/SimpleImage/tree/4.1.0" "source": "https://github.com/claviska/SimpleImage/tree/4.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -651,27 +651,27 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.4.0", "version": "v3.5.0",
"version_normalized": "3.4.0.0", "version_normalized": "3.5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.1"
}, },
"time": "2023-05-23T14:45:45+00:00", "time": "2024-04-18T09:32:20+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@@ -701,7 +701,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
}, },
"funding": [ "funding": [
{ {
@@ -1057,17 +1057,17 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v6.4.3", "version": "v6.4.8",
"version_normalized": "6.4.3.0", "version_normalized": "6.4.8.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "d75715985f0f94f978e3a8fa42533e10db921b90" "reference": "52903de178d542850f6f341ba92995d3d63e60c9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9",
"reference": "d75715985f0f94f978e3a8fa42533e10db921b90", "reference": "52903de178d542850f6f341ba92995d3d63e60c9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1081,7 +1081,7 @@
"require-dev": { "require-dev": {
"symfony/console": "^5.4|^6.0|^7.0" "symfony/console": "^5.4|^6.0|^7.0"
}, },
"time": "2024-01-23T14:51:35+00:00", "time": "2024-05-31T14:49:08+00:00",
"bin": [ "bin": [
"Resources/bin/yaml-lint" "Resources/bin/yaml-lint"
], ],
@@ -1112,7 +1112,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v6.4.3" "source": "https://github.com/symfony/yaml/tree/v6.4.8"
}, },
"funding": [ "funding": [
{ {

View File

@@ -1,8 +1,8 @@
<?php return array( <?php return array(
'root' => array( 'root' => array(
'name' => 'getkirby/cms', 'name' => 'getkirby/cms',
'pretty_version' => '4.2.0', 'pretty_version' => '4.3.0',
'version' => '4.2.0.0', 'version' => '4.3.0.0',
'reference' => null, 'reference' => null,
'type' => 'kirby-cms', 'type' => 'kirby-cms',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
@@ -20,9 +20,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'claviska/simpleimage' => array( 'claviska/simpleimage' => array(
'pretty_version' => '4.1.0', 'pretty_version' => '4.2.0',
'version' => '4.1.0.0', 'version' => '4.2.0.0',
'reference' => '1dcb9c785c44960890970d26e25c437a2a252bbf', 'reference' => 'dfbe53c01dae8467468ef2b817c09b786a7839d2',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../claviska/simpleimage', 'install_path' => __DIR__ . '/../claviska/simpleimage',
'aliases' => array(), 'aliases' => array(),
@@ -47,8 +47,8 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'getkirby/cms' => array( 'getkirby/cms' => array(
'pretty_version' => '4.2.0', 'pretty_version' => '4.3.0',
'version' => '4.2.0.0', 'version' => '4.3.0.0',
'reference' => null, 'reference' => null,
'type' => 'kirby-cms', 'type' => 'kirby-cms',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
@@ -116,9 +116,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/deprecation-contracts' => array( 'symfony/deprecation-contracts' => array(
'pretty_version' => 'v3.4.0', 'pretty_version' => 'v3.5.0',
'version' => '3.4.0.0', 'version' => '3.5.0.0',
'reference' => '7c3aff79d10325257a001fcf92d991f24fc967cf', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(), 'aliases' => array(),
@@ -167,9 +167,9 @@
), ),
), ),
'symfony/yaml' => array( 'symfony/yaml' => array(
'pretty_version' => 'v6.4.3', 'pretty_version' => 'v6.4.8',
'version' => '6.4.3.0', 'version' => '6.4.8.0',
'reference' => 'd75715985f0f94f978e3a8fa42533e10db921b90', 'reference' => '52903de178d542850f6f341ba92995d3d63e60c9',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/yaml', 'install_path' => __DIR__ . '/../symfony/yaml',
'aliases' => array(), 'aliases' => array(),

View File

@@ -25,7 +25,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",

View File

@@ -638,12 +638,12 @@ class Parser
} }
if ($this->isCurrentLineBlank()) { if ($this->isCurrentLineBlank()) {
$data[] = substr($this->currentLine, $newIndent); $data[] = substr($this->currentLine, $newIndent ?? 0);
continue; continue;
} }
if ($indent >= $newIndent) { if ($indent >= $newIndent) {
$data[] = substr($this->currentLine, $newIndent); $data[] = substr($this->currentLine, $newIndent ?? 0);
} elseif ($this->isCurrentLineComment()) { } elseif ($this->isCurrentLineComment()) {
$data[] = $this->currentLine; $data[] = $this->currentLine;
} elseif (0 == $indent) { } elseif (0 == $indent) {