Upgrade to 3.3.0

This commit is contained in:
Bastian Allgeier
2019-11-05 09:35:58 +01:00
parent 447a9dd266
commit a431716732
186 changed files with 3068 additions and 1458 deletions

View File

@@ -44,9 +44,9 @@ return PhpCsFixer\Config::create()
'no_useless_return' => true,
'ordered_imports' => ['sort_algorithm' => 'alpha'],
// 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], // adds params in the wrong order
// 'phpdoc_align' => ['align' => 'vertical'], // added in a second step
'phpdoc_align' => ['align' => 'left'],
'phpdoc_indent' => true,
// 'phpdoc_scalar' => true, // added in a second step
'phpdoc_scalar' => true,
'phpdoc_trim' => true,
'short_scalar_cast' => true,
'single_line_comment_style' => true,

View File

@@ -1,7 +1,7 @@
{
"name": "getkirby/cms",
"description": "The Kirby 3 core",
"version": "3.2.5",
"version": "3.3.0",
"license": "proprietary",
"keywords": ["kirby", "cms", "core"],
"homepage": "https://getkirby.com",
@@ -40,7 +40,7 @@
}
},
"scripts": {
"analyze": "phpstan analyse src",
"analyze": "phpstan analyse",
"test": "phpunit --stderr --coverage-html=tests/coverage",
"zip": "composer archive --format=zip --file=dist",
"build": "./scripts/build",

26
kirby/composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "ed043f76d01c39662efae54a2c917b0a",
"content-hash": "b6f220540a714bd27218b0fea5f2aad6",
"packages": [
{
"name": "claviska/simpleimage",
@@ -366,16 +366,16 @@
},
{
"name": "psr/log",
"version": "1.1.0",
"version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
"reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
"url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
"shasum": ""
},
"require": {
@@ -384,7 +384,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -409,20 +409,20 @@
"psr",
"psr-3"
],
"time": "2018-11-20T15:27:04+00:00"
"time": "2019-11-01T11:05:21+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.11.0",
"version": "v1.12.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
"reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609",
"reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17",
"reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17",
"shasum": ""
},
"require": {
@@ -434,7 +434,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.11-dev"
"dev-master": "1.12-dev"
}
},
"autoload": {
@@ -468,7 +468,7 @@
"portable",
"shim"
],
"time": "2019-02-06T07:57:58+00:00"
"time": "2019-08-06T08:03:45+00:00"
},
{
"name": "true/punycode",

View File

@@ -32,6 +32,9 @@ return [
'database' => 'Kirby\Database\Database',
'db' => 'Kirby\Database\Db',
// exceptions
'errorpageexception' => 'Kirby\Exception\ErrorPageException',
// http classes
'cookie' => 'Kirby\Http\Cookie',
'header' => 'Kirby\Http\Header',

View File

@@ -7,7 +7,7 @@ return function () {
// csrf token check
if ($auth->type() === 'session' && $auth->csrf() === false) {
throw new PermissionException('Unauthenticated', 403);
throw new PermissionException('Unauthenticated');
}
// get user from session or basic auth
@@ -19,5 +19,5 @@ return function () {
return $user;
}
throw new PermissionException('Unauthenticated', 403);
throw new PermissionException('Unauthenticated');
};

View File

@@ -27,8 +27,7 @@ return [
*/
'languages' => [
'model' => 'language',
'type' => 'Kirby\Cms\Languages',
'view' => 'compact'
'type' => 'Kirby\Cms\Languages'
],
/**

View File

@@ -48,13 +48,16 @@ return [
return $file->next();
},
'nextWithTemplate' => function (File $file) {
$files = $file->templateSiblings()->sortBy('sort', 'asc');
$files = $file->templateSiblings()->sortBy('sort', 'asc', 'filename', 'asc');
$index = $files->indexOf($file);
return $files->nth($index + 1);
},
'niceSize' => function (File $file) {
return $file->niceSize();
},
'options' => function (File $file) {
return $file->permissions()->toArray();
return $file->panelOptions();
},
'panelIcon' => function (File $file) {
return $file->panelIcon();
@@ -69,32 +72,23 @@ return [
return $file->prev();
},
'prevWithTemplate' => function (File $file) {
$files = $file->templateSiblings()->sortBy('sort', 'asc');
$files = $file->templateSiblings()->sortBy('sort', 'asc', 'filename', 'asc');
$index = $files->indexOf($file);
return $files->nth($index - 1);
},
'niceSize' => function (File $file) {
return $file->niceSize();
},
'panelIcon' => function (File $file) {
return $file->panelIcon();
},
'panelImage' => function (File $file) {
return $file->panelImage();
},
'parent' => function (File $file) {
return $file->parent();
},
'parents' => function (File $file) {
return $file->parents()->flip();
},
'template' => function (File $file) {
return $file->template();
},
'size' => function (File $file) {
return $file->size();
},
'template' => function (File $file) {
return $file->template();
},
'thumbs' => function ($file) {
if ($file->isResizable() === false) {
return null;

View File

@@ -31,12 +31,14 @@ return [
],
'type' => 'Kirby\Cms\Language',
'views' => [
'compact' => [
'default' => [
'code',
'default',
'direction',
'locale',
'name',
'rules',
'direction'
'url'
]
]
];

View File

@@ -27,7 +27,7 @@ return [
return $page->errors();
},
'files' => function (Page $page) {
return $page->files()->sortBy('sort', 'asc');
return $page->files()->sortBy('sort', 'asc', 'filename', 'asc');
},
'hasChildren' => function (Page $page) {
return $page->hasChildren();
@@ -56,7 +56,7 @@ return [
return $page->num();
},
'options' => function (Page $page) {
return $page->permissions()->toArray();
return $page->panelOptions(['preview']);
},
'panelIcon' => function (Page $page) {
return $page->panelIcon();

View File

@@ -24,7 +24,7 @@ return [
return $site->drafts();
},
'files' => function (Site $site) {
return $site->files()->sortBy('sort', 'asc');
return $site->files()->sortBy('sort', 'asc', 'filename', 'asc');
},
'options' => function (Site $site) {
return $site->permissions()->toArray();

View File

@@ -98,7 +98,7 @@ return [
'isInstalled',
'isLocal',
'kirbytext',
'languages' => 'compact',
'languages',
'license',
'multilang',
'requirements',

View File

@@ -24,7 +24,7 @@ return [
return $user->email();
},
'files' => function (User $user) {
return $user->files()->sortBy('sort', 'asc');
return $user->files()->sortBy('sort', 'asc', 'filename', 'asc');
},
'id' => function (User $user) {
return $user->id();
@@ -39,7 +39,7 @@ return [
return $user->next();
},
'options' => function (User $user) {
return $user->permissions()->toArray();
return $user->panelOptions();
},
'permissions' => function (User $user) {
return $user->role()->permissions()->toArray();

View File

@@ -27,7 +27,7 @@ return [
'pattern' => '(:all)/files',
'method' => 'GET',
'action' => function (string $path) {
return $this->parent($path)->files()->sortBy('sort', 'asc');
return $this->parent($path)->files()->sortBy('sort', 'asc', 'filename', 'asc');
}
],
[

View File

@@ -6,6 +6,7 @@ use Kirby\Cms\Filename;
use Kirby\Cms\FileVersion;
use Kirby\Cms\Template;
use Kirby\Data\Data;
use Kirby\Http\Server;
use Kirby\Image\Darkroom;
use Kirby\Text\Markdown;
use Kirby\Text\SmartyPants;
@@ -26,6 +27,30 @@ return [
return $url;
},
/**
* Object and variable dumper
* to help with debugging.
*
* @param \Kirby\Cms\App $kirby Kirby instance
* @param mixed $variable
* @param bool $echo
* @return string
*/
'dump' => function (App $kirby, $variable, bool $echo = true) {
if (Server::cli() === true) {
$output = print_r($variable, true) . PHP_EOL;
} else {
$output = '<pre>' . print_r($variable, true) . '</pre>';
}
if ($echo === true) {
echo $output;
}
return $output;
},
/**
* Modify URLs for file objects
*

View File

@@ -99,9 +99,12 @@ return [
$field = $this->field();
return $field->filepicker([
'query' => $field->query(),
'image' => $field->image(),
'info' => $field->info(),
'limit' => $field->limit(),
'page' => $this->requestQuery('page'),
'query' => $field->query(),
'search' => $this->requestQuery('search'),
'text' => $field->text()
]);
}

View File

@@ -15,7 +15,8 @@ return [
'text' => function () {
if ($text = $this->text) {
$text = $this->model()->toString($text);
return kirbytext($text);
$text = $this->kirby()->kirbytext($text);
return $text;
}
}
],

View File

@@ -1,40 +1,14 @@
<?php
use Kirby\Cms\FilePicker;
return [
'methods' => [
'filepicker' => function (array $params = []) {
// fetch the parent model
$model = $this->model();
$params['model'] = $this->model();
// find the right default query
if (empty($params['query']) === false) {
$query = $params['query'];
} elseif (is_a($model, 'Kirby\Cms\File') === true) {
$query = 'file.siblings';
} else {
$query = $model::CLASS_ALIAS . '.files';
}
// fetch all files for the picker
$files = $model->query($query, 'Kirby\Cms\Files');
$data = [];
// prepare the response for each file
foreach ($files as $index => $file) {
if (empty($params['map']) === false) {
$data[] = $params['map']($file);
} else {
$data[] = $file->panelPickerData([
'image' => $params['image'] ?? [],
'info' => $params['info'] ?? false,
'model' => $model,
'text' => $params['text'] ?? '{{ file.filename }}',
]);
}
}
return $data;
return (new FilePicker($params))->toArray();
}
]
];

View File

@@ -1,49 +1,14 @@
<?php
use Kirby\Cms\PagePicker;
return [
'methods' => [
'pagepicker' => function (array $params = []) {
$query = $params['query'] ?? null;
$model = $this->model();
$site = $this->kirby()->site();
// inject the current model
$params['model'] = $this->model();
if ($query) {
$pages = $model->query($query, 'Kirby\Cms\Pages');
$self = null;
} else {
if (!$parent = $site->find($params['parent'] ?? null)) {
$parent = $site;
}
$pages = $parent->children();
$self = [
'id' => $parent->id() == '' ? null : $parent->id(),
'title' => $parent->title()->value(),
'parent' => is_a($parent->parent(), 'Kirby\Cms\Page') === true ? $parent->parent()->id() : null,
];
}
$children = [];
foreach ($pages as $index => $page) {
if ($page->isReadable() === true) {
if (empty($params['map']) === false) {
$children[] = $params['map']($page);
} else {
$children[] = $page->panelPickerData([
'image' => $params['image'] ?? [],
'info' => $params['info'] ?? false,
'model' => $model,
'text' => $params['text'] ?? null,
]);
}
}
}
return [
'model' => $self,
'pages' => $children
];
return (new PagePicker($params))->toArray();
}
]
];

View File

@@ -53,6 +53,13 @@ return [
return $query;
},
/**
* Enable/disable the search field in the picker
*/
'search' => function (bool $search = true) {
return $search;
},
/**
* Main text for each item
*/

View File

@@ -1,44 +1,13 @@
<?php
use Kirby\Cms\UserPicker;
return [
'methods' => [
'userpicker' => function (array $params = []) {
$params['model'] = $this->model();
// fetch the parent model
$model = $this->model();
// find the right default query
if (empty($params['query']) === false) {
$query = $params['query'];
} elseif (is_a($model, 'Kirby\Cms\User') === true) {
$query = 'user.siblings';
} else {
$query = 'kirby.users';
}
// fetch all users for the picker
$users = $model->query($query, 'Kirby\Cms\Users');
$data = [];
if (!$users) {
return [];
}
// prepare the response for each user
foreach ($users->sortBy('username', 'asc') as $index => $user) {
if (empty($params['map']) === false) {
$data[] = $params['map']($user);
} else {
$data[] = $user->panelPickerData([
'image' => $params['image'] ?? [],
'info' => $params['info'] ?? false,
'model' => $model,
'text' => $params['text'] ?? '{{ user.username }}',
]);
}
}
return $data;
return (new UserPicker($params))->toArray();
}
]
];

View File

@@ -43,6 +43,13 @@ return [
return $size;
},
/**
* Optionally include subpages of pages
*/
'subpages' => function (bool $subpages = true) {
return $subpages;
},
'value' => function ($value = null) {
return $this->toPages($value);
},
@@ -88,8 +95,12 @@ return [
return $field->pagepicker([
'image' => $field->image(),
'info' => $field->info(),
'limit' => $field->limit(),
'page' => $this->requestQuery('page'),
'parent' => $this->requestQuery('parent'),
'query' => $field->query(),
'search' => $this->requestQuery('search'),
'subpages' => $field->subpages(),
'text' => $field->text()
]);
}

View File

@@ -84,6 +84,10 @@ return [
return $this->rows($this->value);
},
'fields' => function () {
if (empty($this->fields) === true) {
throw new Exception('Please provide some fields for the structure');
}
return $this->form()->fields()->toArray();
},
'columns' => function () {

View File

@@ -75,9 +75,12 @@ return [
$field = $this->field();
return $field->userpicker([
'query' => $field->query(),
'image' => $field->image(),
'info' => $field->info(),
'limit' => $field->limit(),
'page' => $this->requestQuery('page'),
'query' => $field->query(),
'search' => $this->requestQuery('search'),
'text' => $field->text()
]);
}
@@ -85,7 +88,7 @@ return [
];
},
'save' => function ($value = null) {
return A::pluck($value, 'email');
return A::pluck($value, 'id');
},
'validations' => [
'max',

View File

@@ -5,7 +5,6 @@ use Kirby\Cms\Asset;
use Kirby\Cms\Html;
use Kirby\Cms\Response;
use Kirby\Cms\Url;
use Kirby\Http\Server;
use Kirby\Toolkit\Escape;
use Kirby\Toolkit\F;
use Kirby\Toolkit\I18n;
@@ -55,7 +54,7 @@ function collection(string $name)
* Checks / returns a CSRF token
*
* @param string $check Pass a token here to compare it to the one in the session
* @return string|boolean Either the token or a boolean check result
* @return string|bool Either the token or a boolean check result
*/
function csrf(string $check = null)
{
@@ -89,7 +88,7 @@ function csrf(string $check = null)
* @param string|array $options Pass an array of attributes for the link tag or a media attribute string
* @return string|null
*/
function css($url, $options = null)
function css($url, $options = null): ?string
{
if (is_array($url) === true) {
$links = array_map(function ($url) use ($options) {
@@ -121,27 +120,33 @@ function css($url, $options = null)
return '<link ' . attr($attr) . '>';
}
/**
* Triggers a deprecation warning if debug mode is active
*
* @param string $message
* @return bool Whether the warning was triggered
*/
function deprecated(string $message): bool
{
if (App::instance()->option('debug') === true) {
return trigger_error($message, E_USER_DEPRECATED) === true;
}
return false;
}
/**
* Simple object and variable dumper
* to help with debugging.
*
* @param mixed $variable
* @param boolean $echo
* @param bool $echo
* @return string
*/
function dump($variable, bool $echo = true): string
{
if (Server::cli() === true) {
$output = print_r($variable, true) . PHP_EOL;
} else {
$output = '<pre>' . print_r($variable, true) . '</pre>';
}
if ($echo === true) {
echo $output;
}
return $output;
$kirby = App::instance();
return $kirby->component('dump')($kirby, $variable, $echo);
}
/**
@@ -161,7 +166,7 @@ function e($condition, $value, $alternative = null)
*
* @param string $string Untrusted data
* @param string $context Location of output
* @param boolean $strict Whether to escape an extended set of characters (HTML attributes only)
* @param bool $strict Whether to escape an extended set of characters (HTML attributes only)
* @return string Escaped data
*/
function esc($string, $context = 'html', $strict = false)
@@ -206,7 +211,7 @@ function gist(string $url, string $file = null): string
* Urls can be relative or absolute.
*
* @param string $url
* @param integer $code
* @param int $code
* @return void
*/
function go(string $url = null, int $code = 302)
@@ -348,9 +353,9 @@ function invalid(array $data = [], array $rules = [], array $messages = [])
*
* @param string|array $url
* @param string|array $options
* @return void
* @return string|null
*/
function js($url, $options = null)
function js($url, $options = null): ?string
{
if (is_array($url) === true) {
$scripts = array_map(function ($url) use ($options) {
@@ -589,7 +594,7 @@ function r($condition, $value, $alternative = null)
* by the defined step
*
* @param string $date
* @param integer $step
* @param int $step
* @return string|null
*/
function timestamp(string $date = null, int $step = null): ?string
@@ -671,7 +676,7 @@ function smartypants(string $text = null): string
*
* @param string|array $name
* @param array|object $data
* @param boolean $return
* @param bool $return
* @return string
*/
function snippet($name, $data = [], bool $return = false)
@@ -693,11 +698,20 @@ function snippet($name, $data = [], bool $return = false)
* Includes an SVG file by absolute or
* relative file path.
*
* @param string $file
* @return string
* @param string|\Kirby\Cms\File $file
* @return string|false
*/
function svg(string $file)
function svg($file)
{
// support for Kirby's file objects
if (is_a($file, 'Kirby\Cms\File') === true && $file->extension() === 'svg') {
return $file->read();
}
if (is_string($file) === false) {
return false;
}
$extension = F::extension($file);
// check for valid svg files
@@ -825,7 +839,7 @@ function video(string $url, array $options = [], array $attr = []): string
*/
function vimeo(string $url, array $options = [], array $attr = []): string
{
return Html::video($url, $options, $attr);
return Html::vimeo($url, $options, $attr);
}
/**
@@ -851,5 +865,5 @@ function widont(string $string = null): string
*/
function youtube(string $url, array $options = [], array $attr = []): string
{
return Html::video($url, $options, $attr);
return Html::youtube($url, $options, $attr);
}

View File

@@ -28,7 +28,7 @@ return function (App $app) {
* Converts the field value into a proper boolean and inverts it
*
* @param \Kirby\Cms\Field $field
* @return boolean
* @return bool
*/
'isFalse' => function (Field $field): bool {
return $field->toBool() === false;
@@ -38,7 +38,7 @@ return function (App $app) {
* Converts the field value into a proper boolean
*
* @param \Kirby\Cms\Field $field
* @return boolean
* @return bool
*/
'isTrue' => function (Field $field): bool {
return $field->toBool() === true;
@@ -49,7 +49,7 @@ return function (App $app) {
*
* @param string $validator
* @param mixed ...$arguments A list of optional validator arguments
* @return boolean
* @return bool
*/
'isValid' => function (Field $field, string $validator, ...$arguments): bool {
return V::$validator($field->value, ...$arguments);
@@ -193,7 +193,7 @@ return function (App $app) {
* @param \Kirby\Cms\Field $field
* @return \Kirby\Cms\Page|null
*/
'toPage' => function (Field $field) use ($app) {
'toPage' => function (Field $field) {
return $field->toPages()->first();
},
@@ -254,7 +254,7 @@ return function (App $app) {
* @param \Kirby\Cms\Field $field
* @return \Kirby\Cms\User|null
*/
'toUser' => function (Field $field) use ($app) {
'toUser' => function (Field $field) {
return $field->toUsers()->first();
},
@@ -305,7 +305,7 @@ return function (App $app) {
*
* @param \Kirby\Cms\Field $field
* @param int $cahrs
* @param boolean $strip
* @param bool $strip
* @param string $rep
* @return \Kirby\Cms\Field
*/
@@ -325,6 +325,17 @@ return function (App $app) {
return $field;
},
/**
* Converts all line breaks in the field content to `<br>` tags.
*
* @param \Kirby\Cms\Field $field
* @return \Kirby\Cms\Field
*/
'nl2br' => function (Field $field) {
$field->value = nl2br($field->value, false);
return $field;
},
/**
* Converts the field content from Markdown/Kirbytext to valid HTML
*
@@ -372,6 +383,23 @@ return function (App $app) {
return $field;
},
/**
* Strips all block-level HTML elements from the field value,
* it can be safely placed inside of other inline elements
* without the risk of breaking the HTML structure.
*
* @param \Kirby\Cms\Field $field
* @return \Kirby\Cms\Field
*/
'inline' => function (Field $field) {
// List of valid inline elements taken from: https://developer.mozilla.org/de/docs/Web/HTML/Inline_elemente
// Obsolete elements, script tags, image maps and form elements have
// been excluded for safety reasons and as they are most likely not
// needed in most cases.
$field->value = strip_tags($field->value, '<b><i><small><abbr><cite><code><dfn><em><kbd><strong><samp><var><a><bdo><br><img><q><span><sub><sup>');
return $field;
},
/**
* Converts the field content to lowercase
*

View File

@@ -11,18 +11,11 @@ return [
return $roots['kirby'] . '/i18n';
},
'i18n:translations' => function (array $roots) {
return $roots['translations'];
return $roots['i18n'] . '/translations';
},
'i18n:rules' => function (array $roots) {
return $roots['i18n'] . '/rules';
},
/**
* @deprecated 3.2.0 Use `i18n:translations` instead
* @TODO move logic over to i18n:translations before removing
*/
'translations' => function (array $roots) {
return $roots['i18n'] . '/translations';
},
// index
'index' => function (array $roots) {

View File

@@ -1,12 +1,12 @@
<?php
use Kirby\Cms\LanguageRoutes;
use Kirby\Cms\Media;
use Kirby\Cms\Panel;
use Kirby\Cms\PanelPlugins;
use Kirby\Cms\PluginAssets;
use Kirby\Http\Response\Redirect;
use Kirby\Http\Router\Route;
use Kirby\Toolkit\F;
use Kirby\Toolkit\Str;
return function ($kirby) {
@@ -63,7 +63,7 @@ return function ($kirby) {
[
'pattern' => $media . '/plugins/(:any)/(:any)/(:all).(css|gif|js|jpg|png|svg|webp|woff2|woff)',
'env' => 'media',
'action' => function (string $provider, string $pluginName, string $filename, string $extension) use ($kirby) {
'action' => function (string $provider, string $pluginName, string $filename, string $extension) {
return PluginAssets::resolve($provider . '/' . $pluginName, $filename . '.' . $extension);
}
],
@@ -102,7 +102,7 @@ return function ($kirby) {
[
'pattern' => $media . '/assets/(:all)/(:any)/(:any)',
'env' => 'media',
'action' => function ($path, $hash, $filename) use ($kirby) {
'action' => function ($path, $hash, $filename) {
return Media::thumb($path, $hash, $filename);
}
]
@@ -110,73 +110,7 @@ return function ($kirby) {
// Multi-language setup
if ($kirby->multilang() === true) {
// Multi-language home
$after[] = [
'pattern' => '',
'method' => 'ALL',
'env' => 'site',
'action' => function () use ($kirby) {
$home = $kirby->site()->homePage();
// language detection on the home page with / as URL
if ($home && $kirby->url() !== $home->url()) {
if ($kirby->option('languages.detect') === true) {
return $kirby
->response()
->redirect($kirby->detectedLanguage()->url());
} else {
return $kirby
->response()
->redirect($kirby->site()->url());
}
// default home page
} else {
return $kirby->defaultLanguage()->router()->call();
}
}
];
foreach ($kirby->languages() as $language) {
$after[] = [
'pattern' => trim($language->pattern() . '/(:all?)', '/'),
'method' => 'ALL',
'env' => 'site',
'action' => function ($path = null) use ($kirby, $language) {
return $language->router()->call($path);
}
];
}
// fallback route for unprefixed default language URLs.
$after[] = [
'pattern' => '(:all)',
'method' => 'ALL',
'env' => 'site',
'action' => function (string $path) use ($kirby) {
// check for content representations or files
$extension = F::extension($path);
// try to redirect prefixed pages
if (empty($extension) === true && $page = $kirby->page($path)) {
$url = $kirby->request()->url([
'query' => null,
'params' => null,
'fragment' => null
]);
if ($url->toString() !== $page->url()) {
return $kirby
->response()
->redirect($page->url());
}
}
return $kirby->defaultLanguage()->router()->call($path);
}
];
$after = LanguageRoutes::create($kirby);
} else {
// Single-language home

View File

@@ -15,6 +15,12 @@ return [
'parent',
],
'props' => [
/**
* Enables/disables reverse sorting
*/
'flip' => function (bool $flip = false) {
return $flip;
},
/**
* Image options to control the source and look of file previews
*/
@@ -83,6 +89,11 @@ return [
$files = $files->sortBy('sort', 'asc', 'filename', 'asc');
}
// flip
if ($this->flip === true) {
$files = $files->flip();
}
// apply the default pagination
$files = $files->paginate([
'page' => $this->page,
@@ -168,6 +179,10 @@ return [
return false;
}
if ($this->flip === true) {
return false;
}
return true;
},
'upload' => function () {

View File

@@ -19,7 +19,6 @@ return [
if ($this->text) {
$text = $this->model()->toString($this->text);
$text = $this->kirby()->kirbytext($text);
return $text;
}
},

View File

@@ -14,7 +14,9 @@ return [
'computed' => [
'help' => function () {
if ($this->help) {
return $this->model()->toString($this->help);
$help = $this->model()->toString($this->help);
$help = $this->kirby()->kirbytext($help);
return $help;
}
}
]

View File

@@ -14,7 +14,7 @@ return [
* Sets the default page for the pagination. This will overwrite default pagination.
*/
'page' => function (int $page = null) {
return get('page', $page ?? 1);
return get('page', $page);
},
],
'methods' => [

View File

@@ -20,7 +20,13 @@ return [
* Optional array of templates that should only be allowed to add.
*/
'create' => function ($add = null) {
return A::wrap($add);
return $add;
},
/**
* Enables/disables reverse sorting
*/
'flip' => function (bool $flip = false) {
return $flip;
},
/**
* Image options to control the source and look of page previews
@@ -122,6 +128,11 @@ return [
$pages = $pages->sortBy(...$pages::sortArgs($this->sortBy));
}
// flip
if ($this->flip === true) {
$pages = $pages->flip();
}
// pagination
$pages = $pages->paginate([
'page' => $this->page,
@@ -188,6 +199,10 @@ return [
];
},
'add' => function () {
if ($this->create === false) {
return false;
}
if (in_array($this->status, ['draft', 'all']) === false) {
return false;
}
@@ -222,13 +237,17 @@ return [
return false;
}
if ($this->flip === true) {
return false;
}
return true;
}
],
'methods' => [
'blueprints' => function () {
$blueprints = [];
$templates = empty($this->create) === false ? $this->create : $this->templates;
$templates = empty($this->create) === false ? A::wrap($this->create) : $this->templates;
if (empty($templates) === true) {
$templates = $this->kirby()->blueprints();

View File

@@ -98,7 +98,6 @@ return [
'linkclass',
'rel',
'target',
'text',
'title',
'width'
],

View File

@@ -23,6 +23,7 @@
"delete": "\u0418\u0437\u0442\u0440\u0438\u0439",
"dimensions": "Размери",
"disabled": "Disabled",
"discard": "\u041e\u0442\u043c\u0435\u043d\u0438",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Секция \"{name}\" не може да бъде заредена",
"error.section.type.invalid": "Типът \"{type}\" на секция не е валиден",
"error.site.changeTitle.empty": "Заглавието е задължително",
"error.site.changeTitle.permission":
"Не може да променяте заглавието на сайта",
"error.site.update.permission": "Нямате права за да обновите сайта",
@@ -155,6 +157,8 @@
"Ролята на последния администратор не може да бъде променена",
"error.user.changeRole.permission":
"Нямате права да промените ролята на този потребител \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Нямате права да създадете този потребител",
"error.user.delete": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u0438\u0437\u0442\u0440\u0438\u0442",
"error.user.delete.lastAdmin": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440",
@@ -219,6 +223,7 @@
"error.validation.time": "Моля въведете валидно време",
"error.validation.url": "Моля въведете валиден URL",
"field.required": "The field is required",
"field.files.empty": "Все още не са избрани файлове",
"field.pages.empty": "Все още не са избрани страници",
"field.structure.delete.confirm": "Сигурни ли сте, че искате да изтриете това вписване?",
@@ -291,6 +296,7 @@
"loading": "Зареждане",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Published",
"pages.status.unlisted": "Скрит",
"pagination.page": "Страница",
"password": "\u041f\u0430\u0440\u043e\u043b\u0430",
"pixel": "Пиксел",
"prev": "Previous",
@@ -384,6 +392,9 @@
"save": "\u0417\u0430\u043f\u0438\u0448\u0438",
"search": "Търси",
"section.required": "The section is required",
"select": "Избери",
"settings": "Настройки",
"size": "Размер",

View File

@@ -23,6 +23,7 @@
"delete": "Eliminar",
"dimensions": "Dimensions",
"disabled": "Desactivat",
"discard": "Descartar",
"download": "Descarregar",
"duplicate": "Duplicar",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "No s'ha pogut carregar la secció \"{name}\"",
"error.section.type.invalid": "La secció tipus \"{type}\" no és vàlida",
"error.site.changeTitle.empty": "El títol no pot estar buit",
"error.site.changeTitle.permission":
"No tens permís per canviar el títol del lloc web",
"error.site.update.permission": "No tens permís per actualitzar el lloc web",
@@ -155,6 +157,8 @@
"El rol del darrer administrador no es pot canviar",
"error.user.changeRole.permission":
"No tens permís per canviar el rol de l'usuari \"{name}\"",
"error.user.changeRole.toAdmin":
"No tens permís per promocionar algú al rol dadministrador",
"error.user.create.permission": "No tens permís per crear aquest usuari",
"error.user.delete": "L'usuari \"{name}\" no es pot eliminar",
"error.user.delete.lastAdmin": "No es pot eliminar l'\u00faltim administrador",
@@ -219,6 +223,7 @@
"error.validation.time": "Si us plau, introduïu una hora vàlida",
"error.validation.url": "Si us plau, introduïu una URL vàlida",
"field.required": "El camp és obligatori",
"field.files.empty": "Encara no hi ha cap fitxer seleccionat",
"field.pages.empty": "Encara no s'ha seleccionat cap pàgina",
"field.structure.delete.confirm": "Segur que voleu eliminar aquesta fila?",
@@ -291,6 +296,7 @@
"loading": "Carregant",
"lock.unsaved": "Canvis no guardats",
"lock.unsaved.empty": "Ja no hi ha canvis no guardats",
"lock.isLocked": "Canvis no guardats per <strong>{email}</strong>",
"lock.file.isLocked": "El fitxer està sent editat actualment per {email} i no pot ser modificat.",
"lock.page.isLocked": "La pàgina està sent editat actualment per {email} i no pot ser modificat.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publicat",
"pages.status.unlisted": "Sense classificar",
"pagination.page": "Pàgina",
"password": "Contrasenya",
"pixel": "Pixel",
"prev": "Anterior",
@@ -384,6 +392,9 @@
"save": "Desar",
"search": "Cercar",
"section.required": "La secció és obligatòria",
"select": "Seleccionar",
"settings": "Configuració",
"size": "Tamany",
@@ -418,7 +429,7 @@
"upload.error.default": "No s'ha pogut carregar el fitxer",
"upload.error.extension": "La càrrega del fitxer s'ha aturat per l'extensió",
"upload.error.formSize": "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada en el formulari",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniPostSize": "El fitxer carregat supera la directiva post_max_size especifiada al php.ini",
"upload.error.iniSize": "El fitxer carregat supera la directiva upload_max_filesize especifiada al php.ini",
"upload.error.noFile": "No s'ha carregat cap fitxer",
"upload.error.noFiles": "No s'ha penjat cap fitxer",

View File

@@ -23,6 +23,7 @@
"delete": "Smazat",
"dimensions": "Rozměry",
"disabled": "Zakázáno",
"discard": "Zahodit",
"download": "Stáhnout",
"duplicate": "Duplikovat",
@@ -37,7 +38,7 @@
"error.access.login": "Neplatné přihlášení",
"error.access.panel": "Nemáte povoleno vstoupit do panelu",
"error.access.view": "You are not allowed to access this part of the panel",
"error.access.view": "Nejste oprávněni vstoupit do této části panelu.",
"error.avatar.create.fail": "Nebylo možné nahrát profilový obrázek",
"error.avatar.delete.fail": "Nebylo mo\u017en\u00e9 smazat profilov\u00fd obr\u00e1zek",
@@ -52,7 +53,7 @@
"error.field.converter.invalid": "Neplatný konvertor \"{converter}\"",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.empty": "Toto jméno nesmí být prázdné",
"error.file.changeName.permission":
"Nemáte povoleno změnit jméno souboru \"{filename}\"",
"error.file.duplicate": "Soubor s názvem \"{filename}\" již existuje",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Nelze načíst sekci \"{name}\"",
"error.section.type.invalid": "Typ sekce \"{type}\" není platný",
"error.site.changeTitle.empty": "Titulek nesmí být prázdný",
"error.site.changeTitle.permission":
"Nemáte dovoleno změnit titulek stránky",
"error.site.update.permission": "Nemáte dovoleno upravit stránku",
@@ -155,6 +157,8 @@
"Role posledního administrátora nemůže být změněna",
"error.user.changeRole.permission":
"Nemáte dovoleno změnit roli uživatele \"{name}\"",
"error.user.changeRole.toAdmin":
"Nemáte dovoleno povýšit uživatele do role administrátora.",
"error.user.create.permission": "Nemáte dovoleno vytvořit tohoto uživatele",
"error.user.delete": "U\u017eivatel nemohl b\u00fdt smaz\u00e1n",
"error.user.delete.lastAdmin": "Nem\u016f\u017eete smazat posledn\u00edho administr\u00e1tora",
@@ -219,6 +223,7 @@
"error.validation.time": "Zadejte prosím platný čas",
"error.validation.url": "Zadejte prosím platnou adresu URL",
"field.required": "The field is required",
"field.files.empty": "Nebyly zatím vybrány žádné soubory",
"field.pages.empty": "Nebyly zatím vybrány žádné stránky",
"field.structure.delete.confirm": "Opravdu chcete smazat tento z\u00e1znam?",
@@ -291,6 +296,7 @@
"loading": "Načítám",
"lock.unsaved": "Neuložené změny",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Neuložené změny provedené <strong>{email}</strong>",
"lock.file.isLocked": "Soubor nelze změnit, právě jej upravuje {email}.",
"lock.page.isLocked": "Stránku nelze změnit, právě jí upravuje {email} .",
@@ -364,6 +370,8 @@
"pages.status.listed": "Zveřejněno",
"pages.status.unlisted": "Neveřejná",
"pagination.page": "Stránka",
"password": "Heslo",
"pixel": "Pixel",
"prev": "Předchozí",
@@ -384,6 +392,9 @@
"save": "Ulo\u017eit",
"search": "Hledat",
"section.required": "The section is required",
"select": "Vybrat",
"settings": "Nastavení",
"size": "Velikost",
@@ -413,9 +424,9 @@
"translation.name": "\u010cesky",
"upload": "Nahrát",
"upload.error.cantMove": "The uploaded file could not be moved",
"upload.error.cantWrite": "Failed to write file to disk",
"upload.error.default": "The file could not be uploaded",
"upload.error.cantMove": "Nahraný soubor nemohl být přesunut",
"upload.error.cantWrite": "Zápis souboru na disk se nezdařil",
"upload.error.default": "Soubor se nepodařilo nahrát",
"upload.error.extension": "File upload stopped by extension",
"upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",

View File

@@ -23,6 +23,7 @@
"delete": "Slet",
"dimensions": "Dimensioner",
"disabled": "Disabled",
"discard": "Kass\u00e9r",
"download": "Download",
"duplicate": "Dupliker",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Sektionen \"{section}\" kunne ikke indlæses",
"error.section.type.invalid": "Sektionstypen \"{type}\" er ikke gyldig",
"error.site.changeTitle.empty": "Titlen kan ikke være tom",
"error.site.changeTitle.permission":
"Du har ikke tilladelse til at ændre titlen på sitet",
"error.site.update.permission": "Du har ikke tilladelse til at opdatere sitet",
@@ -155,6 +157,8 @@
"Rollen for den sidste admin kan ikke ændres",
"error.user.changeRole.permission":
"Du har ikke tilladelse til at ændre rollen for brugeren \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Du har ikke tilladelse til at oprette denne bruger",
"error.user.delete": "Brugeren kunne ikke slettes",
"error.user.delete.lastAdmin": "Du kan ikke slette den sidste admin",
@@ -219,6 +223,7 @@
"error.validation.time": "Indtast venligst et gyldigt tidspunkt",
"error.validation.url": "Indtast venligst en gyldig URL",
"field.required": "The field is required",
"field.files.empty": "Ingen filer valgt endnu",
"field.pages.empty": "Ingen sider valgt endnu",
"field.structure.delete.confirm": "\u00d8nsker du virkelig at slette denne indtastning?",
@@ -291,6 +296,7 @@
"loading": "Indlæser",
"lock.unsaved": "Ugemte ændringer",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Ugemte ændringer af <strong>{email}</strong>",
"lock.file.isLocked": "Filen redigeres på nuværende af {email} og kan derfor ikke ændres.",
"lock.page.isLocked": "Siden redigeres på nuværende af {email} og kan derfor ikke ændres.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Udgivede",
"pages.status.unlisted": "Ulistede",
"pagination.page": "Side",
"password": "Adgangskode",
"pixel": "Pixel",
"prev": "Forrige",
@@ -384,6 +392,9 @@
"save": "Gem",
"search": "Søg",
"section.required": "The section is required",
"select": "Vælg",
"settings": "Indstillinger",
"size": "Størrelse",
@@ -418,7 +429,7 @@
"upload.error.default": "Filen kunne ikke uploades",
"upload.error.extension": "Upload af filen blev stoppet af dens type",
"upload.error.formSize": "Filen overskrider MAX_FILE_SIZE direktivet der er specificeret for formularen",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniPostSize": "FIlen overskrider post_max_size direktivet i php.ini",
"upload.error.iniSize": "FIlen overskrider upload_max_filesize direktivet i php.ini",
"upload.error.noFile": "Ingen fil blev uploadet",
"upload.error.noFiles": "Ingen filer blev uploadet",

View File

@@ -23,6 +23,7 @@
"delete": "L\u00f6schen",
"dimensions": "Maße",
"disabled": "Gesperrt",
"discard": "Verwerfen",
"download": "Download",
"duplicate": "Duplizieren",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Der Bereich \"{name}\" konnte nicht geladen werden",
"error.section.type.invalid": "Der Bereichstyp \"{type}\" ist nicht gültig",
"error.site.changeTitle.empty": "Bitte gib einen Titel an",
"error.site.changeTitle.permission":
"Du kannst den Titel der Seite nicht ändern",
"error.site.update.permission": "Du darfst die Seite nicht editieren",
@@ -155,6 +157,8 @@
"Die Rolle des letzten Administrators kann nicht geändert werden",
"error.user.changeRole.permission":
"Du kannst die Rolle für den Benutzer \"{name}\" nicht ändern",
"error.user.changeRole.toAdmin":
"Du darfst die Admin Rolle nicht an andere Benutzer vergeben",
"error.user.create.permission": "Du kannst diesen Benutzer nicht anlegen",
"error.user.delete": "Der Benutzer \"{name}\" konnte nicht gelöscht werden",
"error.user.delete.lastAdmin": "Du kannst den letzten Admin nicht l\u00f6schen",
@@ -219,6 +223,7 @@
"error.validation.time": "Bitte gib eine gültige Uhrzeit ein",
"error.validation.url": "Bitte gib eine gültige URL ein",
"field.required": "Das Feld ist Pflicht",
"field.files.empty": "Keine Dateien ausgewählt",
"field.pages.empty": "Keine Seiten ausgewählt",
"field.structure.delete.confirm": "Willst du diesen Eintrag wirklich l\u00f6schen?",
@@ -291,6 +296,7 @@
"loading": "Laden",
"lock.unsaved": "Ungespeicherte Änderungen",
"lock.unsaved.empty": "Keine ungespeicherten Änderungen",
"lock.isLocked": "Ungespeicherte Änderungen von <strong>{email}</strong>",
"lock.file.isLocked": "Die Datei wird von {email} bearbeitet und kann nicht geändert werden.",
"lock.page.isLocked": "Die Seite wird von {email} bearbeitet und kann nicht geändert werden.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Veröffentlicht",
"pages.status.unlisted": "Ungelistet",
"pagination.page": "Seite",
"password": "Passwort",
"pixel": "Pixel",
"prev": "Vorheriger Eintrag",
@@ -384,6 +392,9 @@
"save": "Speichern",
"search": "Suchen",
"section.required": "Der Bereich ist Pflicht",
"select": "Auswählen",
"settings": "Einstellungen",
"size": "Größe",

View File

@@ -23,6 +23,7 @@
"delete": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae",
"dimensions": "Διαστάσεις",
"disabled": "Disabled",
"discard": "Απόρριψη",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Δεν ήταν δυνατή η φόρτωση της ενότητας \"{name}\"",
"error.section.type.invalid": "Ο τύπος ενότητας \"{type}\" δεν είναι έγκυρος",
"error.site.changeTitle.empty": "Ο τίτλος δεν μπορεί να είναι κενός",
"error.site.changeTitle.permission":
"Δεν επιτρέπεται να αλλάξετε τον τίτλο του ιστότοπου",
"error.site.update.permission": "Δεν επιτρέπεται η ενημέρωση του ιστότοπου",
@@ -155,6 +157,8 @@
"Ο ρόλος του τελευταίου διαχειριστή δεν μπορεί να αλλάξει",
"error.user.changeRole.permission":
"Δεν επιτρέπεται να αλλάξετε το ρόλο του χρήστη \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Δεν επιτρέπεται η δημιουργία αυτού του χρήστη",
"error.user.delete": "\u039f \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03c3\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af",
"error.user.delete.lastAdmin": "Δεν είναι δυνατή η διαγραφή του τελευταίου διαχειριστή",
@@ -219,6 +223,7 @@
"error.validation.time": "Παρακαλώ εισάγετε μια έγκυρη ώρα",
"error.validation.url": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση URL",
"field.required": "The field is required",
"field.files.empty": "Δεν έχουν επιλεγεί αρχεία ακόμα",
"field.pages.empty": "Δεν έχουν επιλεγεί ακόμη σελίδες",
"field.structure.delete.confirm": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b9\u03c3\u03b7;",
@@ -291,6 +296,7 @@
"loading": "Φόρτωση",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Δημοσιευμένο",
"pages.status.unlisted": "Μη καταχωρημένο",
"pagination.page": "Σελίδα",
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03a0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"pixel": "Εικονοστοιχέιο",
"prev": "Προηγούμενο",
@@ -384,6 +392,9 @@
"save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7",
"search": "Αναζήτηση",
"section.required": "The section is required",
"select": "Επιλογή",
"settings": "Ρυθμίσεις",
"size": "Μέγεθος",

View File

@@ -23,6 +23,7 @@
"delete": "Delete",
"dimensions": "Dimensions",
"disabled": "Disabled",
"discard": "Discard",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "The section \"{name}\" could not be loaded",
"error.section.type.invalid": "The section type \"{type}\" is not valid",
"error.site.changeTitle.empty": "The title must not be empty",
"error.site.changeTitle.permission":
"You are not allowed to change the title of the site",
"error.site.update.permission": "You are not allowed to update the site",
@@ -221,6 +223,7 @@
"error.validation.time": "Please enter a valid time",
"error.validation.url": "Please enter a valid URL",
"field.required": "The field is required",
"field.files.empty": "No files selected yet",
"field.pages.empty": "No pages selected yet",
"field.structure.delete.confirm": "Do you really want to delete this row?",
@@ -293,6 +296,7 @@
"loading": "Loading",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -366,6 +370,8 @@
"pages.status.listed": "Published",
"pages.status.unlisted": "Unlisted",
"pagination.page": "Page",
"password": "Password",
"pixel": "Pixel",
"prev": "Previous",
@@ -386,6 +392,9 @@
"save": "Save",
"search": "Search",
"section.required": "The section is required",
"select": "Select",
"settings": "Settings",
"size": "Size",

View File

@@ -23,6 +23,7 @@
"delete": "Eliminar",
"dimensions": "Dimensiones",
"disabled": "Disabled",
"discard": "Descartar",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "La sección \"{name}\" no se pudo cargar",
"error.section.type.invalid": "La sección \"{type}\" no es valida",
"error.site.changeTitle.empty": "El título no debe estar vacío.",
"error.site.changeTitle.permission":
"No tienes permiso para cambiar el título del sitio",
"error.site.update.permission": "No tienes permiso de actualizar el sitio",
@@ -155,6 +157,8 @@
"El rol del último administrador no puede ser cambiado",
"error.user.changeRole.permission":
"No tienes permiso para cambiar el rol del usuario \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "No tienes permiso de crear este usuario",
"error.user.delete": "El ususario no pudo ser eliminado",
"error.user.delete.lastAdmin": "Usted no puede borrar el \u00faltimo administrador",
@@ -219,6 +223,7 @@
"error.validation.time": "Por favor ingresa una hora válida",
"error.validation.url": "Por favor ingresa un URL válido",
"field.required": "The field is required",
"field.files.empty": "Aún no ha seleccionado ningún archivo",
"field.pages.empty": "Aún no ha seleccionado ningúna pagina",
"field.structure.delete.confirm": "\u00bfEn realidad desea borrar esta entrada?",
@@ -291,6 +296,7 @@
"loading": "Cargando",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publicado",
"pages.status.unlisted": "No publicado",
"pagination.page": "Página",
"password": "Contrase\u00f1a",
"pixel": "Pixel",
"prev": "Anterior",
@@ -384,6 +392,9 @@
"save": "Guardar",
"search": "Buscar",
"section.required": "The section is required",
"select": "Seleccionar",
"settings": "Ajustes",
"size": "Tamaño",
@@ -410,7 +421,7 @@
"translation.author": "Equipo Kirby",
"translation.direction": "ltr",
"translation.name": "Inglés",
"translation.name": "Español (América Latina)",
"upload": "Subir",
"upload.error.cantMove": "The uploaded file could not be moved",

View File

@@ -23,6 +23,7 @@
"delete": "Borrar",
"dimensions": "Dimensiones",
"disabled": "Disabled",
"discard": "Descartar",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "La sección \"{name}\" no pudo ser cargada",
"error.section.type.invalid": "El sección tipo \"{tipo}\" no es válido",
"error.site.changeTitle.empty": "El título no debe estar vacío.",
"error.site.changeTitle.permission":
"No está permitido cambiar el título del sitio",
"error.site.update.permission": "No tienes permitido actualizar el sitio",
@@ -155,6 +157,8 @@
"El rol para el último administrador no puede ser cambiado",
"error.user.changeRole.permission":
"No tienes permitido cambiar el rol del usuario \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "No tienes permiso para crear este usuario",
"error.user.delete": "El usuario \"{name}\" no puede ser eliminado",
"error.user.delete.lastAdmin": "El último administrador no puede ser eliminado",
@@ -219,6 +223,7 @@
"error.validation.time": "Por favor ingrese una hora válida",
"error.validation.url": "Por favor introduzca un URL válido",
"field.required": "The field is required",
"field.files.empty": "Aún no hay archivos seleccionados",
"field.pages.empty": "Aún no hay páginas seleccionadas",
"field.structure.delete.confirm": "¿Realmente quieres eliminar esta fila?",
@@ -291,6 +296,7 @@
"loading": "Cargando",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publicadas",
"pages.status.unlisted": "Sin publicar",
"pagination.page": "Página",
"password": "Contraseña",
"pixel": "Pixel",
"prev": "Anterior",
@@ -384,6 +392,9 @@
"save": "Guardar",
"search": "Buscar",
"section.required": "The section is required",
"select": "Seleccionar",
"settings": "Ajustes",
"size": "Tamaño",

View File

@@ -23,6 +23,7 @@
"delete": "\u062d\u0630\u0641",
"dimensions": "ابعاد",
"disabled": "Disabled",
"discard": "\u0627\u0646\u0635\u0631\u0627\u0641",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "بخش «{name}» قابل بارکذاری نیست",
"error.section.type.invalid": "نوع بخش «{type}» غیرمجاز است",
"error.site.changeTitle.empty": "عنوان اجباری است",
"error.site.changeTitle.permission":
"شما اجازه تغییر عنوان سایت را ندارید",
"error.site.update.permission": "شما اجازه بروزرسانی سایت را ندارید",
@@ -155,6 +157,8 @@
"نقش آخرین مدیر سیستم قابل تغییر نیست",
"error.user.changeRole.permission":
"شما اجازه تغییر نقش کاربر «{name}» را ندارید",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "شما اجازه ایجاد این کاربر را ندارید",
"error.user.delete": "کاربر «{name}» نمی تواند حذف شود",
"error.user.delete.lastAdmin": "\u062d\u0630\u0641 \u0622\u062e\u0631\u06cc\u0646 \u0645\u062f\u06cc\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a",
@@ -219,6 +223,7 @@
"error.validation.time": "لطفا زمان معتبری وارد کنید",
"error.validation.url": "لطفا آدرس URL صحیح وارد کنید",
"field.required": "The field is required",
"field.files.empty": "فایلی انتخاب نشده است",
"field.pages.empty": "صفحه‌ای انتخاب نشده است",
"field.structure.delete.confirm": "\u0645\u062f\u062e\u0644 \u062c\u0627\u0631\u06cc \u062d\u0630\u0641 \u0634\u0648\u062f\u061f",
@@ -291,6 +296,7 @@
"loading": "بارگزاری",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "منتشر شده",
"pages.status.unlisted": "فهرست نشده",
"pagination.page": "صفحه",
"password": "\u06af\u0630\u0631\u0648\u0627\u0698\u0647",
"pixel": "پیکسل",
"prev": "قبلی",
@@ -384,6 +392,9 @@
"save": "\u0630\u062e\u06cc\u0631\u0647",
"search": "جستجو",
"section.required": "The section is required",
"select": "انتخاب",
"settings": "تنظیمات",
"size": "اندازه",

View File

@@ -23,21 +23,22 @@
"delete": "Poista",
"dimensions": "Mitat",
"disabled": "Disabled",
"discard": "Hylkää",
"download": "Download",
"duplicate": "Duplicate",
"download": "Lataa",
"duplicate": "Kahdenna",
"edit": "Muokkaa",
"dialog.files.empty": "No files to select",
"dialog.pages.empty": "No pages to select",
"dialog.users.empty": "No users to select",
"dialog.files.empty": "Ei valittavissa olevia tiedostoja",
"dialog.pages.empty": "Ei valittavissa olevia sivuja",
"dialog.users.empty": "Ei valittavissa olevia käyttäjiä",
"email": "S\u00e4hk\u00f6posti",
"email.placeholder": "nimi@osoite.fi",
"error.access.login": "Kirjautumistiedot eivät kelpaa",
"error.access.panel": "Sinulla ei ole oikeutta käyttää paneelia",
"error.access.view": "You are not allowed to access this part of the panel",
"error.access.view": "Sinulla ei ole oikeutta käyttää tätä osaa paneelista",
"error.avatar.create.fail": "Profiilikuvaa ei voitu lähettää",
"error.avatar.delete.fail": "Profiilikuvaa ei voitu poistaa",
@@ -52,7 +53,7 @@
"error.field.converter.invalid": "Muunnin \"{converter}\" ei kelpaa",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.empty": "Nimi ei voi olla tyhjä",
"error.file.changeName.permission":
"Sinulla ei ole oikeutta muuttaa tiedoston \"{filename}\" nimeä",
"error.file.duplicate": "Tiedosto nimellä \"{filename}\" on jo olemassa",
@@ -73,13 +74,13 @@
"error.form.incomplete": "Korjaa kaikki lomakkeen virheet...",
"error.form.notSaved": "Lomaketta ei voitu tallentaa",
"error.language.code": "Please enter a valid code for the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.code": "Anna kielen lyhenne",
"error.language.duplicate": "Kieli on jo olemassa",
"error.language.name": "Anna kielen nimi",
"error.license.format": "Please enter a valid license key",
"error.license.format": "Anna lisenssiavain",
"error.license.email": "Anna kelpaava sähköpostiosoite",
"error.license.verification": "The license could not be verified",
"error.license.verification": "Lisenssiä ei voitu vahvistaa",
"error.page.changeSlug.permission":
"Sinulla ei ole oikeutta muuttaa URL-liitettä sivulle \"{slug}\"",
@@ -106,7 +107,7 @@
"Sivuluonnos URL-liitteellä \"{slug}\" on jo olemassa",
"error.page.duplicate":
"Sivu URL-liitteellä \"{slug}\" on jo olemassa",
"error.page.duplicate.permission": "You are not allowed to duplicate \"{slug}\"",
"error.page.duplicate.permission": "Sinulla ei ole oikeutta kahdentaa sivua \"{slug}\"",
"error.page.notFound": "Sivua \"{slug}\" ei löytynyt",
"error.page.num.invalid":
"Anna kelpaava järjestysnumero. Numero ei voi olla negatiivinen.",
@@ -121,22 +122,23 @@
"error.section.files.max.singular":
"Et voi lisätä enempää kuin yhden tiedoston osioon \"{section}\"",
"error.section.files.min.plural":
"The \"{section}\" section requires at least {min} files",
"Osio \"{section}\" vaatii ainakin {min} tiedostoa",
"error.section.files.min.singular":
"The \"{section}\" section requires at least one file",
"Osio \"{section}\" vaatii ainakin yhden sivun",
"error.section.pages.max.plural":
"Et voi lisätä enemmän kuin {max} sivua osioon \"{section}\"",
"error.section.pages.max.singular":
"Et voi lisätä enempää kuin yhden sivun osioon \"{section}\"",
"error.section.pages.min.plural":
"The \"{section}\" section requires at least {min} pages",
"Osio \"{section}\" vaatii ainakin {min} sivua",
"error.section.pages.min.singular":
"The \"{section}\" section requires at least one page",
"Osio \"{section}\" vaatii ainakin yhden sivun",
"error.section.notLoaded": "Osiota \"{name}\" ei voitu ladata",
"error.section.type.invalid": "Osion tyyppi \"{type}\" ei ole kelvollinen",
"error.site.changeTitle.empty": "Nimi ei voi olla tyhjä",
"error.site.changeTitle.permission":
"Sinulla ei ole oikeutta päivittää sivuston nimeä",
"error.site.update.permission": "Sinulla ei ole oikeutta päivittää sivuston tietoja",
@@ -152,17 +154,19 @@
"error.user.changePassword.permission":
"Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" salasanaa",
"error.user.changeRole.lastAdmin":
"Ainoan ylläpitäjän roolia ei voi muuttaa",
"Ainoan pääkäyttäjän roolia ei voi muuttaa",
"error.user.changeRole.permission":
"Sinulla ei ole oikeutta vaihtaa käyttäjän \"{name}\" käyttäjätasoa",
"error.user.changeRole.toAdmin":
"Sinulla ei ole oikeutta vaihtaa käyttäjätasoa pääkäyttäjäksi",
"error.user.create.permission": "Sinulla ei ole oikeutta luoda tätä käyttäjää",
"error.user.delete": "Käyttäjää \"{name}\" ei voi poistaa",
"error.user.delete.lastAdmin": "Ainoaa ylläpitäjää ei voi poistaa",
"error.user.delete.lastAdmin": "Ainoaa pääkäyttäjää ei voi poistaa",
"error.user.delete.lastUser": "Ainoaa käyttäjää ei voi poistaa",
"error.user.delete.permission":
"Sinulla ei ole oikeutta poistaa käyttäjää \"{name}\"",
"error.user.duplicate":
"Käyttäjä jonka sähköpostiosoite on \"{name}\" on jo olemassa",
"Käyttäjä, jonka sähköpostiosoite on \"{name}\", on jo olemassa",
"error.user.email.invalid": "Anna kelpaava sähköpostiosoite",
"error.user.language.invalid": "Anna kelpaava kieli",
"error.user.notFound": "K\u00e4ytt\u00e4j\u00e4\u00e4 ei l\u00f6ytynyt",
@@ -184,9 +188,9 @@
"error.validation.contains":
"Anna arvo joka sisältää \"{needle}\"",
"error.validation.date": "Anna kelpaava päivämäärä",
"error.validation.date.after": "Please enter a date after {date}",
"error.validation.date.before": "Please enter a date before {date}",
"error.validation.date.between": "Please enter a date between {min} and {max}",
"error.validation.date.after": "Anna päivämäärä {date} jälkeen",
"error.validation.date.before": "Anna päivämäärä ennen {date}",
"error.validation.date.between": "Anna päivämäärä väliltä {min} ja {max}",
"error.validation.denied": "Ole hyvä ja peruuta",
"error.validation.different": "Arvo ei voi olla \"{other}\"",
"error.validation.email": "Anna kelpaava sähköpostiosoite",
@@ -219,6 +223,7 @@
"error.validation.time": "Anna kelpaava aika",
"error.validation.url": "Anna kelpaava URL",
"field.required": "Kenttä on pakollinen",
"field.files.empty": "Tiedostoja ei ole vielä valittu",
"field.pages.empty": " Sivuja ei ole vielä valittu",
"field.structure.delete.confirm": "Haluatko varmasti poistaa tämän rivin?",
@@ -290,11 +295,12 @@
"loading": "Ladataan",
"lock.unsaved": "Unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.unsaved": "Tallentamattomia muutoksia",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Käyttäjällä <strong>{email}</strong> on tallentamattomia muutoksia",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
"lock.unlock": "Unlock",
"lock.unlock": "Vapauta",
"lock.isUnlocked": "Your unsaved changes have been overwritten by another user. You can download your changes to merge them manually.",
"login": "Kirjaudu",
@@ -364,6 +370,8 @@
"pages.status.listed": "Julkaistut",
"pages.status.unlisted": "Listaamaton",
"pagination.page": "Sivu",
"password": "Salasana",
"pixel": "Pikseli",
"prev": "Edellinen",
@@ -374,8 +382,8 @@
"revert": "Palauta",
"role": "K\u00e4ytt\u00e4j\u00e4taso",
"role.admin.description": "The admin has all rights",
"role.admin.title": "Admin",
"role.admin.description": "Pääkäyttäjällä on kaikki oikeudet",
"role.admin.title": "Pääkäyttäjä",
"role.all": "Kaikki",
"role.empty": "Tällä käyttäjätasolla ei ole yhtään käyttäjää",
"role.description.placeholder": "Ei kuvausta",
@@ -384,6 +392,9 @@
"save": "Tallenna",
"search": "Haku",
"section.required": "Osio on pakollinen",
"select": "Valitse",
"settings": "Asetukset",
"size": "Koko",
@@ -413,15 +424,15 @@
"translation.name": "Suomi",
"upload": "Lähetä",
"upload.error.cantMove": "The uploaded file could not be moved",
"upload.error.cantWrite": "Failed to write file to disk",
"upload.error.default": "The file could not be uploaded",
"upload.error.cantMove": "Lähetettyä tiedostoa ei voitu siirtää",
"upload.error.cantWrite": "Tiedoston kirjoitus levylle epäonnistui",
"upload.error.default": "Tiedostoa ei voitu lähettää",
"upload.error.extension": "File upload stopped by extension",
"upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"upload.error.noFile": "No file was uploaded",
"upload.error.noFiles": "No files were uploaded",
"upload.error.formSize": "Lähetetyn tiedoston koko ylittää lomakkeen sallitun ylärajan MAX_FILE_SIZE",
"upload.error.iniPostSize": "Lähetetyn tiedoston koko ylittää sallitun ylärajan post_max_size asetustiedostossa php.ini",
"upload.error.iniSize": "Lähetetyn tiedoston koko ylittää sallitun ylärajan upload_max_filesize asetustiedostossa php.ini",
"upload.error.noFile": "Tiedostoa ei lähetetty",
"upload.error.noFiles": "Tiedostoja ei lähetetty",
"upload.error.partial": "The uploaded file was only partially uploaded",
"upload.error.tmpDir": "Missing a temporary folder",
"upload.errors": "Virhe",

View File

@@ -23,6 +23,7 @@
"delete": "Supprimer",
"dimensions": "Dimensions",
"disabled": "Désactivé",
"discard": "Supprimer",
"download": "Télécharger",
"duplicate": "Dupliquer",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "La section «&nbsp;{name}&nbsp;» na pu être chargée",
"error.section.type.invalid": "Le type de section «&nbsp;{type}&nbsp;» est incorrect",
"error.site.changeTitle.empty": "Le titre ne peut être vide",
"error.site.changeTitle.permission":
"Vous nêtes pas autorisé à modifier le titre du site",
"error.site.update.permission": "Vous nêtes pas autorisé à modifier le contenu global du site",
@@ -155,6 +157,8 @@
"Le rôle du dernier administrateur ne peut être modifié",
"error.user.changeRole.permission":
"Vous nêtes pas autorisé à changer le rôle de lutilisateur « {name} »",
"error.user.changeRole.toAdmin":
"Vous nêtes pas autorisé à attribuer le rôle dadministrateur aux utilisateurs",
"error.user.create.permission": "Vous nêtes pas autorisé à créer cet utilisateur",
"error.user.delete": "Lutilisateur « {name} » ne peut être supprimé",
"error.user.delete.lastAdmin": "Le dernier administrateur ne peut être supprimé",
@@ -219,6 +223,7 @@
"error.validation.time": "Veuillez saisir une heure valide",
"error.validation.url": "Veuillez saisir une URL valide",
"field.required": "Le champ est obligatoire",
"field.files.empty": "Pas encore de fichier sélectionné",
"field.pages.empty": "Pas encore de page sélectionnée",
"field.structure.delete.confirm": "Voulez-vous vraiment supprimer cette ligne?",
@@ -291,6 +296,7 @@
"loading": "Chargement",
"lock.unsaved": "Modifications non enregistrées",
"lock.unsaved.empty": "Il ny a plus de modifications non enregistrées",
"lock.isLocked": "Modifications non enregistrées par <strong>{email}</strong>",
"lock.file.isLocked": "Le fichier est actuellement édité par {email} et ne peut être modifié.",
"lock.page.isLocked": "La page est actuellement éditée par {email} et ne peut être modifiée.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publié",
"pages.status.unlisted": "Non listé",
"pagination.page": "Page",
"password": "Mot de passe",
"pixel": "Pixel",
"prev": "Précédent",
@@ -384,6 +392,9 @@
"save": "Enregistrer",
"search": "Rechercher",
"section.required": "Cette section est obligatoire",
"select": "Sélectionner",
"settings": "Paramètres",
"size": "Poids",
@@ -418,8 +429,8 @@
"upload.error.default": "Le fichier na pu être transféré",
"upload.error.extension": "Le transfert de fichier a été stoppé par une extension",
"upload.error.formSize": "Le fichier transféré excède la directive MAX_FILE_SIZE spécifiée dans le formulaire",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniSize": "Le fichier transféré excède la directive MAX_FILE_SIZE spécifiée dans php.ini",
"upload.error.iniPostSize": "Le fichier transféré excède la directive post_max_size spécifiée dans php.ini",
"upload.error.iniSize": "Le fichier transféré excède la directive upload_max_filesize spécifiée dans php.ini",
"upload.error.noFile": "Aucun fichier na été transféré",
"upload.error.noFiles": "Aucun fichier na été transféré",
"upload.error.partial": "Le fichier na été que partiellement transféré",

View File

@@ -23,6 +23,7 @@
"delete": "T\u00f6rl\u00e9s",
"dimensions": "Méretek",
"disabled": "Disabled",
"discard": "Visszavon\u00e1s",
"download": "Letöltés",
"duplicate": "Másolat",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "A(z) \"{name}\" szekció nem tölthető be",
"error.section.type.invalid": "A szekció típusa (\"{type}\") nem megfelelő",
"error.site.changeTitle.empty": "A cím nem lehet üres",
"error.site.changeTitle.permission":
"Nincs jogosultságod megváltoztatni az honlap címét",
"error.site.update.permission": "Nincs jogosultságod frissíteni a honlapot",
@@ -155,6 +157,8 @@
"Az egyedüli adminisztrátor szerepkörét nem lehet megváltoztatni",
"error.user.changeRole.permission":
"Nincs jogosultságod megváltoztatni \"{name}\" felhasználó szerepkörét",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Nincs jogosultságod létrehozni ezt a felhasználót",
"error.user.delete": "A felhaszn\u00e1l\u00f3 nem t\u00f6r\u00f6lhet\u0151",
"error.user.delete.lastAdmin": "Nem t\u00f6r\u00f6lheted az egyetlen adminisztr\u00e1tort",
@@ -219,6 +223,7 @@
"error.validation.time": "Kérlek megfelelő időt adj meg",
"error.validation.url": "Kérlek megfelelő URL-t adj meg",
"field.required": "The field is required",
"field.files.empty": "Nincs fálj kiválasztva",
"field.pages.empty": "Nincs oldal kiválasztva",
"field.structure.delete.confirm": "Biztos t\u00f6r\u00f6lni szeretn\u00e9d ezt a bejegyz\u00e9st?",
@@ -291,6 +296,7 @@
"loading": "Betöltés",
"lock.unsaved": "Nem mentett változások",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Nem mentett <strong>{email}</strong> változások",
"lock.file.isLocked": "A fájlt jelenleg {email} szerkeszti és nem módosítható.",
"lock.page.isLocked": "Az oldalt jelenleg {email} szerkeszti és nem módosítható.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publikálva",
"pages.status.unlisted": "Nem listázott",
"pagination.page": "Oldal",
"password": "Jelsz\u00f3",
"pixel": "Pixel",
"prev": "Előző",
@@ -384,6 +392,9 @@
"save": "Ment\u00e9s",
"search": "Keresés",
"section.required": "The section is required",
"select": "Kiválasztás",
"settings": "Beállítások",
"size": "Méret",

View File

@@ -23,6 +23,7 @@
"delete": "Hapus",
"dimensions": "Dimensi",
"disabled": "Dimatikan",
"discard": "Buang",
"download": "Unduh",
"duplicate": "Duplikasi",
@@ -37,7 +38,7 @@
"error.access.login": "Upaya masuk tidak valid",
"error.access.panel": "Anda tidak diizinkan mengakses panel",
"error.access.view": "You are not allowed to access this part of the panel",
"error.access.view": "Anda tidak diizinkan mengakses bagian panel ini",
"error.avatar.create.fail": "Gambar profil tidak dapat diunggah",
"error.avatar.delete.fail": "Gambar profil tidak dapat dihapus",
@@ -52,7 +53,7 @@
"error.field.converter.invalid": "Konverter \"{converter}\" tidak valid",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.empty": "Nama harus diisi",
"error.file.changeName.permission":
"Anda tidak diizinkan mengubah nama berkas \"{filename}\"",
"error.file.duplicate": "Berkas dengan nama \"{filename}\" sudah ada",
@@ -65,7 +66,7 @@
"error.file.mime.forbidden": "Media dengan tipe mime \"{mime}\" tidak diizinkan",
"error.file.mime.missing":
"Tipe media untuk \"{filename}\" tidak dapat dideteksi",
"error.file.name.missing": "Nama berkas tidak boleh kosong",
"error.file.name.missing": "Nama berkas harus diisi",
"error.file.notFound": "Berkas \"{filename}\" tidak dapat ditemukan",
"error.file.type.forbidden": "Anda tidak diizinkan mengunggah berkas dengan tipe {type}",
"error.file.undefined": "Berkas tidak dapat ditemukan",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Bagian \"{name}\" tidak dapat dimuat",
"error.section.type.invalid": "Tipe bagian \"{type}\" tidak valid",
"error.site.changeTitle.empty": "Judul harus diisi",
"error.site.changeTitle.permission":
"Anda tidak diizinkan mengubah judul situs",
"error.site.update.permission": "Anda tidak diizinkan memperbaharui situs",
@@ -155,6 +157,8 @@
"Peran dari admin satu-satunya tidak dapat diubah",
"error.user.changeRole.permission":
"Anda tidak diizinkan mengubah peran dari pengguna \"{name}\"",
"error.user.changeRole.toAdmin":
"Anda tidak diizinkan mempromosikan seseorang menjadi admin",
"error.user.create.permission": "Anda tidak diizinkan membuat pengguna ini",
"error.user.delete": "Pengguna \"{nama}\" tidak dapat dihapus",
"error.user.delete.lastAdmin": "Admin satu-satunya tidak dapat dihapus",
@@ -219,6 +223,7 @@
"error.validation.time": "Masukkan waktu yang valid",
"error.validation.url": "Masukkan URL yang valid",
"field.required": "Bidang ini wajib",
"field.files.empty": "Belum ada berkas yang dipilih",
"field.pages.empty": "Belum ada halaman yang dipilih",
"field.structure.delete.confirm": "Anda yakin menghapus baris ini?",
@@ -291,6 +296,7 @@
"loading": "Memuat",
"lock.unsaved": "Perubahan belum tersimpan",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Perubahan belum tersimpan oleh <strong>{email}</strong>",
"lock.file.isLocked": "Berkas sedang disunting oleh {email} dan tidak dapat diubah.",
"lock.page.isLocked": "Halaman sedang disunting oleh {email} dan tidak dapat diubah.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Dipublikasikan",
"pages.status.unlisted": "Tidak tercantum",
"pagination.page": "Halaman",
"password": "Sandi",
"pixel": "Piksel",
"prev": "Sebelumnya",
@@ -384,6 +392,9 @@
"save": "Simpan",
"search": "Cari",
"section.required": "Bagian ini wajib",
"select": "Pilih",
"settings": "Pengaturan",
"size": "Ukuran",
@@ -413,17 +424,17 @@
"translation.name": "Bahasa Indonesia",
"upload": "Unggah",
"upload.error.cantMove": "The uploaded file could not be moved",
"upload.error.cantWrite": "Failed to write file to disk",
"upload.error.default": "The file could not be uploaded",
"upload.error.extension": "File upload stopped by extension",
"upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"upload.error.noFile": "No file was uploaded",
"upload.error.noFiles": "No files were uploaded",
"upload.error.partial": "The uploaded file was only partially uploaded",
"upload.error.tmpDir": "Missing a temporary folder",
"upload.error.cantMove": "Berkas unggahan tidak dapat dipindahkan",
"upload.error.cantWrite": "Gagal menyimpan berkas",
"upload.error.default": "Berkas tidak dapat diunggah",
"upload.error.extension": "Unggahan berkas diblokir dengan ekstensi",
"upload.error.formSize": "Berkas unggahan mencapai acuan MAX_FILE_SIZE yang diatur di formulir",
"upload.error.iniPostSize": "Berkas unggahan mencapai acuan post_max_size di php.ini",
"upload.error.iniSize": "Berkas unggahan mencapai acuan upload_max_filesize di php.ini",
"upload.error.noFile": "Tidak ada berkas diunggah",
"upload.error.noFiles": "Tidak ada berkas diunggah",
"upload.error.partial": "Berkas unggahan hanya berhasil diunggah sebagian",
"upload.error.tmpDir": "Folder sementara tidak ada",
"upload.errors": "Kesalahan",
"upload.progress": "Mengunggah…",

View File

@@ -23,6 +23,7 @@
"delete": "Elimina",
"dimensions": "Dimensioni",
"disabled": "Disabled",
"discard": "Abbandona",
"download": "Scarica",
"duplicate": "Duplica",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Non è stato possibile caricare la sezione \"{name}\"",
"error.section.type.invalid": "Il tipo di sezione \"{type}\" non è valido",
"error.site.changeTitle.empty": "Il titolo non può essere vuoto",
"error.site.changeTitle.permission":
"Non ti è permesso modificare il titolo del sito",
"error.site.update.permission": "Non ti è permesso modificare i contenuti globali del sito",
@@ -155,6 +157,8 @@
"Il ruolo dell'ultimo amministratore non può esser cambiato",
"error.user.changeRole.permission":
"Non ti è permesso modificare il ruolo dell'utente \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Non ti è permesso creare questo utente",
"error.user.delete": "L'utente non pu\u00f2 essere eliminato",
"error.user.delete.lastAdmin": "L'ultimo amministratore non può essere eliminato",
@@ -219,6 +223,7 @@
"error.validation.time": "Inserisci un orario valido",
"error.validation.url": "Inserisci un URL valido",
"field.required": "The field is required",
"field.files.empty": "Nessun file selezionato",
"field.pages.empty": "Nessuna pagina selezionata",
"field.structure.delete.confirm": "Vuoi veramente eliminare questo elemento?",
@@ -291,6 +296,7 @@
"loading": "Caricamento",
"lock.unsaved": "Modifiche non salvate",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Modifiche non salvate di <strong>{email}</strong>",
"lock.file.isLocked": "Il file viene attualmente modificato da {email} e non può essere cambiato.",
"lock.page.isLocked": "la pagina viene attualmente modificata da {email} e non può essere cambiata.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Pubblicato",
"pages.status.unlisted": "Non in elenco",
"pagination.page": "Pagina",
"password": "Password",
"pixel": "Pixel",
"prev": "Precedente",
@@ -384,6 +392,9 @@
"save": "Salva",
"search": "Cerca",
"section.required": "The section is required",
"select": "Seleziona",
"settings": "Impostazioni",
"size": "Dimensioni",

View File

@@ -23,26 +23,27 @@
"delete": "\uc0ad\uc81c",
"dimensions": "크기",
"disabled": "비활성화",
"discard": "무시",
"download": "다운로드",
"duplicate": "복제",
"edit": "\ud3b8\uc9d1",
"dialog.files.empty": "No files to select",
"dialog.pages.empty": "No pages to select",
"dialog.users.empty": "No users to select",
"dialog.files.empty": "선택된 파일이 없습니다.",
"dialog.pages.empty": "선택된 페이지가 없습니다.",
"dialog.users.empty": "선택된 사용자가 없습니다.",
"email": "\uc774\uba54\uc77c \uc8fc\uc18c",
"email.placeholder": "mail@example.com",
"error.access.login": "로그인할 수 없습니다.",
"error.access.panel": "패널에 접근할 권한이 없습니다.",
"error.access.view": "You are not allowed to access this part of the panel",
"error.access.view": "패널에 접근할 권한이 없습니다.",
"error.avatar.create.fail": "프로필 이미지를 업로드할 수 없습니다.",
"error.avatar.delete.fail": "\ud504\ub85c\ud544 \uc774\ubbf8\uc9c0\ub97c \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"error.avatar.dimensions.invalid":
"프로필 이미지의 크기를 가로세로 3,000픽셀 이하로 설정하세요.",
"프로필 이미지의 크기를 3,000픽셀 이하로 설정하세요.",
"error.avatar.mime.forbidden":
"\uc5c5\ub85c\ub4dc\ud560 \uc218 \uc5c6\ub294 MIME \ud615\uc2dd\uc785\ub2c8\ub2e4.",
@@ -52,7 +53,7 @@
"error.field.converter.invalid": "컨버터({converter})가 올바르지 않습니다.",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.empty": "이름을 입력하세요.",
"error.file.changeName.permission":
"파일명({filename})을 변경할 권한이 없습니다.",
"error.file.duplicate": "파일명이 같은 파일({filename})이 있습니다.",
@@ -73,9 +74,9 @@
"error.form.incomplete": "항목에 오류가 있습니다.",
"error.form.notSaved": "항목을 저장할 수 없습니다.",
"error.language.code": "Please enter a valid code for the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "올바른 언어 입력하세요.",
"error.language.code": "올바른 언어 코드를 입력하세요.",
"error.language.duplicate": "이미 등록된 언어입니다.",
"error.language.name": "올바른 언어명을 입력하세요.",
"error.license.format": "올바른 라이선스 키를 입력하세요.",
"error.license.email": "올바른 이메일 주소를 입력하세요.",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "섹션({name})을 불러올 수 없습니다.",
"error.section.type.invalid": "섹션의 형식({type})이 올바르지 않습니다.",
"error.site.changeTitle.empty": "제목을 입력하세요.",
"error.site.changeTitle.permission":
"사이트명을 변경할 권한이 없습니다.",
"error.site.update.permission": "사이트의 정보를 변경할 권한이 없습니다.",
@@ -155,6 +157,8 @@
"최종 관리자의 역할은 변경할 수 없습니다.",
"error.user.changeRole.permission":
"사용자({name})의 역할을 변경할 권한이 없습니다.",
"error.user.changeRole.toAdmin":
"다른 사용자를 관리자로 지정할 권한이 없습니다.",
"error.user.create.permission": "사용자를 등록할 권한이 없습니다.",
"error.user.delete": "사용자({name})를 삭제할 수 없습니다.",
"error.user.delete.lastAdmin": "\ucd5c\uc885 \uad00\ub9ac\uc790\ub294 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
@@ -184,9 +188,9 @@
"error.validation.contains":
"{needle}에 포함된 값을 입력하세요.",
"error.validation.date": "올바른 날짜를 입력하세요.",
"error.validation.date.after": "Please enter a date after {date}",
"error.validation.date.before": "Please enter a date before {date}",
"error.validation.date.between": "Please enter a date between {min} and {max}",
"error.validation.date.after": "{date} 이후 날짜를 입력하세요.",
"error.validation.date.before": "{date} 이전 날짜를 입력하세요.",
"error.validation.date.between": "{min}, {max} 사이의 날짜를 입력하세요.",
"error.validation.denied": "취소하세요.",
"error.validation.different": "{other}에 포함된 값은 입력할 수 없습니다.",
"error.validation.email": "올바른 이메일 주소를 입력하세요.",
@@ -219,6 +223,7 @@
"error.validation.time": "올바른 시간을 입력하세요.",
"error.validation.url": "올바른 URL을 입력하세요.",
"field.required": "필드가 필요합니다.",
"field.files.empty": "선택된 파일이 없습니다.",
"field.pages.empty": "선택된 페이지가 없습니다.",
"field.structure.delete.confirm": "이 행을 삭제할까요?",
@@ -254,7 +259,7 @@
"installation.issues.sessions": "폴더(/site/sessions)에 쓰기 권한이 없습니다.",
"language": "\uc5b8\uc5b4",
"language.code": "코드",
"language.code": "언어 코드",
"language.convert": "기본 언어로 설정",
"language.convert.confirm":
"이 언어({name})를 기본 언어로 설정할까요? 설정한 뒤에는 복원할 수 없습니다. 번역되지 않은 항목은 올바르게 표시되지 않을 수 있습니다.",
@@ -266,7 +271,7 @@
"language.direction.ltr": "왼쪽에서 오른쪽",
"language.direction.rtl": "오른쪽에서 왼쪽",
"language.locale": "PHP 로캘 문자열",
"language.locale.warning": "You are using a custom locale set up. Please modify it in the language file in /site/languages",
"language.locale.warning": "커스텀 언어 설정를 사용 중입니다. /site/languages 폴더의 언어 파일을 수정하세요.",
"language.name": "이름",
"language.updated": "언어를 변경했습니다.",
@@ -280,7 +285,7 @@
"license.buy": "라이선스 구매",
"license.register": "등록",
"license.register.help":
"입력한 이메일 주소로 라이선스 코드를 전송니다. Kirby를 등록하려면 라이선스 코드를 입력하세요.",
"이메일 주소로 라이선스 코드를 전송했습니다. Kirby를 등록하려면 라이선스 코드와 이메일 주소를 입력하세요.",
"license.register.label": "라이선스 코드를 입력하세요.",
"license.register.success": "Kirby를 구입해주셔서 감사합니다.",
"license.unregistered": "Kirby가 등록되지 않았습니다.",
@@ -291,11 +296,12 @@
"loading": "로딩 중",
"lock.unsaved": "수정 사항이 저장되지 않았습니다.",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "<strong>{email}</strong>의 수정 사항이 저장되지 않았습니다.",
"lock.file.isLocked": "다른 사용자({email})가 수정 중입니다.",
"lock.page.isLocked": "다른 사용자({email}가 수정 중입니다.",
"lock.unlock": "잠금",
"lock.isUnlocked": "Your unsaved changes have been overwritten by another user. You can download your changes to merge them manually.",
"lock.isUnlocked": "다른 사용자가 내용을 수정했으므로 내용이 저장되지 않았습니다. 저장되지 않은 내용을 내려받아 수동으로 대치할 수 있습니다.",
"login": "\ub85c\uadf8\uc778",
"login.remember": "로그인 유지",
@@ -364,6 +370,8 @@
"pages.status.listed": "발행",
"pages.status.unlisted": "비공개",
"pagination.page": "페이지",
"password": "\uc554\ud638",
"pixel": "픽셀",
"prev": "이전",
@@ -374,16 +382,19 @@
"revert": "복원",
"role": "역할",
"role.admin.description": "The admin has all rights",
"role.admin.description": "관리자는 모든 권한이 있습니다.",
"role.admin.title": "관리자",
"role.all": "전체 보기",
"role.empty": "이 역할에 해당하는 사용자가 없습니다.",
"role.description.placeholder": "설명이 없습니다.",
"role.nobody.description": "This is a fallback role without any permissions",
"role.nobody.title": "Nobody",
"role.nobody.description": "대체 사용자는 어떤 권한도 없습니다.",
"role.nobody.title": "사용자가 없습니다.",
"save": "\uc800\uc7a5",
"search": "검색",
"section.required": "섹션이 필요합니다.",
"select": "선택",
"settings": "설정",
"size": "크기",
@@ -413,17 +424,17 @@
"translation.name": "한국어",
"upload": "업로드",
"upload.error.cantMove": "The uploaded file could not be moved",
"upload.error.cantWrite": "Failed to write file to disk",
"upload.error.default": "The file could not be uploaded",
"upload.error.extension": "File upload stopped by extension",
"upload.error.cantMove": "업로드한 파일을 이동할 수 없습니다.",
"upload.error.cantWrite": "디스크를 읽을 수 없습니다.",
"upload.error.default": "파일을 업로드할 수 없습니다.",
"upload.error.extension": "파일 확장자를 다시 한번 확인하세요.",
"upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"upload.error.noFile": "No file was uploaded",
"upload.error.noFiles": "No files were uploaded",
"upload.error.partial": "The uploaded file was only partially uploaded",
"upload.error.tmpDir": "Missing a temporary folder",
"upload.error.noFile": "업로드된 파일이 없습니다.",
"upload.error.noFiles": "업로드된 파일이 없습니다.",
"upload.error.partial": "일부 파일만 업로드했습니다.",
"upload.error.tmpDir": "임시 폴더가 없습니다.",
"upload.errors": "오류",
"upload.progress": "업로드 중…",
@@ -432,7 +443,7 @@
"user": "사용자",
"user.blueprint":
"<strong>/site/blueprints/users/{role}.yml</strong> 파일에 옵션을 추가할 수 있습니다.",
"<strong>/site/blueprints/users/{role}.yml</strong> 파일에 섹션 및 폼 필드를 추가할 수 있습니다.",
"user.changeEmail": "이메일 주소 변경",
"user.changeLanguage": "언어 변경",
"user.changeName": "사용자명 변경",

View File

@@ -23,6 +23,7 @@
"delete": "Pašalinti",
"dimensions": "Išmatavimai",
"disabled": "Išjungta",
"discard": "Atšaukti",
"download": "Parsisiųsti",
"duplicate": "Kopijuoti",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Sekcija \"{name}\" negali būti užkrauta",
"error.section.type.invalid": "Sekcijos tipas \"{type}\" yra neteisingas",
"error.site.changeTitle.empty": "Pavadinimas negali būti tuščias",
"error.site.changeTitle.permission":
"Neturite leidimo keisti svetainės pavadinimo",
"error.site.update.permission": "Neturite leidimo atnaujinti svetainės",
@@ -155,6 +157,8 @@
"Vienintelio administratoriaus rolės negalima pakeisti",
"error.user.changeRole.permission":
"Neturite leidimo pakeisti vartotojo \"{name}\" rolės",
"error.user.changeRole.toAdmin":
"Jūs neturite teisių suteikti administratoriaus rolę",
"error.user.create.permission": "Neturite leidimo sukurti šį vartotoją",
"error.user.delete": "Vartotojo \"{name}\" negalima pašalinti",
"error.user.delete.lastAdmin": "Vienintelio administratoriaus negalima pašalinti",
@@ -219,7 +223,8 @@
"error.validation.time": "Prašome įrašyti korektišką laiką",
"error.validation.url": "Prašome įrašyti teisingą URL",
"field.files.empty": "Dar nėra failų",
"field.required": "Laukas privalomas",
"field.files.empty": "Pasirinkti",
"field.pages.empty": "Dar nėra puslapių",
"field.structure.delete.confirm": "Ar tikrai norite pašalinti šią eilutę?",
"field.structure.empty": "Dar nėra įrašų",
@@ -229,7 +234,7 @@
"Ar tikrai norite pašalinti <br><strong>{filename}</strong>?",
"files": "Failai",
"files.empty": "Dar nėra failų",
"files.empty": "Įkelti",
"hour": "Valanda",
"insert": "Įterpti",
@@ -291,6 +296,7 @@
"loading": "Kraunasi",
"lock.unsaved": "Neišsaugoti pakeitimai",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Vartotojo <strong>{email}</strong> neišsaugoti pakeitimai",
"lock.file.isLocked": "Šį failą dabar redaguoja kitas vartotojas {email}, tad jo negalima pekeisti.",
"lock.page.isLocked": "Šį puslapį dabar redaguoja kitas vartotojas {email}, tad jo negalima pekeisti.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Paskelbti",
"pages.status.unlisted": "Nerodomi",
"pagination.page": "Puslapis",
"password": "Slaptažodis",
"pixel": "Pikselis",
"prev": "Ankstesnis",
@@ -384,6 +392,9 @@
"save": "Išsaugoti",
"search": "Ieškoti",
"section.required": "Sekcija privaloma",
"select": "Pasirinkti",
"settings": "Nustatymai",
"size": "Dydis",
@@ -418,7 +429,7 @@
"upload.error.default": "Nepavyko įkelti failo",
"upload.error.extension": "Neįmanoma įkelti tokio tipo failo",
"upload.error.formSize": "Įkeltas failas viršija MAX_FILE_SIZE nustatymą, kuris buvo nurodytas formoje",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniPostSize": "Įkeliamas failas viršija post_max_size nustatymą iš php.ini",
"upload.error.iniSize": "Įkeltas failas viršija upload_max_filesize nustatymą faile php.ini",
"upload.error.noFile": "Failas nebuvo įkeltas",
"upload.error.noFiles": "Failai nebuvo įkelti",

View File

@@ -23,6 +23,7 @@
"delete": "Slett",
"dimensions": "Dimensjoner",
"disabled": "Disabled",
"discard": "Forkast",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Seksjonen \"{name}\" kunne ikke lastes inn",
"error.section.type.invalid": "Seksjonstypen \"{type}\" er ikke gyldig",
"error.site.changeTitle.empty": "Tittelen kan ikke være tom",
"error.site.changeTitle.permission":
"Du har ikke tillatelse til å endre tittel på siden",
"error.site.update.permission": "Du har ikke tillatelse til å oppdatere denne siden",
@@ -155,6 +157,8 @@
"Rollen for den siste administratoren kan ikke endres",
"error.user.changeRole.permission":
"Du har ikke tillatelse til å endre rollen for brukeren \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Du har ikke tilgang til å opprette denne brukeren",
"error.user.delete": "Denne brukeren kunne ikke bli slettet",
"error.user.delete.lastAdmin": "Siste administrator kan ikke slettes",
@@ -219,6 +223,7 @@
"error.validation.time": "Vennligst angi et gyldig tidspunkt",
"error.validation.url": "Vennligst skriv inn en gyldig URL",
"field.required": "The field is required",
"field.files.empty": "Ingen filer har blitt valgt",
"field.pages.empty": "Ingen side har blitt valgt",
"field.structure.delete.confirm": "\u00d8nsker du virkelig \u00e5 slette denne oppf\u00f8ringen?",
@@ -291,6 +296,7 @@
"loading": "Laster inn",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publisert",
"pages.status.unlisted": "Unotert",
"pagination.page": "Side",
"password": "Passord",
"pixel": "Piksel",
"prev": "Forrige",
@@ -384,6 +392,9 @@
"save": "Lagre",
"search": "Søk",
"section.required": "The section is required",
"select": "Velg",
"settings": "Innstillinger",
"size": "Størrelse",

View File

@@ -23,21 +23,22 @@
"delete": "Verwijderen",
"dimensions": "Dimensies",
"disabled": "Uitgeschakeld",
"discard": "Annuleren",
"download": "Download",
"duplicate": "Dupliceren",
"edit": "Wijzig",
"dialog.files.empty": "No files to select",
"dialog.pages.empty": "No pages to select",
"dialog.users.empty": "No users to select",
"dialog.files.empty": "Geen bestanden om te selecteren",
"dialog.pages.empty": "Geen pagina's om te selecteren",
"dialog.users.empty": "Geen gebruikers om te selecteren",
"email": "E-mailadres",
"email.placeholder": "mail@voorbeeld.nl",
"error.access.login": "Ongeldige login",
"error.access.panel": "Je hebt geen toegang tot het Panel",
"error.access.view": "You are not allowed to access this part of the panel",
"error.access.view": "Je hebt geen toegangsrechten voor deze zone van het Panel",
"error.avatar.create.fail": "De avatar kon niet worden geupload",
"error.avatar.delete.fail": "De avatar kan niet worden verwijderd",
@@ -52,7 +53,7 @@
"error.field.converter.invalid": "Ongeldige converter \"{converter}\"",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.empty": "De naam mag niet leeg zijn",
"error.file.changeName.permission":
"Je hebt geen rechten om de naam te wijzigen van \"{filename}\"",
"error.file.duplicate": "Er bestaat al een bestand met de naam \"{filename}\"",
@@ -73,9 +74,9 @@
"error.form.incomplete": "Verbeter alle fouten in het formulier",
"error.form.notSaved": "Het formulier kon niet worden opgeslagen",
"error.language.code": "Please enter a valid code for the language",
"error.language.duplicate": "The language already exists",
"error.language.name": "Please enter a valid name for the language",
"error.language.code": "Vul een geldige code voor deze taal in",
"error.language.duplicate": "De taal bestaat al",
"error.language.name": "Vul een geldige naam voor deze taal in",
"error.license.format": "Vul een gelidge licentie-key in",
"error.license.email": "Gelieve een geldig emailadres in te voeren",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "De zone \"{name}\" kan niet worden geladen",
"error.section.type.invalid": "Zone-type \"{type}\" is niet geldig",
"error.site.changeTitle.empty": "De titel mag niet leeg zijn",
"error.site.changeTitle.permission":
"Je hebt geen rechten om de titel van de site te wijzigen",
"error.site.update.permission": "Je hebt geen rechten om de site te updaten",
@@ -155,6 +157,8 @@
"De rol van de laatste beheerder kan niet worden gewijzigd",
"error.user.changeRole.permission":
"Je hebt geen rechten om de rol van gebruiker \"{name}\" te wijzigen",
"error.user.changeRole.toAdmin":
"Je hebt geen rechten om de rol van iemand te wijzigen naar admin",
"error.user.create.permission": "Je hebt geen rechten om deze gebruiker aan te maken",
"error.user.delete": "De gebruiker \"{name}\" kan niet worden verwijderd",
"error.user.delete.lastAdmin": "Je kan de laatste admin niet verwijderen",
@@ -184,9 +188,9 @@
"error.validation.contains":
"Vul een waarde in die \"{needle}\" bevat",
"error.validation.date": "Vul een geldige datum in",
"error.validation.date.after": "Please enter a date after {date}",
"error.validation.date.before": "Please enter a date before {date}",
"error.validation.date.between": "Please enter a date between {min} and {max}",
"error.validation.date.after": "Vul een datum in na {date}",
"error.validation.date.before": "Vul een datum in voor {date}",
"error.validation.date.between": "Vul een datum in tussen {min} en {max}",
"error.validation.denied": "Weiger",
"error.validation.different": "De invoer mag niet \"{other}\" zijn",
"error.validation.email": "Gelieve een geldig emailadres in te voeren",
@@ -219,6 +223,7 @@
"error.validation.time": "Vul een geldige tijd in",
"error.validation.url": "Vul een geldige URL in",
"field.required": "Dit veld is verplicht",
"field.files.empty": "Nog geen bestanden geselecteerd",
"field.pages.empty": "Nog geen pagina's geselecteerd",
"field.structure.delete.confirm": "Wil je deze entry verwijderen?",
@@ -290,7 +295,8 @@
"loading": "Laden",
"lock.unsaved": "Unsaved changes",
"lock.unsaved": "Niet opgeslagen wijzigingen",
"lock.unsaved.empty": "Er zijn geen niet opgeslagen wijzigingen meer",
"lock.isLocked": "Niet opgeslagen wijzigingen door <strong>{email}</strong>",
"lock.file.isLocked": "Dit bestand wordt momenteel bewerkt door {email} en kan niet worden gewijzigd.",
"lock.page.isLocked": "Deze pagina wordt momenteel bewerkt door {email} en kan niet worden gewijzigd.",
@@ -348,7 +354,7 @@
"page.draft.create": "Maak concept",
"page.duplicate.appendix": "Kopiëren",
"page.duplicate.files": "Kopieer bestanden",
"page.duplicate.pages": "Copy pages",
"page.duplicate.pages": "Kopieer pagina's",
"page.status": "Status",
"page.status.draft": "Concept",
"page.status.draft.description":
@@ -364,6 +370,8 @@
"pages.status.listed": "Gepubliceerd",
"pages.status.unlisted": "Niet gepubliceerd",
"pagination.page": "Pagina",
"password": "Wachtwoord",
"pixel": "Pixel",
"prev": "Vorige",
@@ -384,6 +392,9 @@
"save": "Opslaan",
"search": "Zoeken",
"section.required": "De sectie is verplicht",
"select": "Selecteren",
"settings": "Opties",
"size": "Grootte",
@@ -413,17 +424,17 @@
"translation.name": "Nederlands",
"upload": "Upload",
"upload.error.cantMove": "The uploaded file could not be moved",
"upload.error.cantWrite": "Failed to write file to disk",
"upload.error.default": "The file could not be uploaded",
"upload.error.extension": "File upload stopped by extension",
"upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"upload.error.noFile": "No file was uploaded",
"upload.error.noFiles": "No files were uploaded",
"upload.error.partial": "The uploaded file was only partially uploaded",
"upload.error.tmpDir": "Missing a temporary folder",
"upload.error.cantMove": "Het geüploadde bestand kon niet worden verplaatst",
"upload.error.cantWrite": "Fout bij het schrijven van het bestand naar de schijf",
"upload.error.default": "Het bestand kan niet worden geüpload",
"upload.error.extension": "Kan bestand niet uploaden vanwege de extensie",
"upload.error.formSize": "Het geüploadde bestand is groter dan de MAX_FILE_SIZE die is aangegeven in het formulier",
"upload.error.iniPostSize": "Het geüploadde bestand is groter dan de post_max_size in php.ini",
"upload.error.iniSize": "Het geüploadde bestand is groter dan de upload_max_filesize in php.ini",
"upload.error.noFile": "Er is geen bestand geüpload",
"upload.error.noFiles": "Er zijn geen bestanden geüpload",
"upload.error.partial": "Het geüploadde bestand is slechts gedeeltelijk geüpload",
"upload.error.tmpDir": "Er mist een tijdelijke map",
"upload.errors": "Foutmelding",
"upload.progress": "Uploaden...",

View File

@@ -23,6 +23,7 @@
"delete": "Usu\u0144",
"dimensions": "Wymiary",
"disabled": "Disabled",
"discard": "Odrzu\u0107",
"download": "Pobierz",
"duplicate": "Zduplikuj",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Nie udało się załadować sekcji \"{name}\"",
"error.section.type.invalid": "Typ sekcji \"{type}\" jest nieprawidłowy",
"error.site.changeTitle.empty": "Tytuł nie może być pusty",
"error.site.changeTitle.permission":
"Nie masz uprawnień, by zmienić tytuł strony",
"error.site.update.permission": "Nie masz uprawnień, by zaktualizować stronę",
@@ -155,6 +157,8 @@
"Nie można zmienić roli ostatniego administratora",
"error.user.changeRole.permission":
"Nie masz uprawnień, by zmienić rolę użytkownika \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Nie masz uprawnień, by utworzyć tego użytkownika",
"error.user.delete": "Nie można usunąć użytkownika \"{name}\"",
"error.user.delete.lastAdmin": "Nie można usunąć ostatniego administratora",
@@ -219,6 +223,7 @@
"error.validation.time": "Wprowadź poprawny czas",
"error.validation.url": "Wprowadź poprawny adres URL",
"field.required": "The field is required",
"field.files.empty": "Nie wybrano jeszcze żadnych plików",
"field.pages.empty": "Nie wybrano jeszcze żadnych stron",
"field.structure.delete.confirm": "Czy na pewno chcesz usunąć ten wiersz?",
@@ -291,6 +296,7 @@
"loading": "Ładuję",
"lock.unsaved": "Niezapisane zmiany",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Niezapisane zmiany autorstwa <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Opublikowane",
"pages.status.unlisted": "Nie katalogowana",
"pagination.page": "Strona",
"password": "Has\u0142o",
"pixel": "Piksel",
"prev": "Poprzednie",
@@ -384,6 +392,9 @@
"save": "Zapisz",
"search": "Szukaj",
"section.required": "The section is required",
"select": "Wybierz",
"settings": "Ustawienia",
"size": "Rozmiar",

View File

@@ -23,6 +23,7 @@
"delete": "Excluir",
"dimensions": "Dimensões",
"disabled": "Disabled",
"discard": "Descartar",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "A seção \"{name}\" não pôde ser carregada",
"error.section.type.invalid": "O tipo da seção \"{type}\" não é válido",
"error.site.changeTitle.empty": "O título não pode ficar em branco",
"error.site.changeTitle.permission":
"Você não tem permissão para alterar o título do site",
"error.site.update.permission": "Você não tem permissão para atualizar o site",
@@ -155,6 +157,8 @@
"O papel do último administrador não pode ser alterado",
"error.user.changeRole.permission":
"Você não tem permissão para alterar o papel do usuário \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Você não tem permissão para criar este usuário",
"error.user.delete": "O usuário \"{name}\" não pode ser excluído",
"error.user.delete.lastAdmin": "O último administrador não pode ser excluído",
@@ -219,6 +223,7 @@
"error.validation.time": "Digite uma hora válida",
"error.validation.url": "Digite uma URL válida",
"field.required": "The field is required",
"field.files.empty": "Nenhum arquivo selecionado",
"field.pages.empty": "Nenhuma página selecionada",
"field.structure.delete.confirm": "Deseja realmente excluir este registro?",
@@ -291,6 +296,7 @@
"loading": "Carregando",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publicadas",
"pages.status.unlisted": "Não listadas",
"pagination.page": "Página",
"password": "Senha",
"pixel": "Pixel",
"prev": "Anterior",
@@ -384,6 +392,9 @@
"save": "Salvar",
"search": "Buscar",
"section.required": "The section is required",
"select": "Selecionar",
"settings": "Configurações",
"size": "Tamanho",

View File

@@ -23,6 +23,7 @@
"delete": "Excluir",
"dimensions": "Dimensões",
"disabled": "Disabled",
"discard": "Descartar",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "A seção \"{name}\" não pôde ser carregada",
"error.section.type.invalid": "O tipo da seção \"{type}\" não é válido",
"error.site.changeTitle.empty": "O título não pode ficar em branco",
"error.site.changeTitle.permission":
"Não tem permissões para alterar o título do site",
"error.site.update.permission": "Não tem permissões para atualizar o site",
@@ -155,6 +157,8 @@
"A função do último administrador não pode ser alterado",
"error.user.changeRole.permission":
"Não tem permissões para alterar a função do utilizador \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Não tem permissões para criar este utilizador",
"error.user.delete": "O utilizador \"{name}\" não pode ser excluído",
"error.user.delete.lastAdmin": "O último administrador não pode ser excluído",
@@ -219,6 +223,7 @@
"error.validation.time": "Digite uma hora válida",
"error.validation.url": "Digite uma URL válida",
"field.required": "The field is required",
"field.files.empty": "Nenhum arquivo selecionado",
"field.pages.empty": "Nenhuma página selecionada",
"field.structure.delete.confirm": "Deseja realmente excluir este registro?",
@@ -291,6 +296,7 @@
"loading": "A carregar",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publicadas",
"pages.status.unlisted": "Não listadas",
"pagination.page": "Página",
"password": "Palavra-passe",
"pixel": "Pixel",
"prev": "Anterior",
@@ -384,6 +392,9 @@
"save": "Salvar",
"search": "Buscar",
"section.required": "The section is required",
"select": "Selecionar",
"settings": "Configurações",
"size": "Tamanho",

View File

@@ -23,6 +23,7 @@
"delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c",
"dimensions": "Размеры",
"disabled": "Отключено",
"discard": "\u0421\u0431\u0440\u043e\u0441",
"download": "Скачать",
"duplicate": "Дублировать",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Секция \"{name}\" не может быть загружена",
"error.section.type.invalid": "Тип секции {type} неверный",
"error.site.changeTitle.empty": "Название не может быть пустым",
"error.site.changeTitle.permission":
"У вас нет права поменять название сайта",
"error.site.update.permission": "У вас нет права обновить сайт",
@@ -155,6 +157,8 @@
"Роль единственного администратора нельзя поменять",
"error.user.changeRole.permission":
"У вас нет права поменять поль для пользователя \"{name}\"",
"error.user.changeRole.toAdmin":
"У вас нет прав предоставить роль администратора",
"error.user.create.permission": "У вас нет права создать этого пользователя",
"error.user.delete": "\u0410\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d",
"error.user.delete.lastAdmin": "\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430",
@@ -219,6 +223,7 @@
"error.validation.time": "Пожалуйста, впишите правильную дату",
"error.validation.url": "Пожалуйста, впишите правильный URL",
"field.required": "Поле обязательно",
"field.files.empty": "Еще не выбраны файлы",
"field.pages.empty": "Еще не выбраны страницы",
"field.structure.delete.confirm": "Вы точно хотите удалить эту запись?",
@@ -291,6 +296,7 @@
"loading": "Загрузка",
"lock.unsaved": "Несохраненные изменения",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Несохраненные изменения пользователя <strong>{email}</strong>",
"lock.file.isLocked": "В данный момент этот файл редактирует {email}, поэтому его нельзя изменить.",
"lock.page.isLocked": "В данный момент эту страницу редактирует {email}, поэтому его нельзя изменить.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Опубликовано",
"pages.status.unlisted": "Скрытая",
"pagination.page": "Страница",
"password": "\u041f\u0430\u0440\u043e\u043b\u044c",
"pixel": "Пиксель",
"prev": "Предыдущий",
@@ -384,6 +392,9 @@
"save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c",
"search": "Поиск",
"section.required": "Секция обязательна",
"select": "Выбрать",
"settings": "Настройка",
"size": "Размер",
@@ -418,7 +429,7 @@
"upload.error.default": "Не получилось загрузить файл",
"upload.error.extension": "Загрузка файла не удалась из за расширения",
"upload.error.formSize": "Загруженный файл больше чем MAX_FILE_SIZE настройка в форме",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniPostSize": "Загружаемый файл больше чем post_max_size настройка в php.ini",
"upload.error.iniSize": "Загруженный файл больше чем upload_max_filesize настройка в php.ini",
"upload.error.noFile": "Файл не был загружен",
"upload.error.noFiles": "Файлы не были загружены",

View File

@@ -23,6 +23,7 @@
"delete": "Zmazať",
"dimensions": "Rozmery",
"disabled": "Disabled",
"discard": "Zahodiť",
"download": "Download",
"duplicate": "Duplicate",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Sekciu \"{name}\" sa nepodarilo nahrať",
"error.section.type.invalid": "Typ sekcie \"{type}\" nie je platný",
"error.site.changeTitle.empty": "Titulok nemôže byť prázdny",
"error.site.changeTitle.permission":
"Nemáte povolenie na zmenu titulku pre portál",
"error.site.update.permission": "Nemáte povolenie na aktualizovanie portálu",
@@ -155,6 +157,8 @@
"Rolu pre posledného administrátora nie je možné zmeniť",
"error.user.changeRole.permission":
"Nemáte povolenie na zmenu role pre užívateľa \"{name}\"",
"error.user.changeRole.toAdmin":
"You are not allowed to promote someone to the admin role",
"error.user.create.permission": "Nemáte povolenie na vytvorenie tohto užívateľa",
"error.user.delete": "Užívateľa \"{name}\" nie je možné zmazať",
"error.user.delete.lastAdmin": "Posledného administrátora nie je možné zmazať",
@@ -219,6 +223,7 @@
"error.validation.time": "Prosím, zadajte platný čas",
"error.validation.url": "Prosím, zadajte platnú URL",
"field.required": "The field is required",
"field.files.empty": "Žiadne súbory zatiaľ neboli zvolené",
"field.pages.empty": "Žiadne stránky zatiaľ neboli zvolené",
"field.structure.delete.confirm": "Ste si istý, že chcete zmazať tento riadok?",
@@ -291,6 +296,7 @@
"loading": "Načítavanie",
"lock.unsaved": "Unsaved changes",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Unsaved changes by <strong>{email}</strong>",
"lock.file.isLocked": "The file is currently being edited by {email} and cannot be changed.",
"lock.page.isLocked": "The page is currently being edited by {email} and cannot be changed.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Zverejnené",
"pages.status.unlisted": "Skryté",
"pagination.page": "Stránka",
"password": "Heslo",
"pixel": "Pixel",
"prev": "Predchádzajúci",
@@ -384,6 +392,9 @@
"save": "Uložiť",
"search": "Hľadať",
"section.required": "The section is required",
"select": "Zvoliť",
"settings": "Nastavenia",
"size": "Veľkosť",

View File

@@ -23,6 +23,7 @@
"delete": "Radera",
"dimensions": "Dimensioner",
"disabled": "Inaktiverad",
"discard": "Kassera",
"download": "Ladda ner",
"duplicate": "Duplicera",
@@ -37,7 +38,7 @@
"error.access.login": "Ogiltig inloggning",
"error.access.panel": "Du saknar behörighet att nå panelen",
"error.access.view": "You are not allowed to access this part of the panel",
"error.access.view": "Du saknar behörighet att nå denna del av panelen",
"error.avatar.create.fail": "Profilbilden kunde inte laddas upp",
"error.avatar.delete.fail": "Profilbilden kunde inte raderas",
@@ -52,7 +53,7 @@
"error.field.converter.invalid": "Ogiltig omvandlare \"{converter}\"",
"error.file.changeName.empty": "The name must not be empty",
"error.file.changeName.empty": "Namnet får inte vara tomt",
"error.file.changeName.permission":
"Du har inte behörighet att ändra namnet på \"{filename}\"",
"error.file.duplicate": "En fil med namnet \"{filename}\" existerar redan",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "Sektionen \"{name}\" kunde inte laddas",
"error.section.type.invalid": "Sektionstypen \"{type}\" är inte giltig",
"error.site.changeTitle.empty": "Titeln får inte vara tom",
"error.site.changeTitle.permission":
"Du har inte behörighet att ändra titeln på webbplatsen",
"error.site.update.permission": "Du har inte behörighet att uppdatera webbplatsen",
@@ -155,6 +157,8 @@
"Rollen för den återstående adminanvändaren kan inte ändras",
"error.user.changeRole.permission":
"Du har inte behörighet att ändra rollen för användaren \"{name}\"",
"error.user.changeRole.toAdmin":
"Du har inte behörighet att ge någon en administratörsroll",
"error.user.create.permission": "Du har inte behörighet att skapa denna användare",
"error.user.delete": "Användaren kan inte raderas",
"error.user.delete.lastAdmin": "Den återstående administratören kan inte raderas",
@@ -219,6 +223,7 @@
"error.validation.time": "Ange en giltig tid",
"error.validation.url": "Ange en giltig URL",
"field.required": "Fältet krävs",
"field.files.empty": "Inga filer valda än",
"field.pages.empty": "Inga sidor valda än",
"field.structure.delete.confirm": "Vill du verkligen radera denna rad?",
@@ -291,6 +296,7 @@
"loading": "Laddar",
"lock.unsaved": "Osparade ändringar",
"lock.unsaved.empty": "There are no more unsaved changes",
"lock.isLocked": "Osparade ändringar av <strong>{email}</strong>",
"lock.file.isLocked": "Filen redigeras just nu av {email} och kan inte redigeras.",
"lock.page.isLocked": "Sidan redigeras just nu av {email} och kan inte redigeras.",
@@ -364,6 +370,8 @@
"pages.status.listed": "Publicerade",
"pages.status.unlisted": "Olistade",
"pagination.page": "Sida",
"password": "L\u00f6senord",
"pixel": "Pixel",
"prev": "Föregående",
@@ -384,6 +392,9 @@
"save": "Spara",
"search": "Sök",
"section.required": "Sektionen krävs",
"select": "Välj",
"settings": "Inställningar",
"size": "Storlek",
@@ -413,17 +424,17 @@
"translation.name": "Svenska",
"upload": "Ladda upp",
"upload.error.cantMove": "The uploaded file could not be moved",
"upload.error.cantWrite": "Failed to write file to disk",
"upload.error.default": "The file could not be uploaded",
"upload.error.extension": "File upload stopped by extension",
"upload.error.formSize": "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the form",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniSize": "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"upload.error.noFile": "No file was uploaded",
"upload.error.noFiles": "No files were uploaded",
"upload.error.partial": "The uploaded file was only partially uploaded",
"upload.error.tmpDir": "Missing a temporary folder",
"upload.error.cantMove": "Den överförda filen kunde inte flyttas",
"upload.error.cantWrite": "Det gick inte att skriva filen till hårddisken",
"upload.error.default": "Filen kunde inte laddas upp",
"upload.error.extension": "Filuppladdningen förhindrades på grund av filändelsen",
"upload.error.formSize": "Den överförda filen överskrider den maximala filstorlek som anges i formuläret (MAX_FILE_SIZE)",
"upload.error.iniPostSize": "Den överförda filen överskrider post_max_size-direktivet i php.ini",
"upload.error.iniSize": "Den överförda filen överskrider direktivet upload_max_filesize i php.ini",
"upload.error.noFile": "Ingen fil laddades upp",
"upload.error.noFiles": "Inga filer laddades upp",
"upload.error.partial": "Den överförda filen laddades bara delvis upp",
"upload.error.tmpDir": "Saknar en temporär mapp",
"upload.errors": "Fel",
"upload.progress": "Laddar upp...",

View File

@@ -23,6 +23,7 @@
"delete": "Sil",
"dimensions": "Boyutlar",
"disabled": "Devredışı",
"discard": "Vazge\u00e7",
"download": "İndir",
"duplicate": "Kopyala",
@@ -137,6 +138,7 @@
"error.section.notLoaded": "\"{name}\" bölümü yüklenemedi",
"error.section.type.invalid": "\"{type}\" tipi geçerli değil",
"error.site.changeTitle.empty": "Başlık boş bırakılamaz",
"error.site.changeTitle.permission":
"Sitenin başlığını değiştiremezsin",
"error.site.update.permission": "Siteyi güncellemenize izin verilmiyor",
@@ -155,6 +157,8 @@
"Son yöneticinin rolü değiştirilemez",
"error.user.changeRole.permission":
"\"{name}\" kullanıcısının rolünü değiştiremezsin",
"error.user.changeRole.toAdmin":
"Birini yönetici rolüne tanıtmanıza izin verilmiyor",
"error.user.create.permission": "Bu kullanıcıyı oluşturmanıza izin verilmiyor",
"error.user.delete": "\"{name}\" kullanıcısı silinemedi",
"error.user.delete.lastAdmin": "Son y\u00f6netici kullan\u0131c\u0131y\u0131 silemezsiniz",
@@ -219,6 +223,7 @@
"error.validation.time": "Lütfen geçerli bir zaman girin",
"error.validation.url": "Lütfen geçerli bir adres girin",
"field.required": "Alan gereklidir",
"field.files.empty": "Henüz dosya seçilmedi",
"field.pages.empty": "Henüz sayfa seçilmedi",
"field.structure.delete.confirm": "Bu girdiyi silmek istedi\u011finizden emin misiniz?",
@@ -291,6 +296,7 @@
"loading": "Yükleniyor",
"lock.unsaved": "Kaydedilmemiş değişiklikler",
"lock.unsaved.empty": "Daha fazla kaydedilmemiş değişiklik yok",
"lock.isLocked": "<strong>{email}</strong> tarafından kaydedilmemiş değişiklikler",
"lock.file.isLocked": "Dosya şu anda {email} tarafından düzenlenmektedir ve değiştirilemez.",
"lock.page.isLocked": "Sayfa şu anda {email} tarafından düzenlenmektedir ve değiştirilemez.",
@@ -346,7 +352,7 @@
"<strong>Bu sayfada alt sayfalar var</strong>. <br>Tüm alt sayfalar da silinecek.",
"page.delete.confirm.title": "Onaylamak için sayfa başlığını girin",
"page.draft.create": "Taslak oluştur",
"page.duplicate.appendix": "Kopyala",
"page.duplicate.appendix": "Kopya",
"page.duplicate.files": "Dosyaları kopyala",
"page.duplicate.pages": "Sayfaları kopyala",
"page.status": "Durum",
@@ -364,6 +370,8 @@
"pages.status.listed": "Yayınlandı",
"pages.status.unlisted": "Liste Dışı",
"pagination.page": "Sayfa",
"password": "\u015eifre",
"pixel": "Piksel",
"prev": "Önceki",
@@ -384,6 +392,9 @@
"save": "Kaydet",
"search": "Arama",
"section.required": "Bölüm gereklidir",
"select": "Seç",
"settings": "Ayarlar",
"size": "Boyut",
@@ -418,7 +429,7 @@
"upload.error.default": "Dosya yüklenemedi",
"upload.error.extension": "Dosya yükleme uzantısı tarafından durduruldu",
"upload.error.formSize": "Yüklenen dosya, formda belirtilen MAX_FILE_SIZE yönergesini aşıyor",
"upload.error.iniPostSize": "The uploaded file exceeds the post_max_size directive in php.ini",
"upload.error.iniPostSize": "Yüklenen dosya php.ini içindeki post_max_size yönergesini aşıyor",
"upload.error.iniSize": "Yüklenen dosya php.ini içindeki upload_max_filesize yönergesini aşıyor",
"upload.error.noFile": "Dosya yüklenmedi",
"upload.error.noFiles": "Dosyalar yüklenmedi",

File diff suppressed because one or more lines are too long

View File

@@ -30,12 +30,32 @@
<symbol id="icon-bars" viewBox="0 0 16 16">
<path d="M15 7H1c-.6 0-1 .4-1 1s.4 1 1 1h14c.6 0 1-.4 1-1s-.4-1-1-1zM15 1H1c-.6 0-1 .4-1 1s.4 1 1 1h14c.6 0 1-.4 1-1s-.4-1-1-1zM15 13H1c-.6 0-1 .4-1 1s.4 1 1 1h14c.6 0 1-.4 1-1s-.4-1-1-1z" />
</symbol>
<symbol id="icon-bell" viewBox="0 0 16 16">
<path d="M10,14H6c0,1.1,0.9,2,2,2S10,15.1,10,14z"/>
<path d="M15,11h-0.5C13.8,10.3,13,9.3,13,8V5c0-2.8-2.2-5-5-5S3,2.2,3,5v3c0,1.3-0.8,2.3-1.5,3H1c-0.6,0-1,0.4-1,1 s0.4,1,1,1h14c0.6,0,1-0.4,1-1S15.6,11,15,11z"/>
</symbol>
<symbol id="icon-bold" viewBox="0 0 16 16">
<path d="M11.561 7.316a3.485 3.485 0 0 0 1.418-3.208C12.781 2.305 11.144.999 9.33.999H2.001v1l1.447.724a1 1 0 0 1 .553.894v8.764a.998.998 0 0 1-.553.894l-1.447.724v1h7.823c2.104 0 3.98-1.547 4.162-3.643a4 4 0 0 0-2.424-4.04zM7 3h1a2 2 0 1 1 0 4H7V3zm2 10H7V9h2a2 2 0 1 1 0 4z" />
</symbol>
<symbol id="icon-bolt" viewBox="0 0 16 16">
<path d="M9.2 0H5.4c-.4 0-.8.3-1 .7l-2 7c-.2.7.3 1.3.9 1.3H7l-1.5 7 7.3-9.4c.5-.6 0-1.6-.8-1.6H9l1.1-3.7C10.3.6 9.8 0 9.2 0z" />
</symbol>
<symbol id="icon-book" viewBox="0 0 16 16">
<path d="M7.6,15.9l-7-3C0.2,12.8,0,12.4,0,12V1c0-0.7,0.7-1.2,1.4-0.9L8,2.9l6.6-2.8C15.3-0.2,16,0.3,16,1v11 c0,0.4-0.2,0.8-0.6,0.9l-7,3C8.1,16,7.9,16,7.6,15.9z M2,11.3l6,2.6l6-2.6V2.5L8.4,4.9C8.1,5,7.9,5,7.6,4.9L2,2.5V11.3z"/>
<rect x="2.8" y="6.2" transform="matrix(0.9191 0.3939 -0.3939 0.9191 3.0495 -1.4271)" width="4.4" height="1"/>
<rect x="2.8" y="9.4" transform="matrix(0.9191 0.3939 -0.3939 0.9191 4.2872 -1.173)" width="4.4" height="1"/>
<rect x="10.5" y="4.5" transform="matrix(0.3937 0.9192 -0.9192 0.3937 12.8415 -6.0395)" width="1" height="4.4"/>
<rect x="10.5" y="7.7" transform="matrix(0.3937 0.9192 -0.9192 0.3937 15.7298 -4.1344)" width="1" height="4.4"/>
</symbol>
<symbol id="icon-bookmark" viewBox="0 0 16 16">
<path d="M4,0C2.9,0,2,0.9,2,2v14l6-3l6,3V2c0-1.1-0.9-2-2-2H4z"/>
</symbol>
<symbol id="icon-box" viewBox="0 0 16 16">
<path d="M15.4,3.1l-7-3C8.1,0,7.9,0,7.6,0.1l-7,3C0.2,3.2,0,3.6,0,4v8c0,0.4,0.2,0.8,0.6,0.9l7,3C7.7,16,7.9,16,8,16 s0.3,0,0.4-0.1l7-3c0.4-0.2,0.6-0.5,0.6-0.9V4C16,3.6,15.8,3.2,15.4,3.1z M8,2.1L12.5,4L8,5.9L3.5,4L8,2.1z M2,5.5l5,2.1v5.8l-5-2.1 V5.5z M9,13.5V7.7l5-2.1v5.8L9,13.5z"/>
</symbol>
<symbol id="icon-bug" viewBox="0 0 16 16">
<path d="M16,4V3h-2v1c0,0.6-0.4,1-1,1h-1c-0.3-0.4-0.6-0.7-1-1V3c0-1.7-1.3-3-3-3S5,1.3,5,3v1C4.6,4.3,4.3,4.6,4,5H3 C2.4,5,2,4.6,2,4V3H0v1c0,1.7,1.3,3,3,3h0.1C3,7.3,3,7.7,3,8H0v2h3v1c-1.7,0-3,1.3-3,3v1h2v-1c0-0.6,0.4-1,1-1h0.4 C4.2,14.8,6,16,8,16s3.8-1.2,4.6-3H13c0.6,0,1,0.4,1,1v1h2v-1c0-1.7-1.3-3-3-3v-1h3V8h-3c0-0.3,0-0.7-0.1-1H13C14.7,7,16,5.7,16,4z"/>
</symbol>
<symbol id="icon-calendar" viewBox="0 0 16 16">
<path d="M15 2h-2V0h-2v2H9V0H7v2H5V0H3v2H1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1zm-1 12H2V5h12v9z" />
<path d="M4 7h2v2H4V7zM7 7h2v2H7V7zM4 10h2v2H4v-2zM7 10h2v2H7v-2zM10 7h2v2h-2V7zM10 10h2v2h-2v-2z" />
@@ -44,10 +64,40 @@
<path d="M10.1 4.5L8 6.6 5.9 4.5 4.5 5.9 6.6 8l-2.1 2.1 1.4 1.4L8 9.4l2.1 2.1 1.4-1.4L9.4 8l2.1-2.1z" />
<path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6z" />
</symbol>
<symbol id="icon-car" viewBox="0 0 16 16">
<path d="M15.9,8.6L15,6.7l-1-5.9C13.9,0.4,13.5,0,13,0H3C2.5,0,2.1,0.4,2,0.8L1,6.7L0.1,8.6C0,8.7,0,8.8,0,9v4 c0,0.6,0.4,1,1,1v1c0,0.6,0.4,1,1,1h2c0.6,0,1-0.4,1-1v-1h6v1c0,0.6,0.4,1,1,1h2c0.6,0,1-0.4,1-1v-1c0.6,0,1-0.4,1-1V9 C16,8.8,16,8.7,15.9,8.6z M3.8,2h8.3l0.7,4H3.2L3.8,2z M2,12V9.2L2.6,8h10.8L14,9.2V12H2z"/>
<circle cx="4" cy="10" r="1"/>
<circle cx="12" cy="10" r="1"/>
</symbol>
<symbol id="icon-cart" viewBox="0 0 16 16">
<path d="M15,3H4.5L4,0.8C3.9,0.3,3.5,0,3,0H0v2h2.2L4,10.2C4.1,10.7,4.5,11,5,11h8c0.4,0,0.8-0.3,0.9-0.7l2-6 C16.1,3.8,15.8,3,15,3z" />
<circle cx="5" cy="14" r="2" />
<circle cx="13" cy="14" r="2" />
</symbol>
<symbol id="icon-chart" viewBox="0 0 16 16">
<path d="M1,15h13c0.552,0,1-0.448,1-1v0c0-0.552-0.448-1-1-1H1c-0.552,0-1,0.448-1,1v0 C0,14.552,0.448,15,1,15z"/>
<rect x="6" y="1" width="3" height="10"/>
<rect x="1" y="5" width="3" height="6"/>
<rect x="11" y="7" width="3" height="4"/>
</symbol>
<symbol id="icon-chat" viewBox="0 0 16 16">
<path d="M15,4h-1v6c0,0.552-0.448,1-1,1H6.828L5,13h5l3,3v-3h2c0.552,0,1-0.448,1-1V5 C16,4.448,15.552,4,15,4z"/>
<path d="M1,0h10c0.552,0,1,0.448,1,1v7c0,0.552-0.448,1-1,1H6l-3,3V9H1C0.448,9,0,8.552,0,8V1C0,0.448,0.448,0,1,0z"/>
</symbol>
<symbol id="icon-check" viewBox="0 0 16 16">
<path d="M8 0C3.589 0 0 3.589 0 8s3.589 8 8 8 8-3.589 8-8-3.589-8-8-8zm0 14c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6z" />
<path d="M7 11.414L3.586 8 5 6.586l2 2 4-4L12.414 6z" />
</symbol>
<symbol id="icon-circle" viewBox="0 0 16 16">
<circle cx="8" cy="8" r="8" />
</symbol>
<symbol id="icon-circle-filled" viewBox="0 0 16 16">
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6 S11.3,14,8,14z" />
<circle cx="8" cy="8" r="4" />
</symbol>
<symbol id="icon-circle-outline" viewBox="0 0 16 16">
<path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6z" />
</symbol>
<symbol id="icon-clock" viewBox="0 0 16 16">
<path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6z" />
<path d="M9 4H7v5h5V7H9z" />
@@ -65,6 +115,10 @@
<path d="M10 4H2c-.6 0-1 .4-1 1v10c0 .6.4 1 1 1h8c.6 0 1-.4 1-1V5c0-.6-.4-1-1-1z" />
<path d="M14 0H4v2h9v11h2V1c0-.6-.4-1-1-1z" />
</symbol>
<symbol id="icon-credit-card" viewBox="0 0 16 16">
<path d="M16,5V3c0-0.6-0.4-1-1-1H1C0.4,2,0,2.4,0,3v2H16z"/>
<path d="M0,7v6c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1V7H0z M6,11H2v-1h4V11z M14,11h-2v-1h2V11z"/>
</symbol>
<symbol id="icon-dashboard" viewBox="0 0 16 16">
<path d="M6 9H1a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1zM6 16H1a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1zM15 6h-5a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1zM15 16h-5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1z" />
</symbol>
@@ -159,6 +213,9 @@
<path d="M28,32H0V0h28V32z M2,30h24V2H2V30z" />
<path d="M19.5,22h-11C6.6,22,5,20.4,5,18.5c0-1.8,1.3-3.3,3.1-3.5c0.5-2.8,2.9-5,5.9-5s5.5,2.2,5.9,5 c1.7,0.2,3.1,1.7,3.1,3.5C23,20.4,21.4,22,19.5,22z M8.5,17C7.7,17,7,17.7,7,18.5S7.7,20,8.5,20h11c0.8,0,1.5-0.7,1.5-1.5 S20.3,17,19.5,17c-0.1,0-0.2,0-0.3,0L18,17.3l0-1.3c0-2.2-1.8-3.9-4-3.9c-2.2,0-4,1.8-4,3.9l0,0.1v1.2L8.8,17C8.7,17,8.6,17,8.5,17 z" />
</symbol>
<symbol id="icon-folder" viewBox="0 0 16 16">
<path d="M15,3H8V1c0-0.6-0.4-1-1-1H1C0.4,0,0,0.4,0,1v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1V4C16,3.4,15.6,3,15,3z M6,2v2c0,0.6,0.4,1,1,1h7v2H2V2H6z M2,14V9h12v5H2z"/>
</symbol>
<symbol id="icon-funnel" viewBox="0 0 16 16">
<path d="M9 15H7a1 1 0 0 1 0-2h2a1 1 0 0 1 0 2zM11 11H5a1 1 0 0 1 0-2h6a1 1 0 0 1 0 2zM13 7H3a1 1 0 0 1 0-2h10a1 1 0 0 1 0 2zM15 3H1a1 1 0 0 1 0-2h14a1 1 0 0 1 0 2z" />
</symbol>
@@ -168,6 +225,13 @@
<symbol id="icon-headline" viewBox="0 0 16 16">
<path d="M0 0v6h1l2-3h3v10l-3 2v1h10v-1l-3-2V3h3l2 3h1V0z" />
</symbol>
<symbol id="icon-heart" viewBox="0 0 16 16">
<path d="M11.6,0C10.1,0,8.8,0.8,8,2C7.2,0.8,5.9,0,4.4,0C2,0,0,2,0,4.4c0,4.4,8,10.9,8,10.9s8-6.5,8-10.9 C16,2,14,0,11.6,0z"/>
</symbol>
<symbol id="icon-home" viewBox="0 0 16 16">
<rect x="6" y="6" width="4" height="2"/>
<path d="M15.651,6.241l-7-6c-0.375-0.322-0.927-0.322-1.302,0L4,3.112V2c0-0.553-0.448-1-1-1S2,1.447,2,2v2.826 L0.349,6.241C-0.07,6.601-0.119,7.231,0.241,7.65c0.359,0.42,0.99,0.468,1.41,0.108L2,7.46V15c0,0.553,0.448,1,1,1h10 c0.552,0,1-0.447,1-1V7.46l0.349,0.299C14.538,7.921,14.769,8,15,8c0.282,0,0.562-0.118,0.76-0.35 C16.119,7.231,16.07,6.601,15.651,6.241z M12,14h-2v-4H6v4H4V5.746l4-3.428l4,3.428V14z"/>
</symbol>
<symbol id="icon-image" viewBox="0 0 16 16">
<path d="M15 16H1c-.6 0-1-.4-1-1V1c0-.6.4-1 1-1h14c.6 0 1 .4 1 1v14c0 .6-.4 1-1 1zM2 14h12V2H2v12z" />
<path d="M6 4c.6 0 1 .4 1 1s-.4 1-1 1-1-.4-1-1 .4-1 1-1zM3 12l2-4 2 2 3-4 3 6z" />
@@ -186,6 +250,14 @@
<symbol id="icon-key" viewBox="0 0 16 16">
<path d="M12.7 0L6.5 6.3C6 6.1 5.5 6 5 6c-2.8 0-5 2.2-5 5s2.2 5 5 5 5-2.2 5-5c0-.5-.1-1.1-.3-1.6L11 8V6h2V4h2l1-1V0h-3.3zM4.5 12c-.8 0-1.5-.7-1.5-1.5S3.7 9 4.5 9 6 9.7 6 10.5 5.3 12 4.5 12z" />
</symbol>
<symbol id="icon-layers" viewBox="0 0 16 16">
<path d="M8,6H1C0.4,6,0,6.4,0,7v8c0,0.6,0.4,1,1,1h7c0.6,0,1-0.4,1-1V7C9,6.4,8.6,6,8,6z"/>
<path d="M11,3H3v2h7v8h2V4C12,3.4,11.6,3,11,3z"/>
<path d="M14,0H6v2h7v8h2V1C15,0.4,14.6,0,14,0z"/>
</symbol>
<symbol id="icon-linkedin" viewBox="0 0 16 16">
<path d="M15.3,0H0.7C0.3,0,0,0.3,0,0.7v14.7C0,15.7,0.3,16,0.7,16h14.7c0.4,0,0.7-0.3,0.7-0.7V0.7 C16,0.3,15.7,0,15.3,0z M4.7,13.6H2.4V6h2.4V13.6z M3.6,5C2.8,5,2.2,4.3,2.2,3.6c0-0.8,0.6-1.4,1.4-1.4c0.8,0,1.4,0.6,1.4,1.4 C4.9,4.3,4.3,5,3.6,5z M13.6,13.6h-2.4V9.9c0-0.9,0-2-1.2-2c-1.2,0-1.4,1-1.4,2v3.8H6.2V6h2.3v1h0c0.3-0.6,1.1-1.2,2.2-1.2 c2.4,0,2.8,1.6,2.8,3.6V13.6z"/>
</symbol>
<symbol id="icon-list-bullet" viewBox="0 0 16 16">
<path d="M4 2a2 2 0 1 1-3.999.001A2 2 0 0 1 4 2zM4 8a2 2 0 1 1-3.999.001A2 2 0 0 1 4 8zM4 14a2 2 0 1 1-3.999.001A2 2 0 0 1 4 14zM6 1h10v2H6V1zM6 7h10v2H6V7zM6 13h10v2H6v-2z" />
</symbol>
@@ -198,13 +270,13 @@
<symbol id="icon-lock" viewBox="0 0 16 16">
<path d="M8 0C5.8 0 4 1.8 4 4v1H2c-.6 0-1 .4-1 1v9c0 .6.4 1 1 1h12c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1h-2V4c0-2.2-1.8-4-4-4zm1 11.7V13H7v-1.3c-.6-.3-1-1-1-1.7 0-1.1.9-2 2-2s2 .9 2 2c0 .7-.4 1.4-1 1.7zM10 5H6V4c0-1.1.9-2 2-2s2 .9 2 2v1z" />
</symbol>
<symbol id="icon-unlock" viewBox="0 0 16 16">
<path d="M1,15c0,0.6,0.4,1,1,1h12c0.6,0,1-0.4,1-1V6c0-0.6-0.4-1-1-1h-2H6V4c0-1.1,0.9-2,2-2c0.6,0,1.1,0.2,1.5,0.7 l0.7,0.7l1.5-1.3L11,1.3C10.2,0.5,9.1,0,8,0C5.8,0,4,1.8,4,4v1H2C1.4,5,1,5.4,1,6V15z M8,8c1.1,0,2,0.9,2,2c0,0.7-0.4,1.4-1,1.7V13 H7v-1.3c-0.6-0.3-1-1-1-1.7C6,8.9,6.9,8,8,8z" />
</symbol>
<symbol id="icon-logout" viewBox="0 0 16 16">
<path d="M3.4 2H8v2h2V1c0-.6-.4-1-1-1H1C.4 0 0 .4 0 1v9c0 .3.1.5.3.7l5 5c.2.2.4.3.7.3.1 0 .3 0 .4-.1.4-.1.6-.5.6-.9V6c0-.3-.1-.5-.3-.7L3.4 2zM5 12.6l-3-3V3.4l3 3v6.2z" />
<path d="M15.7 7.3L12 3.6 10.6 5l2 2H8v2h4.6l-2 2 1.4 1.4 3.7-3.7c.4-.4.4-1 0-1.4z" />
</symbol>
<symbol id="icon-map" viewBox="0 0 16 16">
<path d="M14.6,0.1L10,1.9L6.4,0.1C6.2,0,5.9,0,5.6,0.1l-5,2C0.2,2.2,0,2.6,0,3v12c0,0.7,0.7,1.2,1.4,0.9L6,14.1 l3.6,1.8c0.3,0.1,0.5,0.1,0.8,0l5-1.9c0.4-0.1,0.6-0.5,0.6-0.9V1C16,0.3,15.3-0.2,14.6,0.1z M7,2.6l2,1v9.8l-2-1V2.6z M2,3.7l3-1.2 v9.8l-3,1.2V3.7z M14,12.4l-3,1.1V3.7l3-1.2V12.4z"/>
</symbol>
<symbol id="icon-markdown" viewBox="0 0 16 16">
<path d="M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z" />
</symbol>
@@ -219,6 +291,9 @@
<path d="M14 0H2c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h12c.6 0 1-.4 1-1V1c0-.6-.4-1-1-1zm-1 14H3V2h10v12z" />
<path d="M4 3h4v4H4V3zM9 4h3v1H9V4zM9 6h3v1H9V6zM4 8h8v1H4V8zM4 10h8v1H4v-1zM4 12h5v1H4v-1z" />
</symbol>
<symbol id="icon-parent" viewBox="0 0 16 16">
<path d="M14,6H3.4l4-4L6,0.6L0.3,6.3c-0.4,0.4-0.4,1,0,1.4L6,13.4L7.4,12l-4-4H13v7h2V7C15,6.4,14.6,6,14,6z" />
</symbol>
<symbol id="icon-phone" viewBox="0 0 16 16">
<path d="M15.285 12.305l-2.578-2.594a1 1 0 0 0-1.416-.002L9 12 4 7l2.294-2.294a1 1 0 0 0 .001-1.414L3.715.708a1 1 0 0 0-1.415 0L.004 3.003 0 3c0 7.18 5.82 13 13 13l2.283-2.283a1 1 0 0 0 .002-1.412z" />
</symbol>
@@ -229,18 +304,34 @@
<path d="M8 14c4.707 0 7.744-5.284 7.871-5.508a1 1 0 0 0 .001-.98C15.746 7.287 12.731 2 8 2 3.245 2 .251 7.289.126 7.514a.998.998 0 0 0 .002.975C.254 8.713 3.269 14 8 14zM8 4c2.839 0 5.036 2.835 5.818 4-.784 1.166-2.981 4-5.818 4-2.841 0-5.038-2.838-5.819-4.001C2.958 6.835 5.146 4 8 4z" />
<path d="M10 8a2 2 0 1 1-3.999.001A2 2 0 0 1 10 8z" />
</symbol>
<symbol id="icon-protected" viewBox="0 0 16 16">
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,2c1.3,0,2.5,0.4,3.5,1.1l-8.4,8.4 C2.4,10.5,2,9.3,2,8C2,4.7,4.7,2,8,2z M8,14c-1.3,0-2.5-0.4-3.5-1.1l8.4-8.4C13.6,5.5,14,6.7,14,8C14,11.3,11.3,14,8,14z" />
</symbol>
<symbol id="icon-question" viewBox="0 0 16 16">
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6 S11.3,14,8,14z"/>
<circle cx="8" cy="12" r="1"/>
<path d="M7.1,5.5C7.3,5.2,7.6,5,8,5c0.6,0,1,0.4,1,1c0,0.3-0.1,0.4-0.6,0.7C7.8,7.1,7,7.7,7,9v1h2V9 c0-0.2,0-0.3,0.5-0.6C10.1,8,11,7.4,11,6c0-1.7-1.3-3-3-3C6.9,3,5.9,3.6,5.4,4.5L4.9,5.4l1.7,1L7.1,5.5z"/>
</symbol>
<symbol id="icon-quote" viewBox="0 0 16 16">
<path d="M3.024 4.561C1.839 6.042 1.668 7.535 2.016 8.58c1.316-1.045 3.145-.826 4.258.214 1.125 1.051 1.222 2.898.504 4.094a3.293 3.293 0 0 1-2.847 1.613C1.238 14.501 0 12.126 0 9.462c0-1.73.441-3.28 1.323-4.649S3.536 2.34 5.317 1.5l.479.932c-1.075.454-1.999 1.163-2.772 2.129zm8.768 0c-1.185 1.481-1.356 2.974-1.008 4.019.588-.454 1.226-.68 1.915-.68C14.511 7.9 16 9.107 16 11.201c0 1.926-1.478 3.301-3.301 3.301-2.693 0-3.931-2.375-3.931-5.039 0-1.73.441-3.28 1.323-4.649s2.213-2.473 3.994-3.313l.479.932c-1.075.454-1.999 1.163-2.772 2.129z" />
</symbol>
<symbol id="icon-refresh" viewBox="0 0 16 16">
<path d="M4.5 4.5c1.9-1.9 5.1-1.9 7 0 .7.7 1.2 1.7 1.4 2.7l2-.3c-.2-1.5-.9-2.8-1.9-3.8C10.3.4 5.9.4 3.1 3.1L.9.9.2 7.3l6.4-.7-2.1-2.1zM15.8 8.7l-6.4.7 2.1 2.1c-1.9 1.9-5.1 1.9-7 0-.7-.7-1.2-1.7-1.4-2.7l-2 .3c.2 1.5.9 2.8 1.9 3.8 1.4 1.4 3.1 2 4.9 2s3.6-.7 4.9-2l2.2 2.2.8-6.4z" />
</symbol>
<symbol id="icon-remove" viewBox="0 0 16 16">
<rect x="4" y="7" width="8" height="2" />
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6 S11.3,14,8,14z" />
</symbol>
<symbol id="icon-search" viewBox="0 0 16 16">
<path d="M7 14c-3.86 0-7-3.14-7-7s3.14-7 7-7 7 3.14 7 7-3.14 7-7 7zM7 2C4.243 2 2 4.243 2 7s2.243 5 5 5 5-2.243 5-5-2.243-5-5-5zM15.707 14.293L13.314 11.9a8.019 8.019 0 0 1-1.414 1.414l2.393 2.393a.997.997 0 0 0 1.414 0 .999.999 0 0 0 0-1.414z" />
</symbol>
<symbol id="icon-settings" viewBox="0 0 16 16">
<path d="M5 5V1c0-.6-.4-1-1-1S3 .4 3 1v4c0 .6.4 1 1 1s1-.4 1-1zM1 11c0 1.3.9 2.4 2 2.8V15c0 .6.4 1 1 1s1-.4 1-1v-1-.2c1.2-.4 2-1.5 2-2.8 0-1.7-1.3-3-3-3s-3 1.3-3 3zM11 11v4c0 .6.4 1 1 1s1-.4 1-1v-4c0-.6-.4-1-1-1s-1 .4-1 1zM9 5c0 1.7 1.3 3 3 3s3-1.3 3-3c0-1.3-.9-2.4-2-2.8V1c0-.6-.4-1-1-1s-1 .4-1 1v1.2C9.9 2.6 9 3.7 9 5z" />
</symbol>
<symbol id="icon-share" viewBox="0 0 16 16">
<path d="M15,16H1c-0.6,0-1-0.4-1-1V3c0-0.6,0.4-1,1-1h3v2H2v10h12V9h2v6C16,15.6,15.6,16,15,16z" />
<path d="M10,3c-3.2,0-6,2.5-6,7c1.1-1.7,2.4-3,6-3v3l6-5l-6-5V3z" />
</symbol>
<symbol id="icon-smile" viewBox="0 0 16 16">
<path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6z" />
<path d="M7 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM11 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM8 12c1.7 0 3-1.3 3-3H5c0 1.7 1.3 3 3 3z" />
@@ -248,9 +339,21 @@
<symbol id="icon-sort" viewBox="0 0 10 16">
<path d="M0 0h3v3H0V0zM6 0h3v3H6V0zM0 6h3v3H0V6zM6 6h3v3H6V6zM0 12h3v3H0v-3zM6 12h3v3H6v-3z" />
</symbol>
<symbol id="icon-star" viewBox="0 0 16 16">
<path d="M15.144,5.439l-4.317-.628L8.9.9A1.041,1.041,0,0,0,7.1.9L5.173,4.812.856,5.439A1,1,0,0,0,.3,7.145l3.123,3.045-.737,4.3a1,1,0,0,0,1.451,1.054L8,13.513l3.861,2.029a1,1,0,0,0,1.451-1.054l-.737-4.3L15.7,7.145a1,1,0,0,0-.554-1.705Z"/>
</symbol>
<symbol id="icon-strikethrough" viewBox="0 0 16 16">
<path d="M9,13.27924V11H7v2.27924c0,0.43042-0.27545,0.81256-0.68378,0.94867L4,15v1h4h4v-1l-2.31622-0.77209 C9.27545,14.0918,9,13.70966,9,13.27924z"/>
<path d="M9,2h3.38196c0.37878,0,0.72504,0.21399,0.89441,0.5528L14,4h1V0H8H1v4h1l0.72363-1.4472 C2.89301,2.21399,3.23926,2,3.61804,2H7v5h2V2z"/>
<polygon points="16,9 16,7 9,7 7,7 0,7 0,9 "/>
</symbol>
<symbol id="icon-tag" viewBox="0 0 16 16">
<path d="M15.7 8.3l-8-8C7.5.1 7.3 0 7 0H1C.4 0 0 .4 0 1v6c0 .3.1.5.3.7l8 8c.2.2.4.3.7.3s.5-.1.7-.3l6-6c.4-.4.4-1 0-1.4zM4 5c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1z" />
</symbol>
<symbol id="icon-template" viewBox="0 0 16 16">
<path d="M15 1h-3v2h2v11H2V3h2V1H1c-.6 0-1 .4-1 1v13c0 .6.4 1 1 1h14c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1z" />
<path d="M5 0h6v4H5zM4 6h8v2H4zM4 10h8v2H4z" />
</symbol>
<symbol id="icon-text" viewBox="0 0 16 16">
<path d="M0 1h16v2H0V1zM0 5h10v2H0V5zM0 9h16v2H0V9zM0 13h10v2H0v-2z" />
</symbol>
@@ -272,9 +375,16 @@
<symbol id="icon-twitter" viewBox="0 0 16 16">
<path d="M16 3c-.6.3-1.2.4-1.9.5.7-.4 1.2-1 1.4-1.8-.6.4-1.3.6-2.1.8-.6-.6-1.5-1-2.4-1-1.7 0-3.2 1.5-3.2 3.3 0 .3 0 .5.1.7-2.7-.1-5.2-1.4-6.8-3.4-.3.5-.4 1-.4 1.7 0 1.1.6 2.1 1.5 2.7-.5 0-1-.2-1.5-.4C.7 7.7 1.8 9 3.3 9.3c-.3.1-.6.1-.9.1-.2 0-.4 0-.6-.1.4 1.3 1.6 2.3 3.1 2.3-1.1.9-2.5 1.4-4.1 1.4H0c1.5.9 3.2 1.5 5 1.5 6 0 9.3-5 9.3-9.3v-.4C15 4.3 15.6 3.7 16 3z" />
</symbol>
<symbol id="icon-underline" viewBox="0 0 16 16">
<rect y="14" width="16" height="2"/>
<path d="M15,0H9v1l1.44721,0.72361C10.786,1.893,11,2.23926,11,2.61803l0,4.26357 c0,1.45087-0.97782,2.7836-2.40207,3.06025C6.68269,10.31386,5,8.84987,5,7V2.61803C5,2.23926,5.214,1.893,5.55279,1.72361L7,1V0H1 v1l1.44721,0.72361C2.786,1.893,3,2.23926,3,2.61803L3,6.777c0,2.60979,1.90274,4.94497,4.50018,5.19855 C10.48047,12.2665,13,9.92173,13,7V2.61803c0-0.37877,0.214-0.72504,0.55279-0.89443L15,1V0z"/>
</symbol>
<symbol id="icon-undo" viewBox="0 0 16 16">
<path d="M2.502 12.333a6.996 6.996 0 0 1-1.405-3.168l1.973-.331a4.982 4.982 0 0 0 1.003 2.26l-1.571 1.239zM6.834 14.903a7.015 7.015 0 0 1-2.976-1.259l1.186-1.611c.624.459 1.358.77 2.122.898l-.332 1.972zM9.165 14.903l-.33-1.973a4.99 4.99 0 0 0 2.209-.964l1.219 1.586a6.997 6.997 0 0 1-3.098 1.351zM8 1c-1.873 0-3.65.759-4.948 2.052L.9.9.2 7.3l6.4-.7-2.135-2.135A5.023 5.023 0 0 1 8 3c2.757 0 5 2.243 5 5 0 1.06-.327 2.072-.947 2.928l1.621 1.173A6.96 6.96 0 0 0 15 8c0-3.86-3.141-7-7-7z" />
</symbol>
<symbol id="icon-unlock" viewBox="0 0 16 16">
<path d="M1,15c0,0.6,0.4,1,1,1h12c0.6,0,1-0.4,1-1V6c0-0.6-0.4-1-1-1h-2H6V4c0-1.1,0.9-2,2-2c0.6,0,1.1,0.2,1.5,0.7 l0.7,0.7l1.5-1.3L11,1.3C10.2,0.5,9.1,0,8,0C5.8,0,4,1.8,4,4v1H2C1.4,5,1,5.4,1,6V15z M8,8c1.1,0,2,0.9,2,2c0,0.7-0.4,1.4-1,1.7V13 H7v-1.3c-0.6-0.3-1-1-1-1.7C6,8.9,6.9,8,8,8z" />
</symbol>
<symbol id="icon-upload" viewBox="0 0 16 16">
<path d="M7 3.4V12h2V3.4l4 4L14.4 6 8.7.3c-.4-.4-1-.4-1.4 0L1.6 6 3 7.4l4-4z" />
<path d="M14 14H2v-3H0v4c0 .6.4 1 1 1h14c.6 0 1-.4 1-1v-4h-2v3z" />
@@ -292,49 +402,23 @@
<symbol id="icon-video" viewBox="0 0 16 16">
<path d="M11 9V7c0-.6-.4-1-1-1H1c-.6 0-1 .4-1 1v8c0 .6.4 1 1 1h9c.6 0 1-.4 1-1v-2l5 2V7l-5 2zM5 2.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0zM10 3a2 2 0 1 1-3.999.001A2 2 0 0 1 10 3z" />
</symbol>
<symbol id="icon-vimeo" viewBox="0 0 16 16">
<path d="M16,4.3c-0.1,1.6-1.2,3.7-3.3,6.4c-2.2,2.8-4,4.2-5.5,4.2c-0.9,0-1.7-0.9-2.4-2.6C4,9.9,3.4,5,2,5 C1.9,5,1.5,5.3,0.8,5.8L0,4.8c0.8-0.7,3.5-3.4,4.7-3.5C5.9,1.2,6.7,2,7,3.8c0.3,2,0.8,6.1,1.8,6.1c0.9,0,2.5-3.4,2.6-4 c0.1-0.9-0.3-1.9-2.3-1.1c0.8-2.6,2.3-3.8,4.5-3.8C15.3,1.1,16.1,2.2,16,4.3z"/>
</symbol>
<symbol id="icon-wand" viewBox="0 0 16 16">
<path d="M8.046 4.985l2.97 2.97-7.99 7.99-2.97-2.97 7.99-7.99zM12.995 1.591l1.414 1.414-2.404 2.404-1.414-1.414 2.404-2.404zM13 7h3v2h-3V7zM12.243 10.834l2.121 2.121-1.414 1.414-2.121-2.121 1.414-1.414zM7 0h2v3H7V0zM3.05 1.631l2.121 2.121-1.414 1.414-2.121-2.121L3.05 1.631z" />
</symbol>
<symbol id="icon-template" viewBox="0 0 16 16">
<path d="M15 1h-3v2h2v11H2V3h2V1H1c-.6 0-1 .4-1 1v13c0 .6.4 1 1 1h14c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1z" />
<path d="M5 0h6v4H5zM4 6h8v2H4zM4 10h8v2H4z" />
<symbol id="icon-whatsapp" viewBox="0 0 16 16">
<path d="M13.6,2.3C12.1,0.8,10.2,0,8,0C3.7,0,0.1,3.6,0.1,7.9c0,1.4,0.4,2.8,1.1,4L0,16l4.2-1.1c1.2,0.6,2.5,1,3.8,1 h0h0c4.4,0,7.9-3.6,7.9-7.9C16,5.8,15.1,3.8,13.6,2.3z M11.9,10.8c-0.2,0.5-1,0.9-1.3,0.9c-0.3,0.1-1.3,0-2.4-0.5 c-2-0.9-3.3-2.9-3.4-3C4.7,8.1,4,7.1,4,6.2s0.5-1.5,0.7-1.7c0.4-0.4,1.2-0.3,1.4,0.1C6.2,5,6.6,6,6.7,6.1s0.1,0.5-0.2,0.7 C6.4,6.8,5.9,7.2,6.1,7.5c0.1,0.2,0.5,0.8,1.1,1.4c0.8,0.7,1.4,0.9,1.6,1C9,10,9.1,10,9.2,9.8C9.3,9.7,9.7,9.2,9.8,9 c0.1-0.2,0.3-0.2,0.4-0.1s1.2,0.5,1.4,0.6C11.8,9.7,12,9.7,12,9.8C12.1,9.9,12.1,10.3,11.9,10.8z"/>
</symbol>
<symbol id="icon-parent" viewBox="0 0 16 16">
<path d="M14,6H3.4l4-4L6,0.6L0.3,6.3c-0.4,0.4-0.4,1,0,1.4L6,13.4L7.4,12l-4-4H13v7h2V7C15,6.4,14.6,6,14,6z" />
<symbol id="icon-wheelchair" viewBox="0 0 16 16">
<circle cx="11" cy="15" r="1"/>
<circle cx="11" cy="2" r="2"/>
<path d="M14.949,5.684a1,1,0,0,0-1.265-.632l-2.414.8L9.707,4.293A1,1,0,0,0,9,4H6a1,1,0,0,0-.447.105l-2,1A1,1,0,1,0,4.447,6.9L6.236,6H7.523L6.071,9.629A1,1,0,0,0,7,11h3v2h2V10a1,1,0,0,0-1-1H8.477l.888-2.221.928.928A1,1,0,0,0,11,8a.987.987,0,0,0,.316-.052l3-1A1,1,0,0,0,14.949,5.684Z"/>
<path d="M5,16A4,4,0,0,1,5,8v2a2,2,0,1,0,2,2H9A4,4,0,0,1,5,16Z"/>
</symbol>
<symbol id="icon-circle" viewBox="0 0 16 16">
<circle cx="8" cy="8" r="8" />
</symbol>
<symbol id="icon-circle-outline" viewBox="0 0 16 16">
<path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6z" />
</symbol>
<symbol id="icon-circle-filled" viewBox="0 0 16 16">
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6 S11.3,14,8,14z" />
<circle cx="8" cy="8" r="4" />
</symbol>
<symbol id="icon-protected" viewBox="0 0 16 16">
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,2c1.3,0,2.5,0.4,3.5,1.1l-8.4,8.4 C2.4,10.5,2,9.3,2,8C2,4.7,4.7,2,8,2z M8,14c-1.3,0-2.5-0.4-3.5-1.1l8.4-8.4C13.6,5.5,14,6.7,14,8C14,11.3,11.3,14,8,14z" />
</symbol>
<symbol id="icon-share" viewBox="0 0 16 16">
<path d="M15,16H1c-0.6,0-1-0.4-1-1V3c0-0.6,0.4-1,1-1h3v2H2v10h12V9h2v6C16,15.6,15.6,16,15,16z" />
<path d="M10,3c-3.2,0-6,2.5-6,7c1.1-1.7,2.4-3,6-3v3l6-5l-6-5V3z" />
</symbol>
<symbol id="icon-remove" viewBox="0 0 16 16">
<rect x="4" y="7" width="8" height="2" />
<path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M8,14c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6 S11.3,14,8,14z" />
</symbol>
<symbol id="icon-cart" viewBox="0 0 16 16">
<path d="M15,3H4.5L4,0.8C3.9,0.3,3.5,0,3,0H0v2h2.2L4,10.2C4.1,10.7,4.5,11,5,11h8c0.4,0,0.8-0.3,0.9-0.7l2-6 C16.1,3.8,15.8,3,15,3z" />
<circle cx="5" cy="14" r="2" />
<circle cx="13" cy="14" r="2" />
</symbol>
<symbol id="icon-key" viewBox="0 0 16 16">
<path d="M12.7,0L6.5,6.3C6,6.1,5.5,6,5,6c-2.8,0-5,2.2-5,5s2.2,5,5,5s5-2.2,5-5c0-0.5-0.1-1.1-0.3-1.6L11,8V6h2V4h2 l1-1V0H12.7z M4.5,12C3.7,12,3,11.3,3,10.5S3.7,9,4.5,9S6,9.7,6,10.5S5.3,12,4.5,12z"
/>
</symbol>
<symbol id="icon-copy" viewBox="0 0 16 16">
<path d="M10,4H2C1.4,4,1,4.4,1,5v10c0,0.6,0.4,1,1,1h8c0.6,0,1-0.4,1-1V5C11,4.4,10.6,4,10,4z" />
<path d="M14,0H4v2h9v11h2V1C15,0.4,14.6,0,14,0z" />
<symbol id="icon-youtube" viewBox="0 0 16 16">
<path d="M15.8,4.8c-0.2-1.3-0.8-2.2-2.2-2.4C11.4,2,8,2,8,2S4.6,2,2.4,2.4C1,2.6,0.3,3.5,0.2,4.8C0,6.1,0,8,0,8 s0,1.9,0.2,3.2c0.2,1.3,0.8,2.2,2.2,2.4C4.6,14,8,14,8,14s3.4,0,5.6-0.4c1.4-0.3,2-1.1,2.2-2.4C16,9.9,16,8,16,8S16,6.1,15.8,4.8z M6,11V5l5,3L6,11z"/>
</symbol>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 35 KiB

File diff suppressed because one or more lines are too long

21
kirby/phpstan.neon.dist Executable file
View File

@@ -0,0 +1,21 @@
parameters:
paths:
- %currentWorkingDirectory%
autoload_files:
- %currentWorkingDirectory%/vendor/autoload.php
- %rootDir%/../../autoload.php
autoload_directories:
- %currentWorkingDirectory%/tests
excludes_analyse:
- %currentWorkingDirectory%/dependencies
- %currentWorkingDirectory%/tests/*/fixtures/*
- %currentWorkingDirectory%/vendor
- %currentWorkingDirectory%/views
level: 0
memory_limit: 2G
ignoreErrors:
# we use bound $this in our callbacks
- message: '#(Using \$this outside a class\.|Undefined variable: \$this)#'
path: %currentWorkingDirectory%/config

View File

@@ -8,6 +8,7 @@ use Kirby\Exception\NotFoundException;
use Kirby\Http\Response;
use Kirby\Http\Router;
use Kirby\Toolkit\F;
use Kirby\Toolkit\Pagination;
use Kirby\Toolkit\Properties;
use Kirby\Toolkit\Str;
use Throwable;
@@ -38,7 +39,7 @@ class Api
/**
* Debugging flag
*
* @var boolean
* @var bool
*/
protected $debug = false;
@@ -200,8 +201,16 @@ class Api
}
}
// don't throw pagination errors if pagination
// page is out of bounds
$validate = Pagination::$validate;
Pagination::$validate = false;
$output = $this->route->action()->call($this, ...$this->route->arguments());
// restore old pagination validation mode
Pagination::$validate = $validate;
if (is_object($output) === true && is_a($output, 'Kirby\\Http\\Response') !== true) {
return $this->resolve($output)->toResponse();
}
@@ -268,7 +277,7 @@ class Api
/**
* Returns the debugging flag
*
* @return boolean
* @return bool
*/
public function debug(): bool
{
@@ -279,7 +288,7 @@ class Api
* Checks if injected data exists for the given key
*
* @param string $key
* @return boolean
* @return bool
*/
public function hasData(string $key): bool
{
@@ -489,7 +498,7 @@ class Api
/**
* Setter for the debug flag
*
* @param boolean $debug
* @param bool $debug
* @return self
*/
protected function setDebug(bool $debug = false)
@@ -693,7 +702,7 @@ class Api
* Upload helper method
*
* @param Closure $callback
* @param boolean $single
* @param bool $single
* @return array
*
* @throws Exception If request has no files

View File

@@ -2,7 +2,7 @@
namespace Kirby\Cache;
use APCUIterator;
use APCuIterator;
/**
* APCu Cache Driver
@@ -19,7 +19,7 @@ class ApcuCache extends Cache
* Determines if an item exists in the cache
*
* @param string $key
* @return boolean
* @return bool
*/
public function exists(string $key): bool
{
@@ -30,12 +30,12 @@ class ApcuCache extends Cache
* Flushes the entire cache and returns
* whether the operation was successful
*
* @return boolean
* @return bool
*/
public function flush(): bool
{
if (empty($this->options['prefix']) === false) {
return apcu_delete(new APCUIterator('!^' . preg_quote($this->options['prefix']) . '!'));
return apcu_delete(new APCuIterator('!^' . preg_quote($this->options['prefix']) . '!'));
} else {
return apcu_clear_cache();
}
@@ -46,7 +46,7 @@ class ApcuCache extends Cache
* whether the operation was successful
*
* @param string $key
* @return boolean
* @return bool
*/
public function remove(string $key): bool
{
@@ -77,7 +77,7 @@ class ApcuCache extends Cache
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
* @return bool
*/
public function set(string $key, $value, int $minutes = 0): bool
{

View File

@@ -45,7 +45,7 @@ abstract class Cache
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
* @return bool
*/
abstract public function set(string $key, $value, int $minutes = 0): bool;
@@ -152,7 +152,7 @@ abstract class Cache
* Checks if an item in the cache is expired
*
* @param string $key
* @return boolean
* @return bool
*/
public function expired(string $key): bool
{
@@ -204,7 +204,7 @@ abstract class Cache
* Determines if an item exists in the cache
*
* @param string $key
* @return boolean
* @return bool
*/
public function exists(string $key): bool
{
@@ -217,7 +217,7 @@ abstract class Cache
* this needs to be defined by the driver
*
* @param string $key
* @return boolean
* @return bool
*/
abstract public function remove(string $key): bool;
@@ -226,7 +226,7 @@ abstract class Cache
* whether the operation was successful;
* this needs to be defined by the driver
*
* @return boolean
* @return bool
*/
abstract public function flush(): bool;

View File

@@ -78,7 +78,7 @@ class FileCache extends Cache
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
* @return bool
*/
public function set(string $key, $value, int $minutes = 0): bool
{
@@ -125,7 +125,7 @@ class FileCache extends Cache
* whether the operation was successful
*
* @param string $key
* @return boolean
* @return bool
*/
public function remove(string $key): bool
{
@@ -142,7 +142,7 @@ class FileCache extends Cache
* Flushes the entire cache and returns
* whether the operation was successful
*
* @return boolean
* @return bool
*/
public function flush(): bool
{

View File

@@ -52,7 +52,7 @@ class MemCached extends Cache
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
* @return bool
*/
public function set(string $key, $value, int $minutes = 0): bool
{
@@ -76,7 +76,7 @@ class MemCached extends Cache
* whether the operation was successful
*
* @param string $key
* @return boolean
* @return bool
*/
public function remove(string $key): bool
{
@@ -88,7 +88,7 @@ class MemCached extends Cache
* whether the operation was successful;
* WARNING: Memcached only supports flushing the whole cache at once!
*
* @return boolean
* @return bool
*/
public function flush(): bool
{

View File

@@ -31,7 +31,7 @@ class MemoryCache extends Cache
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
* @return bool
*/
public function set(string $key, $value, int $minutes = 0): bool
{
@@ -56,7 +56,7 @@ class MemoryCache extends Cache
* whether the operation was successful
*
* @param string $key
* @return boolean
* @return bool
*/
public function remove(string $key): bool
{
@@ -72,7 +72,7 @@ class MemoryCache extends Cache
* Flushes the entire cache and returns
* whether the operation was successful
*
* @return boolean
* @return bool
*/
public function flush(): bool
{

View File

@@ -25,7 +25,7 @@ class NullCache extends Cache
* @param string $key
* @param mixed $value
* @param int $minutes
* @return boolean
* @return bool
*/
public function set(string $key, $value, int $minutes = 0): bool
{
@@ -49,7 +49,7 @@ class NullCache extends Cache
* whether the operation was successful
*
* @param string $key
* @return boolean
* @return bool
*/
public function remove(string $key): bool
{
@@ -60,7 +60,7 @@ class NullCache extends Cache
* Flushes the entire cache and returns
* whether the operation was successful
*
* @return boolean
* @return bool
*/
public function flush(): bool
{

View File

@@ -37,9 +37,7 @@ class Api extends BaseApi
$this->setRequestMethod($method);
$this->setRequestData($requestData);
if ($languageCode = $this->language()) {
$this->kirby->setCurrentLanguage($languageCode);
}
$this->kirby->setCurrentLanguage($this->language());
if ($user = $this->kirby->user()) {
$this->kirby->setCurrentTranslation($user->language());

View File

@@ -4,6 +4,7 @@ namespace Kirby\Cms;
use Kirby\Data\Data;
use Kirby\Email\PHPMailer as Emailer;
use Kirby\Exception\ErrorPageException;
use Kirby\Exception\InvalidArgumentException;
use Kirby\Exception\NotFoundException;
use Kirby\Http\Request;
@@ -56,6 +57,7 @@ class App
protected $languages;
protected $locks;
protected $multilang;
protected $nonce;
protected $options;
protected $path;
protected $request;
@@ -120,9 +122,15 @@ class App
$this->extensionsFromOptions();
$this->extensionsFromFolders();
// trigger hook for use in plugins
$this->trigger('system.loadPlugins:after');
// handle those damn errors
$this->handleErrors();
// execute a ready callback from the config
$this->optionsFromReadyCallback();
// bake config
Config::$data = $this->options;
}
@@ -475,7 +483,7 @@ class App
*
* @param string $path
* @param mixed $parent
* @param boolean $drafts
* @param bool $drafts
* @return \Kirby\Cms\File|null
*/
public function file(string $path, $parent = null, bool $drafts = true)
@@ -586,7 +594,11 @@ class App
// Pages
if (is_a($input, 'Kirby\Cms\Page')) {
try {
$html = $input->render();
} catch (ErrorPageException $e) {
return $this->io($e);
}
if ($input->isErrorPage() === true) {
if ($response->code() === null) {
@@ -758,7 +770,7 @@ class App
/**
* Check for a multilang setup
*
* @return boolean
* @return bool
*/
public function multilang(): bool
{
@@ -769,6 +781,17 @@ class App
return $this->multilang = $this->languages()->count() !== 0;
}
/**
* Returns the nonce, which is used
* in the panel for inline scripts
*
* @return string
*/
public function nonce(): string
{
return $this->nonce = $this->nonce ?? base64_encode(random_bytes(20));
}
/**
* Load a specific configuration option
*
@@ -791,17 +814,6 @@ class App
return $this->options;
}
/**
* Inject options from Kirby instance props
*
* @param array $options
* @return array
*/
protected function optionsFromProps(array $options = []): array
{
return $this->options = array_replace_recursive($this->options, $options);
}
/**
* Load all options from files in site/config
*
@@ -823,16 +835,49 @@ class App
return $this->options = array_replace_recursive($config, $main, $host, $addr);
}
/**
* Inject options from Kirby instance props
*
* @param array $options
* @return array
*/
protected function optionsFromProps(array $options = []): array
{
return $this->options = array_replace_recursive($this->options, $options);
}
/**
* Merge last-minute options from ready callback
*
* @return array
*/
protected function optionsFromReadyCallback(): array
{
if (isset($this->options['ready']) === true && is_callable($this->options['ready']) === true) {
// fetch last-minute options from the callback
$options = (array)$this->options['ready']($this);
// inject all last-minute options recursively
$this->options = array_replace_recursive($this->options, $options);
}
return $this->options;
}
/**
* Returns any page from the content folder
*
* @param string $id
* @param string $id|null
* @param \Kirby\Cms\Page|\Kirby\Cms\Site|null $parent
* @param bool $drafts
* @return \Kirby\Cms\Page|null
*/
public function page(string $id, $parent = null, bool $drafts = true)
public function page(?string $id = null, $parent = null, bool $drafts = true)
{
if ($id === null) {
return null;
}
$parent = $parent ?? $this->site();
if ($page = $parent->find($id)) {
@@ -1184,10 +1229,20 @@ class App
{
$options = $this->option('smartypants', []);
if ($options === true) {
if ($options === false) {
return $text;
} elseif (is_array($options) === false) {
$options = [];
}
if ($this->multilang() === true) {
$languageSmartypants = $this->language()->smartypants() ?? [];
if (empty($languageSmartypants) === false) {
$options = array_merge($options, $languageSmartypants);
}
}
return $this->component('smartypants')($this, $text, $options);
}

View File

@@ -29,18 +29,17 @@ trait AppErrors
protected function handleErrors()
{
$request = $this->request();
// TODO: implement acceptance
if ($request->ajax()) {
return $this->handleJsonErrors();
if ($this->request()->cli() === true) {
$this->handleCliErrors();
return;
}
if ($request->cli()) {
return $this->handleCliErrors();
if ($this->visitor()->prefersJson() === true) {
$this->handleJsonErrors();
return;
}
return $this->handleHtmlErrors();
$this->handleHtmlErrors();
}
protected function handleHtmlErrors()

View File

@@ -701,7 +701,6 @@ trait AppPlugins
protected function pluginsLoader(): array
{
$root = $this->root('plugins');
$kirby = $this;
$loaded = [];
foreach (Dir::read($root) as $dirname) {
@@ -709,14 +708,10 @@ trait AppPlugins
continue;
}
if (is_dir($root . '/' . $dirname) === false) {
continue;
}
$dir = $root . '/' . $dirname;
$entry = $dir . '/index.php';
if (file_exists($entry) === false) {
if (is_dir($dir) !== true || is_file($entry) !== true) {
continue;
}

View File

@@ -158,7 +158,7 @@ trait AppTranslations
$inject = $this->extensions['translations'][$locale] ?? [];
// load from disk instead
return Translation::load($locale, $this->root('translations') . '/' . $locale . '.json', $inject);
return Translation::load($locale, $this->root('i18n:translations') . '/' . $locale . '.json', $inject);
}
/**
@@ -172,6 +172,6 @@ trait AppTranslations
return $this->translations;
}
return Translations::load($this->root('translations'), $this->extensions['translations'] ?? []);
return Translations::load($this->root('i18n:translations'), $this->extensions['translations'] ?? []);
}
}

View File

@@ -165,7 +165,7 @@ class Auth
* Check if logins are blocked for the current ip or email
*
* @param string $email
* @return boolean
* @return bool
*/
public function isBlocked(string $email): bool
{
@@ -195,7 +195,7 @@ class Auth
*
* @param string $email
* @param string $password
* @param boolean $long
* @param bool $long
* @return \Kirby\Cms\User
*
* @throws PermissionException If the rate limit was exceeded or if any other error occured with debug mode off
@@ -243,7 +243,7 @@ class Auth
$message = 'Invalid email or password';
}
throw new PermissionException($message, 403);
throw new PermissionException($message);
}
// validate the user
@@ -334,7 +334,7 @@ class Auth
/**
* Logout the current user
*
* @return boolean
* @return bool
*/
public function logout(): bool
{
@@ -354,7 +354,7 @@ class Auth
* Tracks a login
*
* @param string $email
* @return boolean
* @return bool
*/
public function track(string $email): bool
{

View File

@@ -472,7 +472,7 @@ class Blueprint
return [
'label' => 'Error',
'name' => $name,
'text' => $message,
'text' => strip_tags($message),
'theme' => 'negative',
'type' => 'info',
];
@@ -595,12 +595,17 @@ class Blueprint
continue;
}
// fallback to default props when true is passed
if ($sectionProps === true) {
$sectionProps = [];
}
// inject all section extensions
$sectionProps = $this->extend($sectionProps);
$sections[$sectionName] = $sectionProps = array_merge($sectionProps, [
'name' => $sectionName,
'type' => $type = $sectionProps['type'] ?? null
'type' => $type = $sectionProps['type'] ?? $sectionName
]);
if (empty($type) === true || is_string($type) === false) {

View File

@@ -165,7 +165,7 @@ class Collection extends BaseCollection
* is in the collection
*
* @param string|object $id
* @return boolean
* @return bool
*/
public function has($id): bool
{
@@ -242,7 +242,7 @@ class Collection extends BaseCollection
*
* @param mixed $key Optional collection key, will be determined from the item if not given
* @param mixed $item
* @return Kirby\Cms\Collection
* @return \Kirby\Cms\Collection
*/
public function prepend(...$args)
{

View File

@@ -89,7 +89,7 @@ class Collections
* Checks if a collection exists
*
* @param string $name
* @return boolean
* @return bool
*/
public function has(string $name): bool
{

View File

@@ -172,7 +172,7 @@ class Content
* Checks if a content field is set
*
* @param string $key
* @return boolean
* @return bool
*/
public function has(string $key): bool
{

View File

@@ -85,7 +85,7 @@ class ContentLock
'user' => $user->id(),
'email' => $user->email(),
'time' => $time,
'unlockable' => ($time + 200) <= time()
'unlockable' => ($time + 60) <= time()
];
}
@@ -144,7 +144,10 @@ class ContentLock
// check if lock was set by another user
if ($this->data['lock']['user'] !== $this->user()->id()) {
throw new LogicException('The content lock can only be removed by the user who created it. Use unlock instead.', 409);
throw new LogicException([
'fallback' => 'The content lock can only be removed by the user who created it. Use unlock instead.',
'httpCode' => 409
]);
}
// remove lock

View File

@@ -121,7 +121,7 @@ class ContentLocks
* Returns the file handle to a `.lock` file
*
* @param string $file
* @param boolean $create Whether to create the file if it does not exist
* @param bool $create Whether to create the file if it does not exist
* @return resource|null File handle
*/
protected function handle(string $file, bool $create = false)
@@ -167,7 +167,7 @@ class ContentLocks
*
* @param \Kirby\Cms\ModelWithContent $model
* @param array $data
* @return boolean
* @return bool
*/
public function set(ModelWithContent $model, array $data): bool
{

View File

@@ -119,7 +119,7 @@ class ContentTranslation
/**
* Checks if the translation file exists
*
* @return boolean
* @return bool
*/
public function exists(): bool
{
@@ -140,7 +140,7 @@ class ContentTranslation
* Checks if the this is the default translation
* of the model
*
* @return boolean
* @return bool
*/
public function isDefault(): bool
{

View File

@@ -27,7 +27,7 @@ class Dir extends \Kirby\Toolkit\Dir
* @param string $dir
* @param string $contentExtension
* @param array $contentIgnore
* @param boolean $multilang
* @param bool $multilang
* @return array
*/
public static function inventory(string $dir, string $contentExtension = 'txt', array $contentIgnore = null, bool $multilang = false): array

View File

@@ -130,7 +130,7 @@ class Field
/**
* Checks if the field exists in the content data array
*
* @return boolean
* @return bool
*/
public function exists(): bool
{
@@ -140,7 +140,7 @@ class Field
/**
* Checks if the field content is empty
*
* @return boolean
* @return bool
*/
public function isEmpty(): bool
{
@@ -150,7 +150,7 @@ class Field
/**
* Checks if the field content is not empty
*
* @return boolean
* @return bool
*/
public function isNotEmpty(): bool
{

View File

@@ -231,12 +231,14 @@ class File extends ModelWithContent
* gets dragged onto a textarea
*
* @internal
* @param string $type (auto|kirbytext|markdown)
* @param string $type (null|auto|kirbytext|markdown)
* @param bool $absolute
* @return string
*/
public function dragText($type = 'auto', bool $absolute = false): string
public function dragText(string $type = null, bool $absolute = false): string
{
$type = $type ?? 'auto';
if ($type === 'auto') {
$type = option('panel.kirbytext', true) ? 'kirbytext' : 'markdown';
}
@@ -363,6 +365,8 @@ class File extends ModelWithContent
*/
public function meta()
{
deprecated('$file->meta() is deprecated, use $file->content() instead. $file->meta() will be removed in Kirby 3.5.0.');
return $this->content();
}
@@ -392,7 +396,7 @@ class File extends ModelWithContent
* Timestamp of the last modification
* of the content file
*
* @return integer
* @return int
*/
protected function modifiedContent(): int
{
@@ -403,7 +407,7 @@ class File extends ModelWithContent
* Timestamp of the last modification
* of the source file
*
* @return integer
* @return int
*/
protected function modifiedFile(): int
{

View File

@@ -82,7 +82,7 @@ trait FileActions
/**
* Changes the file's sorting number in the meta file
*
* @param integer $sort
* @param int $sort
* @return self
*/
public function changeSort(int $sort)
@@ -256,6 +256,8 @@ trait FileActions
*/
public function rename(string $name, bool $sanitize = true)
{
deprecated('$file->rename() is deprecated, use $file->changeName() instead. $file->rename() will be removed in Kirby 3.5.0.');
return $this->changeName($name, $sanitize);
}

View File

@@ -82,7 +82,7 @@ trait FileFoundation
/**
* Checks if the file exists on disk
*
* @return boolean
* @return bool
*/
public function exists(): bool
{
@@ -117,7 +117,7 @@ trait FileFoundation
/**
* Checks if the file is a resizable image
*
* @return boolean
* @return bool
*/
public function isResizable(): bool
{
@@ -136,7 +136,7 @@ trait FileFoundation
* Checks if a preview can be displayed for the file
* in the panel or in the frontend
*
* @return boolean
* @return bool
*/
public function isViewable(): bool
{

View File

@@ -18,7 +18,7 @@ trait FileModifications
/**
* Blurs the image by the given amount of pixels
*
* @param boolean $pixels
* @param bool $pixels
* @return \Kirby\Cms\FileVersion|\Kirby\Cms\File
*/
public function blur($pixels = true)
@@ -39,8 +39,8 @@ trait FileModifications
/**
* Crops the image by the given width and height
*
* @param integer $width
* @param integer $height
* @param int $width
* @param int $height
* @param string|array $options
* @return \Kirby\Cms\FileVersion|\Kirby\Cms\File
*/
@@ -71,7 +71,7 @@ trait FileModifications
/**
* Sets the JPEG compression quality
*
* @param integer $quality
* @param int $quality
* @return \Kirby\Cms\FileVersion|\Kirby\Cms\File
*/
public function quality(int $quality)
@@ -83,9 +83,9 @@ trait FileModifications
* Resizes the file with the given width and height
* while keeping the aspect ratio.
*
* @param integer $width
* @param integer $height
* @param integer $quality
* @param int $width
* @param int $height
* @param int $quality
* @return \Kirby\Cms\FileVersion|\Kirby\Cms\File
*/
public function resize(int $width = null, int $height = null, int $quality = null)

73
kirby/src/Cms/FilePicker.php Executable file
View File

@@ -0,0 +1,73 @@
<?php
namespace Kirby\Cms;
use Kirby\Exception\InvalidArgumentException;
/**
* The FilePicker class helps to
* fetch the right files for the API calls
* for the file picker component in the panel.
*
* @package Kirby Cms
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier GmbH
* @license https://getkirby.com/license
*/
class FilePicker extends Picker
{
/**
* Extends the basic defaults
*
* @return array
*/
public function defaults(): array
{
$defaults = parent::defaults();
$defaults['text'] = '{{ file.filename }}';
return $defaults;
}
/**
* Search all files for the picker
*
* @return \Kirby\Cms\Files|null
*/
public function items()
{
$model = $this->options['model'];
// find the right default query
if (empty($this->options['query']) === false) {
$query = $this->options['query'];
} elseif (is_a($model, 'Kirby\Cms\File') === true) {
$query = 'file.siblings';
} else {
$query = $model::CLASS_ALIAS . '.files';
}
// fetch all files for the picker
$files = $model->query($query);
// help mitigate some typical query usage issues
// by converting site and page objects to proper
// pages by returning their children
if (is_a($files, 'Kirby\Cms\Site') === true) {
$files = $files->files();
} elseif (is_a($files, 'Kirby\Cms\Page') === true) {
$files = $files->files();
} elseif (is_a($files, 'Kirby\Cms\User') === true) {
$files = $files->files();
} elseif (is_a($files, 'Kirby\Cms\Files') === false) {
throw new InvalidArgumentException('Your query must return a set of files');
}
// search
$files = $this->search($files);
// paginate
return $this->paginate($files);
}
}

View File

@@ -157,7 +157,7 @@ trait HasChildren
/**
* Checks if the model has any children
*
* @return boolean
* @return bool
*/
public function hasChildren(): bool
{
@@ -167,7 +167,7 @@ trait HasChildren
/**
* Checks if the model has any drafts
*
* @return boolean
* @return bool
*/
public function hasDrafts(): bool
{
@@ -175,18 +175,20 @@ trait HasChildren
}
/**
* @deprecated 3.0.0 Use `Page::hasUnlistedChildren` instead
* @return boolean
* @deprecated 3.0.0 Use `Page::hasUnlistedChildren()` instead
* @return bool
*/
public function hasInvisibleChildren(): bool
{
deprecated('$page->hasInvisibleChildren() is deprecated, use $page->hasUnlistedChildren() instead. $page->hasInvisibleChildren() will be removed in Kirby 3.5.0.');
return $this->hasUnlistedChildren();
}
/**
* Checks if the page has any listed children
*
* @return boolean
* @return bool
*/
public function hasListedChildren(): bool
{
@@ -196,7 +198,7 @@ trait HasChildren
/**
* Checks if the page has any unlisted children
*
* @return boolean
* @return bool
*/
public function hasUnlistedChildren(): bool
{
@@ -204,11 +206,13 @@ trait HasChildren
}
/**
* @deprecated 3.0.0 Use `Page::hasListedChildren` instead
* @return boolean
* @deprecated 3.0.0 Use `Page::hasListedChildren()` instead
* @return bool
*/
public function hasVisibleChildren(): bool
{
deprecated('$page->hasVisibleChildren() is deprecated, use $page->hasListedChildren() instead. $page->hasVisibleChildren() will be removed in Kirby 3.5.0.');
return $this->hasListedChildren();
}

View File

@@ -39,7 +39,7 @@ trait HasMethods
*
* @internal
* @param string $method
* @return boolean
* @return bool
*/
public function hasMethod(string $method): bool
{

View File

@@ -58,6 +58,11 @@ class Language extends Model
*/
protected $slugs;
/**
* @var array|null
*/
protected $smartypants;
/**
* @var array|null
*/
@@ -85,6 +90,7 @@ class Language extends Model
'locale',
'name',
'slugs',
'smartypants',
'translations',
'url',
]);
@@ -111,6 +117,28 @@ class Language extends Model
return $this->code();
}
/**
* Returns the base Url for the language
* without the path or other cruft
*
* @return string
*/
public function baseUrl(): string
{
$kirbyUrl = $this->kirby()->url();
$languageUrl = $this->url();
if (empty($this->url)) {
return $kirbyUrl;
}
if (Str::startsWith($languageUrl, $kirbyUrl) === true) {
return $kirbyUrl;
}
return Url::base($languageUrl) ?? $kirbyUrl;
}
/**
* Returns the language code/id.
* The language code is used in
@@ -129,7 +157,7 @@ class Language extends Model
*
* @param string $from
* @param string $to
* @return boolean
* @return bool
*/
protected static function converter(string $from, string $to): bool
{
@@ -201,7 +229,7 @@ class Language extends Model
* all its translation files
*
* @internal
* @return boolean
* @return bool
*/
public function delete(): bool
{
@@ -270,7 +298,7 @@ class Language extends Model
/**
* Check if the language file exists
*
* @return boolean
* @return bool
*/
public function exists(): bool
{
@@ -281,7 +309,7 @@ class Language extends Model
* Checks if this is the default language
* for the site.
*
* @return boolean
* @return bool
*/
public function isDefault(): bool
{
@@ -325,6 +353,20 @@ class Language extends Model
return $this->name;
}
/**
* Returns the URL path for the language
*
* @return string
*/
public function path(): string
{
if ($this->url === null) {
return $this->code;
}
return Url::path($this->url());
}
/**
* Returns the routing pattern for the language
*
@@ -332,11 +374,13 @@ class Language extends Model
*/
public function pattern(): string
{
if (empty($this->url) === true) {
return $this->code;
$path = $this->path();
if (empty($path) === true) {
return '(:all)';
}
return trim($this->url, '/');
return $path . '/(:all?)';
}
/**
@@ -430,7 +474,7 @@ class Language extends Model
}
/**
* @param boolean $default
* @param bool $default
* @return self
*/
protected function setDefault(bool $default = false)
@@ -488,6 +532,16 @@ class Language extends Model
return $this;
}
/**
* @param array $smartypants
* @return self
*/
protected function setSmartypants(array $smartypants = null)
{
$this->smartypants = $smartypants ?? [];
return $this;
}
/**
* @param array $translations
* @return self
@@ -518,6 +572,16 @@ class Language extends Model
return $this->slugs;
}
/**
* Returns the custom SmartyPants options for this language
*
* @return array
*/
public function smartypants(): array
{
return $this->smartypants;
}
/**
* Returns the most important
* properties as array
@@ -554,7 +618,13 @@ class Language extends Model
*/
public function url(): string
{
return Url::makeAbsolute($this->pattern(), $this->kirby()->url());
$url = $this->url;
if ($url === null) {
$url = '/' . $this->code;
}
return Url::makeAbsolute($url, $this->kirby()->url());
}
/**

143
kirby/src/Cms/LanguageRoutes.php Executable file
View File

@@ -0,0 +1,143 @@
<?php
namespace Kirby\Cms;
use Kirby\Toolkit\F;
class LanguageRoutes
{
/**
* Creates all multi-language routes
*
* @param \Kirby\Cms\App $kirby
* @return array
*/
public static function create(App $kirby): array
{
$routes = [];
// add the route for the home page
$routes[] = static::home($kirby);
// Kirby's base url
$baseurl = $kirby->url();
foreach ($kirby->languages() as $language) {
// ignore languages with a different base url
if ($language->baseurl() !== $baseurl) {
continue;
}
$routes[] = [
'pattern' => $language->pattern(),
'method' => 'ALL',
'env' => 'site',
'action' => function ($path = null) use ($language) {
if ($result = $language->router()->call($path)) {
return $result;
}
// jump through to the fallback if nothing
// can be found for this language
$this->next();
}
];
}
$routes[] = static::fallback($kirby);
return $routes;
}
/**
* Create the fallback route
* for unprefixed default language URLs.
*
* @param \Kirby\Cms\App $kirby
* @return array
*/
public static function fallback(App $kirby): array
{
return [
'pattern' => '(:all)',
'method' => 'ALL',
'env' => 'site',
'action' => function (string $path) use ($kirby) {
// check for content representations or files
$extension = F::extension($path);
// try to redirect prefixed pages
if (empty($extension) === true && $page = $kirby->page($path)) {
$url = $kirby->request()->url([
'query' => null,
'params' => null,
'fragment' => null
]);
if ($url->toString() !== $page->url()) {
return $kirby
->response()
->redirect($page->url());
}
}
return $kirby->defaultLanguage()->router()->call($path);
}
];
}
/**
* Create the multi-language home page route
*
* @param \Kirby\Cms\App $kirby
* @return array
*/
public static function home(App $kirby): array
{
// Multi-language home
return [
'pattern' => '',
'method' => 'ALL',
'env' => 'site',
'action' => function () use ($kirby) {
// find all languages with the same base url as the current installation
$languages = $kirby->languages()->filterBy('baseurl', $kirby->url());
// if there's no language with a matching base url,
// redirect to the default language
if ($languages->count() === 0) {
return $kirby
->response()
->redirect($kirby->defaultLanguage()->url());
}
// if there's just one language, we take that to render the home page
if ($languages->count() === 1) {
$currentLanguage = $languages->first();
} else {
$currentLanguage = $kirby->defaultLanguage();
}
// language detection on the home page with / as URL
if ($kirby->url() !== $currentLanguage->url()) {
if ($kirby->option('languages.detect') === true) {
return $kirby
->response()
->redirect($kirby->detectedLanguage()->url());
}
return $kirby
->response()
->redirect($currentLanguage->url());
}
// render the home page of the current language
return $currentLanguage->router()->call();
}
];
}
}

View File

@@ -72,11 +72,13 @@ class Languages extends Collection
}
/**
* @deprecated 3.0.0 Use `Languages::default()`instead
* @deprecated 3.0.0 Use `Languages::default()` instead
* @return \Kirby\Cms\Language|null
*/
public function findDefault()
{
deprecated('$languages->findDefault() is deprecated, use $languages->default() instead. $languages->findDefault() will be removed in Kirby 3.5.0.');
return $this->default();
}

View File

@@ -59,7 +59,7 @@ class Media
*
* @param string $src
* @param string $dest
* @return boolean
* @return bool
*/
public static function publish(string $src, string $dest): bool
{

View File

@@ -19,6 +19,14 @@ use Throwable;
*/
abstract class ModelWithContent extends Model
{
/**
* Each model must define a CLASS_ALIAS
* which will be used in template queries.
* The CLASS_ALIAS is a short human-readable
* version of the class name. I.e. page.
*/
const CLASS_ALIAS = null;
/**
* The content
*
@@ -194,8 +202,8 @@ abstract class ModelWithContent extends Model
* Decrement a given field value
*
* @param string $field
* @param integer $by
* @param integer $min
* @param int $by
* @param int $min
* @return self
*/
public function decrement(string $field, int $by = 1, int $min = 0)
@@ -231,8 +239,8 @@ abstract class ModelWithContent extends Model
* Increment a given field value
*
* @param string $field
* @param integer $by
* @param integer $max
* @param int $by
* @param int $max
* @return self
*/
public function increment(string $field, int $by = 1, int $max = null)
@@ -246,10 +254,21 @@ abstract class ModelWithContent extends Model
return $this->update([$field => $value]);
}
/**
* Checks if the model is locked for the current user
*
* @return bool
*/
public function isLocked(): bool
{
$lock = $this->lock();
return $lock && $lock->isLocked() === true;
}
/**
* Checks if the data has any errors
*
* @return boolean
* @return bool
*/
public function isValid(): bool
{
@@ -382,6 +401,38 @@ abstract class ModelWithContent extends Model
return $image;
}
/**
* Returns an array of all actions
* that can be performed in the Panel
* This also checks for the lock status
*
* @param array $unlock An array of options that will be force-unlocked
* @return array
*/
public function panelOptions(array $unlock = []): array
{
$options = $this->permissions()->toArray();
if ($this->isLocked()) {
foreach ($options as $key => $value) {
if (in_array($key, $unlock)) {
continue;
}
$options[$key] = false;
}
}
return $options;
}
/**
* Must return the permissions object for the model
*
* @return \Kirby\Cms\ModelPermissions
*/
abstract public function permissions();
/**
* Creates a string query, starting from the model
*
@@ -618,7 +669,7 @@ abstract class ModelWithContent extends Model
*
* @param array $input
* @param string $languageCode
* @param boolean $validate
* @param bool $validate
* @return self
*/
public function update(array $input = null, string $languageCode = null, bool $validate = false)
@@ -657,7 +708,7 @@ abstract class ModelWithContent extends Model
* @internal
* @param array $data
* @param string $languageCode
* @return boolean
* @return bool
*/
public function writeContent(array $data, string $languageCode = null): bool
{

View File

@@ -104,7 +104,7 @@ class Page extends ModelWithContent
/**
* The sorting number
*
* @var integer|null
* @var int|null
*/
protected $num;
@@ -253,15 +253,14 @@ class Page extends ModelWithContent
$templates = [];
}
// add the current template to the array
$templates[] = $currentTemplate;
// add the current template to the array if it's not already there
if (in_array($currentTemplate, $templates) === false) {
array_unshift($templates, $currentTemplate);
}
// make sure every template is only included once
$templates = array_unique($templates);
// sort the templates
asort($templates);
foreach ($templates as $template) {
try {
$props = Blueprint::load('pages/' . $template);
@@ -352,7 +351,7 @@ class Page extends ModelWithContent
* Returns a number indicating how deep the page
* is nested within the content folder
*
* @return integer
* @return int
*/
public function depth(): int
{
@@ -408,11 +407,13 @@ class Page extends ModelWithContent
* gets dragged onto a textarea
*
* @internal
* @param string $type (auto|kirbytext|markdown)
* @param string $type (null|auto|kirbytext|markdown)
* @return string
*/
public function dragText(string $type = 'auto'): string
public function dragText(string $type = null): string
{
$type = $type ?? 'auto';
if ($type === 'auto') {
$type = option('panel.kirbytext', true) ? 'kirbytext' : 'markdown';
}
@@ -456,7 +457,7 @@ class Page extends ModelWithContent
* Checks if the intended template
* for the page exists.
*
* @return boolean
* @return bool
*/
public function hasTemplate(): bool
{
@@ -563,7 +564,7 @@ class Page extends ModelWithContent
* Checks if the page is a direct or indirect ancestor of the given $page object
*
* @param Page $child
* @return boolean
* @return bool
*/
public function isAncestorOf(Page $child): bool
{
@@ -575,7 +576,7 @@ class Page extends ModelWithContent
* pages cache. This will also check if one
* of the ignore rules from the config kick in.
*
* @return boolean
* @return bool
*/
public function isCacheable(): bool
{
@@ -628,12 +629,12 @@ class Page extends ModelWithContent
* Checks if the page is a child of the given page
*
* @param \Kirby\Cms\Page|string $parent
* @return boolean
* @return bool
*/
public function isChildOf($parent): bool
{
if ($parent = $this->parent()) {
return $parent->is($parent);
if ($parentObj = $this->parent()) {
return $parentObj->is($parent);
}
return false;
@@ -643,7 +644,7 @@ class Page extends ModelWithContent
* Checks if the page is a descendant of the given page
*
* @param \Kirby\Cms\Page|string $parent
* @return boolean
* @return bool
*/
public function isDescendantOf($parent): bool
{
@@ -661,7 +662,7 @@ class Page extends ModelWithContent
/**
* Checks if the page is a descendant of the currently active page
*
* @return boolean
* @return bool
*/
public function isDescendantOfActive(): bool
{
@@ -675,7 +676,7 @@ class Page extends ModelWithContent
/**
* Checks if the current page is a draft
*
* @return boolean
* @return bool
*/
public function isDraft(): bool
{
@@ -695,7 +696,7 @@ class Page extends ModelWithContent
/**
* Check if the page can be read by the current user
*
* @return boolean
* @return bool
*/
public function isReadable(): bool
{
@@ -725,7 +726,7 @@ class Page extends ModelWithContent
* home and error page to stop certain
* actions. That's why there's a shortcut.
*
* @return boolean
* @return bool
*/
public function isHomeOrErrorPage(): bool
{
@@ -733,18 +734,20 @@ class Page extends ModelWithContent
}
/**
* @deprecated 3.0.0 Use `Page::isUnlisted()` intead
* @deprecated 3.0.0 Use `Page::isUnlisted()` instead
* @return bool
*/
public function isInvisible(): bool
{
deprecated('$page->isInvisible() is deprecated, use $page->isUnlisted() instead. $page->isInvisible() will be removed in Kirby 3.5.0.');
return $this->isUnlisted();
}
/**
* Checks if the page has a sorting number
*
* @return boolean
* @return bool
*/
public function isListed(): bool
{
@@ -776,7 +779,7 @@ class Page extends ModelWithContent
/**
* Checks if the page is sortable
*
* @return boolean
* @return bool
*/
public function isSortable(): bool
{
@@ -786,7 +789,7 @@ class Page extends ModelWithContent
/**
* Checks if the page has no sorting number
*
* @return boolean
* @return bool
*/
public function isUnlisted(): bool
{
@@ -794,11 +797,13 @@ class Page extends ModelWithContent
}
/**
* @deprecated 3.0.0 Use `Page::isListed()` intead
* @deprecated 3.0.0 Use `Page::isListed()` instead
* @return bool
*/
public function isVisible(): bool
{
deprecated('$page->isVisible() is deprecated, use $page->isListed() instead. $page->isVisible() will be removed in Kirby 3.5.0.');
return $this->isListed();
}
@@ -808,7 +813,7 @@ class Page extends ModelWithContent
*
* @internal
* @param string $token
* @return boolean
* @return bool
*/
public function isVerified(string $token = null)
{
@@ -884,7 +889,7 @@ class Page extends ModelWithContent
/**
* Returns the sorting number
*
* @return integer|null
* @return int|null
*/
public function num(): ?int
{
@@ -1099,7 +1104,7 @@ class Page extends ModelWithContent
*
* @param array $data
* @param string $contentType
* @param integer $code
* @param int $code
* @return string
*/
public function render(array $data = [], $contentType = 'html'): string
@@ -1241,7 +1246,7 @@ class Page extends ModelWithContent
/**
* Sets the draft flag
*
* @param boolean $isDraft
* @param bool $isDraft
* @return self
*/
protected function setIsDraft(bool $isDraft = null)
@@ -1253,7 +1258,7 @@ class Page extends ModelWithContent
/**
* Sets the sorting number
*
* @param integer $num
* @param int $num
* @return self
*/
protected function setNum(int $num = null)

View File

@@ -160,7 +160,7 @@ trait PageActions
* to either draft, listed or unlisted
*
* @param string $status "draft", "listed" or "unlisted"
* @param integer $position Optional sorting number
* @param int $position Optional sorting number
* @return self
*/
public function changeStatus(string $status, int $position = null)
@@ -462,8 +462,8 @@ trait PageActions
* Create the sorting number for the page
* depending on the blueprint settings
*
* @param integer $num
* @return integer
* @param int $num
* @return int
*/
public function createNum(int $num = null): int
{
@@ -631,12 +631,13 @@ trait PageActions
*/
public function purge()
{
$this->children = null;
$this->blueprint = null;
$this->children = null;
$this->content = null;
$this->drafts = null;
$this->files = null;
$this->content = null;
$this->inventory = null;
$this->translations = null;
return $this;
}
@@ -756,7 +757,7 @@ trait PageActions
*
* @param array $input
* @param string $language
* @param boolean $validate
* @param bool $validate
* @return self
*/
public function update(array $input = null, string $language = null, bool $validate = false)

View File

@@ -75,7 +75,6 @@ class PageBlueprint extends Blueprint
protected function normalizeNum($num): string
{
$aliases = [
0 => 'zero',
'0' => 'zero',
'sort' => 'default',
];
@@ -185,7 +184,7 @@ class PageBlueprint extends Blueprint
* button in the panel and redirects it to a
* different URL if necessary.
*
* @return string|boolean
* @return string|bool
*/
public function preview()
{

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