mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-02-20 22:10:24 +08:00
Merge branch 'development' into codemirror6
This commit is contained in:
commit
c81cb6f2af
3
.github/translators.txt
vendored
3
.github/translators.txt
vendored
@ -308,3 +308,6 @@ Adrian Ocneanu (aocneanu) :: Romanian
|
||||
Eduardo Castanho (EduardoCastanho) :: Portuguese
|
||||
VIET NAM VPS (vietnamvps) :: Vietnamese
|
||||
m4tthi4s :: French
|
||||
toras9000 :: Japanese
|
||||
pathab :: German
|
||||
MichelSchoon85 :: Dutch
|
||||
|
@ -5,7 +5,6 @@ namespace BookStack\Auth\Permissions;
|
||||
use BookStack\Auth\Role;
|
||||
use BookStack\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
@ -23,14 +22,14 @@ class EntityPermission extends Model
|
||||
|
||||
protected $fillable = ['role_id', 'view', 'create', 'update', 'delete'];
|
||||
public $timestamps = false;
|
||||
|
||||
/**
|
||||
* Get this restriction's attached entity.
|
||||
*/
|
||||
public function restrictable(): MorphTo
|
||||
{
|
||||
return $this->morphTo('restrictable');
|
||||
}
|
||||
protected $hidden = ['entity_id', 'entity_type', 'id'];
|
||||
protected $casts = [
|
||||
'view' => 'boolean',
|
||||
'create' => 'boolean',
|
||||
'read' => 'boolean',
|
||||
'update' => 'boolean',
|
||||
'delete' => 'boolean',
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the role assigned to this entity permission.
|
||||
|
@ -12,11 +12,8 @@ use Illuminate\Database\Eloquent\Collection;
|
||||
class PermissionsRepo
|
||||
{
|
||||
protected JointPermissionBuilder $permissionBuilder;
|
||||
protected $systemRoles = ['admin', 'public'];
|
||||
protected array $systemRoles = ['admin', 'public'];
|
||||
|
||||
/**
|
||||
* PermissionsRepo constructor.
|
||||
*/
|
||||
public function __construct(JointPermissionBuilder $permissionBuilder)
|
||||
{
|
||||
$this->permissionBuilder = $permissionBuilder;
|
||||
@ -41,7 +38,7 @@ class PermissionsRepo
|
||||
/**
|
||||
* Get a role via its ID.
|
||||
*/
|
||||
public function getRoleById($id): Role
|
||||
public function getRoleById(int $id): Role
|
||||
{
|
||||
return Role::query()->findOrFail($id);
|
||||
}
|
||||
@ -52,10 +49,10 @@ class PermissionsRepo
|
||||
public function saveNewRole(array $roleData): Role
|
||||
{
|
||||
$role = new Role($roleData);
|
||||
$role->mfa_enforced = ($roleData['mfa_enforced'] ?? 'false') === 'true';
|
||||
$role->mfa_enforced = boolval($roleData['mfa_enforced'] ?? false);
|
||||
$role->save();
|
||||
|
||||
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
|
||||
$permissions = $roleData['permissions'] ?? [];
|
||||
$this->assignRolePermissions($role, $permissions);
|
||||
$this->permissionBuilder->rebuildForRole($role);
|
||||
|
||||
@ -66,42 +63,45 @@ class PermissionsRepo
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
$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') {
|
||||
$permissions = array_merge($permissions, [
|
||||
$permissionNameArray = array_unique(array_merge($permissionNameArray, [
|
||||
'users-manage',
|
||||
'user-roles-manage',
|
||||
'restrictions-manage-all',
|
||||
'restrictions-manage-own',
|
||||
'settings-manage',
|
||||
]);
|
||||
]));
|
||||
}
|
||||
|
||||
$this->assignRolePermissions($role, $permissions);
|
||||
|
||||
$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) {
|
||||
if (!empty($permissionNameArray)) {
|
||||
$permissions = RolePermission::query()
|
||||
->whereIn('name', $permissionNameArray)
|
||||
->pluck('id')
|
||||
@ -114,13 +114,13 @@ class PermissionsRepo
|
||||
/**
|
||||
* Delete a role from the system.
|
||||
* 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.
|
||||
*
|
||||
* @throws PermissionsException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function deleteRole($roleId, $migrateRoleId)
|
||||
public function deleteRole(int $roleId, int $migrateRoleId = 0): void
|
||||
{
|
||||
$role = $this->getRoleById($roleId);
|
||||
|
||||
@ -131,7 +131,7 @@ class PermissionsRepo
|
||||
throw new PermissionsException(trans('errors.role_registration_default_cannot_delete'));
|
||||
}
|
||||
|
||||
if ($migrateRoleId) {
|
||||
if ($migrateRoleId !== 0) {
|
||||
$newRole = Role::query()->find($migrateRoleId);
|
||||
if ($newRole) {
|
||||
$users = $role->users()->pluck('id')->toArray();
|
||||
|
@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property string $name
|
||||
* @property string $display_name
|
||||
*/
|
||||
class RolePermission extends Model
|
||||
{
|
||||
|
@ -27,10 +27,14 @@ class Role extends Model implements Loggable
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = ['display_name', 'description', 'external_auth_id'];
|
||||
protected $fillable = ['display_name', 'description', 'external_auth_id', 'mfa_enforced'];
|
||||
|
||||
protected $hidden = ['pivot'];
|
||||
|
||||
protected $casts = [
|
||||
'mfa_enforced' => 'boolean',
|
||||
];
|
||||
|
||||
/**
|
||||
* The roles that belong to the role.
|
||||
*/
|
||||
@ -107,7 +111,13 @@ class Role extends Model implements Loggable
|
||||
*/
|
||||
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];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -72,7 +72,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
protected $hidden = [
|
||||
'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',
|
||||
];
|
||||
|
||||
/**
|
||||
|
@ -18,30 +18,11 @@ use BookStack\Entities\Models\PageRevision;
|
||||
*/
|
||||
class EntityProvider
|
||||
{
|
||||
/**
|
||||
* @var Bookshelf
|
||||
*/
|
||||
public $bookshelf;
|
||||
|
||||
/**
|
||||
* @var Book
|
||||
*/
|
||||
public $book;
|
||||
|
||||
/**
|
||||
* @var Chapter
|
||||
*/
|
||||
public $chapter;
|
||||
|
||||
/**
|
||||
* @var Page
|
||||
*/
|
||||
public $page;
|
||||
|
||||
/**
|
||||
* @var PageRevision
|
||||
*/
|
||||
public $pageRevision;
|
||||
public Bookshelf $bookshelf;
|
||||
public Book $book;
|
||||
public Chapter $chapter;
|
||||
public Page $page;
|
||||
public PageRevision $pageRevision;
|
||||
|
||||
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
|
||||
{
|
||||
$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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -19,20 +19,15 @@ use Illuminate\Support\Str;
|
||||
|
||||
class PageContent
|
||||
{
|
||||
protected Page $page;
|
||||
|
||||
/**
|
||||
* PageContent constructor.
|
||||
*/
|
||||
public function __construct(Page $page)
|
||||
{
|
||||
$this->page = $page;
|
||||
public function __construct(
|
||||
protected Page $page
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
$this->page->html = $this->formatHtml($html);
|
||||
@ -43,7 +38,7 @@ class PageContent
|
||||
/**
|
||||
* 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);
|
||||
$this->page->markdown = $markdown;
|
||||
@ -57,7 +52,7 @@ class PageContent
|
||||
*/
|
||||
protected function extractBase64ImagesFromHtml(string $htmlText): string
|
||||
{
|
||||
if (empty($htmlText) || strpos($htmlText, 'data:image') === false) {
|
||||
if (empty($htmlText) || !str_contains($htmlText, 'data:image')) {
|
||||
return $htmlText;
|
||||
}
|
||||
|
||||
@ -91,7 +86,7 @@ class PageContent
|
||||
* Attempting to capture the whole data uri using regex can cause PHP
|
||||
* PCRE limits to be hit with larger, multi-MB, files.
|
||||
*/
|
||||
protected function extractBase64ImagesFromMarkdown(string $markdown)
|
||||
protected function extractBase64ImagesFromMarkdown(string $markdown): string
|
||||
{
|
||||
$matches = [];
|
||||
$contentLength = strlen($markdown);
|
||||
@ -183,32 +178,13 @@ class PageContent
|
||||
$childNodes = $body->childNodes;
|
||||
$xPath = new DOMXPath($doc);
|
||||
|
||||
// Set ids on top-level nodes
|
||||
// Map to hold used ID references
|
||||
$idMap = [];
|
||||
foreach ($childNodes as $index => $childNode) {
|
||||
[$oldId, $newId] = $this->setUniqueId($childNode, $idMap);
|
||||
if ($newId && $newId !== $oldId) {
|
||||
$this->updateLinks($xPath, '#' . $oldId, '#' . $newId);
|
||||
}
|
||||
}
|
||||
// Map to hold changing ID references
|
||||
$changeMap = [];
|
||||
|
||||
// Set ids on nested header nodes
|
||||
$nestedHeaders = $xPath->query('//body//*//h1|//body//*//h2|//body//*//h3|//body//*//h4|//body//*//h5|//body//*//h6');
|
||||
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);
|
||||
}
|
||||
}
|
||||
$this->updateIdsRecursively($body, 0, $idMap, $changeMap);
|
||||
$this->updateLinks($xPath, $changeMap);
|
||||
|
||||
// Generate inner html as a string
|
||||
$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);
|
||||
$matchingLinks = $xpath->query('//body//*//*[@href="' . $old . '"]');
|
||||
foreach ($matchingLinks as $domElem) {
|
||||
$domElem->setAttribute('href', $new);
|
||||
/* @var DOMNode $child */
|
||||
foreach ($element->childNodes as $child) {
|
||||
if ($child instanceof DOMElement && ($depth === 0 || in_array($child->nodeName, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) || $child->getAttribute('id'))) {
|
||||
[$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.
|
||||
* 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].
|
||||
*/
|
||||
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.
|
||||
$existingId = $element->getAttribute('id');
|
||||
if (strpos($existingId, 'bkmrk') === 0 && !isset($idMap[$existingId])) {
|
||||
if (str_starts_with($existingId, 'bkmrk') && !isset($idMap[$existingId])) {
|
||||
$idMap[$existingId] = true;
|
||||
|
||||
return [$existingId, $existingId];
|
||||
@ -258,7 +267,7 @@ class PageContent
|
||||
// the same content is passed through.
|
||||
$contentId = 'bkmrk-' . mb_substr(strtolower(preg_replace('/\s+/', '-', trim($element->nodeValue))), 0, 20);
|
||||
$newId = urlencode($contentId);
|
||||
$loopIndex = 0;
|
||||
$loopIndex = 1;
|
||||
|
||||
while (isset($idMap[$newId])) {
|
||||
$newId = urlencode($contentId . '-' . $loopIndex);
|
||||
@ -440,8 +449,8 @@ class PageContent
|
||||
{
|
||||
libxml_use_internal_errors(true);
|
||||
$doc = new DOMDocument();
|
||||
$html = '<body>' . $html . '</body>';
|
||||
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
|
||||
$html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
|
||||
$doc->loadHTML($html);
|
||||
|
||||
return $doc;
|
||||
}
|
||||
|
@ -4,20 +4,20 @@ namespace BookStack\Entities\Tools;
|
||||
|
||||
use BookStack\Actions\ActivityType;
|
||||
use BookStack\Auth\Permissions\EntityPermission;
|
||||
use BookStack\Auth\Role;
|
||||
use BookStack\Auth\User;
|
||||
use BookStack\Entities\Models\Book;
|
||||
use BookStack\Entities\Models\Bookshelf;
|
||||
use BookStack\Entities\Models\Entity;
|
||||
use BookStack\Facades\Activity;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class PermissionsUpdater
|
||||
{
|
||||
/**
|
||||
* 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);
|
||||
$ownerId = $request->get('owned_by', null);
|
||||
@ -39,12 +39,44 @@ class PermissionsUpdater
|
||||
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.
|
||||
* Checks the user exists in the system first.
|
||||
* 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);
|
||||
if (!is_null($newOwner)) {
|
||||
@ -67,7 +99,41 @@ class PermissionsUpdater
|
||||
$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']);
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -32,10 +32,15 @@ abstract class ApiController extends Controller
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -13,11 +13,9 @@ use Illuminate\Validation\ValidationException;
|
||||
|
||||
class AttachmentApiController extends ApiController
|
||||
{
|
||||
protected $attachmentService;
|
||||
|
||||
public function __construct(AttachmentService $attachmentService)
|
||||
{
|
||||
$this->attachmentService = $attachmentService;
|
||||
public function __construct(
|
||||
protected AttachmentService $attachmentService
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
@ -174,13 +172,13 @@ class AttachmentApiController extends ApiController
|
||||
'name' => ['required', 'min:1', 'max:255', 'string'],
|
||||
'uploaded_to' => ['required', 'integer', 'exists:pages,id'],
|
||||
'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' => [
|
||||
'name' => ['min:1', 'max:255', 'string'],
|
||||
'uploaded_to' => ['integer', 'exists:pages,id'],
|
||||
'file' => $this->attachmentService->getFileValidationRules(),
|
||||
'link' => ['min:1', 'max:255', 'safe_url'],
|
||||
'link' => ['min:1', 'max:2000', 'safe_url'],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
100
app/Http/Controllers/Api/ContentPermissionApiController.php
Normal file
100
app/Http/Controllers/Api/ContentPermissionApiController.php
Normal 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,
|
||||
];
|
||||
}
|
||||
}
|
146
app/Http/Controllers/Api/ImageGalleryApiController.php
Normal file
146
app/Http/Controllers/Api/ImageGalleryApiController.php
Normal 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'] = "";
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
136
app/Http/Controllers/Api/RoleApiController.php
Normal file
136
app/Http/Controllers/Api/RoleApiController.php
Normal 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']);
|
||||
}
|
||||
}
|
@ -13,9 +13,9 @@ use Illuminate\Validation\Rules\Unique;
|
||||
|
||||
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',
|
||||
];
|
||||
|
||||
|
@ -15,16 +15,10 @@ use Illuminate\Validation\ValidationException;
|
||||
|
||||
class AttachmentController extends Controller
|
||||
{
|
||||
protected AttachmentService $attachmentService;
|
||||
protected PageRepo $pageRepo;
|
||||
|
||||
/**
|
||||
* AttachmentController constructor.
|
||||
*/
|
||||
public function __construct(AttachmentService $attachmentService, PageRepo $pageRepo)
|
||||
{
|
||||
$this->attachmentService = $attachmentService;
|
||||
$this->pageRepo = $pageRepo;
|
||||
public function __construct(
|
||||
protected AttachmentService $attachmentService,
|
||||
protected PageRepo $pageRepo
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
@ -112,7 +106,7 @@ class AttachmentController extends Controller
|
||||
try {
|
||||
$this->validate($request, [
|
||||
'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) {
|
||||
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, [
|
||||
'attachment_link_uploaded_to' => ['required', 'integer', 'exists:pages,id'],
|
||||
'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) {
|
||||
return response()->view('attachments.manager-link-form', array_merge($request->only(['attachment_link_name', 'attachment_link_url']), [
|
||||
|
@ -10,14 +10,9 @@ use Illuminate\Validation\ValidationException;
|
||||
|
||||
class GalleryImageController extends Controller
|
||||
{
|
||||
protected $imageRepo;
|
||||
|
||||
/**
|
||||
* GalleryImageController constructor.
|
||||
*/
|
||||
public function __construct(ImageRepo $imageRepo)
|
||||
{
|
||||
$this->imageRepo = $imageRepo;
|
||||
public function __construct(
|
||||
protected ImageRepo $imageRepo
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -74,13 +74,17 @@ class RoleController extends Controller
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$this->validate($request, [
|
||||
$data = $this->validate($request, [
|
||||
'display_name' => ['required', 'min:3', 'max:180'],
|
||||
'description' => ['max:180'],
|
||||
'external_auth_id' => ['string'],
|
||||
'permissions' => ['array'],
|
||||
'mfa_enforced' => ['string'],
|
||||
]);
|
||||
|
||||
$this->permissionsRepo->saveNewRole($request->all());
|
||||
$this->showSuccessNotification(trans('settings.role_create_success'));
|
||||
$data['permissions'] = array_keys($data['permissions'] ?? []);
|
||||
$data['mfa_enforced'] = ($data['mfa_enforced'] ?? 'false') === 'true';
|
||||
$this->permissionsRepo->saveNewRole($data);
|
||||
|
||||
return redirect('/settings/roles');
|
||||
}
|
||||
@ -100,19 +104,21 @@ class RoleController extends Controller
|
||||
|
||||
/**
|
||||
* Updates a user role.
|
||||
*
|
||||
* @throws ValidationException
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
$this->checkPermission('user-roles-manage');
|
||||
$this->validate($request, [
|
||||
$data = $this->validate($request, [
|
||||
'display_name' => ['required', 'min:3', 'max:180'],
|
||||
'description' => ['max:180'],
|
||||
'external_auth_id' => ['string'],
|
||||
'permissions' => ['array'],
|
||||
'mfa_enforced' => ['string'],
|
||||
]);
|
||||
|
||||
$this->permissionsRepo->updateRole($id, $request->all());
|
||||
$this->showSuccessNotification(trans('settings.role_update_success'));
|
||||
$data['permissions'] = array_keys($data['permissions'] ?? []);
|
||||
$data['mfa_enforced'] = ($data['mfa_enforced'] ?? 'false') === 'true';
|
||||
$this->permissionsRepo->updateRole($id, $data);
|
||||
|
||||
return redirect('/settings/roles');
|
||||
}
|
||||
@ -145,15 +151,13 @@ class RoleController extends Controller
|
||||
$this->checkPermission('user-roles-manage');
|
||||
|
||||
try {
|
||||
$this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id'));
|
||||
$this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id', 0));
|
||||
} catch (PermissionsException $e) {
|
||||
$this->showErrorNotification($e->getMessage());
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
$this->showSuccessNotification(trans('settings.role_delete_success'));
|
||||
|
||||
return redirect('/settings/roles');
|
||||
}
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ class ValidationRuleServiceProvider extends ServiceProvider
|
||||
|
||||
Validator::extend('safe_url', function ($attribute, $value, $parameters, $validator) {
|
||||
$cleanLinkName = strtolower(trim($value));
|
||||
$isJs = strpos($cleanLinkName, 'javascript:') === 0;
|
||||
$isData = strpos($cleanLinkName, 'data:') === 0;
|
||||
$isJs = str_starts_with($cleanLinkName, 'javascript:');
|
||||
$isData = str_starts_with($cleanLinkName, 'data:');
|
||||
|
||||
return !$isJs && !$isData;
|
||||
});
|
||||
|
@ -54,10 +54,10 @@ class CrossLinkParser
|
||||
{
|
||||
$links = [];
|
||||
|
||||
$html = '<body>' . $html . '</body>';
|
||||
$html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
|
||||
libxml_use_internal_errors(true);
|
||||
$doc = new DOMDocument();
|
||||
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
|
||||
$doc->loadHTML($html);
|
||||
|
||||
$xPath = new DOMXPath($doc);
|
||||
$anchors = $xPath->query('//a[@href]');
|
||||
|
@ -15,25 +15,18 @@ class SearchIndex
|
||||
{
|
||||
/**
|
||||
* 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.,!?:;()[]{}<>`'\"";
|
||||
|
||||
/**
|
||||
* @var EntityProvider
|
||||
*/
|
||||
protected $entityProvider;
|
||||
|
||||
public function __construct(EntityProvider $entityProvider)
|
||||
{
|
||||
$this->entityProvider = $entityProvider;
|
||||
public function __construct(
|
||||
protected EntityProvider $entityProvider
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Index the given entity.
|
||||
*/
|
||||
public function indexEntity(Entity $entity)
|
||||
public function indexEntity(Entity $entity): void
|
||||
{
|
||||
$this->deleteEntityTerms($entity);
|
||||
$terms = $this->entityToTermDataArray($entity);
|
||||
@ -45,7 +38,7 @@ class SearchIndex
|
||||
*
|
||||
* @param Entity[] $entities
|
||||
*/
|
||||
public function indexEntities(array $entities)
|
||||
public function indexEntities(array $entities): void
|
||||
{
|
||||
$terms = [];
|
||||
foreach ($entities as $entity) {
|
||||
@ -69,7 +62,7 @@ class SearchIndex
|
||||
*
|
||||
* @param callable(Entity, int, int):void|null $progressCallback
|
||||
*/
|
||||
public function indexAllEntities(?callable $progressCallback = null)
|
||||
public function indexAllEntities(?callable $progressCallback = null): void
|
||||
{
|
||||
SearchTerm::query()->truncate();
|
||||
|
||||
@ -101,7 +94,7 @@ class SearchIndex
|
||||
/**
|
||||
* Delete related Entity search terms.
|
||||
*/
|
||||
public function deleteEntityTerms(Entity $entity)
|
||||
public function deleteEntityTerms(Entity $entity): void
|
||||
{
|
||||
$entity->searchTerms()->delete();
|
||||
}
|
||||
@ -145,12 +138,12 @@ class SearchIndex
|
||||
'h6' => 1.5,
|
||||
];
|
||||
|
||||
$html = '<body>' . $html . '</body>';
|
||||
$html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
|
||||
$html = str_ireplace(['<br>', '<br />', '<br/>'], "\n", $html);
|
||||
|
||||
libxml_use_internal_errors(true);
|
||||
$doc = new DOMDocument();
|
||||
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
|
||||
$doc->loadHTML($html);
|
||||
|
||||
$topElems = $doc->documentElement->childNodes->item(0)->childNodes;
|
||||
/** @var DOMNode $child */
|
||||
|
@ -3,45 +3,29 @@
|
||||
namespace BookStack\Settings;
|
||||
|
||||
use BookStack\Auth\User;
|
||||
use Illuminate\Contracts\Cache\Repository as Cache;
|
||||
|
||||
/**
|
||||
* Class SettingService
|
||||
* The settings are a simple key-value database store.
|
||||
* 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
|
||||
{
|
||||
protected Setting $setting;
|
||||
protected Cache $cache;
|
||||
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,
|
||||
* 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)) {
|
||||
$default = config('setting-defaults.' . $key, false);
|
||||
}
|
||||
|
||||
if (isset($this->localCache[$key])) {
|
||||
return $this->localCache[$key];
|
||||
}
|
||||
|
||||
$value = $this->getValueFromStore($key) ?? $default;
|
||||
$formatted = $this->formatValue($value, $default);
|
||||
$this->localCache[$key] = $formatted;
|
||||
|
||||
return $formatted;
|
||||
return $this->formatValue($value, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -79,52 +63,78 @@ class SettingService
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a setting value from the cache or database.
|
||||
* Looks at the system defaults if not cached or in database.
|
||||
* Returns null if nothing is found.
|
||||
* Gets a setting value from the local cache.
|
||||
* Will load the local cache if not previously loaded.
|
||||
*/
|
||||
protected function getValueFromStore(string $key)
|
||||
protected function getValueFromStore(string $key): mixed
|
||||
{
|
||||
// Check the cache
|
||||
$cacheKey = $this->cachePrefix . $key;
|
||||
$cacheVal = $this->cache->get($cacheKey, null);
|
||||
if ($cacheVal !== null) {
|
||||
return $cacheVal;
|
||||
$cacheCategory = $this->localCacheCategory($key);
|
||||
if (!isset($this->localCache[$cacheCategory])) {
|
||||
$this->loadToLocalCache($cacheCategory);
|
||||
}
|
||||
|
||||
// Check the database
|
||||
$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;
|
||||
return $this->localCache[$cacheCategory][$key] ?? 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;
|
||||
$this->cache->forget($cacheKey);
|
||||
if (isset($this->localCache[$key])) {
|
||||
unset($this->localCache[$key]);
|
||||
$cacheCategory = $this->localCacheCategory($key);
|
||||
if (!isset($this->localCache[$cacheCategory])) {
|
||||
$this->loadToLocalCache($cacheCategory);
|
||||
}
|
||||
|
||||
$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.
|
||||
*/
|
||||
protected function formatValue($value, $default)
|
||||
protected function formatValue(mixed $value, mixed $default): mixed
|
||||
{
|
||||
// Change string booleans to actual booleans
|
||||
if ($value === 'true') {
|
||||
@ -155,21 +165,22 @@ class SettingService
|
||||
* Add a setting to the database.
|
||||
* 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->type = 'string';
|
||||
$setting->value = $value;
|
||||
|
||||
if (is_array($value)) {
|
||||
$setting->type = 'array';
|
||||
$value = $this->formatArrayValue($value);
|
||||
$setting->value = $this->formatArrayValue($value);
|
||||
}
|
||||
|
||||
$setting->value = $value;
|
||||
$setting->save();
|
||||
$this->clearFromCache($key);
|
||||
$this->putValueIntoLocalCache($key, $value);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -209,7 +220,7 @@ class SettingService
|
||||
* Can only take string value types since this may use
|
||||
* 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);
|
||||
}
|
||||
@ -231,15 +242,19 @@ class SettingService
|
||||
if ($setting) {
|
||||
$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.
|
||||
*/
|
||||
public function deleteUserSettings(string $userId)
|
||||
public function deleteUserSettings(string $userId): void
|
||||
{
|
||||
return $this->setting->newQuery()
|
||||
Setting::query()
|
||||
->where('setting_key', 'like', $this->userKey($userId) . '%')
|
||||
->delete();
|
||||
}
|
||||
@ -249,7 +264,16 @@ class SettingService
|
||||
*/
|
||||
protected function getSettingObjectByKey(string $key): ?Setting
|
||||
{
|
||||
return $this->setting->newQuery()
|
||||
->where('setting_key', '=', $key)->first();
|
||||
return Setting::query()
|
||||
->where('setting_key', '=', $key)
|
||||
->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty the local setting value cache used by this service.
|
||||
*/
|
||||
public function flushCache(): void
|
||||
{
|
||||
$this->localCache = [];
|
||||
}
|
||||
}
|
||||
|
@ -40,12 +40,10 @@ class Attachment extends Model
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
@ -71,7 +69,7 @@ class Attachment extends Model
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,11 @@
|
||||
namespace BookStack\Uploads;
|
||||
|
||||
use BookStack\Auth\Permissions\JointPermission;
|
||||
use BookStack\Auth\Permissions\PermissionApplicator;
|
||||
use BookStack\Entities\Models\Page;
|
||||
use BookStack\Model;
|
||||
use BookStack\Traits\HasCreatorAndUpdater;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
@ -33,12 +35,21 @@ class Image extends Model
|
||||
->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.
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
@ -19,10 +19,10 @@ class HtmlContentFilter
|
||||
return $html;
|
||||
}
|
||||
|
||||
$html = '<body>' . $html . '</body>';
|
||||
$html = '<?xml encoding="utf-8" ?><body>' . $html . '</body>';
|
||||
libxml_use_internal_errors(true);
|
||||
$doc = new DOMDocument();
|
||||
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
|
||||
$doc->loadHTML($html);
|
||||
$xPath = new DOMXPath($doc);
|
||||
|
||||
// Remove standard script tags
|
||||
|
@ -24,6 +24,7 @@ class LanguageManager
|
||||
'bg' => ['iso' => 'bg_BG', 'windows' => 'Bulgarian'],
|
||||
'bs' => ['iso' => 'bs_BA', 'windows' => 'Bosnian (Latin)'],
|
||||
'ca' => ['iso' => 'ca', 'windows' => 'Catalan'],
|
||||
'cs' => ['iso' => 'cs_CZ', 'windows' => 'Czech'],
|
||||
'da' => ['iso' => 'da_DK', 'windows' => 'Danish'],
|
||||
'de' => ['iso' => 'de_DE', 'windows' => 'German'],
|
||||
'de_informal' => ['iso' => 'de_DE', 'windows' => 'German'],
|
||||
@ -120,14 +121,14 @@ class LanguageManager
|
||||
$isoLang = $this->localeMap[$language]['iso'] ?? '';
|
||||
$isoLangPrefix = explode('_', $isoLang)[0];
|
||||
|
||||
$locales = array_filter([
|
||||
$locales = array_values(array_filter([
|
||||
$isoLang ? $isoLang . '.utf8' : false,
|
||||
$isoLang ?: false,
|
||||
$isoLang ? str_replace('_', '-', $isoLang) : false,
|
||||
$isoLang ? $isoLangPrefix . '.UTF-8' : false,
|
||||
$this->localeMap[$language]['windows'] ?? false,
|
||||
$language,
|
||||
]);
|
||||
]));
|
||||
|
||||
if (!empty($locales)) {
|
||||
setlocale(LC_TIME, $locales[0], ...array_slice($locales, 1));
|
||||
|
@ -49,7 +49,7 @@
|
||||
"nunomaduro/larastan": "^2.4",
|
||||
"phpunit/phpunit": "^9.5",
|
||||
"squizlabs/php_codesniffer": "^3.7",
|
||||
"ssddanbrown/asserthtml": "^1.0"
|
||||
"ssddanbrown/asserthtml": "^2.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
296
composer.lock
generated
296
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "64276cbeb1f79f4c94992cc739807d72",
|
||||
"content-hash": "5a066407dfbd1809ffd39114a873333d",
|
||||
"packages": [
|
||||
{
|
||||
"name": "aws/aws-crt-php",
|
||||
@ -58,16 +58,16 @@
|
||||
},
|
||||
{
|
||||
"name": "aws/aws-sdk-php",
|
||||
"version": "3.258.11",
|
||||
"version": "3.261.10",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/aws/aws-sdk-php.git",
|
||||
"reference": "5e339f47f86db7ed5f5afcda345d30ac1713aed3"
|
||||
"reference": "4889eff2b3fe35e878fbcaf8374d73f043609170"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5e339f47f86db7ed5f5afcda345d30ac1713aed3",
|
||||
"reference": "5e339f47f86db7ed5f5afcda345d30ac1713aed3",
|
||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4889eff2b3fe35e878fbcaf8374d73f043609170",
|
||||
"reference": "4889eff2b3fe35e878fbcaf8374d73f043609170",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -146,9 +146,9 @@
|
||||
"support": {
|
||||
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
|
||||
"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",
|
||||
@ -417,21 +417,24 @@
|
||||
},
|
||||
{
|
||||
"name": "dasprid/enum",
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/DASPRiD/Enum.git",
|
||||
"reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2"
|
||||
"reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2",
|
||||
"reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2",
|
||||
"url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8e6b6ea76eabbf19ea2bf5b67b98e1860474012f",
|
||||
"reference": "8e6b6ea76eabbf19ea2bf5b67b98e1860474012f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.1 <9.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^7 | ^8 | ^9",
|
||||
"squizlabs/php_codesniffer": "^3.4"
|
||||
"squizlabs/php_codesniffer": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@ -458,9 +461,9 @@
|
||||
],
|
||||
"support": {
|
||||
"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",
|
||||
@ -632,16 +635,16 @@
|
||||
},
|
||||
{
|
||||
"name": "doctrine/dbal",
|
||||
"version": "3.6.0",
|
||||
"version": "3.6.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/dbal.git",
|
||||
"reference": "85b98cb23c8af471a67abfe14485da696bcabc2e"
|
||||
"reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/dbal/zipball/85b98cb23c8af471a67abfe14485da696bcabc2e",
|
||||
"reference": "85b98cb23c8af471a67abfe14485da696bcabc2e",
|
||||
"url": "https://api.github.com/repos/doctrine/dbal/zipball/57815c7bbcda3cd18871d253c1dd8cbe56f8526e",
|
||||
"reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -657,11 +660,11 @@
|
||||
"doctrine/coding-standard": "11.1.0",
|
||||
"fig/log-test": "^1",
|
||||
"jetbrains/phpstorm-stubs": "2022.3",
|
||||
"phpstan/phpstan": "1.9.14",
|
||||
"phpstan/phpstan-strict-rules": "^1.4",
|
||||
"phpunit/phpunit": "9.6.3",
|
||||
"phpstan/phpstan": "1.10.3",
|
||||
"phpstan/phpstan-strict-rules": "^1.5",
|
||||
"phpunit/phpunit": "9.6.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/console": "^4.4|^5.4|^6.0",
|
||||
"vimeo/psalm": "4.30.0"
|
||||
@ -724,7 +727,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -740,7 +743,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-02-07T22:52:03+00:00"
|
||||
"time": "2023-03-02T19:26:24+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/deprecations",
|
||||
@ -1309,24 +1312,24 @@
|
||||
},
|
||||
{
|
||||
"name": "graham-campbell/result-type",
|
||||
"version": "v1.1.0",
|
||||
"version": "v1.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/GrahamCampbell/Result-Type.git",
|
||||
"reference": "a878d45c1914464426dc94da61c9e1d36ae262a8"
|
||||
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8",
|
||||
"reference": "a878d45c1914464426dc94da61c9e1d36ae262a8",
|
||||
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
|
||||
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2.5 || ^8.0",
|
||||
"phpoption/phpoption": "^1.9"
|
||||
"phpoption/phpoption": "^1.9.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8.5.28 || ^9.5.21"
|
||||
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@ -1355,7 +1358,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -1367,7 +1370,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-07-30T15:56:11+00:00"
|
||||
"time": "2023-02-25T20:23:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/guzzle",
|
||||
@ -1583,16 +1586,16 @@
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/psr7",
|
||||
"version": "2.4.3",
|
||||
"version": "2.4.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/psr7.git",
|
||||
"reference": "67c26b443f348a51926030c83481b85718457d3d"
|
||||
"reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d",
|
||||
"reference": "67c26b443f348a51926030c83481b85718457d3d",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf",
|
||||
"reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1682,7 +1685,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -1698,7 +1701,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-10-26T14:07:24+00:00"
|
||||
"time": "2023-03-09T13:19:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/uri-template",
|
||||
@ -1944,16 +1947,16 @@
|
||||
},
|
||||
{
|
||||
"name": "laravel/framework",
|
||||
"version": "v9.52.0",
|
||||
"version": "v9.52.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/framework.git",
|
||||
"reference": "eb85cd9d72e5bfa54b4d0d9040786f26d6184a9e"
|
||||
"reference": "9239128cfb4d22afefb64060dfecf53e82987267"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/eb85cd9d72e5bfa54b4d0d9040786f26d6184a9e",
|
||||
"reference": "eb85cd9d72e5bfa54b4d0d9040786f26d6184a9e",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/9239128cfb4d22afefb64060dfecf53e82987267",
|
||||
"reference": "9239128cfb4d22afefb64060dfecf53e82987267",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2138,7 +2141,7 @@
|
||||
"issues": "https://github.com/laravel/framework/issues",
|
||||
"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",
|
||||
@ -2271,16 +2274,16 @@
|
||||
},
|
||||
{
|
||||
"name": "laravel/tinker",
|
||||
"version": "v2.8.0",
|
||||
"version": "v2.8.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/tinker.git",
|
||||
"reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad"
|
||||
"reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/tinker/zipball/74d0b287cc4ae65d15c368dd697aae71d62a73ad",
|
||||
"reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad",
|
||||
"url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10",
|
||||
"reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2333,9 +2336,9 @@
|
||||
],
|
||||
"support": {
|
||||
"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",
|
||||
@ -2527,16 +2530,16 @@
|
||||
},
|
||||
{
|
||||
"name": "league/flysystem",
|
||||
"version": "3.12.2",
|
||||
"version": "3.12.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/flysystem.git",
|
||||
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f"
|
||||
"reference": "81e87e74dd5213795c7846d65089712d2dda90ce"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f6377c709d2275ed6feaf63e44be7a7162b0e77f",
|
||||
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f",
|
||||
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/81e87e74dd5213795c7846d65089712d2dda90ce",
|
||||
"reference": "81e87e74dd5213795c7846d65089712d2dda90ce",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2598,7 +2601,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -2614,7 +2617,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-01-19T12:02:19+00:00"
|
||||
"time": "2023-02-18T15:32:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/flysystem-aws-s3-v3",
|
||||
@ -3462,16 +3465,16 @@
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v4.15.3",
|
||||
"version": "v4.15.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
|
||||
"reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
|
||||
"reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
|
||||
"reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -3512,9 +3515,9 @@
|
||||
],
|
||||
"support": {
|
||||
"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",
|
||||
@ -3867,24 +3870,24 @@
|
||||
},
|
||||
{
|
||||
"name": "phpoption/phpoption",
|
||||
"version": "1.9.0",
|
||||
"version": "1.9.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/schmittjoh/php-option.git",
|
||||
"reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab"
|
||||
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
|
||||
"reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
|
||||
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e",
|
||||
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2.5 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.8",
|
||||
"phpunit/phpunit": "^8.5.28 || ^9.5.21"
|
||||
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@ -3926,7 +3929,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -3938,20 +3941,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-07-30T15:51:26+00:00"
|
||||
"time": "2023-02-25T19:38:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpseclib/phpseclib",
|
||||
"version": "3.0.18",
|
||||
"version": "3.0.19",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||
"reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da"
|
||||
"reference": "cc181005cf548bfd8a4896383bb825d859259f95"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f28693d38ba21bb0d9f0c411ee5dae2b178201da",
|
||||
"reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cc181005cf548bfd8a4896383bb825d859259f95",
|
||||
"reference": "cc181005cf548bfd8a4896383bb825d859259f95",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -4032,7 +4035,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -4048,7 +4051,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-12-17T18:26:50+00:00"
|
||||
"time": "2023-03-05T17:13:09+00:00"
|
||||
},
|
||||
{
|
||||
"name": "pragmarx/google2fa",
|
||||
@ -4104,33 +4107,27 @@
|
||||
},
|
||||
{
|
||||
"name": "predis/predis",
|
||||
"version": "v2.1.1",
|
||||
"version": "v2.1.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/predis/predis.git",
|
||||
"reference": "c5b60884e89630f9518a7919f0566db438f0fc9a"
|
||||
"reference": "a77a43913a74f9331f637bb12867eb8e274814e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/predis/predis/zipball/c5b60884e89630f9518a7919f0566db438f0fc9a",
|
||||
"reference": "c5b60884e89630f9518a7919f0566db438f0fc9a",
|
||||
"url": "https://api.github.com/repos/predis/predis/zipball/a77a43913a74f9331f637bb12867eb8e274814e5",
|
||||
"reference": "a77a43913a74f9331f637bb12867eb8e274814e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^3.3",
|
||||
"phpstan/phpstan": "^1.9",
|
||||
"phpunit/phpunit": "^8.0 || ~9.4.4"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-curl": "Allows access to Webdis when paired with phpiredis"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "2.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Predis\\": "src/"
|
||||
@ -4145,12 +4142,6 @@
|
||||
"name": "Till Krüss",
|
||||
"homepage": "https://till.im",
|
||||
"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.",
|
||||
@ -4162,7 +4153,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -4170,7 +4161,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2023-01-17T20:57:35+00:00"
|
||||
"time": "2023-03-02T18:32:04+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/cache",
|
||||
@ -8043,16 +8034,16 @@
|
||||
},
|
||||
{
|
||||
"name": "filp/whoops",
|
||||
"version": "2.14.6",
|
||||
"version": "2.15.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/filp/whoops.git",
|
||||
"reference": "f7948baaa0330277c729714910336383286305da"
|
||||
"reference": "e864ac957acd66e1565f25efda61e37791a5db0b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da",
|
||||
"reference": "f7948baaa0330277c729714910336383286305da",
|
||||
"url": "https://api.github.com/repos/filp/whoops/zipball/e864ac957acd66e1565f25efda61e37791a5db0b",
|
||||
"reference": "e864ac957acd66e1565f25efda61e37791a5db0b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -8102,7 +8093,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/filp/whoops/issues",
|
||||
"source": "https://github.com/filp/whoops/tree/2.14.6"
|
||||
"source": "https://github.com/filp/whoops/tree/2.15.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@ -8110,7 +8101,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-11-02T16:23:29+00:00"
|
||||
"time": "2023-03-06T18:09:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "hamcrest/hamcrest-php",
|
||||
@ -8305,16 +8296,16 @@
|
||||
},
|
||||
{
|
||||
"name": "myclabs/deep-copy",
|
||||
"version": "1.11.0",
|
||||
"version": "1.11.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/myclabs/DeepCopy.git",
|
||||
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
|
||||
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
|
||||
"reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
|
||||
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -8352,7 +8343,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -8360,7 +8351,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-03-03T13:19:32+00:00"
|
||||
"time": "2023-03-08T13:26:56+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nunomaduro/collision",
|
||||
@ -8452,16 +8443,16 @@
|
||||
},
|
||||
{
|
||||
"name": "nunomaduro/larastan",
|
||||
"version": "2.4.0",
|
||||
"version": "2.5.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nunomaduro/larastan.git",
|
||||
"reference": "14f631348ead3e245651606931863b4f218d1f78"
|
||||
"reference": "072e2c9566ae000bf66c92384fc933b81885244b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nunomaduro/larastan/zipball/14f631348ead3e245651606931863b4f218d1f78",
|
||||
"reference": "14f631348ead3e245651606931863b4f218d1f78",
|
||||
"url": "https://api.github.com/repos/nunomaduro/larastan/zipball/072e2c9566ae000bf66c92384fc933b81885244b",
|
||||
"reference": "072e2c9566ae000bf66c92384fc933b81885244b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -8475,11 +8466,11 @@
|
||||
"illuminate/support": "^9.47.0 || ^10.0.0",
|
||||
"php": "^8.0.2",
|
||||
"phpmyadmin/sql-parser": "^5.6.0",
|
||||
"phpstan/phpstan": "^1.9.8"
|
||||
"phpstan/phpstan": "~1.10.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"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"
|
||||
},
|
||||
"suggest": {
|
||||
@ -8524,7 +8515,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -8544,7 +8535,7 @@
|
||||
"type": "patreon"
|
||||
}
|
||||
],
|
||||
"time": "2023-01-11T11:57:44+00:00"
|
||||
"time": "2023-03-04T23:46:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phar-io/manifest",
|
||||
@ -8746,16 +8737,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpstan/phpstan",
|
||||
"version": "1.9.17",
|
||||
"version": "1.10.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpstan/phpstan.git",
|
||||
"reference": "204e459e7822f2c586463029f5ecec31bb45a1f2"
|
||||
"reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/204e459e7822f2c586463029f5ecec31bb45a1f2",
|
||||
"reference": "204e459e7822f2c586463029f5ecec31bb45a1f2",
|
||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a",
|
||||
"reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -8785,7 +8776,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -8801,27 +8792,27 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-02-08T12:25:00+00:00"
|
||||
"time": "2023-03-09T16:55:12+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
"version": "9.2.24",
|
||||
"version": "9.2.26",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||
"reference": "2cf940ebc6355a9d430462811b5aaa308b174bed"
|
||||
"reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed",
|
||||
"reference": "2cf940ebc6355a9d430462811b5aaa308b174bed",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
|
||||
"reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"nikic/php-parser": "^4.14",
|
||||
"nikic/php-parser": "^4.15",
|
||||
"php": ">=7.3",
|
||||
"phpunit/php-file-iterator": "^3.0.3",
|
||||
"phpunit/php-text-template": "^2.0.2",
|
||||
@ -8836,8 +8827,8 @@
|
||||
"phpunit/phpunit": "^9.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-pcov": "*",
|
||||
"ext-xdebug": "*"
|
||||
"ext-pcov": "PHP extension that provides line coverage",
|
||||
"ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@ -8870,7 +8861,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -8878,7 +8869,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2023-01-26T08:26:55+00:00"
|
||||
"time": "2023-03-06T12:58:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-file-iterator",
|
||||
@ -9123,16 +9114,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "9.6.3",
|
||||
"version": "9.6.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555"
|
||||
"reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555",
|
||||
"reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5",
|
||||
"reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -9165,8 +9156,8 @@
|
||||
"sebastian/version": "^3.0.2"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-soap": "*",
|
||||
"ext-xdebug": "*"
|
||||
"ext-soap": "To be able to generate mocks based on WSDL files",
|
||||
"ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
|
||||
},
|
||||
"bin": [
|
||||
"phpunit"
|
||||
@ -9205,7 +9196,7 @@
|
||||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -9221,7 +9212,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-02-04T13:37:15+00:00"
|
||||
"time": "2023-03-09T06:34:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/cli-parser",
|
||||
@ -10189,16 +10180,16 @@
|
||||
},
|
||||
{
|
||||
"name": "squizlabs/php_codesniffer",
|
||||
"version": "3.7.1",
|
||||
"version": "3.7.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
|
||||
"reference": "1359e176e9307e906dc3d890bcc9603ff6d90619"
|
||||
"reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619",
|
||||
"reference": "1359e176e9307e906dc3d890bcc9603ff6d90619",
|
||||
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
|
||||
"reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -10234,27 +10225,28 @@
|
||||
"homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
|
||||
"keywords": [
|
||||
"phpcs",
|
||||
"standards"
|
||||
"standards",
|
||||
"static analysis"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
|
||||
"source": "https://github.com/squizlabs/PHP_CodeSniffer",
|
||||
"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",
|
||||
"version": "v1.0.1",
|
||||
"version": "v2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ssddanbrown/htmlassert.git",
|
||||
"reference": "f7d4352bb3d69347097b2841fd71934182821928"
|
||||
"url": "https://github.com/ssddanbrown/asserthtml.git",
|
||||
"reference": "6baf3ef2087f5928ae34f0d41db27aefcdf60414"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ssddanbrown/htmlassert/zipball/f7d4352bb3d69347097b2841fd71934182821928",
|
||||
"reference": "f7d4352bb3d69347097b2841fd71934182821928",
|
||||
"url": "https://api.github.com/repos/ssddanbrown/asserthtml/zipball/6baf3ef2087f5928ae34f0d41db27aefcdf60414",
|
||||
"reference": "6baf3ef2087f5928ae34f0d41db27aefcdf60414",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -10288,8 +10280,8 @@
|
||||
"description": "HTML Content Assertions for PHPUnit",
|
||||
"homepage": "https://github.com/ssddanbrown/asserthtml",
|
||||
"support": {
|
||||
"issues": "https://github.com/ssddanbrown/htmlassert/issues",
|
||||
"source": "https://github.com/ssddanbrown/htmlassert/tree/v1.0.1"
|
||||
"issues": "https://github.com/ssddanbrown/asserthtml/issues",
|
||||
"source": "https://github.com/ssddanbrown/asserthtml/tree/v2.0.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@ -10297,7 +10289,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-04-09T13:31:13+00:00"
|
||||
"time": "2023-03-01T16:48:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/dom-crawler",
|
||||
|
@ -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();
|
||||
});
|
||||
}
|
||||
};
|
@ -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');
|
||||
});
|
||||
}
|
||||
};
|
26
dev/api/requests/content-permissions-update.json
Normal file
26
dev/api/requests/content-permissions-update.json
Normal 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
|
||||
}
|
||||
}
|
3
dev/api/requests/image-gallery-update.json
Normal file
3
dev/api/requests/image-gallery-update.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"name": "My updated image name"
|
||||
}
|
11
dev/api/requests/roles-create.json
Normal file
11
dev/api/requests/roles-create.json
Normal 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"
|
||||
]
|
||||
}
|
14
dev/api/requests/roles-update.json
Normal file
14
dev/api/requests/roles-update.json
Normal 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"
|
||||
]
|
||||
}
|
38
dev/api/responses/content-permissions-read.json
Normal file
38
dev/api/responses/content-permissions-read.json
Normal 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
|
||||
}
|
||||
}
|
38
dev/api/responses/content-permissions-update.json
Normal file
38
dev/api/responses/content-permissions-update.json
Normal 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
|
||||
}
|
||||
}
|
28
dev/api/responses/image-gallery-create.json
Normal file
28
dev/api/responses/image-gallery-create.json
Normal 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": ""
|
||||
}
|
||||
}
|
41
dev/api/responses/image-gallery-list.json
Normal file
41
dev/api/responses/image-gallery-list.json
Normal 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
|
||||
}
|
28
dev/api/responses/image-gallery-read.json
Normal file
28
dev/api/responses/image-gallery-read.json
Normal 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": ""
|
||||
}
|
||||
}
|
28
dev/api/responses/image-gallery-update.json
Normal file
28
dev/api/responses/image-gallery-update.json
Normal 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": ""
|
||||
}
|
||||
}
|
15
dev/api/responses/roles-create.json
Normal file
15
dev/api/responses/roles-create.json
Normal 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": []
|
||||
}
|
41
dev/api/responses/roles-list.json
Normal file
41
dev/api/responses/roles-list.json
Normal 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
|
||||
}
|
23
dev/api/responses/roles-read.json
Normal file
23
dev/api/responses/roles-read.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
26
dev/api/responses/roles-update.json
Normal file
26
dev/api/responses/roles-update.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'تم تحديث المستخدم بنجاح',
|
||||
'user_delete_notification' => 'تم إزالة المستخدم بنجاح',
|
||||
|
||||
// Roles
|
||||
'role_create_notification' => 'Role successfully created',
|
||||
'role_update_notification' => 'Role successfully updated',
|
||||
'role_delete_notification' => 'Role successfully deleted',
|
||||
|
||||
// Other
|
||||
'commented_on' => 'تم التعليق',
|
||||
'permissions_update' => 'تحديث الأذونات',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'مُحدث :timeLength',
|
||||
'meta_updated_name' => 'مُحدث :timeLength بواسطة :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_lack_permission' => 'You don\'t have the required permissions to select this item',
|
||||
'images' => 'صور',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'إنشاء دور جديد',
|
||||
'role_create_success' => 'تم إنشاء الدور بنجاح',
|
||||
'role_delete' => 'حذف الدور',
|
||||
'role_delete_confirm' => 'سيتم حذف الدور المسمى \':roleName\'.',
|
||||
'role_delete_users_assigned' => 'هذا الدور له: عدد المستخدمين المعينين له. إذا كنت ترغب في ترحيل المستخدمين من هذا الدور ، فحدد دورًا جديدًا أدناه.',
|
||||
'role_delete_no_migration' => "لا تقم بترجيل المستخدمين",
|
||||
'role_delete_sure' => 'تأكيد حذف الدور؟',
|
||||
'role_delete_success' => 'تم حذف الدور بنجاح',
|
||||
'role_edit' => 'تعديل الدور',
|
||||
'role_details' => 'تفاصيل الدور',
|
||||
'role_name' => 'اسم الدور',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'ما يخص',
|
||||
'role_controlled_by_asset' => 'يتحكم فيها الأصول التي يتم رفعها إلى',
|
||||
'role_save' => 'حفظ الدور',
|
||||
'role_update_success' => 'تم تحديث الدور بنجاح',
|
||||
'role_users' => 'مستخدمون داخل هذا الدور',
|
||||
'role_users_none' => 'لم يتم تعيين أي مستخدمين لهذا الدور',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'No webhooks have yet been created.',
|
||||
'webhooks_edit' => 'Edit Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Потребителят е обновен успешно',
|
||||
'user_delete_notification' => 'Потребителят е премахнат успешно',
|
||||
|
||||
// Roles
|
||||
'role_create_notification' => 'Role successfully created',
|
||||
'role_update_notification' => 'Role successfully updated',
|
||||
'role_delete_notification' => 'Role successfully deleted',
|
||||
|
||||
// Other
|
||||
'commented_on' => 'коментирано на',
|
||||
'permissions_update' => 'обновени права',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Актуализирано :timeLength',
|
||||
'meta_updated_name' => 'Актуализирано преди :timeLength от :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_lack_permission' => 'You don\'t have the required permissions to select this item',
|
||||
'images' => 'Изображения',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Създай нова роля',
|
||||
'role_create_success' => 'Ролята беше успешно създадена',
|
||||
'role_delete' => 'Изтрий роля',
|
||||
'role_delete_confirm' => 'Това ще изтрие ролята \':roleName\'.',
|
||||
'role_delete_users_assigned' => 'В тази роля се намират :userCount потребители. Ако искате да преместите тези потребители в друга роля, моля изберете нова роля отдолу.',
|
||||
'role_delete_no_migration' => "Не премествай потребителите в нова роля",
|
||||
'role_delete_sure' => 'Сигурни ли сте, че искате да изтриете тази роля?',
|
||||
'role_delete_success' => 'Ролята беше успешно изтрита',
|
||||
'role_edit' => 'Редактиране на роля',
|
||||
'role_details' => 'Детайли на роля',
|
||||
'role_name' => 'Име на ролята',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Собствени',
|
||||
'role_controlled_by_asset' => 'Контролирани от актива, към който са качени',
|
||||
'role_save' => 'Запази ролята',
|
||||
'role_update_success' => 'Ролята беше успешно актуализирана',
|
||||
'role_users' => 'Потребители в тази роля',
|
||||
'role_users_none' => 'В момента няма потребители, назначени за тази роля',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_x_trigger_events' => '1 trigger event|:count trigger events',
|
||||
'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
|
||||
'webhooks_create' => 'Създай нова уебкука',
|
||||
'webhooks_none_created' => 'Няма създадени уебкуки.',
|
||||
'webhooks_edit' => 'Редактирай уебкука',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'User successfully updated',
|
||||
'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
|
||||
'commented_on' => 'je komentarisao/la na',
|
||||
'permissions_update' => 'je ažurirao/la dozvole',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Ažurirana :timeLength',
|
||||
'meta_updated_name' => 'Ažurirana :timeLength od :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_lack_permission' => 'You don\'t have the required permissions to select this item',
|
||||
'images' => 'Slike',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => '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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Create New Role',
|
||||
'role_create_success' => 'Role successfully created',
|
||||
'role_delete' => 'Delete Role',
|
||||
'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_no_migration' => "Don't migrate users",
|
||||
'role_delete_sure' => 'Are you sure you want to delete this role?',
|
||||
'role_delete_success' => 'Role successfully deleted',
|
||||
'role_edit' => 'Edit Role',
|
||||
'role_details' => 'Role Details',
|
||||
'role_name' => 'Role Name',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Own',
|
||||
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
|
||||
'role_save' => 'Save Role',
|
||||
'role_update_success' => 'Role successfully updated',
|
||||
'role_users' => 'Users in this role',
|
||||
'role_users_none' => 'No users are currently assigned to this role',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'No webhooks have yet been created.',
|
||||
'webhooks_edit' => 'Edit Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'User successfully updated',
|
||||
'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
|
||||
'commented_on' => 'ha comentat a',
|
||||
'permissions_update' => 'ha actualitzat els permisos',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Actualitzat :timeLength',
|
||||
'meta_updated_name' => 'Actualitzat :timeLength per :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_lack_permission' => 'You don\'t have the required permissions to select this item',
|
||||
'images' => 'Imatges',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => 'Rols',
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Crea un rol nou',
|
||||
'role_create_success' => 'Rol creat correctament',
|
||||
'role_delete' => 'Suprimeix el rol',
|
||||
'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_no_migration' => "No migris els usuaris",
|
||||
'role_delete_sure' => 'Segur que voleu suprimir aquest rol?',
|
||||
'role_delete_success' => 'Rol suprimit correctament',
|
||||
'role_edit' => 'Edita el rol',
|
||||
'role_details' => 'Detalls del rol',
|
||||
'role_name' => 'Nom del rol',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Propi',
|
||||
'role_controlled_by_asset' => 'Controlat pel recurs en què es pugen',
|
||||
'role_save' => 'Desa el rol',
|
||||
'role_update_success' => 'Rol actualitzat correctament',
|
||||
'role_users' => 'Usuaris amb 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_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_none_created' => 'No webhooks have yet been created.',
|
||||
'webhooks_edit' => 'Edit Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Uživatel byl úspěšně aktualizová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
|
||||
'commented_on' => 'okomentoval/a',
|
||||
'permissions_update' => 'oprávnění upravena',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Aktualizováno :timeLength',
|
||||
'meta_updated_name' => 'Aktualizováno :timeLength uživatelem :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_lack_permission' => 'Nemáte dostatečná oprávnění k výběru této položky',
|
||||
'images' => 'Obrázky',
|
||||
@ -141,7 +141,7 @@ return [
|
||||
'books_search_this' => 'Prohledat tuto knihu',
|
||||
'books_navigation' => 'Navigace 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_name' => 'Seřadit podle názvu',
|
||||
'books_sort_created' => 'Seřadit podle data vytvoření',
|
||||
@ -150,17 +150,17 @@ return [
|
||||
'books_sort_chapters_last' => 'Kapitoly jako poslední',
|
||||
'books_sort_show_other' => 'Zobrazit ostatní knihy',
|
||||
'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_move_up' => 'Move Up',
|
||||
'books_sort_move_down' => 'Move Down',
|
||||
'books_sort_move_prev_book' => 'Move to Previous Book',
|
||||
'books_sort_move_next_book' => 'Move to Next Book',
|
||||
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter',
|
||||
'books_sort_move_next_chapter' => 'Move Into Next Chapter',
|
||||
'books_sort_move_book_start' => 'Move to Start of Book',
|
||||
'books_sort_move_book_end' => 'Move to End of Book',
|
||||
'books_sort_move_before_chapter' => 'Move to Before Chapter',
|
||||
'books_sort_move_after_chapter' => 'Move to After Chapter',
|
||||
'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' => 'Posunout Nahoru',
|
||||
'books_sort_move_down' => 'Posunout dolů',
|
||||
'books_sort_move_prev_book' => 'Přesunout se na předchozí knihu',
|
||||
'books_sort_move_next_book' => 'Přesunout se na další knihu',
|
||||
'books_sort_move_prev_chapter' => 'Přesunout se do předchozí kapitoly',
|
||||
'books_sort_move_next_chapter' => 'Přesunout se do další kapitoly',
|
||||
'books_sort_move_book_start' => 'Přesunout se na začátek knihy',
|
||||
'books_sort_move_book_end' => 'Přesunout se na konec knihy',
|
||||
'books_sort_move_before_chapter' => 'Přesunout se před kapitolu',
|
||||
'books_sort_move_after_chapter' => 'Přesunout se za kapitolu',
|
||||
'books_copy' => 'Kopírovat knihu',
|
||||
'books_copy_success' => 'Kniha byla úspěšně zkopírována',
|
||||
|
||||
|
@ -50,7 +50,7 @@ return [
|
||||
// Drawing & Images
|
||||
'image_upload_error' => 'Nastala chyba během nahrávání souboru',
|
||||
'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
|
||||
'attachment_not_found' => 'Příloha nenalezena',
|
||||
|
@ -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.',
|
||||
|
||||
// Color settings
|
||||
'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.',
|
||||
'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',
|
||||
'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.',
|
||||
'color_scheme' => 'Barevné schéma aplikace',
|
||||
'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' => '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' => 'Hlavní barva',
|
||||
'link_color' => 'Výchozí barva odkazu',
|
||||
'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',
|
||||
'book_color' => 'Barva knihy',
|
||||
'chapter_color' => 'Barva kapitoly',
|
||||
@ -138,18 +138,16 @@ return [
|
||||
'roles' => '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_x_users_assigned' => '1 přiřazený uživatel|:count přiřazených uživatelů',
|
||||
'roles_x_permissions_provided' => '1 oprávnění|:count oprávnění',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Přiřazení uživatelé',
|
||||
'roles_permissions_provided' => 'Poskytnutá oprávnění',
|
||||
'role_create' => 'Vytvořit novou roli',
|
||||
'role_create_success' => 'Role byla vytvořena',
|
||||
'role_delete' => 'Odstranit roli',
|
||||
'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_no_migration' => "Nepřiřazovat uživatelům náhradní roli",
|
||||
'role_delete_sure' => 'Opravdu chcete tuto roli odstranit?',
|
||||
'role_delete_success' => 'Role byla odstraněna',
|
||||
'role_edit' => 'Upravit roli',
|
||||
'role_details' => 'Detaily role',
|
||||
'role_name' => 'Název role',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Vlastní',
|
||||
'role_controlled_by_asset' => 'Řídí se obsahem, do kterého jsou nahrávány',
|
||||
'role_save' => 'Uložit roli',
|
||||
'role_update_success' => 'Role byla aktualizována',
|
||||
'role_users' => 'Uživatelé mající tuto roli',
|
||||
'role_users_none' => 'Žádný uživatel nemá tuto roli',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// Webhooks
|
||||
'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_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_none_created' => 'Žádné webhooky nebyly doposud vytvořeny.',
|
||||
'webhooks_edit' => 'Upravit webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Diweddarwyd 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
|
||||
'commented_on' => 'gwnaeth sylwadau ar',
|
||||
'permissions_update' => 'caniatadau wedi\'u diweddaru',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Updated :timeLength',
|
||||
'meta_updated_name' => 'Updated :timeLength 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',
|
||||
'images' => 'Images',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => '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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Create New Role',
|
||||
'role_create_success' => 'Role successfully created',
|
||||
'role_delete' => 'Delete Role',
|
||||
'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_no_migration' => "Don't migrate users",
|
||||
'role_delete_sure' => 'Are you sure you want to delete this role?',
|
||||
'role_delete_success' => 'Role successfully deleted',
|
||||
'role_edit' => 'Edit Role',
|
||||
'role_details' => 'Role Details',
|
||||
'role_name' => 'Role Name',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Own',
|
||||
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
|
||||
'role_save' => 'Save Role',
|
||||
'role_update_success' => 'Role successfully updated',
|
||||
'role_users' => 'Users in this role',
|
||||
'role_users_none' => 'No users are currently assigned to this role',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'No webhooks have yet been created.',
|
||||
'webhooks_edit' => 'Edit Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Brugeren blev opdateret',
|
||||
'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
|
||||
'commented_on' => 'kommenterede til',
|
||||
'permissions_update' => 'Tilladelser opdateret',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Opdateret :timeLength',
|
||||
'meta_updated_name' => 'Opdateret :timeLength 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_lack_permission' => 'You don\'t have the required permissions to select this item',
|
||||
'images' => 'Billeder',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => 'Roller',
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Opret en ny rolle',
|
||||
'role_create_success' => 'Rollen blev oprette korrekt',
|
||||
'role_delete' => 'Slet rolle',
|
||||
'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_no_migration' => "Ryk ikke brugere",
|
||||
'role_delete_sure' => 'Er du sikker på, at du vil slette denne rolle?',
|
||||
'role_delete_success' => 'Rollen blev slettet',
|
||||
'role_edit' => 'Rediger rolle',
|
||||
'role_details' => 'Rolledetaljer',
|
||||
'role_name' => 'Rollenavn',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Eget',
|
||||
'role_controlled_by_asset' => 'Styres af det medie/"asset", de uploades til',
|
||||
'role_save' => 'Gem rolle',
|
||||
'role_update_success' => 'Rollen blev opdateret',
|
||||
'role_users' => 'Brugere med denne rolle',
|
||||
'role_users_none' => 'Ingen brugere er i øjeblikket tildelt denne rolle',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'Ingen webhooks er blevet oprettet endnu.',
|
||||
'webhooks_edit' => 'Rediger Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Benutzer erfolgreich aktualisiert',
|
||||
'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
|
||||
'commented_on' => 'hat einen Kommentar hinzugefügt',
|
||||
'permissions_update' => 'hat die Berechtigungen aktualisiert',
|
||||
|
@ -141,7 +141,7 @@ return [
|
||||
'books_search_this' => 'Dieses Buch durchsuchen',
|
||||
'books_navigation' => 'Buchnavigation',
|
||||
'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_name' => 'Sortieren nach Namen',
|
||||
'books_sort_created' => 'Sortieren nach Erstellungsdatum',
|
||||
@ -150,17 +150,17 @@ return [
|
||||
'books_sort_chapters_last' => 'Kapitel zuletzt',
|
||||
'books_sort_show_other' => 'Andere Bücher anzeigen',
|
||||
'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_move_up' => 'Move Up',
|
||||
'books_sort_move_down' => 'Move Down',
|
||||
'books_sort_move_prev_book' => 'Move to Previous Book',
|
||||
'books_sort_move_next_book' => 'Move to Next Book',
|
||||
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter',
|
||||
'books_sort_move_next_chapter' => 'Move Into Next Chapter',
|
||||
'books_sort_move_book_start' => 'Move to Start of Book',
|
||||
'books_sort_move_book_end' => 'Move to End of Book',
|
||||
'books_sort_move_before_chapter' => 'Move to Before Chapter',
|
||||
'books_sort_move_after_chapter' => 'Move to After Chapter',
|
||||
'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' => 'Nach oben bewegen',
|
||||
'books_sort_move_down' => 'Nach unten bewegen',
|
||||
'books_sort_move_prev_book' => 'Zum vorherigen Buch verschieben',
|
||||
'books_sort_move_next_book' => 'Zum nächsten Buch verschieben',
|
||||
'books_sort_move_prev_chapter' => 'In das vorherige Kapitel verschieben',
|
||||
'books_sort_move_next_chapter' => 'In nächstes Kapitel verschieben',
|
||||
'books_sort_move_book_start' => 'Zum Buchbeginn verschieben',
|
||||
'books_sort_move_book_end' => 'Zum Ende des Buches verschieben',
|
||||
'books_sort_move_before_chapter' => 'Vor Kapitel verschieben',
|
||||
'books_sort_move_after_chapter' => 'Nach Kapitel verschieben',
|
||||
'books_copy' => 'Buch kopieren',
|
||||
'books_copy_success' => 'Das Buch wurde erfolgreich kopiert',
|
||||
|
||||
|
@ -50,7 +50,7 @@ return [
|
||||
// Drawing & Images
|
||||
'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.',
|
||||
'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
|
||||
'attachment_not_found' => 'Anhang konnte nicht gefunden werden.',
|
||||
|
@ -139,18 +139,16 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
|
||||
'roles' => '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_x_users_assigned' => '1 Benutzer zugewiesen|:count Benutzer zugewiesen',
|
||||
'roles_x_permissions_provided' => '1 Berechtigung|:count Berechtigungen',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Zugewiesene Benutzer',
|
||||
'roles_permissions_provided' => 'Genutzte Berechtigungen',
|
||||
'role_create' => 'Neue Rolle anlegen',
|
||||
'role_create_success' => 'Rolle erfolgreich angelegt',
|
||||
'role_delete' => 'Rolle 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_no_migration' => "Den Benutzern keine andere Rolle zuordnen",
|
||||
'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_details' => 'Rollendetails',
|
||||
'role_name' => 'Rollenname',
|
||||
@ -176,7 +174,6 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
|
||||
'role_own' => 'Eigene',
|
||||
'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt',
|
||||
'role_save' => 'Rolle speichern',
|
||||
'role_update_success' => 'Rolle erfolgreich gespeichert',
|
||||
'role_users' => 'Dieser Rolle zugeordnete Benutzer',
|
||||
'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_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_none_created' => 'Es wurden noch keine Webhooks erstellt.',
|
||||
'webhooks_edit' => 'Webhook bearbeiten',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Benutzer erfolgreich aktualisiert',
|
||||
'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
|
||||
'commented_on' => 'kommentiert',
|
||||
'permissions_update' => 'aktualisierte Berechtigungen',
|
||||
|
@ -141,7 +141,7 @@ return [
|
||||
'books_search_this' => 'Dieses Buch durchsuchen',
|
||||
'books_navigation' => 'Buchnavigation',
|
||||
'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_name' => 'Sortieren nach Namen',
|
||||
'books_sort_created' => 'Sortieren nach Erstellungsdatum',
|
||||
@ -150,17 +150,17 @@ return [
|
||||
'books_sort_chapters_last' => 'Kapitel zuletzt',
|
||||
'books_sort_show_other' => 'Andere Bücher anzeigen',
|
||||
'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_move_up' => 'Move Up',
|
||||
'books_sort_move_down' => 'Move Down',
|
||||
'books_sort_move_prev_book' => 'Move to Previous Book',
|
||||
'books_sort_move_next_book' => 'Move to Next Book',
|
||||
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter',
|
||||
'books_sort_move_next_chapter' => 'Move Into Next Chapter',
|
||||
'books_sort_move_book_start' => 'Move to Start of Book',
|
||||
'books_sort_move_book_end' => 'Move to End of Book',
|
||||
'books_sort_move_before_chapter' => 'Move to Before Chapter',
|
||||
'books_sort_move_after_chapter' => 'Move to After Chapter',
|
||||
'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' => 'Nach oben bewegen',
|
||||
'books_sort_move_down' => 'Nach unten bewegen',
|
||||
'books_sort_move_prev_book' => 'Zum vorherigen Buch verschieben',
|
||||
'books_sort_move_next_book' => 'Zum nächsten Buch verschieben',
|
||||
'books_sort_move_prev_chapter' => 'In das vorherige Kapitel verschieben',
|
||||
'books_sort_move_next_chapter' => 'In nächstes Kapitel verschieben',
|
||||
'books_sort_move_book_start' => 'Zum Buchbeginn verschieben',
|
||||
'books_sort_move_book_end' => 'Zum Ende des Buches verschieben',
|
||||
'books_sort_move_before_chapter' => 'Vor Kapitel verschieben',
|
||||
'books_sort_move_after_chapter' => 'Nach Kapitel verschieben',
|
||||
'books_copy' => 'Buch kopieren',
|
||||
'books_copy_success' => 'Buch erfolgreich kopiert',
|
||||
|
||||
|
@ -50,7 +50,7 @@ return [
|
||||
// Drawing & Images
|
||||
'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.',
|
||||
'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
|
||||
'attachment_not_found' => 'Anhang konnte nicht gefunden werden.',
|
||||
|
@ -139,18 +139,16 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
|
||||
'roles' => '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_x_users_assigned' => '1 Benutzer zugewiesen|:count Benutzer zugewiesen',
|
||||
'roles_x_permissions_provided' => '1 Berechtigung|:count Berechtigungen',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Zugewiesene Benutzer',
|
||||
'roles_permissions_provided' => 'Genutzte Berechtigungen',
|
||||
'role_create' => 'Neue Rolle anlegen',
|
||||
'role_create_success' => 'Rolle erfolgreich angelegt',
|
||||
'role_delete' => 'Rolle 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_no_migration' => "Den Benutzern keine andere Rolle zuordnen",
|
||||
'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_details' => 'Rollendetails',
|
||||
'role_name' => 'Rollenname',
|
||||
@ -176,7 +174,6 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
|
||||
'role_own' => 'Eigene',
|
||||
'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt',
|
||||
'role_save' => 'Rolle speichern',
|
||||
'role_update_success' => 'Rolle erfolgreich gespeichert',
|
||||
'role_users' => 'Dieser Rolle zugeordnete Benutzer',
|
||||
'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_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_none_created' => 'Es wurden noch keine Webhooks erstellt.',
|
||||
'webhooks_edit' => 'Webhook bearbeiten',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Ο Χρήστης ενημερώθηκε με επιτυχία',
|
||||
'user_delete_notification' => 'Ο Χρήστης αφαιρέθηκε επιτυχώς',
|
||||
|
||||
// Roles
|
||||
'role_create_notification' => 'Role successfully created',
|
||||
'role_update_notification' => 'Role successfully updated',
|
||||
'role_delete_notification' => 'Role successfully deleted',
|
||||
|
||||
// Other
|
||||
'commented_on' => 'σχολίασε',
|
||||
'permissions_update' => 'ενημερωμένα δικαιώματα',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Ενημερώθηκε :timeLength',
|
||||
'meta_updated_name' => 'Ενημερώθηκε :timeLength by :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_lack_permission' => 'Δεν έχετε τα απαιτούμενα δικαιώματα για να επιλέξετε αυτό το στοιχείο',
|
||||
'images' => 'Εικόνες',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Εκχωρημένοι χρήστες',
|
||||
'roles_permissions_provided' => 'Παρεχόμενα Δικαιώματα',
|
||||
'role_create' => 'Δημιουργία νέου ρόλου',
|
||||
'role_create_success' => 'Ο Ρόλος δημιουργήθηκε με επιτυχία',
|
||||
'role_delete' => 'Διαγραφή Ρόλου',
|
||||
'role_delete_confirm' => 'Αυτό θα διαγράψει τον ρόλο με το όνομα \':roleName\'.',
|
||||
'role_delete_users_assigned' => 'Σε αυτόν τον ρόλο έχουν εκχωρηθεί :userCount χρήστες. Εάν θέλετε να μετεγκαταστήσετε τους χρήστες από αυτόν τον ρόλο, επιλέξτε έναν νέο ρόλο παρακάτω.',
|
||||
'role_delete_no_migration' => "Μην μεταφέρετε χρήστες",
|
||||
'role_delete_sure' => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον ρόλο;',
|
||||
'role_delete_success' => 'Ο ρόλος διαγράφηκε επιτυχώς',
|
||||
'role_edit' => 'Επεξεργασία Ρόλου',
|
||||
'role_details' => 'Λεπτομέρειες Ρόλου',
|
||||
'role_name' => 'Όνομα Ρόλου',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Τα δικά του',
|
||||
'role_controlled_by_asset' => 'Ελέγχονται από το στοιχείο στο οποίο ανεβαίνουν (Ράφια, Βιβλία)',
|
||||
'role_save' => 'Αποθήκευση Ρόλου',
|
||||
'role_update_success' => 'Ο Ρόλος ενημερώθηκε με επιτυχία',
|
||||
'role_users' => 'Χρήστες σε αυτόν τον Ρόλο',
|
||||
'role_users_none' => 'Σε κανένα χρήστη δεν έχει ανατεθεί αυτήν τη στιγμή αυτός ο ρόλος.',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_x_trigger_events' => '1 trigger event|:count trigger events',
|
||||
'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
|
||||
'webhooks_create' => 'Δημιουργία νέου Webhook',
|
||||
'webhooks_none_created' => 'Δεν έχουν δημιουργηθεί ακόμη webhook.',
|
||||
'webhooks_edit' => 'Επεξεργασία Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'User successfully updated',
|
||||
'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
|
||||
'commented_on' => 'commented on',
|
||||
'permissions_update' => 'updated permissions',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Updated :timeLength',
|
||||
'meta_updated_name' => 'Updated :timeLength 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',
|
||||
'images' => 'Images',
|
||||
|
@ -50,8 +50,8 @@ return [
|
||||
|
||||
// Color settings
|
||||
'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.',
|
||||
'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.',
|
||||
'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 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',
|
||||
'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.',
|
||||
@ -138,18 +138,16 @@ return [
|
||||
'roles' => '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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Create New Role',
|
||||
'role_create_success' => 'Role successfully created',
|
||||
'role_delete' => 'Delete Role',
|
||||
'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_no_migration' => "Don't migrate users",
|
||||
'role_delete_sure' => 'Are you sure you want to delete this role?',
|
||||
'role_delete_success' => 'Role successfully deleted',
|
||||
'role_edit' => 'Edit Role',
|
||||
'role_details' => 'Role Details',
|
||||
'role_name' => 'Role Name',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Own',
|
||||
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
|
||||
'role_save' => 'Save Role',
|
||||
'role_update_success' => 'Role successfully updated',
|
||||
'role_users' => 'Users in this role',
|
||||
'role_users_none' => 'No users are currently assigned to this role',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'No webhooks have yet been created.',
|
||||
'webhooks_edit' => 'Edit Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Usuario actualizado 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
|
||||
'commented_on' => 'comentada el',
|
||||
'permissions_update' => 'permisos actualizados',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Actualizado :timeLength',
|
||||
'meta_updated_name' => 'Actualizado :timeLength por :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_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento',
|
||||
'images' => 'Imágenes',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => 'Roles',
|
||||
'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_x_users_assigned' => '1 usuario asignado|:count usuarios asignados',
|
||||
'roles_x_permissions_provided' => '1 permiso|:count permisos',
|
||||
'roles_x_users_assigned' => ':count usuario asignado|:count usuarios asignados',
|
||||
'roles_x_permissions_provided' => ':count permiso |:count permisos',
|
||||
'roles_assigned_users' => 'Usuarios asignados',
|
||||
'roles_permissions_provided' => 'Permisos proporcionados',
|
||||
'role_create' => 'Crear nuevo rol',
|
||||
'role_create_success' => 'Rol creado satisfactoriamente',
|
||||
'role_delete' => 'Borrar rol',
|
||||
'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_no_migration' => "No migrar usuarios",
|
||||
'role_delete_sure' => 'Está seguro que desea borrar este rol?',
|
||||
'role_delete_success' => 'Rol borrado satisfactoriamente',
|
||||
'role_edit' => 'Editar rol',
|
||||
'role_details' => 'Detalles de rol',
|
||||
'role_name' => 'Nombre de rol',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Propio',
|
||||
'role_controlled_by_asset' => 'Controlado por el contenido al que ha sido subido',
|
||||
'role_save' => 'Guardar rol',
|
||||
'role_update_success' => 'Rol actualizado éxitosamente',
|
||||
'role_users' => 'Usuarios en este rol',
|
||||
'role_users_none' => 'No hay usuarios asignados a este rol',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_x_trigger_events' => '1 evento|:count eventos',
|
||||
'webhooks_x_trigger_events' => ':count disparador de eventos|:count disparadores de eventos',
|
||||
'webhooks_create' => 'Crear webhook',
|
||||
'webhooks_none_created' => 'No hay webhooks creados.',
|
||||
'webhooks_edit' => 'Editar webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Usuario actualizado 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
|
||||
'commented_on' => 'comentado',
|
||||
'permissions_update' => 'permisos actualizados',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Actualizado el :timeLength',
|
||||
'meta_updated_name' => 'Actualizado el :timeLength por :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_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento',
|
||||
'images' => 'Imágenes',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => 'Roles',
|
||||
'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_x_users_assigned' => '1 usuario assigned|:count usuarios asignados',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permisos',
|
||||
'roles_x_users_assigned' => ':count usuario asignado|:count usuarios asignados',
|
||||
'roles_x_permissions_provided' => ':count permiso |:count permisos',
|
||||
'roles_assigned_users' => 'Usuarios Asignados',
|
||||
'roles_permissions_provided' => 'Permisos Proporcionados',
|
||||
'role_create' => 'Crear nuevo rol',
|
||||
'role_create_success' => 'Rol creado satisfactoriamente',
|
||||
'role_delete' => 'Borrar rol',
|
||||
'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_no_migration' => "No migrar usuarios",
|
||||
'role_delete_sure' => '¿Está seguro que desea borrar este rol?',
|
||||
'role_delete_success' => 'Rol borrado satisfactoriamente',
|
||||
'role_edit' => 'Editar rol',
|
||||
'role_details' => 'Detalles de rol',
|
||||
'role_name' => 'Nombre de rol',
|
||||
@ -176,7 +174,6 @@ return [
|
||||
'role_own' => 'Propio',
|
||||
'role_controlled_by_asset' => 'Controlado por el activo al que ha sido subido',
|
||||
'role_save' => 'Guardar rol',
|
||||
'role_update_success' => 'Rol actualizado exitosamente',
|
||||
'role_users' => 'Usuarios en este rol',
|
||||
'role_users_none' => 'No hay usuarios asignados a este rol',
|
||||
|
||||
@ -253,7 +250,7 @@ return [
|
||||
// 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_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_none_created' => 'No hay webhooks creados.',
|
||||
'webhooks_edit' => 'Editar Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Kasutaja on muudetud',
|
||||
'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
|
||||
'commented_on' => 'kommenteeris lehte',
|
||||
'permissions_update' => 'muutis õiguseid',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Muudetud :timeLength',
|
||||
'meta_updated_name' => 'Muudetud :timeLength kasutaja :user poolt',
|
||||
'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_lack_permission' => 'Sul pole õiguseid selle objekti valimiseks',
|
||||
'images' => 'Pildid',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => '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_x_users_assigned' => '1 kasutaja|:count kasutajat',
|
||||
'roles_x_permissions_provided' => '1 õigus|:count õigust',
|
||||
'roles_x_users_assigned' => ':count kasutaja|:count kasutajat',
|
||||
'roles_x_permissions_provided' => ':count õigus|:count õigust',
|
||||
'roles_assigned_users' => 'Määratud kasutajad',
|
||||
'roles_permissions_provided' => 'Antud õigused',
|
||||
'role_create' => 'Lisa uus roll',
|
||||
'role_create_success' => 'Roll on lisatud',
|
||||
'role_delete' => 'Kustuta roll',
|
||||
'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_no_migration' => "Ära määra uut rolli",
|
||||
'role_delete_sure' => 'Kas oled kindel, et soovid selle rolli kustutada?',
|
||||
'role_delete_success' => 'Roll on kustutatud',
|
||||
'role_edit' => 'Muuda rolli',
|
||||
'role_details' => 'Rolli detailid',
|
||||
'role_name' => 'Rolli nimi',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Enda omad',
|
||||
'role_controlled_by_asset' => 'Õigused määratud seotud objekti kaudu',
|
||||
'role_save' => 'Salvesta roll',
|
||||
'role_update_success' => 'Roll on muudetud',
|
||||
'role_users' => 'Selle rolliga kasutajad',
|
||||
'role_users_none' => 'Seda rolli ei ole hetkel ühelgi kasutajal',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// Webhooks
|
||||
'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_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_none_created' => 'Ühtegi veebihaaki pole lisatud.',
|
||||
'webhooks_edit' => 'Muuda veebihaaki',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Erabiltzailea egoki eguneratua',
|
||||
'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
|
||||
'commented_on' => 'iruzkinak',
|
||||
'permissions_update' => 'eguneratu baimenak',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Aldatua :timeLength',
|
||||
'meta_updated_name' => ':timeLength aldatuta. Erabiltzailea :user',
|
||||
'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_lack_permission' => 'You don\'t have the required permissions to select this item',
|
||||
'images' => 'Irudiak',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => 'Rolak',
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'Rol berria sortu',
|
||||
'role_create_success' => 'Rola ondo sortu da',
|
||||
'role_delete' => 'Ezabatu Rol-a',
|
||||
'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_no_migration' => "Ez migratu erabiltzaileak",
|
||||
'role_delete_sure' => 'Ziur zaude rol hau ezabatu nahi duzula?',
|
||||
'role_delete_success' => 'Rola ezabatua',
|
||||
'role_edit' => 'Editatu rola',
|
||||
'role_details' => 'Ireki xehetasunak',
|
||||
'role_name' => 'Rol izena',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Norberarenak',
|
||||
'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
|
||||
'role_save' => 'Gorde rol-a',
|
||||
'role_update_success' => 'Rola ondo eguneratu da',
|
||||
'role_users' => 'Rol honetako erabiltzaileak',
|
||||
'role_users_none' => 'No users are currently assigned to this role',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'No webhooks have yet been created.',
|
||||
'webhooks_edit' => 'Edit Webhook',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'کاربر با موفقیت به روز شد',
|
||||
'user_delete_notification' => 'کاربر با موفقیت حذف شد',
|
||||
|
||||
// Roles
|
||||
'role_create_notification' => 'Role successfully created',
|
||||
'role_update_notification' => 'Role successfully updated',
|
||||
'role_delete_notification' => 'Role successfully deleted',
|
||||
|
||||
// Other
|
||||
'commented_on' => 'ثبت دیدگاه',
|
||||
'permissions_update' => 'به روزرسانی مجوزها',
|
||||
|
@ -25,7 +25,7 @@ return [
|
||||
'actions' => 'عملیات',
|
||||
'view' => 'نمایش',
|
||||
'view_all' => 'نمایش همه',
|
||||
'new' => 'New',
|
||||
'new' => 'جدید',
|
||||
'create' => 'ایجاد',
|
||||
'update' => 'بهروز رسانی',
|
||||
'edit' => 'ويرايش',
|
||||
@ -81,7 +81,7 @@ return [
|
||||
'none' => 'هیچکدام',
|
||||
|
||||
// Header
|
||||
'homepage' => 'Homepage',
|
||||
'homepage' => 'صفحه اصلی',
|
||||
'header_menu_expand' => 'گسترش منو',
|
||||
'profile_menu' => 'منو پروفایل',
|
||||
'view_profile' => 'مشاهده پروفایل',
|
||||
|
@ -144,11 +144,11 @@ return [
|
||||
'url' => 'آدرس',
|
||||
'text_to_display' => 'متن جهت نمایش',
|
||||
'title' => 'عنوان',
|
||||
'open_link' => 'Open link',
|
||||
'open_link_in' => 'Open link in...',
|
||||
'open_link' => 'بازکردن لینک',
|
||||
'open_link_in' => 'باز کردن لینک در ...',
|
||||
'open_link_current' => 'پنجره کنونی',
|
||||
'open_link_new' => 'پنجره جدید',
|
||||
'remove_link' => 'Remove link',
|
||||
'remove_link' => 'حذف لینک',
|
||||
'insert_collapsible' => 'درج بلوک جمع شونده',
|
||||
'collapsible_unwrap' => 'باز کردن',
|
||||
'edit_label' => 'ویرایش برچسب',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'به روزرسانی شده :timeLength',
|
||||
'meta_updated_name' => 'به روزرسانی شده :timeLength توسط :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_lack_permission' => 'شما مجوزهای لازم برای انتخاب این مورد را ندارید',
|
||||
'images' => 'عکسها',
|
||||
@ -141,7 +141,7 @@ return [
|
||||
'books_search_this' => 'این کتاب را جستجو کنید',
|
||||
'books_navigation' => 'ناوبری کتاب',
|
||||
'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_name' => 'مرتب سازی بر اساس نام',
|
||||
'books_sort_created' => 'مرتب سازی بر اساس تاریخ ایجاد',
|
||||
@ -150,17 +150,17 @@ return [
|
||||
'books_sort_chapters_last' => 'فصل آخر',
|
||||
'books_sort_show_other' => 'نمایش کتاب های دیگر',
|
||||
'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_move_up' => 'Move Up',
|
||||
'books_sort_move_down' => 'Move Down',
|
||||
'books_sort_move_prev_book' => 'Move to Previous Book',
|
||||
'books_sort_move_next_book' => 'Move to Next Book',
|
||||
'books_sort_move_prev_chapter' => 'Move Into Previous Chapter',
|
||||
'books_sort_move_next_chapter' => 'Move Into Next Chapter',
|
||||
'books_sort_move_book_start' => 'Move to Start of Book',
|
||||
'books_sort_move_book_end' => 'Move to End of Book',
|
||||
'books_sort_move_before_chapter' => 'Move to Before Chapter',
|
||||
'books_sort_move_after_chapter' => 'Move to After Chapter',
|
||||
'books_sort_show_other_desc' => 'کتابهای دیگری را در اینجا اضافه کنید تا آنها را در عملیات مرتبسازی بگنجانید و به آسانی کتابها را مجددا سازماندهی کنید.',
|
||||
'books_sort_move_up' => 'انتقال به بالا',
|
||||
'books_sort_move_down' => 'انتقال به پایین',
|
||||
'books_sort_move_prev_book' => 'انتقال به کتاب قبلی',
|
||||
'books_sort_move_next_book' => 'انتقال به کتاب بعدی',
|
||||
'books_sort_move_prev_chapter' => 'انتقال به داخل فصل قبلی',
|
||||
'books_sort_move_next_chapter' => 'انتقال به داخل فصل بعدی',
|
||||
'books_sort_move_book_start' => 'انتقال به ابتدای کتاب',
|
||||
'books_sort_move_book_end' => 'انتقال به انتهای کتاب',
|
||||
'books_sort_move_before_chapter' => 'انتقال به قبل فصل',
|
||||
'books_sort_move_after_chapter' => 'انتقال به بعد فصل',
|
||||
'books_copy' => 'کپی کتاب',
|
||||
'books_copy_success' => 'کتاب با موفقیت کپی شد',
|
||||
|
||||
@ -248,14 +248,14 @@ return [
|
||||
'pages_permissions_success' => 'مجوزهای صفحه به روز شد',
|
||||
'pages_revision' => 'تجدید نظر',
|
||||
'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_revision_named' => 'ویرایش صفحه برای :pageName',
|
||||
'pages_revision_restored_from' => 'بازیابی شده از #:id; :summary',
|
||||
'pages_revisions_created_by' => 'ایجاد شده توسط',
|
||||
'pages_revisions_date' => 'تاریخ تجدید نظر',
|
||||
'pages_revisions_number' => '#',
|
||||
'pages_revisions_sort_number' => 'Revision Number',
|
||||
'pages_revisions_sort_number' => 'شماره ویرایش',
|
||||
'pages_revisions_numbered' => 'تجدید نظر #:id',
|
||||
'pages_revisions_numbered_changes' => 'بازبینی #:id تغییرات',
|
||||
'pages_revisions_editor' => 'نوع ویرایشگر',
|
||||
|
@ -33,9 +33,9 @@ return [
|
||||
'app_custom_html_desc' => 'هر محتوای اضافه شده در اینجا در پایین بخش <head> هر صفحه درج می شود. این برای تغییر سبک ها یا اضافه کردن کد تجزیه و تحلیل مفید است.',
|
||||
'app_custom_html_disabled_notice' => 'محتوای سر HTML سفارشی در این صفحه تنظیمات غیرفعال است تا اطمینان حاصل شود که هر گونه تغییر شکسته می تواند برگردانده شود.',
|
||||
'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_icon' => 'Application Icon',
|
||||
'app_icon_desc' => 'This icon is used for browser tabs and shortcut icons. This should be a 256px square PNG image.',
|
||||
'app_logo_desc' => 'این مورد در نوار هدر برنامه و در میان سایر قسمتها استفاده میشود. این تصویر باید 86 پیکسل ارتفاع داشته باشد. تصاویر بزرگ، کوچک نمایش داده میشوند.',
|
||||
'app_icon' => 'آیکون برنامه',
|
||||
'app_icon_desc' => 'این آیکون برای تبهای مرورگر و نمادهای میانبر استفاده میشود. این مورد باید یک تصویر PNG مربعی ببه طول 256 پیکسل باشد.',
|
||||
'app_homepage' => 'صفحه اصلی برنامه',
|
||||
'app_homepage_desc' => 'به جای نمای پیشفرض، یک نمای را برای نمایش در صفحه اصلی انتخاب کنید. مجوزهای صفحه برای صفحات انتخابی نادیده گرفته می شود.',
|
||||
'app_homepage_select' => 'یک صفحه را انتخاب کنید',
|
||||
@ -49,7 +49,7 @@ return [
|
||||
'app_disable_comments_desc' => 'نظرات را در تمام صفحات برنامه غیرفعال می کند. <br> نظرات موجود نشان داده نمی شوند.',
|
||||
|
||||
// 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.',
|
||||
'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',
|
||||
@ -137,19 +137,17 @@ return [
|
||||
// Role Settings
|
||||
'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_x_users_assigned' => '1 user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_assigned_users' => 'Assigned Users',
|
||||
'roles_index_desc' => 'نقشها برای گروهبندی کاربران و ارائه مجوز سیستم به اعضای آنها استفاده میشوند. هنگامی که یک کاربر عضو چندین نقش باشد، امتیازات اعطا شده روی هم قرار میگیرند و کاربر تمام مجوزها را به ارث میبرد.',
|
||||
'roles_x_users_assigned' => ':count کاربر اختصاص داده شده|:count کاربر اختصاص داده شده',
|
||||
'roles_x_permissions_provided' => ':count مجوز|:count مجوز',
|
||||
'roles_assigned_users' => 'کاربران اختصاص داده شده',
|
||||
'roles_permissions_provided' => 'Provided Permissions',
|
||||
'role_create' => 'نقش جدید ایجاد کنید',
|
||||
'role_create_success' => 'نقش با موفقیت ایجاد شد',
|
||||
'role_delete' => 'حذف نقش',
|
||||
'role_delete_confirm' => 'با این کار نقش با نام \':roleName\' حذف می شود.',
|
||||
'role_delete_users_assigned' => 'این نقش دارای :userCount کاربرانی است که به آن اختصاص داده شده است. اگر می خواهید کاربران را از این نقش مهاجرت کنید، نقش جدیدی را در زیر انتخاب کنید.',
|
||||
'role_delete_no_migration' => "کاربران را منتقل نکنید",
|
||||
'role_delete_sure' => 'آیا مطمئنید که می خواهید این نقش را حذف کنید؟',
|
||||
'role_delete_success' => 'نقش با موفقیت حذف شد',
|
||||
'role_edit' => 'ویرایش نقش',
|
||||
'role_details' => 'جزئیات نقش',
|
||||
'role_name' => 'اسم نقش',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'صاحب',
|
||||
'role_controlled_by_asset' => 'توسط دارایی که در آن آپلود می شود کنترل می شود',
|
||||
'role_save' => 'ذخیره نقش',
|
||||
'role_update_success' => 'نقش با موفقیت به روز شد',
|
||||
'role_users' => 'کاربران در این نقش',
|
||||
'role_users_none' => 'در حال حاضر هیچ کاربری به این نقش اختصاص داده نشده است',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_x_trigger_events' => '1 trigger event|:count trigger events',
|
||||
'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
|
||||
'webhooks_create' => 'ایجاد وب هوک جدید',
|
||||
'webhooks_none_created' => 'هنوز هیچ وب هوکی ایجاد نشده است.',
|
||||
'webhooks_edit' => 'ویرایش وب هوک',
|
||||
|
@ -67,6 +67,11 @@ return [
|
||||
'user_update_notification' => 'Utilisateur mis à jour 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
|
||||
'commented_on' => 'a commenté',
|
||||
'permissions_update' => 'a mis à jour les autorisations sur',
|
||||
|
@ -23,7 +23,7 @@ return [
|
||||
'meta_updated' => 'Mis à jour :timeLength',
|
||||
'meta_updated_name' => 'Mis à jour :timeLength par :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_lack_permission' => 'Vous n\'avez pas les permissions requises pour sélectionner cet élément',
|
||||
'images' => 'Images',
|
||||
|
@ -138,18 +138,16 @@ return [
|
||||
'roles' => 'Rôles',
|
||||
'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_x_users_assigned' => '1 utilisateur affecté|:count utilisateurs affectés',
|
||||
'roles_x_permissions_provided' => '1 permission|:count permissions',
|
||||
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
|
||||
'roles_x_permissions_provided' => ':count permission|:count permissions',
|
||||
'roles_assigned_users' => 'Utilisateurs assignés',
|
||||
'roles_permissions_provided' => 'Permissions accordées',
|
||||
'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_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_no_migration' => "Ne pas assigner de nouveau 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_details' => 'Détails du rôle',
|
||||
'role_name' => 'Nom du rôle',
|
||||
@ -175,7 +173,6 @@ return [
|
||||
'role_own' => 'Propres',
|
||||
'role_controlled_by_asset' => 'Contrôlé par les ressources les ayant envoyés',
|
||||
'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_none' => 'Aucun utilisateur avec ce rôle actuellement',
|
||||
|
||||
@ -252,7 +249,7 @@ return [
|
||||
// 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_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_none_created' => 'Aucun webhook n\'a encore été créé.',
|
||||
'webhooks_edit' => 'Éditer le Webhook',
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user