Compare commits

..

17 Commits

Author SHA1 Message Date
adc2fae5af change the hug of trees 2026-03-25 16:17:18 +01:00
30431491e2 added more text 2026-03-25 16:12:56 +01:00
6f31b28e8c test change 2026-03-25 16:08:25 +01:00
KirbyCMS Deploy
dba516f484 Replace MindBoost with Hocus Fokus in README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 15:00:47 +00:00
KirbyCMS Deploy
3fc57831eb Replace README with developer contribution guide
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:59:47 +00:00
KirbyCMS Deploy
97da8f7079 Fix deploy webhook: use putenv to set HOME before git pull
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:51:12 +00:00
KirbyCMS Deploy
3fe23d469f Fix deploy webhook: set HOME for git pull in shell_exec
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:50:48 +00:00
KirbyCMS Deploy
a6550c95fb Add Gitea webhook deploy handler
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 13:39:56 +00:00
MindBoost Deploy
fd06ae62d4 Configure Kirby for web.mindboost.team deployment
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 13:37:54 +00:00
Bastian Allgeier
63ddf40692 Upgrade to 4.5.0 2024-11-28 11:24:28 +01:00
Bastian Allgeier
49287c7a5e Upgrade to 4.4.1 2024-09-23 11:46:43 +02:00
Bastian Allgeier
8bc7250b68 Upgrade to 4.4.0 2024-09-12 14:43:02 +02:00
Lukas Bestle
a955c7822e Upgrade to 4.3.1 2024-08-29 11:03:34 +02:00
Bastian Allgeier
e50c0341fc Upgrade to 4.3.0 2024-06-13 12:13:00 +02:00
Nico Hoffmann ෴
4b55753c46 Use GitHub org funding file 2024-06-04 18:52:35 +02:00
Bastian Allgeier
7f4eb7509d Upgrade to 4.2.0 2024-04-10 11:09:52 +02:00
Bastian Allgeier
77d9337371 Upgrade to 4.1.2 2024-03-06 12:42:16 +01:00
220 changed files with 3267 additions and 1523 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1 +0,0 @@
custom: ['https://getkirby.com/buy']

115
README.md
View File

@@ -1,44 +1,79 @@
<img src="http://getkirby.com/assets/images/github/starterkit.jpg" width="300">
# hocusfokus-web
**Kirby: the CMS that adapts to any project, loved by developers and editors alike.**
The Starterkit is a full-blown Kirby installation with a lot of example content, blueprints, templates and more.
It is ideal for new users to explore many of Kirby's options and get to know the Panel.
You can learn more about Kirby at [getkirby.com](https://getkirby.com).
<img src="http://getkirby.com/assets/images/github/starterkit-screen.png" />
### Try Kirby for free
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).
The Starterkit is a demo of basic Kirby features. It's not recommended to be used "as is" in production. Please, follow our documentation closely for more features and guides on how to build secure, high-quality websites with Kirby.
While Kirby as the CMS software itself requires you to purchase a license, we consider the files primarily connected to this Starterkit (assets, templates, snippets...) free to use under the MIT license. Feel free to start building your own project with them.
### Get going
Read our guide on [how to get started with Kirby](https://getkirby.com/docs/guide/quickstart).
You can download the latest version of the Starterkit from https://download.getkirby.com/.
If you are familiar with Git, you can clone Kirby's Starterkit repository from Github.
git clone https://github.com/getkirby/starterkit.git
## 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.
- **[Documentation](https://getkirby.com/docs/guide)** Read the official guide, reference and cookbook recipes.
- **[Issues](https://github.com/getkirby/kirby/issues)** Report bugs and other problems.
- **[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.
- **[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.
Die Website von **hocusfokus** basiert auf [Kirby CMS](https://getkirby.com) und wird auf `https://web.mindboost.team` gehostet.
---
© 2009 Bastian Allgeier
[getkirby.com](https://getkirby.com) · [License agreement](https://getkirby.com/license)
## Für Entwickler: So funktioniert der Workflow
### Voraussetzungen
- Git-Zugang zum Repo: `https://gitea.mindboost.team/hocusfokus/hocusfokus-web.git`
- Schreibrechte auf dem `main`-Branch
### Repository klonen
```bash
git clone https://gitea.mindboost.team/hocusfokus/hocusfokus-web.git
cd hocusfokus-web
```
### Lokale Entwicklung
Kirby läuft ohne Datenbank alle Inhalte liegen als Dateien im `content/`-Ordner. Für eine lokale Vorschau reicht ein einfacher PHP-Server:
```bash
php -S localhost:8000
```
Danach ist die Seite unter `http://localhost:8000` und das Panel unter `http://localhost:8000/panel` erreichbar.
> **Hinweis:** Die Datei `site/config/config.php` enthält die URL-Konfiguration für die Produktionsumgebung. Lokal kann es sein, dass Kirby eine Warnung wegen der URL zeigt das ist normal und beeinflusst die Entwicklung nicht.
### Änderungen deployen
Das Deployment läuft vollautomatisch über einen Gitea-Webhook:
1. Änderungen committen und auf `main` pushen
2. Gitea löst automatisch einen Webhook aus
3. Der Server führt `git pull` im Produktionsverzeichnis aus
4. Die Änderungen sind sofort live auf `https://web.mindboost.team`
```bash
git add .
git commit -m "Beschreibung der Änderung"
git push origin main
```
> Pushes auf andere Branches lösen **kein** Deployment aus. Nur `main` wird automatisch deployed.
### Projektstruktur
```
├── assets/ # CSS, JS, Bilder (Theme-Dateien)
├── content/ # Alle Seiteninhalte als Textdateien
├── kirby/ # Kirby CMS Core (nicht bearbeiten)
├── media/ # Automatisch generierter Cache (nicht committen)
├── site/
│ ├── blueprints/ # Panel-Konfiguration (Felder, Layouts)
│ ├── config/ # Kirby-Konfiguration
│ ├── plugins/ # Erweiterungen
│ ├── snippets/ # Wiederverwendbare Template-Teile
│ └── templates/ # Seitentemplates
└── index.php # Einstiegspunkt
```
### Was gehört ins Repo, was nicht?
| Gehört rein | Gehört **nicht** rein |
|---|---|
| `content/` | `media/` (automatisch generiert) |
| `assets/` | `site/accounts/` (Benutzerkonten) |
| `site/` | `site/sessions/` (Sitzungsdaten) |
| `kirby/` | `site/cache/` (Cache) |
Die `.gitignore` ist bereits entsprechend konfiguriert.
---
Fragen zum Setup? Wende dich an das Hocus Fokus-Team.

View File

@@ -10,11 +10,11 @@ Headline:
----
Subheadline: Our friends with leaves
Subheadline: Our friends with leaves are trees
----
Text: <p>Hug them if you like. They might not appreciate it though.</p><p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum id ligula porta felis euismod semper. Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod.</p>
Text: <p>I like to hug them. They might not appreciate it though.</p><p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum id ligula porta felis euismod semper. Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod.</p>
----

View File

@@ -2,11 +2,11 @@ Title: Home
----
Headline: Welcome to Kirby's Starterkit
Headline: Welcome to Hocus Fokus Fidibus
----
Subheadline: A fully documented example project
Subheadline: Gespräche weg hex hex.
----

49
deploy.php Normal file
View File

@@ -0,0 +1,49 @@
<?php
/**
* Gitea Webhook Deploy Handler
* Called by Gitea on push to main branch.
*
* Set DEPLOY_SECRET in Gitea webhook settings and
* configure the same value in the DEPLOY_SECRET env var
* (or hardcode it below for simple setups).
*/
$secret = getenv('DEPLOY_SECRET') ?: '';
if (empty($secret)) {
http_response_code(500);
die('DEPLOY_SECRET not configured.');
}
// Verify Gitea HMAC-SHA256 signature
$signature = $_SERVER['HTTP_X_GITEA_SIGNATURE'] ?? '';
$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(403);
die('Invalid signature.');
}
// Only act on push events
$event = $_SERVER['HTTP_X_GITEA_EVENT'] ?? '';
if ($event !== 'push') {
http_response_code(200);
die('Ignored: not a push event.');
}
// Only deploy on main branch
$payload = json_decode($body, true);
$ref = $payload['ref'] ?? '';
if ($ref !== 'refs/heads/main') {
http_response_code(200);
die('Ignored: not main branch.');
}
// Run git pull (HOME must be set explicitly since PHP's shell_exec doesn't inherit it)
putenv('HOME=/var/www');
$output = shell_exec('git -C /var/www/html pull 2>&1');
http_response_code(200);
header('Content-Type: text/plain');
echo "Deploy triggered:\n" . $output;

View File

@@ -16,6 +16,7 @@ This is Kirby's core application folder. Get started with one of the following r
<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).
### Contribute
@@ -30,6 +31,7 @@ If you have ideas for a feature or enhancement for Kirby, please use our [feedba
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.
- **[Documentation](https://getkirby.com/docs/guide)** Read the official guide, reference and cookbook recipes.
@@ -43,5 +45,5 @@ Read about how to contribute to the development in our [contributing guide](/CON
---
© 2009-2023 Bastian Allgeier
© 2009 Bastian Allgeier
[getkirby.com](https://getkirby.com) · [License agreement](https://getkirby.com/license)

View File

@@ -1,7 +1,9 @@
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Dec 12 04:12:04 2023 GMT
## Certificate data from Mozilla as of: Tue Nov 26 13:58:25 2024 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +16,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 1970dd65858925d68498d2356aea6d03f764422523c5887deca8ce3ba9e1f845
## SHA256: 36105b01631f9fc03b1eca779b44a30a1a5890b9bf8dc07ccb001a07301e01cf
##
@@ -3532,3 +3534,163 @@ dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
lM47ni3niAIi9G7oyOzWPPO5std3eqx7
-----END CERTIFICATE-----
Telekom Security TLS ECC Root 2020
==================================
-----BEGIN CERTIFICATE-----
MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
ga/sf+Rn27iQ7t0l
-----END CERTIFICATE-----
Telekom Security TLS RSA Root 2023
==================================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE-----
FIRMAPROFESIONAL CA ROOT-A WEB
==============================
-----BEGIN CERTIFICATE-----
MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF
UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4
MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2
WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h
bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM
IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6
iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg
st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD
Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA=
-----END CERTIFICATE-----
TWCA CYBER Root CA
==================
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
-----END CERTIFICATE-----
SecureSign Root CA12
====================
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
-----END CERTIFICATE-----
SecureSign Root CA14
====================
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
-----END CERTIFICATE-----
SecureSign Root CA15
====================
-----BEGIN CERTIFICATE-----
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
-----END CERTIFICATE-----

View File

@@ -3,7 +3,7 @@
"description": "The Kirby core",
"license": "proprietary",
"type": "kirby-cms",
"version": "4.1.1",
"version": "4.5.0",
"keywords": [
"kirby",
"cms",
@@ -37,16 +37,16 @@
"ext-mbstring": "*",
"ext-openssl": "*",
"christian-riesen/base32": "1.6.0",
"claviska/simpleimage": "4.0.6",
"composer/semver": "3.4.0",
"filp/whoops": "2.15.4",
"claviska/simpleimage": "4.2.0",
"composer/semver": "3.4.3",
"filp/whoops": "2.16.0",
"getkirby/composer-installer": "^1.2.1",
"laminas/laminas-escaper": "2.13.0",
"laminas/laminas-escaper": "2.14.0",
"michelf/php-smartypants": "1.8.1",
"phpmailer/phpmailer": "6.9.1",
"symfony/polyfill-intl-idn": "1.28.0",
"symfony/polyfill-mbstring": "1.28.0",
"symfony/yaml": "6.4.0"
"phpmailer/phpmailer": "6.9.2",
"symfony/polyfill-intl-idn": "1.31.0",
"symfony/polyfill-mbstring": "1.31.0",
"symfony/yaml": "6.4.13"
},
"replace": {
"symfony/polyfill-php72": "*"

193
kirby/composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "198d5d56dcbb8ba4ff42a1cb4a2630bc",
"content-hash": "f12b026f0a6ca67dc1bd0072f607d1eb",
"packages": [
{
"name": "christian-riesen/base32",
@@ -67,16 +67,16 @@
},
{
"name": "claviska/simpleimage",
"version": "4.0.6",
"version": "4.2.0",
"source": {
"type": "git",
"url": "https://github.com/claviska/SimpleImage.git",
"reference": "969de5e61810ef91f6f83c475b192c4841367dfa"
"reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/969de5e61810ef91f6f83c475b192c4841367dfa",
"reference": "969de5e61810ef91f6f83c475b192c4841367dfa",
"url": "https://api.github.com/repos/claviska/SimpleImage/zipball/dfbe53c01dae8467468ef2b817c09b786a7839d2",
"reference": "dfbe53c01dae8467468ef2b817c09b786a7839d2",
"shasum": ""
},
"require": {
@@ -108,7 +108,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/4.0.6"
"source": "https://github.com/claviska/SimpleImage/tree/4.2.0"
},
"funding": [
{
@@ -116,28 +116,28 @@
"type": "github"
}
],
"time": "2023-07-27T16:48:12+00:00"
"time": "2024-04-15T16:07:16+00:00"
},
{
"name": "composer/semver",
"version": "3.4.0",
"version": "3.4.3",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
"reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
"url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.4",
"symfony/phpunit-bridge": "^4.2 || ^5"
"phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
@@ -181,7 +181,7 @@
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.0"
"source": "https://github.com/composer/semver/tree/3.4.3"
},
"funding": [
{
@@ -197,30 +197,30 @@
"type": "tidelift"
}
],
"time": "2023-08-31T09:50:34+00:00"
"time": "2024-09-19T14:15:21+00:00"
},
{
"name": "filp/whoops",
"version": "2.15.4",
"version": "2.16.0",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
"reference": "befcdc0e5dce67252aa6322d82424be928214fa2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
"reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
"url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2",
"reference": "befcdc0e5dce67252aa6322d82424be928214fa2",
"shasum": ""
},
"require": {
"php": "^5.5.9 || ^7.0 || ^8.0",
"php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"require-dev": {
"mockery/mockery": "^0.9 || ^1.0",
"phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
"symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
"symfony/var-dumper": "^4.0 || ^5.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -260,7 +260,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.15.4"
"source": "https://github.com/filp/whoops/tree/2.16.0"
},
"funding": [
{
@@ -268,7 +268,7 @@
"type": "github"
}
],
"time": "2023-11-03T12:00:00+00:00"
"time": "2024-09-25T12:00:00+00:00"
},
{
"name": "getkirby/composer-installer",
@@ -319,33 +319,33 @@
},
{
"name": "laminas/laminas-escaper",
"version": "2.13.0",
"version": "2.14.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-escaper.git",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba"
"reference": "0f7cb975f4443cf22f33408925c231225cfba8cb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/0f7cb975f4443cf22f33408925c231225cfba8cb",
"reference": "0f7cb975f4443cf22f33408925c231225cfba8cb",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-mbstring": "*",
"php": "~8.1.0 || ~8.2.0 || ~8.3.0"
"php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"conflict": {
"zendframework/zend-escaper": "*"
},
"require-dev": {
"infection/infection": "^0.27.0",
"laminas/laminas-coding-standard": "~2.5.0",
"infection/infection": "^0.27.9",
"laminas/laminas-coding-standard": "~3.0.0",
"maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.6.7",
"psalm/plugin-phpunit": "^0.18.4",
"vimeo/psalm": "^5.9"
"phpunit/phpunit": "^9.6.16",
"psalm/plugin-phpunit": "^0.19.0",
"vimeo/psalm": "^5.21.1"
},
"type": "library",
"autoload": {
@@ -377,7 +377,7 @@
"type": "community_bridge"
}
],
"time": "2023-10-10T08:35:13+00:00"
"time": "2024-10-24T10:12:53+00:00"
},
{
"name": "league/color-extractor",
@@ -496,16 +496,16 @@
},
{
"name": "phpmailer/phpmailer",
"version": "v6.9.1",
"version": "v6.9.2",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
"reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a7b17b42fa4887c92146243f3d2f4ccb962af17c",
"reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c",
"shasum": ""
},
"require": {
@@ -565,7 +565,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.9.1"
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.2"
},
"funding": [
{
@@ -573,20 +573,20 @@
"type": "github"
}
],
"time": "2023-11-25T22:23:28+00:00"
"time": "2024-10-09T10:07:50+00:00"
},
{
"name": "psr/log",
"version": "3.0.0",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
"reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
"url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
"reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
"shasum": ""
},
"require": {
@@ -621,22 +621,22 @@
"psr-3"
],
"support": {
"source": "https://github.com/php-fig/log/tree/3.0.0"
"source": "https://github.com/php-fig/log/tree/3.0.2"
},
"time": "2021-07-14T16:46:02+00:00"
"time": "2024-09-11T13:17:53+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v3.4.0",
"version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": ""
},
"require": {
@@ -645,7 +645,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.4-dev"
"dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -674,7 +674,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -690,24 +690,24 @@
"type": "tidelift"
}
],
"time": "2023-05-23T14:45:45+00:00"
"time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.28.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
"reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
"reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
"reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"provide": {
"ext-ctype": "*"
@@ -717,9 +717,6 @@
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -756,7 +753,7 @@
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
},
"funding": [
{
@@ -772,35 +769,31 @@
"type": "tidelift"
}
],
"time": "2023-01-26T09:26:14+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.28.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "ecaafce9f77234a6a449d29e49267ba10499116d"
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d",
"reference": "ecaafce9f77234a6a449d29e49267ba10499116d",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
"php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -843,7 +836,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
@@ -859,33 +852,30 @@
"type": "tidelift"
}
],
"time": "2023-01-26T09:30:37+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.28.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -927,7 +917,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
},
"funding": [
{
@@ -943,24 +933,24 @@
"type": "tidelift"
}
],
"time": "2023-01-26T09:26:14+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.28.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "42292d99c55abe617799667f454222c54c60e229"
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
"reference": "42292d99c55abe617799667f454222c54c60e229",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
@@ -970,9 +960,6 @@
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -1010,7 +997,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
},
"funding": [
{
@@ -1026,20 +1013,20 @@
"type": "tidelift"
}
],
"time": "2023-07-28T09:04:16+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/yaml",
"version": "v6.4.0",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
"reference": "4f9237a1bb42455d609e6687d2613dde5b41a587"
"reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587",
"reference": "4f9237a1bb42455d609e6687d2613dde5b41a587",
"url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9",
"reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9",
"shasum": ""
},
"require": {
@@ -1082,7 +1069,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/yaml/tree/v6.4.0"
"source": "https://github.com/symfony/yaml/tree/v6.4.13"
},
"funding": [
{
@@ -1098,7 +1085,7 @@
"type": "tidelift"
}
],
"time": "2023-11-06T11:00:25+00:00"
"time": "2024-09-25T14:18:03+00:00"
}
],
"packages-dev": [],

