Update Composer packages

This commit is contained in:
Paul Nicoué 2023-04-14 16:30:28 +02:00
parent d482354bdf
commit e7e7361480
219 changed files with 6487 additions and 4444 deletions

View file

@ -12,11 +12,11 @@
],
"require": {
"php": ">=7.3.0 <8.1.0",
"getkirby/cms": "^3.5",
"amteich/kirby-twig": "^4.1",
"sylvainjule/matomo": "^1.0",
"kirbyzone/sitemapper": "^1.2",
"mullema/k3-image-clip": "^3.0"
"getkirby/cms": "^3.9.3",
"sylvainjule/matomo": "^1.0.7",
"kirbyzone/sitemapper": "^1.2.1",
"mullema/k3-image-clip": "^3.2",
"wearejust/kirby-twig": "^5.0"
},
"scripts": {
"start": [

234
composer.lock generated
View file

@ -4,71 +4,30 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "fac28f73cea5cec843631a10a9a4e395",
"content-hash": "1eea08bbd27b19165eede332e5e42d26",
"packages": [
{
"name": "amteich/kirby-twig",
"version": "4.2.0",
"source": {
"type": "git",
"url": "https://github.com/amteich/kirby-twig.git",
"reference": "7cdc1e5d78a19e8e395c1d3516fe90bf512c20fb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/amteich/kirby-twig/zipball/7cdc1e5d78a19e8e395c1d3516fe90bf512c20fb",
"reference": "7cdc1e5d78a19e8e395c1d3516fe90bf512c20fb",
"shasum": ""
},
"require": {
"getkirby/composer-installer": "^1.1",
"twig/twig": "^3.4"
},
"type": "kirby-plugin",
"autoload": {
"psr-4": {
"amteich\\Twig\\": "src/classes/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Zehetner",
"email": "christian@am-teich.com"
},
{
"name": "Florens Verschelde",
"email": "florens@fvsch.com"
}
],
"description": "Twig templating support for Kirby CMS",
"support": {
"issues": "https://github.com/amteich/kirby-twig/issues",
"source": "https://github.com/amteich/kirby-twig/tree/4.2.0"
},
"time": "2022-12-09T21:39:13+00:00"
},
{
"name": "claviska/simpleimage",
"version": "3.7.0",
"version": "4.0.2",
"source": {
"type": "git",
"url": "https://github.com/claviska/SimpleImage.git",
"reference": "abd15ced313c7b8041d7d73d8d2398b4f2510cf1"
"reference": "226d507cca0c8400d69bee7eb324158e3cbe246e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/abd15ced313c7b8041d7d73d8d2398b4f2510cf1",
"reference": "abd15ced313c7b8041d7d73d8d2398b4f2510cf1",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/226d507cca0c8400d69bee7eb324158e3cbe246e",
"reference": "226d507cca0c8400d69bee7eb324158e3cbe246e",
"shasum": ""
},
"require": {
"ext-gd": "*",
"league/color-extractor": "0.3.*",
"php": ">=5.6.0"
"league/color-extractor": "0.4.*",
"php": ">=8.0"
},
"require-dev": {
"laravel/pint": "^1.5",
"phpstan/phpstan": "^1.10"
},
"type": "library",
"autoload": {
@ -90,7 +49,7 @@
"description": "A PHP class that makes working with images as simple as possible.",
"support": {
"issues": "https://github.com/claviska/SimpleImage/issues",
"source": "https://github.com/claviska/SimpleImage/tree/3.7.0"
"source": "https://github.com/claviska/SimpleImage/tree/4.0.2"
},
"funding": [
{
@ -98,7 +57,7 @@
"type": "github"
}
],
"time": "2022-07-05T13:18:44+00:00"
"time": "2023-03-20T15:27:20+00:00"
},
{
"name": "composer/semver",
@ -183,16 +142,16 @@
},
{
"name": "filp/whoops",
"version": "2.14.6",
"version": "2.15.1",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
"reference": "f7948baaa0330277c729714910336383286305da"
"reference": "e864ac957acd66e1565f25efda61e37791a5db0b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da",
"reference": "f7948baaa0330277c729714910336383286305da",
"url": "https://api.github.com/repos/filp/whoops/zipball/e864ac957acd66e1565f25efda61e37791a5db0b",
"reference": "e864ac957acd66e1565f25efda61e37791a5db0b",
"shasum": ""
},
"require": {
@ -242,7 +201,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.14.6"
"source": "https://github.com/filp/whoops/tree/2.15.1"
},
"funding": [
{
@ -250,24 +209,24 @@
"type": "github"
}
],
"time": "2022-11-02T16:23:29+00:00"
"time": "2023-03-06T18:09:13+00:00"
},
{
"name": "getkirby/cms",
"version": "3.8.3",
"version": "3.9.3",
"source": {
"type": "git",
"url": "https://github.com/getkirby/kirby.git",
"reference": "41719bd54310dfc2e321a75a8549da98ccf5cd1d"
"reference": "ce4aaace87ceca1f019a9cfc0293a69e662f9648"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/getkirby/kirby/zipball/41719bd54310dfc2e321a75a8549da98ccf5cd1d",
"reference": "41719bd54310dfc2e321a75a8549da98ccf5cd1d",
"url": "https://api.github.com/repos/getkirby/kirby/zipball/ce4aaace87ceca1f019a9cfc0293a69e662f9648",
"reference": "ce4aaace87ceca1f019a9cfc0293a69e662f9648",
"shasum": ""
},
"require": {
"claviska/simpleimage": "3.7.0",
"claviska/simpleimage": "4.0.2",
"composer/semver": "3.3.2",
"ext-ctype": "*",
"ext-curl": "*",
@ -280,14 +239,14 @@
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-simplexml": "*",
"filp/whoops": "2.14.6",
"filp/whoops": "2.15.1",
"getkirby/composer-installer": "^1.2.1",
"laminas/laminas-escaper": "2.12.0",
"michelf/php-smartypants": "1.8.1",
"php": ">=8.0.0 <8.2.0",
"phpmailer/phpmailer": "6.6.5",
"symfony/polyfill-intl-idn": "1.26.0",
"symfony/polyfill-mbstring": "1.26.0"
"php": ">=8.0.0 <8.3.0",
"phpmailer/phpmailer": "6.8.0",
"symfony/polyfill-intl-idn": "1.27.0",
"symfony/polyfill-mbstring": "1.27.0"
},
"replace": {
"symfony/polyfill-php72": "*"
@ -350,7 +309,7 @@
"type": "custom"
}
],
"time": "2022-12-06T14:31:06+00:00"
"time": "2023-03-30T13:10:22+00:00"
},
{
"name": "getkirby/composer-installer",
@ -500,33 +459,36 @@
},
{
"name": "league/color-extractor",
"version": "0.3.2",
"version": "0.4.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/color-extractor.git",
"reference": "837086ec60f50c84c611c613963e4ad2e2aec806"
"reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/837086ec60f50c84c611c613963e4ad2e2aec806",
"reference": "837086ec60f50c84c611c613963e4ad2e2aec806",
"url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/21fcac6249c5ef7d00eb83e128743ee6678fe505",
"reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505",
"shasum": ""
},
"require": {
"ext-gd": "*",
"php": ">=5.4.0"
"php": "^7.3 || ^8.0"
},
"replace": {
"matthecat/colorextractor": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "~2",
"phpunit/phpunit": "~5"
"phpunit/phpunit": "^9.5"
},
"suggest": {
"ext-curl": "To download images from remote URLs if allow_url_fopen is disabled for security reasons"
},
"type": "library",
"autoload": {
"psr-4": {
"": "src"
"League\\ColorExtractor\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -552,9 +514,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/color-extractor/issues",
"source": "https://github.com/thephpleague/color-extractor/tree/master"
"source": "https://github.com/thephpleague/color-extractor/tree/0.4.0"
},
"time": "2016-12-15T09:30:02+00:00"
"time": "2022-09-24T15:57:16+00:00"
},
{
"name": "michelf/php-smartypants",
@ -654,16 +616,16 @@
},
{
"name": "phpmailer/phpmailer",
"version": "v6.6.5",
"version": "v6.8.0",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "8b6386d7417526d1ea4da9edb70b8352f7543627"
"reference": "df16b615e371d81fb79e506277faea67a1be18f1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/8b6386d7417526d1ea4da9edb70b8352f7543627",
"reference": "8b6386d7417526d1ea4da9edb70b8352f7543627",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/df16b615e371d81fb79e506277faea67a1be18f1",
"reference": "df16b615e371d81fb79e506277faea67a1be18f1",
"shasum": ""
},
"require": {
@ -673,17 +635,19 @@
"php": ">=5.5.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"doctrine/annotations": "^1.2",
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.2",
"doctrine/annotations": "^1.2.6 || ^1.13.3",
"php-parallel-lint/php-console-highlighter": "^1.0.0",
"php-parallel-lint/php-parallel-lint": "^1.3.2",
"phpcompatibility/php-compatibility": "^9.3.5",
"roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.6.2",
"yoast/phpunit-polyfills": "^1.0.0"
"squizlabs/php_codesniffer": "^3.7.1",
"yoast/phpunit-polyfills": "^1.0.4"
},
"suggest": {
"ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
"ext-openssl": "Needed for secure SMTP sending and DKIM signing",
"greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
"psr/log": "For optional PSR-3 debug logging",
@ -720,7 +684,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.5"
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.0"
},
"funding": [
{
@ -728,7 +692,7 @@
"type": "github"
}
],
"time": "2022-10-07T12:23:10+00:00"
"time": "2023-03-06T14:43:22+00:00"
},
{
"name": "psr/log",
@ -902,16 +866,16 @@
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8"
"reference": "639084e360537a19f9ee352433b84ce831f3d2da"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
"reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
"reference": "639084e360537a19f9ee352433b84ce831f3d2da",
"shasum": ""
},
"require": {
@ -925,7 +889,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -969,7 +933,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
},
"funding": [
{
@ -985,7 +949,7 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
@ -1073,16 +1037,16 @@
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": ""
},
"require": {
@ -1097,7 +1061,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1136,7 +1100,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@ -1152,20 +1116,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "twig/twig",
"version": "v3.4.3",
"version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58"
"reference": "a6e0510cc793912b451fd40ab983a1d28f611c15"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/c38fd6b0b7f370c198db91ffd02e23b517426b58",
"reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15",
"reference": "a6e0510cc793912b451fd40ab983a1d28f611c15",
"shasum": ""
},
"require": {
@ -1180,7 +1144,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.4-dev"
"dev-master": "3.5-dev"
}
},
"autoload": {
@ -1216,7 +1180,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.4.3"
"source": "https://github.com/twigphp/Twig/tree/v3.5.1"
},
"funding": [
{
@ -1228,7 +1192,55 @@
"type": "tidelift"
}
],
"time": "2022-09-28T08:42:51+00:00"
"time": "2023-02-08T07:49:20+00:00"
},
{
"name": "wearejust/kirby-twig",
"version": "5.0",
"source": {
"type": "git",
"url": "https://github.com/wearejust/kirby-twig.git",
"reference": "b8951bb5bdbeb829f492ee55709a2bdcc9d7475e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/wearejust/kirby-twig/zipball/b8951bb5bdbeb829f492ee55709a2bdcc9d7475e",
"reference": "b8951bb5bdbeb829f492ee55709a2bdcc9d7475e",
"shasum": ""
},
"require": {
"getkirby/composer-installer": "^1.1",
"twig/twig": "^3.4"
},
"type": "kirby-plugin",
"autoload": {
"psr-4": {
"Wearejust\\Kirby\\Twig\\": "src/classes/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Cees van Egmond",
"email": "cees.vanegmond@wearejust.com"
},
{
"name": "Sietse Veenman",
"email": "sietse.veenman@wearejust.com"
},
{
"name": "Duncan Pronk",
"email": "duncan.pronk@wearejust.com"
}
],
"description": "Twig templating support for Kirby CMS",
"support": {
"source": "https://github.com/wearejust/kirby-twig/tree/5.0"
},
"time": "2023-02-24T12:16:24+00:00"
}
],
"packages-dev": [],

View file

