Compare commits
10 Commits
2e8aa1ed80
...
a6550c95fb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6550c95fb | ||
|
|
fd06ae62d4 | ||
|
|
63ddf40692 | ||
|
|
49287c7a5e | ||
|
|
8bc7250b68 | ||
|
|
a955c7822e | ||
|
|
e50c0341fc | ||
|
|
4b55753c46 | ||
|
|
7f4eb7509d | ||
|
|
77d9337371 |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -1 +0,0 @@
|
||||
custom: ['https://getkirby.com/buy']
|
||||
48
deploy.php
Normal file
48
deploy.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?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
|
||||
$output = shell_exec('cd /var/www/html && git pull 2>&1');
|
||||
|
||||
http_response_code(200);
|
||||
header('Content-Type: text/plain');
|
||||
echo "Deploy triggered:\n" . $output;
|
||||
@@ -1,4 +1,4 @@
|
||||
[<img src="https://getkirby.com/assets/images/github/kirby.jpg" width="300">](https://getkirby.com)
|
||||
[<img src="https://getkirby.com/assets/images/github/kirby.jpg" width="300">](https://getkirby.com)
|
||||
|
||||
[](https://github.com/getkirby/kirby/releases/latest)
|
||||
[](https://github.com/getkirby/kirby/actions?query=workflow%3ACI+branch%3Amain)
|
||||
@@ -6,7 +6,7 @@
|
||||
[](https://github.com/getkirby/kirby/releases/latest)
|
||||
|
||||
**Kirby: the CMS that adapts to any project, loved by developers and editors alike.**
|
||||
With Kirby, you build your own ideal interface. Combine forms, galleries, articles, spreadsheets and more into an amazing editing experience. You can learn more about Kirby at [getkirby.com](https://getkirby.com).
|
||||
With Kirby, you build your own ideal interface. Combine forms, galleries, articles, spreadsheets and more into an amazing editing experience. You can learn more about Kirby at [getkirby.com](https://getkirby.com).
|
||||
|
||||
This is Kirby's core application folder. Get started with one of the following repositories instead:
|
||||
|
||||
@@ -15,7 +15,8 @@ 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
|
||||
### 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 you’re 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)
|
||||
|
||||
166
kirby/cacert.pem
166
kirby/cacert.pem
@@ -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-----
|
||||
|
||||
@@ -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
193
kirby/composer.lock
generated
@@ -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": [],
|
||||
|
||||
@@ -1,14 +1,22 @@
|
||||
<?php
|
||||
|
||||
// routing pattern to match all models with files
|
||||
$filePattern = '(account/|pages/[^/]+/|site/|users/[^/]+/|)files/(:any)';
|
||||
$filePattern = '(account/|pages/[^/]+/|site/|users/[^/]+/|)files/(:any)';
|
||||
$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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
@@ -26,13 +31,14 @@ return [
|
||||
'value' => $translations[$key] ?? null,
|
||||
'options' => [
|
||||
[
|
||||
'click' => 'update',
|
||||
'icon' => 'edit',
|
||||
'text' => I18n::translate('edit'),
|
||||
'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'),
|
||||
]
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
@@ -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()
|
||||
];
|
||||
|
||||
@@ -85,6 +85,7 @@ return [
|
||||
'props' => [
|
||||
'environment' => $environment,
|
||||
'exceptions' => $kirby->option('debug') === true ? $exceptions : [],
|
||||
'info' => $system->info(),
|
||||
'plugins' => $plugins,
|
||||
'security' => $security,
|
||||
'urls' => [
|
||||
|
||||
@@ -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([
|
||||
'label' => I18n::translate('user.changeRole.select'),
|
||||
'required' => true,
|
||||
])
|
||||
'role' => Field::role(
|
||||
roles: $user->roles(),
|
||||
props: [
|
||||
'label' => I18n::translate('user.changeRole.select'),
|
||||
'required' => true,
|
||||
]
|
||||
)
|
||||
],
|
||||
'submitButton' => I18n::translate('user.changeRole'),
|
||||
'value' => [
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 ?>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,7 +23,11 @@ return [
|
||||
$uploads = [];
|
||||
}
|
||||
|
||||
$uploads['accept'] = '*';
|
||||
$uploads['accept'] = '*';
|
||||
|
||||
if ($preview = $this->image) {
|
||||
$uploads['preview'] = $preview;
|
||||
}
|
||||
|
||||
if ($template = $uploads['template'] ?? null) {
|
||||
// get parent object for upload target
|
||||
@@ -39,7 +43,7 @@ return [
|
||||
'template' => $template
|
||||
]);
|
||||
|
||||
$uploads['accept'] = $file->blueprint()->acceptMime();
|
||||
$uploads['accept'] = $file->blueprint()->acceptAttribute();
|
||||
}
|
||||
|
||||
return $uploads;
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
]
|
||||
|
||||
@@ -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(' ', ' ', $value);
|
||||
|
||||
return $value;
|
||||
}
|
||||
],
|
||||
'validations' => [
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -44,7 +44,7 @@ return function ($props) {
|
||||
}
|
||||
|
||||
if (empty($sidebar) === true) {
|
||||
$props['fields'] = $props['fields'] ?? [];
|
||||
$props['fields'] ??= [];
|
||||
|
||||
unset(
|
||||
$props['files'],
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
$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()
|
||||
};
|
||||
}
|
||||
|
||||
return $item;
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
// Use form to get the proper values for the columns
|
||||
$form = Form::for($model)->values();
|
||||
|
||||
foreach ($this->columns as $columnName => $column) {
|
||||
// don't overwrite essential columns
|
||||
if (isset($item[$columnName]) === true) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (empty($column['value']) === false) {
|
||||
$value = $model->toString($column['value']);
|
||||
} else {
|
||||
$value = $model->content()->get($column['id'] ?? $columnName)->value();
|
||||
}
|
||||
|
||||
$item[$columnName] = $value;
|
||||
$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;
|
||||
|
||||
@@ -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 [
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -126,9 +126,12 @@
|
||||
"error.form.notSaved": "No s'ha pogut desar el formulari",
|
||||
|
||||
"error.language.code": "Introdueix un codi vàlid per a l’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": "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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -125,10 +125,13 @@
|
||||
"error.form.incomplete": "Veuillez corriger toutes les erreurs du formulaire…",
|
||||
"error.form.notSaved": "Le formulaire n’a 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 n’a 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 l’URL d’une 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": "L’extension <code>MB String</code> est requise",
|
||||
"installation.issues.media": "Le dossier <code>/media</code> n’existe pas ou n’est 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> n’existe pas ou n’est 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 n’avez 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é",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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}의 지원이 종료되었습니다. 더 이상 보안 업데이트를 받을 수 없습니다.",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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ń",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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ă accesați panoul",
|
||||
"error.access.view": "Nu vi se permite să accesați 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ă",
|
||||
|
||||
@@ -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 } истек, и он не будет получать дальнейших обновлений для системы безопасности",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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",
|
||||
|
||||
BIN
kirby/panel/dist/apple-touch-icon-dark.png
vendored
Normal file
BIN
kirby/panel/dist/apple-touch-icon-dark.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
2
kirby/panel/dist/css/style.min.css
vendored
2
kirby/panel/dist/css/style.min.css
vendored
File diff suppressed because one or more lines are too long
BIN
kirby/panel/dist/favicon-dark.png
vendored
Normal file
BIN
kirby/panel/dist/favicon-dark.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 416 B |
41
kirby/panel/dist/img/icons.svg
vendored
41
kirby/panel/dist/img/icons.svg
vendored
@@ -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 |
2
kirby/panel/dist/js/Docs.min.js
vendored
2
kirby/panel/dist/js/Docs.min.js
vendored
File diff suppressed because one or more lines are too long
2
kirby/panel/dist/js/DocsView.min.js
vendored
2
kirby/panel/dist/js/DocsView.min.js
vendored
@@ -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};
|
||||
|
||||
2
kirby/panel/dist/js/Highlight.min.js
vendored
2
kirby/panel/dist/js/Highlight.min.js
vendored
File diff suppressed because one or more lines are too long
2
kirby/panel/dist/js/IndexView.min.js
vendored
2
kirby/panel/dist/js/IndexView.min.js
vendored
@@ -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};
|
||||
|
||||
8
kirby/panel/dist/js/PlaygroundView.min.js
vendored
8
kirby/panel/dist/js/PlaygroundView.min.js
vendored
@@ -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
9
kirby/panel/dist/js/index.min.js
vendored
9
kirby/panel/dist/js/index.min.js
vendored
File diff suppressed because one or more lines are too long
6
kirby/panel/dist/js/vendor.min.js
vendored
6
kirby/panel/dist/js/vendor.min.js
vendored
File diff suppressed because one or more lines are too long
2
kirby/panel/dist/js/vuedraggable.min.js
vendored
2
kirby/panel/dist/js/vuedraggable.min.js
vendored
File diff suppressed because one or more lines are too long
28
kirby/panel/eslint.config.mjs
Normal file
28
kirby/panel/eslint.config.mjs
Normal 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
|
||||
}
|
||||
}
|
||||
];
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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']));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -190,8 +190,19 @@ trait AppErrors
|
||||
protected function getAdditionalWhoopsHandler(): CallbackHandler
|
||||
{
|
||||
return new CallbackHandler(function ($exception, $inspector, $run) {
|
||||
$this->trigger('system.exception', compact('exception'));
|
||||
error_log($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;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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,17 +713,25 @@ 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();
|
||||
$name = $plugin->name();
|
||||
|
||||
if (isset(static::$plugins[$name]) === true) {
|
||||
throw new DuplicateException('The plugin "' . $name . '" has already been registered');
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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']));
|
||||
|
||||
@@ -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,24 +297,20 @@ class Blueprint
|
||||
];
|
||||
}
|
||||
|
||||
$extends = $props['extends'] ?? null;
|
||||
|
||||
if ($extends === null) {
|
||||
return $props;
|
||||
}
|
||||
|
||||
foreach (A::wrap($extends) as $extend) {
|
||||
try {
|
||||
$mixin = static::find($extend);
|
||||
$mixin = static::extend($mixin);
|
||||
$props = A::merge($mixin, $props, A::MERGE_REPLACE);
|
||||
} catch (Exception) {
|
||||
// keep the props unextended if the snippet wasn't found
|
||||
if ($extends = $props['extends'] ?? null) {
|
||||
foreach (A::wrap($extends) as $extend) {
|
||||
try {
|
||||
$mixin = static::find($extend);
|
||||
$mixin = static::extend($mixin);
|
||||
$props = A::merge($mixin, $props, A::MERGE_REPLACE);
|
||||
} catch (Exception) {
|
||||
// keep the props unextended if the snippet wasn't found
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// remove the extends flag
|
||||
unset($props['extends']);
|
||||
// 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;
|
||||
|
||||
@@ -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));
|
||||
@@ -393,13 +338,12 @@ class File extends ModelWithContent
|
||||
return false;
|
||||
}
|
||||
|
||||
static $accessible = [];
|
||||
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');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -418,13 +362,12 @@ class File extends ModelWithContent
|
||||
return false;
|
||||
}
|
||||
|
||||
static $listable = [];
|
||||
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');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -434,13 +377,12 @@ class File extends ModelWithContent
|
||||
*/
|
||||
public function isReadable(): bool
|
||||
{
|
||||
static $readable = [];
|
||||
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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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([
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
{
|
||||
$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);
|
||||
$kirby = App::instance();
|
||||
$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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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->language->translations();
|
||||
$translations[$this->key] = $value ?? '';
|
||||
|
||||
$language = $this->language->update(['translations' => $translations]);
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ use Throwable;
|
||||
*/
|
||||
class License
|
||||
{
|
||||
protected const HISTORY = [
|
||||
public const HISTORY = [
|
||||
'3' => '2019-02-05',
|
||||
'4' => '2023-11-28'
|
||||
];
|
||||
@@ -42,8 +42,9 @@ class License
|
||||
protected string|null $date = null,
|
||||
protected string|null $signature = null,
|
||||
) {
|
||||
// normalize the email address
|
||||
$this->email = $this->email === null ? null : $this->normalizeEmail($this->email);
|
||||
// normalize arguments
|
||||
$this->code = $this->code !== null ? trim($this->code) : null;
|
||||
$this->email = $this->email !== null ? $this->normalizeEmail($this->email) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -57,7 +57,12 @@ class Media
|
||||
}
|
||||
|
||||
// try to generate a thumb for the file
|
||||
return static::thumb($model, $hash, $filename);
|
||||
try {
|
||||
return static::thumb($model, $hash, $filename);
|
||||
} catch (NotFoundException) {
|
||||
// render the error page if there is no job for this filename
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -43,8 +43,16 @@ abstract class ModelPermissions
|
||||
return $this->toArray();
|
||||
}
|
||||
|
||||
public function can(string $action): bool
|
||||
{
|
||||
/**
|
||||
* Returns whether the current user is allowed to do
|
||||
* a certain action on the model
|
||||
*
|
||||
* @param bool $default Will be returned if $action does not exist
|
||||
*/
|
||||
public function can(
|
||||
string $action,
|
||||
bool $default = false
|
||||
): bool {
|
||||
$user = $this->user->id();
|
||||
$role = $this->user->role()->id();
|
||||
|
||||
@@ -95,12 +103,20 @@ abstract class ModelPermissions
|
||||
}
|
||||
}
|
||||
|
||||
return $this->permissions->for($this->category, $action);
|
||||
return $this->permissions->for($this->category, $action, $default);
|
||||
}
|
||||
|
||||
public function cannot(string $action): bool
|
||||
{
|
||||
return $this->can($action) === false;
|
||||
/**
|
||||
* Returns whether the current user is not allowed to do
|
||||
* a certain action on the model
|
||||
*
|
||||
* @param bool $default Will be returned if $action does not exist
|
||||
*/
|
||||
public function cannot(
|
||||
string $action,
|
||||
bool $default = true
|
||||
): bool {
|
||||
return $this->can($action, !$default) === false;
|
||||
}
|
||||
|
||||
public function toArray(): array
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user