View File

@@ -8,7 +8,15 @@ $parentPattern = '(account|pages/[^/]+|site|users/[^/]+)/files';
* Files Routes
*/
return [
[
'pattern' => $filePattern . '/fields/(:any)/(:all?)',
'method' => 'ALL',
'action' => function (string $parent, string $filename, string $fieldName, string|null $path = null) {
if ($file = $this->file($parent, $filename)) {
return $this->fieldApi($file, $fieldName, $path);
}
}
],
[
'pattern' => $filePattern . '/sections/(:any)',
'method' => 'GET',
@@ -17,11 +25,11 @@ return [
}
],
[
'pattern' => $filePattern . '/fields/(:any)/(:all?)',
'pattern' => $filePattern . '/sections/(:any)/(:all?)',
'method' => 'ALL',
'action' => function (string $parent, string $filename, string $fieldName, string $path = null) {
'action' => function (string $parent, string $filename, string $sectionName, string|null $path = null) {
if ($file = $this->file($parent, $filename)) {
return $this->fieldApi($file, $fieldName, $path);
return $this->sectionApi($file, $sectionName, $path);
}
}
],
@@ -39,17 +47,15 @@ return [
// move_uploaded_file() not working with unit test
// @codeCoverageIgnoreStart
return $this->upload(function ($source, $filename) use ($path) {
$props = [
// move the source file from the temp dir
return $this->parent($path)->createFile([
'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);
], true);
});
// @codeCoverageIgnoreEnd
}

View File

@@ -4,9 +4,8 @@
/**
* Page Routes
*/
return [
// @codeCoverageIgnoreStart
[
'pattern' => 'pages/(:any)',
'method' => 'GET',
@@ -101,6 +100,15 @@ return [
return $this->page($id)->changeTitle($this->requestBody('title'));
}
],
[
'pattern' => 'pages/(:any)/fields/(:any)/(:all?)',
'method' => 'ALL',
'action' => function (string $id, string $fieldName, string|null $path = null) {
if ($page = $this->page($id)) {
return $this->fieldApi($page, $fieldName, $path);
}
}
],
[
'pattern' => 'pages/(:any)/sections/(:any)',
'method' => 'GET',
@@ -109,12 +117,13 @@ return [
}
],
[
'pattern' => 'pages/(:any)/fields/(:any)/(:all?)',
'pattern' => 'pages/(:any)/sections/(:any)/(:all?)',
'method' => 'ALL',
'action' => function (string $id, string $fieldName, string $path = null) {
'action' => function (string $id, string $sectionName, string|null $path = null) {
if ($page = $this->page($id)) {
return $this->fieldApi($page, $fieldName, $path);
return $this->sectionApi($page, $sectionName, $path);
}
}
],
// @codeCoverageIgnoreEnd
];

View File

@@ -5,7 +5,7 @@
* Site Routes
*/
return [
// @codeCoverageIgnoreStart
[
'pattern' => 'site',
'action' => function () {
@@ -84,6 +84,13 @@ return [
return $pages->query($this->requestBody());
}
],
[
'pattern' => 'site/fields/(:any)/(:all?)',
'method' => 'ALL',
'action' => function (string $fieldName, string|null $path = null) {
return $this->fieldApi($this->site(), $fieldName, $path);
}
],
[
'pattern' => 'site/sections/(:any)',
'method' => 'GET',
@@ -92,11 +99,11 @@ return [
}
],
[
'pattern' => 'site/fields/(:any)/(:all?)',
'pattern' => 'site/sections/(:any)/(:all?)',
'method' => 'ALL',
'action' => function (string $fieldName, string $path = null) {
return $this->fieldApi($this->site(), $fieldName, $path);
'action' => function (string $sectionName, string|null $path = null) {
return $this->sectionApi($this->site(), $sectionName, $path);
}
]
],
// @codeCoverageIgnoreEnd
];

View File

@@ -31,6 +31,18 @@ return [
];
}
],
[
'pattern' => 'system/method-test',
'method' => 'PATCH',
'action' => function () {
return [
'status' => match ($this->kirby()->request()->method()) {
'PATCH' => 'ok',
default => 'fail'
}
];
}
],
[
'pattern' => 'system/register',
'method' => 'POST',

View File

@@ -8,6 +8,7 @@ use Kirby\Toolkit\Str;
* User Routes
*/
return [
// @codeCoverageIgnoreStart
[
'pattern' => 'users',
'method' => 'GET',
@@ -202,7 +203,19 @@ return [
'users/(:any)/roles',
],
'action' => function (string $id) {
return $this->user($id)->roles();
$kirby = $this->kirby();
$purpose = $kirby->request()->get('purpose');
return $this->user($id)->roles($purpose);
}
],
[
'pattern' => [
'(account)/fields/(:any)/(:all?)',
'users/(:any)/fields/(:any)/(:all?)',
],
'method' => 'ALL',
'action' => function (string $id, string $fieldName, string|null $path = null) {
return $this->fieldApi($this->user($id), $fieldName, $path);
}
],
[
@@ -219,12 +232,13 @@ return [
],
[
'pattern' => [
'(account)/fields/(:any)/(:all?)',
'users/(:any)/fields/(:any)/(:all?)',
'(account)/sections/(:any)/(:all?)',
'users/(:any)/sections/(:any)/(:all?)',
],
'method' => 'ALL',
'action' => function (string $id, string $fieldName, string $path = null) {
return $this->fieldApi($this->user($id), $fieldName, $path);
'action' => function (string $id, string $sectionName, string|null $path = null) {
return $this->sectionApi($this->user($id), $sectionName, $path);
}
],
// @codeCoverageIgnoreEnd
];

View File

@@ -109,6 +109,16 @@ return [
$props = $example->props();
$vue = $example->vue();
if (Docs::installed() === true && $docs = $props['docs'] ?? null) {
$docs = new Docs($docs);
}
$github = $docs?->github();
if ($source = $props['source'] ?? null) {
$github ??= 'https://github.com/getkirby/kirby/tree/main/' . $source;
}
return [
'component' => 'k-lab-playground-view',
'breadcrumb' => [
@@ -121,10 +131,10 @@ return [
]
],
'props' => [
'docs' => $props['docs'] ?? null,
'docs' => $docs?->name(),
'examples' => $vue['examples'],
'file' => $example->module(),
'github' => $example->github(),
'github' => $github,
'props' => $props,
'styles' => $vue['style'],
'tab' => $example->tab(),

View File

@@ -256,7 +256,7 @@ return [
},
'submit' => function (string $languageCode, string $translationKey) {
Find::language($languageCode)->variable($translationKey, true)->update(
App::instance()->request()->get('value')
App::instance()->request()->get('value', '')
);
return true;

View File

@@ -12,12 +12,17 @@ return [
return App::instance()->option('languages.variables', true) !== false;
},
'action' => function (string $code) {
$kirby = App::instance();
$language = Find::language($code);
$link = '/languages/' . $language->code();
$strings = [];
$foundation = App::instance()->defaultLanguage()->translations();
$foundation = $kirby->defaultLanguage()->translations();
$translations = $language->translations();
// TODO: update following line and adapt for update and delete options
// when new `languageVariables.*` permissions available
$canUpdate = $kirby->user()?->role()->permissions()->for('languages', 'update') === true;
ksort($foundation);
foreach ($foundation as $key => $value) {
@@ -27,12 +32,13 @@ return [
'options' => [
[
'click' => 'update',
'disabled' => $canUpdate === false,
'icon' => 'edit',
'text' => I18n::translate('edit'),
],
[
'click' => 'delete',
'disabled' => $language->isDefault() === false,
'disabled' => $canUpdate === false || $language->isDefault() === false,
'icon' => 'trash',
'text' => I18n::translate('delete'),
]

View File

@@ -3,12 +3,14 @@
use Kirby\Toolkit\I18n;
return function ($kirby) {
$blueprint = $kirby->site()->blueprint();
return [
'breadcrumbLabel' => function () use ($kirby) {
return $kirby->site()->title()->or(I18n::translate('view.site'))->toString();
},
'icon' => 'home',
'label' => $kirby->site()->blueprint()->title() ?? I18n::translate('view.site'),
'icon' => $blueprint->icon() ?? 'home',
'label' => $blueprint->title() ?? I18n::translate('view.site'),
'menu' => true,
'dialogs' => require __DIR__ . '/site/dialogs.php',
'drawers' => require __DIR__ . '/site/drawers.php',

View File

@@ -3,6 +3,7 @@
use Kirby\Cms\App;
use Kirby\Cms\Find;
use Kirby\Cms\PageRules;
use Kirby\Cms\Url;
use Kirby\Exception\Exception;
use Kirby\Exception\InvalidArgumentException;
use Kirby\Exception\PermissionException;
@@ -194,12 +195,23 @@ return [
'page.changeTitle' => [
'pattern' => 'pages/(:any)/changeTitle',
'load' => function (string $id) {
$request = App::instance()->request();
$kirby = App::instance();
$request = $kirby->request();
$page = Find::page($id);
$permissions = $page->permissions();
$select = $request->get('select', 'title');
// build the path prefix
$path = match ($kirby->multilang()) {
true => Str::after($kirby->site()->url(), $kirby->url()) . '/',
false => '/'
};
if ($parent = $page->parent()) {
$path .= $parent->uri() . '/';
}
return [
'component' => 'k-form-dialog',
'props' => [
@@ -212,7 +224,7 @@ return [
'slug' => Field::slug([
'required' => true,
'preselect' => $select === 'slug',
'path' => $page->parent() ? '/' . $page->parent()->uri() . '/' : '/',
'path' => $path,
'disabled' => $permissions->can('changeSlug') === false,
'wizard' => [
'text' => I18n::translate('page.changeSlug.fromTitle'),
@@ -420,7 +432,7 @@ return [
];
}
$slugAppendix = Str::slug(I18n::translate('page.duplicate.appendix'));
$slugAppendix = Url::slug(I18n::translate('page.duplicate.appendix'));
$titleAppendix = I18n::translate('page.duplicate.appendix');
// if the item to be duplicated already exists

View File

@@ -5,6 +5,8 @@ use Kirby\Cms\Find;
use Kirby\Toolkit\I18n;
return [
// @codeCoverageIgnoreStart
// TODO: move to controller class and add unit tests
'tree' => [
'pattern' => 'site/tree',
'action' => function () {
@@ -62,5 +64,27 @@ return [
return $pages;
}
]
],
'tree.parents' => [
'pattern' => 'site/tree/parents',
'action' => function () {
$kirby = App::instance();
$request = $kirby->request();
$root = $request->get('root');
$page = $kirby->page($request->get('page'));
$parents = $page?->parents()->flip()->values(
fn ($parent) => $parent->uuid()?->toString() ?? $parent->id()
) ?? [];
// if root is included, add the site as top-level parent
if ($root === 'true') {
array_unshift($parents, $kirby->site()->uuid()?->toString() ?? '/');
}
return [
'data' => $parents
];
}
]
// @codeCoverageIgnoreEnd
];

View File

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

View File

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

View File

@@ -20,12 +20,19 @@ return [
'pattern' => 'users/create',
'load' => function () {
$kirby = App::instance();
$roles = $kirby->roles()->canBeCreated();
// get default value for role
if ($role = $kirby->request()->get('role')) {
$role = $kirby->roles()->find($role)?->id();
$role = $roles->find($role)?->id();
}
// get role field definition, incl. available role options
$roles = Field::role(
roles: $roles,
props: ['required' => true]
);
return [
'component' => 'k-form-dialog',
'props' => [
@@ -39,9 +46,7 @@ return [
'translation' => Field::translation([
'required' => true
]),
'role' => Field::role([
'required' => true
])
'role' => $roles
],
'submitButton' => I18n::translate('create'),
'value' => [
@@ -49,7 +54,7 @@ return [
'email' => '',
'password' => '',
'translation' => $kirby->panelLanguage(),
'role' => $role ?? $kirby->user()->role()->name()
'role' => $role ?? $roles['options'][0]['value'] ?? null
]
]
];
@@ -228,10 +233,13 @@ return [
'component' => 'k-form-dialog',
'props' => [
'fields' => [
'role' => Field::role([
'role' => Field::role(
roles: $user->roles(),
props: [
'label' => I18n::translate('user.changeRole.select'),
'required' => true,
])
]
)
],
'submitButton' => I18n::translate('user.changeRole'),
'value' => [

View File

@@ -18,7 +18,8 @@ return [
return [
'component' => 'k-users-view',
'props' => [
'role' => function () use ($kirby, $roles, $role) {
'canCreate' => $kirby->roles()->canBeCreated()->count() > 0,
'role' => function () use ($roles, $role) {
if ($role) {
return $roles[$role] ?? null;
}

View File

@@ -2,12 +2,31 @@
use Kirby\Cms\Html;
/** @var \Kirby\Cms\Block $block */
$caption = $block->caption();
if (
$block->location() == 'kirby' &&
$video = $block->video()->toFile()
) {
$url = $video->url();
$attrs = array_filter([
'autoplay' => $block->autoplay()->toBool(),
'controls' => $block->controls()->toBool(),
'loop' => $block->loop()->toBool(),
'muted' => $block->muted()->toBool() || $block->autoplay()->toBool(),
'playsinline' => $block->autoplay()->toBool(),
'poster' => $block->poster()->toFile()?->url(),
'preload' => $block->preload()->value(),
]);
} else {
$url = $block->url();
}
?>
<?php if ($video = Html::video($block->url())): ?>
<?php if ($video = Html::video($url, [], $attrs ?? [])): ?>
<figure>
<?= $video ?>
<?php if ($block->caption()->isNotEmpty()): ?>
<figcaption><?= $block->caption() ?></figcaption>
<?php if ($caption->isNotEmpty()): ?>
<figcaption><?= $caption ?></figcaption>
<?php endif ?>
</figure>
<?php endif ?>

View File

@@ -2,11 +2,77 @@ name: field.blocks.video.name
icon: video
preview: video
fields:
location:
label: field.blocks.video.location
type: radio
columns: 2
default: "web"
options:
kirby: "{{ t('field.blocks.image.location.internal') }}"
web: "{{ t('field.blocks.image.location.external') }}"
url:
label: field.blocks.video.url.label
type: url
placeholder: field.blocks.video.url.placeholder
when:
location: web
video:
label: field.blocks.video.name
type: files
query: model.videos
multiple: false
# you might want to add a template for videos here
when:
location: kirby
poster:
label: field.blocks.video.poster
type: files
query: model.images
multiple: false
image:
back: black
uploads:
template: blocks/image
when:
location: kirby
caption:
label: field.blocks.video.caption
type: writer
inline: true
autoplay:
label: field.blocks.video.autoplay
type: toggle
width: 1/3
when:
location: kirby
muted:
label: field.blocks.video.muted
type: toggle
width: 1/3
default: true
when:
location: kirby
loop:
label: field.blocks.video.loop
type: toggle
width: 1/3
when:
location: kirby
controls:
label: field.blocks.video.controls
type: toggle
width: 1/3
default: true
when:
location: kirby
preload:
label: field.blocks.video.preload
type: select
width: 2/3
default: auto
options:
- auto
- metadata
- none
when:
location: kirby

View File

@@ -2,6 +2,7 @@
use Kirby\Toolkit\I18n;
use Kirby\Toolkit\Str;
use Kirby\Uuid\Uuids;
return [
'props' => [
@@ -75,7 +76,11 @@ return [
* @param string $store 'uuid'|'id'
*/
'store' => function (string $store = 'uuid') {
return Str::lower($store);
// fall back to ID, if UUIDs globally disabled
return match (Uuids::enabled()) {
false => 'id',
default => Str::lower($store)
};
},
/**

View File

@@ -25,6 +25,10 @@ return [
$uploads['accept'] = '*';
if ($preview = $this->image) {
$uploads['preview'] = $preview;
}
if ($template = $uploads['template'] ?? null) {
// get parent object for upload target
$parent = $this->uploadParent($uploads['parent'] ?? null);
@@ -39,7 +43,7 @@ return [
'template' => $template
]);
$uploads['accept'] = $file->blueprint()->acceptMime();
$uploads['accept'] = $file->blueprint()->acceptAttribute();
}
return $uploads;

View File

@@ -1,5 +1,7 @@
<?php
use Kirby\Toolkit\I18n;
return [
'extends' => 'number',
'props' => [
@@ -18,6 +20,13 @@ return [
* Enables/disables the tooltip and set the before and after values
*/
'tooltip' => function ($tooltip = true) {
if (is_array($tooltip) === true) {
$after = $tooltip['after'] ?? null;
$before = $tooltip['before'] ?? null;
$tooltip['after'] = I18n::translate($after, $after);
$tooltip['before'] = I18n::translate($before, $before);
}
return $tooltip;
},
]

View File

@@ -63,7 +63,14 @@ return [
'computed' => [
'value' => function () {
$value = trim($this->value ?? '');
return Sane::sanitize($value, 'html');
$value = Sane::sanitize($value, 'html');
// convert non-breaking spaces to HTML entity
// as that's how ProseMirror handles it internally;
// will allow comparing saved and current content
$value = str_replace(' ', '&nbsp;', $value);
return $value;
}
],
'validations' => [

View File

@@ -109,7 +109,7 @@ if (Helpers::hasOverride('deprecated') === false) { // @codeCoverageIgnore
}
}
if (Helpers::hasOverride('dump') === false) { // @codeCoverageIgnore
if (Helpers::hasOverride('dump') === false && function_exists('dump') === false) { // @codeCoverageIgnore
/**
* Simple object and variable dumper
* to help with debugging.

View File

@@ -148,7 +148,7 @@ return function (App $app) {
$files = new Files([]);
foreach ($field->toData($separator) as $id) {
if ($file = $parent->kirby()->file($id, $parent)) {
if (is_string($id) === true && $file = $parent->kirby()->file($id, $parent)) {
$files->add($file);
}
}
@@ -481,10 +481,9 @@ return function (App $app) {
foreach ($elements as $element) {
foreach ($attributes as $attribute) {
if ($element->hasAttribute($attribute) && $url = $element->getAttribute($attribute)) {
if ($element->hasAttribute($attribute) && $uuid = $element->getAttribute($attribute)) {
try {
if ($uuid = Uuid::for($url)) {
$url = $uuid->model()?->url();
if ($url = Uuid::for($uuid)?->model()?->url()) {
$element->setAttribute($attribute, $url);
}
} catch (InvalidArgumentException) {

View File

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

View File

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

View File

@@ -47,7 +47,7 @@ return [
'template' => $this->template
]);
return $file->blueprint()->acceptMime();
return $file->blueprint()->acceptAttribute();
}
return null;
@@ -194,6 +194,7 @@ return [
'multiple' => $multiple,
'max' => $max,
'api' => $this->parent->apiUrl(true) . '/files',
'preview' => $this->image,
'attributes' => [
// TODO: an edge issue that needs to be solved:
// if multiple users load the same section
@@ -205,13 +206,31 @@ return [
];
}
],
// @codeCoverageIgnoreStart
'api' => function () {
return [
[
'pattern' => 'sort',
'method' => 'PATCH',
'action' => function () {
$this->section()->model()->files()->changeSort(
$this->requestBody('files'),
$this->requestBody('index')
);
return true;
}
]
];
},
// @codeCoverageIgnoreEnd
'toArray' => function () {
return [
'data' => $this->data,
'errors' => $this->errors,
'options' => [
'accept' => $this->accept,
'apiUrl' => $this->parent->apiUrl(true),
'apiUrl' => $this->parent->apiUrl(true) . '/sections/' . $this->name,
'columns' => $this->columnsWithTypes(),
'empty' => $this->empty,
'headline' => $this->headline,

View File

@@ -1,6 +1,7 @@
<?php
use Kirby\Cms\ModelWithContent;
use Kirby\Form\Form;
use Kirby\Toolkit\I18n;
use Kirby\Toolkit\Str;
@@ -20,6 +21,14 @@ return [
$layouts = ['list', 'cardlets', 'cards', 'table'];
return in_array($layout, $layouts) ? $layout : 'list';
},
/**
* Whether the raw content file values should be used for the table column previews. Should not be used unless it eases performance issues in your setup introduced with Kirby 4.2
*
* @todo remove when Form classes have been refactored
*/
'rawvalues' => function (bool $rawvalues = false) {
return $rawvalues;
},
/**
* The size option controls the size of cards. By default cards are auto-sized and the cards grid will always fill the full width. With a size you can disable auto-sizing. Available sizes: `tiny`, `small`, `medium`, `large`, `huge`, `full`
*/
@@ -77,9 +86,12 @@ return [
// keep the original column name as id
$column['id'] = $columnName;
// add the custom column to the array with a key that won't
// override the system columns
$columns[$columnName . 'Cell'] = $column;
// add the custom column to the array
// allowing to extend/overwrite existing columns
$columns[$columnName] = [
...$columns[$columnName] ?? [],
...$column
];
}
if ($this->type === 'pages') {
@@ -129,19 +141,35 @@ return [
$item['info'] = $model->toString($this->info);
}
// if forcing raw values, get those directly from content file
// TODO: remove once Form classes have been refactored
// @codeCoverageIgnoreStart
if ($this->rawvalues === true) {
foreach ($this->columns as $columnName => $column) {
// don't overwrite essential columns
if (isset($item[$columnName]) === true) {
continue;
$item[$columnName] = match (empty($column['value'])) {
// if column value defined, resolve the query
false => $model->toString($column['value']),
// otherwise use the form value,
// but don't overwrite columns
default => $item[$columnName] ?? $model->content()->get($column['id'] ?? $columnName)->value()
};
}
if (empty($column['value']) === false) {
$value = $model->toString($column['value']);
} else {
$value = $model->content()->get($column['id'] ?? $columnName)->value();
return $item;
}
// @codeCoverageIgnoreEnd
$item[$columnName] = $value;
// Use form to get the proper values for the columns
$form = Form::for($model)->values();
foreach ($this->columns as $columnName => $column) {
$item[$columnName] = match (empty($column['value'])) {
// if column value defined, resolve the query
false => $model->toString($column['value']),
// otherwise use the form value,
// but don't overwrite columns
default => $item[$columnName] ?? $form[$column['id'] ?? $columnName] ?? null
};
}
return $item;

View File

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

View File

@@ -112,6 +112,11 @@ return [
'width'
],
'html' => function (KirbyTag $tag): string {
$kirby = $tag->kirby();
$tag->width ??= $kirby->option('kirbytext.image.width');
$tag->height ??= $kirby->option('kirbytext.image.height');
if ($tag->file = $tag->file($tag->value)) {
$tag->src = $tag->file->url();
$tag->alt ??= $tag->file->alt()->or('')->value();
@@ -129,6 +134,13 @@ return [
$tag->srcset = $tag->file->srcset($srcset);
}
if ($tag->width === 'auto') {
$tag->width = $tag->file->width();
}
if ($tag->height === 'auto') {
$tag->height = $tag->file->height();
}
} else {
$tag->src = Url::to($tag->value);
}
@@ -157,14 +169,14 @@ return [
'alt' => $tag->alt ?? ''
]);
if ($tag->kirby()->option('kirbytext.image.figure', true) === false) {
if ($kirby->option('kirbytext.image.figure', true) === false) {
return $link($image);
}
// render KirbyText in caption
if ($tag->caption) {
$options = ['markdown' => ['inline' => true]];
$caption = $tag->kirby()->kirbytext($tag->caption, $options);
$caption = $kirby->kirbytext($tag->caption, $options);
$tag->caption = [$caption];
}
@@ -252,6 +264,7 @@ return [
'caption',
'controls',
'class',
'disablepictureinpicture',
'height',
'loop',
'muted',
@@ -294,12 +307,15 @@ return [
// don't use attributes that iframe doesn't support
if ($isProviderVideo === false) {
// converts tag attributes to supported formats (listed below) to output correct html
// booleans: autoplay, controls, loop, muted
// strings : poster, preload
// for ex : `autoplay` will not work if `false` is a `string` instead of a `boolean`
// convert tag attributes to supported formats (bool, string)
// to output correct html attributes
//
// for ex:
// `autoplay` will not work if `false` is a string
// instead of a boolean
$attrs['autoplay'] = $autoplay = Str::toType($tag->autoplay, 'bool');
$attrs['controls'] = Str::toType($tag->controls ?? true, 'bool');
$attrs['disablepictureinpicture'] = Str::toType($tag->disablepictureinpicture ?? false, 'bool');
$attrs['loop'] = Str::toType($tag->loop, 'bool');
$attrs['muted'] = Str::toType($tag->muted ?? $autoplay, 'bool');
$attrs['playsinline'] = Str::toType($tag->playsinline ?? $autoplay, 'bool');

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Формата не може да бъде запазена",
"error.language.code": "Please enter a valid code for the language",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.notFound": "The language could not be found",
"error.language.update.permission": "You are not allowed to update the language",
"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",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "by …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Caption",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Location",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"installation.issues.mbstring": "Изисква се разширението <code>MB String</code>",
"installation.issues.media": "Папката <code>/media</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",
"language": "\u0415\u0437\u0438\u043a",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "No s'ha pogut desar el formulari",
"error.language.code": "Introdueix un codi vàlid per a lidioma",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "L'idioma ja existeix",
"error.language.name": "Introdueix un nom vàlid per a l'idioma",
"error.language.notFound": "The language could not be found",
"error.language.update.permission": "You are not allowed to update the language",
"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",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "by …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Caption",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Location",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Idioma",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Estat",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Formulář nemohl být uložen",
"error.language.code": "Zadejte prosím platný kód jazyka",
"error.language.create.permission": "Nemáte dovoleno vytvořit jazyk",
"error.language.delete.permission": "Nemáte dovoleno jazyk vymazat",
"error.language.duplicate": "Jazyk již existuje",
"error.language.name": "Zadejte prosím platné jméno jazyka",
"error.language.notFound": "Jazyk nebyl nalezen",
"error.language.update.permission": "Nemáte dovoleno aktualizovat jazyk",
"error.layout.validation.block": "V rozvržení {layoutIndex} je v poli \"{field}\" v bloku {blockIndex} při použití \"{fieldset}\" typu chyba",
"error.layout.validation.settings": "Chyba v nastavení rozvržení {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "od …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Titulek",
"field.blocks.video.controls": "Ovládání",
"field.blocks.video.location": "Umístění",
"field.blocks.video.loop": "Smyčka",
"field.blocks.video.muted": "Ztlumené",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Zadejte URL adresu videa",
"field.blocks.video.poster": "Náhledový obrázek",
"field.blocks.video.preload": "Předběžně načíst",
"field.blocks.video.url.label": "URL adresa videa",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Jazyk",
@@ -611,6 +620,8 @@
"stats.empty": "Žádná hlášení",
"status": "Stav",
"system.info.copy": "Kopírovat informace",
"system.info.copied": "Systémové informace zkopírovány",
"system.issues.content": "Složka content je zřejmě přístupná zvenčí",
"system.issues.eol.kirby": "Instalovaná verze Kirby dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace",
"system.issues.eol.plugin": "Instalovaná verze doplňku { plugin } dosáhla konce životnosti a nebude již dále dostávat bezpečnostní aktualizace",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Formularen kunne ikke gemmes",
"error.language.code": "Indtast venligst en gyldig kode for sproget",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Sproget eksisterer allerede",
"error.language.name": "Indtast venligst et gyldigt navn for sproget",
"error.language.notFound": "Sproget fandtes ikke",
"error.language.update.permission": "You are not allowed to update the language",
"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": "Der er fejl i layout {index} indstillinger",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "af …",
"field.blocks.text.name": "Tekst",
"field.blocks.text.placeholder": "Tekst …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Billedtekst",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Placering",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Indtast URL til en video",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Sprog",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Das Formular konnte nicht gespeichert werden",
"error.language.code": "Bitte gib einen gültigen Code für die Sprache an",
"error.language.create.permission": "Du darfst keine Sprache anlegen",
"error.language.delete.permission": "Du darfst diese Sprache nicht löschen",
"error.language.duplicate": "Die Sprache besteht bereits",
"error.language.name": "Bitte gib einen gültigen Namen für die Sprache an",
"error.language.notFound": "Die Sprache konnte nicht gefunden werden",
"error.language.update.permission": "Du darfst diese Sprache nicht bearbeiten",
"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}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "Quelle …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Bildunterschrift",
"field.blocks.video.controls": "Steuerung",
"field.blocks.video.location": "Ort",
"field.blocks.video.loop": "Schleife",
"field.blocks.video.muted": "Stumm",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Video-URL eingeben",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Vorladen",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Sprache",
@@ -611,6 +620,8 @@
"stats.empty": "Keine Daten",
"status": "Status",
"system.info.copy": "Info kopieren",
"system.info.copied": "System Info wurde kopiert",
"system.issues.content": "Der content Ordner scheint öffentlich zugänglich zu sein",
"system.issues.eol.kirby": "Deine Kirby Installation ist veraltet und erhält keine weiteren Sicherheitsupdates",
"system.issues.eol.plugin": "Deine Version des { plugin } Plugins ist veraltet und erhält keine weiteren Sicherheitsupdates",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Δεν ήταν δυνατή η αποθήκευση της φόρμας",
"error.language.code": "Please enter a valid code for the language",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.notFound": "The language could not be found",
"error.language.update.permission": "You are not allowed to update the language",
"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",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "by …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Caption",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Location",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"installation.issues.mbstring": "Απαιτείται η επέκταση <code>MB String</code> ",
"installation.issues.media": "Ο φάκελος <code>/media</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> δεν υπάρχει ή δεν είναι εγγράψιμος",
"language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Kατάσταση",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "The form could not be saved",
"error.language.code": "Please enter a valid code for the language",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.notFound": "The language could not be found",
"error.language.update.permission": "You are not allowed to update the language",
"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",
@@ -165,6 +168,7 @@
"error.page.move.ancestor": "The page cannot be moved into itself",
"error.page.move.directory": "The page directory cannot be moved",
"error.page.move.duplicate": "A sub page with the URL appendix \"{slug}\" already exists",
"error.page.move.noSections": "The page \"{parent}\" cannot be a parent of any page because it lacks any pages sections in its blueprint",
"error.page.move.notFound": "The moved page could not be found",
"error.page.move.permission": "You are not allowed to move \"{slug}\"",
"error.page.move.template": "The \"{template}\" template is not accepted as a subpage of \"{parent}\"",
@@ -294,6 +298,9 @@
"field.blocks.heading.name": "Heading",
"field.blocks.heading.text": "Text",
"field.blocks.heading.placeholder": "Heading …",
"field.blocks.figure.back.plain": "Plain",
"field.blocks.figure.back.pattern.light": "Pattern (light)",
"field.blocks.figure.back.pattern.dark": "Pattern (dark)",
"field.blocks.image.alt": "Alternative text",
"field.blocks.image.caption": "Caption",
"field.blocks.image.crop": "Crop",
@@ -317,13 +324,21 @@
"field.blocks.quote.citation.placeholder": "by …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Caption",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Location",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
"field.files.empty": "No files selected yet",
"field.files.empty.single": "No file selected yet",
"field.layout.change": "Change layout",
"field.layout.delete": "Delete layout",
@@ -335,12 +350,14 @@
"field.object.empty": "No information yet",
"field.pages.empty": "No pages selected yet",
"field.pages.empty.single": "No page 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",
"field.users.empty.single": "No user selected yet",
"fields.empty": "No fields yet",
@@ -379,7 +396,6 @@
"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 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",
"language": "Language",
@@ -589,6 +605,7 @@
"save": "Save",
"search": "Search",
"searching": "Searching",
"search.min": "Enter {min} characters to search",
"search.all": "Show all {count} results",
"search.results.none": "No results",
@@ -611,6 +628,9 @@
"stats.empty": "No reports",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.api.methods": "Your server does not support PATCH requests",
"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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Ne eblis konservi la formularon",
"error.language.code": "Bonvolu entajpi validan kodon por la lingvo",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "La lingvo jam ekzistas",
"error.language.name": "Bonvolu entajpi validan nomon por la lingvo",
"error.language.notFound": "La lingvo ne troveblas",
"error.language.update.permission": "You are not allowed to update the language",
"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": "Estas eraro en la agordoj de blokaranĝo {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "de ...",
"field.blocks.text.name": "Teksto",
"field.blocks.text.placeholder": "Teksto ...",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Apudskribo",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Loko",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Videâjo",
"field.blocks.video.placeholder": "Entajpi URL de videaĵo",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Lingvo",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Stato",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "No se pudo guardar el formulario",
"error.language.code": "Por favor introduce un código válido para el idioma",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "El idioma ya existe",
"error.language.name": "Por favor introduce un nombre válido para el idioma",
"error.language.notFound": "No se pudo encontrar el idioma",
"error.language.update.permission": "You are not allowed to update the language",
"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}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "Por ...",
"field.blocks.text.name": "Texto",
"field.blocks.text.placeholder": "Texto ...",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Leyenda",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Ubicación",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Introduce la URL de un vídeo",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Vídeo-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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.",
"language": "Idioma",
@@ -611,6 +620,8 @@
"stats.empty": "Sin informes",
"status": "Estado",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"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.",

View File

@@ -126,9 +126,12 @@
"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.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "El idioma ya existe",
"error.language.name": "Por favor, introduce un nombre válido para el idioma",
"error.language.notFound": "No se pudo encontrar el idioma",
"error.language.update.permission": "You are not allowed to update the language",
"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}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "Por ...",
"field.blocks.text.name": "Texto",
"field.blocks.text.placeholder": "Texto ...",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Leyenda",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Ubicación",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Introduce la URL de un vídeo",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Vídeo-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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": "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",
@@ -611,6 +620,8 @@
"stats.empty": "Sin informes",
"status": "Estado",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"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.",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "امکان دخیره فرم وجود ندارد",
"error.language.code": "Please enter a valid code for the language",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.notFound": "The language could not be found",
"error.language.update.permission": "You are not allowed to update the language",
"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",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "by …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Caption",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Location",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"installation.issues.mbstring": "افزونه <code>MB String</code> مورد نیاز است",
"installation.issues.media": "پوشه <code>/media</code> موجود نیست یا قابل نوشتن نیست",
"installation.issues.php": "لطفا از پی‌اچ‌پی 8 یا بالاتر استفاده کنید",
"installation.issues.server": "کربی نیاز به <code>Apache</code>، <code>Nginx</code> یا <code>Caddy</code> دارد",
"installation.issues.sessions": "پوشه <code>/site/sessions</code> وجود ندارد یا قابل نوشتن نیست",
"language": "\u0632\u0628\u0627\u0646",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "وضعیت",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Lomaketta ei voitu tallentaa",
"error.language.code": "Anna kielen lyhenne",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Kieli on jo olemassa",
"error.language.name": "Anna kielen nimi",
"error.language.notFound": "Kieltä ei löytynyt",
"error.language.update.permission": "You are not allowed to update the language",
"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": "Virhe asetelman {index} asetuksissa",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "Lähde …",
"field.blocks.text.name": "Teksti",
"field.blocks.text.placeholder": "Teksti …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Videon teksti",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Sijainti",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Anna videon URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Videon URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Kieli",
@@ -611,6 +620,8 @@
"stats.empty": "Ei raportteja",
"status": "Tila",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Content-kansio näyttäisi olevan julkinen",
"system.issues.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",

View File

@@ -125,10 +125,13 @@
"error.form.incomplete": "Veuillez corriger toutes les erreurs du formulaire…",
"error.form.notSaved": "Le formulaire na pu être enregistré",
"error.language.code": "Veuillez saisir un code correct pour cette langue",
"error.language.code": "Veuillez saisir un code correct pour la langue",
"error.language.create.permission": "Vous nêtes pas autorisé à créer une langue",
"error.language.delete.permission": "Vous nêtes pas autorisé à supprimer la langue",
"error.language.duplicate": "Cette langue existe déjà",
"error.language.name": "Veuillez saisir un nom correct pour cette langue",
"error.language.name": "Veuillez saisir un nom correct pour la langue",
"error.language.notFound": "La langue na pu être trouvée",
"error.language.update.permission": "Vous nêtes pas autorisé à modifier la langue",
"error.layout.validation.block": "Il y a une erreur sur le champ « {field} » du bloc {blockIndex} utilisant le type de bloc « {fieldset} » dans le layout {layoutIndex}.",
"error.layout.validation.settings": "Il y a une erreur dans les paramètres de la disposition {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "par…",
"field.blocks.text.name": "Texte",
"field.blocks.text.placeholder": "Texte…",
"field.blocks.video.autoplay": "Lecture automatique",
"field.blocks.video.caption": "Légende",
"field.blocks.video.controls": "Contrôles",
"field.blocks.video.location": "Emplacement",
"field.blocks.video.loop": "Boucle",
"field.blocks.video.muted": "Muet",
"field.blocks.video.name": "Vidéo",
"field.blocks.video.placeholder": "Saisissez lURL dune vidéo",
"field.blocks.video.poster": "Vignette",
"field.blocks.video.preload": "Préchargement",
"field.blocks.video.url.label": "URL de la vidéo",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Langue",
@@ -464,7 +473,7 @@
"login.email.password-reset.body": "Bonjour {user.nameOrEmail},\n\nVous avez récemment demandé un code de réinitialisation de mot de passe pour le Panel de {site}.\nLe code de réinitialisation de mot de passe suivant sera valable pendant {timeout} minutes :\n\n{code}\n\nSi vous navez pas demandé de code de réinitialisation de mot de passe, veuillez ignorer cet email ou contacter votre administrateur si vous avez des questions.\nPar sécurité, merci de ne PAS faire suivre ce courriel.",
"login.email.password-reset.subject": "Votre code de réinitialisation du mot de passe",
"login.remember": "Rester connecté",
"login.reset": "Réinitialiser le mot de passe",
"login.reset": "Réinitialiser",
"login.toggleText.code.email": "Se connecter par courriel",
"login.toggleText.code.email-password": "Se connecter avec un mot de passe",
"login.toggleText.password-reset.email": "Mot de passe oublié ?",
@@ -611,6 +620,8 @@
"stats.empty": "Aucun rapport",
"status": "Statut",
"system.info.copy": "Copier les informations",
"system.info.copied": "Informations système copiées",
"system.issues.content": "Le dossier content semble exposé",
"system.issues.eol.kirby": "La version de Kirby installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité",
"system.issues.eol.plugin": "La version du plugin { plugin } installée a atteint la fin de son cycle de vie et ne recevra plus de mises à jour de sécurité",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Az űrlap nem menthető",
"error.language.code": "Kérlek, add meg a nyelv érvényes kódját",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "A nyelv már létezik",
"error.language.name": "Kérlek, add meg a nyelv érvényes nevét",
"error.language.notFound": "A nyelv nem található",
"error.language.update.permission": "You are not allowed to update the language",
"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": "Hibát találtunk a(z) {index} elrendezés beállításaiban",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "Szerző …",
"field.blocks.text.name": "Szöveg",
"field.blocks.text.placeholder": "Szöveg …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Képaláírás",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "A kép helye",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Videó",
"field.blocks.video.placeholder": "Videó URL-jének megadása",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Videó URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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ó",
"language": "Nyelv",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Állapot",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Formulir tidak dapat disimpan",
"error.language.code": "Masukkan kode bahasa yang valid",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Bahasa sudah ada",
"error.language.name": "Masukkan nama bahasa yang valid",
"error.language.notFound": "Bahasa tidak ditemukan",
"error.language.update.permission": "You are not allowed to update the language",
"error.layout.validation.block": "Ada kesalahan pada bidang \"{field}\" di blok {blockIndex} menggunakan tipe blok \"{fieldset}\" di tata letak {layoutIndex}",
"error.layout.validation.settings": "Ada kesalahan di pengaturan tata letak {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "oleh …",
"field.blocks.text.name": "Teks",
"field.blocks.text.placeholder": "Teks …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Deskripsi",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Lokasi",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Masukkan URL video",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "URL Video",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Bahasa",
@@ -611,6 +620,8 @@
"stats.empty": "Tidak ada laporan",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Folder konten nampaknya terekspos",
"system.issues.eol.kirby": "Versi instalasi Kirby Anda sudah mencapai akhir dan tidak akan lagi mendapat pembaruan keamanan",
"system.issues.eol.plugin": "Versi instalasi plugin { plugin } Anda sudah mencapai akhir dan tidak akan lagi mendapatkan pembaruan keamanan",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Ekki tókst að vista upplýsingar úr forminu",
"error.language.code": "Gófúslega settu inn gildan kóða fyrir tungumál",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Þetta tungumál er nú þegar skráð",
"error.language.name": "Gott og gyllt nafn fyrir tungumálið",
"error.language.notFound": "Tungumálið fannst ekkert",
"error.language.update.permission": "You are not allowed to update the language",
"error.layout.validation.block": "Það er villa í {field} sviðinu í bálkinum {blockIndex} sem notar {fieldset} bálkgerðina í rammanum {layoutIndex}",
"error.layout.validation.settings": "Hér er villa í sitllingum fyrir ramman {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "eftir …",
"field.blocks.text.name": "Prósi",
"field.blocks.text.placeholder": "Þessi prósi …",
"field.blocks.video.autoplay": "Sjálfspila",
"field.blocks.video.caption": "Myndskeiðstexti",
"field.blocks.video.controls": "Stjórnhnappar",
"field.blocks.video.location": "Staðsetning",
"field.blocks.video.loop": "Lykkja",
"field.blocks.video.muted": "Þaggað",
"field.blocks.video.name": "Myndskeið",
"field.blocks.video.placeholder": "Vefslóð myndskeiðs (URL)",
"field.blocks.video.poster": "Plakkat",
"field.blocks.video.preload": "Forhlaða",
"field.blocks.video.url.label": "Vefslóð",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Tungumál",
@@ -549,14 +558,14 @@
"page.status.draft.description": "Þessi síða er uppkast og er aðeins sýnileg vefstjórum eða gegnum laumu tengil.",
"page.status.listed": "Útgefin og listuð",
"page.status.listed.description": "Síðan er útgefin og listuð.",
"page.status.unlisted": "Útgefin",
"page.status.unlisted": "Útgefin en ólistuð",
"page.status.unlisted.description": "Síðan er útgefin en þó ólistuð.",
"pages": "Síður",
"pages.empty": "Engar síður enn",
"pages.status.draft": "Uppköst",
"pages.status.listed": "Útgefnar og listaðar",
"pages.status.unlisted": "Útgefnar",
"pages.status.unlisted": "Útgefnar en ólistaðar",
"pagination.page": "Síða",
@@ -611,6 +620,8 @@
"stats.empty": "Engar skýrslur",
"status": "Staða",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Efnismappan virðist vera berskjölduð",
"system.issues.eol.kirby": "Uppsett Kirby eintak þitt hefur runnið sitt skeið á enda og mun ekki verða uppfært framar",
"system.issues.eol.plugin": "Uppsett eintak þitt af viðbótinni { plugin } hefur runnið sitt skeið á enda og mun ekki verða uppfærð framar",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Non è stato possibile salvare il form",
"error.language.code": "Inserisci un codice valido per la lingua",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "La lingua esiste già",
"error.language.name": "Inserisci un nome valido per la lingua",
"error.language.notFound": "La lingua non è stata trovata",
"error.language.update.permission": "You are not allowed to update the language",
"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}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "di …",
"field.blocks.text.name": "Testo",
"field.blocks.text.placeholder": "Testo …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Didascalia",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Posizione",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Inserisci un URL di un video",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "URL Video",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Lingua",
@@ -611,6 +620,8 @@
"stats.empty": "Nessuna segnalazione",
"status": "Stato",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "항목을 저장할 수 없습니다.",
"error.language.code": "올바른 언어 코드를 입력하세요.",
"error.language.create.permission": "언어를 등록할 권한이 없습니다.",
"error.language.delete.permission": "언어를 삭제할 권한이 없습니다.",
"error.language.duplicate": "이미 등록한 언어입니다.",
"error.language.name": "올바른 언어명을 입력하세요.",
"error.language.notFound": "언어를 찾을 수 없습니다.",
"error.language.update.permission": "언어를 변경할 권한이 없습니다.",
"error.layout.validation.block": "레이아웃({layoutIndex})의 특정 블록 유형({fieldset})을 사용하는 블록({blockIndex})의 특정 필드({field})에 오류가 있습니다.",
"error.layout.validation.settings": "레이아웃({index}) 옵션을 확인하세요.",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "출처",
"field.blocks.text.name": "텍스트",
"field.blocks.text.placeholder": "텍스트",
"field.blocks.video.autoplay": "자동 재생",
"field.blocks.video.caption": "캡션",
"field.blocks.video.controls": "제어 도구",
"field.blocks.video.location": "위치",
"field.blocks.video.loop": "반복",
"field.blocks.video.muted": "음소거",
"field.blocks.video.name": "영상",
"field.blocks.video.placeholder": "영상 URL 입력",
"field.blocks.video.poster": "대표 이미지",
"field.blocks.video.preload": "미리 로드",
"field.blocks.video.url.label": "영상 URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"installation.issues.mbstring": "<code>MB String</code> 확장 모듈이 필요합니다.",
"installation.issues.media": "<code>/media</code> 폴더의 쓰기 권한을 확인하세요.",
"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> 폴더의 쓰기 권한을 확인하세요.",
"language": "\uc5b8\uc5b4",
@@ -611,6 +620,8 @@
"stats.empty": "관련 기록이 없습니다.",
"status": "상태",
"system.info.copy": "정보 복사",
"system.info.copied": "시스템 정보가 복사되었습니다.",
"system.issues.content": "<code>/content</code> 폴더의 권한을 확인하세요.",
"system.issues.eol.kirby": "설치된 Kirby 버전이 만료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.",
"system.issues.eol.plugin": "설치된 플러그인({plugin}의 지원이 종료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Formos nepavyko išsaugoti",
"error.language.code": "Prašome įrašyti teisingą kalbos kodą",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Tokia kalba jau yra",
"error.language.name": "Prašome įrašyti teisingą kalbos pavadinimą",
"error.language.notFound": "Nepavyko rasti šios kalbos",
"error.language.update.permission": "You are not allowed to update the language",
"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": "Yra klaida išdėstymo {index} nustatymuose",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "autorius",
"field.blocks.text.name": "Tekstas",
"field.blocks.text.placeholder": "Tekstas ...",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Aprašymas",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Šaltinis",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Įrašykite video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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ų",
"language": "Kalba",
@@ -611,6 +620,8 @@
"stats.empty": "Nėra pranešimų",
"status": "Statusas",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Skjemaet kunne ikke lagres",
"error.language.code": "Vennligst skriv inn gyldig språkkode",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Språket eksisterer allerede",
"error.language.name": "Vennligst skriv inn et gyldig navn for språket",
"error.language.notFound": "Finner ikke språket",
"error.language.update.permission": "You are not allowed to update the language",
"error.layout.validation.block": "Det er en feilmelding på \"{field}\" feltet i blokk {blockIndex} med bruk av \"{fieldset}\" blokktypen i layout {layoutIndex}",
"error.layout.validation.settings": "Det er en feil i layout {index} innstillinger",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "av…",
"field.blocks.text.name": "Tekst",
"field.blocks.text.placeholder": "Tekst…",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Caption",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Plassering",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Legg til en video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Spr\u00e5k",
@@ -611,6 +620,8 @@
"stats.empty": "Ingen rapporter",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "content-mappen ser ut til å være eksponert",
"system.issues.eol.kirby": "Din installerte Kirby versjon har nådd sitt end-of-life, og vil ikke lenger motta sikkerhetsoppdateringer",
"system.issues.eol.plugin": "Din installerte plugin { plugin } har nådd sitt end-of-life og vil ikke lenger motta sikkerhetsoppdateringer",

View File

@@ -114,7 +114,7 @@
"error.file.minheight": "De hoogte van de afbeelding moet minimaal {height} pixels zijn",
"error.file.minsize": "Het bestand is te klein",
"error.file.minwidth": "De breedte van de afbeelding moet minimaal {width} pixels zijn",
"error.file.name.unique": "The filename must be unique",
"error.file.name.unique": "De bestandsnaam moet uniek zijn",
"error.file.name.missing": "De bestandsnaam mag niet leeg zijn",
"error.file.notFound": "Het bestand kan niet worden gevonden",
"error.file.orientation": "De oriëntatie van de afbeelding moet \"{orientation}\" zijn",
@@ -126,9 +126,12 @@
"error.form.notSaved": "Het formulier kon niet worden opgeslagen",
"error.language.code": "Vul een geldige code voor deze taal in",
"error.language.create.permission": "Je hebt geen rechten om een taal toe te voegen",
"error.language.delete.permission": "Je hebt geen rechten om een taal te verwijderen",
"error.language.duplicate": "De taal bestaat al",
"error.language.name": "Vul een geldige naam voor deze taal in",
"error.language.notFound": "De taal kan niet worden gevonden",
"error.language.update.permission": "Je hebt geen rechten om deze taal te updaten",
"error.layout.validation.block": "Er is een fout opgetreden bij het \"{field}\" veld in blok {blockIndex} in het \"{fieldset}\" bloktype in layout {layoutIndex}",
"error.layout.validation.settings": "Er is een fout gevonden in de instellingen van ontwerp {index} ",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "door ...",
"field.blocks.text.name": "Tekst",
"field.blocks.text.placeholder": "Tekst ...",
"field.blocks.video.autoplay": "Automatisch afspelen",
"field.blocks.video.caption": "Beschrijving",
"field.blocks.video.controls": "Besturingselementen",
"field.blocks.video.location": "Locatie",
"field.blocks.video.loop": "Herhalen",
"field.blocks.video.muted": "Gedempt",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Voer een video link in",
"field.blocks.video.poster": "Afbeelding",
"field.blocks.video.preload": "Vooral laden",
"field.blocks.video.url.label": "Video link",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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>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",
"language": "Taal",
@@ -611,6 +620,8 @@
"stats.empty": "Geen rapporten",
"status": "Status",
"system.info.copy": "Kopieer informatie",
"system.info.copied": "Systeem informatie gekopieerd",
"system.issues.content": "De content map lijkt zichtbaar te zijn",
"system.issues.eol.kirby": "De geïnstalleerde Kirby versie is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.",
"system.issues.eol.plugin": "De geïnstalleerde versie van plugin { plugin } is niet meer actueel en zal geen verdere beveiligingsupdates meer ontvangen.",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Nie udało się zapisać formularza",
"error.language.code": "Wprowadź poprawny kod języka.",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Język już istnieje.",
"error.language.name": "Wprowadź poprawną nazwę języka.",
"error.language.notFound": "Język nie został odnaleziony",
"error.language.update.permission": "You are not allowed to update the language",
"error.layout.validation.block": "Wystąpił błąd w polu „{field}” w bloku {blockIndex} o typie bloku „{fieldset}” w układzie {layoutIndex}",
"error.layout.validation.settings": "W ustawieniach układu {index} jest błąd",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "autorstwa …",
"field.blocks.text.name": "Tekst",
"field.blocks.text.placeholder": "Tekst …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Podpis",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Lokalizacja",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Wprowadź URL video",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "URL video",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "J\u0119zyk",
@@ -611,6 +620,8 @@
"stats.empty": "Brak raportów",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Zdaje się, że folder „content” jest wystawiony na publiczny dostęp",
"system.issues.eol.kirby": "Twoja zainstalowana wersja Kirby osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń",
"system.issues.eol.plugin": "Twoja zainstalowana wersja wtyczki { plugin } osiągnęła koniec okresu wsparcia i nie będzie otrzymywać dalszych aktualizacji zabezpieczeń",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "O formulário não pôde ser salvo",
"error.language.code": "Por favor entre um código válido para o idioma",
"error.language.create.permission": "Não tem permissões para criar um idioma",
"error.language.delete.permission": "Não tem permissões para eliminar o idioma",
"error.language.duplicate": "O idioma já existe",
"error.language.name": "Por favor entre um nome válido para o idioma",
"error.language.notFound": "O idioma não foi encontrado",
"error.language.update.permission": "Não tem permissões para atualizar o idioma",
"error.layout.validation.block": "Há um erro no campo \"{field}\" no bloco {blockIndex} a usar o tipo de bloco \"{fieldset}\" no layout {layoutIndex}",
"error.layout.validation.settings": "Há um erro na configuração do layout {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "de …",
"field.blocks.text.name": "Texto",
"field.blocks.text.placeholder": "Texto …",
"field.blocks.video.autoplay": "Reprodução automática",
"field.blocks.video.caption": "Legenda",
"field.blocks.video.controls": "Controlos",
"field.blocks.video.location": "Localização ",
"field.blocks.video.loop": "Repetir",
"field.blocks.video.muted": "Sem som",
"field.blocks.video.name": "Vídeo ",
"field.blocks.video.placeholder": "Entre uma URL de vídeo ",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Pré-carregamento",
"field.blocks.video.url.label": "URL-Vídeo",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Idioma",
@@ -611,6 +620,8 @@
"stats.empty": "Nenhum relatório",
"status": "Estado",
"system.info.copy": "Copiar informação",
"system.info.copied": "Informação de sistema copiada",
"system.issues.content": "A pasta \"content\" parece não estar protegida",
"system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",
"system.issues.eol.plugin": "A versão instalada do plugin {plugin} chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",

View File

@@ -104,16 +104,16 @@
"error.file.extension.forbidden": "A extensão \"{extension}\" não é permitida",
"error.file.extension.invalid": "Extensão inválida: {extension}",
"error.file.extension.missing": "As extensões de \"{filename}\" estão em falta",
"error.file.maxheight": "A altura da imagem não deve exceder {height} pixels",
"error.file.maxheight": "A altura da imagem não deve exceder {height} píxeis",
"error.file.maxsize": "O ficheiro é demasiado grande",
"error.file.maxwidth": "A largura da imagem não deve exceder {width} pixels",
"error.file.maxwidth": "A largura da imagem não deve exceder {width} píxeis",
"error.file.mime.differs": "O ficheiro enviado precisa de ser do tipo \"{mime}\"",
"error.file.mime.forbidden": "O tipo de mídia \"{mime}\" não é permitido",
"error.file.mime.invalid": "Tipo de mídia inválido: {mime}",
"error.file.mime.missing": "Não foi possível detectar o tipo de mídia de \"{filename}\"",
"error.file.minheight": "A altura da imagem deve ter pelo menos {height} pixels",
"error.file.minheight": "A altura da imagem deve ter pelo menos {height} píxeis",
"error.file.minsize": "O ficheiro é demasiado pequeno",
"error.file.minwidth": "A largura da imagem deve ter pelo menos {width} pixels",
"error.file.minwidth": "A largura da imagem deve ter pelo menos {width} píxeis",
"error.file.name.unique": "O nome do ficheiro deve ser único",
"error.file.name.missing": "O nome do ficheiro não pode ficar em branco",
"error.file.notFound": "Não foi possível encontrar o ficheiro \"{filename}\"",
@@ -126,9 +126,12 @@
"error.form.notSaved": "Não foi possível guardar o formulário",
"error.language.code": "Por favor, insira um código válido para o idioma",
"error.language.create.permission": "Não tem permissões para criar um idioma",
"error.language.delete.permission": "Não tem permissões para eliminar o idioma",
"error.language.duplicate": "O idioma já existe",
"error.language.name": "Por favor, insira um nome válido para o idioma",
"error.language.notFound": "Não foi possível encontrar o idioma",
"error.language.update.permission": "Não tem permissões para atualizar o idioma",
"error.layout.validation.block": "Há um erro no campo \"{field}\" no bloco {blockIndex} a usar o tipo de bloco \"{fieldset}\" no layout {layoutIndex}",
"error.layout.validation.settings": "Há um erro na configuração do layout {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "de …",
"field.blocks.text.name": "Texto",
"field.blocks.text.placeholder": "Texto …",
"field.blocks.video.autoplay": "Reprodução automática",
"field.blocks.video.caption": "Legenda",
"field.blocks.video.controls": "Controlos",
"field.blocks.video.location": "Localização ",
"field.blocks.video.loop": "Repetir",
"field.blocks.video.muted": "Sem som",
"field.blocks.video.name": "Vídeo ",
"field.blocks.video.placeholder": "Insira um URL de vídeo ",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Pré-carregamento",
"field.blocks.video.url.label": "URL-Vídeo",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"installation.issues.mbstring": "A extensão <code>MB String</code> é necessária",
"installation.issues.media": "A pasta <code>/media</code> não existe ou não tem permissão de escrita",
"installation.issues.php": "Certifique-se que está a usar o <code>PHP 8+</code>",
"installation.issues.server": "O Kirby necessita do <code>Apache</code>, <code>Nginx</code> ou <code>Caddy</code>",
"installation.issues.sessions": "A pasta <code>/site/sessions</code> não existe ou não tem permissão de escrita",
"language": "Idioma",
@@ -481,7 +490,7 @@
"login.totp.disable.option": "Desativar códigos de segurança",
"login.totp.disable.label": "Insira a sua palavra-passe para desativar códigos de segurança",
"login.totp.disable.help": "No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando iniciar a sessão. Poderá configurar códigos de segurança novamente mais tarde.",
"login.totp.disable.admin": "<p>Isto irá desactivar os códigos de segurança para <strong>{user}</strong>.</p> <p>No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando eles iniciarem a sessão. {user} poderá configurar códigos de segurança novamente após o próximo início de sessão.</p>",
"login.totp.disable.admin": "<p>Isto irá desativar os códigos de segurança para <strong>{user}</strong>.</p> <p>No futuro, um segundo fator diferente, como um código de início de sessão enviado por e-mail, será solicitado quando eles iniciarem a sessão. {user} poderá configurar códigos de segurança novamente após o próximo início de sessão.</p>",
"login.totp.disable.success": "Códigos de segurança desativados",
"logout": "Sair",
@@ -564,7 +573,7 @@
"paste": "Colar",
"paste.after": "Colar após",
"paste.success": "{count} colados!",
"pixel": "Pixel",
"pixel": "Píxel",
"plugin": "Plugin",
"plugins": "Plugins",
"prev": "Anterior",
@@ -611,6 +620,8 @@
"stats.empty": "Sem relatórios",
"status": "Estado",
"system.info.copy": "Copiar informação",
"system.info.copied": "Informação de sistema copiada",
"system.issues.content": "A pasta content parece não estar protegida",
"system.issues.eol.kirby": "A versão instalada do Kirby chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",
"system.issues.eol.plugin": "A versão instalada do plugin { plugin } chegou ao fim da sua vida útil e não irá receber mais atualizações de segurança",

View File

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

View File

@@ -71,7 +71,7 @@
"error": "Ошибка",
"error.access.code": "Неверный код",
"error.access.login": "Неправильный логин",
"error.access.login": "Неверный логин или пароль",
"error.access.panel": "У вас нет права доступа к панели",
"error.access.view": "У вас нет прав доступа к этой части панели",
@@ -126,9 +126,12 @@
"error.form.notSaved": "Форма не может быть сохранена",
"error.language.code": "Пожалуйста, впишите правильный код языка",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "Язык уже есть",
"error.language.name": "Пожалуйста, впишите правильное название языка",
"error.language.notFound": "Не получилось найти этот язык",
"error.language.update.permission": "You are not allowed to update the language",
"error.layout.validation.block": "Ошибка в поле \"{field}\" в блоке {blockIndex} типа \"{fieldset}\" внутри разметки {layoutIndex}",
"error.layout.validation.settings": "Ошибка в настройках макета {index}",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "Автор …",
"field.blocks.text.name": "Текст",
"field.blocks.text.placeholder": "Текст …",
"field.blocks.video.autoplay": "Автовоспроизведение",
"field.blocks.video.caption": "Подпись",
"field.blocks.video.controls": "Элементы управления",
"field.blocks.video.location": "Расположение",
"field.blocks.video.loop": "Зациклить",
"field.blocks.video.muted": "Без звука",
"field.blocks.video.name": "Видео",
"field.blocks.video.placeholder": "Введите ссылку на видео",
"field.blocks.video.poster": "Обложка",
"field.blocks.video.preload": "Предзагрузка",
"field.blocks.video.url.label": "Ссылка на видео",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"installation.issues.mbstring": "Расширение <code>MB String</code> необходимо",
"installation.issues.media": "Каталог <code>/media</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> не существует или нет прав записи",
"language": "\u042f\u0437\u044b\u043a",
@@ -447,7 +456,7 @@
"lock.unsaved": "Несохраненные изменения",
"lock.unsaved.empty": "Несохраненных изменений нет",
"lock.isLocked": "Несохраненные изменения <strong>{email}</strong>",
"lock.isLocked": "Несохраненные изменения {email}",
"lock.unlock": "Разблокировать",
"lock.unlock.submit": "Разблокируйте и перезапишите несохраненные изменения <strong>{email}</strong>",
"lock.isUnlocked": "Были перезаписаны другим пользователем",
@@ -611,6 +620,8 @@
"stats.empty": "Статистики нет",
"status": "Статус",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "Похоже, к папке content есть несанкционированный доступ",
"system.issues.eol.kirby": "Срок службы установленной вами версии Kirby истек, и она больше не будет получать обновления для системы безопасности",
"system.issues.eol.plugin": "Срок службы установленной вами версии плагина { plugin } истек, и он не будет получать дальнейших обновлений для системы безопасности",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Formulár sa nepodarilo uložiť",
"error.language.code": "Please enter a valid code for the language",
"error.language.create.permission": "You are not allowed to create a language",
"error.language.delete.permission": "You are not allowed to delete the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.notFound": "The language could not be found",
"error.language.update.permission": "You are not allowed to update the language",
"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",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "by …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autoplay",
"field.blocks.video.caption": "Popis",
"field.blocks.video.controls": "Controls",
"field.blocks.video.location": "Poloha",
"field.blocks.video.loop": "Loop",
"field.blocks.video.muted": "Muted",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Enter a video URL",
"field.blocks.video.poster": "Poster",
"field.blocks.video.preload": "Preload",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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ý",
"language": "Jazyk",
@@ -611,6 +620,8 @@
"stats.empty": "No reports",
"status": "Status",
"system.info.copy": "Copy info",
"system.info.copied": "System info copied",
"system.issues.content": "The content folder seems to be exposed",
"system.issues.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",

View File

@@ -126,16 +126,19 @@
"error.form.notSaved": "Formuläret kunde inte sparas",
"error.language.code": "Ange en giltig kod för språket",
"error.language.create.permission": "Du saknar behörighet att skapa ett nytt språk",
"error.language.delete.permission": "Du saknar behörighet att radera språket",
"error.language.duplicate": "Språket finns redan",
"error.language.name": "Ange ett giltigt namn för språket",
"error.language.notFound": "Språket hittades inte",
"error.language.update.permission": "Du saknar behörighet att redigera språket",
"error.layout.validation.block": "Det finns ett fel i fältet \"{field}\" i blocket {blockIndex} med blocktypen \"{fieldset}\" i layouten {layoutIndex}",
"error.layout.validation.settings": "Det finns ett fel i inställningarna för layout {index}",
"error.license.domain": "Domänen för licensen saknas",
"error.license.email": "Ange en giltig e-postadress",
"error.license.format": "Please enter a valid license code",
"error.license.format": "Ange en giltig licenskod",
"error.license.verification": "Licensen kunde inte verifieras",
"error.login.totp.confirm.invalid": "Ogiltig kod",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "av …",
"field.blocks.text.name": "Text",
"field.blocks.text.placeholder": "Text …",
"field.blocks.video.autoplay": "Autospela",
"field.blocks.video.caption": "Rubrik",
"field.blocks.video.controls": "Kontroller",
"field.blocks.video.location": "Plats",
"field.blocks.video.loop": "Loopa",
"field.blocks.video.muted": "Ljud av",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Ange en URL till en video",
"field.blocks.video.poster": "Stillbild",
"field.blocks.video.preload": "Förladda",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Spr\u00e5k",
@@ -425,7 +434,7 @@
"license.code.label": "Ange din licenskod",
"license.status.active.info": "Inkluderar nya större versioner fram till {date}",
"license.status.active.label": "Giltig licens",
"license.status.demo.info": "This is a demo installation",
"license.status.demo.info": "Detta är en demoinstallation",
"license.status.demo.label": "Demo",
"license.status.inactive.info": "Förnya licensen för att uppdatera till nyare större versioner",
"license.status.inactive.label": "Inga nya större versioner",
@@ -611,6 +620,8 @@
"stats.empty": "Inga rapporter",
"status": "Status",
"system.info.copy": "Kopiera info",
"system.info.copied": "Systeminformation kopierad",
"system.issues.content": "Mappen content verkar vara exponerad",
"system.issues.eol.kirby": "Din installerade Kirby-version har nått slutet av sin livscykel och kommer inte att få fler säkerhetsuppdateringar",
"system.issues.eol.plugin": "Den installerade versionen av tillägget { plugin } har nått slutet på sin livscykel och kommer inte att få fler säkerhetsuppdateringar.",

View File

@@ -126,9 +126,12 @@
"error.form.notSaved": "Form kaydedilemedi",
"error.language.code": "Lütfen dil için geçerli bir kod girin",
"error.language.create.permission": "Bir dil oluşturmanıza izin verilmiyor",
"error.language.delete.permission": "Dili silmenize izin verilmiyor",
"error.language.duplicate": "Bu dil zaten var",
"error.language.name": "Lütfen dil için geçerli bir isim girin",
"error.language.notFound": "Dil bulunamadı",
"error.language.update.permission": "Dili güncellemenize izin verilmiyor",
"error.layout.validation.block": "{layoutIndex}. sıradaki düzende \"{fieldset}\" blok türünü kullanan {blockIndex}. bloktaki \"{field}\" alanında bir hata var",
"error.layout.validation.settings": "{index}. düzen ayarlarında bir hata var",
@@ -317,9 +320,16 @@
"field.blocks.quote.citation.placeholder": "yazar …",
"field.blocks.text.name": "Metin",
"field.blocks.text.placeholder": "Metin …",
"field.blocks.video.autoplay": "Otomatik oynatma",
"field.blocks.video.caption": "Altyazı",
"field.blocks.video.controls": "Kontroller",
"field.blocks.video.location": "Lokasyon",
"field.blocks.video.loop": "Döngü",
"field.blocks.video.muted": "Sessiz",
"field.blocks.video.name": "Video",
"field.blocks.video.placeholder": "Bir video URL'si girin",
"field.blocks.video.poster": "Kapak",
"field.blocks.video.preload": "Önyükleme",
"field.blocks.video.url.label": "Video-URL",
"field.blocks.video.url.placeholder": "https://youtube.com/?v=",
@@ -379,7 +389,6 @@
"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 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",
"language": "Dil",
@@ -611,6 +620,8 @@
"stats.empty": "Rapor yok",
"status": "Durum",
"system.info.copy": "Bilgileri kopyala",
"system.info.copied": "Sistem bilgisi kopyalandı",
"system.issues.content": "İçerik klasörü açığa çıkmış görünüyor",
"system.issues.eol.kirby": "Yüklü Kirby sürümünüz kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak",
"system.issues.eol.plugin": "{ plugin } eklentisinin yüklü sürümü kullanım ömrünün sonuna ulaştı ve daha fazla güvenlik güncellemesi almayacak",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

BIN
kirby/panel/dist/favicon-dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

View File

@@ -20,6 +20,9 @@
</symbol>
<symbol id="icon-angle-down" viewBox="0 0 24 24">
<path d="M11.9997 13.1714L16.9495 8.22168L18.3637 9.63589L11.9997 15.9999L5.63574 9.63589L7.04996 8.22168L11.9997 13.1714Z" />
</symbol>
<symbol id="icon-angle-dropdown" viewBox="0 0 24 24">
<path d="M12 15.0006L7.75732 10.758L9.17154 9.34375L12 12.1722L14.8284 9.34375L16.2426 10.758L12 15.0006Z" />
</symbol>
<symbol id="icon-angle-left" viewBox="0 0 24 24">
<path d="M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z" />
@@ -86,7 +89,7 @@
<path d="M4.00488 16V4H2.00488V2H5.00488C5.55717 2 6.00488 2.44772 6.00488 3V15H18.4433L20.4433 7H8.00488V5H21.7241C22.2764 5 22.7241 5.44772 22.7241 6C22.7241 6.08176 22.7141 6.16322 22.6942 6.24254L20.1942 16.2425C20.083 16.6877 19.683 17 19.2241 17H5.00488C4.4526 17 4.00488 16.5523 4.00488 16ZM6.00488 23C4.90031 23 4.00488 22.1046 4.00488 21C4.00488 19.8954 4.90031 19 6.00488 19C7.10945 19 8.00488 19.8954 8.00488 21C8.00488 22.1046 7.10945 23 6.00488 23ZM18.0049 23C16.9003 23 16.0049 22.1046 16.0049 21C16.0049 19.8954 16.9003 19 18.0049 19C19.1095 19 20.0049 19.8954 20.0049 21C20.0049 22.1046 19.1095 23 18.0049 23Z"/>
</symbol>
<symbol id="icon-chart" viewBox="0 0 24 24">
<path d="M3 12H7V21H3V12ZM17 8H21V21H17V8ZM10 2H14V21H10V2Z"/>
<path d="M2 9H4V21H2V9ZM8 3H10V21H8V3ZM14 12H16V21H14V12ZM20 6H22V21H20V6Z" />
</symbol>
<symbol id="icon-chat" viewBox="0 0 24 24">
<path d="M5.45455 15L1 18.5V3C1 2.44772 1.44772 2 2 2H17C17.5523 2 18 2.44772 18 3V15H5.45455ZM4.76282 13H16V4H3V14.3851L4.76282 13ZM8 17H18.2372L20 18.3851V8H21C21.5523 8 22 8.44772 22 9V22.5L17.5455 19H9C8.44772 19 8 18.5523 8 18V17Z"/>
@@ -126,8 +129,7 @@
<path d="M2.21329 14.0601C1.92026 12.6755 1.93213 11.2743 2.21413 9.94038C3.32405 10.0711 4.29284 9.7035 4.60963 8.93871C4.92641 8.17392 4.50129 7.22896 3.62405 6.53655C4.36788 5.3939 5.35029 4.39471 6.53651 3.62289C7.22898 4.50059 8.17422 4.92601 8.9392 4.60914C9.70418 4.29227 10.0717 3.32308 9.94077 2.21281C11.3253 1.91977 12.7265 1.93164 14.0605 2.21364C13.9298 3.32356 14.2973 4.29235 15.0621 4.60914C15.8269 4.92593 16.7719 4.5008 17.4643 3.62356C18.6069 4.36739 19.6061 5.3498 20.3779 6.53602C19.5002 7.22849 19.0748 8.17373 19.3917 8.93871C19.7086 9.70369 20.6778 10.0713 21.788 9.94028C22.0811 11.3248 22.0692 12.726 21.7872 14.06C20.6773 13.9293 19.7085 14.2969 19.3917 15.0616C19.0749 15.8264 19.5 16.7714 20.3773 17.4638C19.6335 18.6064 18.651 19.6056 17.4648 20.3775C16.7724 19.4998 15.8271 19.0743 15.0621 19.3912C14.2971 19.7081 13.9296 20.6773 14.0606 21.7875C12.676 22.0806 11.2748 22.0687 9.94087 21.7867C10.0716 20.6768 9.70399 19.708 8.9392 19.3912C8.17441 19.0744 7.22945 19.4995 6.53703 20.3768C5.39439 19.633 4.3952 18.6506 3.62338 17.4643C4.50108 16.7719 4.92649 15.8266 4.60963 15.0616C4.29276 14.2967 3.32356 13.9291 2.21329 14.0601ZM4.00073 12.2104C5.10054 12.5148 6.00815 13.2117 6.45739 14.2963C6.90662 15.3808 6.75764 16.5154 6.19519 17.5083C6.29175 17.61 6.39096 17.7092 6.4927 17.8056C7.48558 17.2432 8.6201 17.0943 9.70456 17.5435C10.789 17.9927 11.4859 18.9002 11.7904 19.9999C11.9305 20.0037 12.0707 20.0038 12.2109 20.0001C12.5153 18.9003 13.2122 17.9927 14.2968 17.5435C15.3813 17.0942 16.5159 17.2432 17.5088 17.8057C17.6105 17.7091 17.7096 17.6099 17.806 17.5081C17.2437 16.5153 17.0947 15.3807 17.5439 14.2963C17.9931 13.2118 18.9007 12.5149 20.0004 12.2105C20.0042 12.0704 20.0043 11.9301 20.0006 11.7899C18.9008 11.4856 17.9932 10.7886 17.5439 9.70407C17.0947 8.61953 17.2437 7.48494 17.8061 6.49204C17.7096 6.39031 17.6104 6.2912 17.5086 6.19479C16.5158 6.75717 15.3812 6.9061 14.2968 6.4569C13.2123 6.0077 12.5154 5.10016 12.211 4.00044C12.0709 3.99666 11.9306 3.99659 11.7904 4.00024C11.486 5.10005 10.7891 6.00767 9.70456 6.4569C8.62002 6.90613 7.48543 6.75715 6.49252 6.1947C6.39079 6.29126 6.29169 6.39047 6.19528 6.49222C6.75766 7.48509 6.90659 8.61961 6.45739 9.70407C6.00819 10.7885 5.10065 11.4855 4.00092 11.7899C3.99715 11.93 3.99708 12.0702 4.00073 12.2104ZM12.0007 15.0002C10.3438 15.0002 9.00066 13.657 9.00066 12.0002C9.00066 10.3433 10.3438 9.00018 12.0007 9.00018C13.6575 9.00018 15.0007 10.3433 15.0007 12.0002C15.0007 13.657 13.6575 15.0002 12.0007 15.0002ZM12.0007 13.0002C12.5529 13.0002 13.0007 12.5525 13.0007 12.0002C13.0007 11.4479 12.5529 11.0002 12.0007 11.0002C11.4484 11.0002 11.0007 11.4479 11.0007 12.0002C11.0007 12.5525 11.4484 13.0002 12.0007 13.0002Z"/>
</symbol>
<symbol id="icon-collapse" viewBox="0 0 24 24">
<path d="M 7.277948 17.761471 L 3.03918 22.000246 L 1.97949 20.940571 L 6.218198 16.701794 L 2.509335 12.992909 L 10.986812 12.992909 L 10.986812 21.470409 L 7.277948 17.761471 Z"/>
<path d="M 17.761225 6.27887 L 21.470163 9.987807 L 12.992662 9.987807 L 12.992662 1.510315 L 16.70155 5.219193 L 20.940325 0.980471 L 22 2.040154 L 17.761225 6.27887 Z"/>
<path d="M15 4.00008H13V11.0001H20V9.00008H16.4142L20.7071 4.70718L19.2929 3.29297L15 7.58586V4.00008ZM4.00008 15H7.58586L3.29297 19.2929L4.70718 20.7071L9.00008 16.4142V20H11.0001V13H4.00008V15Z" />
</symbol>
<symbol id="icon-copy" viewBox="0 0 24 24">
<path d="M6.9998 6V3C6.9998 2.44772 7.44752 2 7.9998 2H19.9998C20.5521 2 20.9998 2.44772 20.9998 3V17C20.9998 17.5523 20.5521 18 19.9998 18H16.9998V20.9991C16.9998 21.5519 16.5499 22 15.993 22H4.00666C3.45059 22 3 21.5554 3 20.9991L3.0026 7.00087C3.0027 6.44811 3.45264 6 4.00942 6H6.9998ZM5.00242 8L5.00019 20H14.9998V8H5.00242ZM8.9998 6H16.9998V16H18.9998V4H8.9998V6Z" />
@@ -151,7 +153,7 @@
<path d="M4 16H20V5H4V16ZM13 18V20H17V22H7V20H11V18H2.9918C2.44405 18 2 17.5511 2 16.9925V4.00748C2 3.45107 2.45531 3 2.9918 3H21.0082C21.556 3 22 3.44892 22 4.00748V16.9925C22 17.5489 21.5447 18 21.0082 18H13Z"/>
</symbol>
<symbol id="icon-divider" viewBox="0 0 24 24">
<path d="M17 21V17H7V21H5V16C5 15.4477 5.44772 15 6 15H18C18.5523 15 19 15.4477 19 16V21H17ZM7 3V7H17V3H19V8C19 8.55228 18.5523 9 18 9H6C5.44772 9 5 8.55228 5 8V3H7ZM2 9L6 12L2 15V9ZM22 9V15L18 12L22 9Z"/>
<path d="M22 11L2 11L2 13L22 13V11ZM18 2C19.1046 2 20 2.89543 20 4V7C20 8.10457 19.1046 9 18 9L6 9C4.89543 9 4 8.10457 4 7L4 4C4 2.89543 4.89543 2 6 2L18 2ZM18 20H6V17L18 17V20ZM20 17C20 15.8954 19.1046 15 18 15L6 15C4.89543 15 4 15.8954 4 17L4 20C4 21.1046 4.89543 22 6 22H18C19.1046 22 20 21.1046 20 20V17Z" />
</symbol>
<symbol id="icon-document" viewBox="0 0 24 24">
<path d="M20 22H4C3.44772 22 3 21.5523 3 21V3C3 2.44772 3.44772 2 4 2H20C20.5523 2 21 2.44772 21 3V21C21 21.5523 20.5523 22 20 22ZM19 20V4H5V20H19ZM7 6H11V10H7V6ZM7 12H17V14H7V12ZM7 16H17V18H7V16ZM13 7H17V9H13V7Z"/>
@@ -175,8 +177,7 @@
<path d="M3 3H21C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3ZM20 7.23792L12.0718 14.338L4 7.21594V19H20V7.23792ZM4.51146 5L12.0619 11.662L19.501 5H4.51146Z"/>
</symbol>
<symbol id="icon-expand" viewBox="0 0 24 24">
<path d="M 18.277948 6.761469 L 14.03918 11.000246 L 12.979489 9.940571 L 17.218199 5.701796 L 13.509336 1.992908 L 21.986811 1.992908 L 21.986811 10.470408 L 18.277948 6.761469 Z"/>
<path d="M 6.761224 18.27887 L 10.470162 21.987808 L 1.992663 21.987808 L 1.992663 13.510315 L 5.701549 17.219193 L 9.940325 12.980471 L 11 14.040153 L 6.761224 18.27887 Z"/>
<path d="M17.5858 5H14V3H21V10H19V6.41421L14.7071 10.7071L13.2929 9.29289L17.5858 5ZM3 14H5V17.5858L9.29289 13.2929L10.7071 14.7071L6.41421 19H10V21H3V14Z" />
</symbol>
<symbol id="icon-facebook" viewBox="0 0 24 24">
<path d="M15.4024 21V14.0344H17.7347L18.0838 11.3265H15.4024V9.59765C15.4024 8.81364 15.62 8.27934 16.7443 8.27934L18.1783 8.27867V5.85676C17.9302 5.82382 17.0791 5.75006 16.0888 5.75006C14.0213 5.75006 12.606 7.01198 12.606 9.32952V11.3265H10.2677V14.0344H12.606V21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H15.4024Z"/>
@@ -236,6 +237,9 @@
<symbol id="icon-globe" viewBox="0 0 24 24">
<path d="M13.0003 20.9998H18.0003V22.9998H6.00032V20.9998H11.0003V19.9505C7.70689 19.6235 4.88351 17.6986 3.31641 14.9621L5.05319 13.9696C6.43208 16.3775 9.02674 17.9998 12.0003 17.9998C16.4186 17.9998 20.0003 14.4181 20.0003 9.99983C20.0003 7.02625 18.378 4.43159 15.9701 3.0527L16.9626 1.31592C19.9724 3.03953 22.0003 6.28285 22.0003 9.99983C22.0003 15.1852 18.0536 19.4487 13.0003 19.9505V20.9998ZM12.0003 16.9998C8.13433 16.9998 5.00032 13.8658 5.00032 9.99983C5.00032 6.13384 8.13433 2.99983 12.0003 2.99983C15.8663 2.99983 19.0003 6.13384 19.0003 9.99983C19.0003 13.8658 15.8663 16.9998 12.0003 16.9998ZM12.0003 14.9998C14.7617 14.9998 17.0003 12.7613 17.0003 9.99983C17.0003 7.23841 14.7617 4.99983 12.0003 4.99983C9.2389 4.99983 7.00032 7.23841 7.00032 9.99983C7.00032 12.7613 9.2389 14.9998 12.0003 14.9998Z"/>
</symbol>
<symbol id="icon-google" viewBox="0 0 24 24">
<path d="M12 11H20.5329C20.5769 11.3847 20.6 11.7792 20.6 12.1837C20.6 14.9184 19.6204 17.2204 17.9224 18.7837C16.4367 20.1551 14.404 20.9592 11.9796 20.9592C8.46933 20.9592 5.43266 18.947 3.9551 16.0123C3.34695 14.8 3 13.4286 3 11.9796C3 10.5306 3.34695 9.1592 3.9551 7.94698C5.43266 5.01226 8.46933 3 11.9796 3C14.4 3 16.4326 3.88983 17.9877 5.33878L16.5255 6.80101C15.3682 5.68153 13.8028 5 12 5C8.13401 5 5 8.13401 5 12C5 15.866 8.13401 19 12 19C15.5265 19 18.1443 16.3923 18.577 13H12V11Z"/>
</symbol>
<symbol id="icon-grid" viewBox="0 0 24 24">
<path d="M22 12.999V20C22 20.5523 21.5523 21 21 21H13V12.999H22ZM11 12.999V21H3C2.44772 21 2 20.5523 2 20V12.999H11ZM11 3V10.999H2V4C2 3.44772 2.44772 3 3 3H11ZM21 3C21.5523 3 22 3.44772 22 4V10.999H13V3H21Z"/>
</symbol>
@@ -408,24 +412,16 @@
<path d="M10 6V8H5V19H16V14H18V20C18 20.5523 17.5523 21 17 21H4C3.44772 21 3 20.5523 3 20V7C3 6.44772 3.44772 6 4 6H10ZM21 3V11H19L18.9999 6.413L11.2071 14.2071L9.79289 12.7929L17.5849 5H13V3H21Z"/>
</symbol>
<symbol id="icon-order-alpha-asc" viewBox="0 0 24 24">
<path d="M 9.336546 1 L 12.936545 10 L 11.173365 10 L 10.190728 7.545454 L 6.844365 7.545454 L 5.863364 10 L 4.101 10 L 7.700182 1 Z M 8.518364 3.360619 L 7.498092 5.90909 L 9.537002 5.90909 Z"/>
<path d="M 12 13 L 12 14.75 L 7.338525 20 L 12 20 L 12 21.75 L 5 21.75 L 5 20 L 9.6599 14.75 L 5 14.75 L 5 13 Z"/>
<path d="M 20 4 L 20 16 L 23 16 L 19 21 L 15 16 L 18 16 L 18 4 Z"/>
<path d="M4.86885 11H2.6665L6 3H8L11.3334 11H9.13113L8.7213 10H5.27869L4.86885 11ZM6.09836 8H7.90163L7 5.8L6.09836 8ZM18.9999 16V3H16.9999V16H13.9999L17.9999 21L21.9999 16H18.9999ZM10.9999 13H2.99992V15H7.85414L2.99992 19V21H10.9999V19H6.14605L10.9999 15V13Z" />
</symbol>
<symbol id="icon-order-alpha-desc" viewBox="0 0 24 24">
<path d="M 9.336546 1 L 12.936545 10 L 11.173365 10 L 10.190728 7.545454 L 6.844365 7.545454 L 5.863364 10 L 4.101 10 L 7.700182 1 Z M 8.518364 3.360619 L 7.498092 5.90909 L 9.537002 5.90909 Z"/>
<path d="M 12 13 L 12 14.75 L 7.338525 20 L 12 20 L 12 21.75 L 5 21.75 L 5 20 L 9.6599 14.75 L 5 14.75 L 5 13 Z"/>
<path d="M 19 3 L 23 8 L 20 8 L 20 20 L 18 20 L 18 8 L 15 8 Z"/>
<path d="M4.86885 11H2.6665L6 3H8L11.3334 11H9.13113L8.7213 10H5.27869L4.86885 11ZM6.09836 8H7.90163L7 5.8L6.09836 8ZM21.9999 8L17.9999 3L13.9999 8H16.9999V21H18.9999V8H21.9999ZM10.9999 13H2.99992V15H7.85414L2.99992 19V21H10.9999V19H6.14605L10.9999 15V13Z" />
</symbol>
<symbol id="icon-order-num-asc" viewBox="0 0 24 24">
<path d="M 6.6224 22 L 8.7008 18.4 C 6.932719 18.4 5.5 16.967279 5.5 15.2 C 5.5 13.432719 6.932719 12 8.7 12 C 10.46728 12 11.9 13.432719 11.9 15.2 C 11.9 15.78912 11.7408 16.34104 11.46312 16.815121 L 8.4696 22 Z M 8.7 16.799999 C 9.583681 16.799999 10.3 16.083679 10.3 15.2 C 10.3 14.316319 9.583681 13.6 8.7 13.6 C 7.816319 13.6 7.1 14.316319 7.1 15.2 C 7.1 16.083679 7.816319 16.799999 8.7 16.799999 Z"/>
<path d="M 10 1 L 10 9.998876 L 8.500187 9.998876 L 8.499813 2.652794 L 7 3.054743 L 7 1.502438 L 8.87514 1 Z"/>
<path d="M 20 4 L 20 16 L 23 16 L 19 21 L 15 16 L 18 16 L 18 4 Z"/>
<path d="M9.00054 3L9 11H7V5.41L5 5.9485V3.61978L7.31304 3H9.00054ZM19 3V16H22L18 21L14 16H17V3H19ZM11 15.5C11 16.0645 10.8441 16.5926 10.5729 17.0436L8.28871 21H5.97931L7.45156 18.45C6.05661 18.1923 5 16.9695 5 15.5C5 13.8431 6.34315 12.5 8 12.5C9.65685 12.5 11 13.8431 11 15.5ZM8 16.5C8.55228 16.5 9 16.0523 9 15.5C9 14.9477 8.55228 14.5 8 14.5C7.44772 14.5 7 14.9477 7 15.5C7 16.0523 7.44772 16.5 8 16.5Z" />
</symbol>
<symbol id="icon-order-num-desc" viewBox="0 0 24 24">
<path d="M 6.6224 22 L 8.7008 18.4 C 6.932719 18.4 5.5 16.967279 5.5 15.2 C 5.5 13.432719 6.932719 12 8.7 12 C 10.46728 12 11.9 13.432719 11.9 15.2 C 11.9 15.78912 11.7408 16.34104 11.46312 16.815121 L 8.4696 22 Z M 8.7 16.799999 C 9.583681 16.799999 10.3 16.083679 10.3 15.2 C 10.3 14.316319 9.583681 13.6 8.7 13.6 C 7.816319 13.6 7.1 14.316319 7.1 15.2 C 7.1 16.083679 7.816319 16.799999 8.7 16.799999 Z"/>
<path d="M 10 1 L 10 9.998876 L 8.500187 9.998876 L 8.499813 2.652794 L 7 3.054743 L 7 1.502438 L 8.87514 1 Z"/>
<path d="M 19 3 L 23 8 L 20 8 L 20 20 L 18 20 L 18 8 L 15 8 Z"/>
<path d="M9 11L9.00054 3H7.31304L5 3.61978V5.9485L7 5.41V11H9ZM22 8L18 3L14 8H17V21H19V8H22ZM8 16.5C7.44772 16.5 7 16.0523 7 15.5C7 14.9477 7.44772 14.5 8 14.5C8.55228 14.5 9 14.9477 9 15.5C9 16.0523 8.55228 16.5 8 16.5ZM10.5729 17.0436C10.8441 16.5926 11 16.0645 11 15.5C11 13.8431 9.65685 12.5 8 12.5C6.34315 12.5 5 13.8431 5 15.5C5 16.9695 6.05661 18.1923 7.45156 18.45L5.97931 21H8.28871L10.5729 17.0436Z" />
</symbol>
<symbol id="icon-page" viewBox="0 0 24 24">
<use href="#icon-document" />
@@ -580,6 +576,15 @@
</symbol>
<symbol id="icon-text-right" viewBox="0 0 24 24">
<path d="M3 4H21V6H3V4ZM7 19H21V21H7V19ZM3 14H21V16H3V14ZM7 9H21V11H7V9Z"/>
</symbol>
<symbol id="icon-text-top" viewBox="0 0 24 24">
<path d="M3 3H21V5H3V3ZM8 11V21H6V11H3L7 7L11 11H8ZM18 11V21H16V11H13L17 7L21 11H18Z"/>
</symbol>
<symbol id="icon-text-middle" viewBox="0 0 24 24">
<path d="M3 11H21V13H3V11ZM18 18V21H16V18H13L17 14L21 18H18ZM8 18V21H6V18H3L7 14L11 18H8ZM18 6H21L17 10L13 6H16V3H18V6ZM8 6H11L7 10L3 6H6V3H8V6Z" />
</symbol>
<symbol id="icon-text-bottom" viewBox="0 0 24 24">
<path d="M3 19H21V21H3V19ZM8 13H11L7 17L3 13H6V3H8V13ZM18 13H21L17 17L13 13H16V3H18V13Z" />
</symbol>
<symbol id="icon-ticket" viewBox="0 0 24 24">
<path d="M2.00488 9.5V4C2.00488 3.44772 2.4526 3 3.00488 3H21.0049C21.5572 3 22.0049 3.44772 22.0049 4V9.5C20.6242 9.5 19.5049 10.6193 19.5049 12C19.5049 13.3807 20.6242 14.5 22.0049 14.5V20C22.0049 20.5523 21.5572 21 21.0049 21H3.00488C2.4526 21 2.00488 20.5523 2.00488 20V14.5C3.38559 14.5 4.50488 13.3807 4.50488 12C4.50488 10.6193 3.38559 9.5 2.00488 9.5ZM4.00488 7.96776C5.4866 8.70411 6.50488 10.2331 6.50488 12C6.50488 13.7669 5.4866 15.2959 4.00488 16.0322V19H20.0049V16.0322C18.5232 15.2959 17.5049 13.7669 17.5049 12C17.5049 10.2331 18.5232 8.70411 20.0049 7.96776V5H4.00488V7.96776ZM9.00488 9H15.0049V11H9.00488V9ZM9.00488 13H15.0049V15H9.00488V13Z"/>

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{D as t}from"./Docs.min.js";import{n as s}from"./index.min.js";import"./vendor.min.js";const o=s({components:{"k-lab-docs":t},props:{component:String,docs:Object,lab:String},mounted(){},methods:{reloadDocs(){this.$panel.view.refresh()}}},(function(){var t=this,s=t._self._c;return s("k-panel-inside",{staticClass:"k-lab-docs-view"},[s("k-header",[t._v(" "+t._s(t.component)+" "),t.docs.github||t.lab?s("k-button-group",{attrs:{slot:"buttons"},slot:"buttons"},[t.lab?s("k-button",{attrs:{icon:"lab",text:"Lab examples",size:"sm",variant:"filled",link:"/lab/"+t.lab}}):t._e(),t.docs.github?s("k-button",{attrs:{icon:"github",size:"sm",variant:"filled",link:t.docs.github,target:"_blank"}}):t._e()],1):t._e()],1),s("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[],!1,null,null,null,null).exports;export{o as default};
import{D as t}from"./Docs.min.js";import{n as s}from"./index.min.js";import"./vendor.min.js";const o=s({components:{"k-lab-docs":t},props:{component:String,docs:Object,lab:String},mounted(){},methods:{reloadDocs(){this.$panel.view.refresh()}}},(function(){var t=this,s=t._self._c;return s("k-panel-inside",{staticClass:"k-lab-docs-view"},[s("k-header",[t._v(" "+t._s(t.component)+" "),t.docs.github||t.lab?s("k-button-group",{attrs:{slot:"buttons"},slot:"buttons"},[t.lab?s("k-button",{attrs:{icon:"lab",text:"Lab examples",size:"sm",variant:"filled",link:"/lab/"+t.lab}}):t._e(),t.docs.github?s("k-button",{attrs:{icon:"github",size:"sm",variant:"filled",link:t.docs.github,target:"_blank"}}):t._e()],1):t._e()],1),s("k-lab-docs",t._b({},"k-lab-docs",t.docs,!1))],1)}),[]).exports;export{o as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{n as e}from"./index.min.js";import"./vendor.min.js";const t=e({props:{categories:Array,info:String,tab:String}},(function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-lab-index-view"},[t("k-header",[e._v("Lab")]),t("k-tabs",{attrs:{tab:e.tab,tabs:[{name:"examples",label:"Examples",link:"/lab"},{name:"docs",label:"Docs",link:"/lab/docs"}]}}),e.info?t("k-box",{attrs:{icon:"question",theme:"info",text:e.info,html:!0}}):e._e(),e._l(e.categories,(function(e){return t("k-section",{key:e.name,attrs:{headline:e.name}},[t("k-collection",{attrs:{items:e.examples,empty:{icon:e.icon,text:"Add examples to "+e.path}}})],1)}))],2)}),[],!1,null,null,null,null).exports;export{t as default};
import{n as e}from"./index.min.js";import"./vendor.min.js";const t=e({props:{categories:Array,info:String,tab:String}},(function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-lab-index-view"},[t("k-header",[e._v("Lab")]),t("k-tabs",{attrs:{tab:e.tab,tabs:[{name:"examples",label:"Examples",link:"/lab"},{name:"docs",label:"Docs",link:"/lab/docs"}]}}),e.info?t("k-box",{attrs:{icon:"question",theme:"info",text:e.info,html:!0}}):e._e(),e._l(e.categories,(function(e){return t("k-section",{key:e.name,attrs:{headline:e.name}},[t("k-collection",{attrs:{items:e.examples,empty:{icon:e.icon,text:"Add examples to "+e.path}}})],1)}))],2)}),[]).exports;export{t as default};

View File

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

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

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

View File

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

View File

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

View File

@@ -71,7 +71,7 @@ class Api extends BaseApi
$field = Form::for($model)->field($name);
$fieldApi = $this->clone([
'data' => array_merge($this->data(), ['field' => $field]),
'data' => [...$this->data(), 'field' => $field],
'routes' => $field->api(),
]);
@@ -185,6 +185,30 @@ class Api extends BaseApi
return $pages->query($this->requestBody());
}
/**
* @throws \Kirby\Exception\NotFoundException if the section type cannot be found or the section cannot be loaded
*/
public function sectionApi(
ModelWithContent $model,
string $name,
string|null $path = null
): mixed {
if (!$section = $model->blueprint()?->section($name)) {
throw new NotFoundException('The section "' . $name . '" could not be found');
}
$sectionApi = $this->clone([
'data' => [...$this->data(), 'section' => $section],
'routes' => $section->api(),
]);
return $sectionApi->call(
$path,
$this->requestMethod(),
$this->requestData()
);
}
/**
* Returns the current Session instance
*

View File

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

View File

@@ -190,8 +190,19 @@ trait AppErrors
protected function getAdditionalWhoopsHandler(): CallbackHandler
{
return new CallbackHandler(function ($exception, $inspector, $run) {
$this->trigger('system.exception', compact('exception'));
$isLogged = true;
// allow hook to modify whether the exception should be logged
$isLogged = $this->apply(
'system.exception',
compact('exception', 'isLogged'),
'isLogged'
);
if ($isLogged !== false) {
error_log($exception);
}
return Handler::DONE;
});
}

View File

@@ -659,6 +659,11 @@ trait AppPlugins
*/
protected function extensionsFromSystem(): void
{
// Always start with fresh fields and sections
// from the core and add plugins on top of that
FormField::$types = [];
Section::$types = [];
// mixins
FormField::$mixins = $this->core->fieldMixins();
Section::$mixins = $this->core->sectionMixins();
@@ -674,8 +679,8 @@ trait AppPlugins
$this->extendCacheTypes($this->core->cacheTypes());
$this->extendComponents($this->core->components());
$this->extendBlueprints($this->core->blueprints());
$this->extendFields($this->core->fields());
$this->extendFieldMethods($this->core->fieldMethods());
$this->extendFields($this->core->fields());
$this->extendSections($this->core->sections());
$this->extendSnippets($this->core->snippets());
$this->extendTags($this->core->kirbyTags());
@@ -708,16 +713,24 @@ trait AppPlugins
*/
public static function plugin(
string $name,
array $extends = null
): PLugin|null {
array $extends = null,
array $info = [],
string|null $root = null,
string|null $version = null
): Plugin|null {
if ($extends === null) {
return static::$plugins[$name] ?? null;
}
// get the correct root for the plugin
$extends['root'] = $extends['root'] ?? dirname(debug_backtrace()[0]['file']);
$plugin = new Plugin(
name: $name,
extends: $extends,
info: $info,
// TODO: Remove fallback to $extends in v7
root: $root ?? $extends['root'] ?? dirname(debug_backtrace()[0]['file']),
version: $version
);
$plugin = new Plugin($name, $extends);
$name = $plugin->name();
if (isset(static::$plugins[$name]) === true) {
@@ -787,7 +800,11 @@ trait AppPlugins
// register as anonymous plugin (without actual extensions)
// to be picked up by the Panel\Document class when
// rendering the Panel view
static::plugin('plugins/' . $dirname, ['root' => $dir]);
static::plugin(
name: 'plugins/' . $dirname,
extends: [],
root: $dir
);
} else {
continue;
}

View File

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

View File

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

View File

@@ -34,6 +34,8 @@ class Blueprint
protected $sections = [];
protected $tabs = [];
protected array|null $fileTemplates = null;
/**
* Magic getter/caller for any blueprint prop
*/
@@ -63,7 +65,7 @@ class Blueprint
unset($props['model']);
// extend the blueprint in general
$props = $this->extend($props);
$props = static::extend($props);
// apply any blueprint preset
$props = $this->preset($props);
@@ -96,6 +98,115 @@ class Blueprint
return $this->props ?? [];
}
/**
* Gathers what file templates are allowed in
* this model based on the blueprint
*/
public function acceptedFileTemplates(string $inSection = null): array
{
// get cached results for the current file model
// (except when collecting for a specific section)
if ($inSection === null && $this->fileTemplates !== null) {
return $this->fileTemplates; // @codeCoverageIgnore
}
$templates = [];
// collect all allowed file templates from blueprint…
foreach ($this->sections() as $section) {
// if collecting for a specific section, skip all others
if ($inSection !== null && $section->name() !== $inSection) {
continue;
}
$templates = match ($section->type()) {
'files' => [...$templates, $section->template() ?? 'default'],
'fields' => [
...$templates,
...$this->acceptedFileTemplatesFromFields($section->fields())
],
default => $templates
};
}
// no caching for when collecting for specific section
if ($inSection !== null) {
return $templates; // @codeCoverageIgnore
}
return $this->fileTemplates = $templates;
}
/**
* Gathers the allowed file templates from model's fields
*/
protected function acceptedFileTemplatesFromFields(array $fields): array
{
$templates = [];
foreach ($fields as $field) {
// fields with uploads settings
if (isset($field['uploads']) === true && is_array($field['uploads']) === true) {
$templates = [
...$templates,
...$this->acceptedFileTemplatesFromFieldUploads($field['uploads'])
];
continue;
}
// structure and object fields
if (isset($field['fields']) === true && is_array($field['fields']) === true) {
$templates = [
...$templates,
...$this->acceptedFileTemplatesFromFields($field['fields']),
];
continue;
}
// layout and blocks fields
if (isset($field['fieldsets']) === true && is_array($field['fieldsets']) === true) {
$templates = [
...$templates,
...$this->acceptedFileTemplatesFromFieldsets($field['fieldsets'])
];
continue;
}
}
return $templates;
}
/**
* Gathers the allowed file templates from fieldsets
*/
protected function acceptedFileTemplatesFromFieldsets(array $fieldsets): array
{
$templates = [];
foreach ($fieldsets as $fieldset) {
foreach (($fieldset['tabs'] ?? []) as $tab) {
$templates = array_merge($templates, $this->acceptedFileTemplatesFromFields($tab['fields'] ?? []));
}
}
return $templates;
}
/**
* Extracts templates from field uploads settings
*/
protected function acceptedFileTemplatesFromFieldUploads(array $uploads): array
{
// only if the `uploads` parent is this model
if ($target = $uploads['parent'] ?? null) {
if ($this->model->id() !== $target) {
return [];
}
}
return [($uploads['template'] ?? 'default')];
}
/**
* Converts all column definitions, that
* are not wrapped in a tab, into a generic tab
@@ -186,12 +297,7 @@ class Blueprint
];
}
$extends = $props['extends'] ?? null;
if ($extends === null) {
return $props;
}
if ($extends = $props['extends'] ?? null) {
foreach (A::wrap($extends) as $extend) {
try {
$mixin = static::find($extend);
@@ -204,6 +310,7 @@ class Blueprint
// remove the extends flag
unset($props['extends']);
}
return $props;
}
@@ -280,6 +387,7 @@ class Blueprint
if (is_string($file) === true && F::exists($file) === true) {
return static::$loaded[$name] = Data::read($file);
}
if (is_array($file) === true) {
return static::$loaded[$name] = $file;
}
@@ -354,7 +462,10 @@ class Blueprint
continue;
}
$columnProps = $this->convertFieldsToSections($tabName . '-col-' . $columnKey, $columnProps);
$columnProps = $this->convertFieldsToSections(
$tabName . '-col-' . $columnKey,
$columnProps
);
// inject getting started info, if the sections are empty
if (empty($columnProps['sections']) === true) {
@@ -367,10 +478,14 @@ class Blueprint
];
}
$columns[$columnKey] = array_merge($columnProps, [
$columns[$columnKey] = [
...$columnProps,
'width' => $columnProps['width'] ?? '1/1',
'sections' => $this->normalizeSections($tabName, $columnProps['sections'] ?? [])
]);
'sections' => $this->normalizeSections(
$tabName,
$columnProps['sections'] ?? []
)
];
}
return $columns;
@@ -390,10 +505,9 @@ class Blueprint
/**
* Normalize field props for a single field
*
* @param array|string $props
* @throws \Kirby\Exception\InvalidArgumentException If the filed name is missing or the field type is invalid
*/
public static function fieldProps($props): array
public static function fieldProps(array|string $props): array
{
$props = static::extend($props);
@@ -432,12 +546,13 @@ class Blueprint
}
// add some useful defaults
return array_merge($props, [
return [
...$props,
'label' => $props['label'] ?? ucfirst($name),
'name' => $name,
'type' => $type,
'width' => $props['width'] ?? '1/1',
]);
];
}
/**
@@ -496,11 +611,16 @@ class Blueprint
// resolve field groups
if ($fieldProps['type'] === 'group') {
if (empty($fieldProps['fields']) === false && is_array($fieldProps['fields']) === true) {
if (
empty($fieldProps['fields']) === false &&
is_array($fieldProps['fields']) === true
) {
$index = array_search($fieldName, array_keys($fields));
$before = array_slice($fields, 0, $index);
$after = array_slice($fields, $index + 1);
$fields = array_merge($before, $fieldProps['fields'] ?? [], $after);
$fields = [
...array_slice($fields, 0, $index),
...$fieldProps['fields'] ?? [],
...array_slice($fields, $index + 1)
];
} else {
unset($fields[$fieldName]);
}
@@ -515,11 +635,9 @@ class Blueprint
/**
* Normalizes blueprint options. This must be used in the
* constructor of an extended class, if you want to make use of it.
*
* @param array|true|false|null|string $options
*/
protected function normalizeOptions(
$options,
array|string|bool|null $options,
array $defaults,
array $aliases = []
): array {
@@ -534,7 +652,7 @@ class Blueprint
}
// extend options if possible
$options = $this->extend($options);
$options = static::extend($options);
foreach ($options as $key => $value) {
$alias = $aliases[$key] ?? null;
@@ -545,7 +663,7 @@ class Blueprint
}
}
return array_merge($defaults, $options);
return [...$defaults, ...$options];
}
/**
@@ -568,26 +686,27 @@ class Blueprint
}
// inject all section extensions
$sectionProps = $this->extend($sectionProps);
$sectionProps = static::extend($sectionProps);
$sections[$sectionName] = $sectionProps = array_merge($sectionProps, [
$sections[$sectionName] = $sectionProps = [
...$sectionProps,
'name' => $sectionName,
'type' => $type = $sectionProps['type'] ?? $sectionName
]);
];
if (empty($type) === true || is_string($type) === false) {
$sections[$sectionName] = [
'name' => $sectionName,
'label' => 'Invalid section type for section "' . $sectionName . '"',
'type' => 'info',
'text' => 'The following section types are available: ' . $this->helpList(array_keys(Section::$types))
'text' => 'The following section types are available: ' . static::helpList(array_keys(Section::$types))
];
} elseif (isset(Section::$types[$type]) === false) {
$sections[$sectionName] = [
'name' => $sectionName,
'label' => 'Invalid section type ("' . $type . '")',
'type' => 'info',
'text' => 'The following section types are available: ' . $this->helpList(array_keys(Section::$types))
'text' => 'The following section types are available: ' . static::helpList(array_keys(Section::$types))
];
}
@@ -623,7 +742,7 @@ class Blueprint
}
// store all normalized sections
$this->sections = array_merge($this->sections, $sections);
$this->sections = [...$this->sections, ...$sections];
return $sections;
}
@@ -645,7 +764,7 @@ class Blueprint
}
// inject all tab extensions
$tabProps = $this->extend($tabProps);
$tabProps = static::extend($tabProps);
// inject a preset if available
$tabProps = $this->preset($tabProps);
@@ -653,13 +772,14 @@ class Blueprint
$tabProps = $this->convertFieldsToSections($tabName, $tabProps);
$tabProps = $this->convertSectionsToColumns($tabName, $tabProps);
$tabs[$tabName] = array_merge($tabProps, [
$tabs[$tabName] = [
...$tabProps,
'columns' => $this->normalizeColumns($tabName, $tabProps['columns'] ?? []),
'icon' => $tabProps['icon'] ?? null,
'label' => $this->i18n($tabProps['label'] ?? ucfirst($tabName)),
'link' => $this->model->panel()->url(true) . '/?tab=' . $tabName,
'name' => $tabName,
]);
];
}
return $this->tabs = $tabs;

View File

@@ -157,72 +157,17 @@ class File extends ModelWithContent
*/
public function blueprints(string $inSection = null): array
{
// get cached results for the current file model
// (except when collecting for a specific section)
if ($inSection === null && $this->blueprints !== null) {
return $this->blueprints; // @codeCoverageIgnore
}
// always include the current template as option
$template = $this->template() ?? 'default';
$templates = [$template];
$parent = $this->parent();
// what file templates/blueprints should be considered is
// defined bythe parent's blueprint: which templates it allows
// in files sections as well as files fields
$blueprint = $parent->blueprint();
$fromFields = function ($fields) use (&$fromFields, $parent) {
$templates = [];
foreach ($fields as $field) {
// files or textare field
if (
$field['type'] === 'files' ||
$field['type'] === 'textarea'
) {
$uploads = $field['uploads'] ?? null;
// only if the `uploads` parent is the actual parent
if ($target = $uploads['parent'] ?? null) {
if ($parent->id() !== $target) {
continue;
}
}
$templates[] = $uploads['template'] ?? 'default';
continue;
}
// structure field
if ($field['type'] === 'structure') {
$fields = $fromFields($field['fields']);
$templates = array_merge($templates, $fields);
continue;
}
}
return $templates;
};
// collect all allowed templates…
foreach ($blueprint->sections() as $section) {
// if collecting for a specific section, skip all others
if ($inSection !== null && $section->name() !== $inSection) {
continue;
}
// …from files sections
if ($section->type() === 'files') {
$templates[] = $section->template() ?? 'default';
continue;
}
// …from fields
if ($section->type() === 'fields') {
$fields = $fromFields($section->fields());
$templates = array_merge($templates, $fields);
}
}
$templates = [
$this->template() ?? 'default',
...$this->parent()->blueprint()->acceptedFileTemplates($inSection)
];
// make sure every template is only included once
$templates = array_unique(array_filter($templates));
@@ -394,12 +339,11 @@ class File extends ModelWithContent
}
static $accessible = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->template() ?? '__none__';
$accessible[$role] ??= [];
if ($template = $this->template()) {
return $accessible[$template] ??= $this->permissions()->can('access');
}
return $accessible['__none__'] ??= $this->permissions()->can('access');
return $accessible[$role][$template] ??= $this->permissions()->can('access');
}
/**
@@ -419,12 +363,11 @@ class File extends ModelWithContent
}
static $listable = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->template() ?? '__none__';
$listable[$role] ??= [];
if ($template = $this->template()) {
return $listable[$template] ??= $this->permissions()->can('list');
}
return $listable['__none__'] ??= $this->permissions()->can('list');
return $listable[$role][$template] ??= $this->permissions()->can('list');
}
/**
@@ -435,12 +378,11 @@ class File extends ModelWithContent
public function isReadable(): bool
{
static $readable = [];
$role = $this->kirby()->user()?->role()->id() ?? '__none__';
$template = $this->template() ?? '__none__';
$readable[$role] ??= [];
if ($template = $this->template()) {
return $readable[$template] ??= $this->permissions()->can('read');
}
return $readable['__none__'] ??= $this->permissions()->can('read');
return $readable[$role][$template] ??= $this->permissions()->can('read');
}
/**
@@ -679,7 +621,7 @@ class File extends ModelWithContent
* Page URL and the filename as a more stable
* alternative for the media URLs.
*/
public function previewUrl(): string
public function previewUrl(): string|null
{
$parent = $this->parent();
$url = Url::to($this->id());

View File

@@ -47,7 +47,9 @@ trait FileActions
string|null $extension = null
): static {
if ($sanitize === true) {
$name = F::safeName($name);
// sanitize the basename part only
// as the extension isn't included in $name
$name = F::safeBasename($name, false);
}
// if no extension is passed, make sure to maintain current one
@@ -100,6 +102,11 @@ trait FileActions
*/
public function changeSort(int $sort): static
{
// skip if the sort number stays the same
if ($this->sort()->value() === $sort) {
return $this;
}
return $this->commit(
'changeSort',
['file' => $this, 'position' => $sort],
@@ -132,10 +139,9 @@ trait FileActions
$file = $file->update(['template' => $template]);
// rename and/or resize the file if configured by new blueprint
// resize the file if configured by new blueprint
$create = $file->blueprint()->create();
$file = $file->changeExtension($file, $create['format'] ?? null);
$file->manipulate($create);
$file = $file->manipulate($create);
return $file;
});
@@ -178,6 +184,7 @@ trait FileActions
/**
* Copy the file to the given page
* @internal
*/
public function copy(Page $page): static
{
@@ -261,7 +268,6 @@ trait FileActions
// we need to already rename it so that the correct file rules
// are applied
$create = $file->blueprint()->create();
$file = $file->changeExtension($file, $create['format'] ?? null);
// run the hook
$arguments = compact('file', 'upload');
@@ -331,7 +337,14 @@ trait FileActions
// generate image file and overwrite it in place
$this->kirby()->thumb($this->root(), $this->root(), $options);
return $this->clone([]);
$file = $this->clone();
// change the file extension if format option configured
if ($format = $options['format'] ?? null) {
$file = $file->changeExtension($file, $format);
}
return $file;
}
/**
@@ -379,7 +392,6 @@ trait FileActions
// apply the resizing/crop options from the blueprint
$create = $file->blueprint()->create();
$file = $file->changeExtension($file, $create['format'] ?? null);
$file = $file->manipulate($create);
// return a fresh clone

View File

@@ -57,6 +57,9 @@ class FileBlueprint extends Blueprint
/**
* Returns the list of all accepted MIME types for
* file upload or `*` if all MIME types are allowed
*
* @deprecated 4.2.0 Use `acceptAttribute` instead
* @todo 5.0.0 Remove method
*/
public function acceptMime(): string
{
@@ -116,6 +119,74 @@ class FileBlueprint extends Blueprint
return '*';
}
/**
* Returns the list of all accepted file extensions
* for file upload or `*` if all extensions are allowed
*
* If a MIME type is specified in the blueprint, the `extension` and `type` options are ignored for the browser.
* Extensions and types, however, are still used to validate an uploaded file on the server.
* This behavior might change in the future to better represent which file extensions are actually allowed.
*
* If no MIME type is specified, the intersection between manually defined extensions and the Kirby "file types" is returned.
* If the intersection is empty, an empty string is returned.
* This behavior might change in the future to instead return the union of `mime`, `extension` and `type`.
*
* @since 4.2.0
*/
public function acceptAttribute(): string
{
// don't disclose the specific default types
if ($this->defaultTypes === true) {
return '*';
}
$accept = $this->accept();
// get extensions from "mime" option
if (is_array($accept['mime']) === true) {
// determine the extensions for each MIME type
$extensions = array_map(
fn ($pattern) => Mime::toExtensions($pattern, true),
$accept['mime']
);
$fromMime = array_unique(array_merge(...array_values($extensions)));
// return early to ignore the other options
return implode(',', array_map(fn ($ext) => ".$ext", $fromMime));
}
$restrictions = [];
// get extensions from "type" option
if (is_array($accept['type']) === true) {
$extensions = array_map(
fn ($type) => F::typeToExtensions($type) ?? [],
$accept['type']
);
$fromType = array_merge(...array_values($extensions));
$restrictions[] = $fromType;
}
// get extensions from "extension" option
if (is_array($accept['extension']) === true) {
$restrictions[] = $accept['extension'];
}
// intersect all restrictions
$list = match (count($restrictions)) {
0 => [],
1 => $restrictions[0],
default => array_intersect(...$restrictions)
};
$list = array_unique($list);
// format the list to include a leading dot on each extension
return implode(',', array_map(fn ($ext) => ".$ext", $list));
}
protected function normalizeAccept(mixed $accept = null): array
{
$accept = match (true) {

View File

@@ -315,7 +315,7 @@ class FileRules
public static function validMime(File $file, string $mime = null): bool
{
// make it easier to compare the mime
$mime = strtolower($mime);
$mime = strtolower($mime ?? '');
if (empty($mime)) {
throw new InvalidArgumentException([

View File

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

View File

@@ -29,14 +29,20 @@ class Helpers
* ```
*/
public static $deprecations = [
// The internal `$model->contentFile*()` methods have been deprecated
'model-content-file' => true,
// Passing an `info` array inside the `extends` array
// has been deprecated. Pass the individual entries (e.g. root, version)
// directly as named arguments.
// TODO: switch to true in v6
'plugin-extends-root' => false,
// Passing a single space as value to `Xml::attr()` has been
// deprecated. In a future version, passing a single space won't
// render an empty value anymore but a single space.
// To render an empty value, please pass an empty string.
'xml-attr-single-space' => true,
// The internal `$model->contentFile*()` methods have been deprecated
'model-content-file' => true,
];
/**
@@ -110,6 +116,9 @@ class Helpers
) {
$override = null;
/**
* @psalm-suppress UndefinedVariable
*/
$handler = set_error_handler(function () use (&$override, &$handler, $condition, $fallback) {
// check if suppress condition is met
$suppress = $condition(...func_get_args());

View File

@@ -6,6 +6,7 @@ use Kirby\Data\Data;
use Kirby\Exception\Exception;
use Kirby\Exception\InvalidArgumentException;
use Kirby\Exception\LogicException;
use Kirby\Exception\PermissionException;
use Kirby\Filesystem\F;
use Kirby\Toolkit\Locale;
use Kirby\Toolkit\Str;
@@ -145,8 +146,17 @@ class Language
*/
public static function create(array $props): static
{
$props['code'] = Str::slug($props['code'] ?? null);
$kirby = App::instance();
$user = $kirby->user();
if (
$user === null ||
$user->role()->permissions()->for('languages', 'create') === false
) {
throw new PermissionException(['key' => 'language.create.permission']);
}
$props['code'] = Str::slug($props['code'] ?? null);
$languages = $kirby->languages();
// make the first language the default language
@@ -204,8 +214,16 @@ class Language
public function delete(): bool
{
$kirby = App::instance();
$user = $kirby->user();
$code = $this->code();
if (
$user === null ||
$user->role()->permissions()->for('languages', 'delete') === false
) {
throw new PermissionException(['key' => 'language.delete.permission']);
}
if ($this->isDeletable() === false) {
throw new Exception('The language cannot be deleted');
}
@@ -497,13 +515,22 @@ class Language
*/
public function update(array $props = null): static
{
$kirby = App::instance();
$user = $kirby->user();
if (
$user === null ||
$user->role()->permissions()->for('languages', 'update') === false
) {
throw new PermissionException(['key' => 'language.update.permission']);
}
// don't change the language code
unset($props['code']);
// make sure the slug is nice and clean
$props['slug'] = Str::slug($props['slug'] ?? null);
$kirby = App::instance();
$updated = $this->clone($props);
if (isset($props['translations']) === true) {

View File

@@ -7,6 +7,7 @@ use Kirby\Exception\NotFoundException;
use Kirby\Http\Router;
use Kirby\Toolkit\A;
use Kirby\Toolkit\Str;
use Kirby\Uuid\Uuid;
/**
* The language router is used internally
@@ -84,6 +85,27 @@ class LanguageRouter
}
}
// Language-specific UUID URLs
$routes[] = [
'pattern' => '@/(page|file)/(:all)',
'method' => 'ALL',
'env' => 'site',
'action' => function (string $languageCode, string $type, string $id) use ($kirby, $language) {
// try to resolve to model, but only from UUID cache;
// this ensures that only existing UUIDs can be queried
// and attackers can't force Kirby to go through the whole
// site index with a non-existing UUID
if ($model = Uuid::for($type . '://' . $id)?->model(true)) {
return $kirby
->response()
->redirect($model->url($language->code()));
}
// render the error page
return false;
}
];
return $routes;
}

View File

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

View File

@@ -56,7 +56,7 @@ class LanguageVariable
throw new DuplicateException('The variable is part of the core translation and cannot be overwritten');
}
$translations[$key] = trim($value ?? '');
$translations[$key] = $value ?? '';
$language->update(['translations' => $translations]);
@@ -102,10 +102,10 @@ class LanguageVariable
/**
* Sets a new value for the language variable
*/
public function update(string $value): static
public function update(string|null $value = null): static
{
$translations = $this->language->translations();
$translations[$this->key] = $value;
$translations[$this->key] = $value ?? '';
$language = $this->language->update(['translations' => $translations]);

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