@ -20,7 +20,7 @@ We will review all pull requests (PRs) to `develop` and merge them if accepted,
### Report a bug
When you find a bug, the first step to fixing it is to help us understand and reproduce the bug as best as possible. When you create a bug report, please include as many details as possible. Fill out [the template](ISSUE_TEMPLATE/bug_report.md) because the requested information helps us resolve issues so much faster.
When you find a bug, the first step to fixing it is to help us understand and reproduce the bug as best as possible. When you create a bug report, please include as many details as possible. Fill out [the template](https://github.com/getkirby/kirby/issues/new?template=bug_report.md) because the requested information helps us resolve issues so much faster.
### Bug fixes

View file

@ -1,7 +1,7 @@
# Kirby License Agreement
Published: March 15, 2022
Source: https://getkirby.com/license/2022-03-15
Published: March 21, 2023
Source: https://getkirby.com/license/2023-03-21
## About this Agreement
@ -37,7 +37,7 @@ As Kirby is software and software is intangible, We don't sell it as such. Inste
The license is **non-exclusive** (meaning that You are not the only one who We will issue a license) and **generally non-transferable** (meaning that the one who purchases the license is the licensee).
On request, We will **transfer** a license to anyone who is also allowed to buy Kirby licenses by law and this Agreement.
On request, We will **transfer** a license to anyone who is also allowed to buy Kirby licenses by law and this Agreement. The new licensee will take over all rights and obligations of this Agreement from You at the moment We confirm the license transfer.
We will also **reassign** a license to another Website domain and root directory of Your choice, provided that You confirm that the previous Website is no longer in operation and will not be operated with the same license in the future.
@ -98,13 +98,18 @@ You may only use Kirby in a manner that complies with any and all **applicable l
### Making Copies
You may make **copies of Kirby** in any machine readable form solely for purposes of **deploying a Website to a server, developing a Website on a personal computer or server or as a backup**, provided that You reproduce Kirby in its original form and with all proprietary notices on the copy.
You may make **copies of Kirby** in any machine readable form solely for the **following purposes**, provided that You reproduce Kirby in its original form and with all proprietary notices on the copy:
- when deploying a Website to a server,
- when developing a Website on a personal computer or server,
- when working on code contributions to Kirby or
- as a backup.
You may _not_ reproduce Kirby or its Source Code, in whole or in part, for **any other purpose**.
### Modification of the Source Code
You may **alter, modify or extend the Source Code** for Your own use. You may also **commission a third party** to perform those modifications for You.
You may **alter, modify or extend the Source Code** for Your own use or with the intention to contribute Your changes back to Kirby. You may also **commission a third party** to perform those modifications for You.
However You may _not_:
@ -177,7 +182,13 @@ KIRBY IS OFFERED ON AN **"AS-IS" BASIS** AND **NO WARRANTY**, EITHER EXPRESSED O
## Term, Termination and Modification
You may use Kirby under this Agreement until either party terminates this Agreement as described in this paragraph. Either party may **terminate the Agreement** at any time, upon notice to the other party in textual form (via email or letter). Upon termination, all or the specified **licenses granted to You will terminate**, and You will **immediately uninstall and cease all use** of Kirby. If not all licenses are terminated, You may continue to use Kirby for the Websites with active licenses. The sections entitled "No Warranty", "Indemnification" and "Limitation of Liability" will **survive any termination** of this Agreement.
You may **indefinitely use** all Kirby versions that are covered by Your license under this Agreement until either party **terminates this Agreement** as described in this section.
**You** may terminate the Agreement at any time.
**We** may only terminate the Agreement if You or any individual or company who works with Kirby or uses it on Your behalf has violated or failed to comply with terms of this Agreement. If Your compliance with the Agreement can be restored by fixing the violation or non-compliance, We will first contact You with information on the specific term that was violated or not complied with and will allow reasonable time of at least 14 days before We will decide on a license termination. Should We be in the position to terminate a license according to this paragraph, other or all licenses granted to You may be terminated for the same reason(s) at the same time or at any later date.
Termination takes effect upon notice to the other party in textual form (via email or letter). Upon termination, the specified **licenses granted to You will terminate**, and You will **immediately uninstall and cease all use** of Kirby. If not all licenses are terminated, You may continue to use Kirby for the Websites with active licenses. The sections entitled "No Warranty", "Indemnification" and "Limitation of Liability" will **survive any termination** of this Agreement.
We may **modify Kirby and this Agreement** with notice to You either via email or by publishing content on the Kirby website at https://getkirby.com, including but not limited to changing the functionality or appearance of Kirby. Any such modification will **become binding on You** unless You terminate this Agreement. Changes to this Agreement that constrain Your rights to a great extent will only become effective with Your approval in textual or electronic form.

View file

@ -1,10 +1,9 @@
[<img src="http://getkirby.com/assets/images/github/kirby.jpg" width="300">](https://getkirby.com)
[<img src="https://getkirby.com/assets/images/github/kirby.jpg" width="300">](https://getkirby.com)
[![Release](https://badgen.net/github/release/getkirby/kirby/stable?color=yellow)](https://github.com/getkirby/kirby/releases/latest)
[![CI Status](https://github.com/getkirby/kirby/workflows/CI/badge.svg)](https://github.com/getkirby/kirby/actions?query=workflow%3ACI)
[![Coverage Status](https://badgen.net/codecov/c/gh/getkirby/kirby/main?label=coverage)](https://codecov.io/gh/getkirby/kirby)
[![Downloads](https://badgen.net/packagist/dt/getkirby/cms?color=red)](https://github.com/getkirby/kirby/releases/latest)
[![Twitter](https://badgen.net/twitter/follow/getkirby?color=cyan)](https://twitter.com/getkirby)
[![Release](https://img.shields.io/github/v/release/getkirby/kirby)](https://github.com/getkirby/kirby/releases/latest)
[![CI Status](https://img.shields.io/github/actions/workflow/status/getkirby/kirby/ci.yml?branch=main&label=CI)](https://github.com/getkirby/kirby/actions?query=workflow%3ACI+branch%3Amain)
[![Coverage Status](https://img.shields.io/codecov/c/gh/getkirby/kirby?token=ROZ2RVA0OF)](https://codecov.io/gh/getkirby/kirby)
[![Downloads](https://img.shields.io/packagist/dt/getkirby/cms?color=red)](https://github.com/getkirby/kirby/releases/latest)
**Kirby: the CMS that adapts to any project, loved by developers and editors alike.**
With Kirby, you build your own ideal interface. Combine forms, galleries, articles, spreadsheets and more into an amazing editing experience. You can learn more about Kirby at [getkirby.com](https://getkirby.com).
@ -14,7 +13,7 @@ This is Kirby's core application folder. Get started with one of the following r
- [Starterkit](https://github.com/getkirby/starterkit)
- [Plainkit](https://github.com/getkirby/plainkit)
<img src="http://getkirby.com/assets/images/github/kirby-screen.png" />
<img src="https://getkirby.com/assets/images/github/kirby-screen.png" />
### Try Kirby for free
Kirby is not free software. However, you can try Kirby and the Starterkit on your local machine or on a test server as long as you need to make sure it is the right tool for your next project. … and when youre convinced, [buy your license](https://getkirby.com/buy).
@ -30,8 +29,6 @@ If you have ideas for a feature or enhancement for Kirby, please use our [feedba
**Translations, bug fixes, code contributions ...**
Read about how to contribute to the development in our [contributing guide](/CONTRIBUTING.md).
## What's Kirby?
- **[getkirby.com](https://getkirby.com)** Get to know the CMS.
- **[Try it](https://getkirby.com/try)** Take a test ride with our online demo. Or download one of our kits to get started.
@ -40,10 +37,11 @@ Read about how to contribute to the development in our [contributing guide](/CON
- **[Feedback](https://feedback.getkirby.com)** You have an idea for Kirby? Share it.
- **[Forum](https://forum.getkirby.com)** Whenever you get stuck, don't hesitate to reach out for questions and support.
- **[Discord](https://chat.getkirby.com)** Hang out and meet the community.
- **[Twitter](https://twitter.com/getkirby)** Spread the word.
- **[YouTube](https://youtube.com/kirbyCasts)** - Watch the latest video tutorials visually with Bastian.
- **[Mastodon](https://mastodon.social/@getkirby)** Spread the word.
- **[Instagram](https://www.instagram.com/getkirby/)** Share your creations: #madewithkirby.
---
© 2009-2022 Bastian Allgeier
© 2009-2023 Bastian Allgeier
[getkirby.com](https://getkirby.com) · [License agreement](https://getkirby.com/license)

View file

@ -6,7 +6,7 @@
*/
if (
version_compare(PHP_VERSION, '8.0.0', '>=') === false ||
version_compare(PHP_VERSION, '8.2.0', '<') === false
version_compare(PHP_VERSION, '8.3.0', '<') === false
) {
die(include __DIR__ . '/views/php.php');
}

View file

@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Oct 11 03:12:05 2022 GMT
## Certificate data from Mozilla as of: Tue Jan 10 04:12:06 2023 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@ -14,7 +14,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 3ff8bd209b5f2e739b9f2b96eacb694a774114685b02978257824f37ff528f71
## SHA256: 90c470e705b4b5f36f09684dc50e2b79c8b86989a848b62cd1a7bd6460ee65f6
##
@ -489,29 +489,6 @@ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE-----
Network Solutions Certificate Authority
=======================================
-----BEGIN CERTIFICATE-----
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
-----END CERTIFICATE-----
COMODO ECC Certification Authority
==================================
-----BEGIN CERTIFICATE-----
@ -1654,36 +1631,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----
Staat der Nederlanden EV Root CA
================================
-----BEGIN CERTIFICATE-----
MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
-----END CERTIFICATE-----
IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
@ -2135,87 +2082,6 @@ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE-----
TrustCor RootCert CA-1
======================
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
-----END CERTIFICATE-----
TrustCor RootCert CA-2
======================
-----BEGIN CERTIFICATE-----
MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
-----END CERTIFICATE-----
TrustCor ECA-1
==============
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
-----END CERTIFICATE-----
SSL.com Root Certification Authority RSA
========================================
-----BEGIN CERTIFICATE-----

View file

@ -3,7 +3,7 @@
"description": "The Kirby 3 core",
"license": "proprietary",
"type": "kirby-cms",
"version": "3.8.3",
"version": "3.9.3",
"keywords": [
"kirby",
"cms",
@ -24,7 +24,7 @@
"source": "https://github.com/getkirby/kirby"
},
"require": {
"php": ">=8.0.0 <8.2.0",
"php": ">=8.0.0 <8.3.0",
"ext-SimpleXML": "*",
"ext-ctype": "*",
"ext-curl": "*",
@ -36,15 +36,15 @@
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"claviska/simpleimage": "3.7.0",
"claviska/simpleimage": "4.0.2",
"composer/semver": "3.3.2",
"filp/whoops": "2.14.6",
"filp/whoops": "2.15.1",
"getkirby/composer-installer": "^1.2.1",
"laminas/laminas-escaper": "2.12.0",
"michelf/php-smartypants": "1.8.1",
"phpmailer/phpmailer": "6.6.5",
"symfony/polyfill-intl-idn": "1.26.0",
"symfony/polyfill-mbstring": "1.26.0"
"phpmailer/phpmailer": "6.8.0",
"symfony/polyfill-intl-idn": "1.27.0",
"symfony/polyfill-mbstring": "1.27.0"
},
"replace": {
"symfony/polyfill-php72": "*"
@ -105,7 +105,8 @@
"@test"
],
"fix": "php-cs-fixer fix",
"test": "phpunit --stderr --coverage-html=tests/coverage",
"test": "phpunit --stderr",
"test:coverage": "phpunit --stderr --coverage-html=tests/coverage",
"zip": "composer archive --format=zip --file=dist"
}
}

107
kirby/composer.lock generated
View file

@ -4,26 +4,30 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "a2b48616382734757b5cf4a9bd73ccdb",
"content-hash": "b6d2cf1d95980cd8e5109f436f393339",
"packages": [
{
"name": "claviska/simpleimage",
"version": "3.7.0",
"version": "4.0.2",
"source": {
"type": "git",
"url": "https://github.com/claviska/SimpleImage.git",
"reference": "abd15ced313c7b8041d7d73d8d2398b4f2510cf1"
"reference": "226d507cca0c8400d69bee7eb324158e3cbe246e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/abd15ced313c7b8041d7d73d8d2398b4f2510cf1",
"reference": "abd15ced313c7b8041d7d73d8d2398b4f2510cf1",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/226d507cca0c8400d69bee7eb324158e3cbe246e",
"reference": "226d507cca0c8400d69bee7eb324158e3cbe246e",
"shasum": ""
},
"require": {
"ext-gd": "*",
"league/color-extractor": "0.3.*",
"php": ">=5.6.0"
"league/color-extractor": "0.4.*",
"php": ">=8.0"
},
"require-dev": {
"laravel/pint": "^1.5",
"phpstan/phpstan": "^1.10"
},
"type": "library",
"autoload": {
@ -45,7 +49,7 @@
"description": "A PHP class that makes working with images as simple as possible.",
"support": {
"issues": "https://github.com/claviska/SimpleImage/issues",
"source": "https://github.com/claviska/SimpleImage/tree/3.7.0"
"source": "https://github.com/claviska/SimpleImage/tree/4.0.2"
},
"funding": [
{
@ -53,7 +57,7 @@
"type": "github"
}
],
"time": "2022-07-05T13:18:44+00:00"
"time": "2023-03-20T15:27:20+00:00"
},
{
"name": "composer/semver",
@ -138,16 +142,16 @@
},
{
"name": "filp/whoops",
"version": "2.14.6",
"version": "2.15.1",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
"reference": "f7948baaa0330277c729714910336383286305da"
"reference": "e864ac957acd66e1565f25efda61e37791a5db0b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da",
"reference": "f7948baaa0330277c729714910336383286305da",
"url": "https://api.github.com/repos/filp/whoops/zipball/e864ac957acd66e1565f25efda61e37791a5db0b",
"reference": "e864ac957acd66e1565f25efda61e37791a5db0b",
"shasum": ""
},
"require": {
@ -197,7 +201,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.14.6"
"source": "https://github.com/filp/whoops/tree/2.15.1"
},
"funding": [
{
@ -205,7 +209,7 @@
"type": "github"
}
],
"time": "2022-11-02T16:23:29+00:00"
"time": "2023-03-06T18:09:13+00:00"
},
{
"name": "getkirby/composer-installer",
@ -318,33 +322,36 @@
},
{
"name": "league/color-extractor",
"version": "0.3.2",
"version": "0.4.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/color-extractor.git",
"reference": "837086ec60f50c84c611c613963e4ad2e2aec806"
"reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/837086ec60f50c84c611c613963e4ad2e2aec806",
"reference": "837086ec60f50c84c611c613963e4ad2e2aec806",
"url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/21fcac6249c5ef7d00eb83e128743ee6678fe505",
"reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505",
"shasum": ""
},
"require": {
"ext-gd": "*",
"php": ">=5.4.0"
"php": "^7.3 || ^8.0"
},
"replace": {
"matthecat/colorextractor": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "~2",
"phpunit/phpunit": "~5"
"phpunit/phpunit": "^9.5"
},
"suggest": {
"ext-curl": "To download images from remote URLs if allow_url_fopen is disabled for security reasons"
},
"type": "library",
"autoload": {
"psr-4": {
"": "src"
"League\\ColorExtractor\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -370,9 +377,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/color-extractor/issues",
"source": "https://github.com/thephpleague/color-extractor/tree/master"
"source": "https://github.com/thephpleague/color-extractor/tree/0.4.0"
},
"time": "2016-12-15T09:30:02+00:00"
"time": "2022-09-24T15:57:16+00:00"
},
{
"name": "michelf/php-smartypants",
@ -430,16 +437,16 @@
},
{
"name": "phpmailer/phpmailer",
"version": "v6.6.5",
"version": "v6.8.0",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "8b6386d7417526d1ea4da9edb70b8352f7543627"
"reference": "df16b615e371d81fb79e506277faea67a1be18f1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/8b6386d7417526d1ea4da9edb70b8352f7543627",
"reference": "8b6386d7417526d1ea4da9edb70b8352f7543627",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/df16b615e371d81fb79e506277faea67a1be18f1",
"reference": "df16b615e371d81fb79e506277faea67a1be18f1",
"shasum": ""
},
"require": {
@ -449,17 +456,19 @@
"php": ">=5.5.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"doctrine/annotations": "^1.2",
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.2",
"doctrine/annotations": "^1.2.6 || ^1.13.3",
"php-parallel-lint/php-console-highlighter": "^1.0.0",
"php-parallel-lint/php-parallel-lint": "^1.3.2",
"phpcompatibility/php-compatibility": "^9.3.5",
"roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.6.2",
"yoast/phpunit-polyfills": "^1.0.0"
"squizlabs/php_codesniffer": "^3.7.1",
"yoast/phpunit-polyfills": "^1.0.4"
},
"suggest": {
"ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
"ext-openssl": "Needed for secure SMTP sending and DKIM signing",
"greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
"psr/log": "For optional PSR-3 debug logging",
@ -496,7 +505,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.5"
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.0"
},
"funding": [
{
@ -504,7 +513,7 @@
"type": "github"
}
],
"time": "2022-10-07T12:23:10+00:00"
"time": "2023-03-06T14:43:22+00:00"
},
{
"name": "psr/log",
@ -558,16 +567,16 @@
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8"
"reference": "639084e360537a19f9ee352433b84ce831f3d2da"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
"reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
"reference": "639084e360537a19f9ee352433b84ce831f3d2da",
"shasum": ""
},
"require": {
@ -581,7 +590,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -625,7 +634,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
},
"funding": [
{
@ -641,7 +650,7 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
@ -729,16 +738,16 @@
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": ""
},
"require": {
@ -753,7 +762,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -792,7 +801,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@ -808,7 +817,7 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
}
],
"packages-dev": [],
@ -818,7 +827,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=8.0.0 <8.2.0",
"php": ">=8.0.0 <8.3.0",
"ext-simplexml": "*",
"ext-ctype": "*",
"ext-curl": "*",

View file

@ -53,6 +53,10 @@ return [
// panel classes
'panel' => 'Kirby\Panel\Panel',
// template classes
'snippet' => 'Kirby\Template\Snippet',
'slot' => 'Kirby\Template\Slot',
// toolkit classes
'a' => 'Kirby\Toolkit\A',
'c' => 'Kirby\Toolkit\Config',
@ -73,6 +77,7 @@ return [
'kirby\cms\form' => 'Kirby\Form\Form',
'kirby\cms\kirbytag' => 'Kirby\Text\KirbyTag',
'kirby\cms\kirbytags' => 'Kirby\Text\KirbyTags',
'kirby\cms\template' => 'Kirby\Template\Template',
'kirby\toolkit\dir' => 'Kirby\Filesystem\Dir',
'kirby\toolkit\f' => 'Kirby\Filesystem\F',
'kirby\toolkit\file' => 'Kirby\Filesystem\File',

View file

@ -35,8 +35,9 @@ return [
$code = $this->user()?->language() ??
$this->kirby()->panelLanguage();
return $this->kirby()->translation($code) ??
$this->kirby()->translation('en');
return
$this->kirby()->translation($code) ??
$this->kirby()->translation('en');
},
'kirbytext' => fn () => $this->kirby()->option('panel.kirbytext') ?? true,
'user' => fn () => $this->user(),

View file

@ -38,14 +38,17 @@ return [
// move_uploaded_file() not working with unit test
// @codeCoverageIgnoreStart
return $this->upload(function ($source, $filename) use ($path) {
return $this->parent($path)->createFile([
$props = [
'content' => [
'sort' => $this->requestBody('sort')
],
'source' => $source,
'template' => $this->requestBody('template'),
'filename' => $filename
]);
];
// move the source file from the temp dir
return $this->parent($path)->createFile($props, true);
});
// @codeCoverageIgnoreEnd
}
@ -95,8 +98,9 @@ return [
'pattern' => $pattern . '/files/(:any)',
'method' => 'POST',
'action' => function (string $path, string $filename) {
// move the source file from the temp dir
return $this->upload(
fn ($source) => $this->file($path, $filename)->replace($source)
fn ($source) => $this->file($path, $filename)->replace($source, true)
);
}
],

View file

@ -4,6 +4,9 @@
/**
* Content Lock Routes
*/
use Kirby\Exception\NotFoundException;
return [
[
'pattern' => '(:all)/lock',
@ -25,7 +28,11 @@ return [
'pattern' => '(:all)/lock',
'method' => 'DELETE',
'action' => function (string $path) {
return $this->parent($path)->lock()?->remove();
try {
return $this->parent($path)->lock()?->remove();
} catch (NotFoundException) {
return true;
}
}
],
[
@ -39,7 +46,11 @@ return [
'pattern' => '(:all)/unlock',
'method' => 'DELETE',
'action' => function (string $path) {
return $this->parent($path)->lock()?->resolve();
try {
return $this->parent($path)->lock()?->resolve();
} catch (NotFoundException) {
return true;
}
}
],
];

View file

@ -82,11 +82,16 @@ return [
$this->user($id)->avatar()?->delete();
return $this->upload(
fn ($source, $filename) => $this->user($id)->createFile([
'filename' => 'profile.' . F::extension($filename),
'template' => 'avatar',
'source' => $source
]),
function ($source, $filename) use ($id) {
$props = [
'filename' => 'profile.' . F::extension($filename),
'template' => 'avatar',
'source' => $source
];
// move the source file from the temp dir
return $this->user($id)->createFile($props, true);
},
single: true
);
}

View file

@ -44,10 +44,17 @@ return [
// license registration
'registration' => [
'load' => function () {
$system = App::instance()->system();
return [
'component' => 'k-form-dialog',
'props' => [
'fields' => [
'domain' => [
'type' => 'info',
'theme' => $system->isLocal() ? 'notice' : 'info',
'text' => I18n::template('license.register.' . ($system->isLocal() ? 'local' : 'domain'), ['host' => $system->indexUrl()])
],
'license' => [
'label' => I18n::translate('license.register.label'),
'type' => 'text',
@ -56,9 +63,7 @@ return [
'placeholder' => 'K3-',
'help' => I18n::translate('license.register.help')
],
'email' => Field::email([
'required' => true
])
'email' => Field::email(['required' => true])
],
'submitButton' => I18n::translate('license.register'),
'value' => [

View file

@ -5,7 +5,6 @@ use Kirby\Cms\Collection;
use Kirby\Cms\File;
use Kirby\Cms\FileVersion;
use Kirby\Cms\Page;
use Kirby\Cms\Template;
use Kirby\Cms\User;
use Kirby\Data\Data;
use Kirby\Email\PHPMailer as Emailer;
@ -14,11 +13,12 @@ use Kirby\Filesystem\Filename;
use Kirby\Http\Uri;
use Kirby\Http\Url;
use Kirby\Image\Darkroom;
use Kirby\Template\Snippet;
use Kirby\Template\Template;
use Kirby\Text\Markdown;
use Kirby\Text\SmartyPants;
use Kirby\Toolkit\A;
use Kirby\Toolkit\Str;
use Kirby\Toolkit\Tpl as Snippet;
return [
@ -142,6 +142,7 @@ return [
* @return \Kirby\Cms\Collection|bool
*/
'search' => function (App $kirby, Collection $collection, string $query = null, $params = []) {
// empty search query
if (empty(trim($query ?? '')) === true) {
return $collection->limit(0);
}
@ -159,28 +160,31 @@ return [
$options = array_merge($defaults, $params);
$collection = clone $collection;
$searchWords = preg_replace('/(\s)/u', ',', $query);
$searchWords = Str::split($searchWords, ',', $options['minlength']);
$lowerQuery = Str::lower($query);
$exactQuery = $options['words'] ? '(\b' . preg_quote($query) . '\b)' : preg_quote($query);
$words = preg_replace('/(\s)/u', ',', $query);
$words = Str::split($words, ',', $options['minlength']);
$exact = $options['words'] ? '(\b' . preg_quote($query) . '\b)' : preg_quote($query);
$query = Str::lower($query);
if (empty($options['stopwords']) === false) {
$searchWords = array_diff($searchWords, $options['stopwords']);
$words = array_diff($words, $options['stopwords']);
}
$searchWords = array_map(function ($value) use ($options) {
return $options['words'] ? '\b' . preg_quote($value) . '\b' : preg_quote($value);
}, $searchWords);
$words = A::map(
$words,
fn ($value) => $options['words'] ? '\b' . preg_quote($value) . '\b' : preg_quote($value)
);
// returns an empty collection if there is no search word
if (empty($searchWords) === true) {
if (empty($words) === true) {
return $collection->limit(0);
}
$preg = '!(' . implode('|', $searchWords) . ')!i';
$results = $collection->filter(function ($item) use ($query, $preg, $options, $lowerQuery, $exactQuery) {
$data = $item->content()->toArray();
$keys = array_keys($data);
$preg = '!(' . implode('|', $words) . ')!i';
$scores = [];
$results = $collection->filter(function ($item) use ($query, $exact, $preg, $options, &$scores) {
$data = $item->content()->toArray();
$keys = array_keys($data);
$keys[] = 'id';
if ($item instanceof User) {
@ -200,8 +204,10 @@ return [
$keys = array_intersect($keys, $fields);
}
$item->searchHits = 0;
$item->searchScore = 0;
$scoring = [
'hits' => 0,
'score' => 0
];
foreach ($keys as $key) {
$score = $options['score'][$key] ?? 1;
@ -210,32 +216,39 @@ return [
$lowerValue = Str::lower($value);
// check for exact matches
if ($lowerQuery == $lowerValue) {
$item->searchScore += 16 * $score;
$item->searchHits += 1;
if ($query == $lowerValue) {
$scoring['score'] += 16 * $score;
$scoring['hits'] += 1;
// check for exact beginning matches
} elseif ($options['words'] === false && Str::startsWith($lowerValue, $lowerQuery) === true) {
$item->searchScore += 8 * $score;
$item->searchHits += 1;
} elseif (
$options['words'] === false &&
Str::startsWith($lowerValue, $query) === true
) {
$scoring['score'] += 8 * $score;
$scoring['hits'] += 1;
// check for exact query matches
} elseif ($matches = preg_match_all('!' . $exactQuery . '!i', $value, $r)) {
$item->searchScore += 2 * $score;
$item->searchHits += $matches;
} elseif ($matches = preg_match_all('!' . $exact . '!i', $value, $r)) {
$scoring['score'] += 2 * $score;
$scoring['hits'] += $matches;
}
// check for any match
if ($matches = preg_match_all($preg, $value, $r)) {
$item->searchHits += $matches;
$item->searchScore += $matches * $score;
$scoring['score'] += $matches * $score;
$scoring['hits'] += $matches;
}
}
return $item->searchHits > 0;
$scores[$item->id()] = $scoring;
return $scoring['hits'] > 0;
});
return $results->sort('searchScore', 'desc');
return $results->sort(
fn ($item) => $scores[$item->id()]['score'],
'desc'
);
},
/**
@ -267,23 +280,8 @@ return [
* @param string|array $name Snippet name
* @param array $data Data array for the snippet
*/
'snippet' => function (App $kirby, $name, array $data = []): string {
$snippets = A::wrap($name);
foreach ($snippets as $name) {
$name = (string)$name;
$file = $kirby->root('snippets') . '/' . $name . '.php';
if (file_exists($file) === false) {
$file = $kirby->extensions('snippets')[$name] ?? null;
}
if ($file) {
break;
}
}
return Snippet::load($file, $data);
'snippet' => function (App $kirby, string|array|null $name, array $data = [], bool $slots = false): Snippet|string {
return Snippet::factory($name, $data, $slots);
},
/**
@ -293,7 +291,7 @@ return [
* @param string $name Template name
* @param string $type Extension type
* @param string $defaultType Default extension type
* @return \Kirby\Cms\Template
* @return \Kirby\Template\Template
*/
'template' => function (App $kirby, string $name, string $type = 'html', string $defaultType = 'html') {
return new Template($name, $type, $defaultType);

View file

@ -56,11 +56,14 @@ return [
}
return $api->upload(function ($source, $filename) use ($parent, $params, $map) {
$file = $parent->createFile([
$props = [
'source' => $source,
'template' => $params['template'] ?? null,
'filename' => $filename,
]);
];
// move the source file from the temp dir
$file = $parent->createFile($props, true);
if ($file instanceof File === false) {
throw new Exception('The file could not be uploaded');

View file

@ -1,5 +1,7 @@
<?php
use Kirby\Field\FieldOptions;
return [
'extends' => 'radio',
'props' => [
@ -20,5 +22,16 @@ return [
'placeholder' => function (string $placeholder = '—') {
return $placeholder;
},
],
'methods' => [
'getOptions' => function () {
$props = FieldOptions::polyfill($this->props);
// disable safe mode as the select field does not
// render HTML for the option text
$options = FieldOptions::factory($props['options'], false);
return $options->render($this->model());
}
]
];

View file

@ -10,7 +10,7 @@ return [
* The field value will be converted with the selected converter before the value gets saved. Available converters: `lower`, `upper`, `ucfirst`, `slug`
*/
'converter' => function ($value = null) {
if ($value !== null && in_array($value, array_keys($this->converters())) === false) {
if ($value !== null && array_key_exists($value, $this->converters()) === false) {
throw new InvalidArgumentException([
'key' => 'field.converter.invalid',
'data' => ['converter' => $value]

View file

@ -1,13 +1,20 @@
<?php
use Kirby\Cms\App;
use Kirby\Cms\Collection;
use Kirby\Cms\File;
use Kirby\Cms\Helpers;
use Kirby\Cms\Html;
use Kirby\Cms\Page;
use Kirby\Cms\Pages;
use Kirby\Cms\Response;
use Kirby\Cms\Site;
use Kirby\Cms\Url;
use Kirby\Filesystem\Asset;
use Kirby\Filesystem\F;
use Kirby\Http\Router;
use Kirby\Template\Slot;
use Kirby\Template\Snippet;
use Kirby\Toolkit\Date;
use Kirby\Toolkit\I18n;
use Kirby\Toolkit\Str;
@ -16,11 +23,8 @@ use Kirby\Toolkit\V;
if (Helpers::hasOverride('asset') === false) { // @codeCoverageIgnore
/**
* Helper to create an asset object
*
* @param string $path
* @return \Kirby\Filesystem\Asset
*/
function asset(string $path)
function asset(string $path): Asset
{
return new Asset($path);
}
@ -33,10 +37,12 @@ if (Helpers::hasOverride('attr') === false) { // @codeCoverageIgnore
* @param array|null $attr A list of attributes as key/value array
* @param string|null $before An optional string that will be prepended if the result is not empty
* @param string|null $after An optional string that will be appended if the result is not empty
* @return string|null
*/
function attr(array|null $attr = null, string|null $before = null, string|null $after = null): string|null
{
function attr(
array|null $attr = null,
string|null $before = null,
string|null $after = null
): string|null {
return Html::attr($attr, null, $before, $after);
}
}
@ -44,11 +50,8 @@ if (Helpers::hasOverride('attr') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('collection') === false) { // @codeCoverageIgnore
/**
* Returns the result of a collection by name
*
* @param string $name
* @return \Kirby\Cms\Collection|null
*/
function collection(string $name)
function collection(string $name): Collection|null
{
return App::instance()->collection($name);
}
@ -61,7 +64,7 @@ if (Helpers::hasOverride('csrf') === false) { // @codeCoverageIgnore
* @param string|null $check Pass a token here to compare it to the one in the session
* @return string|bool Either the token or a boolean check result
*/
function csrf(string|null $check = null)
function csrf(string|null $check = null): string|bool
{
// check explicitly if there have been no arguments at all;
// checking for null introduces a security issue because null could come
@ -79,11 +82,12 @@ if (Helpers::hasOverride('css') === false) { // @codeCoverageIgnore
* Creates one or multiple CSS link tags
*
* @param string|array $url Relative or absolute URLs, an array of URLs or `@auto` for automatic template css loading
* @param string|array $options Pass an array of attributes for the link tag or a media attribute string
* @return string|null
* @param string|array|null $options Pass an array of attributes for the link tag or a media attribute string
*/
function css($url, $options = null): string|null
{
function css(
string|array $url,
string|array|null $options = null
): string|null {
return Html::css($url, $options);
}
}
@ -93,7 +97,6 @@ if (Helpers::hasOverride('deprecated') === false) { // @codeCoverageIgnore
* Triggers a deprecation warning if debug mode is active
* @since 3.3.0
*
* @param string $message
* @return bool Whether the warning was triggered
*/
function deprecated(string $message): bool
@ -106,12 +109,8 @@ if (Helpers::hasOverride('dump') === false) { // @codeCoverageIgnore
/**
* Simple object and variable dumper
* to help with debugging.
*
* @param mixed $variable
* @param bool $echo
* @return string
*/
function dump($variable, bool $echo = true): string
function dump(mixed $variable, bool $echo = true): string
{
return Helpers::dump($variable, $echo);
}
@ -121,16 +120,35 @@ if (Helpers::hasOverride('e') === false) { // @codeCoverageIgnore
/**
* Smart version of echo with an if condition as first argument
*
* @param mixed $condition
* @param mixed $value The string to be echoed if the condition is true
* @param mixed $alternative An alternative string which should be echoed when the condition is false
*/
function e($condition, $value, $alternative = null)
function e(mixed $condition, mixed $value, mixed $alternative = null): void
{
echo $condition ? $value : $alternative;
}
}
if (Helpers::hasOverride('endslot') === false) { // @codeCoverageIgnore
/**
* Ends the last started template slot
*/
function endslot(): void
{
Slot::end();
}
}
if (Helpers::hasOverride('endsnippet') === false) { // @codeCoverageIgnore
/**
* Renders the currently active snippet with slots
*/
function endsnippet(): void
{
Snippet::end();
}
}
if (Helpers::hasOverride('esc') === false) { // @codeCoverageIgnore
/**
* Escape context specific output
@ -151,9 +169,8 @@ if (Helpers::hasOverride('get') === false) { // @codeCoverageIgnore
*
* @param mixed $key The key to look for. Pass false or null to return the entire request array.
* @param mixed $default Optional default value, which should be returned if no element has been found
* @return mixed
*/
function get($key = null, $default = null)
function get(mixed $key = null, mixed $default = null): mixed
{
return App::instance()->request()->get($key, $default);
}
@ -162,10 +179,6 @@ if (Helpers::hasOverride('get') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('gist') === false) { // @codeCoverageIgnore
/**
* Embeds a Github Gist
*
* @param string $url
* @param string|null $file
* @return string
*/
function gist(string $url, string|null $file = null): string
{
@ -181,11 +194,9 @@ if (Helpers::hasOverride('go') === false) { // @codeCoverageIgnore
* Redirects to the given Urls
* Urls can be relative or absolute.
*
* @param string $url
* @param int $code
* @return void
* @todo Change return type to `never` once support for PHP 8.0 is dropped
*/
function go(string $url = '/', int $code = 302)
function go(string $url = '/', int $code = 302): void
{
Response::go($url, $code);
}
@ -196,8 +207,6 @@ if (Helpers::hasOverride('h') === false) { // @codeCoverageIgnore
* Shortcut for html()
*
* @param string|null $string unencoded text
* @param bool $keepTags
* @return string
*/
function h(string|null $string, bool $keepTags = false): string
{
@ -210,8 +219,6 @@ if (Helpers::hasOverride('html') === false) { // @codeCoverageIgnore
* Creates safe html by encoding special characters
*
* @param string|null $string unencoded text
* @param bool $keepTags
* @return string
*/
function html(string|null $string, bool $keepTags = false): string
{
@ -226,11 +233,8 @@ if (Helpers::hasOverride('image') === false) { // @codeCoverageIgnore
*
* Example:
* <?= image('some/page/myimage.jpg') ?>
*
* @param string|null $path
* @return \Kirby\Cms\File|null
*/
function image(string|null $path = null)
function image(string|null $path = null): File|null
{
return App::instance()->image($path);
}
@ -239,14 +243,12 @@ if (Helpers::hasOverride('image') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('invalid') === false) { // @codeCoverageIgnore
/**
* Runs a number of validators on a set of data and checks if the data is invalid
*
* @param array $data
* @param array $rules
* @param array $messages
* @return array
*/
function invalid(array $data = [], array $rules = [], array $messages = []): array
{
function invalid(
array $data = [],
array $rules = [],
array $messages = []
): array {
return V::invalid($data, $rules, $messages);
}
}
@ -254,13 +256,11 @@ if (Helpers::hasOverride('invalid') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('js') === false) { // @codeCoverageIgnore
/**
* Creates a script tag to load a javascript file
*
* @param string|array $url
* @param string|array $options
* @return string|null
*/
function js($url, $options = null): string|null
{
function js(
string|array $url,
string|array|bool|null $options = null
): string|null {
return Html::js($url, $options);
}
}
@ -268,10 +268,8 @@ if (Helpers::hasOverride('js') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('kirby') === false) { // @codeCoverageIgnore
/**
* Returns the Kirby object in any situation
*
* @return \Kirby\Cms\App
*/
function kirby()
function kirby(): App
{
return App::instance();
}
@ -280,15 +278,13 @@ if (Helpers::hasOverride('kirby') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('kirbytag') === false) { // @codeCoverageIgnore
/**
* Makes it possible to use any defined Kirbytag as standalone function
*
* @param string|array $type
* @param string|null $value
* @param array $attr
* @param array $data
* @return string
*/
function kirbytag($type, string|null $value = null, array $attr = [], array $data = []): string
{
function kirbytag(
string|array $type,
string|null $value = null,
array $attr = [],
array $data = []
): string {
return App::instance()->kirbytag($type, $value, $attr, $data);
}
}
@ -297,10 +293,6 @@ if (Helpers::hasOverride('kirbytags') === false) { // @codeCoverageIgnore
/**
* Parses KirbyTags in the given string. Shortcut
* for `$kirby->kirbytags($text, $data)`
*
* @param string|null $text
* @param array $data
* @return string
*/
function kirbytags(string|null $text = null, array $data = []): string
{
@ -312,10 +304,6 @@ if (Helpers::hasOverride('kirbytext') === false) { // @codeCoverageIgnore
/**
* Parses KirbyTags and Markdown in the
* given string. Shortcut for `$kirby->kirbytext()`
*
* @param string|null $text
* @param array $data
* @return string
*/
function kirbytext(string|null $text = null, array $data = []): string
{
@ -328,10 +316,6 @@ if (Helpers::hasOverride('kirbytextinline') === false) { // @codeCoverageIgnore
* Parses KirbyTags and inline Markdown in the
* given string.
* @since 3.1.0
*
* @param string|null $text
* @param array $options
* @return string
*/
function kirbytextinline(string|null $text = null, array $options = []): string
{
@ -343,10 +327,6 @@ if (Helpers::hasOverride('kirbytextinline') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('kt') === false) { // @codeCoverageIgnore
/**
* Shortcut for `kirbytext()` helper
*
* @param string|null $text
* @param array $data
* @return string
*/
function kt(string|null $text = null, array $data = []): string
{
@ -358,10 +338,6 @@ if (Helpers::hasOverride('kti') === false) { // @codeCoverageIgnore
/**
* Shortcut for `kirbytextinline()` helper
* @since 3.1.0
*
* @param string|null $text
* @param array $options
* @return string
*/
function kti(string|null $text = null, array $options = []): string
{
@ -373,10 +349,6 @@ if (Helpers::hasOverride('kti') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('load') === false) { // @codeCoverageIgnore
/**
* A super simple class autoloader
*
* @param array $classmap
* @param string|null $base
* @return void
*/
function load(array $classmap, string|null $base = null): void
{
@ -388,10 +360,6 @@ if (Helpers::hasOverride('markdown') === false) { // @codeCoverageIgnore
/**
* Parses markdown in the given string. Shortcut for
* `$kirby->markdown($text)`
*
* @param string|null $text
* @param array $options
* @return string
*/
function markdown(string|null $text = null, array $options = []): string
{
@ -402,12 +370,8 @@ if (Helpers::hasOverride('markdown') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('option') === false) { // @codeCoverageIgnore
/**
* Shortcut for `$kirby->option($key, $default)`
*
* @param string $key
* @param mixed $default
* @return mixed
*/
function option(string $key, $default = null)
function option(string $key, mixed $default = null): mixed
{
return App::instance()->option($key, $default);
}
@ -417,11 +381,8 @@ if (Helpers::hasOverride('page') === false) { // @codeCoverageIgnore
/**
* Fetches a single page by id or
* the current page when no id is specified
*
* @param string|null $id
* @return \Kirby\Cms\Page|null
*/
function page(string|null $id = null)
function page(string|null $id = null): Page|null
{
if (empty($id) === true) {
return App::instance()->site()->page();
@ -434,11 +395,8 @@ if (Helpers::hasOverride('page') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('pages') === false) { // @codeCoverageIgnore
/**
* Helper to build pages collection
*
* @param string|array ...$id
* @return \Kirby\Cms\Pages|null
*/
function pages(...$id)
function pages(string|array ...$id): Pages|null
{
// ensure that a list of string arguments and an array
// as the first argument are treated the same
@ -456,9 +414,6 @@ if (Helpers::hasOverride('param') === false) { // @codeCoverageIgnore
/**
* Returns a single param from the URL
*
* @param string $key
* @param string|null $fallback
* @return string|null
* @psalm-return ($fallback is string ? string : string|null)
*/
function param(string $key, string|null $fallback = null): string|null
@ -470,8 +425,6 @@ if (Helpers::hasOverride('param') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('params') === false) { // @codeCoverageIgnore
/**
* Returns all params from the current Url
*
* @return array
*/
function params(): array
{
@ -483,12 +436,10 @@ if (Helpers::hasOverride('r') === false) { // @codeCoverageIgnore
/**
* Smart version of return with an if condition as first argument
*
* @param mixed $condition
* @param mixed $value The string to be returned if the condition is true
* @param mixed $alternative An alternative string which should be returned when the condition is false
* @return mixed
*/
function r($condition, $value, $alternative = null)
function r(mixed $condition, mixed $value, mixed $alternative = null): mixed
{
return $condition ? $value : $alternative;
}
@ -499,15 +450,13 @@ if (Helpers::hasOverride('router') === false) { // @codeCoverageIgnore
* Creates a micro-router and executes
* the routing action immediately
* @since 3.6.0
*
* @param string|null $path
* @param string $method
* @param array $routes
* @param \Closure|null $callback
* @return mixed
*/
function router(string|null $path = null, string $method = 'GET', array $routes = [], Closure|null $callback = null)
{
function router(
string|null $path = null,
string $method = 'GET',
array $routes = [],
Closure|null $callback = null
): mixed {
return Router::execute($path, $method, $routes, $callback);
}
}
@ -515,10 +464,8 @@ if (Helpers::hasOverride('router') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('site') === false) { // @codeCoverageIgnore
/**
* Returns the current site object
*
* @return \Kirby\Cms\Site
*/
function site()
function site(): Site
{
return App::instance()->site();
}
@ -527,24 +474,27 @@ if (Helpers::hasOverride('site') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('size') === false) { // @codeCoverageIgnore
/**
* Determines the size/length of numbers, strings, arrays and countable objects
*
* @param mixed $value
* @return int
* @throws \Kirby\Exception\InvalidArgumentException
*/
function size($value): int
function size(mixed $value): int
{
return Helpers::size($value);
}
}
if (Helpers::hasOverride('slot') === false) { // @codeCoverageIgnore
/**
* Starts a new template slot
*/
function slot(string $name = 'default'): void
{
Slot::begin($name);
}
}
if (Helpers::hasOverride('smartypants') === false) { // @codeCoverageIgnore
/**
* Enhances the given string with
* smartypants. Shortcut for `$kirby->smartypants($text)`
*
* @param string|null $text
* @return string
*/
function smartypants(string|null $text = null): string
{
@ -555,15 +505,14 @@ if (Helpers::hasOverride('smartypants') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('snippet') === false) { // @codeCoverageIgnore
/**
* Embeds a snippet from the snippet folder
*
* @param string|array $name
* @param array|object $data
* @param bool $return
* @return string|null
*/
function snippet($name, $data = [], bool $return = false): string|null
{
return App::instance()->snippet($name, $data, $return);
function snippet(
$name,
$data = [],
bool $return = false,
bool $slots = false
): Snippet|string|null {
return App::instance()->snippet($name, $data, $return, $slots);
}
}
@ -571,11 +520,8 @@ if (Helpers::hasOverride('svg') === false) { // @codeCoverageIgnore
/**
* Includes an SVG file by absolute or
* relative file path.
*
* @param string|\Kirby\Cms\File $file
* @return string|false
*/
function svg($file)
function svg(string|File $file): string|false
{
return Html::svg($file);
}
@ -584,14 +530,12 @@ if (Helpers::hasOverride('svg') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('t') === false) { // @codeCoverageIgnore
/**
* Returns translate string for key from translation file
*
* @param string|array $key
* @param string|null $fallback
* @param string|null $locale
* @return array|string|null
*/
function t($key, string $fallback = null, string $locale = null)
{
function t(
string|array $key,
string|null $fallback = null,
string|null $locale = null
): string|array|Closure|null {
return I18n::translate($key, $fallback, $locale);
}
}
@ -600,18 +544,14 @@ if (Helpers::hasOverride('tc') === false) { // @codeCoverageIgnore
/**
* Translates a count
*
* @param string $key
* @param int $count
* @param string|null $locale
* @param bool $formatNumber If set to `false`, the count is not formatted
* @return mixed
*/
function tc(
string $key,
int $count,
string $locale = null,
string|null $locale = null,
bool $formatNumber = true
) {
): mixed {
return I18n::translateCount($key, $count, $locale, $formatNumber);
}
}
@ -621,12 +561,12 @@ if (Helpers::hasOverride('timestamp') === false) { // @codeCoverageIgnore
* Rounds the minutes of the given date
* by the defined step
*
* @param string|null $date
* @param int|array|null $step array of `unit` and `size` to round to nearest
* @return int|null
*/
function timestamp(string|null $date = null, $step = null): int|null
{
function timestamp(
string|null $date = null,
int|array|null $step = null
): int|null {
return Date::roundedTimestamp($date, $step);
}
}
@ -635,15 +575,13 @@ if (Helpers::hasOverride('tt') === false) { // @codeCoverageIgnore
/**
* Translate by key and then replace
* placeholders in the text
*
* @param string $key
* @param string|array|null $fallback
* @param array|null $replace
* @param string|null $locale
* @return string
*/
function tt(string $key, $fallback = null, array|null $replace = null, string|null $locale = null): string
{
function tt(
string $key,
string|array|null $fallback = null,
array|null $replace = null,
string|null $locale = null
): string {
return I18n::template($key, $fallback, $replace, $locale);
}
}
@ -651,15 +589,13 @@ if (Helpers::hasOverride('tt') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('twitter') === false) { // @codeCoverageIgnore
/**
* Builds a Twitter link
*
* @param string $username
* @param string|null $text
* @param string|null $title
* @param string|null $class
* @return string
*/
function twitter(string $username, string|null $text = null, string|null $title = null, string|null $class = null): string
{
function twitter(
string $username,
string|null $text = null,
string|null $title = null,
string|null $class = null
): string {
return App::instance()->kirbytag([
'twitter' => $username,
'text' => $text,
@ -672,13 +608,11 @@ if (Helpers::hasOverride('twitter') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('u') === false) { // @codeCoverageIgnore
/**
* Shortcut for url()
*
* @param string|null $path
* @param array|string|null $options
* @return string
*/
function u(string|null $path = null, $options = null): string
{
function u(
string|null $path = null,
array|string|null $options = null
): string {
return Url::to($path, $options);
}
}
@ -686,13 +620,11 @@ if (Helpers::hasOverride('u') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('url') === false) { // @codeCoverageIgnore
/**
* Builds an absolute URL for a given path
*
* @param string|null $path
* @param array|string|null $options
* @return string
*/
function url(string|null $path = null, $options = null): string
{
function url(
string|null $path = null,
array|string|null $options = null
): string {
return Url::to($path, $options);
}
}
@ -700,8 +632,6 @@ if (Helpers::hasOverride('url') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('uuid') === false) { // @codeCoverageIgnore
/**
* Creates a compliant v4 UUID
*
* @return string
*/
function uuid(): string
{
@ -714,11 +644,6 @@ if (Helpers::hasOverride('video') === false) { // @codeCoverageIgnore
* Creates a video embed via iframe for Youtube or Vimeo
* videos. The embed Urls are automatically detected from
* the given Url.
*
* @param string $url
* @param array $options
* @param array $attr
* @return string|null
*/
function video(string $url, array $options = [], array $attr = []): string|null
{
@ -729,11 +654,6 @@ if (Helpers::hasOverride('video') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('vimeo') === false) { // @codeCoverageIgnore
/**
* Embeds a Vimeo video by URL in an iframe
*
* @param string $url
* @param array $options
* @param array $attr
* @return string|null
*/
function vimeo(string $url, array $options = [], array $attr = []): string|null
{
@ -746,11 +666,8 @@ if (Helpers::hasOverride('widont') === false) { // @codeCoverageIgnore
* The widont function makes sure that there are no
* typographical widows at the end of a paragraph
* that's a single word in the last line
*
* @param string|null $string
* @return string
*/
function widont(string $string = null): string
function widont(string|null $string = null): string
{
return Str::widont($string);
}
@ -759,11 +676,6 @@ if (Helpers::hasOverride('widont') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('youtube') === false) { // @codeCoverageIgnore
/**
* Embeds a Youtube video by URL in an iframe
*
* @param string $url
* @param array $options
* @param array $attr
* @return string|null
*/
function youtube(string $url, array $options = [], array $attr = []): string|null
{

View file

@ -66,7 +66,8 @@ return function (App $app) {
try {
$blocks = Blocks::parse($field->value());
$blocks = Blocks::factory($blocks, [
'parent' => $field->parent()
'parent' => $field->parent(),
'field' => $field,
]);
return $blocks->filter('isHidden', false);
} catch (Throwable) {
@ -192,7 +193,8 @@ return function (App $app) {
*/
'toLayouts' => function (Field $field) {
return Layouts::factory(Layouts::parse($field->value()), [
'parent' => $field->parent()
'parent' => $field->parent(),
'field' => $field,
]);
},
@ -276,10 +278,10 @@ return function (App $app) {
* Converts the field value to a Unix timestamp
*
* @param \Kirby\Cms\Field $field
* @return int
* @return int|false
*/
'toTimestamp' => function (Field $field): int {
return strtotime($field->value);
'toTimestamp' => function (Field $field): int|false {
return strtotime($field->value ?? '');
},
/**
@ -326,7 +328,7 @@ return function (App $app) {
* Returns the number of words in the text
*/
'words' => function (Field $field) {
return str_word_count(strip_tags($field->value));
return str_word_count(strip_tags($field->value ?? ''));
},
// manipulators
@ -394,7 +396,7 @@ return function (App $app) {
// Obsolete elements, script tags, image maps and form elements have
// been excluded for safety reasons and as they are most likely not
// needed in most cases.
$field->value = strip_tags($field->value, Html::$inlineList);
$field->value = strip_tags($field->value ?? '', Html::$inlineList);
return $field;
},
@ -481,7 +483,7 @@ return function (App $app) {
* @return \Kirby\Cms\Field
*/
'nl2br' => function (Field $field) {
$field->value = nl2br($field->value, false);
$field->value = nl2br($field->value ?? '', false);
return $field;
},

View file

@ -57,6 +57,11 @@ return [
// search
if ($this->search === true && empty($this->searchterm()) === false) {
$files = $files->search($this->searchterm());
// disable flip and sortBy while searching
// to show most relevant results
$this->flip = false;
$this->sortBy = null;
}
// sort
@ -157,10 +162,9 @@ return [
}
// count all uploaded files
$total = count($this->data);
$max = $this->max ? $this->max - $total : null;
$max = $this->max ? $this->max - $this->total : null;
if ($this->max && $total === $this->max - 1) {
if ($this->max && $this->total === $this->max - 1) {
$multiple = false;
} else {
$multiple = true;
@ -174,7 +178,10 @@ return [
'max' => $max,
'api' => $this->parent->apiUrl(true) . '/files',
'attributes' => array_filter([
'sort' => $this->sortable === true ? $total + 1 : null,
// TODO: an edge issue that needs to be solved:
// if multiple users load the same section at the same time
// and upload a file, uploaded files have the same sort number
'sort' => $this->sortable === true ? $this->total + 1 : null,
'template' => $template
])
];

View file

@ -94,6 +94,11 @@ return [
// search
if ($this->search === true && empty($this->searchterm()) === false) {
$pages = $pages->search($this->searchterm());
// disable flip and sortBy while searching
// to show most relevant results
$this->flip = false;
$this->sortBy = null;
}
// sort

View file

@ -570,8 +570,18 @@ class ParsedownExtra extends Parsedown
$DOMDocument = new DOMDocument();
# http://stackoverflow.com/q/11309194/200145
$elementMarkup = mb_convert_encoding($elementMarkup, 'HTML-ENTITIES', 'UTF-8');
// Migrating away from `mb_convert_encoding($elementMarkup,
//'HTML-ENTITIES', 'UTF-8');` has caused multibyte characters like
// emojis not to be converted into entities, which is needed so that
// the `DOM` extension can properly parse the markup.
// The following line works like this: It treats the input string
// as UTF-8 and converts every Unicode character with 8 or more bits
// (= character code starting at 128 or 0x80 up to the Unicode limit
// of 0x10ffff) to an entity; the third and fourth arguments for the
// map are not needed for our use case and are set to the default values
// (no offset and a full mask)
// [http://stackoverflow.com/q/11309194/200145]
$elementMarkup = mb_encode_numericentity($elementMarkup, [0x80, 0x10ffff, 0, 0xffffff], 'UTF-8');
# Ensure that saveHTML() is not remove new line characters. New lines will be split by this character.
$DOMDocument->formatOutput = true;

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "You must add at least one block",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Email шаблонът \"{name}\" не може да бъде открит",
"error.field.converter.invalid": "Невалиден конвертор \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.permission": "Не можете да смените името на \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Все още не са избрани страници",
"field.structure.delete.confirm": "Сигурни ли сте, че искате да изтриете това вписване?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Все още няма статии",
"field.users.empty": "Все още не са избрани потребители",
@ -318,7 +322,7 @@
"installation.issues.headline": "Панелът не може да бъде инсталиран",
"installation.issues.mbstring": "Изисква се разширението <code>MB String</code>",
"installation.issues.media": "Папката <code>/media</code> не съществува или няма права за запис",
"installation.issues.php": "Бъдете сигурни, че използвате <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "You received your license code after the purchase via email. Please copy and paste it to register.",
"license.register.label": "Please enter your license code",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Thank you for supporting Kirby",
"license.unregistered": "Това е нерегистрирана демо версия на Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "You must add at least one block",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "No es pot trobar la configuració de correu electrònic \"{name}\"",
"error.field.converter.invalid": "Convertidor no vàlid \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "El nom no pot estar buit",
"error.file.changeName.permission": "No tens permís per canviar el nom de \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Encara no s'ha seleccionat cap pàgina",
"field.structure.delete.confirm": "Segur que voleu eliminar aquesta fila?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Encara no hi ha entrades.",
"field.users.empty": "Encara no s'ha seleccionat cap usuari",
@ -318,7 +322,7 @@
"installation.issues.headline": "El panell no es pot instal·lar",
"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.php": "Assegureu-vos d'utilitzar <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Heu rebut el codi de la vostra llicència després de la compra, per correu electrònic. Copieu-lo i enganxeu-lo per registrar-vos.",
"license.register.label": "Si us plau, introdueixi el seu codi de llicència",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Gràcies per donar suport a Kirby",
"license.unregistered": "Aquesta és una demo no registrada de Kirby",
"license.unregistered.label": "Unregistered",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Forgot your password?",
"login.toggleText.password-reset.email-password": "← Back to login",
"logout": "Tancar sessi\u00f3",
"logout": "Tancar sessió",
"menu": "Menú",
"meridiem": "AM/PM",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Musíte přidat alespoň jeden blok",
"error.blocks.validation": "V poli \"{field}\" v bloku {index} je při použití \"{fieldset}\" typu chyba",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Nelze nalézt emailové přednastavení \"{name}\"",
"error.field.converter.invalid": "Neplatný konvertor \"{converter}\"",
"error.field.type.missing": "Pole \"{ name }\": Typ pole \"{ type }\" neexistuje",
"error.file.changeName.empty": "Toto jméno nesmí být prázdné",
"error.file.changeName.permission": "Nemáte povoleno změnit jméno souboru \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Nebyly zatím vybrány žádné stránky",
"field.structure.delete.confirm": "Opravdu chcete smazat tento z\u00e1znam?",
"field.structure.delete.confirm.all": "Opravdu chcete smazat všechny záznamy?",
"field.structure.empty": "Zat\u00edm nejsou \u017e\u00e1dn\u00e9 z\u00e1znamy.",
"field.users.empty": "Nebyli zatím vybráni žádní uživatelé",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panel nelze nainstalovat",
"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.php": "Ujistěte se, že používáte<code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Spravovat licence",
"license.register.help": "Licenční kód jste po zakoupení obdrželi na email. Vložte prosím kód a zaregistrujte Vaší kopii.",
"license.register.label": "Zadejte prosím licenční kód",
"license.register.domain": "Vaše licence bude zaregistrována na <strong>{host}</strong>.",
"license.register.local": "Chystáte se registrovat licenci na Vaší lokální doméně <strong>{host}</strong>. Pokud bude tato stránka nasazena na veřejnou doménu, registrujte prosím licenci až tam. Pokud je {host} opravdu doménou, na které si přejete licenci registrovat, pokračujte prosím dále.",
"license.register.success": "Děkujeme Vám za podporu Kirby",
"license.unregistered": "Toto je neregistrovaná kopie Kirby",
"license.unregistered.label": "Neregistrovaný",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Zapomenuté heslo?",
"login.toggleText.password-reset.email-password": "← Zpět na přihlášení",
"logout": "Odhl\u00e1sit se",
"logout": "Odhlásit se",
"menu": "Menu",
"meridiem": "AM/PM",
@ -454,7 +460,7 @@
"paste": "Vložit",
"paste.after": "Vložit za",
"pixel": "Pixel",
"plugin": "Plugin",
"plugin": "Doplňek",
"plugins": "Doplňky",
"prev": "Předchozí",
"preview": "Náhled",
@ -494,24 +500,24 @@
"stats.empty": "Žádná hlášení",
"system.issues.content": "Složka content je zřejmě přístupná zvenčí",
"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.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.debug": "Debug mode musí být v produkci vypnutý",
"system.issues.git": "Složka .git je zřejmě přístupná zvenčí",
"system.issues.https": "Při všechny stránky doporučujeme používat protokol HTTPS",
"system.issues.https": "Pro všechny stránky doporučujeme používat protokol HTTPS",
"system.issues.kirby": "Složka kirby je zřejmě přístupná zvenčí",
"system.issues.site": "Složka site je zřejmě přístupná zvenčí",
"system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }",
"system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }",
"system.updateStatus": "Update status",
"system.updateStatus.error": "Could not check for updates",
"system.updateStatus.not-vulnerable": "No known vulnerabilities",
"system.updateStatus.security-update": "Free security update { version } available",
"system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available",
"system.updateStatus.unreleased": "Unreleased version",
"system.updateStatus.up-to-date": "Up to date",
"system.updateStatus.update": "Free update { version } available",
"system.updateStatus.upgrade": "Upgrade { version } available",
"system.issues.vulnerability.kirby": "Vaše instalace může být ovlivněna následující zranitelností (stupeň vážnosti - { severity }): { description }",
"system.issues.vulnerability.plugin": "Vaše instalace může být ovlivněna následující zranitelností v doplňku { plugin } (stupeň vážnosti - { severity }): { description }",
"system.updateStatus": "Status aktualizací",
"system.updateStatus.error": "Nepodařilo se zkontrolovat aktualizace",
"system.updateStatus.not-vulnerable": "Žádné známé zranitelnosti",
"system.updateStatus.security-update": "Je dostupná bezplatná bezpečnostní aktualizace { version }",
"system.updateStatus.security-upgrade": "Je dostupný upgrade { version } s bezpečnostními opravami",
"system.updateStatus.unreleased": "Nevydaná verze",
"system.updateStatus.up-to-date": "Aktuální",
"system.updateStatus.update": "Je dostupná bezplatná nová verze { version }",
"system.updateStatus.upgrade": "Je dostupný upgrade na verzi { version }",
"title": "Název",
"template": "\u0160ablona",
@ -578,9 +584,9 @@
"users": "Uživatelé",
"version": "Verze Kirby",
"version.current": "Current version",
"version.latest": "Latest version",
"versionInformation": "Version information",
"version.current": "Současná verze",
"version.latest": "Poslední verze",
"versionInformation": "Informace o verzi",
"view.account": "V\u00e1\u0161 \u00fa\u010det",
"view.installation": "Instalace",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Du skal tilføje minimum een blok",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Email preset \"{name}\" findes ikke",
"error.field.converter.invalid": "Ugyldig converter \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Navn kan ikke efterlades tomt",
"error.file.changeName.permission": "Du har ikke tilladelse til at ændre navnet på filen \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Ingen sider valgt endnu",
"field.structure.delete.confirm": "\u00d8nsker du virkelig at slette denne indtastning?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Ingen indtastninger endnu.",
"field.users.empty": "Ingen brugere er valgt",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panelet kan ikke installeres",
"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.php": "Sikre dig at der benyttes <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Du modtog din licenskode efter købet via email. Venligst kopier og indsæt den for at registrere.",
"license.register.label": "Indtast venligst din licenskode",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Tak for din støtte af Kirby",
"license.unregistered": "Dette er en uregistreret demo af Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -1,7 +1,7 @@
{
"account.changeName": "Deinen Namen ändern",
"account.delete": "Deinen Account löschen",
"account.delete.confirm": "Willst du deinen Account wirklich löschen? Du wirst sofort danach abgemeldet. Dein Account kann nicht wieder hergestellt werden. ",
"account.delete.confirm": "Willst du deinen Account wirklich löschen? Du wirst sofort danach abgemeldet. Dein Account kann nicht wieder hergestellt werden.",
"add": "Hinzuf\u00fcgen",
"author": "Autor",
@ -72,9 +72,12 @@
"error.blocks.min.singular": "Bitte füge mindestens einen Block hinzu",
"error.blocks.validation": "Fehler im \"{field}\" Feld in Block {index} mit dem Block Typ \"{fieldset}\"",
"error.cache.type.invalid": "Ungültiger Cachetyp: \"{type}\"",
"error.email.preset.notFound": "Die E-Mailvorlage \"{name}\" wurde nicht gefunden",
"error.field.converter.invalid": "Ungültiger Konverter: \"{converter}\"",
"error.field.type.missing": "Feld \"{ name }\": Der Feldtyp \"{ type }\" existiert nicht",
"error.file.changeName.empty": "Bitte gib einen Namen an",
"error.file.changeName.permission": "Du darfst den Dateinamen von \"{filename}\" nicht ändern",
@ -107,7 +110,7 @@
"error.language.name": "Bitte gib einen gültigen Namen für die Sprache an",
"error.language.notFound": "Die Sprache konnte nicht gefunden werden",
"error.layout.validation.block": "Fehler im \"{field}\" Feld in Block {blockIndex} mit dem Block Typ \"{fieldset}\" in Layout {layoutIndex}",
"error.layout.validation.block": "Fehler im \"{field}\" Feld in Block {blockIndex} mit dem Blocktyp \"{fieldset}\" in Layout {layoutIndex}",
"error.layout.validation.settings": "Fehler in den Einstellungen von Layout {index}",
"error.license.format": "Bitte gib einen gültigen Lizenzschlüssel ein",
@ -162,7 +165,7 @@
"error.template.default.notFound": "Die \"Default\"-Vorlage existiert nicht",
"error.unexpected": "Ein unerwarteter Fehler ist aufgetreten. Aktiviere den Debug Modus für weitere Informationen: https://getkirby.com/docs/reference/system/options/debug",
"error.unexpected": "Ein unerwarteter Fehler ist aufgetreten. Aktiviere den Debug-Modus für weitere Informationen: https://getkirby.com/docs/reference/system/options/debug",
"error.user.changeEmail.permission": "Du kannst die E-Mailadresse für den Account \"{name}\" nicht ändern",
"error.user.changeLanguage.permission": "Du kannst die Sprache für den Account \"{name}\" nicht ändern",
@ -289,6 +292,7 @@
"field.pages.empty": "Keine Seiten ausgewählt",
"field.structure.delete.confirm": "Willst du diesen Eintrag wirklich l\u00f6schen?",
"field.structure.delete.confirm.all": "Möchtest du wirklich alle Einträge löschen?",
"field.structure.empty": "Es bestehen keine Eintr\u00e4ge.",
"field.users.empty": "Keine Accounts ausgewählt",
@ -318,7 +322,7 @@
"installation.issues.headline": "Das Panel kann nicht installiert werden",
"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.php": "Bitte verwende <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Verwalte deine Lizenzen",
"license.register.help": "Den Lizenzcode findest du in der Bestätigungsmail zu deinem Kauf. Bitte kopiere und füge ihn ein, um Kirby zu registrieren.",
"license.register.label": "Bitte gib deinen Lizenzcode ein",
"license.register.domain": "Deine Lizenz wird unter der Domain <strong>{host}</strong> registriert",
"license.register.local": "Du bist dabei, deine Lizenz unter der lokalen Domain <strong>{host}</strong> zu registrieren. Wenn diese Seite unter einer anderen Domain veröffentlicht werden soll, registriere die Lizenz statt dessen bitte dort. Wenn du {host} als Domain verwenden möchtest, fahre bitte fort. ",
"license.register.success": "Vielen Dank für deine Unterstützung",
"license.unregistered": "Dies ist eine unregistrierte Kirby-Demo",
"license.unregistered.label": "Unregistriert",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "You must add at least one block",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Δεν είναι δυνατή η εύρεση της προεπιλογής διεύθινσης ηλεκτρονικού ταχυδρομείου \"{name}\"",
"error.field.converter.invalid": "Μη έγκυρος μετατροπέας \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.permission": "Δεν επιτρέπεται να αλλάξετε το όνομα του \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Δεν έχουν επιλεγεί ακόμη σελίδες",
"field.structure.delete.confirm": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b9\u03c3\u03b7;",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b1\u03ba\u03cc\u03bc\u03b7 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03af\u03c3\u03b5\u03b9\u03c2.",
"field.users.empty": "Δεν έχουν επιλεγεί ακόμη χρήστες",
@ -318,7 +322,7 @@
"installation.issues.headline": "Ο πίνακας ελέγχου δεν μπορεί να εγκατασταθεί",
"installation.issues.mbstring": "Απαιτείται η επέκταση <code>MB String</code> ",
"installation.issues.media": "Ο φάκελος <code>/media</code> δεν υπάρχει ή δεν είναι εγγράψιμος",
"installation.issues.php": "Βεβαιωθείτε ότι χρησιμοποιήτε <code>PHP 7+</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> δεν υπάρχει ή δεν είναι εγγράψιμος",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Έχετε λάβει τον κωδικό άδειας χρήσης μετά την αγορά μέσω ηλεκτρονικού ταχυδρομείου. Παρακαλώ αντιγράψτε και επικολλήστε τον για να εγγραφείτε.",
"license.register.label": "Παρακαλώ εισαγάγετε τον κωδικό άδειας χρήσης",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Σας ευχαριστούμε για την υποστήριξη του Kirby",
"license.unregistered": "Αυτό είναι ένα μη καταχωρημένο demo του Kirby",
"license.unregistered.label": "Unregistered",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Forgot your password?",
"login.toggleText.password-reset.email-password": "← Back to login",
"logout": "\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7",
"logout": "Αποσύνδεση",
"menu": "Μενού",
"meridiem": "Π.Μ./Μ.Μ",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "You must add at least one block",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "The email preset \"{name}\" cannot be found",
"error.field.converter.invalid": "Invalid converter \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.permission": "You are not allowed to change the name of \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "No pages selected yet",
"field.structure.delete.confirm": "Do you really want to delete this row?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "No entries yet",
"field.users.empty": "No users selected yet",
@ -318,7 +322,7 @@
"installation.issues.headline": "The panel cannot be installed",
"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.php": "Make sure to use <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "You received your license code after the purchase via email. Please copy and paste it to register.",
"license.register.label": "Please enter your license code",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Thank you for supporting Kirby",
"license.unregistered": "This is an unregistered demo of Kirby",
"license.unregistered.label": "Unregistered",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Forgot your password?",
"login.toggleText.password-reset.email-password": "← Back to login",
"logout": "Logout",
"logout": "Log out",
"menu": "Menu",
"meridiem": "AM/PM",
@ -393,7 +399,7 @@
"months.april": "April",
"months.august": "August",
"months.december": "December",
"months.february": "Feburary",
"months.february": "February",
"months.january": "January",
"months.july": "July",
"months.june": "June",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Oni devas aldoni almenaŭ unu blokon",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "La retpoŝta antaŭagordo \"{name}\" ne estas trovebla",
"error.field.converter.invalid": "Nevalida konvertilo \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "La nomo ne rajtas esti malplena",
"error.file.changeName.permission": "Vi ne rajtas ŝanĝi la nomon de \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Ankoraŭ neniu paĝo elektita",
"field.structure.delete.confirm": "Ĉu vi certe volas forigi ĉi tiun vicon?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Ankoraŭ neniu enigo",
"field.users.empty": "Ankoraŭ neniu uzanto elektita",
@ -318,7 +322,7 @@
"installation.issues.headline": "Ne eblas instali la panelon",
"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.php": "Nepre uzu <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Vi ricevis vian kodon de permisilo retpoŝte, post aĉeti ĝin. Bonvolu kopii kaj alglui ĝin por registriĝi.",
"license.register.label": "Bonvolu entajpi vian kodon de permisilo",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Dankon pro subteni Kirby",
"license.unregistered": "Ĉi tiu estas neregistrita kopio de Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -29,7 +29,7 @@
"days.tue": "Mar",
"days.wed": "Mi\u00e9",
"debugging": "Debugging",
"debugging": "Depuración",
"delete": "Eliminar",
"delete.all": "Eliminar todos",
@ -49,8 +49,8 @@
"email": "Correo Electrónico",
"email.placeholder": "correo@ejemplo.com",
"entries": "Entries",
"entry": "Entry",
"entries": "Entradas",
"entry": "Entrada",
"environment": "Ambiente",
@ -70,11 +70,14 @@
"error.blocks.max.singular": "No debes añadir más de un bloque",
"error.blocks.min.plural": "Debes añadir al menos {min} bloques ",
"error.blocks.min.singular": "Debes añadir al menos un bloque",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.blocks.validation": "Hay un error en el campo \"{field}\" del bloque {index} que utiliza el tipo de bloque \"{fieldset}\"",
"error.cache.type.invalid": "Tipo de caché \"{tipo}\" no válido",
"error.email.preset.notFound": "El preajuste de email \"{name}\" no se pudo encontrar.",
"error.field.converter.invalid": "Convertidor inválido \"{converter}\"",
"error.field.type.missing": "Campo \"{ name }\": El tipo de campo \"{ type }\" no existe",
"error.file.changeName.empty": "El nombre no debe estar vacío",
"error.file.changeName.permission": "No tienes permitido cambiar el nombre de \"{filename}\"",
@ -107,14 +110,14 @@
"error.language.name": "Por favor introduce un nombre válido para el idioma",
"error.language.notFound": "No se pudo encontrar el idioma",
"error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}",
"error.layout.validation.settings": "There's an error in layout {index} settings",
"error.layout.validation.block": "Hay un error en el campo \"{field}\" del bloque {blockIndex} que utiliza el tipo de bloque \"{fieldset}\" en el layout {layoutIndex}",
"error.layout.validation.settings": "Hay un error en los ajustes del layout {index}",
"error.license.format": "Por favor introduce una llave de licencia válida",
"error.license.email": "Por favor ingresa un correo electrónico valido",
"error.license.verification": "La licencia no pude ser verificada",
"error.object.validation": "Theres an error in the \"{label}\" field:\n{message}",
"error.object.validation": "Hay un error en el campo \"{label}\":\n{message}",
"error.offline": "El Panel se encuentra fuera de linea ",
@ -136,8 +139,8 @@
"error.page.duplicate.permission": "No tienes permitido duplicar \"{slug}\"",
"error.page.notFound": "La página \"{slug}\" no se encuentra",
"error.page.num.invalid": "Por favor, introduce un número de posición válido. Los números no deben ser negativos.",
"error.page.slug.invalid": "Please enter a valid URL appendix",
"error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters",
"error.page.slug.invalid": "Por favor, introduce un apéndice de URL válido",
"error.page.slug.maxlength": "La longitud del slug debe ser inferior a \"{length}\" caracteres",
"error.page.sort.permission": "La página \"{slug}\" no se puede ordenar",
"error.page.status.invalid": "Por favor, establece una estado de página válido",
"error.page.undefined": "La p\u00e1gina no fue encontrada",
@ -162,7 +165,7 @@
"error.template.default.notFound": "La plantilla predeterminada no existe",
"error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug",
"error.unexpected": "¡Se ha producido un error inesperado! Activa el modo de depuración para obtener más información: https://getkirby.com/docs/reference/system/options/debug",
"error.user.changeEmail.permission": "No tienes permiso para cambiar el email del usuario \"{name}\"",
"error.user.changeLanguage.permission": "No tienes permiso para cambiar el idioma del usuario \"{name}\"",
@ -267,46 +270,47 @@
"field.blocks.quote.name": "Cita",
"field.blocks.quote.text.label": "Texto",
"field.blocks.quote.text.placeholder": "Cita...",
"field.blocks.quote.citation.label": "Citation",
"field.blocks.quote.citation.label": "Cita",
"field.blocks.quote.citation.placeholder": "Por ...",
"field.blocks.text.name": "Texto",
"field.blocks.text.placeholder": "Text",
"field.blocks.text.placeholder": "Texto ...",
"field.blocks.video.caption": "Leyenda",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.placeholder": "Introduce la URL de un vídeo",
"field.blocks.video.url.label": "Vídeo-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
"field.files.empty": "Aún no ha seleccionado ningún archivo",
"field.layout.delete": "Delete layout",
"field.layout.delete.confirm": "Do you really want to delete this layout?",
"field.layout.empty": "No rows yet",
"field.layout.select": "Select a layout",
"field.layout.delete": "Eliminar layout",
"field.layout.delete.confirm": "¿Realmente quieres eliminar este layout?",
"field.layout.empty": "Aún no hay filas",
"field.layout.select": "Seleccionar layout",
"field.object.empty": "No information yet",
"field.object.empty": "Aún no hay información",
"field.pages.empty": "Aún no ha seleccionado ningúna pagina",
"field.structure.delete.confirm": "\u00bfEn realidad desea borrar esta entrada?",
"field.structure.delete.confirm.all": "¿Realmente quieres eliminar todas las entradas?",
"field.structure.empty": "A\u00fan no existen entradas.",
"field.users.empty": "Aún no ha seleccionado ningún usuario",
"file.blueprint": "This file has no blueprint yet. You can define the setup in <strong>/site/blueprints/files/{blueprint}.yml</strong>",
"file.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en <strong>/site/blueprints/files/{blueprint}.yml</strong>",
"file.delete.confirm": "\u00bfEst\u00e1s seguro que deseas eliminar este archivo?",
"file.sort": "Change position",
"file.sort": "Cambiar posición",
"files": "Archivos",
"files.empty": "Aún no existen archivos",
"hide": "Hide",
"hide": "Ocultar",
"hour": "Hora",
"import": "Import",
"import": "Importar",
"info": "Info",
"insert": "Insertar",
"insert.after": "Insert after",
"insert.before": "Insert before",
"insert.after": "Insertar después",
"insert.before": "Insertar antes",
"install": "Instalar",
"installation": "Instalación",
@ -318,7 +322,7 @@
"installation.issues.headline": "El panel no puede ser instalado.",
"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.php": "Asegurese de estar usando <code>PHP 7+</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.",
@ -346,12 +350,14 @@
"license": "Licencia",
"license.buy": "Comprar una licencia",
"license.register": "Registrar",
"license.manage": "Manage your licenses",
"license.manage": "Gestiona tus licencias",
"license.register.help": "Recibió su código de licencia después de la compra por correo electrónico. Por favor copie y pegue para registrarse.",
"license.register.label": "Por favor, ingresa tu código de licencia",
"license.register.domain": "Tu licencia será registrada para <strong>{host}</strong>.",
"license.register.local": "Estás a punto de registrar tu licencia para el dominio local {host}. Si este sitio va a ser desplegado en un dominio público, por favor regístralo allí. Si {host} es el dominio en el que quiere registrar Kirby, por favor continúa.",
"license.register.success": "Gracias por apoyar a Kirby",
"license.unregistered": "Este es un demo no registrado de Kirby",
"license.unregistered.label": "Unregistered",
"license.unregistered.label": "No registrado",
"link": "Enlace",
"link.text": "Texto de Enlace",
@ -367,22 +373,22 @@
"lock.isUnlocked": "Tus cambios sin guardar han sido sobrescritos por otro usuario. Puedes descargar los cambios y fusionarlos manualmente.",
"login": "Iniciar sesión",
"login.code.label.login": "Login code",
"login.code.label.password-reset": "Password reset code",
"login.code.label.login": "Código de inicio de sesión",
"login.code.label.password-reset": "Código de restablecimiento de contraseña",
"login.code.placeholder.email": "000 000",
"login.code.text.email": "If your email address is registered, the requested code was sent via email.",
"login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.",
"login.email.login.subject": "Your login code",
"login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.",
"login.email.password-reset.subject": "Your password reset code",
"login.code.text.email": "Si tu dirección de correo electrónico está registrada, el código solicitado fue enviado por correo electrónico.",
"login.email.login.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.",
"login.email.login.subject": "Tu código de inicio de sesión",
"login.email.password-reset.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.",
"login.email.password-reset.subject": "Tu código de restablecimiento de contraseña",
"login.remember": "Mantener mi sesión iniciada",
"login.reset": "Reset password",
"login.toggleText.code.email": "Login via email",
"login.toggleText.code.email-password": "Login with password",
"login.toggleText.password-reset.email": "Forgot your password?",
"login.toggleText.password-reset.email-password": "← Back to login",
"login.reset": "Restablecer contraseña",
"login.toggleText.code.email": "Iniciar sesión por correo electrónico",
"login.toggleText.code.email-password": "Iniciar sesión con contraseña",
"login.toggleText.password-reset.email": "¿Olvidaste tu contraseña?",
"login.toggleText.password-reset.email-password": "← Volver al inicio de sesión",
"logout": "Cerrar sesi\u00f3n",
"logout": "Cerrar sesión",
"menu": "Menù",
"meridiem": "AM/PM",
@ -410,16 +416,16 @@
"off": "Apagado",
"on": "Encendido",
"open": "Abrir",
"open.newWindow": "Open in new window",
"open.newWindow": "Abrir en una ventana nueva",
"options": "Opciones",
"options.none": "No options",
"options.none": "Sin opciones",
"orientation": "Orientación",
"orientation.landscape": "Paisaje",
"orientation.portrait": "Retrato",
"orientation.square": "Diapositiva",
"page.blueprint": "This page has no blueprint yet. You can define the setup in <strong>/site/blueprints/pages/{blueprint}.yml</strong>",
"page.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en <strong>/site/blueprints/pages/{blueprint}.yml</strong>",
"page.changeSlug": "Cambiar URL",
"page.changeSlug.fromTitle": "Crear a partir del t\u00edtulo",
"page.changeStatus": "Cambiar estado",
@ -433,10 +439,10 @@
"page.duplicate.appendix": "Copiar",
"page.duplicate.files": "Copiar archivos",
"page.duplicate.pages": "Copiar páginas",
"page.sort": "Change position",
"page.sort": "Cambiar posición",
"page.status": "Estado",
"page.status.draft": "Borrador",
"page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link",
"page.status.draft.description": "La página está en modo borrador y solo es visible para editores conectados o mediante enlace secreto.",
"page.status.listed": "Pública",
"page.status.listed.description": "La página es pública para cualquiera",
"page.status.unlisted": "No publicada",
@ -451,19 +457,19 @@
"pagination.page": "Página",
"password": "Contrase\u00f1a",
"paste": "Paste",
"paste.after": "Paste after",
"paste": "Pegar",
"paste.after": "Pegar después",
"pixel": "Pixel",
"plugin": "Plugin",
"plugins": "Plugins",
"prev": "Anterior",
"preview": "Preview",
"preview": "Previsualizar",
"remove": "Eliminar",
"rename": "Renombrar",
"replace": "Reemplazar",
"retry": "Reintentar",
"revert": "Revertir",
"revert.confirm": "Do you really want to <strong>delete all unsaved changes</strong>?",
"revert.confirm": "¿Realmente quieres <strong>eliminar todos los cambios sin guardar</strong>?",
"role": "Rol",
"role.admin.description": "El administrador tiene todos los derechos",
@ -476,42 +482,42 @@
"save": "Guardar",
"search": "Buscar",
"search.min": "Enter {min} characters to search",
"search.all": "Show all",
"search.results.none": "No results",
"search.min": "Introduce {min} caracteres para buscar",
"search.all": "Mostrar todo",
"search.results.none": "Sin resultados",
"section.required": "Esta sección es requerida",
"security": "Security",
"security": "Seguridad",
"select": "Seleccionar",
"server": "Server",
"server": "Servidor",
"settings": "Ajustes",
"show": "Show",
"site.blueprint": "The site has no blueprint yet. You can define the setup in <strong>/site/blueprints/site.yml</strong>",
"show": "Mostrar",
"site.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en <strong>/site/blueprints/site.yml</strong>",
"size": "Tamaño",
"slug": "Apéndice URL",
"sort": "Ordenar",
"stats.empty": "No reports",
"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.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",
"system.issues.debug": "Debugging must be turned off in production",
"system.issues.git": "The .git folder seems to be exposed",
"system.issues.https": "We recommend HTTPS for all your sites",
"system.issues.kirby": "The kirby folder seems to be exposed",
"system.issues.site": "The site folder seems to be exposed",
"system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }",
"system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }",
"system.updateStatus": "Update status",
"system.updateStatus.error": "Could not check for updates",
"system.updateStatus.not-vulnerable": "No known vulnerabilities",
"system.updateStatus.security-update": "Free security update { version } available",
"system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available",
"system.updateStatus.unreleased": "Unreleased version",
"system.updateStatus.up-to-date": "Up to date",
"system.updateStatus.update": "Free update { version } available",
"system.updateStatus.upgrade": "Upgrade { version } available",
"stats.empty": "Sin informes",
"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.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.debug": "La depuración debe estar desactivada en producción",
"system.issues.git": "La carpeta .git parece estar expuesta",
"system.issues.https": "Recomendamos HTTPS para todos tus sitios web",
"system.issues.kirby": "La carpeta kirby parece estar expuesta",
"system.issues.site": "La carpeta site parece estar expuesta",
"system.issues.vulnerability.kirby": "Tu instalación podría estar afectada por la siguiente vulnerabilidad ({ severity } gravedad): { description }",
"system.issues.vulnerability.plugin": "Tu instalación podría estar afectada por la siguiente vulnerabilidad en el plugin { plugin } ({ severity } gravedad): { description }",
"system.updateStatus": "Estado de actualización",
"system.updateStatus.error": "No se ha podido comprobar si hay actualizaciones",
"system.updateStatus.not-vulnerable": "No hay vulnerabilidades conocidas",
"system.updateStatus.security-update": "Actualización gratuita de seguridad { version } disponible",
"system.updateStatus.security-upgrade": "Actualización { versión } con correcciones de seguridad disponibles",
"system.updateStatus.unreleased": "Versión no publicada",
"system.updateStatus.up-to-date": "Actualizado",
"system.updateStatus.update": "Actualización gratuita {version} disponible",
"system.updateStatus.upgrade": "Actualización {versión} disponible",
"title": "Título",
"template": "Plantilla",
@ -532,10 +538,10 @@
"toolbar.button.file.select": "Selecciona un archivo",
"toolbar.button.file.upload": "Sube un archivo",
"toolbar.button.link": "Enlace",
"toolbar.button.paragraph": "Paragraph",
"toolbar.button.strike": "Strike-through",
"toolbar.button.paragraph": "Parágrafo",
"toolbar.button.strike": "Tachado",
"toolbar.button.ol": "Lista en orden",
"toolbar.button.underline": "Underline",
"toolbar.button.underline": "Subrayado",
"toolbar.button.ul": "Lista de viñetas",
"translation.author": "Equipo Kirby",
@ -562,7 +568,7 @@
"url.placeholder": "https://ejemplo.com",
"user": "Usuario",
"user.blueprint": "You can define additional sections and form fields for this user role in <strong>/site/blueprints/users/{blueprint}.yml</strong>",
"user.blueprint": "Puedes definir secciones y campos de formulario adicionales para este rol de usuario en <strong>/site/blueprints/users/{blueprint}.yml</strong>",
"user.changeEmail": "Cambiar correo electrónico",
"user.changeLanguage": "Cambiar idioma",
"user.changeName": "Renombrar este usuario",
@ -578,19 +584,19 @@
"users": "Usuarios",
"version": "Versión",
"version.current": "Current version",
"version.latest": "Latest version",
"versionInformation": "Version information",
"version.current": "Versión actual",
"version.latest": "Última versión",
"versionInformation": "información sobre la versión",
"view.account": "Tu cuenta",
"view.installation": "Instalaci\u00f3n",
"view.languages": "Idiomas",
"view.resetPassword": "Reset password",
"view.resetPassword": "Restablecer contraseña",
"view.site": "Sitio",
"view.system": "System",
"view.system": "Sistema",
"view.users": "Usuarios",
"welcome": "Bienvenido",
"year": "Año",
"yes": "yes"
"yes": ""
}

View file

@ -1,6 +1,6 @@
{
"account.changeName": "Cambia tu nombre",
"account.delete": "Borrar tu cuenta",
"account.changeName": "Cambiar nombre",
"account.delete": "Borrar cuenta",
"account.delete.confirm": "¿Realmente quieres eliminar tu cuenta? Tu sesión se cerrará inmediatamente. La cuenta no podrá ser recuperada.",
"add": "Añadir",
@ -12,7 +12,7 @@
"close": "Cerrar",
"confirm": "Confirmar",
"collapse": "Colapsar",
"collapse.all": "Colapsar todos",
"collapse.all": "Colapsar todo",
"copy": "Copiar",
"copy.all": "Copiar todo",
"create": "Crear",
@ -29,14 +29,14 @@
"days.tue": "Ma",
"days.wed": "Mi",
"debugging": "Debugging",
"debugging": "Depuración",
"delete": "Borrar",
"delete.all": "Eliminar todos",
"delete": "Eliminar",
"delete.all": "Eliminar todo",
"dialog.files.empty": "No se ha seleccionado ningún archivo",
"dialog.pages.empty": "No se ha seleccionado ninguna página",
"dialog.users.empty": "No se ha seleccionado ningún usuario",
"dialog.files.empty": "No hay archivos para seleccionar",
"dialog.pages.empty": "No hay páginas para seleccionar",
"dialog.users.empty": "No hay usuarios para seleccionar",
"dimensions": "Dimensiones",
"disabled": "Desabilitado",
@ -49,19 +49,19 @@
"email": "Correo electrónico",
"email.placeholder": "correo@ejemplo.com",
"entries": "Entries",
"entry": "Entry",
"entries": "Entradas",
"entry": "Entrada",
"environment": "Ambiente",
"environment": "Entorno",
"error.access.code": "Código inválido",
"error.access.login": "Ingreso inválido",
"error.access.panel": "No estás autorizado para acceder al panel",
"error.access.login": "Inicio de sesión inválido",
"error.access.panel": "No tienes permiso para acceder al panel",
"error.access.view": "No tienes permiso para acceder a esta parte del panel",
"error.avatar.create.fail": "No se pudo subir la foto de perfil.",
"error.avatar.delete.fail": "No se pudo borrar la foto de perfil",
"error.avatar.dimensions.invalid": "Por favor, mantenga el ancho y la altura de la imagen de perfil debajo de 3000 píxeles",
"error.avatar.dimensions.invalid": "Por favor, mantén el ancho y la altura de la imagen de perfil por debajo de 3000 píxeles",
"error.avatar.mime.forbidden": "La imagen del perfil debe ser JPEG o PNG.",
"error.blueprint.notFound": "El blueprint \"{name}\" no pudo ser cargado",
@ -70,86 +70,89 @@
"error.blocks.max.singular": "No debes añadir más de un bloque",
"error.blocks.min.plural": "Debes añadir al menos {min} bloques ",
"error.blocks.min.singular": "Debes añadir al menos un bloque",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.blocks.validation": "Hay un error en el campo \"{field}\" del bloque {index} que utiliza el tipo de bloque \"{fieldset}\"",
"error.email.preset.notFound": "El preset del correo \"{name}\" no pudo ser encontrado",
"error.cache.type.invalid": "Tipo de caché inválido \"{tipo}\"",
"error.email.preset.notFound": "El preset del correo \"{name}\" no puede ser encontrado",
"error.field.converter.invalid": "Convertidor \"{converter}\" inválido",
"error.field.type.missing": "Campo \"{ name }\": El tipo de campo \"{ type }\" no existe",
"error.file.changeName.empty": "El nombre no debe estar vacío",
"error.file.changeName.permission": "No tienes permitido cambiar el nombre de \"{filename}\"",
"error.file.changeName.permission": "No tienes permiso para cambiar el nombre de \"{filename}\"",
"error.file.duplicate": "Ya existe un archivo con el nombre \"{filename}\"",
"error.file.extension.forbidden": "La extensión \"{extension}\" no está permitida",
"error.file.extension.invalid": "Extensión inválida: {extension}",
"error.file.extension.missing": "Falta la extensión para \"{filename}\"",
"error.file.maxheight": "La altura de la imagen no debe exceder {height} pixeles",
"error.file.maxsize": "El archivo es muy grande",
"error.file.maxsize": "El archivo es demasiado grande",
"error.file.maxwidth": "El ancho de la imagen no debe exceder {width} pixeles",
"error.file.mime.differs": "El archivo cargado debe ser del mismo tipo mime \"{mime}\"",
"error.file.mime.forbidden": "Los medios tipo \"{mime}\" no están permitidos",
"error.file.mime.invalid": "Tipo invalido de mime: {mime}",
"error.file.mime.missing": "El tipo de medio para \"{filename}\" no pudo ser detectado",
"error.file.mime.invalid": "Tipo de mime inválido: {mime}",
"error.file.mime.missing": "El tipo de medio para \"{filename}\" no puede ser detectado",
"error.file.minheight": "La altura de la imagen debe ser de al menos {height} pixeles",
"error.file.minsize": "El archivo es muy pequeño",
"error.file.minsize": "El archivo es demasiado pequeño",
"error.file.minwidth": "El ancho de la imagen debe ser de al menos {width} pixeles",
"error.file.name.missing": "El nombre de archivo no debe estar vacío",
"error.file.notFound": "El archivo \"{filename}\" no pudo ser encontrado",
"error.file.orientation": "The orientation of the image must be \"{orientation}\"",
"error.file.type.forbidden": "No está permitido subir archivos {type}",
"error.file.notFound": "El archivo \"{filename}\" no puede ser encontrado",
"error.file.orientation": "La orientación de la imagen debe ser \"{orientation}",
"error.file.type.forbidden": "No tienes permiso para subir archivos {type}",
"error.file.type.invalid": "Tipo de archivo inválido: {type}",
"error.file.undefined": "El archivo no pudo ser encontrado",
"error.file.undefined": "El archivo no puede ser encontrado",
"error.form.incomplete": "Por favor, corrija todos los errores del formulario…",
"error.form.incomplete": "Por favor, corrige todos los errores del formulario…",
"error.form.notSaved": "El formulario no pudo ser guardado",
"error.language.code": "Por favor introduce un código válido para el idioma",
"error.language.code": "Por favor, introduce un código válido para el idioma",
"error.language.duplicate": "El idioma ya existe",
"error.language.name": "Por favor introduce un nombre válido para el idioma",
"error.language.name": "Por favor, introduce un nombre válido para el idioma",
"error.language.notFound": "No se pudo encontrar el idioma",
"error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}",
"error.layout.validation.settings": "There's an error in layout {index} settings",
"error.layout.validation.block": "Hay un error en el campo \"{field}\" del bloque {blockIndex} que utiliza el tipo de bloque \"{fieldset}\" en el layout {layoutIndex}",
"error.layout.validation.settings": "Hay un error en los ajustes del layout {index}",
"error.license.format": "Por favor introduce una llave de licencia válida",
"error.license.format": "Por favor, introduce una llave de licencia válida",
"error.license.email": "Por favor, introduce un correo electrónico válido",
"error.license.verification": "La licencia no pude ser verificada",
"error.license.verification": "La licencia no pudo ser verificada",
"error.object.validation": "Theres an error in the \"{label}\" field:\n{message}",
"error.object.validation": "Hay un error en el campo \"{label}\":\n{message}",
"error.offline": "El Panel se encuentra fuera de linea ",
"error.offline": "El Panel se encuentra actualmente fuera de línea ",
"error.page.changeSlug.permission": "No está permitido cambiar el apéndice de URL para \"{slug}\"",
"error.page.changeSlug.permission": "No tienes permiso para cambiar el apéndice de URL para \"{slug}\"",
"error.page.changeStatus.incomplete": "La página tiene errores y no puede ser publicada.",
"error.page.changeStatus.permission": "El estado de esta página no se puede cambiar",
"error.page.changeStatus.toDraft.invalid": "La página \"{slug}\" no se puede convertir a borrador",
"error.page.changeTemplate.invalid": "La plantilla para la página \"{slug}\" no se puede cambiar",
"error.page.changeTemplate.permission": "No tienes permitido cambiar la plantilla para \"{slug}\"",
"error.page.changeTemplate.permission": "No tienes permiso para cambiar la plantilla para \"{slug}\"",
"error.page.changeTitle.empty": "El título no debe estar vacío.",
"error.page.changeTitle.permission": "No tienes permitido cambiar el título por \"{slug}\"",
"error.page.create.permission": "No tienes permitido crear \"{slug}\"",
"error.page.delete": "La página \"{slug}\" no puede ser eliminada",
"error.page.delete.confirm": "Por favor, introduzca el título de la página para confirmar",
"error.page.changeTitle.permission": "No tienes permiso para cambiar el título por \"{slug}\"",
"error.page.create.permission": "No tienes permiso para crear \"{slug}\"",
"error.page.delete": "La página \"{slug}\" no se puede eliminar",
"error.page.delete.confirm": "Por favor, introduce el título de la página para confirmar",
"error.page.delete.hasChildren": "La página tiene subpáginas y no se puede eliminar",
"error.page.delete.permission": "No tienes permiso de eliminar \"{slug}\"",
"error.page.delete.permission": "No tienes permiso para eliminar \"{slug}\"",
"error.page.draft.duplicate": "Un borrador de página con el apéndice de URL \"{slug}\" ya existe",
"error.page.duplicate": "Una página con el apéndice de URL. \"{slug}\" ya existe",
"error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"",
"error.page.notFound": "La página \"{slug}\" no puede ser encontrada",
"error.page.num.invalid": "Por favor, introduzca un número válido. Estos no deben ser negativos.",
"error.page.slug.invalid": "Please enter a valid URL appendix",
"error.page.slug.maxlength": "Slug length must be less than \"{length}\" characters",
"error.page.sort.permission": "La página \"{slug}\" no se puede ordenar",
"error.page.status.invalid": "Por favor, establezca un estado de página válido",
"error.page.undefined": "La página no se puede encontrar",
"error.page.update.permission": "No tienes permitido actualizar \"{slug}\"",
"error.page.duplicate": "Una página con el apéndice de URL \"{slug}\" ya existe",
"error.page.duplicate.permission": "No tienes permiso para duplicar \"{slug}\"",
"error.page.notFound": "No se puede encontrar la página \"{slug}\"",
"error.page.num.invalid": "Por favor, introduce un número de ordenación válido. Los números no deben ser negativos.",
"error.page.slug.invalid": "Por favor, introduce un apéndice de URL válido",
"error.page.slug.maxlength": "La longitud del slug debe ser inferior a \"{length}\" caracteres",
"error.page.sort.permission": "No se puede encontrar la página \"{slug}\"",
"error.page.status.invalid": "Por favor, establece un estado de página válido",
"error.page.undefined": "No se puede encontrar la página",
"error.page.update.permission": "No tienes permiso para actualizar \"{slug}\"",
"error.section.files.max.plural": "No debes agregar más de {max} archivos a la sección \"{section}\"",
"error.section.files.max.singular": "No debes agregar más de 1 archivo a la sección \"{section}\"",
"error.section.files.min.plural": "La sección \"{section}\" requiere al menos {min} archivos",
"error.section.files.min.singular": "La sección \"{section}\" requiere al menos un archivo",
"error.section.pages.max.plural": "No debe agregar más de {max} páginas a la sección \"{section}\"",
"error.section.pages.max.singular": "No debe agregar más de una página a la sección \"{section}\"",
"error.section.pages.max.plural": "No debes agregar más de {max} páginas a la sección \"{section}\"",
"error.section.pages.max.singular": "No debes agregar más de una página a la sección \"{section}\"",
"error.section.pages.min.plural": "La sección \"{section}\" requiere al menos {min} páginas",
"error.section.pages.min.singular": "La sección \"{section}\" requiere al menos una página",
@ -157,94 +160,94 @@
"error.section.type.invalid": "El sección tipo \"{tipo}\" no es válido",
"error.site.changeTitle.empty": "El título no debe estar vacío.",
"error.site.changeTitle.permission": "No está permitido cambiar el título del sitio",
"error.site.update.permission": "No tienes permitido actualizar el sitio",
"error.site.changeTitle.permission": "No tienes permiso para cambiar el título del sitio",
"error.site.update.permission": "No tienes permiso para actualizar el sitio",
"error.template.default.notFound": "La plantilla por defecto no existe",
"error.unexpected": "An unexpected error occurred! Enable debug mode for more info: https://getkirby.com/docs/reference/system/options/debug",
"error.unexpected": "¡Se ha producido un error inesperado! Activa el modo de depuración para obtener más información: https://getkirby.com/docs/reference/system/options/debug",
"error.user.changeEmail.permission": "No tienes permitido cambiar el correo electrónico para el usuario \"{name}\"",
"error.user.changeLanguage.permission": "No tienes permitido cambiar el idioma para el usuario \"{name}\"",
"error.user.changeName.permission": "No tienes permitido cambiar el nombre del usuario \"{name}\"",
"error.user.changePassword.permission": "No tienes permitido cambiar la contraseña del usuario \"{name}\"",
"error.user.changeRole.lastAdmin": "El rol para el último administrador no puede ser cambiado",
"error.user.changeRole.permission": "No tienes permitido cambiar el rol del usuario \"{name}\"",
"error.user.changeRole.toAdmin": "No tienes permitido promover a alguien al rol de admin",
"error.user.changeEmail.permission": "No tienes permiso para cambiar el correo electrónico para el usuario \"{name}\"",
"error.user.changeLanguage.permission": "No tienes permiso para cambiar el idioma para el usuario \"{name}\"",
"error.user.changeName.permission": "No tienes permiso para cambiar el nombre del usuario \"{name}\"",
"error.user.changePassword.permission": "No tienes permiso para cambiar la contraseña del usuario \"{name}\"",
"error.user.changeRole.lastAdmin": "No se puede cambiar el rol del último administrador",
"error.user.changeRole.permission": "No tienes permiso para cambiar el rol del usuario \"{name}\"",
"error.user.changeRole.toAdmin": "No tienes permiso para promover a alguien al rol de admin",
"error.user.create.permission": "No tienes permiso para crear este usuario",
"error.user.delete": "El usuario \"{name}\" no puede ser eliminado",
"error.user.delete.lastAdmin": "El último administrador no puede ser eliminado",
"error.user.delete.lastUser": "El último usuario no puede ser eliminado",
"error.user.delete.permission": "No tienes permitido eliminar el usuario \"{name}\"",
"error.user.delete": "No se puede eliminar el usuario \"{name}\"",
"error.user.delete.lastAdmin": "No se puede eliminar el último admin",
"error.user.delete.lastUser": "No se puede eliminar el último usuario ",
"error.user.delete.permission": "No tienes permiso para eliminar el usuario \"{name}\"",
"error.user.duplicate": "Un usuario con la dirección de correo electrónico \"{email}\" ya existe",
"error.user.email.invalid": "Por favor, introduce una dirección de correo electrónico válida",
"error.user.language.invalid": "Por favor ingrese un idioma válido",
"error.user.notFound": "El usuario \"{name}\" no pudo ser encontrado",
"error.user.password.invalid": "Por favor introduce una contraseña válida. Las contraseñas deben tener al menos 8 caracteres de largo.",
"error.user.language.invalid": "Por favor, introduce un idioma válido",
"error.user.notFound": "No se puede encontrar el usuario \"{name}\"",
"error.user.password.invalid": "Por favor, introduce una contraseña válida. Las contraseñas deben tener al menos 8 caracteres de largo.",
"error.user.password.notSame": "Las contraseñas no coinciden",
"error.user.password.undefined": "El usuario no tiene contraseña",
"error.user.password.wrong": "Contraseña incorrecta",
"error.user.role.invalid": "Por favor ingrese un rol válido",
"error.user.undefined": "El usuario no puede ser encontrado",
"error.user.update.permission": "No tienes permitido actualizar al usuario \"{name}\"",
"error.user.role.invalid": "Por favor, introduce un rol válido",
"error.user.undefined": "No se puede encontrar el usuario",
"error.user.update.permission": "No tienes permiso para actualizar el usuario \"{name}\"",
"error.validation.accepted": "Por favor, confirma",
"error.validation.alpha": "Por favor solo ingresa caracteres entre a-z",
"error.validation.alphanum": "Por favor solo ingrese caracteres entre a-z o numerales 0-9",
"error.validation.between": "Por favor, introduzca un valor entre \"{min}\" y \"{max}\"",
"error.validation.boolean": "Por favor confirme o rechace",
"error.validation.contains": "Por favor ingrese un valor que contenga \"{needle}\"",
"error.validation.date": "Por favor introduzca una fecha valida",
"error.validation.date.after": "Por favor introduce una fecha posterior a {date}",
"error.validation.date.before": "Por favor introduce una fecha anterior a {date}",
"error.validation.date.between": "Por favor introduce un número entre {min} y {max}",
"error.validation.denied": "Por favor, rechace",
"error.validation.alpha": "Por favor, introduce solo caracteres entre a-z",
"error.validation.alphanum": "Por favor, introduce solo caracteres entre a-z o numerales 0-9",
"error.validation.between": "Por favor, introduce un valor entre \"{min}\" y \"{max}\"",
"error.validation.boolean": "Por favor, confirma o rechaza",
"error.validation.contains": "Por favor, introduce un valor que contenga \"{needle}\"",
"error.validation.date": "Por favor, introduce una fecha válida",
"error.validation.date.after": "Por favor, introduce una fecha posterior a {date}",
"error.validation.date.before": "Por favor, introduce una fecha anterior a {date}",
"error.validation.date.between": "Por favor, introduce un número entre {min} y {max}",
"error.validation.denied": "Por favor, rechaza",
"error.validation.different": "El valor no debe ser \"{other}\"",
"error.validation.email": "Por favor, introduce un correo electrónico válido",
"error.validation.endswith": "El valor debe terminar con \"{end}\"",
"error.validation.filename": "Por favor ingrese un nombre de archivo válido",
"error.validation.in": "Por favor ingrese uno de los siguientes: ({in})",
"error.validation.filename": "Por favor, introduce un nombre de archivo válido",
"error.validation.in": "Por favor, introduce uno de los siguientes: ({in})",
"error.validation.integer": "Por favor, introduce un numero integro válido",
"error.validation.ip": "Por favor ingrese una dirección IP válida",
"error.validation.less": "Por favor, introduzca un valor inferior a {max}",
"error.validation.ip": "Por favor, introduce una dirección IP válida",
"error.validation.less": "Por favor, introduce un valor inferior a {max}",
"error.validation.match": "El valor no coincide con el patrón esperado",
"error.validation.max": "Por favor, introduzca un valor igual o inferior a {max}",
"error.validation.maxlength": "Por favor, introduzca un valor más corto. (max. {max} caracteres)",
"error.validation.maxwords": "Por favor ingrese no más de {max} palabra(s)",
"error.validation.min": "Por favor, introduzca un valor igual o mayor a {min}",
"error.validation.minlength": "Por favor, introduzca un valor más largo. (min. {min} caracteres)",
"error.validation.minwords": "Por favor ingrese al menos {min} palabra(s)",
"error.validation.more": "Por favor, introduzca un valor mayor a {min}",
"error.validation.notcontains": "Por favor ingrese un valor que no contenga \"{needle}\"",
"error.validation.notin": "Por favor, no ingrese ninguno de los siguientes: ({notIn})",
"error.validation.option": "Por favor seleccione una opción válida",
"error.validation.num": "Por favor ingrese un número valido",
"error.validation.required": "Por favor ingrese algo",
"error.validation.same": "Por favor escribe \"{other}\"",
"error.validation.max": "Por favor, introduce un valor igual o inferior a {max}",
"error.validation.maxlength": "Por favor, introduce un valor más corto. (max. {max} caracteres)",
"error.validation.maxwords": "Por favor, introduce no más de {max} palabra(s)",
"error.validation.min": "Por favor, introduce un valor igual o mayor a {min}",
"error.validation.minlength": "Por favor, introduce un valor más largo. (min. {min} caracteres)",
"error.validation.minwords": "Por favor, introduce al menos {min} palabra(s)",
"error.validation.more": "Por favor, introduce un valor mayor a {min}",
"error.validation.notcontains": "Por favor, introduce un valor que no contenga \"{needle}\"",
"error.validation.notin": "Por favor, no introduzcas ninguno de los siguientes: ({notIn})",
"error.validation.option": "Por favor, selecciona una opción válida",
"error.validation.num": "Por favor, introduce un número valido",
"error.validation.required": "Por favor, introduce algo",
"error.validation.same": "Por favor, introduce \"{other}\"",
"error.validation.size": "El tamaño del valor debe ser \"{size}\"",
"error.validation.startswith": "El valor debe comenzar con \"{start}\"",
"error.validation.time": "Por favor ingrese una hora válida",
"error.validation.time.after": "Por favor ingresa una fecha después de {time}",
"error.validation.time.before": "Por favor ingresa una fecha antes de {time}",
"error.validation.time.between": "Por favor ingresa un fecha entre {min} y {max}",
"error.validation.url": "Por favor introduzca un URL válido",
"error.validation.time": "Por favor, introduce una hora válida",
"error.validation.time.after": "Por favor, introduce una fecha después de {time}",
"error.validation.time.before": "Por favor, introduce una fecha antes de {time}",
"error.validation.time.between": "Por favor, introduce un fecha entre {min} y {max}",
"error.validation.url": "Por favor, introduce un URL válido",
"expand": "Expandir",
"expand.all": "Expandir todo",
"field.required": "Este campo es requerido",
"field.required": "Este campo es obligatorio",
"field.blocks.changeType": "Cambiar tipo",
"field.blocks.code.name": "Código",
"field.blocks.code.language": "Idioma",
"field.blocks.code.placeholder": "Tu código...",
"field.blocks.delete.confirm": "¿Seguro que quieres eliminar este bloque?",
"field.blocks.delete.confirm.all": "¿Seguro que quieres eliminar todos los bloques?",
"field.blocks.delete.confirm.selected": "¿Seguro que quieres eliminar los bloques seleccionados?",
"field.blocks.empty": "No hay bloques aún",
"field.blocks.fieldsets.label": "Por favor selecciona un tipo de bloque...",
"field.blocks.delete.confirm": "¿Realmente quieres eliminar este bloque?",
"field.blocks.delete.confirm.all": "¿Realmente quieres eliminar todos los bloques?",
"field.blocks.delete.confirm.selected": "¿Realmente quieres eliminar los bloques seleccionados?",
"field.blocks.empty": "Aún no hay bloques",
"field.blocks.fieldsets.label": "Por favor, selecciona un tipo de bloque...",
"field.blocks.fieldsets.paste": "Presiona <kbd>{{ shortcut }}</kbd>para pegar/importar bloques en tu portapapeles ",
"field.blocks.gallery.name": "Galería",
"field.blocks.gallery.images.empty": "No hay imágenes aún",
"field.blocks.gallery.images.empty": "Aún no hay imágenes",
"field.blocks.gallery.images.label": "Imágenes",
"field.blocks.heading.level": "Nivel",
"field.blocks.heading.name": "Encabezado",
@ -267,91 +270,94 @@
"field.blocks.quote.name": "Cita",
"field.blocks.quote.text.label": "Texto",
"field.blocks.quote.text.placeholder": "Cita...",
"field.blocks.quote.citation.label": "Citation",
"field.blocks.quote.citation.label": "Cita",
"field.blocks.quote.citation.placeholder": "Por ...",
"field.blocks.text.name": "Texto",
"field.blocks.text.placeholder": "Text",
"field.blocks.text.placeholder": "Texto ...",
"field.blocks.video.caption": "Leyenda",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.placeholder": "Introduce la URL de un vídeo",
"field.blocks.video.url.label": "Vídeo-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
"field.files.empty": "Aún no hay archivos seleccionados",
"field.layout.delete": "Delete layout",
"field.layout.delete.confirm": "Do you really want to delete this layout?",
"field.layout.empty": "No rows yet",
"field.layout.select": "Select a layout",
"field.layout.delete": "Eliminar layout",
"field.layout.delete.confirm": "¿Realmente quieres eliminar este layout?",
"field.layout.empty": "Aún no hay filas",
"field.layout.select": "Seleccionar layout",
"field.object.empty": "No information yet",
"field.object.empty": "Aún no hay información",
"field.pages.empty": "Aún no hay páginas seleccionadas",
"field.structure.delete.confirm": "¿Realmente quieres eliminar esta fila?",
"field.structure.delete.confirm.all": "¿Realmente quieres eliminar todas las entradas?",
"field.structure.empty": "Aún no hay entradas",
"field.users.empty": "Aún no hay usuarios seleccionados",
"file.blueprint": "This file has no blueprint yet. You can define the setup in <strong>/site/blueprints/files/{blueprint}.yml</strong>",
"file.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en <strong>/site/blueprints/files/{blueprint}.yml</strong>",
"file.delete.confirm": "¿Realmente quieres eliminar <br><strong>{filename}</strong>?",
"file.sort": "Change position",
"file.sort": "Cambiar posición",
"files": "Archivos",
"files.empty": "Aún no hay archivos",
"hide": "Hide",
"hide": "Ocultar",
"hour": "Hora",
"import": "Import",
"import": "Importar",
"info": "Info",
"insert": "Insertar",
"insert.after": "Insert after",
"insert.before": "Insert before",
"insert.after": "Insertar después",
"insert.before": "Insertar antes",
"install": "Instalar",
"installation": "Instalación",
"installation.completed": "El panel ha sido instalado",
"installation.disabled": "El instalador del panel está deshabilitado en servidores públicos por defecto. Ejecute el instalador en una máquina local o habilítelo con la opción <code>panel.install</code>.",
"installation.disabled": "El instalador del panel está deshabilitado en servidores públicos por defecto. Por favor, ejecuta el instalador en una máquina local o habilítalo con la opción <code>panel.install</code>.",
"installation.issues.accounts": "La carpeta <code>/site/accounts</code> no existe o no se puede escribir",
"installation.issues.content": "La carpeta <code>/content</code> no existe o no se puede escribir",
"installation.issues.curl": "La extensión <code>CURL</code> es requerida",
"installation.issues.headline": "No se pudo instalar el panel",
"installation.issues.headline": "No se puede instalar el panel",
"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.php": "Asegúrate de usar <code>PHP 7+</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",
"language": "Idioma",
"language.code": "Código",
"language.convert": "Hacer por defecto",
"language.convert.confirm": "<p¿Realmente quieres convertir <strong>{name}</strong> al idioma por defecto? Esto no se puede deshacer.</p><p>Si <strong>{name}</strong> tiene contenido sin traducir, ya no habrá un respaldo válido y algunas partes de su sitio podrían estar vacías.</p>",
"language.convert.confirm": "<p>¿Realmente quieres convertir <strong>{name}</strong> al idioma por defecto? Esto no se puede deshacer.</p><p>Si <strong>{name}</strong> tiene contenido sin traducir, ya no habrá un respaldo válido y algunas partes de tu sitio podrían estar vacías.</p>",
"language.create": "Añadir un nuevo idioma",
"language.delete.confirm": "¿De verdad quieres eliminar el idioma <strong>{name}</strong> incluyendo todas las traducciones? ¡Esto no se puede deshacer!",
"language.delete.confirm": "¿Realmente quieres eliminar el idioma <strong>{name}</strong> incluyendo todas las traducciones? ¡Esto no se puede deshacer!",
"language.deleted": "El idioma ha sido eliminado",
"language.direction": "Leyendo dirección",
"language.direction.ltr": "De izquierda a derecha",
"language.direction.rtl": "De derecha a izquierda",
"language.locale": "PHP locale string",
"language.locale.warning": "Estas utilizando un configuración local. Por favor modifícalo en el archivo del lenguaje en /site/languages",
"language.locale.warning": "Estás utilizando una configuración local. Por favor, modifícalo en el archivo del lenguaje en /site/languages",
"language.name": "Nombre",
"language.updated": "El idioma ha sido actualizado",
"languages": "Idiomas",
"languages.default": "Idioma predeterminado",
"languages.empty": "Todavía no hay idiomas",
"languages.empty": "Aún no hay idiomas",
"languages.secondary": "Idiomas secundarios",
"languages.secondary.empty": "Todavía no hay idiomas secundarios",
"languages.secondary.empty": "Aún no hay idiomas secundarios",
"license": "Licencia",
"license.buy": "Comprar una licencia",
"license.register": "Registro",
"license.manage": "Manage your licenses",
"license.register.help": "Recibió su código de licencia después de la compra por correo electrónico. Por favor copie y pegue para registrarse.",
"license.register.label": "Por favor ingrese su código de licencia",
"license.manage": "Gestiona licencias",
"license.register.help": "Recibiste tu código de licencia tras la compra por correo electrónico. Por favor, copia y pega para registrarte.",
"license.register.label": "Por favor, introduce tu código de licencia",
"license.register.domain": "Tu licencia será registrada para <strong>{host}</strong>.",
"license.register.local": "Estás a punto de registrar tu licencia para el dominio local <strong>{host}</strong>. Si este sitio va a ser desplegado en un dominio público, por favor regístralo allí. Si {host} es el dominio en el que quiere registrar Kirby, por favor continúa.",
"license.register.success": "Gracias por apoyar a Kirby",
"license.unregistered": "Esta es una demo no registrada de Kirby",
"license.unregistered.label": "Unregistered",
"license.unregistered.label": "No registrado",
"link": "Enlace",
"link.text": "Texto del enlace",
@ -367,20 +373,20 @@
"lock.isUnlocked": "Tus cambios sin guardar han sido sobrescritos por otro usuario. Puedes descargar los cambios y fusionarlos manualmente.",
"login": "Iniciar sesión",
"login.code.label.login": "Login code",
"login.code.label.password-reset": "Password reset code",
"login.code.label.login": "Código de inicio de sesión",
"login.code.label.password-reset": "Código de restablecimiento de contraseña",
"login.code.placeholder.email": "000 000",
"login.code.text.email": "If your email address is registered, the requested code was sent via email.",
"login.email.login.body": "Hi {user.nameOrEmail},\n\nYou recently requested a login code for the Panel of {site}.\nThe following login code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a login code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.",
"login.email.login.subject": "Your login code",
"login.email.password-reset.body": "Hi {user.nameOrEmail},\n\nYou recently requested a password reset code for the Panel of {site}.\nThe following password reset code will be valid for {timeout} minutes:\n\n{code}\n\nIf you did not request a password reset code, please ignore this email or contact your administrator if you have questions.\nFor security, please DO NOT forward this email.",
"login.email.password-reset.subject": "Your password reset code",
"login.code.text.email": "Si tu dirección de correo electrónico está registrada, el código solicitado fue enviado por correo electrónico.",
"login.email.login.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.",
"login.email.login.subject": "Tu código de inicio de sesión",
"login.email.password-reset.body": "Hola {user.nameOrEmail},\n\nHas pedido, recientemente, un código de restablecimiento de contraseña para el Panel del sitio {site}.\nEl siguiente código de restablecimiento de contraseña será válido por {timeout} minutos:\n\n{code}\n\nSi no pediste un código de restablecimiento de contraseña, por favor ignora este correo o contacta a tu administrador si tienes dudas.\nPor seguridad, por favor NO reenvíes este correo.",
"login.email.password-reset.subject": "Tu código de restablecimiento de contraseña",
"login.remember": "Mantener sesión iniciada",
"login.reset": "Reset password",
"login.toggleText.code.email": "Login via email",
"login.toggleText.code.email-password": "Login with password",
"login.toggleText.password-reset.email": "Forgot your password?",
"login.toggleText.password-reset.email-password": "← Back to login",
"login.reset": "Restablecer contraseña",
"login.toggleText.code.email": "Iniciar sesión por correo electrónico",
"login.toggleText.code.email-password": "Iniciar sesión con contraseña",
"login.toggleText.password-reset.email": "¿Olvidaste tu contraseña?",
"login.toggleText.password-reset.email-password": "← Volver al inicio de sesión",
"logout": "Cerrar sesión",
@ -410,34 +416,34 @@
"off": "Apagado",
"on": "Encendido",
"open": "Abrir",
"open.newWindow": "Open in new window",
"open.newWindow": "Abrir en una ventana nueva",
"options": "Opciones",
"options.none": "No options",
"options.none": "Sin opciones",
"orientation": "Orientación",
"orientation.landscape": "Paisaje",
"orientation.portrait": "Retrato",
"orientation.square": "Cuadrado",
"page.blueprint": "This page has no blueprint yet. You can define the setup in <strong>/site/blueprints/pages/{blueprint}.yml</strong>",
"page.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en <strong>/site/blueprints/pages/{blueprint}.yml</strong>",
"page.changeSlug": "Cambiar URL",
"page.changeSlug.fromTitle": "Crear en base al título",
"page.changeStatus": "Cambiar estado",
"page.changeStatus.position": "Por favor seleccione una posición",
"page.changeStatus.select": "Seleccione un nuevo estado",
"page.changeStatus.position": "Por favor, selecciona una posición",
"page.changeStatus.select": "Selecciona un nuevo estado",
"page.changeTemplate": "Cambiar plantilla",
"page.delete.confirm": "¿Realmente quieres eliminar <strong>{title}</strong>?",
"page.delete.confirm.subpages": "<strong>Esta página tiene subpáginas</strong>. <br>Todas las subpáginas también serán eliminadas.",
"page.delete.confirm.title": "Introduzca el título de la página para confirmar",
"page.delete.confirm.title": "Introduce el título de la página para confirmar",
"page.draft.create": "Crear borrador",
"page.duplicate.appendix": "Copiar",
"page.duplicate.files": "Copiar archivos",
"page.duplicate.pages": "Copiar páginas",
"page.sort": "Change position",
"page.sort": "Cambiar posición",
"page.status": "Estado",
"page.status.draft": "Borrador",
"page.status.draft.description": "The page is in draft mode and only visible for logged in editors or via secret link",
"page.status.listed": "Publica",
"page.status.draft.description": "La página está en modo borrador y solo es visible para editores conectados o mediante enlace secreto.",
"page.status.listed": "Pública",
"page.status.listed.description": "La página es pública para cualquiera",
"page.status.unlisted": "Sin publicar",
"page.status.unlisted.description": "La página solo es accesible vía URL",
@ -451,24 +457,24 @@
"pagination.page": "Página",
"password": "Contraseña",
"paste": "Paste",
"paste.after": "Paste after",
"paste": "Pegar",
"paste.after": "Pegar después",
"pixel": "Pixel",
"plugin": "Plugin",
"plugins": "Plugins",
"prev": "Anterior",
"preview": "Preview",
"preview": "Previsualizar",
"remove": "Eliminar",
"rename": "Renombrar",
"replace": "Remplazar",
"retry": "Inténtalo de nuevo",
"revert": "Revertir",
"revert.confirm": "Do you really want to <strong>delete all unsaved changes</strong>?",
"revert.confirm": "¿Realmente quieres <strong>eliminar todos los cambios sin guardar</strong>?",
"role": "Rol",
"role.admin.description": "El administrador tiene todos los derechos",
"role.admin.title": "Administrador",
"role.all": "Todos",
"role.all": "Todo",
"role.empty": "No hay usuarios con este rol",
"role.description.placeholder": "Sin descripción",
"role.nobody.description": "Este es un rol alternativo sin permisos",
@ -476,49 +482,49 @@
"save": "Guardar",
"search": "Buscar",
"search.min": "Enter {min} characters to search",
"search.all": "Show all",
"search.results.none": "No results",
"search.min": "Introduce {min} caracteres para buscar",
"search.all": "Mostrar todo",
"search.results.none": "Sin resultados",
"section.required": "Esta sección es requerida",
"section.required": "Esta sección es obligatoria",
"security": "Security",
"security": "Seguridad",
"select": "Seleccionar",
"server": "Server",
"server": "Servidor",
"settings": "Ajustes",
"show": "Show",
"site.blueprint": "The site has no blueprint yet. You can define the setup in <strong>/site/blueprints/site.yml</strong>",
"show": "Mostrar",
"site.blueprint": "Este archivo aún no tiene blueprint. Puedes definir la configuración en <strong>/site/blueprints/site.yml</strong>",
"size": "Tamaño",
"slug": "Apéndice URL",
"slug": "Apéndice de URL",
"sort": "Ordenar",
"stats.empty": "No reports",
"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.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",
"system.issues.debug": "Debugging must be turned off in production",
"system.issues.git": "The .git folder seems to be exposed",
"system.issues.https": "We recommend HTTPS for all your sites",
"system.issues.kirby": "The kirby folder seems to be exposed",
"system.issues.site": "The site folder seems to be exposed",
"system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }",
"system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }",
"system.updateStatus": "Update status",
"system.updateStatus.error": "Could not check for updates",
"system.updateStatus.not-vulnerable": "No known vulnerabilities",
"system.updateStatus.security-update": "Free security update { version } available",
"system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available",
"system.updateStatus.unreleased": "Unreleased version",
"system.updateStatus.up-to-date": "Up to date",
"system.updateStatus.update": "Free update { version } available",
"system.updateStatus.upgrade": "Upgrade { version } available",
"stats.empty": "Sin informes",
"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.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.debug": "La depuración debe estar desactivada en producción",
"system.issues.git": "La carpeta .git parece estar expuesta",
"system.issues.https": "Recomendamos HTTPS para todos tus sitios web",
"system.issues.kirby": "La carpeta kirby parece estar expuesta",
"system.issues.site": "La carpeta site parece estar expuesta",
"system.issues.vulnerability.kirby": "Tu instalación podría estar afectada por la siguiente vulnerabilidad ({ severity } gravedad): { description }",
"system.issues.vulnerability.plugin": "Tu instalación podría estar afectada por la siguiente vulnerabilidad en el plugin { plugin } ({ severity } gravedad): { description }",
"system.updateStatus": "Estado de actualización",
"system.updateStatus.error": "No se pudo comprobar si hay actualizaciones",
"system.updateStatus.not-vulnerable": "Sin vulnerabilidades conocidas",
"system.updateStatus.security-update": "Actualización gratuita de seguridad { version } disponible",
"system.updateStatus.security-upgrade": "Actualización { versión } con correcciones de seguridad disponibles",
"system.updateStatus.unreleased": "Versión no publicada",
"system.updateStatus.up-to-date": "Actualizado",
"system.updateStatus.update": "Actualización gratuita {version} disponible",
"system.updateStatus.upgrade": "Actualización {versión} disponible",
"title": "Titulo",
"title": "Título",
"template": "Plantilla",
"today": "Hoy",
"toolbar.button.code": "Código",
"toolbar.button.bold": "Negritas",
"toolbar.button.bold": "Negrita",
"toolbar.button.email": "Correo electrónico",
"toolbar.button.headings": "Encabezados",
"toolbar.button.heading.1": "Encabezado 1",
@ -529,13 +535,13 @@
"toolbar.button.heading.6": "Encabezado 6",
"toolbar.button.italic": "Italica",
"toolbar.button.file": "Archivo",
"toolbar.button.file.select": "Seleccione un archivo",
"toolbar.button.file.upload": "Sube un archivo",
"toolbar.button.file.select": "Seleccionar un archivo",
"toolbar.button.file.upload": "Subir un archivo",
"toolbar.button.link": "Enlace",
"toolbar.button.paragraph": "Paragraph",
"toolbar.button.strike": "Strike-through",
"toolbar.button.paragraph": "Parágrafo",
"toolbar.button.strike": "Tachado",
"toolbar.button.ol": "Lista ordenada",
"toolbar.button.underline": "Underline",
"toolbar.button.underline": "Subrayado",
"toolbar.button.ul": "Lista de viñetas",
"translation.author": "Turqueso",
@ -544,15 +550,15 @@
"translation.locale": "es_ES",
"upload": "Subir",
"upload.error.cantMove": "El archivo subido no puede ser movido",
"upload.error.cantMove": "El archivo subido no pudo ser movido",
"upload.error.cantWrite": "Error al escribir el archivo en el disco",
"upload.error.default": "El archivo no pudo ser subido",
"upload.error.extension": "Subida de archivo detenida por la extensión",
"upload.error.formSize": "El archivo subido excede la directiva MAX_FILE_SIZE que fue especificada en el formulario",
"upload.error.iniPostSize": "El archivo subido excede la directiva post_max_size directive en php.ini",
"upload.error.iniSize": "El archivo subido excede la directiva upload_max_filesize en php.ini",
"upload.error.noFile": "Ningún archivo ha sido subido",
"upload.error.noFiles": "Ningún archivo ha sido subido",
"upload.error.noFile": "No se ha subido ningún archivo",
"upload.error.noFiles": "No se ha subido ningún archivo",
"upload.error.partial": "El archivo ha sido subido solo parcialmente",
"upload.error.tmpDir": "No se encuentra la carpeta temporal",
"upload.errors": "Error",
@ -562,15 +568,15 @@
"url.placeholder": "https://ejemplo.com",
"user": "Usuario",
"user.blueprint": "You can define additional sections and form fields for this user role in <strong>/site/blueprints/users/{blueprint}.yml</strong>",
"user.blueprint": "Puedes definir secciones y campos de formulario adicionales para este rol de usuario en <strong>/site/blueprints/users/{blueprint}.yml</strong>",
"user.changeEmail": "Cambiar correo electrónico",
"user.changeLanguage": "Cambiar idioma",
"user.changeName": "Renombrar a este usuario",
"user.changePassword": "Cambia contraseña",
"user.changePassword": "Cambiar contraseña",
"user.changePassword.new": "Nueva contraseña",
"user.changePassword.new.confirm": "Confirmar nueva contraseña…",
"user.changeRole": "Cambiar rol",
"user.changeRole.select": "Seleccione un nuevo rol",
"user.changeRole.select": "Seleccionar un nuevo rol",
"user.create": "Añadir un nuevo usuario",
"user.delete": "Eliminar este usuario",
"user.delete.confirm": "¿Realmente quieres eliminar <br><strong>{email}</strong>?",
@ -578,19 +584,19 @@
"users": "Usuarios",
"version": "Versión",
"version.current": "Current version",
"version.latest": "Latest version",
"versionInformation": "Version information",
"version.current": "Versión actual",
"version.latest": "Última versión",
"versionInformation": "Información sobre la versión",
"view.account": "Su cuenta",
"view.account": "Tu cuenta",
"view.installation": "Instalación",
"view.languages": "Idiomas",
"view.resetPassword": "Reset password",
"view.resetPassword": "Restablecer contraseña",
"view.site": "Sitio",
"view.system": "System",
"view.system": "Sistema",
"view.users": "Usuarios",
"welcome": "Bienvenido(a)",
"year": "Año",
"yes": "yes"
"yes": ""
}

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "You must add at least one block",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "قالب ایمیل «{name}» پیدا نشد",
"error.field.converter.invalid": "مبدل «{converter}» نامعتبر است",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.permission": "شما اجازه تنغییر نام فایل «{filename}» را ندارید",
@ -289,6 +292,7 @@
"field.pages.empty": "صفحه‌ای انتخاب نشده است",
"field.structure.delete.confirm": "\u0645\u062f\u062e\u0644 \u062c\u0627\u0631\u06cc \u062d\u0630\u0641 \u0634\u0648\u062f\u061f",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "\u0645\u0648\u0631\u062f\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.",
"field.users.empty": "کاربری انتخاب نشده است",
@ -318,7 +322,7 @@
"installation.issues.headline": "نصب پانل کاربری ممکن نیست",
"installation.issues.mbstring": "افزونه <code>MB String</code> مورد نیاز است",
"installation.issues.media": "پوشه <code>/media</code> موجود نیست یا قابل نوشتن نیست",
"installation.issues.php": "لطفا از پی‌اچ‌پی 7 یا بالاتر استفاده کنید",
"installation.issues.php": "لطفا از پی‌اچ‌پی 8 یا بالاتر استفاده کنید",
"installation.issues.server": "کربی نیاز به <code>Apache</code>، <code>Nginx</code> یا <code>Caddy</code> دارد",
"installation.issues.sessions": "پوشه <code>/site/sessions</code> وجود ندارد یا قابل نوشتن نیست",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "پس از خرید از طریق ایمیل، کد مجوز خود را دریافت کردید. لطفا برای ثبت‌نام آن را کپی و اینجا پیست کنید.",
"license.register.label": "لطفا کد مجوز خود را وارد کنید",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "با تشکر از شما برای حمایت از کربی",
"license.unregistered": "این یک نسخه آزمایشی ثبت نشده از کربی است",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Lisää vähintään yksi lohko",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Nimellä \"{name}\" ja kyseisellä verkkotunnuksella ei löydy sähköpostiosoitetta",
"error.field.converter.invalid": "Muunnin \"{converter}\" ei kelpaa",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Nimi ei voi olla tyhjä",
"error.file.changeName.permission": "Sinulla ei ole oikeutta muuttaa tiedoston \"{filename}\" nimeä",
@ -289,6 +292,7 @@
"field.pages.empty": " Sivuja ei ole vielä valittu",
"field.structure.delete.confirm": "Haluatko varmasti poistaa tämän rivin?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Rivejä ei ole vielä lisätty",
"field.users.empty": "Käyttäjiä ei ole vielä valittu",
@ -318,7 +322,7 @@
"installation.issues.headline": "Paneelia ei voida asentaa",
"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.php": "Varmista että <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Hallinnoi lisenssejäsi",
"license.register.help": "Lisenssiavain on lähetetty oston jälkeen sähköpostiisi. Kopioi ja liitä avain tähän.",
"license.register.label": "Anna lisenssiavain",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Kiitos kun tuet Kirbyä",
"license.unregistered": "Tämä on rekisteröimätön demo Kirbystä",
"license.unregistered.label": "Rekisteröimätön",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Vous devez ajouter au moins un bloc",
"error.blocks.validation": "Il y a une erreur sur le champ \"{field}\" du bloc {index} utilisant le type de bloc \"{fieldset}\"",
"error.cache.type.invalid": "Type de cache incorrect \"{type}\"",
"error.email.preset.notFound": "La configuration de courriel « {name} » na pu être trouvé ",
"error.field.converter.invalid": "Convertisseur « {converter} » incorrect",
"error.field.type.missing": "Champ \"{ name }\" : Le type de champ \"{ type }\" nexiste pas",
"error.file.changeName.empty": "Le nom ne peut être vide",
"error.file.changeName.permission": "Vous nêtes pas autorisé à modifier le nom de « {filename} »",
@ -289,6 +292,7 @@
"field.pages.empty": "Pas encore de page sélectionnée",
"field.structure.delete.confirm": "Voulez-vous vraiment supprimer cette ligne ?",
"field.structure.delete.confirm.all": "Voulez-vous vraiment supprimer toutes les entrées ?",
"field.structure.empty": "Pas encore dentrée",
"field.users.empty": "Pas encore dutilisateur sélectionné",
@ -318,7 +322,7 @@
"installation.issues.headline": "Le Panel ne peut être installé",
"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.php": "Veuillez utiliser <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Gérer vos licences",
"license.register.help": "Vous avez reçu votre numéro de licence par courriel après l'achat. Veuillez le copier et le coller ici pour l'enregistrer.",
"license.register.label": "Veuillez saisir votre numéro de licence",
"license.register.domain": "Votre licence sera enregistrée pour <strong>{host}</strong>.",
"license.register.local": "Vous êtes sur le point denregistrer votre licence pour votre domaine local <strong>{host}</strong>. Si votre site sera déployé sur un domaine publique, veuillez plutôt ly lenregistrer. Si {host} est le domaine pour lequel vous voulez enregistrer Kirby, veuillez continuer.",
"license.register.success": "Merci pour votre soutien à Kirby",
"license.unregistered": "Ceci est une démo non enregistrée de Kirby",
"license.unregistered.label": "Non enregistré",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Mot de passe oublié ?",
"login.toggleText.password-reset.email-password": "← Retour à la connexion",
"logout": "Se déconnecter",
"logout": "Déconnexion",
"menu": "Menu",
"meridiem": "AM/PM",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Legalább egy blokkot hozzá kell adnod",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "A \"{name}\" email-beállítás nem található",
"error.field.converter.invalid": "Érvénytelen konverter: \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "A név nem lehet üres",
"error.file.changeName.permission": "Nincs jogosultságod megváltoztatni a \"{filename}\" fájl nevét",
@ -289,6 +292,7 @@
"field.pages.empty": "Nincs oldal kiválasztva",
"field.structure.delete.confirm": "Biztos t\u00f6r\u00f6lni szeretn\u00e9d ezt a bejegyz\u00e9st?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Nincs m\u00e9g bejegyz\u00e9s",
"field.users.empty": "Nincs felhasználó kiválasztva",
@ -318,7 +322,7 @@
"installation.issues.headline": "A panel telepítése sikertelen",
"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.php": "Bizonyosodj meg róla, hogy az általad használt PHP-verzió <code>PHP 7+</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ó",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "A vásárlás után emailben küldjük el a licenc-kódot. Regisztrációhoz másold ide a kapott kódot.",
"license.register.label": "Kérlek írd be a licenc-kódot",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Köszönjük, hogy támogatod a Kirby-t",
"license.unregistered": "Jelenleg a Kirby nem regisztrált próbaverzióját használod",
"license.unregistered.label": "Unregistered",

View file

@ -1,10 +1,10 @@
{
"account.changeName": "Change your name",
"account.delete": "Delete your account",
"account.delete.confirm": "Do you really want to delete your account? You will be logged out immediately. Your account cannot be recovered.",
"account.changeName": "Ubah nama Anda",
"account.delete": "Hapus akun Anda",
"account.delete.confirm": "Anda yakin menghapus akun? Anda akan dikeluarkan segera. Akun Anda tidak dapat dipulihkan.",
"add": "Tambah",
"author": "Author",
"author": "Penulis",
"avatar": "Gambar profil",
"back": "Kembali",
"cancel": "Batal",
@ -14,7 +14,7 @@
"collapse": "Lipat",
"collapse.all": "Lipat Semua",
"copy": "Salin",
"copy.all": "Copy all",
"copy.all": "Salin semua",
"create": "Buat",
"date": "Tanggal",
@ -72,9 +72,12 @@
"error.blocks.min.singular": "Anda setidaknya menambahkan satu blok",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Surel \"{name}\" tidak dapat ditemukan",
"error.field.converter.invalid": "Konverter \"{converter}\" tidak valid",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Nama harus diisi",
"error.file.changeName.permission": "Anda tidak diizinkan mengubah nama berkas \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Belum ada halaman yang dipilih",
"field.structure.delete.confirm": "Anda yakin menghapus baris ini?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Belum ada entri",
"field.users.empty": "Belum ada pengguna yang dipilih",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panel tidak dapat dipasang",
"installation.issues.mbstring": "Ekstensi <code>MB String</code> diperlukan",
"installation.issues.media": "Folder <code>/media</code> tidak ada atau tidak dapat ditulis",
"installation.issues.php": "Pastikan Anda menggunakan <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Anda menerima kode lisensi via surel setelah pembelian. Salin dan tempel kode tersebut untuk mendaftarkan.",
"license.register.label": "Masukkan kode lisensi Anda",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Terima kasih atas dukungan untuk Kirby",
"license.unregistered": "Ini adalah demo tidak diregistrasi dari Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Allavegana einn bálkur takk",
"error.blocks.validation": "Það er villa í {field} sviðinu í bálkinum {index} sem notar {fieldset} bálkgerðina",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Netfangstillingarnar: \"{name}\" fundust ekki",
"error.field.converter.invalid": "Ógildur umbreytari \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Nafn skal fylla út",
"error.file.changeName.permission": "Þú mátt ekkert breyta nafninu á skránni \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Engar síður valdar ennþá",
"field.structure.delete.confirm": "Viltu virkilega eyða þessari röð?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Engar færslur enn",
"field.users.empty": "Engir notendur valdir enn",
@ -318,7 +322,7 @@
"installation.issues.headline": "Uppsetning Panelsins mistókst hrapalega",
"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.php": "Notaðu <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Sýslaðu með leyfin þín",
"license.register.help": "Þú fékkst sendan tölvupóst með leyfiskóðanum þegar þú keyptir leyfi. Vinsamlegast afritaðu hann og settu hann hingað til að skrá þig.",
"license.register.label": "Vinsamlegast settu inn leyfiskóðan",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Þakka þér fyrir að velja Kirby",
"license.unregistered": "Þetta er óskráð prufueintak af Kirby",
"license.unregistered.label": "Óskráð",

View file

@ -49,13 +49,13 @@
"email": "Email",
"email.placeholder": "mail@esempio.com",
"entries": "Entries",
"entry": "Entry",
"entries": "Voci",
"entry": "Voce",
"environment": "Ambiente",
"error.access.code": "Codice non valido",
"error.access.login": "Login Invalido",
"error.access.login": "Login invalido",
"error.access.panel": "Non ti è permesso accedere al pannello",
"error.access.view": "Non ti è permesso accedere a questa parte del pannello",
@ -70,11 +70,14 @@
"error.blocks.max.singular": "Non puoi aggiungere più di un blocco",
"error.blocks.min.plural": "Devi aggiungere almeno {min} blocchi",
"error.blocks.min.singular": "Devi aggiungere almeno un blocco",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.blocks.validation": "C'è un errore sul campo \"{field}\" nel blocco {index} che utilizza il tipo di blocco \"{fieldset}\"",
"error.cache.type.invalid": "Tipo di cache \"{type}\" non valido",
"error.email.preset.notFound": "Non è stato possibile trovare il preset email \"{name}\"",
"error.field.converter.invalid": "Convertitore \"{converter}\" non valido",
"error.field.type.missing": "Campo \"{ name }\": il tipo di campo \"{ type }\" non esiste",
"error.file.changeName.empty": "Il nome non dev'essere vuoto",
"error.file.changeName.permission": "Non ti è permesso modificare il nome di \"{filename}\"",
@ -107,14 +110,14 @@
"error.language.name": "Inserisci un nome valido per la lingua",
"error.language.notFound": "La lingua non è stata trovata",
"error.layout.validation.block": "There's an error on the \"{field}\" field in block {blockIndex} using the \"{fieldset}\" block type in layout {layoutIndex}",
"error.layout.validation.block": "C'è un errore sul campo \"{field}\" nel blocco {blockIndex} che utilizza il tipo di blocco \"{fieldset}\" nel layout {layoutIndex}",
"error.layout.validation.settings": "C'è un errore nelle impostazioni del layout {index}",
"error.license.format": "Inserisci un codice di licenza valido",
"error.license.email": "Inserisci un indirizzo email valido",
"error.license.verification": "Non è stato possibile verificare la licenza",
"error.object.validation": "Theres an error in the \"{label}\" field:\n{message}",
"error.object.validation": "C'è un errore nel campo \"{label}\":\n{message}",
"error.offline": "Il pannello di controllo è attualmente offline",
@ -284,11 +287,12 @@
"field.layout.empty": "Nessuna riga inserita",
"field.layout.select": "Scegli un layout",
"field.object.empty": "No information yet",
"field.object.empty": "Ancora nessuna informazione",
"field.pages.empty": "Nessuna pagina selezionata",
"field.structure.delete.confirm": "Vuoi veramente eliminare questo elemento?",
"field.structure.delete.confirm.all": "Vuoi davvero cancellare tutte le voci?",
"field.structure.empty": "Non ci sono ancora elementi.",
"field.users.empty": "Nessun utente selezionato",
@ -318,7 +322,7 @@
"installation.issues.headline": "Il pannello non può esser installato",
"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.php": "Assicurati di utilizzare <code>PHP 7.1+</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",
@ -346,12 +350,14 @@
"license": "Licenza di Kirby",
"license.buy": "Acquista una licenza",
"license.register": "Registra",
"license.manage": "Manage your licenses",
"license.manage": "Gestisci le tue licenze",
"license.register.help": "Hai ricevuto il codice di licenza tramite email dopo l'acquisto. Per favore inseriscilo per registrare Kirby.",
"license.register.label": "Inserisci il codice di licenza",
"license.register.domain": "La tua licenza verrà registrata su <strong>{host}</strong>.",
"license.register.local": "Stai per registrare la licenza per il dominio locale <strong>{host}</strong>. Se questo sito verrà rilasciato su un dominio pubblico, ti preghiamo di registrarlo lì. Se {host} è il dominio per il quale desideri ottenere la licenza di Kirby, procedi pure.",
"license.register.success": "Ti ringraziamo per aver supportato Kirby",
"license.unregistered": "Questa è una versione demo di Kirby non registrata",
"license.unregistered.label": "Unregistered",
"license.unregistered.label": "Non registrato",
"link": "Link",
"link.text": "Testo del link",
@ -482,7 +488,7 @@
"section.required": "La sezione è obbligatoria",
"security": "Security",
"security": "Sicurezza",
"select": "Seleziona",
"server": "Server",
"settings": "Impostazioni",
@ -492,26 +498,26 @@
"slug": "URL",
"sort": "Ordina",
"stats.empty": "No reports",
"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.plugin": "Your installed version of the { plugin } plugin is has reached end-of-life and will not receive further security updates",
"system.issues.debug": "Debugging must be turned off in production",
"system.issues.git": "The .git folder seems to be exposed",
"system.issues.https": "We recommend HTTPS for all your sites",
"system.issues.kirby": "The kirby folder seems to be exposed",
"system.issues.site": "The site folder seems to be exposed",
"system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }",
"system.issues.vulnerability.plugin": "Your installation might be affected by the following vulnerability in the { plugin } plugin ({ severity } severity): { description }",
"system.updateStatus": "Update status",
"system.updateStatus.error": "Could not check for updates",
"system.updateStatus.not-vulnerable": "No known vulnerabilities",
"system.updateStatus.security-update": "Free security update { version } available",
"system.updateStatus.security-upgrade": "Upgrade { version } with security fixes available",
"system.updateStatus.unreleased": "Unreleased version",
"system.updateStatus.up-to-date": "Up to date",
"system.updateStatus.update": "Free update { version } available",
"system.updateStatus.upgrade": "Upgrade { version } available",
"stats.empty": "Nessuna segnalazione",
"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.plugin": "La versione installata del plugin { plugin } è giunta alla fine del suo ciclo di vita e non riceverà ulteriori aggiornamenti di sicurezza",
"system.issues.debug": "Il debug deve essere disattivato in produzione",
"system.issues.git": "La cartella .git sembra essere esposta",
"system.issues.https": "Raccomandiamo l'utilizzo di HTTPS per tutti i siti",
"system.issues.kirby": "La cartella kirby sembra essere esposta",
"system.issues.site": "La cartella site sembra essere esposta",
"system.issues.vulnerability.kirby": "La tua installazione potrebbe essere colpita dalla seguente vulnerabilità ({ severity } gravità): { description }",
"system.issues.vulnerability.plugin": "La tua installazione potrebbe essere colpita dalla seguente vulnerabilità nel plugin { plugin } ({ severity } gravità): { description }",
"system.updateStatus": "Aggiorna lo stato",
"system.updateStatus.error": "Impossibile verificare gli aggiornamenti",
"system.updateStatus.not-vulnerable": "Nessuna vulnerabilità conosciuta",
"system.updateStatus.security-update": "Aggiornamento di sicurezza gratuito { version } disponibile",
"system.updateStatus.security-upgrade": "Aggiornamento { version } con le correzioni di sicurezza disponibili",
"system.updateStatus.unreleased": "Versione non rilasciata",
"system.updateStatus.up-to-date": "Aggiornato",
"system.updateStatus.update": "Aggiornamento gratuito { version } disponibile",
"system.updateStatus.upgrade": "Aggiornamento { version } disponibile",
"title": "Titolo",
"template": "Template",
@ -578,9 +584,9 @@
"users": "Utenti",
"version": "Versione di Kirby",
"version.current": "Current version",
"version.latest": "Latest version",
"versionInformation": "Version information",
"version.current": "Versione corrente",
"version.latest": "Ultima versione",
"versionInformation": "Informazioni sulla versione",
"view.account": "Il tuo account",
"view.installation": "Installazione",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "블록을 하나 이상 추가하세요.",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "기본 이메일 주소({name})가 없습니다.",
"error.field.converter.invalid": "컨버터({converter})가 올바르지 않습니다.",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "이름을 입력하세요.",
"error.file.changeName.permission": "파일명({filename})을 변경할 권한이 없습니다.",
@ -289,6 +292,7 @@
"field.pages.empty": "선택한 페이지가 없습니다.",
"field.structure.delete.confirm": "이 항목을 삭제할까요?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "항목이 없습니다.",
"field.users.empty": "선택한 사용자가 없습니다.",
@ -318,7 +322,7 @@
"installation.issues.headline": "패널을 설치할 수 없습니다.",
"installation.issues.mbstring": "<code>MB String</code> 확장 모듈이 필요합니다.",
"installation.issues.media": "<code>/media</code> 폴더의 쓰기 권한을 확인하세요.",
"installation.issues.php": "<code>PHP</code> 버전이 7 이상인지 확인하세요.",
"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> 폴더의 쓰기 권한을 확인하세요.",
@ -349,6 +353,8 @@
"license.manage": "라이선스 관리",
"license.register.help": "Kirby를 등록하려면 이메일로 전송받은 라이선스 코드와 이메일 주소를 입력하세요.",
"license.register.label": "라이선스 코드를 입력하세요.",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Kirby와 함께해주셔서 감사합니다.",
"license.unregistered": "Kirby가 등록되지 않았습니다.",
"license.unregistered.label": "Kirby가 등록되지 않았습니다.",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "암호 찾기",
"login.toggleText.password-reset.email-password": "로그인 화면으로",
"logout": "\ub85c\uadf8\uc544\uc6c3",
"logout": "로그아웃",
"menu": "메뉴",
"meridiem": "오전/오후",
@ -494,7 +500,7 @@
"stats.empty": "관련 기록이 없습니다.",
"system.issues.content": "<code>/content</code> 폴더의 권한을 확인하세요.",
"system.issues.eol.kirby": "Your installed Kirby version has reached end-of-life and will not receive further security updates",
"system.issues.eol.kirby": "설치된 Kirby는 버전이 만료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.",
"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.debug": "공개 서버상에서는 디버그 모드를 해제하세요.",
"system.issues.git": "<code>/.git</code> 폴더의 권한을 확인하세요.",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Jūs turite pridėti bent vieną bloką",
"error.blocks.validation": "Yra klaida laukelyje \"{field}\" bloke {index} naudojant bloko tipą \"{fieldset}\"",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "El. pašto paruoštukas \"{name}\" nerastas",
"error.field.converter.invalid": "Neteisingas konverteris \"{converter}\"",
"error.field.type.missing": "Laukelis \"{ name }\": Šio tipo (\"{ type }\") laukelis neegzistuoja",
"error.file.changeName.empty": "Pavadinimas negali būti tuščias",
"error.file.changeName.permission": "Neturite teisės pakeisti failo pavadinimo \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Dar nėra puslapių",
"field.structure.delete.confirm": "Ar tikrai norite pašalinti šią eilutę?",
"field.structure.delete.confirm.all": "Ar tikrai norite išrtinti visus įrašus?",
"field.structure.empty": "Dar nėra įrašų",
"field.users.empty": "Dar nėra vartotojų",
@ -318,7 +322,7 @@
"installation.issues.headline": "Nepavyko įdiegti valdymo pulto",
"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.php": "Įsitikinkite, kad naudojama <code>PHP 7+</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ų",
@ -349,6 +353,8 @@
"license.manage": "Valdyti savo licencijas",
"license.register.help": "Licenzijos kodą gavote el. paštu po apmokėjimo. Prašome įterpti čia, kad sistema būtų užregistruota.",
"license.register.label": "Prašome įrašyti jūsų licenzijos kodą",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Ačiū, kad palaikote Kirby",
"license.unregistered": "Tai neregistruota Kirby demo versija",
"license.unregistered.label": "Neregistruota",
@ -498,7 +504,7 @@
"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.debug": "Debugging must be turned off in production",
"system.issues.git": "The .git folder seems to be exposed",
"system.issues.https": "We recommend HTTPS for all your sites",
"system.issues.https": "Rekomenduojame HTTPS visoms svetainėms",
"system.issues.kirby": "The kirby folder seems to be exposed",
"system.issues.site": "The site folder seems to be exposed",
"system.issues.vulnerability.kirby": "Your installation might be affected by the following vulnerability ({ severity } severity): { description }",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Du må legge til minst en blokk",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "E-postinnstillingen \"{name}\" ble ikke funnet",
"error.field.converter.invalid": "Ugyldig omformer \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Navnet kan ikke være tomt",
"error.file.changeName.permission": "Du har ikke rettighet til å endre navnet til \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Ingen side har blitt valgt",
"field.structure.delete.confirm": "\u00d8nsker du virkelig \u00e5 slette denne oppf\u00f8ringen?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Ingen oppf\u00f8ringer enda",
"field.users.empty": "Ingen bruker har blitt valgt",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panelet kan ikke installeres",
"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.php": "Pass på at du bruker <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Du skal ha mottatt din lisenskode for kjøpet via e-post. Vennligst kopier og lim inn denne for å registrere deg.",
"license.register.label": "Vennligst skriv inn din lisenskode",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Takk for at du støtter Kirby",
"license.unregistered": "Dette er en uregistrert demo av Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Je moet ten minste één blok toevoegen",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "De e-mailvoorinstelling \"{name}\" kan niet worden gevonden",
"error.field.converter.invalid": "Ongeldige converter \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "De naam mag niet leeg zijn",
"error.file.changeName.permission": "Je hebt geen rechten om de naam te wijzigen van \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Nog geen pagina's geselecteerd",
"field.structure.delete.confirm": "Wil je deze entry verwijderen?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Nog geen items.",
"field.users.empty": "Nog geen gebruikers geselecteerd",
@ -318,7 +322,7 @@
"installation.issues.headline": "Het Panel kan niet worden geïnstalleerd",
"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.php": "Gebruik <code>PHP7+</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",
@ -349,6 +353,8 @@
"license.manage": "Beheer je licenties",
"license.register.help": "Je hebt de licentie via e-mail gekregen nadat je de aankoop hebt gedaan. Kopieer en plak de licentie om te registreren. ",
"license.register.label": "Vul je licentie in",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Bedankt dat je Kirby ondersteunt",
"license.unregistered": "Dit is een niet geregistreerde demo van Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Musisz dodać co najmniej jeden blok",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Nie udało się załadować wzorca wiadomości e-mail \"{name}\"",
"error.field.converter.invalid": "Nieprawidłowy konwerter \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Imię nie może być puste",
"error.file.changeName.permission": "Nie masz uprawnień, by zmienić nazwę \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Nie wybrano jeszcze żadnych stron",
"field.structure.delete.confirm": "Czy na pewno chcesz usunąć ten wiersz?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Nie ma jeszcze \u017cadnych wpis\u00f3w.",
"field.users.empty": "Nie wybrano jeszcze żadnych użytkowników",
@ -318,7 +322,7 @@
"installation.issues.headline": "Nie można zainstalować panelu",
"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.php": "Upewnij się, że używasz <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Zarządzaj swoimi licencjami",
"license.register.help": "Po zakupieniu licencji otrzymałaś/-eś mailem klucz. Skopiuj go i wklej tutaj, aby dokonać rejestracji.",
"license.register.label": "Wprowadź swój kod licencji",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Dziękujemy za wspieranie Kirby",
"license.unregistered": "To jest niezarejestrowana wersja demonstracyjna Kirby",
"license.unregistered.label": "Niezarejestrowane",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Zapomniałeś/-aś hasła?",
"login.toggleText.password-reset.email-password": "← Powrót do logowania",
"logout": "Wyloguj",
"logout": "Wyloguj się",
"menu": "Menu",
"meridiem": "AM/PM",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Você deve adicionar pelo menos um bloco",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Pré-configuração de email \"{name}\" não foi encontrada",
"error.field.converter.invalid": "Conversor \"{converter}\" inválido",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "O nome não deve ficar em branco",
"error.file.changeName.permission": "Você não tem permissão para alterar o nome de \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Nenhuma página selecionada",
"field.structure.delete.confirm": "Deseja realmente deletar esta linha?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Nenhum registro",
"field.users.empty": "Nenhum usuário selecionado",
@ -318,7 +322,7 @@
"installation.issues.headline": "O painel não pôde ser instalado",
"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.php": "Certifique-se que você está usando o <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Você recebeu o código da sua licença por email ao efetuar sua compra. Por favor, copie e cole o código para completar seu registro.",
"license.register.label": "Por favor, digite o código da sua licença",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Obrigado por apoiar o Kirby",
"license.unregistered": "Esta é uma cópia de demonstração não registrada do Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Você deve adicionar pelo menos um bloco",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Preset de email \"{name}\" não encontrado",
"error.field.converter.invalid": "Conversor \"{converter}\" inválido",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "O nome não pode ficar em branco",
"error.file.changeName.permission": "Não tem permissões para alterar o nome de \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Nenhuma página selecionada",
"field.structure.delete.confirm": "Deseja realmente excluir este registro?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Nenhum registro",
"field.users.empty": "Nenhum utilizador selecionado",
@ -318,7 +322,7 @@
"installation.issues.headline": "O painel não pôde ser instalado",
"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.php": "Certifique-se que está a usar o <code>PHP 7+</code>",
"installation.issues.php": "Certifique-se que você está usando 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 possui permissão de escrita",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Recebeu o código da sua licença por email após a compra. Por favor, copie e cole-o para completar o registro.",
"license.register.label": "Por favor, digite o código da sua licença",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Obrigado por apoiar o Kirby",
"license.unregistered": "Esta é uma demonstração não registrada do Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Вы должны добавить хотя бы один блок",
"error.blocks.validation": "Ошибка в поле \"{field}\" в блоке {index} типа \"{fieldset}\"",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "Шаблон эл. почты \"{name}\" не найден",
"error.field.converter.invalid": "Неверный конвертер \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Название не может быть пустым",
"error.file.changeName.permission": "У вас нет права изменить название \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Страницы не выбраны",
"field.structure.delete.confirm": "Вы точно хотите удалить эту запись?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Записей нет",
"field.users.empty": "Пользователей нет",
@ -318,7 +322,7 @@
"installation.issues.headline": "Не удалось установить панель",
"installation.issues.mbstring": "Расширение <code>MB String</code> необходимо",
"installation.issues.media": "Каталог <code>/media</code> не существует или нет прав записи",
"installation.issues.php": "Убедитесь, что используется <code>PHP 7+</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> не существует или нет прав записи",
@ -349,6 +353,8 @@
"license.manage": "Управление лицензиями",
"license.register.help": "После покупки вы получили по эл. почте код лицензии. Пожалуйста скопируйте и вставьте сюда чтобы зарегистрировать.",
"license.register.label": "Пожалуйста вставьте код лицензии",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Спасибо за поддержку Kirby",
"license.unregistered": "Это незарегистрированная версия Kirby",
"license.unregistered.label": "Не зарегистрировано",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "You must add at least one block",
"error.blocks.validation": "There's an error on the \"{field}\" field in block {index} using the \"{fieldset}\" block type",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "E-mailovú predvoľbu \"{name}\" nie je možné nájsť",
"error.field.converter.invalid": "Neplatný converter \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Meno nesmie byť prázdne",
"error.file.changeName.permission": "Nemáte povolenie na zmenu názvu pre \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Žiadne stránky zatiaľ neboli zvolené",
"field.structure.delete.confirm": "Ste si istý, že chcete zmazať tento riadok?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Zatiaľ žiadne údaje",
"field.users.empty": "Žiadni užívatelia zatiaľ neboli zvolení",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panel nie je možné naištalovať",
"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.php": "Uistite sa, že používate <code>PHP 7+</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ý",
@ -349,6 +353,8 @@
"license.manage": "Manage your licenses",
"license.register.help": "Licenčný kód vám bol doručený e-mailom po úspešnom nákupe. Prosím, skopírujte a prilepte ho na uskutočnenie registrácie.",
"license.register.label": "Prosím, zadajte váš licenčný kód",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Ďakujeme za vašu podporu Kirby",
"license.unregistered": "Toto je neregistrované demo Kirby",
"license.unregistered.label": "Unregistered",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "Du måste lägga till minst ett block",
"error.blocks.validation": "Det finns ett fel i fältet \"{field}\" i block {index} med blocktypen \"{fieldset}\"",
"error.cache.type.invalid": "Invalid cache type \"{type}\"",
"error.email.preset.notFound": "E-postförinställningen \"{name}\" kan inte hittas",
"error.field.converter.invalid": "Ogiltig omvandlare \"{converter}\"",
"error.field.type.missing": "Field \"{ name }\": The field type \"{ type }\" does not exist",
"error.file.changeName.empty": "Namnet får inte vara tomt",
"error.file.changeName.permission": "Du har inte behörighet att ändra namnet på \"{filename}\"",
@ -289,6 +292,7 @@
"field.pages.empty": "Inga sidor valda än",
"field.structure.delete.confirm": "Vill du verkligen radera denna rad?",
"field.structure.delete.confirm.all": "Do you really want to delete all entries?",
"field.structure.empty": "Inga poster än",
"field.users.empty": "Inga användare valda än",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panelen kan inte installeras",
"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.php": "Se till att du använder <code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Hantera dina licenser",
"license.register.help": "Du fick din licenskod via e-post efter inköpet. Kopiera och klistra in den för att registrera licensen.",
"license.register.label": "Ange din licenskod",
"license.register.domain": "Your license will be registered to <strong>{host}</strong>.",
"license.register.local": "You are about to register your license for your local domain <strong>{host}</strong>. If this site will be deployed to a public domain, please register it there instead. If {host} is the domain you want to license Kirby to, please continue.",
"license.register.success": "Tack för att du stödjer Kirby",
"license.unregistered": "Detta är en oregistrerad demo av Kirby",
"license.unregistered.label": "Oregistrerad",

View file

@ -72,9 +72,12 @@
"error.blocks.min.singular": "En az bir blok eklemelisiniz",
"error.blocks.validation": "\"{fieldset}\" blok türünü kullanan {index}. bloktaki \"{field}\" alanında bir hata var",
"error.cache.type.invalid": "Geçersiz önbellek türü \"{type}\"",
"error.email.preset.notFound": "\"{name}\" e-posta adresi bulunamadı",
"error.field.converter.invalid": "Geçersiz dönüştürücü \"{converter}\"",
"error.field.type.missing": "\"{ name }\" alanı: \"{ type }\" alan türü mevcut değil",
"error.file.changeName.empty": "İsim boş olmamalıdır",
"error.file.changeName.permission": "\"{filename}\" adını değiştiremezsiniz",
@ -289,6 +292,7 @@
"field.pages.empty": "Henüz sayfa seçilmedi",
"field.structure.delete.confirm": "Bu girdiyi silmek istedi\u011finizden emin misiniz?",
"field.structure.delete.confirm.all": "Tüm girdileri gerçekten silmek istiyor musunuz?",
"field.structure.empty": "Hen\u00fcz bir girdi yok",
"field.users.empty": "Henüz kullanıcı seçilmedi",
@ -318,7 +322,7 @@
"installation.issues.headline": "Panel kurulamadı",
"installation.issues.mbstring": "<code>MB String</code> eklentisi gerekli",
"installation.issues.media": "<code>/media</code> klasörü yok yada yazılamaz",
"installation.issues.php": "<code>PHP 7+</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",
@ -349,6 +353,8 @@
"license.manage": "Lisanslarınızı yönetin",
"license.register.help": "Satın alma işleminden sonra e-posta yoluyla lisans kodunuzu aldınız. Lütfen kayıt olmak için kodu kopyalayıp yapıştırın.",
"license.register.label": "Lütfen lisans kodunu giriniz",
"license.register.domain": "Lisansınız <strong>{host}</strong> için kaydedilecek.",
"license.register.local": "Lisansınızı yerel alan adınız <strong>{host}</strong> için kaydetmek üzeresiniz. Bu site genel bir etki alanına dağıtılacaksa, lütfen bunun yerine lisansı orada kaydedin. Kirby'yi lisanslamak istediğiniz alan adı {host} ise lütfen devam edin.",
"license.register.success": "Kirby'yi desteklediğiniz için teşekkürler",
"license.unregistered": "Bu Kirby'nin kayıtsız bir demosu",
"license.unregistered.label": "Kayıtsız",
@ -382,7 +388,7 @@
"login.toggleText.password-reset.email": "Şifrenizi mi unuttunuz?",
"login.toggleText.password-reset.email-password": "← Girişe geri dön",
"logout": "Güvenli Çıkış",
"logout": "Oturumu kapat",
"menu": "Menü",
"meridiem": "AM/PM",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -23,7 +23,7 @@ class Collection
protected Api $api;
protected $data;
protected $model;
protected $select;
protected $select = null;
protected $view;
/**
@ -36,7 +36,6 @@ class Collection
$this->api = $api;
$this->data = $data;
$this->model = $schema['model'] ?? null;
$this->select = null;
$this->view = $schema['view'] ?? null;
if ($data === null) {

View file

@ -91,12 +91,8 @@ class Model
*/
public function selection(): array
{
$select = $this->select;
if ($select === null) {
$select = array_keys($this->fields);
}
$select = $this->select;
$select ??= array_keys($this->fields);
$selection = [];
foreach ($select as $key => $value) {

View file

@ -16,7 +16,7 @@ use TypeError;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage 3.10
* @codeCoverageIgnore
*/
class Collection extends BaseCollection
@ -45,21 +45,22 @@ class Collection extends BaseCollection
/**
* Validate the type of every item that is being
* added to the collection. They cneed to have
* added to the collection. They need to have
* the class defined by static::TYPE.
*/
public function __set(string $key, $value): void
{
if (
is_a($value, static::TYPE) === false
) {
if (is_a($value, static::TYPE) === false) {
throw new TypeError('Each value in the collection must be an instance of ' . static::TYPE);
}
parent::__set($key, $value);
}
public static function factory(array $items)
/**
* Creates a collection from a nested array structure
*/
public static function factory(array $items): static
{
$collection = new static();
$className = static::TYPE;
@ -77,7 +78,11 @@ class Collection extends BaseCollection
return $collection;
}
public function render(ModelWithContent $model)
/**
* Renders each item with a model and returns
* an array of all rendered results
*/
public function render(ModelWithContent $model): array
{
$props = [];

View file

@ -17,7 +17,7 @@ use Kirby\Filesystem\F;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class Config

View file

@ -11,7 +11,7 @@ namespace Kirby\Blueprint;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class Extension

View file

@ -16,7 +16,7 @@ use ReflectionUnionType;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class Factory
@ -95,7 +95,7 @@ class Factory
}
// union types
if (is_a($propType, ReflectionUnionType::class) === true) {
if ($propType instanceof ReflectionUnionType) {
return static::forUnionType($propType, $value);
}

View file

@ -13,7 +13,7 @@ use Kirby\Cms\ModelWithContent;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class Node
@ -53,7 +53,6 @@ class Node
return Factory::make(static::class, $props);
}
public static function load(string|array $props): static
{
// load by path

View file

@ -14,7 +14,7 @@ use Kirby\Toolkit\I18n;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class NodeI18n extends NodeProperty

View file

@ -11,7 +11,7 @@ namespace Kirby\Blueprint;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class NodeIcon extends NodeString

View file

@ -13,7 +13,7 @@ use Kirby\Cms\ModelWithContent;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
abstract class NodeProperty

View file

@ -13,7 +13,7 @@ use Kirby\Cms\ModelWithContent;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class NodeString extends NodeProperty

View file

@ -14,7 +14,7 @@ use Kirby\Cms\ModelWithContent;
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*
* // TODO: include in test coverage in 3.9
* // TODO: include in test coverage in 3.10
* @codeCoverageIgnore
*/
class NodeText extends NodeI18n

View file

@ -39,7 +39,8 @@ class Value
*
* @param int $minutes the number of minutes until the value expires
* or an absolute UNIX timestamp
* @param int $created the UNIX timestamp when the value has been created
* @param int|null $created the UNIX timestamp when the value has been created
* (defaults to the current time)
*/
public function __construct($value, int $minutes = 0, int|null $created = null)
{

View file

@ -18,6 +18,7 @@ use Kirby\Http\Router;
use Kirby\Http\Uri;
use Kirby\Http\Visitor;
use Kirby\Session\AutoSession;
use Kirby\Template\Snippet;
use Kirby\Text\KirbyTag;
use Kirby\Text\KirbyTags;
use Kirby\Toolkit\A;
@ -481,28 +482,23 @@ class App
/**
* Try to find a controller by name
*
* @param string $name
* @param string $contentType
* @return \Kirby\Toolkit\Controller|null
*/
protected function controllerLookup(string $name, string $contentType = 'html')
protected function controllerLookup(string $name, string $contentType = 'html'): Controller|null
{
if ($contentType !== null && $contentType !== 'html') {
$name .= '.' . $contentType;
}
// controller on disk
if ($controller = Controller::load($this->root('controllers') . '/' . $name . '.php')) {
// controller from site root
$controller = Controller::load($this->root('controllers') . '/' . $name . '.php');
// controller from extension
$controller ??= $this->extension('controllers', $name);
if ($controller instanceof Controller) {
return $controller;
}
// registry controller
if ($controller = $this->extension('controllers', $name)) {
if ($controller instanceof Controller) {
return $controller;
}
if ($controller !== null) {
return new Controller($controller);
}
@ -1278,6 +1274,11 @@ class App
// set the current locale
$this->setCurrentLanguage($language);
// directly prevent path with incomplete content representation
if (Str::endsWith($path, '.') === true) {
return null;
}
// the site is needed a couple times here
$site = $this->site();
@ -1557,24 +1558,6 @@ class App
return $this;
}
/**
* Returns the Environment object
* @deprecated 3.7.0 Use `$kirby->environment()` instead
*
* @return \Kirby\Http\Environment
* @deprecated Will be removed in Kirby 3.9.0
* @todo Remove in 3.9.0
* @codeCoverageIgnore
*/
public function server()
{
// @codeCoverageIgnoreStart
Helpers::deprecated('$kirby->server() has been deprecated and will be removed in Kirby 3.9.0. Use $kirby->environment() instead.');
// @codeCoverageIgnoreEnd
return $this->environment();
}
/**
* Initializes and returns the Site object
*
@ -1624,21 +1607,24 @@ class App
* Uses the snippet component to create
* and return a template snippet
*
* @param mixed $name
* @param array|object $data Variables or an object that becomes `$item`
* @param bool $return On `false`, directly echo the snippet
* @return string|null
* @psalm-return ($return is true ? string : null)
*/
public function snippet($name, $data = [], bool $return = true): string|null
public function snippet(string|array|null $name, $data = [], bool $return = true, bool $slots = false): Snippet|string|null
{
if (is_object($data) === true) {
$data = ['item' => $data];
}
$snippet = ($this->component('snippet'))($this, $name, array_merge($this->data, $data));
$snippet = ($this->component('snippet'))(
$this,
$name,
array_merge($this->data, $data),
$slots
);
if ($return === true) {
if ($return === true || $slots === true) {
return $snippet;
}
@ -1661,7 +1647,7 @@ class App
* and return the Template object
*
* @internal
* @return \Kirby\Cms\Template
* @return \Kirby\Template\Template
* @param string $name
* @param string $type
* @param string $defaultType

View file

@ -44,7 +44,7 @@ trait AppCaches
if (array_key_exists($type, $types) === false) {
throw new InvalidArgumentException([
'key' => 'app.invalid.cacheType',
'key' => 'cache.type.invalid',
'data' => ['type' => $type]
]);
}
@ -57,7 +57,7 @@ trait AppCaches
// check if it is a usable cache object
if ($cache instanceof Cache === false) {
throw new InvalidArgumentException([
'key' => 'app.invalid.cacheType',
'key' => 'cache.type.invalid',
'data' => ['type' => $type]
]);
}
@ -82,9 +82,10 @@ trait AppCaches
];
}
$prefix = str_replace(['/', ':'], '_', $this->system()->indexUrl()) .
'/' .
str_replace('.', '/', $key);
$prefix =
str_replace(['/', ':'], '_', $this->system()->indexUrl()) .
'/' .
str_replace('.', '/', $key);
$defaults = [
'active' => true,

View file

@ -4,6 +4,7 @@ namespace Kirby\Cms;
use Closure;
use Kirby\Exception\DuplicateException;
use Kirby\Filesystem\Asset;
use Kirby\Filesystem\Dir;
use Kirby\Filesystem\F;
use Kirby\Filesystem\Mime;
@ -45,6 +46,7 @@ trait AppPlugins
// other plugin types
'api' => [],
'areas' => [],
'assetMethods' => [],
'authChallenges' => [],
'blockMethods' => [],
'blockModels' => [],
@ -147,6 +149,17 @@ trait AppPlugins
return $this->extensions['areas'];
}
/**
* Registers additional asset methods
*
* @param array $methods
* @return array
*/
protected function extendAssetMethods(array $methods): array
{
return $this->extensions['assetMethods'] = Asset::$methods = array_merge(Asset::$methods, $methods);
}
/**
* Registers additional authentication challenges
*

View file

@ -60,10 +60,7 @@ trait AppUsers
}
try {
// TODO: switch over in 3.9.0 to
// return $callback($userAfter);
$proxy = new AppUsersImpersonateProxy($this);
return $callback->call($proxy, $userAfter);
return $callback($userAfter);
} catch (Throwable $e) {
throw $e;
} finally {

View file

@ -1,32 +0,0 @@
<?php
namespace Kirby\Cms;
/**
* Temporary proxy class to ease transition
* of binding the callback for `$kirby->impersonate()`
*
* @package Kirby Cms
* @author Nico Hoffmann <nico@getkirby.com>,
* Lukas Bestle <lukas@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier
* @license https://getkirby.com/license
*
* @internal
* @deprecated Will be removed in Kirby 3.9.0
* @todo remove in 3.9.0
*/
class AppUsersImpersonateProxy
{
public function __construct(protected App $app)
{
}
public function __call($name, $arguments)
{
Helpers::deprecated('Calling $kirby->' . $name . '() as $this->' . $name . '() has been deprecated inside the $kirby->impersonate() callback function. Use a dedicated $kirby object for your call instead of $this. In Kirby 3.9.0 $this will no longer refer to the $kirby object, but the current context of the callback function.');
return $this->app->$name(...$arguments);
}
}

View file

@ -15,6 +15,7 @@ use Kirby\Http\Idn;
use Kirby\Http\Request\Auth\BasicAuth;
use Kirby\Session\Session;
use Kirby\Toolkit\A;
use SensitiveParameter;
use Throwable;
/**
@ -381,17 +382,16 @@ class Auth
/**
* Login a user by email and password
*
* @param string $email
* @param string $password
* @param bool $long
* @return \Kirby\Cms\User
*
* @throws \Kirby\Exception\PermissionException If the rate limit was exceeded or if any other error occurred with debug mode off
* @throws \Kirby\Exception\NotFoundException If the email was invalid
* @throws \Kirby\Exception\InvalidArgumentException If the password is not valid (via `$user->login()`)
*/
public function login(string $email, string $password, bool $long = false)
{
public function login(
string $email,
#[SensitiveParameter]
string $password,
bool $long = false
): User {
// session options
$options = [
'createMode' => 'cookie',
@ -412,17 +412,16 @@ class Auth
* Login a user by email, password and auth challenge
* @since 3.5.0
*
* @param string $email
* @param string $password
* @param bool $long
* @return \Kirby\Cms\Auth\Status
*
* @throws \Kirby\Exception\PermissionException If the rate limit was exceeded or if any other error occurred with debug mode off
* @throws \Kirby\Exception\NotFoundException If the email was invalid
* @throws \Kirby\Exception\InvalidArgumentException If the password is not valid (via `$user->login()`)
*/
public function login2fa(string $email, string $password, bool $long = false)
{
public function login2fa(
string $email,
#[SensitiveParameter]
string $password,
bool $long = false
): Status {
$this->validatePassword($email, $password);
return $this->createChallenge($email, $long, '2fa');
}
@ -516,16 +515,15 @@ class Auth
* Validates the user credentials and returns the user object on success;
* otherwise logs the failed attempt
*
* @param string $email
* @param string $password
* @return \Kirby\Cms\User
*
* @throws \Kirby\Exception\PermissionException If the rate limit was exceeded or if any other error occurred with debug mode off
* @throws \Kirby\Exception\NotFoundException If the email was invalid
* @throws \Kirby\Exception\InvalidArgumentException If the password is not valid (via `$user->login()`)
*/
public function validatePassword(string $email, string $password)
{
public function validatePassword(
string $email,
#[SensitiveParameter]
string $password
): User {
$email = Idn::decodeEmail($email);
try {
@ -798,8 +796,10 @@ class Auth
* @throws \Kirby\Exception\InvalidArgumentException If no authentication challenge is active
* @throws \Kirby\Exception\LogicException If the authentication challenge is invalid
*/
public function verifyChallenge(string $code)
{
public function verifyChallenge(
#[SensitiveParameter]
string $code
) {
try {
$session = $this->kirby->session();

View file

@ -3,6 +3,7 @@
namespace Kirby\Cms\Auth;
use Kirby\Cms\User;
use SensitiveParameter;
/**
* Template class for authentication challenges
@ -48,8 +49,11 @@ abstract class Challenge
* @param string $code Code to verify
* @return bool
*/
public static function verify(User $user, string $code): bool
{
public static function verify(
User $user,
#[SensitiveParameter]
string $code
): bool {
$hash = $user->kirby()->session()->get('kirby.challenge.code');
if (is_string($hash) !== true) {
return false;

View file

@ -73,6 +73,13 @@ class Block extends Item
{
parent::__construct($params);
// @deprecated import old builder format
// @todo block.converter remove eventually
// @codeCoverageIgnoreStart
$params = BlockConverter::builderBlock($params);
$params = BlockConverter::editorBlock($params);
// @codeCoverageIgnoreEnd
if (isset($params['type']) === false) {
throw new InvalidArgumentException('The block type is missing');
}

View file

@ -0,0 +1,285 @@
<?php
namespace Kirby\Cms;
/**
* Converts the data from the old builder and editor fields
* to the format supported by the new block field.
* @since 3.9.0
* @deprecated
*
* @todo block.converter remove eventually
* @codeCoverageIgnore
*
* @package Kirby Cms
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier GmbH
* @license https://getkirby.com/license
*/
class BlockConverter
{
public static function builderBlock(array $params): array
{
if (isset($params['_key']) === false) {
return $params;
}
$params['type'] = $params['_key'];
$params['content'] = $params;
unset($params['_uid']);
return $params;
}
public static function editorBlock(array $params): array
{
if (static::isEditorBlock($params) === false) {
return $params;
}
$method = 'editor' . $params['type'];
if (method_exists(static::class, $method) === true) {
$params = static::$method($params);
} else {
$params = static::editorCustom($params);
}
return $params;
}
public static function editorBlocks(array $blocks = []): array
{
if (empty($blocks) === true) {
return $blocks;
}
if (static::isEditorBlock($blocks[0]) === false) {
return $blocks;
}
$list = [];
$listStart = null;
foreach ($blocks as $index => $block) {
if (in_array($block['type'], ['ul', 'ol']) === true) {
$prev = $blocks[$index-1] ?? null;
$next = $blocks[$index+1] ?? null;
// new list starts here
if (!$prev || $prev['type'] !== $block['type']) {
$listStart = $index;
}
// add the block to the list
$list[] = $block;
// list ends here
if (!$next || $next['type'] !== $block['type']) {
$blocks[$listStart] = [
'content' => [
'text' =>
'<' . $block['type'] . '>' .
implode(array_map(
fn ($item) => '<li>' . $item['content'] . '</li>',
$list
)) .
'</' . $block['type'] . '>',
],
'type' => 'list'
];
$start = $listStart + 1;
$end = $listStart + count($list);
for ($x = $start; $x <= $end; $x++) {
$blocks[$x] = false;
}
$listStart = null;
$list = [];
}
} else {
$blocks[$index] = static::editorBlock($block);
}
}
return array_filter($blocks);
}
public static function editorBlockquote(array $params): array
{
return [
'content' => [
'text' => $params['content']
],
'type' => 'quote'
];
}
public static function editorCode(array $params): array
{
return [
'content' => [
'language' => $params['attrs']['language'] ?? null,
'code' => $params['content']
],
'type' => 'code'
];
}
public static function editorCustom(array $params): array
{
return [
'content' => array_merge(
$params['attrs'] ?? [],
[
'body' => $params['content'] ?? null
]
),
'type' => $params['type'] ?? 'unknown'
];
}
public static function editorH1(array $params): array
{
return static::editorHeading($params, 'h1');
}
public static function editorH2(array $params): array
{
return static::editorHeading($params, 'h2');
}
public static function editorH3(array $params): array
{
return static::editorHeading($params, 'h3');
}
public static function editorH4(array $params): array
{
return static::editorHeading($params, 'h4');
}
public static function editorH5(array $params): array
{
return static::editorHeading($params, 'h5');
}
public static function editorH6(array $params): array
{
return static::editorHeading($params, 'h6');
}
public static function editorHr(array $params): array
{
return [
'content' => [],
'type' => 'line'
];
}
public static function editorHeading(array $params, string $level = 'h1'): array
{
return [
'content' => [
'level' => $level,
'text' => $params['content']
],
'type' => 'heading'
];
}
public static function editorImage(array $params): array
{
// internal image
if (isset($params['attrs']['id']) === true) {
return [
'content' => [
'alt' => $params['attrs']['alt'] ?? null,
'caption' => $params['attrs']['caption'] ?? null,
'image' => $params['attrs']['id'] ?? $params['attrs']['src'] ?? null,
'location' => 'kirby',
'ratio' => $params['attrs']['ratio'] ?? null,
],
'type' => 'image'
];
}
return [
'content' => [
'alt' => $params['attrs']['alt'] ?? null,
'caption' => $params['attrs']['caption'] ?? null,
'src' => $params['attrs']['src'] ?? null,
'location' => 'web',
'ratio' => $params['attrs']['ratio'] ?? null,
],
'type' => 'image'
];
}
public static function editorKirbytext(array $params): array
{
return [
'content' => [
'text' => $params['content']
],
'type' => 'markdown'
];
}
public static function editorOl(array $params): array
{
return [
'content' => [
'text' => $params['content']
],
'type' => 'list'
];
}
public static function editorParagraph(array $params): array
{
return [
'content' => [
'text' => '<p>' . $params['content'] . '</p>'
],
'type' => 'text'
];
}
public static function editorUl(array $params): array
{
return [
'content' => [
'text' => $params['content']
],
'type' => 'list'
];
}
public static function editorVideo(array $params): array
{
return [
'content' => [
'caption' => $params['attrs']['caption'] ?? null,
'url' => $params['attrs']['src'] ?? null
],
'type' => 'video'
];
}
public static function isEditorBlock(array $params): bool
{
if (isset($params['attrs']) === true) {
return true;
}
if (is_string($params['content'] ?? null) === true) {
return true;
}
return false;
}
}

View file

@ -2,9 +2,12 @@
namespace Kirby\Cms;
use Exception;
use Kirby\Data\Json;
use Kirby\Data\Yaml;
use Kirby\Parsley\Parsley;
use Kirby\Parsley\Schema\Blocks as BlockSchema;
use Kirby\Toolkit\A;
use Kirby\Toolkit\Str;
use Throwable;
@ -58,6 +61,12 @@ class Blocks extends Items
{
$items = static::extractFromLayouts($items);
// @deprecated old editor format
// @todo block.converter remove eventually
// @codeCoverageIgnoreStart
$items = BlockConverter::editorBlocks($items);
// @codeCoverageIgnoreEnd
return parent::factory($items, $params);
}
@ -73,8 +82,13 @@ class Blocks extends Items
return [];
}
// no columns = no layout
if (array_key_exists('columns', $input[0]) === false) {
if (
// no columns = no layout
array_key_exists('columns', $input[0]) === false ||
// @deprecated checks if this is a block for the builder plugin
// @todo block.converter remove eventually
array_key_exists('_key', $input[0]) === true
) {
return $input;
}
@ -115,8 +129,33 @@ class Blocks extends Items
try {
$input = Json::decode((string)$input);
} catch (Throwable) {
$parser = new Parsley((string)$input, new BlockSchema());
$input = $parser->blocks();
// @deprecated try to import the old YAML format
// @todo block.converter remove eventually
// @codeCoverageIgnoreStart
try {
$yaml = Yaml::decode((string)$input);
$first = A::first($yaml);
// check for valid yaml
if (
empty($yaml) === true ||
(
isset($first['_key']) === false &&
isset($first['type']) === false
)
) {
throw new Exception('Invalid YAML');
} else {
$input = $yaml;
}
} catch (Throwable $e) {
// the next 2 lines remain after removing block.converter
// @codeCoverageIgnoreEnd
$parser = new Parsley((string)$input, new BlockSchema());
$input = $parser->blocks();
// @codeCoverageIgnoreStart
}
// @codeCoverageIgnoreEnd
}
}

View file

@ -115,8 +115,9 @@ class ContentTranslation
*/
public function exists(): bool
{
return empty($this->content) === false ||
file_exists($this->contentFile()) === true;
return
empty($this->content) === false ||
file_exists($this->contentFile()) === true;
}
/**

View file

@ -132,7 +132,7 @@ class Email
*
* @param string $name Template name
* @param string|null $type `html` or `text`
* @return \Kirby\Cms\Template
* @return \Kirby\Template\Template
*/
protected function getTemplate(string $name, string $type = null)
{

View file

@ -179,7 +179,7 @@ class File extends ModelWithContent
public function contentFileData(array $data, string $languageCode = null): array
{
return A::append($data, [
'template' => $this->template(),
'template' => $data['template'] ?? $this->template(),
]);
}

View file

@ -169,11 +169,12 @@ trait FileActions
* way of generating files.
*
* @param array $props
* @param bool $move If set to `true`, the source will be deleted
* @return static
* @throws \Kirby\Exception\InvalidArgumentException
* @throws \Kirby\Exception\LogicException
*/
public static function create(array $props)
public static function create(array $props, bool $move = false)
{
if (isset($props['source'], $props['parent']) === false) {
throw new InvalidArgumentException('Please provide the "source" and "parent" props for the File');
@ -204,12 +205,16 @@ trait FileActions
$file = $file->clone(['content' => $form->strings(true)]);
// run the hook
return $file->commit('create', compact('file', 'upload'), function ($file, $upload) {
$arguments = compact('file', 'upload');
return $file->commit('create', $arguments, function ($file, $upload) use ($move) {
// remove all public versions, lock and clear UUID cache
$file->unpublish();
// only move the original source if intended
$method = $move === true ? 'move' : 'copy';
// overwrite the original
if (F::copy($upload->root(), $file->root(), true) !== true) {
if (F::$method($upload->root(), $file->root(), true) !== true) {
throw new LogicException('The file could not be created');
}
@ -280,10 +285,11 @@ trait FileActions
* source.
*
* @param string $source
* @param bool $move If set to `true`, the source will be deleted
* @return static
* @throws \Kirby\Exception\LogicException
*/
public function replace(string $source)
public function replace(string $source, bool $move = false)
{
$file = $this->clone();
@ -292,12 +298,15 @@ trait FileActions
'upload' => $file->asset($source)
];
return $this->commit('replace', $arguments, function ($file, $upload) {
return $this->commit('replace', $arguments, function ($file, $upload) use ($move) {
// delete all public versions
$file->unpublish(true);
// only move the original source if intended
$method = $move === true ? 'move' : 'copy';
// overwrite the original
if (F::copy($upload->root(), $file->root(), true) !== true) {
if (F::$method($upload->root(), $file->root(), true) !== true) {
throw new LogicException('The file could not be created');
}

View file

@ -57,16 +57,17 @@ trait HasFiles
* Creates a new file
*
* @param array $props
* @param bool $move If set to `true`, the source will be deleted
* @return \Kirby\Cms\File
*/
public function createFile(array $props)
public function createFile(array $props, bool $move = false)
{
$props = array_merge($props, [
'parent' => $this,
'url' => null
]);
return File::create($props);
return File::create($props, $move);
}
/**

View file

@ -19,18 +19,57 @@ use Kirby\Toolkit\Str;
class Helpers
{
/**
* Triggers a deprecation warning if debug mode is active
* Allows to disable specific deprecation warnings
* by setting them to `false`.
* You can do this by putting the following code in
* `site/config/config.php`:
*
* @param string $message
* ```php
* Helpers::$deprecations['<deprecation-key>'] = false;
* ```
*/
public static $deprecations = [
// Passing the $slot or $slots variables to snippets is
// deprecated and will break in a future version.
'snippet-pass-slots' => true,
// The `Toolkit\Query` class has been deprecated and will
// be removed in a future version. Use `Query\Query` instead:
// Kirby\Query\Query::factory($query)->resolve($data).
'toolkit-query-class' => true,
// Passing an empty string as value to `Xml::attr()` has been
// deprecated. In a future version, passing an empty string won't
// omit the attribute anymore but render it with an empty value.
// To omit the attribute, please pass `null`.
'xml-attr-empty-string' => false,
];
/**
* Triggers a deprecation warning if debug mode is active
* and warning has not been surpressed via `Helpers::$deprecations`
*
* @param string|null $key If given, the key will be checked against the static array
* @return bool Whether the warning was triggered
*/
public static function deprecated(string $message): bool
public static function deprecated(string $message, string|null $key = null): bool
{
if (App::instance()->option('debug') === true) {
return trigger_error($message, E_USER_DEPRECATED) === true;
// only trigger warning in debug mode or when running PHPUnit tests
// @codeCoverageIgnoreStart
if (
App::instance()->option('debug') !== true &&
(defined('KIRBY_TESTING') !== true || KIRBY_TESTING !== true)
) {
return false;
}
// @codeCoverageIgnoreEnd
// don't trigger the warning if disabled by default or by the dev
if ($key !== null && (static::$deprecations[$key] ?? true) === false) {
return false;
}
return false;
return trigger_error($message, E_USER_DEPRECATED) === true;
}
/**

View file

@ -45,7 +45,8 @@ class Html extends \Kirby\Toolkit\Html
}
}
// only valid value for 'rel' is 'alternate stylesheet', if 'title' is given as well
// only valid value for 'rel' is 'alternate stylesheet',
// if 'title' is given as well
if (
($options['rel'] ?? '') !== 'alternate stylesheet' ||
($options['title'] ?? '') === ''

View file

@ -26,6 +26,8 @@ class Item
public const ITEMS_CLASS = Items::class;
protected Field|null $field;
/**
* @var string
*/
@ -57,6 +59,7 @@ class Item
$this->id = $params['id'] ?? Str::uuid();
$this->params = $params;
$this->field = $params['field'] ?? null;
$this->parent = $params['parent'] ?? App::instance()->site();
$this->siblings = $params['siblings'] ?? new $siblingsClass();
}
@ -72,6 +75,14 @@ class Item
return new static($params);
}
/**
* Returns the parent field if known
*/
public function field(): Field|null
{
return $this->field;
}
/**
* Returns the unique item id (UUID v4)
*

View file

@ -19,6 +19,8 @@ class Items extends Collection
{
public const ITEM_CLASS = Item::class;
protected Field|null $field;
/**
* @var array
*/
@ -39,6 +41,7 @@ class Items extends Collection
{
$this->options = $options;
$this->parent = $options['parent'] ?? App::instance()->site();
$this->field = $options['field'] ?? null;
parent::__construct($objects, $this->parent);
}
@ -54,6 +57,7 @@ class Items extends Collection
public static function factory(array $items = null, array $params = [])
{
$options = array_merge([
'field' => null,
'options' => [],
'parent' => App::instance()->site(),
], $params);
@ -74,6 +78,7 @@ class Items extends Collection
continue;
}
$params['field'] = $options['field'];
$params['options'] = $options['options'];
$params['parent'] = $options['parent'];
$params['siblings'] = $collection;
@ -85,6 +90,14 @@ class Items extends Collection
return $collection;
}
/**
* Returns the parent field if known
*/
public function field(): Field|null
{
return $this->field;
}
/**
* Convert the items to an array
*

View file

@ -658,12 +658,8 @@ class Language extends Model
*/
public function url(): string
{
$url = $this->url;
if ($url === null) {
$url = '/' . $this->code;
}
$url = $this->url;
$url ??= '/' . $this->code;
return Url::makeAbsolute($url, $this->kirby()->url());
}

View file

@ -56,6 +56,7 @@ class Layout extends Item
parent::__construct($params);
$this->columns = LayoutColumns::factory($params['columns'] ?? [], [
'field' => $this->field,
'parent' => $this->parent
]);

View file

@ -41,6 +41,7 @@ class LayoutColumn extends Item
parent::__construct($params);
$this->blocks = Blocks::factory($params['blocks'] ?? [], [
'field' => $this->field,
'parent' => $this->parent
]);

View file

@ -98,6 +98,9 @@ class Layouts extends Items
}
}
return Blocks::factory($blocks);
return Blocks::factory($blocks, [
'field' => $this->field,
'parent' => $this->parent
]);
}
}

View file

@ -629,13 +629,11 @@ abstract class ModelWithContent extends Model implements Identifiable
]);
// validate the input
if ($validate === true) {
if ($form->isInvalid() === true) {
throw new InvalidArgumentException([
'fallback' => 'Invalid form with errors',
'details' => $form->errors()
]);
}
if ($validate === true && $form->isInvalid() === true) {
throw new InvalidArgumentException([
'fallback' => 'Invalid form with errors',
'details' => $form->errors()
]);
}
$arguments = [static::CLASS_ALIAS => $this, 'values' => $form->data(), 'strings' => $form->strings(), 'languageCode' => $languageCode];

View file

@ -96,7 +96,7 @@ class Page extends ModelWithContent
* The template, that should be loaded
* if it exists
*
* @var \Kirby\Cms\Template
* @var \Kirby\Template\Template
*/
protected $intendedTemplate;
@ -143,7 +143,7 @@ class Page extends ModelWithContent
/**
* The intended page template
*
* @var \Kirby\Cms\Template
* @var \Kirby\Template\Template
*/
protected $template;
@ -504,7 +504,7 @@ class Page extends ModelWithContent
* Returns the template that should be
* loaded if it exists.
*
* @return \Kirby\Cms\Template
* @return \Kirby\Template\Template
*/
public function intendedTemplate()
{
@ -1096,7 +1096,7 @@ class Page extends ModelWithContent
/**
* @internal
* @param mixed $type
* @return \Kirby\Cms\Template
* @return \Kirby\Template\Template
* @throws \Kirby\Exception\NotFoundException If the content representation cannot be found
*/
public function representation($type)
@ -1277,13 +1277,13 @@ class Page extends ModelWithContent
public function slug(string $languageCode = null): string
{
if ($this->kirby()->multilang() === true) {
if ($languageCode === null) {
$languageCode = $this->kirby()->languageCode();
}
$languageCode ??= $this->kirby()->languageCode();
$defaultLanguageCode = $this->kirby()->defaultLanguage()->code();
if ($languageCode !== $defaultLanguageCode && $translation = $this->translations()->find($languageCode)) {
if (
$languageCode !== $defaultLanguageCode &&
$translation = $this->translations()->find($languageCode)
) {
return $translation->slug() ?? $this->slug;
}
}
@ -1313,7 +1313,7 @@ class Page extends ModelWithContent
/**
* Returns the final template
*
* @return \Kirby\Cms\Template
* @return \Kirby\Template\Template
*/
public function template()
{

View file

@ -223,7 +223,7 @@ trait PageActions
throw new InvalidArgumentException('Use the changeSlug method to change the slug for the default language');
}
$arguments = ['page' => $this, 'slug' => $slug, 'languageCode' => $languageCode];
$arguments = ['page' => $this, 'slug' => $slug, 'languageCode' => $language->code()];
return $this->commit('changeSlug', $arguments, function ($page, $slug, $languageCode) {
// remove the slug if it's the same as the folder name
if ($slug === $page->uid()) {
@ -521,9 +521,9 @@ trait PageActions
public static function create(array $props)
{
// clean up the slug
$props['slug'] = Str::slug($props['slug'] ?? $props['content']['title'] ?? null);
$props['template'] = $props['model'] = strtolower($props['template'] ?? 'default');
$props['isDraft'] = ($props['draft'] ?? true);
$props['slug'] = Str::slug($props['slug'] ?? $props['content']['title'] ?? null);
$props['template'] = $props['model'] = strtolower($props['template'] ?? 'default');
$props['isDraft'] ??= $props['draft'] ?? true;
// make sure that a UUID gets generated and
// added to content right away
@ -620,9 +620,7 @@ trait PageActions
->count();
// default positioning at the end
if ($num === null) {
$num = $max;
}
$num ??= $max;
// avoid zeros or negative numbers
if ($num < 1) {

View file

@ -204,7 +204,12 @@ class PageRules
]);
}
if (count($page->blueprints()) <= 1) {
$blueprints = $page->blueprints();
if (
count($blueprints) <= 1 ||
in_array($template, array_column($blueprints, 'name')) === false
) {
throw new LogicException([
'key' => 'page.changeTemplate.invalid',
'data' => ['slug' => $page->slug()]

View file

@ -154,10 +154,10 @@ class Pages extends Collection
*
* @param array $pages
* @param \Kirby\Cms\Model|null $model
* @param bool $draft
* @param bool|null $draft
* @return static
*/
public static function factory(array $pages, Model $model = null, bool $draft = false)
public static function factory(array $pages, Model $model = null, bool $draft = null)
{
$model ??= App::instance()->site();
$children = new static([], $model);
@ -175,7 +175,7 @@ class Pages extends Collection
$props['kirby'] = $kirby;
$props['parent'] = $parent;
$props['site'] = $site;
$props['isDraft'] = $draft;
$props['isDraft'] = $draft ?? $props['isDraft'] ?? $props['draft'] ?? false;
$page = Page::factory($props);

View file

@ -255,9 +255,7 @@ class Plugin extends Model
}
}
if ($option === null) {
$option = $kirby->option('updates') ?? true;
}
$option ??= $kirby->option('updates') ?? true;
if ($option !== true) {
return null;

View file

@ -31,63 +31,37 @@ use Throwable;
*/
class System
{
/**
* @var \Kirby\Cms\App
*/
protected $app;
// cache
protected UpdateStatus|null $updateStatus = null;
/**
* @param \Kirby\Cms\App $app
*/
public function __construct(App $app)
public function __construct(protected App $app)
{
$this->app = $app;
// try to create all folders that could be missing
$this->init();
}
/**
* Improved `var_dump` output
*
* @return array
*/
public function __debugInfo(): array
{
return $this->toArray();
}
/**
* Check for a writable accounts folder
*
* @return bool
*/
public function accounts(): bool
{
return is_writable($this->app->root('accounts'));
return is_writable($this->app->root('accounts')) === true;
}
/**
* Check for a writable content folder
*
* @return bool
*/
public function content(): bool
{
return is_writable($this->app->root('content'));
return is_writable($this->app->root('content')) === true;
}
/**
* Check for an existing curl extension
*
* @return bool
*/
public function curl(): bool
{
return extension_loaded('curl');
return extension_loaded('curl') === true;
}
/**
@ -96,7 +70,6 @@ class System
* root. Otherwise it will return null.
*
* @param string $folder 'git', 'content', 'site', 'kirby'
* @return string|null
*/
public function exposedFileUrl(string $folder): string|null
{
@ -142,19 +115,20 @@ class System
* root. Otherwise it will return null.
*
* @param string $folder 'git', 'content', 'site', 'kirby'
* @return string|null
*/
public function folderUrl(string $folder): string|null
{
$index = $this->app->root('index');
$root = match ($folder) {
'git' => $index . '/.git',
default => $this->app->root($folder)
};
if ($folder === 'git') {
$root = $index . '/.git';
} else {
$root = $this->app->root($folder);
}
if ($root === null || is_dir($root) === false || is_dir($index) === false) {
if (
$root === null ||
is_dir($root) === false ||
is_dir($index) === false
) {
return null;
}
@ -180,22 +154,22 @@ class System
/**
* Returns the app's human-readable
* index URL without scheme
*
* @return string
*/
public function indexUrl(): string
{
return $this->app->url('index', true)->setScheme(null)->setSlash(false)->toString();
return $this->app->url('index', true)
->setScheme(null)
->setSlash(false)
->toString();
}
/**
* Create the most important folders
* if they don't exist yet
*
* @return void
* @throws \Kirby\Exception\PermissionException
*/
public function init()
public function init(): void
{
// init /site/accounts
try {
@ -231,18 +205,16 @@ class System
* On a public server the panel.install
* option must be explicitly set to true
* to get the installer up and running.
*
* @return bool
*/
public function isInstallable(): bool
{
return $this->isLocal() === true || $this->app->option('panel.install', false) === true;
return
$this->isLocal() === true ||
$this->app->option('panel.install', false) === true;
}
/**
* Check if Kirby is already installed
*
* @return bool
*/
public function isInstalled(): bool
{
@ -251,8 +223,6 @@ class System
/**
* Check if this is a local installation
*
* @return bool
*/
public function isLocal(): bool
{
@ -261,8 +231,6 @@ class System
/**
* Check if all tests pass
*
* @return bool
*/
public function isOk(): bool
{
@ -311,7 +279,9 @@ class System
$pubKey = F::read($this->app->root('kirby') . '/kirby.pub');
// verify the license signature
if (openssl_verify(json_encode($data), hex2bin($license['signature']), $pubKey, 'RSA-SHA256') !== 1) {
$data = json_encode($data);
$signature = hex2bin($license['signature']);
if (openssl_verify($data, $signature, $pubKey, 'RSA-SHA256') !== 1) {
return false;
}
@ -338,9 +308,7 @@ class System
*/
protected function licenseUrl(string $url = null): string
{
if ($url === null) {
$url = $this->indexUrl();
}
$url ??= $this->indexUrl();
// remove common "testing" subdomains as well as www.
// to ensure that installations of the same site have
@ -371,8 +339,6 @@ class System
* Returns the configured UI modes for the login form
* with their respective options
*
* @return array
*
* @throws \Kirby\Exception\InvalidArgumentException If the configuration is invalid
* (only in debug mode)
*/
@ -431,45 +397,38 @@ class System
/**
* Check for an existing mbstring extension
*
* @return bool
*/
public function mbString(): bool
{
return extension_loaded('mbstring');
return extension_loaded('mbstring') === true;
}
/**
* Check for a writable media folder
*
* @return bool
*/
public function media(): bool
{
return is_writable($this->app->root('media'));
return is_writable($this->app->root('media')) === true;
}
/**
* Check for a valid PHP version
*
* @return bool
*/
public function php(): bool
{
return
version_compare(PHP_VERSION, '8.0.0', '>=') === true &&
version_compare(PHP_VERSION, '8.2.0', '<') === true;
version_compare(PHP_VERSION, '8.3.0', '<') === true;
}
/**
* Returns a sorted collection of all
* installed plugins
*
* @return \Kirby\Cms\Collection
*/
public function plugins()
public function plugins(): Collection
{
return (new Collection(App::instance()->plugins()))->sortBy('name', 'asc');
$plugins = new Collection($this->app->plugins());
return $plugins->sortBy('name', 'asc');
}
/**
@ -477,24 +436,17 @@ class System
* and adds it to the .license file in the config
* folder if possible.
*
* @param string|null $license
* @param string|null $email
* @return bool
* @throws \Kirby\Exception\Exception
* @throws \Kirby\Exception\InvalidArgumentException
*/
public function register(string $license = null, string $email = null): bool
{
if (Str::startsWith($license, 'K3-PRO-') === false) {
throw new InvalidArgumentException([
'key' => 'license.format'
]);
throw new InvalidArgumentException(['key' => 'license.format']);
}
if (V::email($email) === false) {
throw new InvalidArgumentException([
'key' => 'license.email'
]);
throw new InvalidArgumentException(['key' => 'license.email']);
}
// @codeCoverageIgnoreStart
@ -534,8 +486,6 @@ class System
/**
* Check for a valid server environment
*
* @return bool
*/
public function server(): bool
{
@ -544,8 +494,6 @@ class System
/**
* Returns the detected server software
*
* @return string|null
*/
public function serverSoftware(): string|null
{
@ -566,18 +514,14 @@ class System
/**
* Check for a writable sessions folder
*
* @return bool
*/
public function sessions(): bool
{
return is_writable($this->app->root('sessions'));
return is_writable($this->app->root('sessions')) === true;
}
/**
* Get an status array of all checks
*
* @return array
*/
public function status(): array
{
@ -597,23 +541,18 @@ class System
* Returns the site's title as defined in the
* content file or `site.yml` blueprint
* @since 3.6.0
*
* @return string
*/
public function title(): string
{
$site = $this->app->site();
if ($site->title()->isNotEmpty()) {
if ($site->title()->isNotEmpty() === true) {
return $site->title()->value();
}
return $site->blueprint()->title();
}
/**
* @return array
*/
public function toArray(): array
{
return $this->status();
@ -633,7 +572,9 @@ class System
}
$kirby = $this->app;
$option = $kirby->option('updates.kirby') ?? $kirby->option('updates') ?? true;
$option =
$kirby->option('updates.kirby') ??
$kirby->option('updates', true);
if ($option === false) {
return null;
@ -648,11 +589,8 @@ class System
/**
* Upgrade to the new folder separator
*
* @param string $root
* @return void
*/
public static function upgradeContent(string $root)
public static function upgradeContent(string $root): void
{
$index = Dir::read($root);
@ -666,4 +604,12 @@ class System
}
}
}
/**
* Improved `var_dump` output
*/
public function __debugInfo(): array
{
return $this->toArray();
}
}

View file

@ -435,9 +435,7 @@ class UpdateStatus
// verify that we found at least one possible version;
// otherwise try the `$maxVersion` as a last chance before
// concluding at the top that we cannot solve the task
if ($incidentVersion === null) {
$incidentVersion = $maxVersion;
}
$incidentVersion ??= $maxVersion;
// we need a version that fixes all vulnerabilities, so use the
// "largest of the smallest" fixed versions

Some files were not shown because too many files have changed in this diff Show more