0
0
Fork 0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-04-18 18:38:44 +00:00

Merge branch 'development' into codemirror6

This commit is contained in:
Dan Brown 2023-03-19 10:22:44 +00:00
commit c81cb6f2af
No known key found for this signature in database
GPG key ID: 46D9F943C24A2EF9
215 changed files with 3354 additions and 1407 deletions
.github
app
composer.jsoncomposer.lock
database/migrations
dev/api
lang

View file

@ -308,3 +308,6 @@ Adrian Ocneanu (aocneanu) :: Romanian
Eduardo Castanho (EduardoCastanho) :: Portuguese Eduardo Castanho (EduardoCastanho) :: Portuguese
VIET NAM VPS (vietnamvps) :: Vietnamese VIET NAM VPS (vietnamvps) :: Vietnamese
m4tthi4s :: French m4tthi4s :: French
toras9000 :: Japanese
pathab :: German
MichelSchoon85 :: Dutch

View file

@ -5,7 +5,6 @@ namespace BookStack\Auth\Permissions;
use BookStack\Auth\Role; use BookStack\Auth\Role;
use BookStack\Model; use BookStack\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphTo;
/** /**
* @property int $id * @property int $id
@ -23,14 +22,14 @@ class EntityPermission extends Model
protected $fillable = ['role_id', 'view', 'create', 'update', 'delete']; protected $fillable = ['role_id', 'view', 'create', 'update', 'delete'];
public $timestamps = false; public $timestamps = false;
protected $hidden = ['entity_id', 'entity_type', 'id'];
/** protected $casts = [
* Get this restriction's attached entity. 'view' => 'boolean',
*/ 'create' => 'boolean',
public function restrictable(): MorphTo 'read' => 'boolean',
{ 'update' => 'boolean',
return $this->morphTo('restrictable'); 'delete' => 'boolean',
} ];
/** /**
* Get the role assigned to this entity permission. * Get the role assigned to this entity permission.

View file

@ -12,11 +12,8 @@ use Illuminate\Database\Eloquent\Collection;
class PermissionsRepo class PermissionsRepo
{ {
protected JointPermissionBuilder $permissionBuilder; protected JointPermissionBuilder $permissionBuilder;
protected $systemRoles = ['admin', 'public']; protected array $systemRoles = ['admin', 'public'];
/**
* PermissionsRepo constructor.
*/
public function __construct(JointPermissionBuilder $permissionBuilder) public function __construct(JointPermissionBuilder $permissionBuilder)
{ {
$this->permissionBuilder = $permissionBuilder; $this->permissionBuilder = $permissionBuilder;
@ -41,7 +38,7 @@ class PermissionsRepo
/** /**
* Get a role via its ID. * Get a role via its ID.
*/ */
public function getRoleById($id): Role public function getRoleById(int $id): Role
{ {
return Role::query()->findOrFail($id); return Role::query()->findOrFail($id);
} }
@ -52,10 +49,10 @@ class PermissionsRepo
public function saveNewRole(array $roleData): Role public function saveNewRole(array $roleData): Role
{ {
$role = new Role($roleData); $role = new Role($roleData);
$role->mfa_enforced = ($roleData['mfa_enforced'] ?? 'false') === 'true'; $role->mfa_enforced = boolval($roleData['mfa_enforced'] ?? false);
$role->save(); $role->save();
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : []; $permissions = $roleData['permissions'] ?? [];
$this->assignRolePermissions($role, $permissions); $this->assignRolePermissions($role, $permissions);
$this->permissionBuilder->rebuildForRole($role); $this->permissionBuilder->rebuildForRole($role);
@ -66,42 +63,45 @@ class PermissionsRepo
/** /**
* Updates an existing role. * Updates an existing role.
* Ensure Admin role always have core permissions. * Ensures Admin system role always have core permissions.
*/ */
public function updateRole($roleId, array $roleData) public function updateRole($roleId, array $roleData): Role
{ {
$role = $this->getRoleById($roleId); $role = $this->getRoleById($roleId);
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : []; if (isset($roleData['permissions'])) {
$this->assignRolePermissions($role, $roleData['permissions']);
}
$role->fill($roleData);
$role->save();
$this->permissionBuilder->rebuildForRole($role);
Activity::add(ActivityType::ROLE_UPDATE, $role);
return $role;
}
/**
* Assign a list of permission names to the given role.
*/
protected function assignRolePermissions(Role $role, array $permissionNameArray = []): void
{
$permissions = [];
$permissionNameArray = array_values($permissionNameArray);
// Ensure the admin system role retains vital system permissions
if ($role->system_name === 'admin') { if ($role->system_name === 'admin') {
$permissions = array_merge($permissions, [ $permissionNameArray = array_unique(array_merge($permissionNameArray, [
'users-manage', 'users-manage',
'user-roles-manage', 'user-roles-manage',
'restrictions-manage-all', 'restrictions-manage-all',
'restrictions-manage-own', 'restrictions-manage-own',
'settings-manage', 'settings-manage',
]); ]));
} }
$this->assignRolePermissions($role, $permissions); if (!empty($permissionNameArray)) {
$role->fill($roleData);
$role->mfa_enforced = ($roleData['mfa_enforced'] ?? 'false') === 'true';
$role->save();
$this->permissionBuilder->rebuildForRole($role);
Activity::add(ActivityType::ROLE_UPDATE, $role);
}
/**
* Assign a list of permission names to a role.
*/
protected function assignRolePermissions(Role $role, array $permissionNameArray = [])
{
$permissions = [];
$permissionNameArray = array_values($permissionNameArray);
if ($permissionNameArray) {
$permissions = RolePermission::query() $permissions = RolePermission::query()
->whereIn('name', $permissionNameArray) ->whereIn('name', $permissionNameArray)
->pluck('id') ->pluck('id')
@ -114,13 +114,13 @@ class PermissionsRepo
/** /**
* Delete a role from the system. * Delete a role from the system.
* Check it's not an admin role or set as default before deleting. * Check it's not an admin role or set as default before deleting.
* If an migration Role ID is specified the users assign to the current role * If a migration Role ID is specified the users assign to the current role
* will be added to the role of the specified id. * will be added to the role of the specified id.
* *
* @throws PermissionsException * @throws PermissionsException
* @throws Exception * @throws Exception
*/ */
public function deleteRole($roleId, $migrateRoleId) public function deleteRole(int $roleId, int $migrateRoleId = 0): void
{ {
$role = $this->getRoleById($roleId); $role = $this->getRoleById($roleId);
@ -131,7 +131,7 @@ class PermissionsRepo
throw new PermissionsException(trans('errors.role_registration_default_cannot_delete')); throw new PermissionsException(trans('errors.role_registration_default_cannot_delete'));
} }
if ($migrateRoleId) { if ($migrateRoleId !== 0) {
$newRole = Role::query()->find($migrateRoleId); $newRole = Role::query()->find($migrateRoleId);
if ($newRole) { if ($newRole) {
$users = $role->users()->pluck('id')->toArray(); $users = $role->users()->pluck('id')->toArray();

View file

@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
/** /**
* @property int $id * @property int $id
* @property string $name
* @property string $display_name
*/ */
class RolePermission extends Model class RolePermission extends Model
{ {

View file

@ -27,10 +27,14 @@ class Role extends Model implements Loggable
{ {
use HasFactory; use HasFactory;
protected $fillable = ['display_name', 'description', 'external_auth_id']; protected $fillable = ['display_name', 'description', 'external_auth_id', 'mfa_enforced'];
protected $hidden = ['pivot']; protected $hidden = ['pivot'];
protected $casts = [
'mfa_enforced' => 'boolean',
];
/** /**
* The roles that belong to the role. * The roles that belong to the role.
*/ */
@ -107,7 +111,13 @@ class Role extends Model implements Loggable
*/ */
public static function getSystemRole(string $systemName): ?self public static function getSystemRole(string $systemName): ?self
{ {
return static::query()->where('system_name', '=', $systemName)->first(); static $cache = [];
if (!isset($cache[$systemName])) {
$cache[$systemName] = static::query()->where('system_name', '=', $systemName)->first();
}
return $cache[$systemName];
} }
/** /**

View file

@ -72,7 +72,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/ */
protected $hidden = [ protected $hidden = [
'password', 'remember_token', 'system_name', 'email_confirmed', 'external_auth_id', 'email', 'password', 'remember_token', 'system_name', 'email_confirmed', 'external_auth_id', 'email',
'created_at', 'updated_at', 'image_id', 'roles', 'avatar', 'user_id', 'created_at', 'updated_at', 'image_id', 'roles', 'avatar', 'user_id', 'pivot',
]; ];
/** /**

View file

@ -18,30 +18,11 @@ use BookStack\Entities\Models\PageRevision;
*/ */
class EntityProvider class EntityProvider
{ {
/** public Bookshelf $bookshelf;
* @var Bookshelf public Book $book;
*/ public Chapter $chapter;
public $bookshelf; public Page $page;
public PageRevision $pageRevision;
/**
* @var Book
*/
public $book;
/**
* @var Chapter
*/
public $chapter;
/**
* @var Page
*/
public $page;
/**
* @var PageRevision
*/
public $pageRevision;
public function __construct() public function __construct()
{ {
@ -69,13 +50,18 @@ class EntityProvider
} }
/** /**
* Get an entity instance by it's basic name. * Get an entity instance by its basic name.
*/ */
public function get(string $type): Entity public function get(string $type): Entity
{ {
$type = strtolower($type); $type = strtolower($type);
$instance = $this->all()[$type] ?? null;
return $this->all()[$type]; if (is_null($instance)) {
throw new \InvalidArgumentException("Provided type \"{$type}\" is not a valid entity type");
}
return $instance;
} }
/** /**

View file

@ -19,20 +19,15 @@ use Illuminate\Support\Str;
class PageContent class PageContent
{ {
protected Page $page; public function __construct(
protected Page $page
/** ) {
* PageContent constructor.
*/
public function __construct(Page $page)
{
$this->page = $page;
} }
/** /**
* Update the content of the page with new provided HTML. * Update the content of the page with new provided HTML.
*/ */
public function setNewHTML(string $html) public function setNewHTML(string $html): void
{ {
$html = $this->extractBase64ImagesFromHtml($html); $html = $this->extractBase64ImagesFromHtml($html);
$this->page->html = $this->formatHtml($html); $this->page->html = $this->formatHtml($html);
@ -43,7 +38,7 @@ class PageContent
/** /**
* Update the content of the page with new provided Markdown content. * Update the content of the page with new provided Markdown content.
*/ */
public function setNewMarkdown(string $markdown) public function setNewMarkdown(string $markdown): void
{ {
$markdown = $this->extractBase64ImagesFromMarkdown($markdown); $markdown = $this->extractBase64ImagesFromMarkdown($markdown);
$this->page->markdown = $markdown; $this->page->markdown = $markdown;
@ -57,7 +52,7 @@ class PageContent
*/ */
protected function extractBase64ImagesFromHtml(string $htmlText): string protected function extractBase64ImagesFromHtml(string $htmlText): string
{ {
if (empty($htmlText) || strpos($htmlText, 'data:image') === false) { if (empty($htmlText) || !str_contains($htmlText, 'data:image')) {
return $htmlText; return $htmlText;
} }
@ -91,7 +86,7 @@ class PageContent
* Attempting to capture the whole data uri using regex can cause PHP * Attempting to capture the whole data uri using regex can cause PHP
* PCRE limits to be hit with larger, multi-MB, files. * PCRE limits to be hit with larger, multi-MB, files.
*/ */
protected function extractBase64ImagesFromMarkdown(string $markdown) protected function extractBase64ImagesFromMarkdown(string $markdown): string
{ {
$matches = []; $matches = [];
$contentLength = strlen($markdown); $contentLength = strlen($markdown);
@ -183,32 +178,13 @@ class PageContent
$childNodes = $body->childNodes; $childNodes = $body->childNodes;
$xPath = new DOMXPath($doc); $xPath = new DOMXPath($doc);
// Set ids on top-level nodes // Map to hold used ID references
$idMap = []; $idMap = [];
foreach ($childNodes as $index => $childNode) { // Map to hold changing ID references
[$oldId, $newId] = $this->setUniqueId($childNode, $idMap); $changeMap = [];
if ($newId && $newId !== $oldId) {
$this->updateLinks($xPath, '#' . $oldId, '#' . $newId);
}
}
// Set ids on nested header nodes $this->updateIdsRecursively($body, 0, $idMap, $changeMap);
$nestedHeaders = $xPath->query('//body//*//h1|//body//*//h2|//body//*//h3|//body//*//h4|//body//*//h5|//body//*//h6'); $this->updateLinks($xPath, $changeMap);
foreach ($nestedHeaders as $nestedHeader) {
[$oldId, $newId] = $this->setUniqueId($nestedHeader, $idMap);
if ($newId && $newId !== $oldId) {
$this->updateLinks($xPath, '#' . $oldId, '#' . $newId);
}
}
// Ensure no duplicate ids within child items
$idElems = $xPath->query('//body//*//*[@id]');
foreach ($idElems as $domElem) {
[$oldId, $newId] = $this->setUniqueId($domElem, $idMap);
if ($newId && $newId !== $oldId) {
$this->updateLinks($xPath, '#' . $oldId, '#' . $newId);
}
}
// Generate inner html as a string // Generate inner html as a string
$html = ''; $html = '';
@ -223,20 +199,53 @@ class PageContent
} }
/** /**
* Update the all links to the $old location to instead point to $new. * For the given DOMNode, traverse its children recursively and update IDs
* where required (Top-level, headers & elements with IDs).
* Will update the provided $changeMap array with changes made, where keys are the old
* ids and the corresponding values are the new ids.
*/ */
protected function updateLinks(DOMXPath $xpath, string $old, string $new) protected function updateIdsRecursively(DOMNode $element, int $depth, array &$idMap, array &$changeMap): void
{ {
$old = str_replace('"', '', $old); /* @var DOMNode $child */
$matchingLinks = $xpath->query('//body//*//*[@href="' . $old . '"]'); foreach ($element->childNodes as $child) {
foreach ($matchingLinks as $domElem) { if ($child instanceof DOMElement && ($depth === 0 || in_array($child->nodeName, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) || $child->getAttribute('id'))) {
$domElem->setAttribute('href', $new); [$oldId, $newId] = $this->setUniqueId($child, $idMap);
if ($newId && $newId !== $oldId && !isset($idMap[$oldId])) {
$changeMap[$oldId] = $newId;
}
}
if ($child->hasChildNodes()) {
$this->updateIdsRecursively($child, $depth + 1, $idMap, $changeMap);
}
}
}
/**
* Update the all links in the given xpath to apply requires changes within the
* given $changeMap array.
*/
protected function updateLinks(DOMXPath $xpath, array $changeMap): void
{
if (empty($changeMap)) {
return;
}
$links = $xpath->query('//body//*//*[@href]');
/** @var DOMElement $domElem */
foreach ($links as $domElem) {
$href = ltrim($domElem->getAttribute('href'), '#');
$newHref = $changeMap[$href] ?? null;
if ($newHref) {
$domElem->setAttribute('href', '#' . $newHref);
}
} }
} }
/** /**
* Set a unique id on the given DOMElement. * Set a unique id on the given DOMElement.
* A map for existing ID's should be passed in to check for current existence. * A map for existing ID's should be passed in to check for current existence,
* and this will be updated with any new IDs set upon elements.
* Returns a pair of strings in the format [old_id, new_id]. * Returns a pair of strings in the format [old_id, new_id].
*/ */
protected function setUniqueId(DOMNode $element, array &$idMap): array protected function setUniqueId(DOMNode $element, array &$idMap): array
@ -247,7 +256,7 @@ class PageContent
// Stop if there's an existing valid id that has not already been used. // Stop if there's an existing valid id that has not already been used.
$existingId = $element->getAttribute('id'); $existingId = $element->getAttribute('id');
if (strpos($existingId, 'bkmrk') === 0 && !isset($idMap[$existingId])) { if (str_starts_with($existingId, 'bkmrk') && !isset($idMap[$existingId])) {
$idMap[$existingId] = true; $idMap[$existingId] = true;
return [$existingId, $existingId]; return [$existingId, $existingId];
@ -258,7 +267,7 @@ class PageContent
// the same content is passed through. // the same content is passed through.
$contentId = 'bkmrk-' . mb_substr(strtolower(preg_replace('/\s+/', '-', trim($element->nodeValue))), 0, 20); $contentId = 'bkmrk-' . mb_substr(strtolower(preg_replace('/\s+/', '-', trim($element->nodeValue))), 0, 20);
$newId = urlencode($contentId); $newId = urlencode($contentId);
$loopIndex = 0; $loopIndex = 1;
while (isset($idMap[$newId])) { while (isset($idMap[$newId])) {
$newId = urlencode($contentId . '-' . $loopIndex); $newId = urlencode($contentId . '-' . $loopIndex);
@ -440,8 +449,8 @@ class PageContent
{ {
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
$doc = new DOMDocument(); $doc = new DOMDocument();
$html = '<body>' . $html . '</body>'; $html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $doc->loadHTML($html);
return $doc; return $doc;
} }

View file

@ -4,20 +4,20 @@ namespace BookStack\Entities\Tools;
use BookStack\Actions\ActivityType; use BookStack\Actions\ActivityType;
use BookStack\Auth\Permissions\EntityPermission; use BookStack\Auth\Permissions\EntityPermission;
use BookStack\Auth\Role;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf; use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Entity;
use BookStack\Facades\Activity; use BookStack\Facades\Activity;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection;
class PermissionsUpdater class PermissionsUpdater
{ {
/** /**
* Update an entities permissions from a permission form submit request. * Update an entities permissions from a permission form submit request.
*/ */
public function updateFromPermissionsForm(Entity $entity, Request $request) public function updateFromPermissionsForm(Entity $entity, Request $request): void
{ {
$permissions = $request->get('permissions', null); $permissions = $request->get('permissions', null);
$ownerId = $request->get('owned_by', null); $ownerId = $request->get('owned_by', null);
@ -39,12 +39,44 @@ class PermissionsUpdater
Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity); Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity);
} }
/**
* Update permissions from API request data.
*/
public function updateFromApiRequestData(Entity $entity, array $data): void
{
if (isset($data['role_permissions'])) {
$entity->permissions()->where('role_id', '!=', 0)->delete();
$rolePermissionData = $this->formatPermissionsFromApiRequestToEntityPermissions($data['role_permissions'] ?? [], false);
$entity->permissions()->createMany($rolePermissionData);
}
if (array_key_exists('fallback_permissions', $data)) {
$entity->permissions()->where('role_id', '=', 0)->delete();
}
if (isset($data['fallback_permissions']['inheriting']) && $data['fallback_permissions']['inheriting'] !== true) {
$data = $data['fallback_permissions'];
$data['role_id'] = 0;
$rolePermissionData = $this->formatPermissionsFromApiRequestToEntityPermissions([$data], true);
$entity->permissions()->createMany($rolePermissionData);
}
if (isset($data['owner_id'])) {
$this->updateOwnerFromId($entity, intval($data['owner_id']));
}
$entity->save();
$entity->rebuildPermissions();
Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity);
}
/** /**
* Update the owner of the given entity. * Update the owner of the given entity.
* Checks the user exists in the system first. * Checks the user exists in the system first.
* Does not save the model, just updates it. * Does not save the model, just updates it.
*/ */
protected function updateOwnerFromId(Entity $entity, int $newOwnerId) protected function updateOwnerFromId(Entity $entity, int $newOwnerId): void
{ {
$newOwner = User::query()->find($newOwnerId); $newOwner = User::query()->find($newOwnerId);
if (!is_null($newOwner)) { if (!is_null($newOwner)) {
@ -67,7 +99,41 @@ class PermissionsUpdater
$formatted[] = $entityPermissionData; $formatted[] = $entityPermissionData;
} }
return $formatted; return $this->filterEntityPermissionDataUponRole($formatted, true);
}
protected function formatPermissionsFromApiRequestToEntityPermissions(array $permissions, bool $allowFallback): array
{
$formatted = [];
foreach ($permissions as $requestPermissionData) {
$entityPermissionData = ['role_id' => $requestPermissionData['role_id']];
foreach (EntityPermission::PERMISSIONS as $permission) {
$entityPermissionData[$permission] = boolval($requestPermissionData[$permission] ?? false);
}
$formatted[] = $entityPermissionData;
}
return $this->filterEntityPermissionDataUponRole($formatted, $allowFallback);
}
protected function filterEntityPermissionDataUponRole(array $entityPermissionData, bool $allowFallback): array
{
$roleIds = [];
foreach ($entityPermissionData as $permissionEntry) {
$roleIds[] = intval($permissionEntry['role_id']);
}
$actualRoleIds = array_unique(array_values(array_filter($roleIds)));
$rolesById = Role::query()->whereIn('id', $actualRoleIds)->get('id')->keyBy('id');
return array_values(array_filter($entityPermissionData, function ($data) use ($rolesById, $allowFallback) {
if (intval($data['role_id']) === 0) {
return $allowFallback;
}
return $rolesById->has($data['role_id']);
}));
} }
/** /**

View file

@ -32,10 +32,15 @@ abstract class ApiController extends Controller
*/ */
public function getValidationRules(): array public function getValidationRules(): array
{ {
if (method_exists($this, 'rules')) {
return $this->rules(); return $this->rules();
} }
/**
* Get the validation rules for the actions in this controller.
* Defaults to a $rules property but can be a rules() method.
*/
protected function rules(): array
{
return $this->rules; return $this->rules;
} }
} }

View file

@ -13,11 +13,9 @@ use Illuminate\Validation\ValidationException;
class AttachmentApiController extends ApiController class AttachmentApiController extends ApiController
{ {
protected $attachmentService; public function __construct(
protected AttachmentService $attachmentService
public function __construct(AttachmentService $attachmentService) ) {
{
$this->attachmentService = $attachmentService;
} }
/** /**
@ -174,13 +172,13 @@ class AttachmentApiController extends ApiController
'name' => ['required', 'min:1', 'max:255', 'string'], 'name' => ['required', 'min:1', 'max:255', 'string'],
'uploaded_to' => ['required', 'integer', 'exists:pages,id'], 'uploaded_to' => ['required', 'integer', 'exists:pages,id'],
'file' => array_merge(['required_without:link'], $this->attachmentService->getFileValidationRules()), 'file' => array_merge(['required_without:link'], $this->attachmentService->getFileValidationRules()),
'link' => ['required_without:file', 'min:1', 'max:255', 'safe_url'], 'link' => ['required_without:file', 'min:1', 'max:2000', 'safe_url'],
], ],
'update' => [ 'update' => [
'name' => ['min:1', 'max:255', 'string'], 'name' => ['min:1', 'max:255', 'string'],
'uploaded_to' => ['integer', 'exists:pages,id'], 'uploaded_to' => ['integer', 'exists:pages,id'],
'file' => $this->attachmentService->getFileValidationRules(), 'file' => $this->attachmentService->getFileValidationRules(),
'link' => ['min:1', 'max:255', 'safe_url'], 'link' => ['min:1', 'max:2000', 'safe_url'],
], ],
]; ];
} }

View file

@ -0,0 +1,100 @@
<?php
namespace BookStack\Http\Controllers\Api;
use BookStack\Entities\EntityProvider;
use BookStack\Entities\Models\Entity;
use BookStack\Entities\Tools\PermissionsUpdater;
use Illuminate\Http\Request;
class ContentPermissionApiController extends ApiController
{
public function __construct(
protected PermissionsUpdater $permissionsUpdater,
protected EntityProvider $entities
) {
}
protected $rules = [
'update' => [
'owner_id' => ['int'],
'role_permissions' => ['array'],
'role_permissions.*.role_id' => ['required', 'int', 'exists:roles,id'],
'role_permissions.*.view' => ['required', 'boolean'],
'role_permissions.*.create' => ['required', 'boolean'],
'role_permissions.*.update' => ['required', 'boolean'],
'role_permissions.*.delete' => ['required', 'boolean'],
'fallback_permissions' => ['nullable'],
'fallback_permissions.inheriting' => ['required_with:fallback_permissions', 'boolean'],
'fallback_permissions.view' => ['required_if:fallback_permissions.inheriting,false', 'boolean'],
'fallback_permissions.create' => ['required_if:fallback_permissions.inheriting,false', 'boolean'],
'fallback_permissions.update' => ['required_if:fallback_permissions.inheriting,false', 'boolean'],
'fallback_permissions.delete' => ['required_if:fallback_permissions.inheriting,false', 'boolean'],
]
];
/**
* Read the configured content-level permissions for the item of the given type and ID.
* 'contentType' should be one of: page, book, chapter, bookshelf.
* 'contentId' should be the relevant ID of that item type you'd like to handle permissions for.
* The permissions shown are those that override the default for just the specified item, they do not show the
* full evaluated permission for a role, nor do they reflect permissions inherited from other items in the hierarchy.
* Fallback permission values may be `null` when inheriting is active.
*/
public function read(string $contentType, string $contentId)
{
$entity = $this->entities->get($contentType)
->newQuery()->scopes(['visible'])->findOrFail($contentId);
$this->checkOwnablePermission('restrictions-manage', $entity);
return response()->json($this->formattedPermissionDataForEntity($entity));
}
/**
* Update the configured content-level permission overrides for the item of the given type and ID.
* 'contentType' should be one of: page, book, chapter, bookshelf.
* 'contentId' should be the relevant ID of that item type you'd like to handle permissions for.
* Providing an empty `role_permissions` array will remove any existing configured role permissions,
* so you may want to fetch existing permissions beforehand if just adding/removing a single item.
* You should completely omit the `owner_id`, `role_permissions` and/or the `fallback_permissions` properties
* from your request data if you don't wish to update details within those categories.
*/
public function update(Request $request, string $contentType, string $contentId)
{
$entity = $this->entities->get($contentType)
->newQuery()->scopes(['visible'])->findOrFail($contentId);
$this->checkOwnablePermission('restrictions-manage', $entity);
$data = $this->validate($request, $this->rules()['update']);
$this->permissionsUpdater->updateFromApiRequestData($entity, $data);
return response()->json($this->formattedPermissionDataForEntity($entity));
}
protected function formattedPermissionDataForEntity(Entity $entity): array
{
$rolePermissions = $entity->permissions()
->where('role_id', '!=', 0)
->with(['role:id,display_name'])
->get();
$fallback = $entity->permissions()->where('role_id', '=', 0)->first();
$fallbackData = [
'inheriting' => is_null($fallback),
'view' => $fallback->view ?? null,
'create' => $fallback->create ?? null,
'update' => $fallback->update ?? null,
'delete' => $fallback->delete ?? null,
];
return [
'owner' => $entity->ownedBy()->first(),
'role_permissions' => $rolePermissions,
'fallback_permissions' => $fallbackData,
];
}
}

View file

@ -0,0 +1,146 @@
<?php
namespace BookStack\Http\Controllers\Api;
use BookStack\Entities\Models\Page;
use BookStack\Uploads\Image;
use BookStack\Uploads\ImageRepo;
use Illuminate\Http\Request;
class ImageGalleryApiController extends ApiController
{
protected array $fieldsToExpose = [
'id', 'name', 'url', 'path', 'type', 'uploaded_to', 'created_by', 'updated_by', 'created_at', 'updated_at',
];
public function __construct(
protected ImageRepo $imageRepo
) {
}
protected function rules(): array
{
return [
'create' => [
'type' => ['required', 'string', 'in:gallery,drawio'],
'uploaded_to' => ['required', 'integer'],
'image' => ['required', 'file', ...$this->getImageValidationRules()],
'name' => ['string', 'max:180'],
],
'update' => [
'name' => ['string', 'max:180'],
]
];
}
/**
* Get a listing of images in the system. Includes gallery (page content) images and drawings.
* Requires visibility of the page they're originally uploaded to.
*/
public function list()
{
$images = Image::query()->scopes(['visible'])
->select($this->fieldsToExpose)
->whereIn('type', ['gallery', 'drawio']);
return $this->apiListingResponse($images, [
...$this->fieldsToExpose
]);
}
/**
* Create a new image in the system.
* Since "image" is expected to be a file, this needs to be a 'multipart/form-data' type request.
* The provided "uploaded_to" should be an existing page ID in the system.
* If the "name" parameter is omitted, the filename of the provided image file will be used instead.
* The "type" parameter should be 'gallery' for page content images, and 'drawio' should only be used
* when the file is a PNG file with diagrams.net image data embedded within.
*/
public function create(Request $request)
{
$this->checkPermission('image-create-all');
$data = $this->validate($request, $this->rules()['create']);
Page::visible()->findOrFail($data['uploaded_to']);
$image = $this->imageRepo->saveNew($data['image'], $data['type'], $data['uploaded_to']);
if (isset($data['name'])) {
$image->refresh();
$image->update(['name' => $data['name']]);
}
return response()->json($this->formatForSingleResponse($image));
}
/**
* View the details of a single image.
* The "thumbs" response property contains links to scaled variants that BookStack may use in its UI.
* The "content" response property provides HTML and Markdown content, in the format that BookStack
* would typically use by default to add the image in page content, as a convenience.
* Actual image file data is not provided but can be fetched via the "url" response property.
*/
public function read(string $id)
{
$image = Image::query()->scopes(['visible'])->findOrFail($id);
return response()->json($this->formatForSingleResponse($image));
}
/**
* Update the details of an existing image in the system.
* Only allows updating of the image name at this time.
*/
public function update(Request $request, string $id)
{
$data = $this->validate($request, $this->rules()['update']);
$image = $this->imageRepo->getById($id);
$this->checkOwnablePermission('page-view', $image->getPage());
$this->checkOwnablePermission('image-update', $image);
$this->imageRepo->updateImageDetails($image, $data);
return response()->json($this->formatForSingleResponse($image));
}
/**
* Delete an image from the system.
* Will also delete thumbnails for the image.
* Does not check or handle image usage so this could leave pages with broken image references.
*/
public function delete(string $id)
{
$image = $this->imageRepo->getById($id);
$this->checkOwnablePermission('page-view', $image->getPage());
$this->checkOwnablePermission('image-delete', $image);
$this->imageRepo->destroyImage($image);
return response('', 204);
}
/**
* Format the given image model for single-result display.
*/
protected function formatForSingleResponse(Image $image): array
{
$this->imageRepo->loadThumbs($image);
$data = $image->getAttributes();
$data['created_by'] = $image->createdBy;
$data['updated_by'] = $image->updatedBy;
$data['content'] = [];
$escapedUrl = htmlentities($image->url);
$escapedName = htmlentities($image->name);
if ($image->type === 'drawio') {
$data['content']['html'] = "<div drawio-diagram=\"{$image->id}\"><img src=\"{$escapedUrl}\"></div>";
$data['content']['markdown'] = $data['content']['html'];
} else {
$escapedDisplayThumb = htmlentities($image->thumbs['display']);
$data['content']['html'] = "<a href=\"{$escapedUrl}\" target=\"_blank\"><img src=\"{$escapedDisplayThumb}\" alt=\"{$escapedName}\"></a>";
$mdEscapedName = str_replace(']', '', str_replace('[', '', $image->name));
$mdEscapedThumb = str_replace(']', '', str_replace('[', '', $image->thumbs['display']));
$data['content']['markdown'] = "![{$mdEscapedName}]({$mdEscapedThumb})";
}
return $data;
}
}

View file

@ -0,0 +1,136 @@
<?php
namespace BookStack\Http\Controllers\Api;
use BookStack\Auth\Permissions\PermissionsRepo;
use BookStack\Auth\Role;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RoleApiController extends ApiController
{
protected PermissionsRepo $permissionsRepo;
protected array $fieldsToExpose = [
'display_name', 'description', 'mfa_enforced', 'external_auth_id', 'created_at', 'updated_at',
];
protected $rules = [
'create' => [
'display_name' => ['required', 'string', 'min:3', 'max:180'],
'description' => ['string', 'max:180'],
'mfa_enforced' => ['boolean'],
'external_auth_id' => ['string'],
'permissions' => ['array'],
'permissions.*' => ['string'],
],
'update' => [
'display_name' => ['string', 'min:3', 'max:180'],
'description' => ['string', 'max:180'],
'mfa_enforced' => ['boolean'],
'external_auth_id' => ['string'],
'permissions' => ['array'],
'permissions.*' => ['string'],
]
];
public function __construct(PermissionsRepo $permissionsRepo)
{
$this->permissionsRepo = $permissionsRepo;
// Checks for all endpoints in this controller
$this->middleware(function ($request, $next) {
$this->checkPermission('user-roles-manage');
return $next($request);
});
}
/**
* Get a listing of roles in the system.
* Requires permission to manage roles.
*/
public function list()
{
$roles = Role::query()->select(['*'])
->withCount(['users', 'permissions']);
return $this->apiListingResponse($roles, [
...$this->fieldsToExpose,
'permissions_count',
'users_count',
]);
}
/**
* Create a new role in the system.
* Permissions should be provided as an array of permission name strings.
* Requires permission to manage roles.
*/
public function create(Request $request)
{
$data = $this->validate($request, $this->rules()['create']);
$role = null;
DB::transaction(function () use ($data, &$role) {
$role = $this->permissionsRepo->saveNewRole($data);
});
$this->singleFormatter($role);
return response()->json($role);
}
/**
* View the details of a single role.
* Provides the permissions and a high-level list of the users assigned.
* Requires permission to manage roles.
*/
public function read(string $id)
{
$role = $this->permissionsRepo->getRoleById($id);
$this->singleFormatter($role);
return response()->json($role);
}
/**
* Update an existing role in the system.
* Permissions should be provided as an array of permission name strings.
* An empty "permissions" array would clear granted permissions.
* In many cases, where permissions are changed, you'll want to fetch the existing
* permissions and then modify before providing in your update request.
* Requires permission to manage roles.
*/
public function update(Request $request, string $id)
{
$data = $this->validate($request, $this->rules()['update']);
$role = $this->permissionsRepo->updateRole($id, $data);
$this->singleFormatter($role);
return response()->json($role);
}
/**
* Delete a role from the system.
* Requires permission to manage roles.
*/
public function delete(string $id)
{
$this->permissionsRepo->deleteRole(intval($id));
return response('', 204);
}
/**
* Format the given role model for single-result display.
*/
protected function singleFormatter(Role $role)
{
$role->load('users:id,name,slug');
$role->unsetRelation('permissions');
$role->setAttribute('permissions', $role->permissions()->orderBy('name', 'asc')->pluck('name'));
$role->makeVisible(['users', 'permissions']);
}
}

View file

@ -13,9 +13,9 @@ use Illuminate\Validation\Rules\Unique;
class UserApiController extends ApiController class UserApiController extends ApiController
{ {
protected $userRepo; protected UserRepo $userRepo;
protected $fieldsToExpose = [ protected array $fieldsToExpose = [
'email', 'created_at', 'updated_at', 'last_activity_at', 'external_auth_id', 'email', 'created_at', 'updated_at', 'last_activity_at', 'external_auth_id',
]; ];

View file

@ -15,16 +15,10 @@ use Illuminate\Validation\ValidationException;
class AttachmentController extends Controller class AttachmentController extends Controller
{ {
protected AttachmentService $attachmentService; public function __construct(
protected PageRepo $pageRepo; protected AttachmentService $attachmentService,
protected PageRepo $pageRepo
/** ) {
* AttachmentController constructor.
*/
public function __construct(AttachmentService $attachmentService, PageRepo $pageRepo)
{
$this->attachmentService = $attachmentService;
$this->pageRepo = $pageRepo;
} }
/** /**
@ -112,7 +106,7 @@ class AttachmentController extends Controller
try { try {
$this->validate($request, [ $this->validate($request, [
'attachment_edit_name' => ['required', 'string', 'min:1', 'max:255'], 'attachment_edit_name' => ['required', 'string', 'min:1', 'max:255'],
'attachment_edit_url' => ['string', 'min:1', 'max:255', 'safe_url'], 'attachment_edit_url' => ['string', 'min:1', 'max:2000', 'safe_url'],
]); ]);
} catch (ValidationException $exception) { } catch (ValidationException $exception) {
return response()->view('attachments.manager-edit-form', array_merge($request->only(['attachment_edit_name', 'attachment_edit_url']), [ return response()->view('attachments.manager-edit-form', array_merge($request->only(['attachment_edit_name', 'attachment_edit_url']), [
@ -148,7 +142,7 @@ class AttachmentController extends Controller
$this->validate($request, [ $this->validate($request, [
'attachment_link_uploaded_to' => ['required', 'integer', 'exists:pages,id'], 'attachment_link_uploaded_to' => ['required', 'integer', 'exists:pages,id'],
'attachment_link_name' => ['required', 'string', 'min:1', 'max:255'], 'attachment_link_name' => ['required', 'string', 'min:1', 'max:255'],
'attachment_link_url' => ['required', 'string', 'min:1', 'max:255', 'safe_url'], 'attachment_link_url' => ['required', 'string', 'min:1', 'max:2000', 'safe_url'],
]); ]);
} catch (ValidationException $exception) { } catch (ValidationException $exception) {
return response()->view('attachments.manager-link-form', array_merge($request->only(['attachment_link_name', 'attachment_link_url']), [ return response()->view('attachments.manager-link-form', array_merge($request->only(['attachment_link_name', 'attachment_link_url']), [

View file

@ -10,14 +10,9 @@ use Illuminate\Validation\ValidationException;
class GalleryImageController extends Controller class GalleryImageController extends Controller
{ {
protected $imageRepo; public function __construct(
protected ImageRepo $imageRepo
/** ) {
* GalleryImageController constructor.
*/
public function __construct(ImageRepo $imageRepo)
{
$this->imageRepo = $imageRepo;
} }
/** /**

View file

@ -74,13 +74,17 @@ class RoleController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$this->checkPermission('user-roles-manage'); $this->checkPermission('user-roles-manage');
$this->validate($request, [ $data = $this->validate($request, [
'display_name' => ['required', 'min:3', 'max:180'], 'display_name' => ['required', 'min:3', 'max:180'],
'description' => ['max:180'], 'description' => ['max:180'],
'external_auth_id' => ['string'],
'permissions' => ['array'],
'mfa_enforced' => ['string'],
]); ]);
$this->permissionsRepo->saveNewRole($request->all()); $data['permissions'] = array_keys($data['permissions'] ?? []);
$this->showSuccessNotification(trans('settings.role_create_success')); $data['mfa_enforced'] = ($data['mfa_enforced'] ?? 'false') === 'true';
$this->permissionsRepo->saveNewRole($data);
return redirect('/settings/roles'); return redirect('/settings/roles');
} }
@ -100,19 +104,21 @@ class RoleController extends Controller
/** /**
* Updates a user role. * Updates a user role.
*
* @throws ValidationException
*/ */
public function update(Request $request, string $id) public function update(Request $request, string $id)
{ {
$this->checkPermission('user-roles-manage'); $this->checkPermission('user-roles-manage');
$this->validate($request, [ $data = $this->validate($request, [
'display_name' => ['required', 'min:3', 'max:180'], 'display_name' => ['required', 'min:3', 'max:180'],
'description' => ['max:180'], 'description' => ['max:180'],
'external_auth_id' => ['string'],
'permissions' => ['array'],
'mfa_enforced' => ['string'],
]); ]);
$this->permissionsRepo->updateRole($id, $request->all()); $data['permissions'] = array_keys($data['permissions'] ?? []);
$this->showSuccessNotification(trans('settings.role_update_success')); $data['mfa_enforced'] = ($data['mfa_enforced'] ?? 'false') === 'true';
$this->permissionsRepo->updateRole($id, $data);
return redirect('/settings/roles'); return redirect('/settings/roles');
} }
@ -145,15 +151,13 @@ class RoleController extends Controller
$this->checkPermission('user-roles-manage'); $this->checkPermission('user-roles-manage');
try { try {
$this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id')); $this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id', 0));
} catch (PermissionsException $e) { } catch (PermissionsException $e) {
$this->showErrorNotification($e->getMessage()); $this->showErrorNotification($e->getMessage());
return redirect()->back(); return redirect()->back();
} }
$this->showSuccessNotification(trans('settings.role_delete_success'));
return redirect('/settings/roles'); return redirect('/settings/roles');
} }
} }

View file

@ -21,8 +21,8 @@ class ValidationRuleServiceProvider extends ServiceProvider
Validator::extend('safe_url', function ($attribute, $value, $parameters, $validator) { Validator::extend('safe_url', function ($attribute, $value, $parameters, $validator) {
$cleanLinkName = strtolower(trim($value)); $cleanLinkName = strtolower(trim($value));
$isJs = strpos($cleanLinkName, 'javascript:') === 0; $isJs = str_starts_with($cleanLinkName, 'javascript:');
$isData = strpos($cleanLinkName, 'data:') === 0; $isData = str_starts_with($cleanLinkName, 'data:');
return !$isJs && !$isData; return !$isJs && !$isData;
}); });

View file

@ -54,10 +54,10 @@ class CrossLinkParser
{ {
$links = []; $links = [];
$html = '<body>' . $html . '</body>'; $html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
$doc = new DOMDocument(); $doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $doc->loadHTML($html);
$xPath = new DOMXPath($doc); $xPath = new DOMXPath($doc);
$anchors = $xPath->query('//a[@href]'); $anchors = $xPath->query('//a[@href]');

View file

@ -15,25 +15,18 @@ class SearchIndex
{ {
/** /**
* A list of delimiter characters used to break-up parsed content into terms for indexing. * A list of delimiter characters used to break-up parsed content into terms for indexing.
*
* @var string
*/ */
public static $delimiters = " \n\t.,!?:;()[]{}<>`'\""; public static string $delimiters = " \n\t.,!?:;()[]{}<>`'\"";
/** public function __construct(
* @var EntityProvider protected EntityProvider $entityProvider
*/ ) {
protected $entityProvider;
public function __construct(EntityProvider $entityProvider)
{
$this->entityProvider = $entityProvider;
} }
/** /**
* Index the given entity. * Index the given entity.
*/ */
public function indexEntity(Entity $entity) public function indexEntity(Entity $entity): void
{ {
$this->deleteEntityTerms($entity); $this->deleteEntityTerms($entity);
$terms = $this->entityToTermDataArray($entity); $terms = $this->entityToTermDataArray($entity);
@ -45,7 +38,7 @@ class SearchIndex
* *
* @param Entity[] $entities * @param Entity[] $entities
*/ */
public function indexEntities(array $entities) public function indexEntities(array $entities): void
{ {
$terms = []; $terms = [];
foreach ($entities as $entity) { foreach ($entities as $entity) {
@ -69,7 +62,7 @@ class SearchIndex
* *
* @param callable(Entity, int, int):void|null $progressCallback * @param callable(Entity, int, int):void|null $progressCallback
*/ */
public function indexAllEntities(?callable $progressCallback = null) public function indexAllEntities(?callable $progressCallback = null): void
{ {
SearchTerm::query()->truncate(); SearchTerm::query()->truncate();
@ -101,7 +94,7 @@ class SearchIndex
/** /**
* Delete related Entity search terms. * Delete related Entity search terms.
*/ */
public function deleteEntityTerms(Entity $entity) public function deleteEntityTerms(Entity $entity): void
{ {
$entity->searchTerms()->delete(); $entity->searchTerms()->delete();
} }
@ -145,12 +138,12 @@ class SearchIndex
'h6' => 1.5, 'h6' => 1.5,
]; ];
$html = '<body>' . $html . '</body>'; $html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
$html = str_ireplace(['<br>', '<br />', '<br/>'], "\n", $html); $html = str_ireplace(['<br>', '<br />', '<br/>'], "\n", $html);
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
$doc = new DOMDocument(); $doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $doc->loadHTML($html);
$topElems = $doc->documentElement->childNodes->item(0)->childNodes; $topElems = $doc->documentElement->childNodes->item(0)->childNodes;
/** @var DOMNode $child */ /** @var DOMNode $child */

View file

@ -3,45 +3,29 @@
namespace BookStack\Settings; namespace BookStack\Settings;
use BookStack\Auth\User; use BookStack\Auth\User;
use Illuminate\Contracts\Cache\Repository as Cache;
/** /**
* Class SettingService * Class SettingService
* The settings are a simple key-value database store. * The settings are a simple key-value database store.
* For non-authenticated users, user settings are stored via the session instead. * For non-authenticated users, user settings are stored via the session instead.
* A local array-based cache is used to for setting accesses across a request.
*/ */
class SettingService class SettingService
{ {
protected Setting $setting;
protected Cache $cache;
protected array $localCache = []; protected array $localCache = [];
protected string $cachePrefix = 'setting-';
public function __construct(Setting $setting, Cache $cache)
{
$this->setting = $setting;
$this->cache = $cache;
}
/** /**
* Gets a setting from the database, * Gets a setting from the database,
* If not found, Returns default, Which is false by default. * If not found, Returns default, Which is false by default.
*/ */
public function get(string $key, $default = null) public function get(string $key, $default = null): mixed
{ {
if (is_null($default)) { if (is_null($default)) {
$default = config('setting-defaults.' . $key, false); $default = config('setting-defaults.' . $key, false);
} }
if (isset($this->localCache[$key])) {
return $this->localCache[$key];
}
$value = $this->getValueFromStore($key) ?? $default; $value = $this->getValueFromStore($key) ?? $default;
$formatted = $this->formatValue($value, $default); return $this->formatValue($value, $default);
$this->localCache[$key] = $formatted;
return $formatted;
} }
/** /**
@ -79,52 +63,78 @@ class SettingService
} }
/** /**
* Gets a setting value from the cache or database. * Gets a setting value from the local cache.
* Looks at the system defaults if not cached or in database. * Will load the local cache if not previously loaded.
* Returns null if nothing is found.
*/ */
protected function getValueFromStore(string $key) protected function getValueFromStore(string $key): mixed
{ {
// Check the cache $cacheCategory = $this->localCacheCategory($key);
$cacheKey = $this->cachePrefix . $key; if (!isset($this->localCache[$cacheCategory])) {
$cacheVal = $this->cache->get($cacheKey, null); $this->loadToLocalCache($cacheCategory);
if ($cacheVal !== null) {
return $cacheVal;
} }
// Check the database return $this->localCache[$cacheCategory][$key] ?? null;
$settingObject = $this->getSettingObjectByKey($key);
if ($settingObject !== null) {
$value = $settingObject->value;
if ($settingObject->type === 'array') {
$value = json_decode($value, true) ?? [];
}
$this->cache->forever($cacheKey, $value);
return $value;
}
return null;
} }
/** /**
* Clear an item from the cache completely. * Put the given value into the local cached under the given key.
*/ */
protected function clearFromCache(string $key) protected function putValueIntoLocalCache(string $key, mixed $value): void
{ {
$cacheKey = $this->cachePrefix . $key; $cacheCategory = $this->localCacheCategory($key);
$this->cache->forget($cacheKey); if (!isset($this->localCache[$cacheCategory])) {
if (isset($this->localCache[$key])) { $this->loadToLocalCache($cacheCategory);
unset($this->localCache[$key]); }
$this->localCache[$cacheCategory][$key] = $value;
}
/**
* Get the category for the given setting key.
* Will return 'app' for a general app setting otherwise 'user:<user_id>' for a user setting.
*/
protected function localCacheCategory(string $key): string
{
if (str_starts_with($key, 'user:')) {
return implode(':', array_slice(explode(':', $key), 0, 2));
}
return 'app';
}
/**
* For the given category, load the relevant settings from the database into the local cache.
*/
protected function loadToLocalCache(string $cacheCategory): void
{
$query = Setting::query();
if ($cacheCategory === 'app') {
$query->where('setting_key', 'not like', 'user:%');
} else {
$query->where('setting_key', 'like', $cacheCategory . ':%');
}
$settings = $query->toBase()->get();
if (!isset($this->localCache[$cacheCategory])) {
$this->localCache[$cacheCategory] = [];
}
foreach ($settings as $setting) {
$value = $setting->value;
if ($setting->type === 'array') {
$value = json_decode($value, true) ?? [];
}
$this->localCache[$cacheCategory][$setting->setting_key] = $value;
} }
} }
/** /**
* Format a settings value. * Format a settings value.
*/ */
protected function formatValue($value, $default) protected function formatValue(mixed $value, mixed $default): mixed
{ {
// Change string booleans to actual booleans // Change string booleans to actual booleans
if ($value === 'true') { if ($value === 'true') {
@ -155,21 +165,22 @@ class SettingService
* Add a setting to the database. * Add a setting to the database.
* Values can be an array or a string. * Values can be an array or a string.
*/ */
public function put(string $key, $value): bool public function put(string $key, mixed $value): bool
{ {
$setting = $this->setting->newQuery()->firstOrNew([ $setting = Setting::query()->firstOrNew([
'setting_key' => $key, 'setting_key' => $key,
]); ]);
$setting->type = 'string'; $setting->type = 'string';
$setting->value = $value;
if (is_array($value)) { if (is_array($value)) {
$setting->type = 'array'; $setting->type = 'array';
$value = $this->formatArrayValue($value); $setting->value = $this->formatArrayValue($value);
} }
$setting->value = $value;
$setting->save(); $setting->save();
$this->clearFromCache($key); $this->putValueIntoLocalCache($key, $value);
return true; return true;
} }
@ -209,7 +220,7 @@ class SettingService
* Can only take string value types since this may use * Can only take string value types since this may use
* the session which is less flexible to data types. * the session which is less flexible to data types.
*/ */
public function putForCurrentUser(string $key, string $value) public function putForCurrentUser(string $key, string $value): bool
{ {
return $this->putUser(user(), $key, $value); return $this->putUser(user(), $key, $value);
} }
@ -231,15 +242,19 @@ class SettingService
if ($setting) { if ($setting) {
$setting->delete(); $setting->delete();
} }
$this->clearFromCache($key);
$cacheCategory = $this->localCacheCategory($key);
if (isset($this->localCache[$cacheCategory])) {
unset($this->localCache[$cacheCategory][$key]);
}
} }
/** /**
* Delete settings for a given user id. * Delete settings for a given user id.
*/ */
public function deleteUserSettings(string $userId) public function deleteUserSettings(string $userId): void
{ {
return $this->setting->newQuery() Setting::query()
->where('setting_key', 'like', $this->userKey($userId) . '%') ->where('setting_key', 'like', $this->userKey($userId) . '%')
->delete(); ->delete();
} }
@ -249,7 +264,16 @@ class SettingService
*/ */
protected function getSettingObjectByKey(string $key): ?Setting protected function getSettingObjectByKey(string $key): ?Setting
{ {
return $this->setting->newQuery() return Setting::query()
->where('setting_key', '=', $key)->first(); ->where('setting_key', '=', $key)
->first();
}
/**
* Empty the local setting value cache used by this service.
*/
public function flushCache(): void
{
$this->localCache = [];
} }
} }

View file

@ -40,12 +40,10 @@ class Attachment extends Model
/** /**
* Get the downloadable file name for this upload. * Get the downloadable file name for this upload.
*
* @return mixed|string
*/ */
public function getFileName() public function getFileName(): string
{ {
if (strpos($this->name, '.') !== false) { if (str_contains($this->name, '.')) {
return $this->name; return $this->name;
} }
@ -71,7 +69,7 @@ class Attachment extends Model
*/ */
public function getUrl($openInline = false): string public function getUrl($openInline = false): string
{ {
if ($this->external && strpos($this->path, 'http') !== 0) { if ($this->external && !str_starts_with($this->path, 'http')) {
return $this->path; return $this->path;
} }

View file

@ -3,9 +3,11 @@
namespace BookStack\Uploads; namespace BookStack\Uploads;
use BookStack\Auth\Permissions\JointPermission; use BookStack\Auth\Permissions\JointPermission;
use BookStack\Auth\Permissions\PermissionApplicator;
use BookStack\Entities\Models\Page; use BookStack\Entities\Models\Page;
use BookStack\Model; use BookStack\Model;
use BookStack\Traits\HasCreatorAndUpdater; use BookStack\Traits\HasCreatorAndUpdater;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
@ -33,12 +35,21 @@ class Image extends Model
->where('joint_permissions.entity_type', '=', 'page'); ->where('joint_permissions.entity_type', '=', 'page');
} }
/**
* Scope the query to just the images visible to the user based upon the
* user visibility of the uploaded_to page.
*/
public function scopeVisible(Builder $query): Builder
{
return app()->make(PermissionApplicator::class)->restrictPageRelationQuery($query, 'images', 'uploaded_to');
}
/** /**
* Get a thumbnail for this image. * Get a thumbnail for this image.
* *
* @throws \Exception * @throws \Exception
*/ */
public function getThumb(int $width, int $height, bool $keepRatio = false): string public function getThumb(?int $width, ?int $height, bool $keepRatio = false): string
{ {
return app()->make(ImageService::class)->getThumbnail($this, $width, $height, $keepRatio); return app()->make(ImageService::class)->getThumbnail($this, $width, $height, $keepRatio);
} }

View file

@ -19,10 +19,10 @@ class HtmlContentFilter
return $html; return $html;
} }
$html = '<body>' . $html . '</body>'; $html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
libxml_use_internal_errors(true); libxml_use_internal_errors(true);
$doc = new DOMDocument(); $doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $doc->loadHTML($html);
$xPath = new DOMXPath($doc); $xPath = new DOMXPath($doc);
// Remove standard script tags // Remove standard script tags

View file

@ -24,6 +24,7 @@ class LanguageManager
'bg' => ['iso' => 'bg_BG', 'windows' => 'Bulgarian'], 'bg' => ['iso' => 'bg_BG', 'windows' => 'Bulgarian'],
'bs' => ['iso' => 'bs_BA', 'windows' => 'Bosnian (Latin)'], 'bs' => ['iso' => 'bs_BA', 'windows' => 'Bosnian (Latin)'],
'ca' => ['iso' => 'ca', 'windows' => 'Catalan'], 'ca' => ['iso' => 'ca', 'windows' => 'Catalan'],
'cs' => ['iso' => 'cs_CZ', 'windows' => 'Czech'],
'da' => ['iso' => 'da_DK', 'windows' => 'Danish'], 'da' => ['iso' => 'da_DK', 'windows' => 'Danish'],
'de' => ['iso' => 'de_DE', 'windows' => 'German'], 'de' => ['iso' => 'de_DE', 'windows' => 'German'],
'de_informal' => ['iso' => 'de_DE', 'windows' => 'German'], 'de_informal' => ['iso' => 'de_DE', 'windows' => 'German'],
@ -120,14 +121,14 @@ class LanguageManager
$isoLang = $this->localeMap[$language]['iso'] ?? ''; $isoLang = $this->localeMap[$language]['iso'] ?? '';
$isoLangPrefix = explode('_', $isoLang)[0]; $isoLangPrefix = explode('_', $isoLang)[0];
$locales = array_filter([ $locales = array_values(array_filter([
$isoLang ? $isoLang . '.utf8' : false, $isoLang ? $isoLang . '.utf8' : false,
$isoLang ?: false, $isoLang ?: false,
$isoLang ? str_replace('_', '-', $isoLang) : false, $isoLang ? str_replace('_', '-', $isoLang) : false,
$isoLang ? $isoLangPrefix . '.UTF-8' : false, $isoLang ? $isoLangPrefix . '.UTF-8' : false,
$this->localeMap[$language]['windows'] ?? false, $this->localeMap[$language]['windows'] ?? false,
$language, $language,
]); ]));
if (!empty($locales)) { if (!empty($locales)) {
setlocale(LC_TIME, $locales[0], ...array_slice($locales, 1)); setlocale(LC_TIME, $locales[0], ...array_slice($locales, 1));

View file

@ -49,7 +49,7 @@
"nunomaduro/larastan": "^2.4", "nunomaduro/larastan": "^2.4",
"phpunit/phpunit": "^9.5", "phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "^3.7", "squizlabs/php_codesniffer": "^3.7",
"ssddanbrown/asserthtml": "^1.0" "ssddanbrown/asserthtml": "^2.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

296
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "64276cbeb1f79f4c94992cc739807d72", "content-hash": "5a066407dfbd1809ffd39114a873333d",
"packages": [ "packages": [
{ {
"name": "aws/aws-crt-php", "name": "aws/aws-crt-php",
@ -58,16 +58,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.258.11", "version": "3.261.10",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "5e339f47f86db7ed5f5afcda345d30ac1713aed3" "reference": "4889eff2b3fe35e878fbcaf8374d73f043609170"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5e339f47f86db7ed5f5afcda345d30ac1713aed3", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4889eff2b3fe35e878fbcaf8374d73f043609170",
"reference": "5e339f47f86db7ed5f5afcda345d30ac1713aed3", "reference": "4889eff2b3fe35e878fbcaf8374d73f043609170",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -146,9 +146,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.258.11" "source": "https://github.com/aws/aws-sdk-php/tree/3.261.10"
}, },
"time": "2023-02-15T20:08:42+00:00" "time": "2023-03-13T18:19:14+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -417,21 +417,24 @@
}, },
{ {
"name": "dasprid/enum", "name": "dasprid/enum",
"version": "1.0.3", "version": "1.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/DASPRiD/Enum.git", "url": "https://github.com/DASPRiD/Enum.git",
"reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2" "reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2", "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8e6b6ea76eabbf19ea2bf5b67b98e1860474012f",
"reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2", "reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f",
"shasum": "" "shasum": ""
}, },
"require": {
"php": ">=7.1 <9.0"
},
"require-dev": { "require-dev": {
"phpunit/phpunit": "^7 | ^8 | ^9", "phpunit/phpunit": "^7 | ^8 | ^9",
"squizlabs/php_codesniffer": "^3.4" "squizlabs/php_codesniffer": "*"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -458,9 +461,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/DASPRiD/Enum/issues", "issues": "https://github.com/DASPRiD/Enum/issues",
"source": "https://github.com/DASPRiD/Enum/tree/1.0.3" "source": "https://github.com/DASPRiD/Enum/tree/1.0.4"
}, },
"time": "2020-10-02T16:03:48+00:00" "time": "2023-03-01T18:44:03+00:00"
}, },
{ {
"name": "dflydev/dot-access-data", "name": "dflydev/dot-access-data",
@ -632,16 +635,16 @@
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
"version": "3.6.0", "version": "3.6.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/dbal.git", "url": "https://github.com/doctrine/dbal.git",
"reference": "85b98cb23c8af471a67abfe14485da696bcabc2e" "reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/85b98cb23c8af471a67abfe14485da696bcabc2e", "url": "https://api.github.com/repos/doctrine/dbal/zipball/57815c7bbcda3cd18871d253c1dd8cbe56f8526e",
"reference": "85b98cb23c8af471a67abfe14485da696bcabc2e", "reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -657,11 +660,11 @@
"doctrine/coding-standard": "11.1.0", "doctrine/coding-standard": "11.1.0",
"fig/log-test": "^1", "fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2022.3", "jetbrains/phpstorm-stubs": "2022.3",
"phpstan/phpstan": "1.9.14", "phpstan/phpstan": "1.10.3",
"phpstan/phpstan-strict-rules": "^1.4", "phpstan/phpstan-strict-rules": "^1.5",
"phpunit/phpunit": "9.6.3", "phpunit/phpunit": "9.6.4",
"psalm/plugin-phpunit": "0.18.4", "psalm/plugin-phpunit": "0.18.4",
"squizlabs/php_codesniffer": "3.7.1", "squizlabs/php_codesniffer": "3.7.2",
"symfony/cache": "^5.4|^6.0", "symfony/cache": "^5.4|^6.0",
"symfony/console": "^4.4|^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0",
"vimeo/psalm": "4.30.0" "vimeo/psalm": "4.30.0"
@ -724,7 +727,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/dbal/issues", "issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/3.6.0" "source": "https://github.com/doctrine/dbal/tree/3.6.1"
}, },
"funding": [ "funding": [
{ {
@ -740,7 +743,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-02-07T22:52:03+00:00" "time": "2023-03-02T19:26:24+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
@ -1309,24 +1312,24 @@
}, },
{ {
"name": "graham-campbell/result-type", "name": "graham-campbell/result-type",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/GrahamCampbell/Result-Type.git", "url": "https://github.com/GrahamCampbell/Result-Type.git",
"reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2.5 || ^8.0", "php": "^7.2.5 || ^8.0",
"phpoption/phpoption": "^1.9" "phpoption/phpoption": "^1.9.1"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^8.5.28 || ^9.5.21" "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -1355,7 +1358,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/GrahamCampbell/Result-Type/issues", "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1"
}, },
"funding": [ "funding": [
{ {
@ -1367,7 +1370,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-30T15:56:11+00:00" "time": "2023-02-25T20:23:15+00:00"
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
@ -1583,16 +1586,16 @@
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.4.3", "version": "2.4.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "67c26b443f348a51926030c83481b85718457d3d" "reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", "url": "https://api.github.com/repos/guzzle/psr7/zipball/3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf",
"reference": "67c26b443f348a51926030c83481b85718457d3d", "reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1682,7 +1685,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.4.3" "source": "https://github.com/guzzle/psr7/tree/2.4.4"
}, },
"funding": [ "funding": [
{ {
@ -1698,7 +1701,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-10-26T14:07:24+00:00" "time": "2023-03-09T13:19:02+00:00"
}, },
{ {
"name": "guzzlehttp/uri-template", "name": "guzzlehttp/uri-template",
@ -1944,16 +1947,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v9.52.0", "version": "v9.52.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "eb85cd9d72e5bfa54b4d0d9040786f26d6184a9e" "reference": "9239128cfb4d22afefb64060dfecf53e82987267"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/eb85cd9d72e5bfa54b4d0d9040786f26d6184a9e", "url": "https://api.github.com/repos/laravel/framework/zipball/9239128cfb4d22afefb64060dfecf53e82987267",
"reference": "eb85cd9d72e5bfa54b4d0d9040786f26d6184a9e", "reference": "9239128cfb4d22afefb64060dfecf53e82987267",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2138,7 +2141,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2023-02-14T14:51:14+00:00" "time": "2023-02-22T14:38:06+00:00"
}, },
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
@ -2271,16 +2274,16 @@
}, },
{ {
"name": "laravel/tinker", "name": "laravel/tinker",
"version": "v2.8.0", "version": "v2.8.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/tinker.git", "url": "https://github.com/laravel/tinker.git",
"reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad" "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/tinker/zipball/74d0b287cc4ae65d15c368dd697aae71d62a73ad", "url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10",
"reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad", "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2333,9 +2336,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/laravel/tinker/issues", "issues": "https://github.com/laravel/tinker/issues",
"source": "https://github.com/laravel/tinker/tree/v2.8.0" "source": "https://github.com/laravel/tinker/tree/v2.8.1"
}, },
"time": "2023-01-10T18:03:30+00:00" "time": "2023-02-15T16:40:09+00:00"
}, },
{ {
"name": "league/commonmark", "name": "league/commonmark",
@ -2527,16 +2530,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.12.2", "version": "3.12.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f" "reference": "81e87e74dd5213795c7846d65089712d2dda90ce"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f6377c709d2275ed6feaf63e44be7a7162b0e77f", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/81e87e74dd5213795c7846d65089712d2dda90ce",
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f", "reference": "81e87e74dd5213795c7846d65089712d2dda90ce",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2598,7 +2601,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.12.2" "source": "https://github.com/thephpleague/flysystem/tree/3.12.3"
}, },
"funding": [ "funding": [
{ {
@ -2614,7 +2617,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-19T12:02:19+00:00" "time": "2023-02-18T15:32:41+00:00"
}, },
{ {
"name": "league/flysystem-aws-s3-v3", "name": "league/flysystem-aws-s3-v3",
@ -3462,16 +3465,16 @@
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.15.3", "version": "v4.15.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
"reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3512,9 +3515,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4"
}, },
"time": "2023-01-16T22:05:37+00:00" "time": "2023-03-05T19:49:14+00:00"
}, },
{ {
"name": "nunomaduro/termwind", "name": "nunomaduro/termwind",
@ -3867,24 +3870,24 @@
}, },
{ {
"name": "phpoption/phpoption", "name": "phpoption/phpoption",
"version": "1.9.0", "version": "1.9.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/schmittjoh/php-option.git", "url": "https://github.com/schmittjoh/php-option.git",
"reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e",
"reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2.5 || ^8.0" "php": "^7.2.5 || ^8.0"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.28 || ^9.5.21" "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -3926,7 +3929,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/schmittjoh/php-option/issues", "issues": "https://github.com/schmittjoh/php-option/issues",
"source": "https://github.com/schmittjoh/php-option/tree/1.9.0" "source": "https://github.com/schmittjoh/php-option/tree/1.9.1"
}, },
"funding": [ "funding": [
{ {
@ -3938,20 +3941,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-07-30T15:51:26+00:00" "time": "2023-02-25T19:38:58+00:00"
}, },
{ {
"name": "phpseclib/phpseclib", "name": "phpseclib/phpseclib",
"version": "3.0.18", "version": "3.0.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpseclib/phpseclib.git", "url": "https://github.com/phpseclib/phpseclib.git",
"reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da" "reference": "cc181005cf548bfd8a4896383bb825d859259f95"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f28693d38ba21bb0d9f0c411ee5dae2b178201da", "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cc181005cf548bfd8a4896383bb825d859259f95",
"reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da", "reference": "cc181005cf548bfd8a4896383bb825d859259f95",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4032,7 +4035,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpseclib/phpseclib/issues", "issues": "https://github.com/phpseclib/phpseclib/issues",
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.18" "source": "https://github.com/phpseclib/phpseclib/tree/3.0.19"
}, },
"funding": [ "funding": [
{ {
@ -4048,7 +4051,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-12-17T18:26:50+00:00" "time": "2023-03-05T17:13:09+00:00"
}, },
{ {
"name": "pragmarx/google2fa", "name": "pragmarx/google2fa",
@ -4104,33 +4107,27 @@
}, },
{ {
"name": "predis/predis", "name": "predis/predis",
"version": "v2.1.1", "version": "v2.1.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/predis/predis.git", "url": "https://github.com/predis/predis.git",
"reference": "c5b60884e89630f9518a7919f0566db438f0fc9a" "reference": "a77a43913a74f9331f637bb12867eb8e274814e5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/predis/predis/zipball/c5b60884e89630f9518a7919f0566db438f0fc9a", "url": "https://api.github.com/repos/predis/predis/zipball/a77a43913a74f9331f637bb12867eb8e274814e5",
"reference": "c5b60884e89630f9518a7919f0566db438f0fc9a", "reference": "a77a43913a74f9331f637bb12867eb8e274814e5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^3.3",
"phpstan/phpstan": "^1.9",
"phpunit/phpunit": "^8.0 || ~9.4.4" "phpunit/phpunit": "^8.0 || ~9.4.4"
}, },
"suggest": {
"ext-curl": "Allows access to Webdis when paired with phpiredis"
},
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.0-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Predis\\": "src/" "Predis\\": "src/"
@ -4145,12 +4142,6 @@
"name": "Till Krüss", "name": "Till Krüss",
"homepage": "https://till.im", "homepage": "https://till.im",
"role": "Maintainer" "role": "Maintainer"
},
{
"name": "Daniele Alessandri",
"email": "suppakilla@gmail.com",
"homepage": "http://clorophilla.net",
"role": "Creator"
} }
], ],
"description": "A flexible and feature-complete Redis client for PHP.", "description": "A flexible and feature-complete Redis client for PHP.",
@ -4162,7 +4153,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/predis/predis/issues", "issues": "https://github.com/predis/predis/issues",
"source": "https://github.com/predis/predis/tree/v2.1.1" "source": "https://github.com/predis/predis/tree/v2.1.2"
}, },
"funding": [ "funding": [
{ {
@ -4170,7 +4161,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-01-17T20:57:35+00:00" "time": "2023-03-02T18:32:04+00:00"
}, },
{ {
"name": "psr/cache", "name": "psr/cache",
@ -8043,16 +8034,16 @@
}, },
{ {
"name": "filp/whoops", "name": "filp/whoops",
"version": "2.14.6", "version": "2.15.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/filp/whoops.git", "url": "https://github.com/filp/whoops.git",
"reference": "f7948baaa0330277c729714910336383286305da" "reference": "e864ac957acd66e1565f25efda61e37791a5db0b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da", "url": "https://api.github.com/repos/filp/whoops/zipball/e864ac957acd66e1565f25efda61e37791a5db0b",
"reference": "f7948baaa0330277c729714910336383286305da", "reference": "e864ac957acd66e1565f25efda61e37791a5db0b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8102,7 +8093,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/filp/whoops/issues", "issues": "https://github.com/filp/whoops/issues",
"source": "https://github.com/filp/whoops/tree/2.14.6" "source": "https://github.com/filp/whoops/tree/2.15.1"
}, },
"funding": [ "funding": [
{ {
@ -8110,7 +8101,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-11-02T16:23:29+00:00" "time": "2023-03-06T18:09:13+00:00"
}, },
{ {
"name": "hamcrest/hamcrest-php", "name": "hamcrest/hamcrest-php",
@ -8305,16 +8296,16 @@
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.11.0", "version": "1.11.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8352,7 +8343,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/myclabs/DeepCopy/issues", "issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
}, },
"funding": [ "funding": [
{ {
@ -8360,7 +8351,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-03T13:19:32+00:00" "time": "2023-03-08T13:26:56+00:00"
}, },
{ {
"name": "nunomaduro/collision", "name": "nunomaduro/collision",
@ -8452,16 +8443,16 @@
}, },
{ {
"name": "nunomaduro/larastan", "name": "nunomaduro/larastan",
"version": "2.4.0", "version": "2.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nunomaduro/larastan.git", "url": "https://github.com/nunomaduro/larastan.git",
"reference": "14f631348ead3e245651606931863b4f218d1f78" "reference": "072e2c9566ae000bf66c92384fc933b81885244b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nunomaduro/larastan/zipball/14f631348ead3e245651606931863b4f218d1f78", "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/072e2c9566ae000bf66c92384fc933b81885244b",
"reference": "14f631348ead3e245651606931863b4f218d1f78", "reference": "072e2c9566ae000bf66c92384fc933b81885244b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8475,11 +8466,11 @@
"illuminate/support": "^9.47.0 || ^10.0.0", "illuminate/support": "^9.47.0 || ^10.0.0",
"php": "^8.0.2", "php": "^8.0.2",
"phpmyadmin/sql-parser": "^5.6.0", "phpmyadmin/sql-parser": "^5.6.0",
"phpstan/phpstan": "^1.9.8" "phpstan/phpstan": "~1.10.3"
}, },
"require-dev": { "require-dev": {
"nikic/php-parser": "^4.15.2", "nikic/php-parser": "^4.15.2",
"orchestra/testbench": "^7.19.0|^8.0.0", "orchestra/testbench": "^7.19.0 || ^8.0.0",
"phpunit/phpunit": "^9.5.27" "phpunit/phpunit": "^9.5.27"
}, },
"suggest": { "suggest": {
@ -8524,7 +8515,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/nunomaduro/larastan/issues", "issues": "https://github.com/nunomaduro/larastan/issues",
"source": "https://github.com/nunomaduro/larastan/tree/2.4.0" "source": "https://github.com/nunomaduro/larastan/tree/2.5.1"
}, },
"funding": [ "funding": [
{ {
@ -8544,7 +8535,7 @@
"type": "patreon" "type": "patreon"
} }
], ],
"time": "2023-01-11T11:57:44+00:00" "time": "2023-03-04T23:46:40+00:00"
}, },
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
@ -8746,16 +8737,16 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.9.17", "version": "1.10.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "204e459e7822f2c586463029f5ecec31bb45a1f2" "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/204e459e7822f2c586463029f5ecec31bb45a1f2", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a",
"reference": "204e459e7822f2c586463029f5ecec31bb45a1f2", "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8785,7 +8776,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpstan/phpstan/issues", "issues": "https://github.com/phpstan/phpstan/issues",
"source": "https://github.com/phpstan/phpstan/tree/1.9.17" "source": "https://github.com/phpstan/phpstan/tree/1.10.6"
}, },
"funding": [ "funding": [
{ {
@ -8801,27 +8792,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-02-08T12:25:00+00:00" "time": "2023-03-09T16:55:12+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.24", "version": "9.2.26",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
"reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^4.14", "nikic/php-parser": "^4.15",
"php": ">=7.3", "php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3", "phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2", "phpunit/php-text-template": "^2.0.2",
@ -8836,8 +8827,8 @@
"phpunit/phpunit": "^9.3" "phpunit/phpunit": "^9.3"
}, },
"suggest": { "suggest": {
"ext-pcov": "*", "ext-pcov": "PHP extension that provides line coverage",
"ext-xdebug": "*" "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -8870,7 +8861,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26"
}, },
"funding": [ "funding": [
{ {
@ -8878,7 +8869,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-01-26T08:26:55+00:00" "time": "2023-03-06T12:58:08+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -9123,16 +9114,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.6.3", "version": "9.6.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5",
"reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9165,8 +9156,8 @@
"sebastian/version": "^3.0.2" "sebastian/version": "^3.0.2"
}, },
"suggest": { "suggest": {
"ext-soap": "*", "ext-soap": "To be able to generate mocks based on WSDL files",
"ext-xdebug": "*" "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
}, },
"bin": [ "bin": [
"phpunit" "phpunit"
@ -9205,7 +9196,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5"
}, },
"funding": [ "funding": [
{ {
@ -9221,7 +9212,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-02-04T13:37:15+00:00" "time": "2023-03-09T06:34:10+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -10189,16 +10180,16 @@
}, },
{ {
"name": "squizlabs/php_codesniffer", "name": "squizlabs/php_codesniffer",
"version": "3.7.1", "version": "3.7.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
"reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
"reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10234,27 +10225,28 @@
"homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
"keywords": [ "keywords": [
"phpcs", "phpcs",
"standards" "standards",
"static analysis"
], ],
"support": { "support": {
"issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
"source": "https://github.com/squizlabs/PHP_CodeSniffer", "source": "https://github.com/squizlabs/PHP_CodeSniffer",
"wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
}, },
"time": "2022-06-18T07:21:10+00:00" "time": "2023-02-22T23:07:41+00:00"
}, },
{ {
"name": "ssddanbrown/asserthtml", "name": "ssddanbrown/asserthtml",
"version": "v1.0.1", "version": "v2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ssddanbrown/htmlassert.git", "url": "https://github.com/ssddanbrown/asserthtml.git",
"reference": "f7d4352bb3d69347097b2841fd71934182821928" "reference": "6baf3ef2087f5928ae34f0d41db27aefcdf60414"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ssddanbrown/htmlassert/zipball/f7d4352bb3d69347097b2841fd71934182821928", "url": "https://api.github.com/repos/ssddanbrown/asserthtml/zipball/6baf3ef2087f5928ae34f0d41db27aefcdf60414",
"reference": "f7d4352bb3d69347097b2841fd71934182821928", "reference": "6baf3ef2087f5928ae34f0d41db27aefcdf60414",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10288,8 +10280,8 @@
"description": "HTML Content Assertions for PHPUnit", "description": "HTML Content Assertions for PHPUnit",
"homepage": "https://github.com/ssddanbrown/asserthtml", "homepage": "https://github.com/ssddanbrown/asserthtml",
"support": { "support": {
"issues": "https://github.com/ssddanbrown/htmlassert/issues", "issues": "https://github.com/ssddanbrown/asserthtml/issues",
"source": "https://github.com/ssddanbrown/htmlassert/tree/v1.0.1" "source": "https://github.com/ssddanbrown/asserthtml/tree/v2.0.0"
}, },
"funding": [ "funding": [
{ {
@ -10297,7 +10289,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-04-09T13:31:13+00:00" "time": "2023-03-01T16:48:08+00:00"
}, },
{ {
"name": "symfony/dom-crawler", "name": "symfony/dom-crawler",

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('attachments', function (Blueprint $table) {
$table->text('path')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('attachments', function (Blueprint $table) {
$table->string('path')->change();
});
}
};

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('pages', function (Blueprint $table) {
$table->index('updated_at', 'pages_updated_at_index');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('pages', function (Blueprint $table) {
$table->dropIndex('pages_updated_at_index');
});
}
};

View file

@ -0,0 +1,26 @@
{
"owner_id": 1,
"role_permissions": [
{
"role_id": 2,
"view": true,
"create": true,
"update": true,
"delete": false
},
{
"role_id": 3,
"view": false,
"create": false,
"update": false,
"delete": false
}
],
"fallback_permissions": {
"inheriting": false,
"view": true,
"create": true,
"update": false,
"delete": false
}
}

View file

@ -0,0 +1,3 @@
{
"name": "My updated image name"
}

View file

@ -0,0 +1,11 @@
{
"display_name": "Book Maintainer",
"description": "People who maintain books",
"mfa_enforced": true,
"permissions": [
"book-view-all",
"book-update-all",
"book-delete-all",
"restrictions-manage-all"
]
}

View file

@ -0,0 +1,14 @@
{
"display_name": "Book & Shelf Maintainers",
"description": "All those who maintain books & shelves",
"mfa_enforced": false,
"permissions": [
"book-view-all",
"book-update-all",
"book-delete-all",
"bookshelf-view-all",
"bookshelf-update-all",
"bookshelf-delete-all",
"restrictions-manage-all"
]
}

View file

@ -0,0 +1,38 @@
{
"owner": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"role_permissions": [
{
"role_id": 2,
"view": true,
"create": false,
"update": true,
"delete": false,
"role": {
"id": 2,
"display_name": "Editor"
}
},
{
"role_id": 10,
"view": true,
"create": true,
"update": false,
"delete": false,
"role": {
"id": 10,
"display_name": "Wizards of the west"
}
}
],
"fallback_permissions": {
"inheriting": false,
"view": true,
"create": false,
"update": false,
"delete": false
}
}

View file

@ -0,0 +1,38 @@
{
"owner": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"role_permissions": [
{
"role_id": 2,
"view": true,
"create": true,
"update": true,
"delete": false,
"role": {
"id": 2,
"display_name": "Editor"
}
},
{
"role_id": 3,
"view": false,
"create": false,
"update": false,
"delete": false,
"role": {
"id": 3,
"display_name": "Viewer"
}
}
],
"fallback_permissions": {
"inheriting": false,
"view": true,
"create": true,
"update": false,
"delete": false
}
}

View file

@ -0,0 +1,28 @@
{
"name": "cute-cat-image.png",
"path": "\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png",
"url": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png",
"type": "gallery",
"uploaded_to": 1,
"created_by": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"updated_by": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"updated_at": "2023-03-15 08:17:37",
"created_at": "2023-03-15 08:17:37",
"id": 618,
"thumbs": {
"gallery": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/thumbs-150-150\/cute-cat-image.png",
"display": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png"
},
"content": {
"html": "<a href=\"https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png\" target=\"_blank\"><img src=\"https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png\" alt=\"cute-cat-image.png\"><\/a>",
"markdown": "![cute-cat-image.png](https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png)"
}
}

View file

@ -0,0 +1,41 @@
{
"data": [
{
"id": 1,
"name": "My cat scribbles",
"url": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-02\/scribbles.jpg",
"path": "\/uploads\/images\/gallery\/2023-02\/scribbles.jpg",
"type": "gallery",
"uploaded_to": 1,
"created_by": 1,
"updated_by": 1,
"created_at": "2023-02-12T16:34:57.000000Z",
"updated_at": "2023-02-12T16:34:57.000000Z"
},
{
"id": 2,
"name": "Drawing-1.png",
"url": "https:\/\/bookstack.example.com\/uploads\/images\/drawio\/2023-02\/drawing-1.png",
"path": "\/uploads\/images\/drawio\/2023-02\/drawing-1.png",
"type": "drawio",
"uploaded_to": 2,
"created_by": 2,
"updated_by": 2,
"created_at": "2023-02-12T16:39:19.000000Z",
"updated_at": "2023-02-12T16:39:19.000000Z"
},
{
"id": 8,
"name": "beans.jpg",
"url": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-02\/beans.jpg",
"path": "\/uploads\/images\/gallery\/2023-02\/beans.jpg",
"type": "gallery",
"uploaded_to": 6,
"created_by": 1,
"updated_by": 1,
"created_at": "2023-02-15T19:37:44.000000Z",
"updated_at": "2023-02-15T19:37:44.000000Z"
}
],
"total": 3
}

View file

@ -0,0 +1,28 @@
{
"id": 618,
"name": "cute-cat-image.png",
"url": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png",
"created_at": "2023-03-15 08:17:37",
"updated_at": "2023-03-15 08:17:37",
"created_by": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"updated_by": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"path": "\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png",
"type": "gallery",
"uploaded_to": 1,
"thumbs": {
"gallery": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/thumbs-150-150\/cute-cat-image.png",
"display": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png"
},
"content": {
"html": "<a href=\"https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png\" target=\"_blank\"><img src=\"https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png\" alt=\"cute-cat-image.png\"><\/a>",
"markdown": "![cute-cat-image.png](https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png)"
}
}

View file

@ -0,0 +1,28 @@
{
"id": 618,
"name": "My updated image name",
"url": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png",
"created_at": "2023-03-15 08:17:37",
"updated_at": "2023-03-15 08:24:50",
"created_by": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"updated_by": {
"id": 1,
"name": "Admin",
"slug": "admin"
},
"path": "\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png",
"type": "gallery",
"uploaded_to": 1,
"thumbs": {
"gallery": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/thumbs-150-150\/cute-cat-image.png",
"display": "https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png"
},
"content": {
"html": "<a href=\"https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/cute-cat-image.png\" target=\"_blank\"><img src=\"https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png\" alt=\"My updated image name\"><\/a>",
"markdown": "![My updated image name](https:\/\/bookstack.example.com\/uploads\/images\/gallery\/2023-03\/scaled-1680-\/cute-cat-image.png)"
}
}

View file

@ -0,0 +1,15 @@
{
"display_name": "Book Maintainer",
"description": "People who maintain books",
"mfa_enforced": true,
"updated_at": "2023-02-19T15:38:40.000000Z",
"created_at": "2023-02-19T15:38:40.000000Z",
"id": 26,
"permissions": [
"book-delete-all",
"book-update-all",
"book-view-all",
"restrictions-manage-all"
],
"users": []
}

View file

@ -0,0 +1,41 @@
{
"data": [
{
"id": 1,
"display_name": "Admin",
"description": "Administrator of the whole application",
"created_at": "2021-09-29T16:29:19.000000Z",
"updated_at": "2022-11-03T13:26:18.000000Z",
"system_name": "admin",
"external_auth_id": "wizards",
"mfa_enforced": true,
"users_count": 11,
"permissions_count": 54
},
{
"id": 2,
"display_name": "Editor",
"description": "User can edit Books, Chapters & Pages",
"created_at": "2021-09-29T16:29:19.000000Z",
"updated_at": "2022-12-01T02:32:57.000000Z",
"system_name": "",
"external_auth_id": "",
"mfa_enforced": false,
"users_count": 17,
"permissions_count": 49
},
{
"id": 3,
"display_name": "Public",
"description": "The role given to public visitors if allowed",
"created_at": "2021-09-29T16:29:19.000000Z",
"updated_at": "2022-09-02T12:32:12.000000Z",
"system_name": "public",
"external_auth_id": "",
"mfa_enforced": false,
"users_count": 1,
"permissions_count": 2
}
],
"total": 3
}

View file

@ -0,0 +1,23 @@
{
"id": 26,
"display_name": "Book Maintainer",
"description": "People who maintain books",
"created_at": "2023-02-19T15:38:40.000000Z",
"updated_at": "2023-02-19T15:38:40.000000Z",
"system_name": "",
"external_auth_id": "",
"mfa_enforced": true,
"permissions": [
"book-delete-all",
"book-update-all",
"book-view-all",
"restrictions-manage-all"
],
"users": [
{
"id": 11,
"name": "Barry Scott",
"slug": "barry-scott"
}
]
}

View file

@ -0,0 +1,26 @@
{
"id": 26,
"display_name": "Book & Shelf Maintainers",
"description": "All those who maintain books & shelves",
"created_at": "2023-02-19T15:38:40.000000Z",
"updated_at": "2023-02-19T15:49:13.000000Z",
"system_name": "",
"external_auth_id": "",
"mfa_enforced": false,
"permissions": [
"book-delete-all",
"book-update-all",
"book-view-all",
"bookshelf-delete-all",
"bookshelf-update-all",
"bookshelf-view-all",
"restrictions-manage-all"
],
"users": [
{
"id": 11,
"name": "Barry Scott",
"slug": "barry-scott"
}
]
}

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'تم تحديث المستخدم بنجاح', 'user_update_notification' => 'تم تحديث المستخدم بنجاح',
'user_delete_notification' => 'تم إزالة المستخدم بنجاح', 'user_delete_notification' => 'تم إزالة المستخدم بنجاح',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'تم التعليق', 'commented_on' => 'تم التعليق',
'permissions_update' => 'تحديث الأذونات', 'permissions_update' => 'تحديث الأذونات',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'مُحدث :timeLength', 'meta_updated' => 'مُحدث :timeLength',
'meta_updated_name' => 'مُحدث :timeLength بواسطة :user', 'meta_updated_name' => 'مُحدث :timeLength بواسطة :user',
'meta_owned_name' => 'Owned by :user', 'meta_owned_name' => 'Owned by :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'اختيار الكيان', 'entity_select' => 'اختيار الكيان',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'صور', 'images' => 'صور',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'الأدوار', 'roles' => 'الأدوار',
'role_user_roles' => 'أدوار المستخدمين', 'role_user_roles' => 'أدوار المستخدمين',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'إنشاء دور جديد', 'role_create' => 'إنشاء دور جديد',
'role_create_success' => 'تم إنشاء الدور بنجاح',
'role_delete' => 'حذف الدور', 'role_delete' => 'حذف الدور',
'role_delete_confirm' => 'سيتم حذف الدور المسمى \':roleName\'.', 'role_delete_confirm' => 'سيتم حذف الدور المسمى \':roleName\'.',
'role_delete_users_assigned' => 'هذا الدور له: عدد المستخدمين المعينين له. إذا كنت ترغب في ترحيل المستخدمين من هذا الدور ، فحدد دورًا جديدًا أدناه.', 'role_delete_users_assigned' => 'هذا الدور له: عدد المستخدمين المعينين له. إذا كنت ترغب في ترحيل المستخدمين من هذا الدور ، فحدد دورًا جديدًا أدناه.',
'role_delete_no_migration' => "لا تقم بترجيل المستخدمين", 'role_delete_no_migration' => "لا تقم بترجيل المستخدمين",
'role_delete_sure' => 'تأكيد حذف الدور؟', 'role_delete_sure' => 'تأكيد حذف الدور؟',
'role_delete_success' => 'تم حذف الدور بنجاح',
'role_edit' => 'تعديل الدور', 'role_edit' => 'تعديل الدور',
'role_details' => 'تفاصيل الدور', 'role_details' => 'تفاصيل الدور',
'role_name' => 'اسم الدور', 'role_name' => 'اسم الدور',
@ -175,7 +173,6 @@ return [
'role_own' => 'ما يخص', 'role_own' => 'ما يخص',
'role_controlled_by_asset' => 'يتحكم فيها الأصول التي يتم رفعها إلى', 'role_controlled_by_asset' => 'يتحكم فيها الأصول التي يتم رفعها إلى',
'role_save' => 'حفظ الدور', 'role_save' => 'حفظ الدور',
'role_update_success' => 'تم تحديث الدور بنجاح',
'role_users' => 'مستخدمون داخل هذا الدور', 'role_users' => 'مستخدمون داخل هذا الدور',
'role_users_none' => 'لم يتم تعيين أي مستخدمين لهذا الدور', 'role_users_none' => 'لم يتم تعيين أي مستخدمين لهذا الدور',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Create New Webhook', 'webhooks_create' => 'Create New Webhook',
'webhooks_none_created' => 'No webhooks have yet been created.', 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook', 'webhooks_edit' => 'Edit Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Потребителят е обновен успешно', 'user_update_notification' => 'Потребителят е обновен успешно',
'user_delete_notification' => 'Потребителят е премахнат успешно', 'user_delete_notification' => 'Потребителят е премахнат успешно',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'коментирано на', 'commented_on' => 'коментирано на',
'permissions_update' => 'обновени права', 'permissions_update' => 'обновени права',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Актуализирано :timeLength', 'meta_updated' => 'Актуализирано :timeLength',
'meta_updated_name' => 'Актуализирано преди :timeLength от :user', 'meta_updated_name' => 'Актуализирано преди :timeLength от :user',
'meta_owned_name' => 'Притежавано от :user', 'meta_owned_name' => 'Притежавано от :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Избор на обект', 'entity_select' => 'Избор на обект',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Изображения', 'images' => 'Изображения',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Роли', 'roles' => 'Роли',
'role_user_roles' => 'Потребителски роли', 'role_user_roles' => 'Потребителски роли',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Създай нова роля', 'role_create' => 'Създай нова роля',
'role_create_success' => 'Ролята беше успешно създадена',
'role_delete' => 'Изтрий роля', 'role_delete' => 'Изтрий роля',
'role_delete_confirm' => 'Това ще изтрие ролята \':roleName\'.', 'role_delete_confirm' => 'Това ще изтрие ролята \':roleName\'.',
'role_delete_users_assigned' => 'В тази роля се намират :userCount потребители. Ако искате да преместите тези потребители в друга роля, моля изберете нова роля отдолу.', 'role_delete_users_assigned' => 'В тази роля се намират :userCount потребители. Ако искате да преместите тези потребители в друга роля, моля изберете нова роля отдолу.',
'role_delete_no_migration' => "Не премествай потребителите в нова роля", 'role_delete_no_migration' => "Не премествай потребителите в нова роля",
'role_delete_sure' => 'Сигурни ли сте, че искате да изтриете тази роля?', 'role_delete_sure' => 'Сигурни ли сте, че искате да изтриете тази роля?',
'role_delete_success' => 'Ролята беше успешно изтрита',
'role_edit' => 'Редактиране на роля', 'role_edit' => 'Редактиране на роля',
'role_details' => 'Детайли на роля', 'role_details' => 'Детайли на роля',
'role_name' => 'Име на ролята', 'role_name' => 'Име на ролята',
@ -175,7 +173,6 @@ return [
'role_own' => 'Собствени', 'role_own' => 'Собствени',
'role_controlled_by_asset' => 'Контролирани от актива, към който са качени', 'role_controlled_by_asset' => 'Контролирани от актива, към който са качени',
'role_save' => 'Запази ролята', 'role_save' => 'Запази ролята',
'role_update_success' => 'Ролята беше успешно актуализирана',
'role_users' => 'Потребители в тази роля', 'role_users' => 'Потребители в тази роля',
'role_users_none' => 'В момента няма потребители, назначени за тази роля', 'role_users_none' => 'В момента няма потребители, назначени за тази роля',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Уебкука', 'webhooks' => 'Уебкука',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Създай нова уебкука', 'webhooks_create' => 'Създай нова уебкука',
'webhooks_none_created' => 'Няма създадени уебкуки.', 'webhooks_none_created' => 'Няма създадени уебкуки.',
'webhooks_edit' => 'Редактирай уебкука', 'webhooks_edit' => 'Редактирай уебкука',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'User successfully updated', 'user_update_notification' => 'User successfully updated',
'user_delete_notification' => 'User successfully removed', 'user_delete_notification' => 'User successfully removed',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'je komentarisao/la na', 'commented_on' => 'je komentarisao/la na',
'permissions_update' => 'je ažurirao/la dozvole', 'permissions_update' => 'je ažurirao/la dozvole',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Ažurirana :timeLength', 'meta_updated' => 'Ažurirana :timeLength',
'meta_updated_name' => 'Ažurirana :timeLength od :user', 'meta_updated_name' => 'Ažurirana :timeLength od :user',
'meta_owned_name' => 'Vlasnik je :user', 'meta_owned_name' => 'Vlasnik je :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Odaberi entitet', 'entity_select' => 'Odaberi entitet',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Slike', 'images' => 'Slike',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Roles', 'roles' => 'Roles',
'role_user_roles' => 'User Roles', 'role_user_roles' => 'User Roles',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Create New Role', 'role_create' => 'Create New Role',
'role_create_success' => 'Role successfully created',
'role_delete' => 'Delete Role', 'role_delete' => 'Delete Role',
'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.', 'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.', 'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
'role_delete_no_migration' => "Don't migrate users", 'role_delete_no_migration' => "Don't migrate users",
'role_delete_sure' => 'Are you sure you want to delete this role?', 'role_delete_sure' => 'Are you sure you want to delete this role?',
'role_delete_success' => 'Role successfully deleted',
'role_edit' => 'Edit Role', 'role_edit' => 'Edit Role',
'role_details' => 'Role Details', 'role_details' => 'Role Details',
'role_name' => 'Role Name', 'role_name' => 'Role Name',
@ -175,7 +173,6 @@ return [
'role_own' => 'Own', 'role_own' => 'Own',
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to', 'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
'role_save' => 'Save Role', 'role_save' => 'Save Role',
'role_update_success' => 'Role successfully updated',
'role_users' => 'Users in this role', 'role_users' => 'Users in this role',
'role_users_none' => 'No users are currently assigned to this role', 'role_users_none' => 'No users are currently assigned to this role',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Create New Webhook', 'webhooks_create' => 'Create New Webhook',
'webhooks_none_created' => 'No webhooks have yet been created.', 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook', 'webhooks_edit' => 'Edit Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'User successfully updated', 'user_update_notification' => 'User successfully updated',
'user_delete_notification' => 'User successfully removed', 'user_delete_notification' => 'User successfully removed',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'ha comentat a', 'commented_on' => 'ha comentat a',
'permissions_update' => 'ha actualitzat els permisos', 'permissions_update' => 'ha actualitzat els permisos',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Actualitzat :timeLength', 'meta_updated' => 'Actualitzat :timeLength',
'meta_updated_name' => 'Actualitzat :timeLength per :user', 'meta_updated_name' => 'Actualitzat :timeLength per :user',
'meta_owned_name' => 'Propietat de :user', 'meta_owned_name' => 'Propietat de :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Selecciona una entitat', 'entity_select' => 'Selecciona una entitat',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Imatges', 'images' => 'Imatges',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Rols', 'roles' => 'Rols',
'role_user_roles' => 'Rols d\'usuari', 'role_user_roles' => 'Rols d\'usuari',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Crea un rol nou', 'role_create' => 'Crea un rol nou',
'role_create_success' => 'Rol creat correctament',
'role_delete' => 'Suprimeix el rol', 'role_delete' => 'Suprimeix el rol',
'role_delete_confirm' => 'Se suprimirà el rol amb el nom \':roleName\'.', 'role_delete_confirm' => 'Se suprimirà el rol amb el nom \':roleName\'.',
'role_delete_users_assigned' => 'Aquest rol té :userCount usuaris assignats. Si voleu migrar els usuaris d\'aquest rol, seleccioneu un rol nou a continuació.', 'role_delete_users_assigned' => 'Aquest rol té :userCount usuaris assignats. Si voleu migrar els usuaris d\'aquest rol, seleccioneu un rol nou a continuació.',
'role_delete_no_migration' => "No migris els usuaris", 'role_delete_no_migration' => "No migris els usuaris",
'role_delete_sure' => 'Segur que voleu suprimir aquest rol?', 'role_delete_sure' => 'Segur que voleu suprimir aquest rol?',
'role_delete_success' => 'Rol suprimit correctament',
'role_edit' => 'Edita el rol', 'role_edit' => 'Edita el rol',
'role_details' => 'Detalls del rol', 'role_details' => 'Detalls del rol',
'role_name' => 'Nom del rol', 'role_name' => 'Nom del rol',
@ -175,7 +173,6 @@ return [
'role_own' => 'Propi', 'role_own' => 'Propi',
'role_controlled_by_asset' => 'Controlat pel recurs en què es pugen', 'role_controlled_by_asset' => 'Controlat pel recurs en què es pugen',
'role_save' => 'Desa el rol', 'role_save' => 'Desa el rol',
'role_update_success' => 'Rol actualitzat correctament',
'role_users' => 'Usuaris amb aquest rol', 'role_users' => 'Usuaris amb aquest rol',
'role_users_none' => 'Ara mateix no hi ha cap usuari assignat a aquest rol', 'role_users_none' => 'Ara mateix no hi ha cap usuari assignat a aquest rol',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Create New Webhook', 'webhooks_create' => 'Create New Webhook',
'webhooks_none_created' => 'No webhooks have yet been created.', 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook', 'webhooks_edit' => 'Edit Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Uživatel byl úspěšně aktualizován', 'user_update_notification' => 'Uživatel byl úspěšně aktualizován',
'user_delete_notification' => 'Uživatel byl úspěšně odstraněn', 'user_delete_notification' => 'Uživatel byl úspěšně odstraněn',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'okomentoval/a', 'commented_on' => 'okomentoval/a',
'permissions_update' => 'oprávnění upravena', 'permissions_update' => 'oprávnění upravena',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Aktualizováno :timeLength', 'meta_updated' => 'Aktualizováno :timeLength',
'meta_updated_name' => 'Aktualizováno :timeLength uživatelem :user', 'meta_updated_name' => 'Aktualizováno :timeLength uživatelem :user',
'meta_owned_name' => 'Vlastník :user', 'meta_owned_name' => 'Vlastník :user',
'meta_reference_page_count' => 'Odkazováno na 1 stránce|Odkazováno na :count stránky', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Výběr entity', 'entity_select' => 'Výběr entity',
'entity_select_lack_permission' => 'Nemáte dostatečná oprávnění k výběru této položky', 'entity_select_lack_permission' => 'Nemáte dostatečná oprávnění k výběru této položky',
'images' => 'Obrázky', 'images' => 'Obrázky',
@ -141,7 +141,7 @@ return [
'books_search_this' => 'Prohledat tuto knihu', 'books_search_this' => 'Prohledat tuto knihu',
'books_navigation' => 'Navigace knihy', 'books_navigation' => 'Navigace knihy',
'books_sort' => 'Seřadit obsah knihy', 'books_sort' => 'Seřadit obsah knihy',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books.', 'books_sort_desc' => 'Přesunout kapitoly a stránky v knize pro přeuspořádání obsahu. Mohou být přidány další knihy, které umožňují snadný přesun kapitol a stránek mezi knihami.',
'books_sort_named' => 'Seřadit knihu :bookName', 'books_sort_named' => 'Seřadit knihu :bookName',
'books_sort_name' => 'Seřadit podle názvu', 'books_sort_name' => 'Seřadit podle názvu',
'books_sort_created' => 'Seřadit podle data vytvoření', 'books_sort_created' => 'Seřadit podle data vytvoření',
@ -150,17 +150,17 @@ return [
'books_sort_chapters_last' => 'Kapitoly jako poslední', 'books_sort_chapters_last' => 'Kapitoly jako poslední',
'books_sort_show_other' => 'Zobrazit ostatní knihy', 'books_sort_show_other' => 'Zobrazit ostatní knihy',
'books_sort_save' => 'Uložit nové pořadí', 'books_sort_save' => 'Uložit nové pořadí',
'books_sort_show_other_desc' => 'Add other books here to include them in the sort operation, and allow easy cross-book reorganisation.', 'books_sort_show_other_desc' => 'Přidejte sem další knihy, abyste je zahrnuli do operace třídění, a umožněte snadnou křížovou reorganizaci.',
'books_sort_move_up' => 'Move Up', 'books_sort_move_up' => 'Posunout Nahoru',
'books_sort_move_down' => 'Move Down', 'books_sort_move_down' => 'Posunout dolů',
'books_sort_move_prev_book' => 'Move to Previous Book', 'books_sort_move_prev_book' => 'Přesunout se na předchozí knihu',
'books_sort_move_next_book' => 'Move to Next Book', 'books_sort_move_next_book' => 'Přesunout se na další knihu',
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter', 'books_sort_move_prev_chapter' => 'Přesunout se do předchozí kapitoly',
'books_sort_move_next_chapter' => 'Move Into Next Chapter', 'books_sort_move_next_chapter' => 'Přesunout se do další kapitoly',
'books_sort_move_book_start' => 'Move to Start of Book', 'books_sort_move_book_start' => 'Přesunout se na začátek knihy',
'books_sort_move_book_end' => 'Move to End of Book', 'books_sort_move_book_end' => 'Přesunout se na konec knihy',
'books_sort_move_before_chapter' => 'Move to Before Chapter', 'books_sort_move_before_chapter' => 'Přesunout se před kapitolu',
'books_sort_move_after_chapter' => 'Move to After Chapter', 'books_sort_move_after_chapter' => 'Přesunout se za kapitolu',
'books_copy' => 'Kopírovat knihu', 'books_copy' => 'Kopírovat knihu',
'books_copy_success' => 'Kniha byla úspěšně zkopírována', 'books_copy_success' => 'Kniha byla úspěšně zkopírována',

View file

@ -50,7 +50,7 @@ return [
// Drawing & Images // Drawing & Images
'image_upload_error' => 'Nastala chyba během nahrávání souboru', 'image_upload_error' => 'Nastala chyba během nahrávání souboru',
'image_upload_type_error' => 'Typ nahrávaného obrázku je neplatný.', 'image_upload_type_error' => 'Typ nahrávaného obrázku je neplatný.',
'drawing_data_not_found' => 'Drawing data could not be loaded. The drawing file might no longer exist or you may not have permission to access it.', 'drawing_data_not_found' => 'Data výkresu nelze načíst. Výkresový soubor již nemusí existovat nebo nemusí mít oprávnění k němu přistupovat.',
// Attachments // Attachments
'attachment_not_found' => 'Příloha nenalezena', 'attachment_not_found' => 'Příloha nenalezena',

View file

@ -49,12 +49,12 @@ return [
'app_disable_comments_desc' => 'Vypne komentáře napříč všemi stránkami. <br> Existující komentáře se přestanou zobrazovat.', 'app_disable_comments_desc' => 'Vypne komentáře napříč všemi stránkami. <br> Existující komentáře se přestanou zobrazovat.',
// Color settings // Color settings
'color_scheme' => 'Application Color Scheme', 'color_scheme' => 'Barevné schéma aplikace',
'color_scheme_desc' => 'Set the colors to use in the BookStack interface. Colors can be configured separately for dark and light modes to best fit the theme and ensure legibility.', 'color_scheme_desc' => 'Nastavte barvy pro použití v rozhraní BookStack. Barvy mohou být nastaveny samostatně pro tmavé a světlé režimy, aby se nejlépe vešly do motivu a zajistila čitelnost.',
'ui_colors_desc' => 'Set the primary color and default link color for BookStack. The primary color is mainly used for the header banner, buttons and interface decorations. The default link color is used for text-based links and actions, both within written content and in the Bookstack interface.', 'ui_colors_desc' => 'Nastavte primární barvu a výchozí barvu odkazů pro BookStack. Hlavní barva se používá hlavně pro banner hlavičky, tlačítka a dekorace rozhraní. Výchozí barva odkazu se používá pro textové odkazy a akce, a to jak v psaném obsahu, tak v rozhraní Bookstack.',
'app_color' => 'Primary Color', 'app_color' => 'Hlavní barva',
'link_color' => 'Default Link Color', 'link_color' => 'Výchozí barva odkazu',
'content_colors_desc' => 'Set colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.', 'content_colors_desc' => 'Nastaví barvy pro všechny prvky v organizační struktuře stránky. Pro lepší čitelnost doporučujeme zvolit barvy s podobným jasem, jakou mají výchozí barvy.',
'bookshelf_color' => 'Barva knihovny', 'bookshelf_color' => 'Barva knihovny',
'book_color' => 'Barva knihy', 'book_color' => 'Barva knihy',
'chapter_color' => 'Barva kapitoly', 'chapter_color' => 'Barva kapitoly',
@ -138,18 +138,16 @@ return [
'roles' => 'Role', 'roles' => 'Role',
'role_user_roles' => 'Uživatelské role', 'role_user_roles' => 'Uživatelské role',
'roles_index_desc' => 'Role se používají ke sdružování uživatelů a k poskytování systémových oprávnění jejich členům. Pokud je uživatel členem více rolí, udělená oprávnění budou uložena a uživatel zdědí všechny schopnosti.', 'roles_index_desc' => 'Role se používají ke sdružování uživatelů a k poskytování systémových oprávnění jejich členům. Pokud je uživatel členem více rolí, udělená oprávnění budou uložena a uživatel zdědí všechny schopnosti.',
'roles_x_users_assigned' => '1 přiřazený uživatel|:count přiřazených uživatelů', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 oprávnění|:count oprávnění', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Přiřazení uživatelé', 'roles_assigned_users' => 'Přiřazení uživatelé',
'roles_permissions_provided' => 'Poskytnutá oprávnění', 'roles_permissions_provided' => 'Poskytnutá oprávnění',
'role_create' => 'Vytvořit novou roli', 'role_create' => 'Vytvořit novou roli',
'role_create_success' => 'Role byla vytvořena',
'role_delete' => 'Odstranit roli', 'role_delete' => 'Odstranit roli',
'role_delete_confirm' => 'Role \':roleName\' bude odstraněna.', 'role_delete_confirm' => 'Role \':roleName\' bude odstraněna.',
'role_delete_users_assigned' => 'Role je přiřazena :userCount uživatelům. Pokud jim chcete náhradou přidělit jinou roli, zvolte jednu z následujících.', 'role_delete_users_assigned' => 'Role je přiřazena :userCount uživatelům. Pokud jim chcete náhradou přidělit jinou roli, zvolte jednu z následujících.',
'role_delete_no_migration' => "Nepřiřazovat uživatelům náhradní roli", 'role_delete_no_migration' => "Nepřiřazovat uživatelům náhradní roli",
'role_delete_sure' => 'Opravdu chcete tuto roli odstranit?', 'role_delete_sure' => 'Opravdu chcete tuto roli odstranit?',
'role_delete_success' => 'Role byla odstraněna',
'role_edit' => 'Upravit roli', 'role_edit' => 'Upravit roli',
'role_details' => 'Detaily role', 'role_details' => 'Detaily role',
'role_name' => 'Název role', 'role_name' => 'Název role',
@ -175,7 +173,6 @@ return [
'role_own' => 'Vlastní', 'role_own' => 'Vlastní',
'role_controlled_by_asset' => 'Řídí se obsahem, do kterého jsou nahrávány', 'role_controlled_by_asset' => 'Řídí se obsahem, do kterého jsou nahrávány',
'role_save' => 'Uložit roli', 'role_save' => 'Uložit roli',
'role_update_success' => 'Role byla aktualizována',
'role_users' => 'Uživatelé mající tuto roli', 'role_users' => 'Uživatelé mající tuto roli',
'role_users_none' => 'Žádný uživatel nemá tuto roli', 'role_users_none' => 'Žádný uživatel nemá tuto roli',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooky', 'webhooks' => 'Webhooky',
'webhooks_index_desc' => 'Webhooks jsou způsob, jak odeslat data na externí URL, pokud se vyskytnou určité akce a události v systému, které umožňují integraci událostí s externími platformami, jako jsou systémy zasílání zpráv nebo oznámení.', 'webhooks_index_desc' => 'Webhooks jsou způsob, jak odeslat data na externí URL, pokud se vyskytnou určité akce a události v systému, které umožňují integraci událostí s externími platformami, jako jsou systémy zasílání zpráv nebo oznámení.',
'webhooks_x_trigger_events' => '1 spouštěcí událost|:count spouštěcí události', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Vytvořit nový webhook', 'webhooks_create' => 'Vytvořit nový webhook',
'webhooks_none_created' => 'Žádné webhooky nebyly doposud vytvořeny.', 'webhooks_none_created' => 'Žádné webhooky nebyly doposud vytvořeny.',
'webhooks_edit' => 'Upravit webhook', 'webhooks_edit' => 'Upravit webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Diweddarwyd y defnyddiwr yn llwyddiannus', 'user_update_notification' => 'Diweddarwyd y defnyddiwr yn llwyddiannus',
'user_delete_notification' => 'Tynnwyd y defnyddiwr yn llwyddiannus', 'user_delete_notification' => 'Tynnwyd y defnyddiwr yn llwyddiannus',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'gwnaeth sylwadau ar', 'commented_on' => 'gwnaeth sylwadau ar',
'permissions_update' => 'caniatadau wedi\'u diweddaru', 'permissions_update' => 'caniatadau wedi\'u diweddaru',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Updated :timeLength', 'meta_updated' => 'Updated :timeLength',
'meta_updated_name' => 'Updated :timeLength by :user', 'meta_updated_name' => 'Updated :timeLength by :user',
'meta_owned_name' => 'Owned by :user', 'meta_owned_name' => 'Owned by :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Entity Select', 'entity_select' => 'Entity Select',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Images', 'images' => 'Images',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Roles', 'roles' => 'Roles',
'role_user_roles' => 'User Roles', 'role_user_roles' => 'User Roles',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Create New Role', 'role_create' => 'Create New Role',
'role_create_success' => 'Role successfully created',
'role_delete' => 'Delete Role', 'role_delete' => 'Delete Role',
'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.', 'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.', 'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
'role_delete_no_migration' => "Don't migrate users", 'role_delete_no_migration' => "Don't migrate users",
'role_delete_sure' => 'Are you sure you want to delete this role?', 'role_delete_sure' => 'Are you sure you want to delete this role?',
'role_delete_success' => 'Role successfully deleted',
'role_edit' => 'Edit Role', 'role_edit' => 'Edit Role',
'role_details' => 'Role Details', 'role_details' => 'Role Details',
'role_name' => 'Role Name', 'role_name' => 'Role Name',
@ -175,7 +173,6 @@ return [
'role_own' => 'Own', 'role_own' => 'Own',
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to', 'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
'role_save' => 'Save Role', 'role_save' => 'Save Role',
'role_update_success' => 'Role successfully updated',
'role_users' => 'Users in this role', 'role_users' => 'Users in this role',
'role_users_none' => 'No users are currently assigned to this role', 'role_users_none' => 'No users are currently assigned to this role',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Create New Webhook', 'webhooks_create' => 'Create New Webhook',
'webhooks_none_created' => 'No webhooks have yet been created.', 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook', 'webhooks_edit' => 'Edit Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Brugeren blev opdateret', 'user_update_notification' => 'Brugeren blev opdateret',
'user_delete_notification' => 'Brugeren blev fjernet', 'user_delete_notification' => 'Brugeren blev fjernet',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'kommenterede til', 'commented_on' => 'kommenterede til',
'permissions_update' => 'Tilladelser opdateret', 'permissions_update' => 'Tilladelser opdateret',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Opdateret :timeLength', 'meta_updated' => 'Opdateret :timeLength',
'meta_updated_name' => 'Opdateret :timeLength af :user', 'meta_updated_name' => 'Opdateret :timeLength af :user',
'meta_owned_name' => 'Ejet af :user', 'meta_owned_name' => 'Ejet af :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Vælg emne', 'entity_select' => 'Vælg emne',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Billeder', 'images' => 'Billeder',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Roller', 'roles' => 'Roller',
'role_user_roles' => 'Brugerroller', 'role_user_roles' => 'Brugerroller',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Opret en ny rolle', 'role_create' => 'Opret en ny rolle',
'role_create_success' => 'Rollen blev oprette korrekt',
'role_delete' => 'Slet rolle', 'role_delete' => 'Slet rolle',
'role_delete_confirm' => 'Dette vil slette rollen med navnet \':roleName\'.', 'role_delete_confirm' => 'Dette vil slette rollen med navnet \':roleName\'.',
'role_delete_users_assigned' => 'Denne rolle er tildelt :userCount brugere. Hvis du vil rykke disse brugere fra denne rolle, kan du vælge en ny nedenunder.', 'role_delete_users_assigned' => 'Denne rolle er tildelt :userCount brugere. Hvis du vil rykke disse brugere fra denne rolle, kan du vælge en ny nedenunder.',
'role_delete_no_migration' => "Ryk ikke brugere", 'role_delete_no_migration' => "Ryk ikke brugere",
'role_delete_sure' => 'Er du sikker på, at du vil slette denne rolle?', 'role_delete_sure' => 'Er du sikker på, at du vil slette denne rolle?',
'role_delete_success' => 'Rollen blev slettet',
'role_edit' => 'Rediger rolle', 'role_edit' => 'Rediger rolle',
'role_details' => 'Rolledetaljer', 'role_details' => 'Rolledetaljer',
'role_name' => 'Rollenavn', 'role_name' => 'Rollenavn',
@ -175,7 +173,6 @@ return [
'role_own' => 'Eget', 'role_own' => 'Eget',
'role_controlled_by_asset' => 'Styres af det medie/"asset", de uploades til', 'role_controlled_by_asset' => 'Styres af det medie/"asset", de uploades til',
'role_save' => 'Gem rolle', 'role_save' => 'Gem rolle',
'role_update_success' => 'Rollen blev opdateret',
'role_users' => 'Brugere med denne rolle', 'role_users' => 'Brugere med denne rolle',
'role_users_none' => 'Ingen brugere er i øjeblikket tildelt denne rolle', 'role_users_none' => 'Ingen brugere er i øjeblikket tildelt denne rolle',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Opret ny Webhook', 'webhooks_create' => 'Opret ny Webhook',
'webhooks_none_created' => 'Ingen webhooks er blevet oprettet endnu.', 'webhooks_none_created' => 'Ingen webhooks er blevet oprettet endnu.',
'webhooks_edit' => 'Rediger Webhook', 'webhooks_edit' => 'Rediger Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Benutzer erfolgreich aktualisiert', 'user_update_notification' => 'Benutzer erfolgreich aktualisiert',
'user_delete_notification' => 'Benutzer erfolgreich entfernt', 'user_delete_notification' => 'Benutzer erfolgreich entfernt',
// Roles
'role_create_notification' => 'Rolle erfolgreich angelegt',
'role_update_notification' => 'Rolle erfolgreich aktualisiert',
'role_delete_notification' => 'Rolle erfolgreich gelöscht',
// Other // Other
'commented_on' => 'hat einen Kommentar hinzugefügt', 'commented_on' => 'hat einen Kommentar hinzugefügt',
'permissions_update' => 'hat die Berechtigungen aktualisiert', 'permissions_update' => 'hat die Berechtigungen aktualisiert',

View file

@ -141,7 +141,7 @@ return [
'books_search_this' => 'Dieses Buch durchsuchen', 'books_search_this' => 'Dieses Buch durchsuchen',
'books_navigation' => 'Buchnavigation', 'books_navigation' => 'Buchnavigation',
'books_sort' => 'Buchinhalte sortieren', 'books_sort' => 'Buchinhalte sortieren',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books.', 'books_sort_desc' => 'Kapitel und Seiten innerhalb eines Buches verschieben, um dessen Inhalt zu reorganisieren. Andere Bücher können hinzugefügt werden, was das Verschieben von Kapiteln und Seiten zwischen Büchern erleichtert.',
'books_sort_named' => 'Buch ":bookName" sortieren', 'books_sort_named' => 'Buch ":bookName" sortieren',
'books_sort_name' => 'Sortieren nach Namen', 'books_sort_name' => 'Sortieren nach Namen',
'books_sort_created' => 'Sortieren nach Erstellungsdatum', 'books_sort_created' => 'Sortieren nach Erstellungsdatum',
@ -150,17 +150,17 @@ return [
'books_sort_chapters_last' => 'Kapitel zuletzt', 'books_sort_chapters_last' => 'Kapitel zuletzt',
'books_sort_show_other' => 'Andere Bücher anzeigen', 'books_sort_show_other' => 'Andere Bücher anzeigen',
'books_sort_save' => 'Neue Reihenfolge speichern', 'books_sort_save' => 'Neue Reihenfolge speichern',
'books_sort_show_other_desc' => 'Add other books here to include them in the sort operation, and allow easy cross-book reorganisation.', 'books_sort_show_other_desc' => 'Füge hier weitere Bücher hinzu, um sie in die Sortierung einzubinden und ermögliche so eine einfache und übergreifende Reorganisation.',
'books_sort_move_up' => 'Move Up', 'books_sort_move_up' => 'Nach oben bewegen',
'books_sort_move_down' => 'Move Down', 'books_sort_move_down' => 'Nach unten bewegen',
'books_sort_move_prev_book' => 'Move to Previous Book', 'books_sort_move_prev_book' => 'Zum vorherigen Buch verschieben',
'books_sort_move_next_book' => 'Move to Next Book', 'books_sort_move_next_book' => 'Zum nächsten Buch verschieben',
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter', 'books_sort_move_prev_chapter' => 'In das vorherige Kapitel verschieben',
'books_sort_move_next_chapter' => 'Move Into Next Chapter', 'books_sort_move_next_chapter' => 'In nächstes Kapitel verschieben',
'books_sort_move_book_start' => 'Move to Start of Book', 'books_sort_move_book_start' => 'Zum Buchbeginn verschieben',
'books_sort_move_book_end' => 'Move to End of Book', 'books_sort_move_book_end' => 'Zum Ende des Buches verschieben',
'books_sort_move_before_chapter' => 'Move to Before Chapter', 'books_sort_move_before_chapter' => 'Vor Kapitel verschieben',
'books_sort_move_after_chapter' => 'Move to After Chapter', 'books_sort_move_after_chapter' => 'Nach Kapitel verschieben',
'books_copy' => 'Buch kopieren', 'books_copy' => 'Buch kopieren',
'books_copy_success' => 'Das Buch wurde erfolgreich kopiert', 'books_copy_success' => 'Das Buch wurde erfolgreich kopiert',

View file

@ -50,7 +50,7 @@ return [
// Drawing & Images // Drawing & Images
'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.', 'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.',
'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.', 'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.',
'drawing_data_not_found' => 'Drawing data could not be loaded. The drawing file might no longer exist or you may not have permission to access it.', 'drawing_data_not_found' => 'Zeichnungsdaten konnten nicht geladen werden. Die Zeichnungsdatei existiert möglicherweise nicht mehr oder Sie haben nicht die Berechtigung, darauf zuzugreifen.',
// Attachments // Attachments
'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.',

View file

@ -139,18 +139,16 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
'roles' => 'Rollen', 'roles' => 'Rollen',
'role_user_roles' => 'Benutzer-Rollen', 'role_user_roles' => 'Benutzer-Rollen',
'roles_index_desc' => 'Rollen werden verwendet, um Benutzer zu gruppieren System-Berechtigung für ihre Mitglieder zuzuweisen. Wenn ein Benutzer Mitglied mehrerer Rollen ist, stapeln die gewährten Berechtigungen und der Benutzer wird alle Fähigkeiten erben.', 'roles_index_desc' => 'Rollen werden verwendet, um Benutzer zu gruppieren System-Berechtigung für ihre Mitglieder zuzuweisen. Wenn ein Benutzer Mitglied mehrerer Rollen ist, stapeln die gewährten Berechtigungen und der Benutzer wird alle Fähigkeiten erben.',
'roles_x_users_assigned' => '1 Benutzer zugewiesen|:count Benutzer zugewiesen', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 Berechtigung|:count Berechtigungen', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Zugewiesene Benutzer', 'roles_assigned_users' => 'Zugewiesene Benutzer',
'roles_permissions_provided' => 'Genutzte Berechtigungen', 'roles_permissions_provided' => 'Genutzte Berechtigungen',
'role_create' => 'Neue Rolle anlegen', 'role_create' => 'Neue Rolle anlegen',
'role_create_success' => 'Rolle erfolgreich angelegt',
'role_delete' => 'Rolle löschen', 'role_delete' => 'Rolle löschen',
'role_delete_confirm' => 'Sie möchten die Rolle ":roleName" löschen.', 'role_delete_confirm' => 'Sie möchten die Rolle ":roleName" löschen.',
'role_delete_users_assigned' => 'Diese Rolle ist :userCount Benutzern zugeordnet. Sie können unten eine neue Rolle auswählen, die Sie diesen Benutzern zuordnen möchten.', 'role_delete_users_assigned' => 'Diese Rolle ist :userCount Benutzern zugeordnet. Sie können unten eine neue Rolle auswählen, die Sie diesen Benutzern zuordnen möchten.',
'role_delete_no_migration' => "Den Benutzern keine andere Rolle zuordnen", 'role_delete_no_migration' => "Den Benutzern keine andere Rolle zuordnen",
'role_delete_sure' => 'Sind Sie sicher, dass Sie diese Rolle löschen möchten?', 'role_delete_sure' => 'Sind Sie sicher, dass Sie diese Rolle löschen möchten?',
'role_delete_success' => 'Rolle erfolgreich gelöscht',
'role_edit' => 'Rolle bearbeiten', 'role_edit' => 'Rolle bearbeiten',
'role_details' => 'Rollendetails', 'role_details' => 'Rollendetails',
'role_name' => 'Rollenname', 'role_name' => 'Rollenname',
@ -176,7 +174,6 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
'role_own' => 'Eigene', 'role_own' => 'Eigene',
'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt', 'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt',
'role_save' => 'Rolle speichern', 'role_save' => 'Rolle speichern',
'role_update_success' => 'Rolle erfolgreich gespeichert',
'role_users' => 'Dieser Rolle zugeordnete Benutzer', 'role_users' => 'Dieser Rolle zugeordnete Benutzer',
'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet', 'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet',
@ -253,7 +250,7 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks sind eine Möglichkeit, Daten an externe URLs zu senden, wenn bestimmte Aktionen und Ereignisse im System auftreten, was eine ereignisbasierte Integration mit externen Plattformen wie Messaging- oder Benachrichtigungssystemen ermöglicht.', 'webhooks_index_desc' => 'Webhooks sind eine Möglichkeit, Daten an externe URLs zu senden, wenn bestimmte Aktionen und Ereignisse im System auftreten, was eine ereignisbasierte Integration mit externen Plattformen wie Messaging- oder Benachrichtigungssystemen ermöglicht.',
'webhooks_x_trigger_events' => '1 Triggerereignis|:count Triggerereignisse', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Neuen Webhook erstellen', 'webhooks_create' => 'Neuen Webhook erstellen',
'webhooks_none_created' => 'Es wurden noch keine Webhooks erstellt.', 'webhooks_none_created' => 'Es wurden noch keine Webhooks erstellt.',
'webhooks_edit' => 'Webhook bearbeiten', 'webhooks_edit' => 'Webhook bearbeiten',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Benutzer erfolgreich aktualisiert', 'user_update_notification' => 'Benutzer erfolgreich aktualisiert',
'user_delete_notification' => 'Benutzer erfolgreich entfernt', 'user_delete_notification' => 'Benutzer erfolgreich entfernt',
// Roles
'role_create_notification' => 'Rolle erfolgreich angelegt',
'role_update_notification' => 'Rolle erfolgreich aktualisiert',
'role_delete_notification' => 'Rolle erfolgreich gelöscht',
// Other // Other
'commented_on' => 'kommentiert', 'commented_on' => 'kommentiert',
'permissions_update' => 'aktualisierte Berechtigungen', 'permissions_update' => 'aktualisierte Berechtigungen',

View file

@ -141,7 +141,7 @@ return [
'books_search_this' => 'Dieses Buch durchsuchen', 'books_search_this' => 'Dieses Buch durchsuchen',
'books_navigation' => 'Buchnavigation', 'books_navigation' => 'Buchnavigation',
'books_sort' => 'Buchinhalte sortieren', 'books_sort' => 'Buchinhalte sortieren',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books.', 'books_sort_desc' => 'Kapitel und Seiten innerhalb eines Buches verschieben, um dessen Inhalt zu reorganisieren. Andere Bücher können hinzugefügt werden, was das Verschieben von Kapiteln und Seiten zwischen Büchern erleichtert.',
'books_sort_named' => 'Buch ":bookName" sortieren', 'books_sort_named' => 'Buch ":bookName" sortieren',
'books_sort_name' => 'Sortieren nach Namen', 'books_sort_name' => 'Sortieren nach Namen',
'books_sort_created' => 'Sortieren nach Erstellungsdatum', 'books_sort_created' => 'Sortieren nach Erstellungsdatum',
@ -150,17 +150,17 @@ return [
'books_sort_chapters_last' => 'Kapitel zuletzt', 'books_sort_chapters_last' => 'Kapitel zuletzt',
'books_sort_show_other' => 'Andere Bücher anzeigen', 'books_sort_show_other' => 'Andere Bücher anzeigen',
'books_sort_save' => 'Neue Reihenfolge speichern', 'books_sort_save' => 'Neue Reihenfolge speichern',
'books_sort_show_other_desc' => 'Add other books here to include them in the sort operation, and allow easy cross-book reorganisation.', 'books_sort_show_other_desc' => 'Füge hier weitere Bücher hinzu, um sie in die Sortierung einzubinden und ermögliche so eine einfache und übergreifende Reorganisation.',
'books_sort_move_up' => 'Move Up', 'books_sort_move_up' => 'Nach oben bewegen',
'books_sort_move_down' => 'Move Down', 'books_sort_move_down' => 'Nach unten bewegen',
'books_sort_move_prev_book' => 'Move to Previous Book', 'books_sort_move_prev_book' => 'Zum vorherigen Buch verschieben',
'books_sort_move_next_book' => 'Move to Next Book', 'books_sort_move_next_book' => 'Zum nächsten Buch verschieben',
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter', 'books_sort_move_prev_chapter' => 'In das vorherige Kapitel verschieben',
'books_sort_move_next_chapter' => 'Move Into Next Chapter', 'books_sort_move_next_chapter' => 'In nächstes Kapitel verschieben',
'books_sort_move_book_start' => 'Move to Start of Book', 'books_sort_move_book_start' => 'Zum Buchbeginn verschieben',
'books_sort_move_book_end' => 'Move to End of Book', 'books_sort_move_book_end' => 'Zum Ende des Buches verschieben',
'books_sort_move_before_chapter' => 'Move to Before Chapter', 'books_sort_move_before_chapter' => 'Vor Kapitel verschieben',
'books_sort_move_after_chapter' => 'Move to After Chapter', 'books_sort_move_after_chapter' => 'Nach Kapitel verschieben',
'books_copy' => 'Buch kopieren', 'books_copy' => 'Buch kopieren',
'books_copy_success' => 'Buch erfolgreich kopiert', 'books_copy_success' => 'Buch erfolgreich kopiert',

View file

@ -50,7 +50,7 @@ return [
// Drawing & Images // Drawing & Images
'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.', 'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.',
'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.', 'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.',
'drawing_data_not_found' => 'Drawing data could not be loaded. The drawing file might no longer exist or you may not have permission to access it.', 'drawing_data_not_found' => 'Zeichnungsdaten konnten nicht geladen werden. Die Zeichnungsdatei existiert möglicherweise nicht mehr oder Sie haben nicht die Berechtigung, darauf zuzugreifen.',
// Attachments // Attachments
'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.',

View file

@ -139,18 +139,16 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'roles' => 'Rollen', 'roles' => 'Rollen',
'role_user_roles' => 'Benutzer-Rollen', 'role_user_roles' => 'Benutzer-Rollen',
'roles_index_desc' => 'Rollen werden verwendet, um Benutzer zu gruppieren und System-Berechtigungen für ihre Mitglieder zuzuweisen. Wenn ein Benutzer Mitglied mehrerer Rollen ist, stapeln die gewährten Berechtigungen und der Benutzer wird alle Fähigkeiten erben.', 'roles_index_desc' => 'Rollen werden verwendet, um Benutzer zu gruppieren und System-Berechtigungen für ihre Mitglieder zuzuweisen. Wenn ein Benutzer Mitglied mehrerer Rollen ist, stapeln die gewährten Berechtigungen und der Benutzer wird alle Fähigkeiten erben.',
'roles_x_users_assigned' => '1 Benutzer zugewiesen|:count Benutzer zugewiesen', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 Berechtigung|:count Berechtigungen', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Zugewiesene Benutzer', 'roles_assigned_users' => 'Zugewiesene Benutzer',
'roles_permissions_provided' => 'Genutzte Berechtigungen', 'roles_permissions_provided' => 'Genutzte Berechtigungen',
'role_create' => 'Neue Rolle anlegen', 'role_create' => 'Neue Rolle anlegen',
'role_create_success' => 'Rolle erfolgreich angelegt',
'role_delete' => 'Rolle löschen', 'role_delete' => 'Rolle löschen',
'role_delete_confirm' => 'Dies wird die Rolle ":roleName" löschen.', 'role_delete_confirm' => 'Dies wird die Rolle ":roleName" löschen.',
'role_delete_users_assigned' => 'Diese Rolle ist :userCount Benutzern zugeordnet. Du kannst unten eine neue Rolle auswählen, die du diesen Benutzern zuordnen möchtest.', 'role_delete_users_assigned' => 'Diese Rolle ist :userCount Benutzern zugeordnet. Du kannst unten eine neue Rolle auswählen, die du diesen Benutzern zuordnen möchtest.',
'role_delete_no_migration' => "Den Benutzern keine andere Rolle zuordnen", 'role_delete_no_migration' => "Den Benutzern keine andere Rolle zuordnen",
'role_delete_sure' => 'Bist du sicher, dass du diese Rolle löschen möchtest?', 'role_delete_sure' => 'Bist du sicher, dass du diese Rolle löschen möchtest?',
'role_delete_success' => 'Rolle erfolgreich gelöscht',
'role_edit' => 'Rolle bearbeiten', 'role_edit' => 'Rolle bearbeiten',
'role_details' => 'Rollendetails', 'role_details' => 'Rollendetails',
'role_name' => 'Rollenname', 'role_name' => 'Rollenname',
@ -176,7 +174,6 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'role_own' => 'Eigene', 'role_own' => 'Eigene',
'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt', 'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt',
'role_save' => 'Rolle speichern', 'role_save' => 'Rolle speichern',
'role_update_success' => 'Rolle erfolgreich gespeichert',
'role_users' => 'Dieser Rolle zugeordnete Benutzer', 'role_users' => 'Dieser Rolle zugeordnete Benutzer',
'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet', 'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet',
@ -253,7 +250,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks sind eine Möglichkeit, Daten an externe URLs zu senden, wenn bestimmte Aktionen und Ereignisse im System auftreten, was eine ereignisbasierte Integration mit externen Plattformen wie Messaging- oder Benachrichtigungssystemen ermöglicht.', 'webhooks_index_desc' => 'Webhooks sind eine Möglichkeit, Daten an externe URLs zu senden, wenn bestimmte Aktionen und Ereignisse im System auftreten, was eine ereignisbasierte Integration mit externen Plattformen wie Messaging- oder Benachrichtigungssystemen ermöglicht.',
'webhooks_x_trigger_events' => '1 Triggerereignis|:count Triggerereignisse', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Neuen Webhook erstellen', 'webhooks_create' => 'Neuen Webhook erstellen',
'webhooks_none_created' => 'Es wurden noch keine Webhooks erstellt.', 'webhooks_none_created' => 'Es wurden noch keine Webhooks erstellt.',
'webhooks_edit' => 'Webhook bearbeiten', 'webhooks_edit' => 'Webhook bearbeiten',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Ο Χρήστης ενημερώθηκε με επιτυχία', 'user_update_notification' => 'Ο Χρήστης ενημερώθηκε με επιτυχία',
'user_delete_notification' => 'Ο Χρήστης αφαιρέθηκε επιτυχώς', 'user_delete_notification' => 'Ο Χρήστης αφαιρέθηκε επιτυχώς',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'σχολίασε', 'commented_on' => 'σχολίασε',
'permissions_update' => 'ενημερωμένα δικαιώματα', 'permissions_update' => 'ενημερωμένα δικαιώματα',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Ενημερώθηκε :timeLength', 'meta_updated' => 'Ενημερώθηκε :timeLength',
'meta_updated_name' => 'Ενημερώθηκε :timeLength by :user', 'meta_updated_name' => 'Ενημερώθηκε :timeLength by :user',
'meta_owned_name' => 'Ανήκει στον :user', 'meta_owned_name' => 'Ανήκει στον :user',
'meta_reference_page_count' => 'Αναφορά σε 1 σελίδα"Αναφερόμενη στο :count σελίδες', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Επιλογή Οντότητας', 'entity_select' => 'Επιλογή Οντότητας',
'entity_select_lack_permission' => 'Δεν έχετε τα απαιτούμενα δικαιώματα για να επιλέξετε αυτό το στοιχείο', 'entity_select_lack_permission' => 'Δεν έχετε τα απαιτούμενα δικαιώματα για να επιλέξετε αυτό το στοιχείο',
'images' => 'Εικόνες', 'images' => 'Εικόνες',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Ρόλοι', 'roles' => 'Ρόλοι',
'role_user_roles' => 'Ρόλοι Χρηστών', 'role_user_roles' => 'Ρόλοι Χρηστών',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Εκχωρημένοι χρήστες', 'roles_assigned_users' => 'Εκχωρημένοι χρήστες',
'roles_permissions_provided' => 'Παρεχόμενα Δικαιώματα', 'roles_permissions_provided' => 'Παρεχόμενα Δικαιώματα',
'role_create' => 'Δημιουργία νέου ρόλου', 'role_create' => 'Δημιουργία νέου ρόλου',
'role_create_success' => 'Ο Ρόλος δημιουργήθηκε με επιτυχία',
'role_delete' => 'Διαγραφή Ρόλου', 'role_delete' => 'Διαγραφή Ρόλου',
'role_delete_confirm' => 'Αυτό θα διαγράψει τον ρόλο με το όνομα \':roleName\'.', 'role_delete_confirm' => 'Αυτό θα διαγράψει τον ρόλο με το όνομα \':roleName\'.',
'role_delete_users_assigned' => 'Σε αυτόν τον ρόλο έχουν εκχωρηθεί :userCount χρήστες. Εάν θέλετε να μετεγκαταστήσετε τους χρήστες από αυτόν τον ρόλο, επιλέξτε έναν νέο ρόλο παρακάτω.', 'role_delete_users_assigned' => 'Σε αυτόν τον ρόλο έχουν εκχωρηθεί :userCount χρήστες. Εάν θέλετε να μετεγκαταστήσετε τους χρήστες από αυτόν τον ρόλο, επιλέξτε έναν νέο ρόλο παρακάτω.',
'role_delete_no_migration' => "Μην μεταφέρετε χρήστες", 'role_delete_no_migration' => "Μην μεταφέρετε χρήστες",
'role_delete_sure' => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον ρόλο;', 'role_delete_sure' => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον ρόλο;',
'role_delete_success' => 'Ο ρόλος διαγράφηκε επιτυχώς',
'role_edit' => 'Επεξεργασία Ρόλου', 'role_edit' => 'Επεξεργασία Ρόλου',
'role_details' => 'Λεπτομέρειες Ρόλου', 'role_details' => 'Λεπτομέρειες Ρόλου',
'role_name' => 'Όνομα Ρόλου', 'role_name' => 'Όνομα Ρόλου',
@ -175,7 +173,6 @@ return [
'role_own' => 'Τα δικά του', 'role_own' => 'Τα δικά του',
'role_controlled_by_asset' => 'Ελέγχονται από το στοιχείο στο οποίο ανεβαίνουν (Ράφια, Βιβλία)', 'role_controlled_by_asset' => 'Ελέγχονται από το στοιχείο στο οποίο ανεβαίνουν (Ράφια, Βιβλία)',
'role_save' => 'Αποθήκευση Ρόλου', 'role_save' => 'Αποθήκευση Ρόλου',
'role_update_success' => 'Ο Ρόλος ενημερώθηκε με επιτυχία',
'role_users' => 'Χρήστες σε αυτόν τον Ρόλο', 'role_users' => 'Χρήστες σε αυτόν τον Ρόλο',
'role_users_none' => 'Σε κανένα χρήστη δεν έχει ανατεθεί αυτήν τη στιγμή αυτός ο ρόλος.', 'role_users_none' => 'Σε κανένα χρήστη δεν έχει ανατεθεί αυτήν τη στιγμή αυτός ο ρόλος.',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Δημιουργία νέου Webhook', 'webhooks_create' => 'Δημιουργία νέου Webhook',
'webhooks_none_created' => 'Δεν έχουν δημιουργηθεί ακόμη webhook.', 'webhooks_none_created' => 'Δεν έχουν δημιουργηθεί ακόμη webhook.',
'webhooks_edit' => 'Επεξεργασία Webhook', 'webhooks_edit' => 'Επεξεργασία Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'User successfully updated', 'user_update_notification' => 'User successfully updated',
'user_delete_notification' => 'User successfully removed', 'user_delete_notification' => 'User successfully removed',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'commented on', 'commented_on' => 'commented on',
'permissions_update' => 'updated permissions', 'permissions_update' => 'updated permissions',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Updated :timeLength', 'meta_updated' => 'Updated :timeLength',
'meta_updated_name' => 'Updated :timeLength by :user', 'meta_updated_name' => 'Updated :timeLength by :user',
'meta_owned_name' => 'Owned by :user', 'meta_owned_name' => 'Owned by :user',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Entity Select', 'entity_select' => 'Entity Select',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Images', 'images' => 'Images',

View file

@ -50,8 +50,8 @@ return [
// Color settings // Color settings
'color_scheme' => 'Application Color Scheme', 'color_scheme' => 'Application Color Scheme',
'color_scheme_desc' => 'Set the colors to use in the BookStack interface. Colors can be configured separately for dark and light modes to best fit the theme and ensure legibility.', 'color_scheme_desc' => 'Set the colors to use in the application user interface. Colors can be configured separately for dark and light modes to best fit the theme and ensure legibility.',
'ui_colors_desc' => 'Set the primary color and default link color for BookStack. The primary color is mainly used for the header banner, buttons and interface decorations. The default link color is used for text-based links and actions, both within written content and in the Bookstack interface.', 'ui_colors_desc' => 'Set the application primary color and default link color. The primary color is mainly used for the header banner, buttons and interface decorations. The default link color is used for text-based links and actions, both within written content and in the application interface.',
'app_color' => 'Primary Color', 'app_color' => 'Primary Color',
'link_color' => 'Default Link Color', 'link_color' => 'Default Link Color',
'content_colors_desc' => 'Set colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.', 'content_colors_desc' => 'Set colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
@ -138,18 +138,16 @@ return [
'roles' => 'Roles', 'roles' => 'Roles',
'role_user_roles' => 'User Roles', 'role_user_roles' => 'User Roles',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Create New Role', 'role_create' => 'Create New Role',
'role_create_success' => 'Role successfully created',
'role_delete' => 'Delete Role', 'role_delete' => 'Delete Role',
'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.', 'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.', 'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
'role_delete_no_migration' => "Don't migrate users", 'role_delete_no_migration' => "Don't migrate users",
'role_delete_sure' => 'Are you sure you want to delete this role?', 'role_delete_sure' => 'Are you sure you want to delete this role?',
'role_delete_success' => 'Role successfully deleted',
'role_edit' => 'Edit Role', 'role_edit' => 'Edit Role',
'role_details' => 'Role Details', 'role_details' => 'Role Details',
'role_name' => 'Role Name', 'role_name' => 'Role Name',
@ -175,7 +173,6 @@ return [
'role_own' => 'Own', 'role_own' => 'Own',
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to', 'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
'role_save' => 'Save Role', 'role_save' => 'Save Role',
'role_update_success' => 'Role successfully updated',
'role_users' => 'Users in this role', 'role_users' => 'Users in this role',
'role_users_none' => 'No users are currently assigned to this role', 'role_users_none' => 'No users are currently assigned to this role',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Create New Webhook', 'webhooks_create' => 'Create New Webhook',
'webhooks_none_created' => 'No webhooks have yet been created.', 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook', 'webhooks_edit' => 'Edit Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Usuario actualizado correctamente', 'user_update_notification' => 'Usuario actualizado correctamente',
'user_delete_notification' => 'Usuario eliminado correctamente', 'user_delete_notification' => 'Usuario eliminado correctamente',
// Roles
'role_create_notification' => 'Rol creado correctamente',
'role_update_notification' => 'Rol actualizado correctamente',
'role_delete_notification' => 'Rol eliminado correctamente',
// Other // Other
'commented_on' => 'comentada el', 'commented_on' => 'comentada el',
'permissions_update' => 'permisos actualizados', 'permissions_update' => 'permisos actualizados',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Actualizado :timeLength', 'meta_updated' => 'Actualizado :timeLength',
'meta_updated_name' => 'Actualizado :timeLength por :user', 'meta_updated_name' => 'Actualizado :timeLength por :user',
'meta_owned_name' => 'Propiedad de :user', 'meta_owned_name' => 'Propiedad de :user',
'meta_reference_page_count' => 'Referenciado en 1 página|Referenciado en :count páginas', 'meta_reference_page_count' => 'Referido en :count página | Referido en :count paginas',
'entity_select' => 'Seleccione entidad', 'entity_select' => 'Seleccione entidad',
'entity_select_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento', 'entity_select_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento',
'images' => 'Imágenes', 'images' => 'Imágenes',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Roles', 'roles' => 'Roles',
'role_user_roles' => 'Roles de usuario', 'role_user_roles' => 'Roles de usuario',
'roles_index_desc' => 'Los roles se utilizan para agrupar usuarios y proporcionar permisos del sistema a sus miembros. Cuando un usuario es miembro de múltiples roles los privilegios otorgados se acumularán y el usuario heredará todas las habilidades.', 'roles_index_desc' => 'Los roles se utilizan para agrupar usuarios y proporcionar permisos del sistema a sus miembros. Cuando un usuario es miembro de múltiples roles los privilegios otorgados se acumularán y el usuario heredará todas las habilidades.',
'roles_x_users_assigned' => '1 usuario asignado|:count usuarios asignados', 'roles_x_users_assigned' => ':count usuario asignado|:count usuarios asignados',
'roles_x_permissions_provided' => '1 permiso|:count permisos', 'roles_x_permissions_provided' => ':count permiso |:count permisos',
'roles_assigned_users' => 'Usuarios asignados', 'roles_assigned_users' => 'Usuarios asignados',
'roles_permissions_provided' => 'Permisos proporcionados', 'roles_permissions_provided' => 'Permisos proporcionados',
'role_create' => 'Crear nuevo rol', 'role_create' => 'Crear nuevo rol',
'role_create_success' => 'Rol creado satisfactoriamente',
'role_delete' => 'Borrar rol', 'role_delete' => 'Borrar rol',
'role_delete_confirm' => 'Se borrará el rol con nombre \':roleName\'.', 'role_delete_confirm' => 'Se borrará el rol con nombre \':roleName\'.',
'role_delete_users_assigned' => 'Este rol tiene :userCount usuarios asignados. Si quisiera migrar los usuarios de este rol, seleccione un nuevo rol a continuación.', 'role_delete_users_assigned' => 'Este rol tiene :userCount usuarios asignados. Si quisiera migrar los usuarios de este rol, seleccione un nuevo rol a continuación.',
'role_delete_no_migration' => "No migrar usuarios", 'role_delete_no_migration' => "No migrar usuarios",
'role_delete_sure' => 'Está seguro que desea borrar este rol?', 'role_delete_sure' => 'Está seguro que desea borrar este rol?',
'role_delete_success' => 'Rol borrado satisfactoriamente',
'role_edit' => 'Editar rol', 'role_edit' => 'Editar rol',
'role_details' => 'Detalles de rol', 'role_details' => 'Detalles de rol',
'role_name' => 'Nombre de rol', 'role_name' => 'Nombre de rol',
@ -175,7 +173,6 @@ return [
'role_own' => 'Propio', 'role_own' => 'Propio',
'role_controlled_by_asset' => 'Controlado por el contenido al que ha sido subido', 'role_controlled_by_asset' => 'Controlado por el contenido al que ha sido subido',
'role_save' => 'Guardar rol', 'role_save' => 'Guardar rol',
'role_update_success' => 'Rol actualizado éxitosamente',
'role_users' => 'Usuarios en este rol', 'role_users' => 'Usuarios en este rol',
'role_users_none' => 'No hay usuarios asignados a este rol', 'role_users_none' => 'No hay usuarios asignados a este rol',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Los Webhooks son una forma de enviar datos a URLs externas cuando ciertas acciones y eventos ocurren dentro del sistema, lo que permite la integración basada en eventos con plataformas externas como mensajería o sistemas de notificación.', 'webhooks_index_desc' => 'Los Webhooks son una forma de enviar datos a URLs externas cuando ciertas acciones y eventos ocurren dentro del sistema, lo que permite la integración basada en eventos con plataformas externas como mensajería o sistemas de notificación.',
'webhooks_x_trigger_events' => '1 evento|:count eventos', 'webhooks_x_trigger_events' => ':count disparador de eventos|:count disparadores de eventos',
'webhooks_create' => 'Crear webhook', 'webhooks_create' => 'Crear webhook',
'webhooks_none_created' => 'No hay webhooks creados.', 'webhooks_none_created' => 'No hay webhooks creados.',
'webhooks_edit' => 'Editar webhook', 'webhooks_edit' => 'Editar webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Usuario actualizado correctamente', 'user_update_notification' => 'Usuario actualizado correctamente',
'user_delete_notification' => 'El usuario fue eliminado correctamente', 'user_delete_notification' => 'El usuario fue eliminado correctamente',
// Roles
'role_create_notification' => 'Rol creado correctamente',
'role_update_notification' => 'Rol actualizado correctamente',
'role_delete_notification' => 'Rol eliminado correctamente',
// Other // Other
'commented_on' => 'comentado', 'commented_on' => 'comentado',
'permissions_update' => 'permisos actualizados', 'permissions_update' => 'permisos actualizados',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Actualizado el :timeLength', 'meta_updated' => 'Actualizado el :timeLength',
'meta_updated_name' => 'Actualizado el :timeLength por :user', 'meta_updated_name' => 'Actualizado el :timeLength por :user',
'meta_owned_name' => 'Propiedad de :user', 'meta_owned_name' => 'Propiedad de :user',
'meta_reference_page_count' => 'Referenciado en una página|Referenciado en :count páginas', 'meta_reference_page_count' => 'Referido en :count página | Referido en :count paginas',
'entity_select' => 'Seleccione entidad', 'entity_select' => 'Seleccione entidad',
'entity_select_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento', 'entity_select_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento',
'images' => 'Imágenes', 'images' => 'Imágenes',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Roles', 'roles' => 'Roles',
'role_user_roles' => 'Roles de usuario', 'role_user_roles' => 'Roles de usuario',
'roles_index_desc' => 'Los roles se utilizan para agrupar usuarios y proporcionar permisos del sistema a sus miembros. Cuando un usuario es miembro de múltiples roles los privilegios otorgados se acumularán y el usuario heredará todas las habilidades.', 'roles_index_desc' => 'Los roles se utilizan para agrupar usuarios y proporcionar permisos del sistema a sus miembros. Cuando un usuario es miembro de múltiples roles los privilegios otorgados se acumularán y el usuario heredará todas las habilidades.',
'roles_x_users_assigned' => '1 usuario assigned|:count usuarios asignados', 'roles_x_users_assigned' => ':count usuario asignado|:count usuarios asignados',
'roles_x_permissions_provided' => '1 permission|:count permisos', 'roles_x_permissions_provided' => ':count permiso |:count permisos',
'roles_assigned_users' => 'Usuarios Asignados', 'roles_assigned_users' => 'Usuarios Asignados',
'roles_permissions_provided' => 'Permisos Proporcionados', 'roles_permissions_provided' => 'Permisos Proporcionados',
'role_create' => 'Crear nuevo rol', 'role_create' => 'Crear nuevo rol',
'role_create_success' => 'Rol creado satisfactoriamente',
'role_delete' => 'Borrar rol', 'role_delete' => 'Borrar rol',
'role_delete_confirm' => 'Se borrará el rol con nombre \':roleName\'.', 'role_delete_confirm' => 'Se borrará el rol con nombre \':roleName\'.',
'role_delete_users_assigned' => 'Este rol tiene :userCount usuarios asignados. Si ud. quisiera migrar los usuarios de este rol, seleccione un nuevo rol a continuación.', 'role_delete_users_assigned' => 'Este rol tiene :userCount usuarios asignados. Si ud. quisiera migrar los usuarios de este rol, seleccione un nuevo rol a continuación.',
'role_delete_no_migration' => "No migrar usuarios", 'role_delete_no_migration' => "No migrar usuarios",
'role_delete_sure' => '¿Está seguro que desea borrar este rol?', 'role_delete_sure' => '¿Está seguro que desea borrar este rol?',
'role_delete_success' => 'Rol borrado satisfactoriamente',
'role_edit' => 'Editar rol', 'role_edit' => 'Editar rol',
'role_details' => 'Detalles de rol', 'role_details' => 'Detalles de rol',
'role_name' => 'Nombre de rol', 'role_name' => 'Nombre de rol',
@ -176,7 +174,6 @@ return [
'role_own' => 'Propio', 'role_own' => 'Propio',
'role_controlled_by_asset' => 'Controlado por el activo al que ha sido subido', 'role_controlled_by_asset' => 'Controlado por el activo al que ha sido subido',
'role_save' => 'Guardar rol', 'role_save' => 'Guardar rol',
'role_update_success' => 'Rol actualizado exitosamente',
'role_users' => 'Usuarios en este rol', 'role_users' => 'Usuarios en este rol',
'role_users_none' => 'No hay usuarios asignados a este rol', 'role_users_none' => 'No hay usuarios asignados a este rol',
@ -253,7 +250,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Los Webhooks son una forma de enviar datos a URLs externas cuando ciertas acciones y eventos ocurren dentro del sistema, lo que permite la integración basada en eventos con plataformas externas como mensajería o sistemas de notificación.', 'webhooks_index_desc' => 'Los Webhooks son una forma de enviar datos a URLs externas cuando ciertas acciones y eventos ocurren dentro del sistema, lo que permite la integración basada en eventos con plataformas externas como mensajería o sistemas de notificación.',
'webhooks_x_trigger_events' => '1 trigger event|:count evento desencadenante', 'webhooks_x_trigger_events' => ':count disparador de eventos|:count disparadores de eventos',
'webhooks_create' => 'Crear nuevo Webhook', 'webhooks_create' => 'Crear nuevo Webhook',
'webhooks_none_created' => 'No hay webhooks creados.', 'webhooks_none_created' => 'No hay webhooks creados.',
'webhooks_edit' => 'Editar Webhook', 'webhooks_edit' => 'Editar Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Kasutaja on muudetud', 'user_update_notification' => 'Kasutaja on muudetud',
'user_delete_notification' => 'Kasutaja on kustutatud', 'user_delete_notification' => 'Kasutaja on kustutatud',
// Roles
'role_create_notification' => 'Roll on lisatud',
'role_update_notification' => 'Roll on muudetud',
'role_delete_notification' => 'Roll on kustutatud',
// Other // Other
'commented_on' => 'kommenteeris lehte', 'commented_on' => 'kommenteeris lehte',
'permissions_update' => 'muutis õiguseid', 'permissions_update' => 'muutis õiguseid',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Muudetud :timeLength', 'meta_updated' => 'Muudetud :timeLength',
'meta_updated_name' => 'Muudetud :timeLength kasutaja :user poolt', 'meta_updated_name' => 'Muudetud :timeLength kasutaja :user poolt',
'meta_owned_name' => 'Kuulub kasutajale :user', 'meta_owned_name' => 'Kuulub kasutajale :user',
'meta_reference_page_count' => 'Viidatud 1 lehel|Viidatud :count lehel', 'meta_reference_page_count' => 'Viidatud :count lehel|Viidatud :count lehel',
'entity_select' => 'Objekti valik', 'entity_select' => 'Objekti valik',
'entity_select_lack_permission' => 'Sul pole õiguseid selle objekti valimiseks', 'entity_select_lack_permission' => 'Sul pole õiguseid selle objekti valimiseks',
'images' => 'Pildid', 'images' => 'Pildid',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Rollid', 'roles' => 'Rollid',
'role_user_roles' => 'Kasutaja rollid', 'role_user_roles' => 'Kasutaja rollid',
'roles_index_desc' => 'Rolle saab kasutada kasutajate grupeerimiseks ja liikmetele süsteemsete õiguste andmiseks. Kui kasutaja on mitme rolli liige, siis õigused kombineeritakse ning kasutaja saab kõik õigused.', 'roles_index_desc' => 'Rolle saab kasutada kasutajate grupeerimiseks ja liikmetele süsteemsete õiguste andmiseks. Kui kasutaja on mitme rolli liige, siis õigused kombineeritakse ning kasutaja saab kõik õigused.',
'roles_x_users_assigned' => '1 kasutaja|:count kasutajat', 'roles_x_users_assigned' => ':count kasutaja|:count kasutajat',
'roles_x_permissions_provided' => '1 õigus|:count õigust', 'roles_x_permissions_provided' => ':count õigus|:count õigust',
'roles_assigned_users' => 'Määratud kasutajad', 'roles_assigned_users' => 'Määratud kasutajad',
'roles_permissions_provided' => 'Antud õigused', 'roles_permissions_provided' => 'Antud õigused',
'role_create' => 'Lisa uus roll', 'role_create' => 'Lisa uus roll',
'role_create_success' => 'Roll on lisatud',
'role_delete' => 'Kustuta roll', 'role_delete' => 'Kustuta roll',
'role_delete_confirm' => 'See kustutab rolli nimega \':roleName\'.', 'role_delete_confirm' => 'See kustutab rolli nimega \':roleName\'.',
'role_delete_users_assigned' => 'Selle rolliga on seotud :userCount kasutajat. Kui soovid neile selle asemel uue rolli määrata, siis vali see allpool.', 'role_delete_users_assigned' => 'Selle rolliga on seotud :userCount kasutajat. Kui soovid neile selle asemel uue rolli määrata, siis vali see allpool.',
'role_delete_no_migration' => "Ära määra uut rolli", 'role_delete_no_migration' => "Ära määra uut rolli",
'role_delete_sure' => 'Kas oled kindel, et soovid selle rolli kustutada?', 'role_delete_sure' => 'Kas oled kindel, et soovid selle rolli kustutada?',
'role_delete_success' => 'Roll on kustutatud',
'role_edit' => 'Muuda rolli', 'role_edit' => 'Muuda rolli',
'role_details' => 'Rolli detailid', 'role_details' => 'Rolli detailid',
'role_name' => 'Rolli nimi', 'role_name' => 'Rolli nimi',
@ -175,7 +173,6 @@ return [
'role_own' => 'Enda omad', 'role_own' => 'Enda omad',
'role_controlled_by_asset' => 'Õigused määratud seotud objekti kaudu', 'role_controlled_by_asset' => 'Õigused määratud seotud objekti kaudu',
'role_save' => 'Salvesta roll', 'role_save' => 'Salvesta roll',
'role_update_success' => 'Roll on muudetud',
'role_users' => 'Selle rolliga kasutajad', 'role_users' => 'Selle rolliga kasutajad',
'role_users_none' => 'Seda rolli ei ole hetkel ühelgi kasutajal', 'role_users_none' => 'Seda rolli ei ole hetkel ühelgi kasutajal',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Veebihaagid', 'webhooks' => 'Veebihaagid',
'webhooks_index_desc' => 'Veebihaakide abil saab teatud süsteemis toimunud tegevuste ja sündmuste puhul saata andmeid välistele URL-idele, mis võimaldab integreerida väliseid platvorme, nagu sõnumi- või teavitussüsteemid.', 'webhooks_index_desc' => 'Veebihaakide abil saab teatud süsteemis toimunud tegevuste ja sündmuste puhul saata andmeid välistele URL-idele, mis võimaldab integreerida väliseid platvorme, nagu sõnumi- või teavitussüsteemid.',
'webhooks_x_trigger_events' => '1 sündmus|:count sündmust', 'webhooks_x_trigger_events' => ':count sündmus|:count sündmust',
'webhooks_create' => 'Lisa uus veebihaak', 'webhooks_create' => 'Lisa uus veebihaak',
'webhooks_none_created' => 'Ühtegi veebihaaki pole lisatud.', 'webhooks_none_created' => 'Ühtegi veebihaaki pole lisatud.',
'webhooks_edit' => 'Muuda veebihaaki', 'webhooks_edit' => 'Muuda veebihaaki',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Erabiltzailea egoki eguneratua', 'user_update_notification' => 'Erabiltzailea egoki eguneratua',
'user_delete_notification' => 'Erabiltzailea egoki ezabatua', 'user_delete_notification' => 'Erabiltzailea egoki ezabatua',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'iruzkinak', 'commented_on' => 'iruzkinak',
'permissions_update' => 'eguneratu baimenak', 'permissions_update' => 'eguneratu baimenak',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Aldatua :timeLength', 'meta_updated' => 'Aldatua :timeLength',
'meta_updated_name' => ':timeLength aldatuta. Erabiltzailea :user', 'meta_updated_name' => ':timeLength aldatuta. Erabiltzailea :user',
'meta_owned_name' => ':user da jabea', 'meta_owned_name' => ':user da jabea',
'meta_reference_page_count' => 'Referenced on 1 page|Referenced on :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Aukeratutako entitatea', 'entity_select' => 'Aukeratutako entitatea',
'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item', 'entity_select_lack_permission' => 'You don\'t have the required permissions to select this item',
'images' => 'Irudiak', 'images' => 'Irudiak',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Rolak', 'roles' => 'Rolak',
'role_user_roles' => 'Erabiltzailearen rola', 'role_user_roles' => 'Erabiltzailearen rola',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'Rol berria sortu', 'role_create' => 'Rol berria sortu',
'role_create_success' => 'Rola ondo sortu da',
'role_delete' => 'Ezabatu Rol-a', 'role_delete' => 'Ezabatu Rol-a',
'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.', 'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.', 'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
'role_delete_no_migration' => "Ez migratu erabiltzaileak", 'role_delete_no_migration' => "Ez migratu erabiltzaileak",
'role_delete_sure' => 'Ziur zaude rol hau ezabatu nahi duzula?', 'role_delete_sure' => 'Ziur zaude rol hau ezabatu nahi duzula?',
'role_delete_success' => 'Rola ezabatua',
'role_edit' => 'Editatu rola', 'role_edit' => 'Editatu rola',
'role_details' => 'Ireki xehetasunak', 'role_details' => 'Ireki xehetasunak',
'role_name' => 'Rol izena', 'role_name' => 'Rol izena',
@ -175,7 +173,6 @@ return [
'role_own' => 'Norberarenak', 'role_own' => 'Norberarenak',
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to', 'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
'role_save' => 'Gorde rol-a', 'role_save' => 'Gorde rol-a',
'role_update_success' => 'Rola ondo eguneratu da',
'role_users' => 'Rol honetako erabiltzaileak', 'role_users' => 'Rol honetako erabiltzaileak',
'role_users_none' => 'No users are currently assigned to this role', 'role_users_none' => 'No users are currently assigned to this role',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Create New Webhook', 'webhooks_create' => 'Create New Webhook',
'webhooks_none_created' => 'No webhooks have yet been created.', 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook', 'webhooks_edit' => 'Edit Webhook',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'کاربر با موفقیت به روز شد', 'user_update_notification' => 'کاربر با موفقیت به روز شد',
'user_delete_notification' => 'کاربر با موفقیت حذف شد', 'user_delete_notification' => 'کاربر با موفقیت حذف شد',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'ثبت دیدگاه', 'commented_on' => 'ثبت دیدگاه',
'permissions_update' => 'به روزرسانی مجوزها', 'permissions_update' => 'به روزرسانی مجوزها',

View file

@ -25,7 +25,7 @@ return [
'actions' => 'عملیات', 'actions' => 'عملیات',
'view' => 'نمایش', 'view' => 'نمایش',
'view_all' => 'نمایش همه', 'view_all' => 'نمایش همه',
'new' => 'New', 'new' => 'جدید',
'create' => 'ایجاد', 'create' => 'ایجاد',
'update' => 'به‌روز رسانی', 'update' => 'به‌روز رسانی',
'edit' => 'ويرايش', 'edit' => 'ويرايش',
@ -81,7 +81,7 @@ return [
'none' => 'هیچکدام', 'none' => 'هیچکدام',
// Header // Header
'homepage' => 'Homepage', 'homepage' => 'صفحه اصلی',
'header_menu_expand' => 'گسترش منو', 'header_menu_expand' => 'گسترش منو',
'profile_menu' => 'منو پروفایل', 'profile_menu' => 'منو پروفایل',
'view_profile' => 'مشاهده پروفایل', 'view_profile' => 'مشاهده پروفایل',

View file

@ -144,11 +144,11 @@ return [
'url' => 'آدرس', 'url' => 'آدرس',
'text_to_display' => 'متن جهت نمایش', 'text_to_display' => 'متن جهت نمایش',
'title' => 'عنوان', 'title' => 'عنوان',
'open_link' => 'Open link', 'open_link' => 'بازکردن لینک',
'open_link_in' => 'Open link in...', 'open_link_in' => 'باز کردن لینک در ...',
'open_link_current' => 'پنجره کنونی', 'open_link_current' => 'پنجره کنونی',
'open_link_new' => 'پنجره جدید', 'open_link_new' => 'پنجره جدید',
'remove_link' => 'Remove link', 'remove_link' => 'حذف لینک',
'insert_collapsible' => 'درج بلوک جمع شونده', 'insert_collapsible' => 'درج بلوک جمع شونده',
'collapsible_unwrap' => 'باز کردن', 'collapsible_unwrap' => 'باز کردن',
'edit_label' => 'ویرایش برچسب', 'edit_label' => 'ویرایش برچسب',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'به روزرسانی شده :timeLength', 'meta_updated' => 'به روزرسانی شده :timeLength',
'meta_updated_name' => 'به روزرسانی شده :timeLength توسط :user', 'meta_updated_name' => 'به روزرسانی شده :timeLength توسط :user',
'meta_owned_name' => 'توسط :user ایجاد شده‌است', 'meta_owned_name' => 'توسط :user ایجاد شده‌است',
'meta_reference_page_count' => 'در 1 صفحه به آن ارجاع داده شده|در :count صفحه به آن ارجاع داده شده', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'انتخاب موجودیت', 'entity_select' => 'انتخاب موجودیت',
'entity_select_lack_permission' => 'شما مجوزهای لازم برای انتخاب این مورد را ندارید', 'entity_select_lack_permission' => 'شما مجوزهای لازم برای انتخاب این مورد را ندارید',
'images' => 'عکس‌ها', 'images' => 'عکس‌ها',
@ -141,7 +141,7 @@ return [
'books_search_this' => 'این کتاب را جستجو کنید', 'books_search_this' => 'این کتاب را جستجو کنید',
'books_navigation' => 'ناوبری کتاب', 'books_navigation' => 'ناوبری کتاب',
'books_sort' => 'مرتب سازی مطالب کتاب', 'books_sort' => 'مرتب سازی مطالب کتاب',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books.', 'books_sort_desc' => 'فصل‌ها و صفحات را در یک کتاب جابه‌جا کنید تا محتوای آن را مجددا سازماندهی کنید. کتاب‌های دیگری را می‌توان اضافه کرد که امکان جابه‌جایی آسان فصل‌ها و صفحات را بین کتاب‌ها فراهم می‌کند.',
'books_sort_named' => 'مرتب‌سازی کتاب:bookName', 'books_sort_named' => 'مرتب‌سازی کتاب:bookName',
'books_sort_name' => 'مرتب سازی بر اساس نام', 'books_sort_name' => 'مرتب سازی بر اساس نام',
'books_sort_created' => 'مرتب سازی بر اساس تاریخ ایجاد', 'books_sort_created' => 'مرتب سازی بر اساس تاریخ ایجاد',
@ -150,17 +150,17 @@ return [
'books_sort_chapters_last' => 'فصل آخر', 'books_sort_chapters_last' => 'فصل آخر',
'books_sort_show_other' => 'نمایش کتاب های دیگر', 'books_sort_show_other' => 'نمایش کتاب های دیگر',
'books_sort_save' => 'ذخیره سفارش جدید', 'books_sort_save' => 'ذخیره سفارش جدید',
'books_sort_show_other_desc' => 'Add other books here to include them in the sort operation, and allow easy cross-book reorganisation.', 'books_sort_show_other_desc' => 'کتاب‌های دیگری را در اینجا اضافه کنید تا آنها را در عملیات مرتب‌سازی بگنجانید و به آسانی کتاب‌ها را مجددا سازماندهی کنید.',
'books_sort_move_up' => 'Move Up', 'books_sort_move_up' => 'انتقال به بالا',
'books_sort_move_down' => 'Move Down', 'books_sort_move_down' => 'انتقال به پایین',
'books_sort_move_prev_book' => 'Move to Previous Book', 'books_sort_move_prev_book' => 'انتقال به کتاب قبلی',
'books_sort_move_next_book' => 'Move to Next Book', 'books_sort_move_next_book' => 'انتقال به کتاب بعدی',
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter', 'books_sort_move_prev_chapter' => 'انتقال به داخل فصل قبلی',
'books_sort_move_next_chapter' => 'Move Into Next Chapter', 'books_sort_move_next_chapter' => 'انتقال به داخل فصل بعدی',
'books_sort_move_book_start' => 'Move to Start of Book', 'books_sort_move_book_start' => 'انتقال به ابتدای کتاب',
'books_sort_move_book_end' => 'Move to End of Book', 'books_sort_move_book_end' => 'انتقال به انتهای کتاب',
'books_sort_move_before_chapter' => 'Move to Before Chapter', 'books_sort_move_before_chapter' => 'انتقال به قبل فصل',
'books_sort_move_after_chapter' => 'Move to After Chapter', 'books_sort_move_after_chapter' => 'انتقال به بعد فصل',
'books_copy' => 'کپی کتاب', 'books_copy' => 'کپی کتاب',
'books_copy_success' => 'کتاب با موفقیت کپی شد', 'books_copy_success' => 'کتاب با موفقیت کپی شد',
@ -248,14 +248,14 @@ return [
'pages_permissions_success' => 'مجوزهای صفحه به روز شد', 'pages_permissions_success' => 'مجوزهای صفحه به روز شد',
'pages_revision' => 'تجدید نظر', 'pages_revision' => 'تجدید نظر',
'pages_revisions' => 'ویرایش های صفحه', 'pages_revisions' => 'ویرایش های صفحه',
'pages_revisions_desc' => 'Listed below are all the past revisions of this page. You can look back upon, compare, and restore old page versions if permissions allow. The full history of the page may not be fully reflected here since, depending on system configuration, old revisions could be auto-deleted.', 'pages_revisions_desc' => 'لیست زیر تمامی ویرایش‌های قبلی این صفحه است. در صورت وجود مجوز دسترسی، می‌توانید نسخه‌های قدیمی صفحه را مشاهده، مقایسه و بازیابی کنید. تاریخچه کامل صفحه ممکن است به طور کامل در اینجا منعکس نشود زیرا بسته به پیکربندی سیستم، ویرایش های قدیمی می توانند به طور خودکار حذف شوند.',
'pages_revisions_named' => 'بازبینی صفحه برای :pageName', 'pages_revisions_named' => 'بازبینی صفحه برای :pageName',
'pages_revision_named' => 'ویرایش صفحه برای :pageName', 'pages_revision_named' => 'ویرایش صفحه برای :pageName',
'pages_revision_restored_from' => 'بازیابی شده از #:id; :summary', 'pages_revision_restored_from' => 'بازیابی شده از #:id; :summary',
'pages_revisions_created_by' => 'ایجاد شده توسط', 'pages_revisions_created_by' => 'ایجاد شده توسط',
'pages_revisions_date' => 'تاریخ تجدید نظر', 'pages_revisions_date' => 'تاریخ تجدید نظر',
'pages_revisions_number' => '#', 'pages_revisions_number' => '#',
'pages_revisions_sort_number' => 'Revision Number', 'pages_revisions_sort_number' => 'شماره ویرایش',
'pages_revisions_numbered' => 'تجدید نظر #:id', 'pages_revisions_numbered' => 'تجدید نظر #:id',
'pages_revisions_numbered_changes' => 'بازبینی #:id تغییرات', 'pages_revisions_numbered_changes' => 'بازبینی #:id تغییرات',
'pages_revisions_editor' => 'نوع ویرایشگر', 'pages_revisions_editor' => 'نوع ویرایشگر',

View file

@ -33,9 +33,9 @@ return [
'app_custom_html_desc' => 'هر محتوای اضافه شده در اینجا در پایین بخش <head> هر صفحه درج می شود. این برای تغییر سبک ها یا اضافه کردن کد تجزیه و تحلیل مفید است.', 'app_custom_html_desc' => 'هر محتوای اضافه شده در اینجا در پایین بخش <head> هر صفحه درج می شود. این برای تغییر سبک ها یا اضافه کردن کد تجزیه و تحلیل مفید است.',
'app_custom_html_disabled_notice' => 'محتوای سر HTML سفارشی در این صفحه تنظیمات غیرفعال است تا اطمینان حاصل شود که هر گونه تغییر شکسته می تواند برگردانده شود.', 'app_custom_html_disabled_notice' => 'محتوای سر HTML سفارشی در این صفحه تنظیمات غیرفعال است تا اطمینان حاصل شود که هر گونه تغییر شکسته می تواند برگردانده شود.',
'app_logo' => 'لوگوی برنامه', 'app_logo' => 'لوگوی برنامه',
'app_logo_desc' => 'This is used in the application header bar, among other areas. This image should be 86px in height. Large images will be scaled down.', 'app_logo_desc' => 'این مورد در نوار هدر برنامه و در میان سایر قسمت‌ها استفاده می‌شود. این تصویر باید 86 پیکسل ارتفاع داشته باشد. تصاویر بزرگ، کوچک نمایش داده می‌شوند.',
'app_icon' => 'Application Icon', 'app_icon' => 'آیکون برنامه',
'app_icon_desc' => 'This icon is used for browser tabs and shortcut icons. This should be a 256px square PNG image.', 'app_icon_desc' => 'این آیکون برای تب‌های مرورگر و نمادهای میانبر استفاده می‌شود. این مورد باید یک تصویر PNG مربعی ببه طول 256 پیکسل باشد.',
'app_homepage' => 'صفحه اصلی برنامه', 'app_homepage' => 'صفحه اصلی برنامه',
'app_homepage_desc' => 'به جای نمای پیش‌فرض، یک نمای را برای نمایش در صفحه اصلی انتخاب کنید. مجوزهای صفحه برای صفحات انتخابی نادیده گرفته می شود.', 'app_homepage_desc' => 'به جای نمای پیش‌فرض، یک نمای را برای نمایش در صفحه اصلی انتخاب کنید. مجوزهای صفحه برای صفحات انتخابی نادیده گرفته می شود.',
'app_homepage_select' => 'یک صفحه را انتخاب کنید', 'app_homepage_select' => 'یک صفحه را انتخاب کنید',
@ -49,7 +49,7 @@ return [
'app_disable_comments_desc' => 'نظرات را در تمام صفحات برنامه غیرفعال می کند. <br> نظرات موجود نشان داده نمی شوند.', 'app_disable_comments_desc' => 'نظرات را در تمام صفحات برنامه غیرفعال می کند. <br> نظرات موجود نشان داده نمی شوند.',
// Color settings // Color settings
'color_scheme' => 'Application Color Scheme', 'color_scheme' => 'ترکیب رنگی برنامه',
'color_scheme_desc' => 'Set the colors to use in the BookStack interface. Colors can be configured separately for dark and light modes to best fit the theme and ensure legibility.', 'color_scheme_desc' => 'Set the colors to use in the BookStack interface. Colors can be configured separately for dark and light modes to best fit the theme and ensure legibility.',
'ui_colors_desc' => 'Set the primary color and default link color for BookStack. The primary color is mainly used for the header banner, buttons and interface decorations. The default link color is used for text-based links and actions, both within written content and in the Bookstack interface.', 'ui_colors_desc' => 'Set the primary color and default link color for BookStack. The primary color is mainly used for the header banner, buttons and interface decorations. The default link color is used for text-based links and actions, both within written content and in the Bookstack interface.',
'app_color' => 'Primary Color', 'app_color' => 'Primary Color',
@ -137,19 +137,17 @@ return [
// Role Settings // Role Settings
'roles' => 'نقش ها', 'roles' => 'نقش ها',
'role_user_roles' => 'نقش های کاربر', 'role_user_roles' => 'نقش های کاربر',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.', 'roles_index_desc' => 'نقش‌ها برای گروه‌بندی کاربران و ارائه مجوز سیستم به اعضای آن‌ها استفاده می‌شوند. هنگامی که یک کاربر عضو چندین نقش باشد، امتیازات اعطا شده روی هم قرار می‌گیرند و کاربر تمام مجوزها را به ارث می‌برد.',
'roles_x_users_assigned' => '1 user assigned|:count users assigned', 'roles_x_users_assigned' => ':count کاربر اختصاص داده شده|:count کاربر اختصاص داده شده',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count مجوز|:count مجوز',
'roles_assigned_users' => 'Assigned Users', 'roles_assigned_users' => 'کاربران اختصاص داده شده',
'roles_permissions_provided' => 'Provided Permissions', 'roles_permissions_provided' => 'Provided Permissions',
'role_create' => 'نقش جدید ایجاد کنید', 'role_create' => 'نقش جدید ایجاد کنید',
'role_create_success' => 'نقش با موفقیت ایجاد شد',
'role_delete' => 'حذف نقش', 'role_delete' => 'حذف نقش',
'role_delete_confirm' => 'با این کار نقش با نام \':roleName\' حذف می شود.', 'role_delete_confirm' => 'با این کار نقش با نام \':roleName\' حذف می شود.',
'role_delete_users_assigned' => 'این نقش دارای :userCount کاربرانی است که به آن اختصاص داده شده است. اگر می خواهید کاربران را از این نقش مهاجرت کنید، نقش جدیدی را در زیر انتخاب کنید.', 'role_delete_users_assigned' => 'این نقش دارای :userCount کاربرانی است که به آن اختصاص داده شده است. اگر می خواهید کاربران را از این نقش مهاجرت کنید، نقش جدیدی را در زیر انتخاب کنید.',
'role_delete_no_migration' => "کاربران را منتقل نکنید", 'role_delete_no_migration' => "کاربران را منتقل نکنید",
'role_delete_sure' => 'آیا مطمئنید که می خواهید این نقش را حذف کنید؟', 'role_delete_sure' => 'آیا مطمئنید که می خواهید این نقش را حذف کنید؟',
'role_delete_success' => 'نقش با موفقیت حذف شد',
'role_edit' => 'ویرایش نقش', 'role_edit' => 'ویرایش نقش',
'role_details' => 'جزئیات نقش', 'role_details' => 'جزئیات نقش',
'role_name' => 'اسم نقش', 'role_name' => 'اسم نقش',
@ -175,7 +173,6 @@ return [
'role_own' => 'صاحب', 'role_own' => 'صاحب',
'role_controlled_by_asset' => 'توسط دارایی که در آن آپلود می شود کنترل می شود', 'role_controlled_by_asset' => 'توسط دارایی که در آن آپلود می شود کنترل می شود',
'role_save' => 'ذخیره نقش', 'role_save' => 'ذخیره نقش',
'role_update_success' => 'نقش با موفقیت به روز شد',
'role_users' => 'کاربران در این نقش', 'role_users' => 'کاربران در این نقش',
'role_users_none' => 'در حال حاضر هیچ کاربری به این نقش اختصاص داده نشده است', 'role_users_none' => 'در حال حاضر هیچ کاربری به این نقش اختصاص داده نشده است',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'وب‌هوک‌ها', 'webhooks' => 'وب‌هوک‌ها',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.', 'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => '1 trigger event|:count trigger events', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'ایجاد وب هوک جدید', 'webhooks_create' => 'ایجاد وب هوک جدید',
'webhooks_none_created' => 'هنوز هیچ وب هوکی ایجاد نشده است.', 'webhooks_none_created' => 'هنوز هیچ وب هوکی ایجاد نشده است.',
'webhooks_edit' => 'ویرایش وب هوک', 'webhooks_edit' => 'ویرایش وب هوک',

View file

@ -67,6 +67,11 @@ return [
'user_update_notification' => 'Utilisateur mis à jour avec succès', 'user_update_notification' => 'Utilisateur mis à jour avec succès',
'user_delete_notification' => 'Utilisateur supprimé avec succès', 'user_delete_notification' => 'Utilisateur supprimé avec succès',
// Roles
'role_create_notification' => 'Role successfully created',
'role_update_notification' => 'Role successfully updated',
'role_delete_notification' => 'Role successfully deleted',
// Other // Other
'commented_on' => 'a commenté', 'commented_on' => 'a commenté',
'permissions_update' => 'a mis à jour les autorisations sur', 'permissions_update' => 'a mis à jour les autorisations sur',

View file

@ -23,7 +23,7 @@ return [
'meta_updated' => 'Mis à jour :timeLength', 'meta_updated' => 'Mis à jour :timeLength',
'meta_updated_name' => 'Mis à jour :timeLength par :user', 'meta_updated_name' => 'Mis à jour :timeLength par :user',
'meta_owned_name' => 'Appartient à :user', 'meta_owned_name' => 'Appartient à :user',
'meta_reference_page_count' => 'Référencé sur 1 page|Référencé sur :count pages', 'meta_reference_page_count' => 'Referenced on :count page|Referenced on :count pages',
'entity_select' => 'Sélectionner l\'entité', 'entity_select' => 'Sélectionner l\'entité',
'entity_select_lack_permission' => 'Vous n\'avez pas les permissions requises pour sélectionner cet élément', 'entity_select_lack_permission' => 'Vous n\'avez pas les permissions requises pour sélectionner cet élément',
'images' => 'Images', 'images' => 'Images',

View file

@ -138,18 +138,16 @@ return [
'roles' => 'Rôles', 'roles' => 'Rôles',
'role_user_roles' => 'Rôles des utilisateurs', 'role_user_roles' => 'Rôles des utilisateurs',
'roles_index_desc' => 'Les rôles sont utilisés pour regrouper les utilisateurs et fournir une autorisation système à leurs membres. Lorsqu\'un utilisateur est membre de plusieurs rôles, les privilèges accordés se cumulent et l\'utilisateur hérite de tous les droits d\'accès.', 'roles_index_desc' => 'Les rôles sont utilisés pour regrouper les utilisateurs et fournir une autorisation système à leurs membres. Lorsqu\'un utilisateur est membre de plusieurs rôles, les privilèges accordés se cumulent et l\'utilisateur hérite de tous les droits d\'accès.',
'roles_x_users_assigned' => '1 utilisateur affecté|:count utilisateurs affectés', 'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => '1 permission|:count permissions', 'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Utilisateurs assignés', 'roles_assigned_users' => 'Utilisateurs assignés',
'roles_permissions_provided' => 'Permissions accordées', 'roles_permissions_provided' => 'Permissions accordées',
'role_create' => 'Créer un nouveau rôle', 'role_create' => 'Créer un nouveau rôle',
'role_create_success' => 'Rôle créé avec succès',
'role_delete' => 'Supprimer le rôle', 'role_delete' => 'Supprimer le rôle',
'role_delete_confirm' => 'Ceci va supprimer le rôle \':roleName\'.', 'role_delete_confirm' => 'Ceci va supprimer le rôle \':roleName\'.',
'role_delete_users_assigned' => 'Ce rôle a :userCount utilisateurs assignés. Vous pouvez choisir un rôle de remplacement pour ces utilisateurs.', 'role_delete_users_assigned' => 'Ce rôle a :userCount utilisateurs assignés. Vous pouvez choisir un rôle de remplacement pour ces utilisateurs.',
'role_delete_no_migration' => "Ne pas assigner de nouveau rôle", 'role_delete_no_migration' => "Ne pas assigner de nouveau rôle",
'role_delete_sure' => 'Êtes-vous sûr de vouloir supprimer ce rôle ?', 'role_delete_sure' => 'Êtes-vous sûr de vouloir supprimer ce rôle ?',
'role_delete_success' => 'Le rôle a été supprimé avec succès',
'role_edit' => 'Modifier le rôle', 'role_edit' => 'Modifier le rôle',
'role_details' => 'Détails du rôle', 'role_details' => 'Détails du rôle',
'role_name' => 'Nom du rôle', 'role_name' => 'Nom du rôle',
@ -175,7 +173,6 @@ return [
'role_own' => 'Propres', 'role_own' => 'Propres',
'role_controlled_by_asset' => 'Contrôlé par les ressources les ayant envoyés', 'role_controlled_by_asset' => 'Contrôlé par les ressources les ayant envoyés',
'role_save' => 'Enregistrer le rôle', 'role_save' => 'Enregistrer le rôle',
'role_update_success' => 'Rôle mis à jour avec succès',
'role_users' => 'Utilisateurs ayant ce rôle', 'role_users' => 'Utilisateurs ayant ce rôle',
'role_users_none' => 'Aucun utilisateur avec ce rôle actuellement', 'role_users_none' => 'Aucun utilisateur avec ce rôle actuellement',
@ -252,7 +249,7 @@ return [
// Webhooks // Webhooks
'webhooks' => 'Webhooks', 'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Les Webhooks sont un moyen d\'envoyer des données à des URL externes lorsque certaines actions et événements se produisent dans le système, ce qui permet une intégration basée sur des événements avec des plates-formes externes telles que les systèmes de messagerie ou de notification.', 'webhooks_index_desc' => 'Les Webhooks sont un moyen d\'envoyer des données à des URL externes lorsque certaines actions et événements se produisent dans le système, ce qui permet une intégration basée sur des événements avec des plates-formes externes telles que les systèmes de messagerie ou de notification.',
'webhooks_x_trigger_events' => '1 événement déclencheur|:count événements déclencheurs', 'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'webhooks_create' => 'Créer un nouveau Webhook', 'webhooks_create' => 'Créer un nouveau Webhook',
'webhooks_none_created' => 'Aucun webhook n\'a encore été créé.', 'webhooks_none_created' => 'Aucun webhook n\'a encore été créé.',
'webhooks_edit' => 'Éditer le Webhook', 'webhooks_edit' => 'Éditer le Webhook',

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