diff --git a/.env.example.complete b/.env.example.complete index 03e52d6bb..7e6c6ee3c 100644 --- a/.env.example.complete +++ b/.env.example.complete @@ -268,6 +268,7 @@ OIDC_DUMP_USER_DETAILS=false OIDC_USER_TO_GROUPS=false OIDC_GROUPS_CLAIM=groups OIDC_REMOVE_FROM_GROUPS=false +OIDC_EXTERNAL_ID_CLAIM=sub # Disable default third-party services such as Gravatar and Draw.IO # Service-specific options will override this option diff --git a/.github/translators.txt b/.github/translators.txt index 030569842..2c9423081 100644 --- a/.github/translators.txt +++ b/.github/translators.txt @@ -176,7 +176,7 @@ Alexander Predl (Harveyhase68) :: German Rem (Rem9000) :: Dutch Michał Stelmach (stelmach-web) :: Polish arniom :: French -REMOVED_USER :: ; Dutch; Turkish +REMOVED_USER :: ; French; Dutch; Turkish 林祖年 (contagion) :: Chinese Traditional Siamak Guodarzi (siamakgoudarzi88) :: Persian Lis Maestrelo (lismtrl) :: Portuguese, Brazilian @@ -302,3 +302,9 @@ Angelos Chouvardas (achouvardas) :: Greek rndrss :: Portuguese, Brazilian rirac294 :: Russian David Furman (thefourCraft) :: Hebrew +Pafzedog :: French +Yllelder :: Spanish +Adrian Ocneanu (aocneanu) :: Romanian +Eduardo Castanho (EduardoCastanho) :: Portuguese +VIET NAM VPS (vietnamvps) :: Vietnamese +m4tthi4s :: French diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml index 903b676cd..215f98741 100644 --- a/.github/workflows/test-php.yml +++ b/.github/workflows/test-php.yml @@ -16,7 +16,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - extensions: gd, mbstring, json, curl, xml, mysql, ldap + extensions: gd, mbstring, json, curl, xml, mysql, ldap, gmp - name: Get Composer Cache Directory id: composer-cache diff --git a/app/Actions/Activity.php b/app/Actions/Activity.php index 3b1408cb9..0789fe123 100644 --- a/app/Actions/Activity.php +++ b/app/Actions/Activity.php @@ -2,10 +2,12 @@ namespace BookStack\Actions; +use BookStack\Auth\Permissions\JointPermission; use BookStack\Auth\User; use BookStack\Entities\Models\Entity; use BookStack\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Support\Str; @@ -40,6 +42,12 @@ class Activity extends Model return $this->belongsTo(User::class); } + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'entity_id') + ->whereColumn('activities.entity_type', '=', 'joint_permissions.entity_type'); + } + /** * Returns text from the language files, Looks up by using the activity key. */ diff --git a/app/Actions/Favourite.php b/app/Actions/Favourite.php index f45894182..c5d12a151 100644 --- a/app/Actions/Favourite.php +++ b/app/Actions/Favourite.php @@ -2,7 +2,9 @@ namespace BookStack\Actions; +use BookStack\Auth\Permissions\JointPermission; use BookStack\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; class Favourite extends Model @@ -16,4 +18,10 @@ class Favourite extends Model { return $this->morphTo(); } + + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'favouritable_id') + ->whereColumn('favourites.favouritable_type', '=', 'joint_permissions.entity_type'); + } } diff --git a/app/Actions/Tag.php b/app/Actions/Tag.php index 609c299ad..e173faea0 100644 --- a/app/Actions/Tag.php +++ b/app/Actions/Tag.php @@ -2,8 +2,10 @@ namespace BookStack\Actions; +use BookStack\Auth\Permissions\JointPermission; use BookStack\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; /** @@ -27,6 +29,12 @@ class Tag extends Model return $this->morphTo('entity'); } + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'entity_id') + ->whereColumn('tags.entity_type', '=', 'joint_permissions.entity_type'); + } + /** * Get a full URL to start a tag name search for this tag name. */ diff --git a/app/Actions/View.php b/app/Actions/View.php index 16961bd91..706467133 100644 --- a/app/Actions/View.php +++ b/app/Actions/View.php @@ -2,8 +2,10 @@ namespace BookStack\Actions; +use BookStack\Auth\Permissions\JointPermission; use BookStack\Interfaces\Viewable; use BookStack\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; /** @@ -28,6 +30,12 @@ class View extends Model return $this->morphTo(); } + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'viewable_id') + ->whereColumn('views.viewable_type', '=', 'joint_permissions.entity_type'); + } + /** * Increment the current user's view count for the given viewable model. */ diff --git a/app/Auth/Access/Oidc/OidcService.php b/app/Auth/Access/Oidc/OidcService.php index a9323d423..1ca5e19a2 100644 --- a/app/Auth/Access/Oidc/OidcService.php +++ b/app/Auth/Access/Oidc/OidcService.php @@ -198,7 +198,8 @@ class OidcService */ protected function getUserDetails(OidcIdToken $token): array { - $id = $token->getClaim('sub'); + $idClaim = $this->config()['external_id_claim']; + $id = $token->getClaim($idClaim); return [ 'external_id' => $id, diff --git a/app/Auth/Permissions/EntityPermissionEvaluator.php b/app/Auth/Permissions/EntityPermissionEvaluator.php new file mode 100644 index 000000000..51db45bbc --- /dev/null +++ b/app/Auth/Permissions/EntityPermissionEvaluator.php @@ -0,0 +1,141 @@ +action = $action; + } + + public function evaluateEntityForUser(Entity $entity, array $userRoleIds): ?bool + { + if ($this->isUserSystemAdmin($userRoleIds)) { + return true; + } + + $typeIdChain = $this->gatherEntityChainTypeIds(SimpleEntityData::fromEntity($entity)); + $relevantPermissions = $this->getPermissionsMapByTypeId($typeIdChain, [...$userRoleIds, 0]); + $permitsByType = $this->collapseAndCategorisePermissions($typeIdChain, $relevantPermissions); + + $status = $this->evaluatePermitsByType($permitsByType); + + return is_null($status) ? null : $status === PermissionStatus::IMPLICIT_ALLOW || $status === PermissionStatus::EXPLICIT_ALLOW; + } + + /** + * @param array> $permitsByType + */ + protected function evaluatePermitsByType(array $permitsByType): ?int + { + // Return grant or reject from role-level if exists + if (count($permitsByType['role']) > 0) { + return max($permitsByType['role']) ? PermissionStatus::EXPLICIT_ALLOW : PermissionStatus::EXPLICIT_DENY; + } + + // Return fallback permission if exists + if (count($permitsByType['fallback']) > 0) { + return $permitsByType['fallback'][0] ? PermissionStatus::IMPLICIT_ALLOW : PermissionStatus::IMPLICIT_DENY; + } + + return null; + } + + /** + * @param string[] $typeIdChain + * @param array $permissionMapByTypeId + * @return array> + */ + protected function collapseAndCategorisePermissions(array $typeIdChain, array $permissionMapByTypeId): array + { + $permitsByType = ['fallback' => [], 'role' => []]; + + foreach ($typeIdChain as $typeId) { + $permissions = $permissionMapByTypeId[$typeId] ?? []; + foreach ($permissions as $permission) { + $roleId = $permission->role_id; + $type = $roleId === 0 ? 'fallback' : 'role'; + if (!isset($permitsByType[$type][$roleId])) { + $permitsByType[$type][$roleId] = $permission->{$this->action}; + } + } + + if (isset($permitsByType['fallback'][0])) { + break; + } + } + + return $permitsByType; + } + + /** + * @param string[] $typeIdChain + * @return array + */ + protected function getPermissionsMapByTypeId(array $typeIdChain, array $filterRoleIds): array + { + $query = EntityPermission::query()->where(function (Builder $query) use ($typeIdChain) { + foreach ($typeIdChain as $typeId) { + $query->orWhere(function (Builder $query) use ($typeId) { + [$type, $id] = explode(':', $typeId); + $query->where('entity_type', '=', $type) + ->where('entity_id', '=', $id); + }); + } + }); + + if (!empty($filterRoleIds)) { + $query->where(function (Builder $query) use ($filterRoleIds) { + $query->whereIn('role_id', [...$filterRoleIds, 0]); + }); + } + + $relevantPermissions = $query->get(['entity_id', 'entity_type', 'role_id', $this->action])->all(); + + $map = []; + foreach ($relevantPermissions as $permission) { + $key = $permission->entity_type . ':' . $permission->entity_id; + if (!isset($map[$key])) { + $map[$key] = []; + } + + $map[$key][] = $permission; + } + + return $map; + } + + /** + * @return string[] + */ + protected function gatherEntityChainTypeIds(SimpleEntityData $entity): array + { + // The array order here is very important due to the fact we walk up the chain + // elsewhere in the class. Earlier items in the chain have higher priority. + + $chain = [$entity->type . ':' . $entity->id]; + + if ($entity->type === 'page' && $entity->chapter_id) { + $chain[] = 'chapter:' . $entity->chapter_id; + } + + if ($entity->type === 'page' || $entity->type === 'chapter') { + $chain[] = 'book:' . $entity->book_id; + } + + return $chain; + } + + protected function isUserSystemAdmin($userRoleIds): bool + { + $adminRoleId = Role::getSystemRole('admin')->id; + return in_array($adminRoleId, $userRoleIds); + } +} diff --git a/app/Auth/Permissions/JointPermissionBuilder.php b/app/Auth/Permissions/JointPermissionBuilder.php index 114cff619..4132a19af 100644 --- a/app/Auth/Permissions/JointPermissionBuilder.php +++ b/app/Auth/Permissions/JointPermissionBuilder.php @@ -19,11 +19,6 @@ use Illuminate\Support\Facades\DB; */ class JointPermissionBuilder { - /** - * @var array> - */ - protected array $entityCache; - /** * Re-generate all entity permission from scratch. */ @@ -98,40 +93,6 @@ class JointPermissionBuilder }); } - /** - * Prepare the local entity cache and ensure it's empty. - * - * @param SimpleEntityData[] $entities - */ - protected function readyEntityCache(array $entities) - { - $this->entityCache = []; - - foreach ($entities as $entity) { - if (!isset($this->entityCache[$entity->type])) { - $this->entityCache[$entity->type] = []; - } - - $this->entityCache[$entity->type][$entity->id] = $entity; - } - } - - /** - * Get a book via ID, Checks local cache. - */ - protected function getBook(int $bookId): SimpleEntityData - { - return $this->entityCache['book'][$bookId]; - } - - /** - * Get a chapter via ID, Checks local cache. - */ - protected function getChapter(int $chapterId): SimpleEntityData - { - return $this->entityCache['chapter'][$chapterId]; - } - /** * Get a query for fetching a book with its children. */ @@ -214,13 +175,7 @@ class JointPermissionBuilder $simpleEntities = []; foreach ($entities as $entity) { - $attrs = $entity->getAttributes(); - $simple = new SimpleEntityData(); - $simple->id = $attrs['id']; - $simple->type = $entity->getMorphClass(); - $simple->owned_by = $attrs['owned_by'] ?? 0; - $simple->book_id = $attrs['book_id'] ?? null; - $simple->chapter_id = $attrs['chapter_id'] ?? null; + $simple = SimpleEntityData::fromEntity($entity); $simpleEntities[] = $simple; } @@ -236,18 +191,10 @@ class JointPermissionBuilder protected function createManyJointPermissions(array $originalEntities, array $roles) { $entities = $this->entitiesToSimpleEntities($originalEntities); - $this->readyEntityCache($entities); $jointPermissions = []; // Fetch related entity permissions - $permissions = $this->getEntityPermissionsForEntities($entities); - - // Create a mapping of explicit entity permissions - $permissionMap = []; - foreach ($permissions as $permission) { - $key = $permission->entity_type . ':' . $permission->entity_id . ':' . $permission->role_id; - $permissionMap[$key] = $permission->view; - } + $permissions = new MassEntityPermissionEvaluator($entities, 'view'); // Create a mapping of role permissions $rolePermissionMap = []; @@ -260,13 +207,14 @@ class JointPermissionBuilder // Create Joint Permission Data foreach ($entities as $entity) { foreach ($roles as $role) { - $jointPermissions[] = $this->createJointPermissionData( + $jp = $this->createJointPermissionData( $entity, $role->getRawAttribute('id'), - $permissionMap, + $permissions, $rolePermissionMap, $role->system_name === 'admin' ); + $jointPermissions[] = $jp; } } @@ -300,109 +248,45 @@ class JointPermissionBuilder return $idsByType; } - /** - * Get the entity permissions for all the given entities. - * - * @param SimpleEntityData[] $entities - * - * @return EntityPermission[] - */ - protected function getEntityPermissionsForEntities(array $entities): array - { - $idsByType = $this->entitiesToTypeIdMap($entities); - $permissionFetch = EntityPermission::query() - ->where(function (Builder $query) use ($idsByType) { - foreach ($idsByType as $type => $ids) { - $query->orWhere(function (Builder $query) use ($type, $ids) { - $query->where('entity_type', '=', $type)->whereIn('entity_id', $ids); - }); - } - }); - - return $permissionFetch->get()->all(); - } - /** * Create entity permission data for an entity and role * for a particular action. */ - protected function createJointPermissionData(SimpleEntityData $entity, int $roleId, array $permissionMap, array $rolePermissionMap, bool $isAdminRole): array + protected function createJointPermissionData(SimpleEntityData $entity, int $roleId, MassEntityPermissionEvaluator $permissionMap, array $rolePermissionMap, bool $isAdminRole): array { + // Ensure system admin role retains permissions + if ($isAdminRole) { + return $this->createJointPermissionDataArray($entity, $roleId, PermissionStatus::EXPLICIT_ALLOW, true); + } + + // Return evaluated entity permission status if it has an affect. + $entityPermissionStatus = $permissionMap->evaluateEntityForRole($entity, $roleId); + if ($entityPermissionStatus !== null) { + return $this->createJointPermissionDataArray($entity, $roleId, $entityPermissionStatus, false); + } + + // Otherwise default to the role-level permissions $permissionPrefix = $entity->type . '-view'; $roleHasPermission = isset($rolePermissionMap[$roleId . ':' . $permissionPrefix . '-all']); $roleHasPermissionOwn = isset($rolePermissionMap[$roleId . ':' . $permissionPrefix . '-own']); - - if ($isAdminRole) { - return $this->createJointPermissionDataArray($entity, $roleId, true, true); - } - - if ($this->entityPermissionsActiveForRole($permissionMap, $entity, $roleId)) { - $hasAccess = $this->mapHasActiveRestriction($permissionMap, $entity, $roleId); - - return $this->createJointPermissionDataArray($entity, $roleId, $hasAccess, $hasAccess); - } - - if ($entity->type === 'book' || $entity->type === 'bookshelf') { - return $this->createJointPermissionDataArray($entity, $roleId, $roleHasPermission, $roleHasPermissionOwn); - } - - // For chapters and pages, Check if explicit permissions are set on the Book. - $book = $this->getBook($entity->book_id); - $hasExplicitAccessToParents = $this->mapHasActiveRestriction($permissionMap, $book, $roleId); - $hasPermissiveAccessToParents = !$this->entityPermissionsActiveForRole($permissionMap, $book, $roleId); - - // For pages with a chapter, Check if explicit permissions are set on the Chapter - if ($entity->type === 'page' && $entity->chapter_id !== 0) { - $chapter = $this->getChapter($entity->chapter_id); - $chapterRestricted = $this->entityPermissionsActiveForRole($permissionMap, $chapter, $roleId); - $hasPermissiveAccessToParents = $hasPermissiveAccessToParents && !$chapterRestricted; - if ($chapterRestricted) { - $hasExplicitAccessToParents = $this->mapHasActiveRestriction($permissionMap, $chapter, $roleId); - } - } - - return $this->createJointPermissionDataArray( - $entity, - $roleId, - ($hasExplicitAccessToParents || ($roleHasPermission && $hasPermissiveAccessToParents)), - ($hasExplicitAccessToParents || ($roleHasPermissionOwn && $hasPermissiveAccessToParents)) - ); - } - - /** - * Check if entity permissions are defined within the given map, for the given entity and role. - * Checks for the default `role_id=0` backup option as a fallback. - */ - protected function entityPermissionsActiveForRole(array $permissionMap, SimpleEntityData $entity, int $roleId): bool - { - $keyPrefix = $entity->type . ':' . $entity->id . ':'; - return isset($permissionMap[$keyPrefix . $roleId]) || isset($permissionMap[$keyPrefix . '0']); - } - - /** - * Check for an active restriction in an entity map. - */ - protected function mapHasActiveRestriction(array $entityMap, SimpleEntityData $entity, int $roleId): bool - { - $roleKey = $entity->type . ':' . $entity->id . ':' . $roleId; - $defaultKey = $entity->type . ':' . $entity->id . ':0'; - - return $entityMap[$roleKey] ?? $entityMap[$defaultKey] ?? false; + $status = $roleHasPermission ? PermissionStatus::IMPLICIT_ALLOW : PermissionStatus::IMPLICIT_DENY; + return $this->createJointPermissionDataArray($entity, $roleId, $status, $roleHasPermissionOwn); } /** * Create an array of data with the information of an entity jointPermissions. * Used to build data for bulk insertion. */ - protected function createJointPermissionDataArray(SimpleEntityData $entity, int $roleId, bool $permissionAll, bool $permissionOwn): array + protected function createJointPermissionDataArray(SimpleEntityData $entity, int $roleId, int $permissionStatus, bool $hasPermissionOwn): array { + $ownPermissionActive = ($hasPermissionOwn && $permissionStatus !== PermissionStatus::EXPLICIT_DENY && $entity->owned_by); + return [ - 'entity_id' => $entity->id, - 'entity_type' => $entity->type, - 'has_permission' => $permissionAll, - 'has_permission_own' => $permissionOwn, - 'owned_by' => $entity->owned_by, - 'role_id' => $roleId, + 'entity_id' => $entity->id, + 'entity_type' => $entity->type, + 'role_id' => $roleId, + 'status' => $permissionStatus, + 'owner_id' => $ownPermissionActive ? $entity->owned_by : null, ]; } } diff --git a/app/Auth/Permissions/MassEntityPermissionEvaluator.php b/app/Auth/Permissions/MassEntityPermissionEvaluator.php new file mode 100644 index 000000000..a9deba16d --- /dev/null +++ b/app/Auth/Permissions/MassEntityPermissionEvaluator.php @@ -0,0 +1,81 @@ +entitiesInvolved = $entitiesInvolved; + parent::__construct($action); + } + + public function evaluateEntityForRole(SimpleEntityData $entity, int $roleId): ?int + { + $typeIdChain = $this->gatherEntityChainTypeIds($entity); + $relevantPermissions = $this->getPermissionMapByTypeIdForChainAndRole($typeIdChain, $roleId); + $permitsByType = $this->collapseAndCategorisePermissions($typeIdChain, $relevantPermissions); + + return $this->evaluatePermitsByType($permitsByType); + } + + /** + * @param string[] $typeIdChain + * @return array + */ + protected function getPermissionMapByTypeIdForChainAndRole(array $typeIdChain, int $roleId): array + { + $allPermissions = $this->getPermissionMapByTypeIdAndRoleForAllInvolved(); + $relevantPermissions = []; + + // Filter down permissions to just those for current typeId + // and current roleID or fallback permissions. + foreach ($typeIdChain as $typeId) { + $relevantPermissions[$typeId] = [ + ...($allPermissions[$typeId][$roleId] ?? []), + ...($allPermissions[$typeId][0] ?? []) + ]; + } + + return $relevantPermissions; + } + + /** + * @return array> + */ + protected function getPermissionMapByTypeIdAndRoleForAllInvolved(): array + { + if (isset($this->permissionMapCache)) { + return $this->permissionMapCache; + } + + $entityTypeIdChain = []; + foreach ($this->entitiesInvolved as $entity) { + $entityTypeIdChain[] = $entity->type . ':' . $entity->id; + } + + $permissionMap = $this->getPermissionsMapByTypeId($entityTypeIdChain, []); + + // Manipulate permission map to also be keyed by roleId. + foreach ($permissionMap as $typeId => $permissions) { + $permissionMap[$typeId] = []; + foreach ($permissions as $permission) { + $roleId = $permission->getRawAttribute('role_id'); + if (!isset($permissionMap[$typeId][$roleId])) { + $permissionMap[$typeId][$roleId] = []; + } + $permissionMap[$typeId][$roleId][] = $permission; + } + } + + $this->permissionMapCache = $permissionMap; + + return $this->permissionMapCache; + } +} diff --git a/app/Auth/Permissions/PermissionApplicator.php b/app/Auth/Permissions/PermissionApplicator.php index af372cb74..20cc87e48 100644 --- a/app/Auth/Permissions/PermissionApplicator.php +++ b/app/Auth/Permissions/PermissionApplicator.php @@ -4,7 +4,6 @@ namespace BookStack\Auth\Permissions; use BookStack\Auth\Role; use BookStack\Auth\User; -use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Page; use BookStack\Model; @@ -61,46 +60,7 @@ class PermissionApplicator { $this->ensureValidEntityAction($action); - $adminRoleId = Role::getSystemRole('admin')->id; - if (in_array($adminRoleId, $userRoleIds)) { - return true; - } - - // The chain order here is very important due to the fact we walk up the chain - // in the loop below. Earlier items in the chain have higher priority. - $chain = [$entity]; - if ($entity instanceof Page && $entity->chapter_id) { - $chain[] = $entity->chapter; - } - - if ($entity instanceof Page || $entity instanceof Chapter) { - $chain[] = $entity->book; - } - - foreach ($chain as $currentEntity) { - $allowedByRoleId = $currentEntity->permissions() - ->whereIn('role_id', [0, ...$userRoleIds]) - ->pluck($action, 'role_id'); - - // Continue up the chain if no applicable entity permission overrides. - if ($allowedByRoleId->isEmpty()) { - continue; - } - - // If we have user-role-specific permissions set, allow if any of those - // role permissions allow access. - $hasDefault = $allowedByRoleId->has(0); - if (!$hasDefault || $allowedByRoleId->count() > 1) { - return $allowedByRoleId->search(function (bool $allowed, int $roleId) { - return $roleId !== 0 && $allowed; - }) !== false; - } - - // Otherwise, return the default "Other roles" fallback value. - return $allowedByRoleId->get(0); - } - - return null; + return (new EntityPermissionEvaluator($action))->evaluateEntityForUser($entity, $userRoleIds); } /** @@ -134,10 +94,12 @@ class PermissionApplicator { return $query->where(function (Builder $parentQuery) { $parentQuery->whereHas('jointPermissions', function (Builder $permissionQuery) { - $permissionQuery->whereIn('role_id', $this->getCurrentUserRoleIds()) - ->where(function (Builder $query) { - $this->addJointHasPermissionCheck($query, $this->currentUser()->id); - }); + $permissionQuery->select(['entity_id', 'entity_type']) + ->selectRaw('max(owner_id) as owner_id') + ->selectRaw('max(status) as status') + ->whereIn('role_id', $this->getCurrentUserRoleIds()) + ->groupBy(['entity_type', 'entity_id']) + ->havingRaw('(status IN (1, 3) or (owner_id = ? and status != 2))', [$this->currentUser()->id]); }); }); } @@ -161,35 +123,23 @@ class PermissionApplicator * Filter items that have entities set as a polymorphic relation. * For simplicity, this will not return results attached to draft pages. * Draft pages should never really have related items though. - * - * @param Builder|QueryBuilder $query */ - public function restrictEntityRelationQuery($query, string $tableName, string $entityIdColumn, string $entityTypeColumn) + public function restrictEntityRelationQuery(Builder $query, string $tableName, string $entityIdColumn, string $entityTypeColumn): Builder { $tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn]; $pageMorphClass = (new Page())->getMorphClass(); - $q = $query->whereExists(function ($permissionQuery) use (&$tableDetails) { - /** @var Builder $permissionQuery */ - $permissionQuery->select(['role_id'])->from('joint_permissions') - ->whereColumn('joint_permissions.entity_id', '=', $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn']) - ->whereColumn('joint_permissions.entity_type', '=', $tableDetails['tableName'] . '.' . $tableDetails['entityTypeColumn']) - ->whereIn('joint_permissions.role_id', $this->getCurrentUserRoleIds()) - ->where(function (QueryBuilder $query) { - $this->addJointHasPermissionCheck($query, $this->currentUser()->id); - }); - })->where(function ($query) use ($tableDetails, $pageMorphClass) { - /** @var Builder $query */ - $query->where($tableDetails['entityTypeColumn'], '!=', $pageMorphClass) + return $this->restrictEntityQuery($query) + ->where(function ($query) use ($tableDetails, $pageMorphClass) { + /** @var Builder $query */ + $query->where($tableDetails['entityTypeColumn'], '!=', $pageMorphClass) ->orWhereExists(function (QueryBuilder $query) use ($tableDetails, $pageMorphClass) { $query->select('id')->from('pages') ->whereColumn('pages.id', '=', $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn']) ->where($tableDetails['tableName'] . '.' . $tableDetails['entityTypeColumn'], '=', $pageMorphClass) ->where('pages.draft', '=', false); }); - }); - - return $q; + }); } /** @@ -201,49 +151,15 @@ class PermissionApplicator public function restrictPageRelationQuery(Builder $query, string $tableName, string $pageIdColumn): Builder { $fullPageIdColumn = $tableName . '.' . $pageIdColumn; - $morphClass = (new Page())->getMorphClass(); - - $existsQuery = function ($permissionQuery) use ($fullPageIdColumn, $morphClass) { - /** @var Builder $permissionQuery */ - $permissionQuery->select('joint_permissions.role_id')->from('joint_permissions') - ->whereColumn('joint_permissions.entity_id', '=', $fullPageIdColumn) - ->where('joint_permissions.entity_type', '=', $morphClass) - ->whereIn('joint_permissions.role_id', $this->getCurrentUserRoleIds()) - ->where(function (QueryBuilder $query) { - $this->addJointHasPermissionCheck($query, $this->currentUser()->id); + return $this->restrictEntityQuery($query) + ->where(function ($query) use ($fullPageIdColumn) { + /** @var Builder $query */ + $query->whereExists(function (QueryBuilder $query) use ($fullPageIdColumn) { + $query->select('id')->from('pages') + ->whereColumn('pages.id', '=', $fullPageIdColumn) + ->where('pages.draft', '=', false); }); - }; - - $q = $query->where(function ($query) use ($existsQuery, $fullPageIdColumn) { - $query->whereExists($existsQuery) - ->orWhere($fullPageIdColumn, '=', 0); - }); - - // Prevent visibility of non-owned draft pages - $q->whereExists(function (QueryBuilder $query) use ($fullPageIdColumn) { - $query->select('id')->from('pages') - ->whereColumn('pages.id', '=', $fullPageIdColumn) - ->where(function (QueryBuilder $query) { - $query->where('pages.draft', '=', false) - ->orWhere('pages.owned_by', '=', $this->currentUser()->id); - }); - }); - - return $q; - } - - /** - * Add the query for checking the given user id has permission - * within the join_permissions table. - * - * @param QueryBuilder|Builder $query - */ - protected function addJointHasPermissionCheck($query, int $userIdToCheck) - { - $query->where('joint_permissions.has_permission', '=', true)->orWhere(function ($query) use ($userIdToCheck) { - $query->where('joint_permissions.has_permission_own', '=', true) - ->where('joint_permissions.owned_by', '=', $userIdToCheck); - }); + }); } /** diff --git a/app/Auth/Permissions/PermissionStatus.php b/app/Auth/Permissions/PermissionStatus.php new file mode 100644 index 000000000..f8e55c20b --- /dev/null +++ b/app/Auth/Permissions/PermissionStatus.php @@ -0,0 +1,11 @@ +getAttributes(); + $simple = new self(); + + $simple->id = $attrs['id']; + $simple->type = $entity->getMorphClass(); + $simple->owned_by = $attrs['owned_by'] ?? 0; + $simple->book_id = $attrs['book_id'] ?? null; + $simple->chapter_id = $attrs['chapter_id'] ?? null; + + return $simple; + } } diff --git a/app/Auth/User.php b/app/Auth/User.php index 6e66bc808..cf9f20e52 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -200,6 +200,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon public function attachRole(Role $role) { $this->roles()->attach($role->id); + $this->unsetRelation('roles'); } /** diff --git a/app/Config/oidc.php b/app/Config/oidc.php index d223a63ef..1f73fb688 100644 --- a/app/Config/oidc.php +++ b/app/Config/oidc.php @@ -8,9 +8,12 @@ return [ // Dump user details after a login request for debugging purposes 'dump_user_details' => env('OIDC_DUMP_USER_DETAILS', false), - // Attribute, within a OpenId token, to find the user's display name + // Claim, within an OpenId token, to find the user's display name 'display_name_claims' => explode('|', env('OIDC_DISPLAY_NAME_CLAIMS', 'name')), + // Claim, within an OpenID token, to use to connect a BookStack user to the OIDC user. + 'external_id_claim' => env('OIDC_EXTERNAL_ID_CLAIM', 'sub'), + // OAuth2/OpenId client id, as configured in your Authorization server. 'client_id' => env('OIDC_CLIENT_ID', null), diff --git a/app/Config/setting-defaults.php b/app/Config/setting-defaults.php index 5e1e4348a..88c4612ca 100644 --- a/app/Config/setting-defaults.php +++ b/app/Config/setting-defaults.php @@ -16,11 +16,20 @@ return [ 'app-editor' => 'wysiwyg', 'app-color' => '#206ea7', 'app-color-light' => 'rgba(32,110,167,0.15)', + 'link-color' => '#206ea7', 'bookshelf-color' => '#a94747', 'book-color' => '#077b70', 'chapter-color' => '#af4d0d', 'page-color' => '#206ea7', 'page-draft-color' => '#7e50b1', + 'app-color-dark' => '#195785', + 'app-color-light-dark' => 'rgba(32,110,167,0.15)', + 'link-color-dark' => '#429fe3', + 'bookshelf-color-dark' => '#ff5454', + 'book-color-dark' => '#389f60', + 'chapter-color-dark' => '#ee7a2d', + 'page-color-dark' => '#429fe3', + 'page-draft-color-dark' => '#a66ce8', 'app-custom-head' => false, 'registration-enabled' => false, diff --git a/app/Entities/Tools/Markdown/MarkdownToHtml.php b/app/Entities/Tools/Markdown/MarkdownToHtml.php index f3cf7ab2f..06587ce1f 100644 --- a/app/Entities/Tools/Markdown/MarkdownToHtml.php +++ b/app/Entities/Tools/Markdown/MarkdownToHtml.php @@ -5,10 +5,10 @@ namespace BookStack\Entities\Tools\Markdown; use BookStack\Facades\Theme; use BookStack\Theming\ThemeEvents; use League\CommonMark\Block\Element\ListItem; -use League\CommonMark\CommonMarkConverter; use League\CommonMark\Environment; use League\CommonMark\Extension\Table\TableExtension; use League\CommonMark\Extension\TaskList\TaskListExtension; +use League\CommonMark\MarkdownConverter; class MarkdownToHtml { @@ -26,7 +26,7 @@ class MarkdownToHtml $environment->addExtension(new TaskListExtension()); $environment->addExtension(new CustomStrikeThroughExtension()); $environment = Theme::dispatch(ThemeEvents::COMMONMARK_ENVIRONMENT_CONFIGURE, $environment) ?? $environment; - $converter = new CommonMarkConverter([], $environment); + $converter = new MarkdownConverter($environment); $environment->addBlockRenderer(ListItem::class, new CustomListItemRenderer(), 10); diff --git a/app/Http/Controllers/Images/DrawioImageController.php b/app/Http/Controllers/Images/DrawioImageController.php index cab1c925e..ce857cf52 100644 --- a/app/Http/Controllers/Images/DrawioImageController.php +++ b/app/Http/Controllers/Images/DrawioImageController.php @@ -66,14 +66,19 @@ class DrawioImageController extends Controller */ public function getAsBase64($id) { - $image = $this->imageRepo->getById($id); - if (is_null($image) || $image->type !== 'drawio' || !userCan('page-view', $image->getPage())) { - return $this->jsonError('Image data could not be found'); + try { + $image = $this->imageRepo->getById($id); + } catch (Exception $exception) { + return $this->jsonError(trans('errors.drawing_data_not_found'), 404); + } + + if ($image->type !== 'drawio' || !userCan('page-view', $image->getPage())) { + return $this->jsonError(trans('errors.drawing_data_not_found'), 404); } $imageData = $this->imageRepo->getImageData($image); if (is_null($imageData)) { - return $this->jsonError('Image data could not be found'); + return $this->jsonError(trans('errors.drawing_data_not_found'), 404); } return response()->json([ diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index f5e48ca4c..1e13d7cb7 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -4,20 +4,14 @@ namespace BookStack\Http\Controllers; use BookStack\Actions\ActivityType; use BookStack\Auth\User; +use BookStack\Settings\AppSettingsStore; use BookStack\Uploads\ImageRepo; use Illuminate\Http\Request; class SettingController extends Controller { - protected ImageRepo $imageRepo; - protected array $settingCategories = ['features', 'customization', 'registration']; - public function __construct(ImageRepo $imageRepo) - { - $this->imageRepo = $imageRepo; - } - /** * Handle requests to the settings index path. */ @@ -48,37 +42,17 @@ class SettingController extends Controller /** * Update the specified settings in storage. */ - public function update(Request $request, string $category) + public function update(Request $request, AppSettingsStore $store, string $category) { $this->ensureCategoryExists($category); $this->preventAccessInDemoMode(); $this->checkPermission('settings-manage'); $this->validate($request, [ - 'app_logo' => array_merge(['nullable'], $this->getImageValidationRules()), + 'app_logo' => ['nullable', ...$this->getImageValidationRules()], + 'app_icon' => ['nullable', ...$this->getImageValidationRules()], ]); - // Cycles through posted settings and update them - foreach ($request->all() as $name => $value) { - $key = str_replace('setting-', '', trim($name)); - if (strpos($name, 'setting-') !== 0) { - continue; - } - setting()->put($key, $value); - } - - // Update logo image if set - if ($category === 'customization' && $request->hasFile('app_logo')) { - $logoFile = $request->file('app_logo'); - $this->imageRepo->destroyByType('system'); - $image = $this->imageRepo->saveNew($logoFile, 'system', 0, null, 86); - setting()->put('app-logo', $image->url); - } - - // Clear logo image if requested - if ($category === 'customization' && $request->get('app_logo_reset', null)) { - $this->imageRepo->destroyByType('system'); - setting()->remove('app-logo'); - } + $store->storeFromUpdateRequest($request, $category); $this->logActivity(ActivityType::SETTINGS_UPDATE, $category); $this->showSuccessNotification(trans('settings.settings_save_success')); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index f69f00cf7..2fcfa4289 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -164,6 +164,8 @@ class UserController extends Controller // Delete the profile image if reset option is in request if ($request->has('profile_image_reset')) { $this->imageRepo->destroyImage($user->avatar); + $user->image_id = 0; + $user->save(); } $redirectUrl = userCan('users-manage') ? '/settings/users' : "/settings/users/{$user->id}"; diff --git a/app/Providers/TranslationServiceProvider.php b/app/Providers/TranslationServiceProvider.php index 3610a1e22..6bf57e021 100644 --- a/app/Providers/TranslationServiceProvider.php +++ b/app/Providers/TranslationServiceProvider.php @@ -3,10 +3,41 @@ namespace BookStack\Providers; use BookStack\Translation\FileLoader; +use BookStack\Translation\MessageSelector; use Illuminate\Translation\TranslationServiceProvider as BaseProvider; +use Illuminate\Translation\Translator; class TranslationServiceProvider extends BaseProvider { + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->registerLoader(); + + // This is a tweak upon Laravel's based translation service registration to allow + // usage of a custom MessageSelector class + $this->app->singleton('translator', function ($app) { + $loader = $app['translation.loader']; + + // When registering the translator component, we'll need to set the default + // locale as well as the fallback locale. So, we'll grab the application + // configuration so we can easily get both of these values from there. + $locale = $app['config']['app.locale']; + + $trans = new Translator($loader, $locale); + $trans->setFallback($app['config']['app.fallback_locale']); + $trans->setSelector(new MessageSelector()); + + return $trans; + }); + } + + + /** * Register the translation line loader. * Overrides the default register action from Laravel so a custom loader can be used. diff --git a/app/References/Reference.php b/app/References/Reference.php index 1a1c56af3..0e5b17d0b 100644 --- a/app/References/Reference.php +++ b/app/References/Reference.php @@ -2,7 +2,9 @@ namespace BookStack\References; +use BookStack\Auth\Permissions\JointPermission; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; /** @@ -24,4 +26,10 @@ class Reference extends Model { return $this->morphTo('to'); } + + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'from_id') + ->whereColumn('references.from_type', '=', 'joint_permissions.entity_type'); + } } diff --git a/app/References/ReferenceFetcher.php b/app/References/ReferenceFetcher.php index a73463a95..415791857 100644 --- a/app/References/ReferenceFetcher.php +++ b/app/References/ReferenceFetcher.php @@ -5,6 +5,7 @@ namespace BookStack\References; use BookStack\Auth\Permissions\PermissionApplicator; use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Page; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Relations\Relation; @@ -23,8 +24,7 @@ class ReferenceFetcher */ public function getPageReferencesToEntity(Entity $entity): Collection { - $baseQuery = $entity->referencesTo() - ->where('from_type', '=', (new Page())->getMorphClass()) + $baseQuery = $this->queryPageReferencesToEntity($entity) ->with([ 'from' => fn (Relation $query) => $query->select(Page::$listAttributes), 'from.book' => fn (Relation $query) => $query->scopes('visible'), @@ -47,11 +47,8 @@ class ReferenceFetcher */ public function getPageReferenceCountToEntity(Entity $entity): int { - $baseQuery = $entity->referencesTo() - ->where('from_type', '=', (new Page())->getMorphClass()); - $count = $this->permissions->restrictEntityRelationQuery( - $baseQuery, + $this->queryPageReferencesToEntity($entity), 'references', 'from_id', 'from_type' @@ -59,4 +56,12 @@ class ReferenceFetcher return $count; } + + protected function queryPageReferencesToEntity(Entity $entity): Builder + { + return Reference::query() + ->where('to_type', '=', $entity->getMorphClass()) + ->where('to_id', '=', $entity->id) + ->where('from_type', '=', (new Page())->getMorphClass()); + } } diff --git a/app/Search/SearchIndex.php b/app/Search/SearchIndex.php index 8c793a109..54ed95ebb 100644 --- a/app/Search/SearchIndex.php +++ b/app/Search/SearchIndex.php @@ -112,12 +112,12 @@ class SearchIndex * * @returns array */ - protected function generateTermScoreMapFromText(string $text, int $scoreAdjustment = 1): array + protected function generateTermScoreMapFromText(string $text, float $scoreAdjustment = 1): array { $termMap = $this->textToTermCountMap($text); foreach ($termMap as $term => $count) { - $termMap[$term] = $count * $scoreAdjustment; + $termMap[$term] = floor($count * $scoreAdjustment); } return $termMap; diff --git a/app/Settings/AppSettingsStore.php b/app/Settings/AppSettingsStore.php new file mode 100644 index 000000000..8d7b73c1c --- /dev/null +++ b/app/Settings/AppSettingsStore.php @@ -0,0 +1,91 @@ +imageRepo = $imageRepo; + } + + public function storeFromUpdateRequest(Request $request, string $category) + { + $this->storeSimpleSettings($request); + if ($category === 'customization') { + $this->updateAppLogo($request); + $this->updateAppIcon($request); + } + } + + protected function updateAppIcon(Request $request): void + { + $sizes = [180, 128, 64, 32]; + + // Update icon image if set + if ($request->hasFile('app_icon')) { + $iconFile = $request->file('app_icon'); + $this->destroyExistingSettingImage('app-icon'); + $image = $this->imageRepo->saveNew($iconFile, 'system', 0, 256, 256); + setting()->put('app-icon', $image->url); + + foreach ($sizes as $size) { + $this->destroyExistingSettingImage('app-icon-' . $size); + $icon = $this->imageRepo->saveNew($iconFile, 'system', 0, $size, $size); + setting()->put('app-icon-' . $size, $icon->url); + } + } + + // Clear icon image if requested + if ($request->get('app_icon_reset')) { + $this->destroyExistingSettingImage('app-icon'); + setting()->remove('app-icon'); + foreach ($sizes as $size) { + $this->destroyExistingSettingImage('app-icon-' . $size); + setting()->remove('app-icon-' . $size); + } + } + } + + protected function updateAppLogo(Request $request): void + { + // Update logo image if set + if ($request->hasFile('app_logo')) { + $logoFile = $request->file('app_logo'); + $this->destroyExistingSettingImage('app-logo'); + $image = $this->imageRepo->saveNew($logoFile, 'system', 0, null, 86); + setting()->put('app-logo', $image->url); + } + + // Clear logo image if requested + if ($request->get('app_logo_reset')) { + $this->destroyExistingSettingImage('app-logo'); + setting()->remove('app-logo'); + } + } + + protected function storeSimpleSettings(Request $request): void + { + foreach ($request->all() as $name => $value) { + if (strpos($name, 'setting-') !== 0) { + continue; + } + + $key = str_replace('setting-', '', trim($name)); + setting()->put($key, $value); + } + } + + protected function destroyExistingSettingImage(string $settingKey) + { + $existingVal = setting()->get($settingKey); + if ($existingVal) { + $this->imageRepo->destroyByUrlAndType($existingVal, 'system'); + } + } +} diff --git a/app/Settings/SettingService.php b/app/Settings/SettingService.php index 9f0a41ea2..d1bac164d 100644 --- a/app/Settings/SettingService.php +++ b/app/Settings/SettingService.php @@ -12,15 +12,11 @@ use Illuminate\Contracts\Cache\Repository as Cache; */ class SettingService { - protected $setting; - protected $cache; - protected $localCache = []; + protected Setting $setting; + protected Cache $cache; + protected array $localCache = []; + protected string $cachePrefix = 'setting-'; - protected $cachePrefix = 'setting-'; - - /** - * SettingService constructor. - */ public function __construct(Setting $setting, Cache $cache) { $this->setting = $setting; diff --git a/app/Translation/MessageSelector.php b/app/Translation/MessageSelector.php new file mode 100644 index 000000000..1a4771b3f --- /dev/null +++ b/app/Translation/MessageSelector.php @@ -0,0 +1,19 @@ +belongsTo(Page::class, 'uploaded_to'); } + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'uploaded_to') + ->where('joint_permissions.entity_type', '=', 'page'); + } + /** * Get the url of this file. */ diff --git a/app/Uploads/Image.php b/app/Uploads/Image.php index bdf10f080..c21a3b03f 100644 --- a/app/Uploads/Image.php +++ b/app/Uploads/Image.php @@ -2,10 +2,12 @@ namespace BookStack\Uploads; +use BookStack\Auth\Permissions\JointPermission; use BookStack\Entities\Models\Page; use BookStack\Model; use BookStack\Traits\HasCreatorAndUpdater; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; /** * @property int $id @@ -25,6 +27,12 @@ class Image extends Model protected $fillable = ['name']; protected $hidden = []; + public function jointPermissions(): HasMany + { + return $this->hasMany(JointPermission::class, 'entity_id', 'uploaded_to') + ->where('joint_permissions.entity_type', '=', 'page'); + } + /** * Get a thumbnail for this image. * diff --git a/app/Uploads/ImageRepo.php b/app/Uploads/ImageRepo.php index 8770402ad..2c643a58b 100644 --- a/app/Uploads/ImageRepo.php +++ b/app/Uploads/ImageRepo.php @@ -123,7 +123,10 @@ class ImageRepo public function saveNew(UploadedFile $uploadFile, string $type, int $uploadedTo = 0, int $resizeWidth = null, int $resizeHeight = null, bool $keepRatio = true): Image { $image = $this->imageService->saveNewFromUpload($uploadFile, $type, $uploadedTo, $resizeWidth, $resizeHeight, $keepRatio); - $this->loadThumbs($image); + + if ($type !== 'system') { + $this->loadThumbs($image); + } return $image; } @@ -180,13 +183,17 @@ class ImageRepo } /** - * Destroy all images of a certain type. + * Destroy images that have a specific URL and type combination. * * @throws Exception */ - public function destroyByType(string $imageType): void + public function destroyByUrlAndType(string $url, string $imageType): void { - $images = Image::query()->where('type', '=', $imageType)->get(); + $images = Image::query() + ->where('url', '=', $url) + ->where('type', '=', $imageType) + ->get(); + foreach ($images as $image) { $this->destroyImage($image); } diff --git a/app/Util/CspService.php b/app/Util/CspService.php index f9ab666ac..227ec8e0b 100644 --- a/app/Util/CspService.php +++ b/app/Util/CspService.php @@ -126,7 +126,7 @@ class CspService protected function getAllowedIframeHosts(): array { - $hosts = config('app.iframe_hosts', ''); + $hosts = config('app.iframe_hosts') ?? ''; return array_filter(explode(' ', $hosts)); } diff --git a/composer.lock b/composer.lock index c1a85651f..e58e2b109 100644 --- a/composer.lock +++ b/composer.lock @@ -58,16 +58,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.247.1", + "version": "3.257.5", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "337e447997148b9e5024c2d0ae69618b1cbf80d6" + "reference": "c600a07da531d6c29af791b9d2e8b6df796aa14b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/337e447997148b9e5024c2d0ae69618b1cbf80d6", - "reference": "337e447997148b9e5024c2d0ae69618b1cbf80d6", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c600a07da531d6c29af791b9d2e8b6df796aa14b", + "reference": "c600a07da531d6c29af791b9d2e8b6df796aa14b", "shasum": "" }, "require": { @@ -146,22 +146,22 @@ "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.247.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.257.5" }, - "time": "2022-11-22T19:23:34+00:00" + "time": "2023-01-20T19:34:14+00:00" }, { "name": "bacon/bacon-qr-code", - "version": "2.0.7", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "d70c840f68657ce49094b8d91f9ee0cc07fbf66c" + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/d70c840f68657ce49094b8d91f9ee0cc07fbf66c", - "reference": "d70c840f68657ce49094b8d91f9ee0cc07fbf66c", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", "shasum": "" }, "require": { @@ -200,9 +200,9 @@ "homepage": "https://github.com/Bacon/BaconQrCode", "support": { "issues": "https://github.com/Bacon/BaconQrCode/issues", - "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.7" + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" }, - "time": "2022-03-14T02:02:36+00:00" + "time": "2022-12-07T17:46:57+00:00" }, { "name": "barryvdh/laravel-dompdf", @@ -561,16 +561,16 @@ }, { "name": "doctrine/dbal", - "version": "3.5.1", + "version": "3.5.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5" + "reference": "88fa7e5189fd5ec6682477044264dc0ed4e3aa1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", - "reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/88fa7e5189fd5ec6682477044264dc0ed4e3aa1e", + "reference": "88fa7e5189fd5ec6682477044264dc0ed4e3aa1e", "shasum": "" }, "require": { @@ -583,16 +583,16 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "10.0.0", - "jetbrains/phpstorm-stubs": "2022.2", - "phpstan/phpstan": "1.8.10", + "doctrine/coding-standard": "11.0.0", + "jetbrains/phpstorm-stubs": "2022.3", + "phpstan/phpstan": "1.9.4", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "9.5.25", - "psalm/plugin-phpunit": "0.17.0", + "phpunit/phpunit": "9.5.27", + "psalm/plugin-phpunit": "0.18.4", "squizlabs/php_codesniffer": "3.7.1", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", - "vimeo/psalm": "4.29.0" + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -652,7 +652,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.5.1" + "source": "https://github.com/doctrine/dbal/tree/3.5.3" }, "funding": [ { @@ -668,7 +668,7 @@ "type": "tidelift" } ], - "time": "2022-10-24T07:26:18+00:00" + "time": "2023-01-12T10:21:44+00:00" }, { "name": "doctrine/deprecations", @@ -1787,16 +1787,16 @@ }, { "name": "laravel/framework", - "version": "v8.83.26", + "version": "v8.83.27", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "7411d9fa71c1b0fd73a33e225f14512b74e6c81e" + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/7411d9fa71c1b0fd73a33e225f14512b74e6c81e", - "reference": "7411d9fa71c1b0fd73a33e225f14512b74e6c81e", + "url": "https://api.github.com/repos/laravel/framework/zipball/e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", + "reference": "e1afe088b4ca613fb96dc57e6d8dbcb8cc2c6b49", "shasum": "" }, "require": { @@ -1956,7 +1956,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-11-01T14:48:50+00:00" + "time": "2022-12-08T15:28:55+00:00" }, { "name": "laravel/serializable-closure", @@ -2020,30 +2020,30 @@ }, { "name": "laravel/socialite", - "version": "v5.5.6", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "1cd1682b709b8808a5b5dbb68179a58d1342aa7b" + "reference": "dae03ca4ecfe3badafcdfb81965d2279080051f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/1cd1682b709b8808a5b5dbb68179a58d1342aa7b", - "reference": "1cd1682b709b8808a5b5dbb68179a58d1342aa7b", + "url": "https://api.github.com/repos/laravel/socialite/zipball/dae03ca4ecfe3badafcdfb81965d2279080051f4", + "reference": "dae03ca4ecfe3badafcdfb81965d2279080051f4", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", "league/oauth1-client": "^1.10.1", "php": "^7.2|^8.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0", + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0", "phpunit/phpunit": "^8.0|^9.3" }, "type": "library", @@ -2085,26 +2085,26 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2022-11-08T15:07:05+00:00" + "time": "2023-01-13T15:04:44+00:00" }, { "name": "laravel/tinker", - "version": "v2.7.3", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "5062061b4924af3392225dd482ca7b4d85d8b8ef" + "reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/5062061b4924af3392225dd482ca7b4d85d8b8ef", - "reference": "5062061b4924af3392225dd482ca7b4d85d8b8ef", + "url": "https://api.github.com/repos/laravel/tinker/zipball/74d0b287cc4ae65d15c368dd697aae71d62a73ad", + "reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.10.4|^0.11.1", "symfony/var-dumper": "^4.3.4|^5.0|^6.0" @@ -2114,7 +2114,7 @@ "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." }, "type": "library", "extra": { @@ -2151,9 +2151,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.3" + "source": "https://github.com/laravel/tinker/tree/v2.8.0" }, - "time": "2022-11-09T15:11:38+00:00" + "time": "2023-01-10T18:03:30+00:00" }, { "name": "league/commonmark", @@ -2932,16 +2932,16 @@ }, { "name": "nesbot/carbon", - "version": "2.63.0", + "version": "2.65.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347" + "reference": "09acf64155c16dc6f580f36569ae89344e9734a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad35dd71a6a212b98e4b87e97389b6fa85f0e347", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/09acf64155c16dc6f580f36569ae89344e9734a3", + "reference": "09acf64155c16dc6f580f36569ae89344e9734a3", "shasum": "" }, "require": { @@ -2952,7 +2952,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -3030,20 +3030,20 @@ "type": "tidelift" } ], - "time": "2022-10-30T18:34:28+00:00" + "time": "2023-01-06T15:55:01+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.2", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -3084,9 +3084,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2022-11-12T15:38:23+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "onelogin/php-saml", @@ -3493,16 +3493,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.17", + "version": "3.0.18", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "dbc2307d5c69aeb22db136c52e91130d7f2ca761" + "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/dbc2307d5c69aeb22db136c52e91130d7f2ca761", - "reference": "dbc2307d5c69aeb22db136c52e91130d7f2ca761", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f28693d38ba21bb0d9f0c411ee5dae2b178201da", + "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da", "shasum": "" }, "require": { @@ -3583,7 +3583,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.17" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.18" }, "funding": [ { @@ -3599,7 +3599,7 @@ "type": "tidelift" } ], - "time": "2022-10-24T10:51:50+00:00" + "time": "2022-12-17T18:26:50+00:00" }, { "name": "pragmarx/google2fa", @@ -4129,16 +4129,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.9", + "version": "v0.11.10", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "1acec99d6684a54ff92f8b548a4e41b566963778" + "reference": "e9eadffbed9c9deb5426fd107faae0452bf20a36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1acec99d6684a54ff92f8b548a4e41b566963778", - "reference": "1acec99d6684a54ff92f8b548a4e41b566963778", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e9eadffbed9c9deb5426fd107faae0452bf20a36", + "reference": "e9eadffbed9c9deb5426fd107faae0452bf20a36", "shasum": "" }, "require": { @@ -4199,9 +4199,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.9" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.10" }, - "time": "2022-11-06T15:29:46+00:00" + "time": "2022-12-23T17:47:18+00:00" }, { "name": "ralouphie/getallheaders", @@ -4249,42 +4249,53 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/ad7475d1c9e70b190ecffc58f2d989416af339b4", + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4", "shasum": "" }, "require": { - "php": "^7.3 || ^8", + "php": "^7.4 || ^8.0", "symfony/polyfill-php81": "^1.23" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -4312,7 +4323,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/1.3.0" }, "funding": [ { @@ -4324,7 +4335,7 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-27T19:12:24+00:00" }, { "name": "ramsey/uuid", @@ -4989,16 +5000,16 @@ }, { "name": "symfony/console", - "version": "v5.4.15", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669" + "reference": "58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ea59bb0edfaf9f28d18d8791410ee0355f317669", - "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669", + "url": "https://api.github.com/repos/symfony/console/zipball/58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f", + "reference": "58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f", "shasum": "" }, "require": { @@ -5068,7 +5079,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.15" + "source": "https://github.com/symfony/console/tree/v5.4.17" }, "funding": [ { @@ -5084,20 +5095,20 @@ "type": "tidelift" } ], - "time": "2022-10-26T21:41:52+00:00" + "time": "2022-12-28T14:15:31+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.11", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "c1681789f059ab756001052164726ae88512ae3d" + "reference": "052ef49b660f9ad2a3adb311c555c9bc11ba61f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", - "reference": "c1681789f059ab756001052164726ae88512ae3d", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/052ef49b660f9ad2a3adb311c555c9bc11ba61f4", + "reference": "052ef49b660f9ad2a3adb311c555c9bc11ba61f4", "shasum": "" }, "require": { @@ -5134,7 +5145,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.11" + "source": "https://github.com/symfony/css-selector/tree/v5.4.17" }, "funding": [ { @@ -5150,7 +5161,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2022-12-23T11:40:44+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5221,16 +5232,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.15", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "539cf1428b8442303c6e876ad7bf5a7babd91091" + "reference": "b900446552833ad2f91ca7dd52aa8ffe78f66cb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/539cf1428b8442303c6e876ad7bf5a7babd91091", - "reference": "539cf1428b8442303c6e876ad7bf5a7babd91091", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/b900446552833ad2f91ca7dd52aa8ffe78f66cb2", + "reference": "b900446552833ad2f91ca7dd52aa8ffe78f66cb2", "shasum": "" }, "require": { @@ -5272,7 +5283,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.15" + "source": "https://github.com/symfony/error-handler/tree/v5.4.17" }, "funding": [ { @@ -5288,20 +5299,20 @@ "type": "tidelift" } ], - "time": "2022-10-27T06:32:25+00:00" + "time": "2022-12-13T09:43:00+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "8e18a9d559eb8ebc2220588f1faa726a2fcd31c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e18a9d559eb8ebc2220588f1faa726a2fcd31c9", + "reference": "8e18a9d559eb8ebc2220588f1faa726a2fcd31c9", "shasum": "" }, "require": { @@ -5357,7 +5368,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.17" }, "funding": [ { @@ -5373,7 +5384,7 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:45:39+00:00" + "time": "2022-12-12T15:54:21+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5456,16 +5467,16 @@ }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "40c08632019838dfb3350f18cf5563b8080055fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/40c08632019838dfb3350f18cf5563b8080055fc", + "reference": "40c08632019838dfb3350f18cf5563b8080055fc", "shasum": "" }, "require": { @@ -5499,7 +5510,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.4.17" }, "funding": [ { @@ -5515,20 +5526,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2022-12-22T10:31:03+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.15", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "75bd663ff2db90141bfb733682459d5bbe9e29c3" + "reference": "b64a0e2df212d5849e4584cabff0cf09c5d6866a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/75bd663ff2db90141bfb733682459d5bbe9e29c3", - "reference": "75bd663ff2db90141bfb733682459d5bbe9e29c3", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b64a0e2df212d5849e4584cabff0cf09c5d6866a", + "reference": "b64a0e2df212d5849e4584cabff0cf09c5d6866a", "shasum": "" }, "require": { @@ -5575,7 +5586,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.15" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.17" }, "funding": [ { @@ -5591,20 +5602,20 @@ "type": "tidelift" } ], - "time": "2022-10-12T09:43:19+00:00" + "time": "2022-12-14T08:23:03+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.15", + "version": "v5.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "fc63c8c3e1036d424820cc993a4ea163778dc5c7" + "reference": "5da6f57a13e5d7d77197443cf55697cdf65f1352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fc63c8c3e1036d424820cc993a4ea163778dc5c7", - "reference": "fc63c8c3e1036d424820cc993a4ea163778dc5c7", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5da6f57a13e5d7d77197443cf55697cdf65f1352", + "reference": "5da6f57a13e5d7d77197443cf55697cdf65f1352", "shasum": "" }, "require": { @@ -5687,7 +5698,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.15" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.18" }, "funding": [ { @@ -5703,20 +5714,20 @@ "type": "tidelift" } ], - "time": "2022-10-28T17:52:18+00:00" + "time": "2022-12-29T18:54:08+00:00" }, { "name": "symfony/mime", - "version": "v5.4.14", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1c118b253bb3495d81e95a6e3ec6c2766a98a0c4" + "reference": "2a83d82efc91c3f03a23c8b47a896df168aa5c63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1c118b253bb3495d81e95a6e3ec6c2766a98a0c4", - "reference": "1c118b253bb3495d81e95a6e3ec6c2766a98a0c4", + "url": "https://api.github.com/repos/symfony/mime/zipball/2a83d82efc91c3f03a23c8b47a896df168aa5c63", + "reference": "2a83d82efc91c3f03a23c8b47a896df168aa5c63", "shasum": "" }, "require": { @@ -5771,7 +5782,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.14" + "source": "https://github.com/symfony/mime/tree/v5.4.17" }, "funding": [ { @@ -5787,7 +5798,7 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:01:20+00:00" + "time": "2022-12-13T09:59:55+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6670,16 +6681,16 @@ }, { "name": "symfony/routing", - "version": "v5.4.15", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "5c9b129efe9abce9470e384bf65d8a7e262eee69" + "reference": "4ce2df9a469c19ba45ca6aca04fec1c358a6e791" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/5c9b129efe9abce9470e384bf65d8a7e262eee69", - "reference": "5c9b129efe9abce9470e384bf65d8a7e262eee69", + "url": "https://api.github.com/repos/symfony/routing/zipball/4ce2df9a469c19ba45ca6aca04fec1c358a6e791", + "reference": "4ce2df9a469c19ba45ca6aca04fec1c358a6e791", "shasum": "" }, "require": { @@ -6694,7 +6705,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.12", + "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", "symfony/config": "^5.3|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", @@ -6740,7 +6751,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.15" + "source": "https://github.com/symfony/routing/tree/v5.4.17" }, "funding": [ { @@ -6756,7 +6767,7 @@ "type": "tidelift" } ], - "time": "2022-10-13T14:10:41+00:00" + "time": "2022-12-20T11:10:57+00:00" }, { "name": "symfony/service-contracts", @@ -6843,16 +6854,16 @@ }, { "name": "symfony/string", - "version": "v5.4.15", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" + "reference": "55733a8664b8853b003e70251c58bc8cb2d82a6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", - "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "url": "https://api.github.com/repos/symfony/string/zipball/55733a8664b8853b003e70251c58bc8cb2d82a6b", + "reference": "55733a8664b8853b003e70251c58bc8cb2d82a6b", "shasum": "" }, "require": { @@ -6909,7 +6920,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.15" + "source": "https://github.com/symfony/string/tree/v5.4.17" }, "funding": [ { @@ -6925,7 +6936,7 @@ "type": "tidelift" } ], - "time": "2022-10-05T15:16:54+00:00" + "time": "2022-12-12T15:54:21+00:00" }, { "name": "symfony/translation", @@ -7104,16 +7115,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.4.14", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "6894d06145fefebd9a4c7272baa026a1c394a430" + "reference": "ad74890513d07060255df2575703daf971de92c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6894d06145fefebd9a4c7272baa026a1c394a430", - "reference": "6894d06145fefebd9a4c7272baa026a1c394a430", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ad74890513d07060255df2575703daf971de92c7", + "reference": "ad74890513d07060255df2575703daf971de92c7", "shasum": "" }, "require": { @@ -7173,7 +7184,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.14" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.17" }, "funding": [ { @@ -7189,20 +7200,20 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:01:20+00:00" + "time": "2022-12-22T10:31:03+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.5", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", - "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", "shasum": "" }, "require": { @@ -7240,9 +7251,9 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" }, - "time": "2022-09-12T13:28:28+00:00" + "time": "2023-01-03T09:29:04+00:00" }, { "name": "vlucas/phpdotenv", @@ -7464,16 +7475,16 @@ "packages-dev": [ { "name": "brianium/paratest", - "version": "v6.6.5", + "version": "v6.8.1", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "31fd5d69b41725f383c9a083831eefcc7ecd9061" + "reference": "168c1cfdf79e5b19b57cb03060fc9a6a79c5f582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/31fd5d69b41725f383c9a083831eefcc7ecd9061", - "reference": "31fd5d69b41725f383c9a083831eefcc7ecd9061", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/168c1cfdf79e5b19b57cb03060fc9a6a79c5f582", + "reference": "168c1cfdf79e5b19b57cb03060fc9a6a79c5f582", "shasum": "" }, "require": { @@ -7481,25 +7492,25 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", + "fidry/cpu-core-counter": "^0.4.1", "jean85/pretty-package-versions": "^2.0.5", "php": "^7.3 || ^8.0", - "phpunit/php-code-coverage": "^9.2.17", + "phpunit/php-code-coverage": "^9.2.23", "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-timer": "^5.0.3", - "phpunit/phpunit": "^9.5.24", + "phpunit/phpunit": "^9.5.28", "sebastian/environment": "^5.1.4", - "symfony/console": "^5.4.12 || ^6.1.4", - "symfony/process": "^5.4.11 || ^6.1.3" + "symfony/console": "^5.4.16 || ^6.2.3", + "symfony/process": "^5.4.11 || ^6.2" }, "require-dev": { "doctrine/coding-standard": "^10.0.0", "ext-pcov": "*", "ext-posix": "*", - "infection/infection": "^0.26.14", - "malukenho/mcbumpface": "^1.1.5", + "infection/infection": "^0.26.16", "squizlabs/php_codesniffer": "^3.7.1", - "symfony/filesystem": "^5.4.12 || ^6.1.4", - "vimeo/psalm": "^4.27.0" + "symfony/filesystem": "^5.4.13 || ^6.2", + "vimeo/psalm": "^5.4" }, "bin": [ "bin/paratest", @@ -7540,7 +7551,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v6.6.5" + "source": "https://github.com/paratestphp/paratest/tree/v6.8.1" }, "funding": [ { @@ -7552,20 +7563,20 @@ "type": "paypal" } ], - "time": "2022-10-28T12:22:26+00:00" + "time": "2023-01-17T10:08:49+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.4", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", "shasum": "" }, "require": { @@ -7612,7 +7623,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.4" + "source": "https://github.com/composer/ca-bundle/tree/1.3.5" }, "funding": [ { @@ -7628,7 +7639,7 @@ "type": "tidelift" } ], - "time": "2022-10-12T12:08:29+00:00" + "time": "2023-01-11T08:27:00+00:00" }, { "name": "composer/class-map-generator", @@ -7705,23 +7716,23 @@ }, { "name": "composer/composer", - "version": "2.4.4", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e8d9087229bcdbc5867594d3098091412f1130cf" + "reference": "923278ad13e1621946eb76ab2882655d2cc396a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e8d9087229bcdbc5867594d3098091412f1130cf", - "reference": "e8d9087229bcdbc5867594d3098091412f1130cf", + "url": "https://api.github.com/repos/composer/composer/zipball/923278ad13e1621946eb76ab2882655d2cc396a4", + "reference": "923278ad13e1621946eb76ab2882655d2cc396a4", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", + "composer/pcre": "^2.1 || ^3.1", "composer/semver": "^3.0", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", @@ -7737,10 +7748,11 @@ "symfony/finder": "^5.4 || ^6.0", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan": "^1.9.3", "phpstan/phpstan-deprecation-rules": "^1", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1", @@ -7758,7 +7770,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "phpstan": { "includes": [ @@ -7797,7 +7809,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.4" + "source": "https://github.com/composer/composer/tree/2.5.1" }, "funding": [ { @@ -7813,7 +7825,7 @@ "type": "tidelift" } ], - "time": "2022-10-27T12:39:29+00:00" + "time": "2022-12-22T14:33:54+00:00" }, { "name": "composer/metadata-minifier", @@ -8184,30 +8196,30 @@ }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -8234,7 +8246,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -8250,7 +8262,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "facade/ignition-contracts", @@ -8307,20 +8319,20 @@ }, { "name": "fakerphp/faker", - "version": "v1.20.0", + "version": "v1.21.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b" + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b", - "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "php": "^7.4 || ^8.0", "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, @@ -8331,7 +8343,8 @@ "bamarni/composer-bin-plugin": "^1.4.1", "doctrine/persistence": "^1.3 || ^2.0", "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, "suggest": { "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", @@ -8343,7 +8356,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "v1.20-dev" + "dev-main": "v1.21-dev" } }, "autoload": { @@ -8368,9 +8381,70 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.20.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" }, - "time": "2022-07-20T13:12:54+00:00" + "time": "2022-12-13T13:54:32+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "0.4.1", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "79261cc280aded96d098e1b0e0ba0c4881b432c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/79261cc280aded96d098e1b0e0ba0c4881b432c2", + "reference": "79261cc280aded96d098e1b0e0ba0c4881b432c2", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.26 || ^8.5.31", + "theofidry/php-cs-fixer-config": "^1.0", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/0.4.1" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2022-12-16T22:01:02+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8425,16 +8499,16 @@ }, { "name": "itsgoingd/clockwork", - "version": "v5.1.11", + "version": "v5.1.12", "source": { "type": "git", "url": "https://github.com/itsgoingd/clockwork.git", - "reference": "a790200347f0c6d07e2fca252ccb446df87520c6" + "reference": "c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/a790200347f0c6d07e2fca252ccb446df87520c6", - "reference": "a790200347f0c6d07e2fca252ccb446df87520c6", + "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b", + "reference": "c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b", "shasum": "" }, "require": { @@ -8481,7 +8555,7 @@ ], "support": { "issues": "https://github.com/itsgoingd/clockwork/issues", - "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.11" + "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.12" }, "funding": [ { @@ -8489,7 +8563,7 @@ "type": "github" } ], - "time": "2022-11-02T21:11:04+00:00" + "time": "2022-12-13T00:04:12+00:00" }, { "name": "jean85/pretty-package-versions", @@ -9108,16 +9182,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.19", + "version": "9.2.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", - "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", "shasum": "" }, "require": { @@ -9173,7 +9247,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" }, "funding": [ { @@ -9181,7 +9255,7 @@ "type": "github" } ], - "time": "2022-11-18T07:47:47+00:00" + "time": "2022-12-28T12:41:10+00:00" }, { "name": "phpunit/php-file-iterator", @@ -9426,20 +9500,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.26", + "version": "9.5.28", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" + "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e", + "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -9508,7 +9582,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28" }, "funding": [ { @@ -9524,7 +9598,7 @@ "type": "tidelift" } ], - "time": "2022-10-28T06:00:21+00:00" + "time": "2023-01-14T12:32:24+00:00" }, { "name": "react/promise", @@ -10853,16 +10927,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v5.4.15", + "version": "v5.4.17", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b8fd0ff9a0f00d944f1534f6d21e84f92eda7258" + "reference": "32a07d910edc138a1dd5508c17c6b9bc1eb27a1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b8fd0ff9a0f00d944f1534f6d21e84f92eda7258", - "reference": "b8fd0ff9a0f00d944f1534f6d21e84f92eda7258", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/32a07d910edc138a1dd5508c17c6b9bc1eb27a1b", + "reference": "32a07d910edc138a1dd5508c17c6b9bc1eb27a1b", "shasum": "" }, "require": { @@ -10908,7 +10982,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.4.15" + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.17" }, "funding": [ { @@ -10924,7 +10998,7 @@ "type": "tidelift" } ], - "time": "2022-10-27T08:04:35+00:00" + "time": "2022-12-22T10:31:03+00:00" }, { "name": "symfony/filesystem", diff --git a/database/factories/Actions/TagFactory.php b/database/factories/Actions/TagFactory.php index 8d5c77e09..8b9c529f2 100644 --- a/database/factories/Actions/TagFactory.php +++ b/database/factories/Actions/TagFactory.php @@ -21,7 +21,7 @@ class TagFactory extends Factory public function definition() { return [ - 'name' => $this->faker->city, + 'name' => $this->faker->city(), 'value' => $this->faker->sentence(3), ]; } diff --git a/database/factories/Actions/WebhookFactory.php b/database/factories/Actions/WebhookFactory.php index 662f64f8b..c7393b32c 100644 --- a/database/factories/Actions/WebhookFactory.php +++ b/database/factories/Actions/WebhookFactory.php @@ -18,7 +18,7 @@ class WebhookFactory extends Factory { return [ 'name' => 'My webhook for ' . $this->faker->country(), - 'endpoint' => $this->faker->url, + 'endpoint' => $this->faker->url(), 'active' => true, 'timeout' => 3, ]; diff --git a/database/factories/Auth/UserFactory.php b/database/factories/Auth/UserFactory.php index 805782fd8..6ff62a975 100644 --- a/database/factories/Auth/UserFactory.php +++ b/database/factories/Auth/UserFactory.php @@ -22,11 +22,11 @@ class UserFactory extends Factory */ public function definition() { - $name = $this->faker->name; + $name = $this->faker->name(); return [ 'name' => $name, - 'email' => $this->faker->email, + 'email' => $this->faker->email(), 'slug' => Str::slug($name . '-' . Str::random(5)), 'password' => Str::random(10), 'remember_token' => Str::random(10), diff --git a/database/factories/Entities/Models/BookFactory.php b/database/factories/Entities/Models/BookFactory.php index 0613800a1..3bf157786 100644 --- a/database/factories/Entities/Models/BookFactory.php +++ b/database/factories/Entities/Models/BookFactory.php @@ -22,9 +22,9 @@ class BookFactory extends Factory public function definition() { return [ - 'name' => $this->faker->sentence, + 'name' => $this->faker->sentence(), 'slug' => Str::random(10), - 'description' => $this->faker->paragraph, + 'description' => $this->faker->paragraph(), ]; } } diff --git a/database/factories/Entities/Models/ChapterFactory.php b/database/factories/Entities/Models/ChapterFactory.php index 4fcd69c39..36379866e 100644 --- a/database/factories/Entities/Models/ChapterFactory.php +++ b/database/factories/Entities/Models/ChapterFactory.php @@ -22,9 +22,9 @@ class ChapterFactory extends Factory public function definition() { return [ - 'name' => $this->faker->sentence, + 'name' => $this->faker->sentence(), 'slug' => Str::random(10), - 'description' => $this->faker->paragraph, + 'description' => $this->faker->paragraph(), ]; } } diff --git a/database/factories/Entities/Models/PageFactory.php b/database/factories/Entities/Models/PageFactory.php index c83e0f828..319d97880 100644 --- a/database/factories/Entities/Models/PageFactory.php +++ b/database/factories/Entities/Models/PageFactory.php @@ -24,7 +24,7 @@ class PageFactory extends Factory $html = '

' . implode('

', $this->faker->paragraphs(5)) . '

'; return [ - 'name' => $this->faker->sentence, + 'name' => $this->faker->sentence(), 'slug' => Str::random(10), 'html' => $html, 'text' => strip_tags($html), diff --git a/database/factories/Uploads/ImageFactory.php b/database/factories/Uploads/ImageFactory.php index c6d0e0801..b66c0a52c 100644 --- a/database/factories/Uploads/ImageFactory.php +++ b/database/factories/Uploads/ImageFactory.php @@ -21,9 +21,9 @@ class ImageFactory extends Factory public function definition() { return [ - 'name' => $this->faker->slug . '.jpg', - 'url' => $this->faker->url, - 'path' => $this->faker->url, + 'name' => $this->faker->slug() . '.jpg', + 'url' => $this->faker->url(), + 'path' => $this->faker->url(), 'type' => 'gallery', 'uploaded_to' => 0, ]; diff --git a/database/migrations/2023_01_24_104625_refactor_joint_permissions_storage.php b/database/migrations/2023_01_24_104625_refactor_joint_permissions_storage.php new file mode 100644 index 000000000..0f73f456b --- /dev/null +++ b/database/migrations/2023_01_24_104625_refactor_joint_permissions_storage.php @@ -0,0 +1,52 @@ +truncate(); + + if (Schema::hasColumn('joint_permissions', 'owned_by')) { + Schema::table('joint_permissions', function (Blueprint $table) { + $table->dropColumn(['has_permission', 'has_permission_own', 'owned_by']); + + $table->unsignedTinyInteger('status')->index(); + $table->unsignedInteger('owner_id')->nullable()->index(); + }); + } + + // Rebuild permissions + app(JointPermissionBuilder::class)->rebuildForAll(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + DB::table('joint_permissions')->truncate(); + + Schema::table('joint_permissions', function (Blueprint $table) { + $table->dropColumn(['status', 'owner_id']); + + $table->boolean('has_permission')->index(); + $table->boolean('has_permission_own')->index(); + $table->unsignedInteger('owned_by')->index(); + }); + } +} diff --git a/database/migrations/2023_01_28_141230_copy_color_settings_for_dark_mode.php b/database/migrations/2023_01_28_141230_copy_color_settings_for_dark_mode.php new file mode 100644 index 000000000..eb779fc7b --- /dev/null +++ b/database/migrations/2023_01_28_141230_copy_color_settings_for_dark_mode.php @@ -0,0 +1,69 @@ +whereIn('setting_key', $colorSettings) + ->get()->toArray(); + + $newData = []; + foreach ($existing as $setting) { + $newSetting = (array) $setting; + $newSetting['setting_key'] .= '-dark'; + $newData[] = $newSetting; + + if ($newSetting['setting_key'] === 'app-color-dark') { + $newSetting['setting_key'] = 'link-color'; + $newData[] = $newSetting; + $newSetting['setting_key'] = 'link-color-dark'; + $newData[] = $newSetting; + } + } + + DB::table('settings')->insert($newData); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $colorSettings = [ + 'app-color-dark', + 'link-color', + 'link-color-dark', + 'app-color-light-dark', + 'bookshelf-color-dark', + 'book-color-dark', + 'chapter-color-dark', + 'page-color-dark', + 'page-draft-color-dark', + ]; + + DB::table('settings') + ->whereIn('setting_key', $colorSettings) + ->delete(); + } +} diff --git a/dev/docs/development.md b/dev/docs/development.md index 1611de578..b68f2664a 100644 --- a/dev/docs/development.md +++ b/dev/docs/development.md @@ -29,6 +29,8 @@ The testing database will also need migrating and seeding beforehand. This can b Once done you can run `composer test` in the application root directory to run all tests. Tests can be ran in parallel by running them via `composer t`. This will use Laravel's built-in parallel testing functionality, and attempt to create and seed a database instance for each testing thread. If required these parallel testing instances can be reset, before testing again, by running `composer t-reset`. +If the codebase needs to be tested with deprecations, this can be done via uncommenting the relevant line within the TestCase@setUp function. + ## Code Standards PHP code standards are managed by [using PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer). diff --git a/dev/docs/permission-scenario-testing.md b/dev/docs/permission-scenario-testing.md new file mode 100644 index 000000000..0a910d203 --- /dev/null +++ b/dev/docs/permission-scenario-testing.md @@ -0,0 +1,363 @@ +# Permission Scenario Testing + +Due to complexity that can arise in the various combinations of permissions, this document details scenarios and their expected results. + +Test cases are written ability abstract, since all abilities should act the same in theory. Functional test cases may test abilities separate due to implementation differences. + +Tests are categorised by the most specific element involved in the scenario, where the below list is most specific to least: + +- Role entity permissions. +- Fallback entity permissions. +- Role permissions. + +## General Permission Logical Rules + +The below are some general rules we follow to standardise the behaviour of permissions in the platform: + +- Most specific permission application (as above) take priority and can deny less specific permissions. +- Parent role entity permissions that may be inherited, are considered to essentially be applied on the item they are inherited to unless a lower level has its own permission rule for an already specific role. +- Where both grant and deny exist at the same specificity, we side towards grant. + +## Cases + +### Content Role Permissions + +These are tests related to item/entity permissions that are set only at a role level. + +#### test_01_allow + +- Role A has role all-page permission. +- User has Role A. + +User granted page permission. + +#### test_02_deny + +- Role A has no page permission. +- User has Role A. + +User denied page permission. + +#### test_10_allow_on_own_with_own + +- Role A has role own-page permission. +- User has Role A. +- User is owner of page. + +User granted page permission. + +#### test_11_deny_on_other_with_own + +- Role A has role own-page permission. +- User has Role A. +- User is not owner of page. + +User denied page permission. + +#### test_20_multiple_role_conflicting_all + +- Role A has role all-page permission. +- Role B has no page permission. +- User has Role A & B. + +User granted page permission. + +#### test_21_multiple_role_conflicting_own + +- Role A has role own-page permission. +- Role B has no page permission. +- User has Role A & B. +- User is owner of page. + +User granted page permission. + +--- + +### Entity Role Permissions + +These are tests related to entity-level role-specific permission overrides. + +#### test_01_explicit_allow + +- Page permissions have inherit disabled. +- Role A has entity allow page permission. +- User has Role A. + +User granted page permission. + +#### test_02_explicit_deny + +- Page permissions have inherit disabled. +- Role A has entity deny page permission. +- User has Role A. + +User denied page permission. + +#### test_03_same_level_conflicting + +- Page permissions have inherit disabled. +- Role A has entity allow page permission. +- Role B has entity deny page permission. +- User has both Role A & B. + +User granted page permission. +Explicit grant overrides entity deny at same level. + +#### test_20_inherit_allow + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity allow chapter permission. +- User has Role A. + +User granted page permission. + +#### test_21_inherit_deny + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity deny chapter permission. +- User has Role A. + +User denied page permission. + +#### test_22_same_level_conflict_inherit + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity deny chapter permission. +- Role B has entity allow chapter permission. +- User has both Role A & B. + +User granted page permission. + +#### test_30_child_inherit_override_allow + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity deny chapter permission. +- Role A has entity allow page permission. +- User has Role A. + +User granted page permission. + +#### test_31_child_inherit_override_deny + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity allow chapter permission. +- Role A has entity deny page permission. +- User has Role A. + +User denied page permission. + +#### test_40_multi_role_inherit_conflict_override_deny + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity deny page permission. +- Role B has entity allow chapter permission. +- User has Role A & B. + +User granted page permission. + +#### test_41_multi_role_inherit_conflict_retain_allow + +- Page permissions have inherit enabled. +- Chapter permissions has inherit disabled. +- Role A has entity allow page permission. +- Role B has entity deny chapter permission. +- User has Role A & B. + +User granted page permission. + +#### test_50_role_override_allow + +- Page permissions have inherit enabled. +- Role A has no page role permission. +- Role A has entity allow page permission. +- User has Role A. + +User granted page permission. + +#### test_51_role_override_deny + +- Page permissions have inherit enabled. +- Role A has no page-view-all role permission. +- Role A has entity deny page permission. +- User has Role A. + +User denied page permission. + +#### test_60_inherited_role_override_allow + +- Page permissions have inherit enabled. +- Chapter permissions have inherit enabled. +- Role A has no page role permission. +- Role A has entity allow chapter permission. +- User has Role A. + +User granted page permission. + +#### test_61_inherited_role_override_deny + +- Page permissions have inherit enabled. +- Chapter permissions have inherit enabled. +- Role A has page role permission. +- Role A has entity denied chapter permission. +- User has Role A. + +User denied page permission. + +#### test_62_inherited_role_override_deny_on_own + +- Page permissions have inherit enabled. +- Chapter permissions have inherit enabled. +- Role A has own-page role permission. +- Role A has entity denied chapter permission. +- User has Role A. +- User owns Page. + +User denied page permission. + +#### test_70_multi_role_inheriting_deny + +- Page permissions have inherit enabled. +- Role A has all page role permission. +- Role B has entity denied page permission. +- User has Role A and B. + +User denied page permission. + +#### test_71_multi_role_inheriting_deny_on_own + +- Page permissions have inherit enabled. +- Role A has own page role permission. +- Role B has entity denied page permission. +- User has Role A and B. +- Use owns Page. + +User denied page permission. + +#### test_75_multi_role_inherited_deny_via_parent + +- Page permissions have inherit enabled. +- Chapter permissions have inherit enabled. +- Role A has all-pages role permission. +- Role B has entity denied chapter permission. +- User has Role A & B. + +User denied page permission. + +#### test_76_multi_role_inherited_deny_via_parent_on_own + +- Page permissions have inherit enabled. +- Chapter permissions have inherit enabled. +- Role A has own page role permission. +- Role B has entity denied chapter permission. +- User has Role A & B. + +User denied page permission. + +#### test_80_fallback_override_allow + +- Page permissions have inherit disabled. +- Page fallback has entity deny permission. +- Role A has entity allow page permission. +- User has Role A. + +User granted page permission. + +#### test_81_fallback_override_deny + +- Page permissions have inherit disabled. +- Page fallback has entity allow permission. +- Role A has entity deny page permission. +- User has Role A. + +User denied page permission. + +#### test_84_fallback_override_allow_multi_role + +- Page permissions have inherit disabled. +- Page fallback has entity deny permission. +- Role A has entity allow page permission. +- Role B has no entity page permissions. +- User has Role A & B. + +User granted page permission. + +#### test_85_fallback_override_deny_multi_role + +- Page permissions have inherit disabled. +- Page fallback has entity allow permission. +- Role A has entity deny page permission. +- Role B has no entity page permissions. +- User has Role A & B. + +User denied page permission. + +#### test_86_fallback_override_allow_inherit + +- Chapter permissions have inherit disabled. +- Page permissions have inherit enabled. +- Chapter fallback has entity deny permission. +- Role A has entity allow chapter permission. +- User has Role A. + +User granted page permission. + +#### test_87_fallback_override_deny_inherit + +- Chapter permissions have inherit disabled. +- Page permissions have inherit enabled. +- Chapter fallback has entity allow permission. +- Role A has entity deny chapter permission. +- User has Role A. + +User denied page permission. + +#### test_88_fallback_override_allow_multi_role_inherit + +- Chapter permissions have inherit disabled. +- Page permissions have inherit enabled. +- Chapter fallback has entity deny permission. +- Role A has entity allow chapter permission. +- Role B has no entity chapter permissions. +- User has Role A & B. + +User granted page permission. + +#### test_89_fallback_override_deny_multi_role_inherit + +- Chapter permissions have inherit disabled. +- Page permissions have inherit enabled. +- Chapter fallback has entity allow permission. +- Role A has entity deny chapter permission. +- Role B has no entity chapter permissions. +- User has Role A & B. + +User denied page permission. + +#### test_90_fallback_overrides_parent_entity_role_deny + +- Chapter permissions have inherit disabled. +- Page permissions have inherit disabled. +- Chapter fallback has entity deny permission. +- Page fallback has entity deny permission. +- Role A has entity allow chapter permission. +- User has Role A. + +User denied page permission. + +#### test_91_fallback_overrides_parent_entity_role_inherit + +- Book permissions have inherit disabled. +- Chapter permissions have inherit disabled. +- Page permissions have inherit enabled. +- Book fallback has entity deny permission. +- Chapter fallback has entity deny permission. +- Role A has entity allow book permission. +- User has Role A. + +User denied page permission. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dbe0f90d2..eff4bea7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,22 +10,22 @@ "dropzone": "^5.9.3", "markdown-it": "^13.0.1", "markdown-it-task-lists": "^2.1.1", - "snabbdom": "^3.5.0", + "snabbdom": "^3.5.1", "sortablejs": "^1.15.0" }, "devDependencies": { "chokidar-cli": "^3.0", - "esbuild": "^0.15.12", + "esbuild": "^0.17.3", "livereload": "^0.9.3", "npm-run-all": "^4.1.5", - "punycode": "^2.1.1", - "sass": "^1.55.0" + "punycode": "^2.3.0", + "sass": "^1.57.0" } }, "node_modules/@esbuild/android-arm": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz", - "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", + "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", "cpu": [ "arm" ], @@ -38,10 +38,154 @@ "node": ">=12" } }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", + "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", + "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", + "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", + "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", + "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", + "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", + "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", + "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", + "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz", - "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", + "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", "cpu": [ "loong64" ], @@ -54,6 +198,182 @@ "node": ">=12" } }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", + "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", + "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", + "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", + "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", + "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", + "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", + "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", + "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", + "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", + "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", + "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", @@ -391,9 +711,9 @@ } }, "node_modules/esbuild": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz", - "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", + "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", "dev": true, "hasInstallScript": true, "bin": { @@ -403,348 +723,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.12", - "@esbuild/linux-loong64": "0.15.12", - "esbuild-android-64": "0.15.12", - "esbuild-android-arm64": "0.15.12", - "esbuild-darwin-64": "0.15.12", - "esbuild-darwin-arm64": "0.15.12", - "esbuild-freebsd-64": "0.15.12", - "esbuild-freebsd-arm64": "0.15.12", - "esbuild-linux-32": "0.15.12", - "esbuild-linux-64": "0.15.12", - "esbuild-linux-arm": "0.15.12", - "esbuild-linux-arm64": "0.15.12", - "esbuild-linux-mips64le": "0.15.12", - "esbuild-linux-ppc64le": "0.15.12", - "esbuild-linux-riscv64": "0.15.12", - "esbuild-linux-s390x": "0.15.12", - "esbuild-netbsd-64": "0.15.12", - "esbuild-openbsd-64": "0.15.12", - "esbuild-sunos-64": "0.15.12", - "esbuild-windows-32": "0.15.12", - "esbuild-windows-64": "0.15.12", - "esbuild-windows-arm64": "0.15.12" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz", - "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz", - "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz", - "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz", - "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz", - "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz", - "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz", - "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz", - "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz", - "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz", - "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz", - "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz", - "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz", - "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz", - "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz", - "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz", - "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz", - "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz", - "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz", - "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz", - "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.17.3", + "@esbuild/android-arm64": "0.17.3", + "@esbuild/android-x64": "0.17.3", + "@esbuild/darwin-arm64": "0.17.3", + "@esbuild/darwin-x64": "0.17.3", + "@esbuild/freebsd-arm64": "0.17.3", + "@esbuild/freebsd-x64": "0.17.3", + "@esbuild/linux-arm": "0.17.3", + "@esbuild/linux-arm64": "0.17.3", + "@esbuild/linux-ia32": "0.17.3", + "@esbuild/linux-loong64": "0.17.3", + "@esbuild/linux-mips64el": "0.17.3", + "@esbuild/linux-ppc64": "0.17.3", + "@esbuild/linux-riscv64": "0.17.3", + "@esbuild/linux-s390x": "0.17.3", + "@esbuild/linux-x64": "0.17.3", + "@esbuild/netbsd-x64": "0.17.3", + "@esbuild/openbsd-x64": "0.17.3", + "@esbuild/sunos-x64": "0.17.3", + "@esbuild/win32-arm64": "0.17.3", + "@esbuild/win32-ia32": "0.17.3", + "@esbuild/win32-x64": "0.17.3" } }, "node_modules/escape-string-regexp": { @@ -1551,9 +1551,9 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -1649,9 +1649,9 @@ } }, "node_modules/sass": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", - "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -2040,16 +2040,156 @@ }, "dependencies": { "@esbuild/android-arm": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz", - "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", + "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", + "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", + "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", + "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", + "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", + "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", + "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", + "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", + "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", + "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz", - "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", + "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", + "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", + "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", + "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", + "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", + "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", + "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", + "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", + "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", + "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", + "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", + "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", "dev": true, "optional": true }, @@ -2319,175 +2459,35 @@ } }, "esbuild": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz", - "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", + "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", "dev": true, "requires": { - "@esbuild/android-arm": "0.15.12", - "@esbuild/linux-loong64": "0.15.12", - "esbuild-android-64": "0.15.12", - "esbuild-android-arm64": "0.15.12", - "esbuild-darwin-64": "0.15.12", - "esbuild-darwin-arm64": "0.15.12", - "esbuild-freebsd-64": "0.15.12", - "esbuild-freebsd-arm64": "0.15.12", - "esbuild-linux-32": "0.15.12", - "esbuild-linux-64": "0.15.12", - "esbuild-linux-arm": "0.15.12", - "esbuild-linux-arm64": "0.15.12", - "esbuild-linux-mips64le": "0.15.12", - "esbuild-linux-ppc64le": "0.15.12", - "esbuild-linux-riscv64": "0.15.12", - "esbuild-linux-s390x": "0.15.12", - "esbuild-netbsd-64": "0.15.12", - "esbuild-openbsd-64": "0.15.12", - "esbuild-sunos-64": "0.15.12", - "esbuild-windows-32": "0.15.12", - "esbuild-windows-64": "0.15.12", - "esbuild-windows-arm64": "0.15.12" + "@esbuild/android-arm": "0.17.3", + "@esbuild/android-arm64": "0.17.3", + "@esbuild/android-x64": "0.17.3", + "@esbuild/darwin-arm64": "0.17.3", + "@esbuild/darwin-x64": "0.17.3", + "@esbuild/freebsd-arm64": "0.17.3", + "@esbuild/freebsd-x64": "0.17.3", + "@esbuild/linux-arm": "0.17.3", + "@esbuild/linux-arm64": "0.17.3", + "@esbuild/linux-ia32": "0.17.3", + "@esbuild/linux-loong64": "0.17.3", + "@esbuild/linux-mips64el": "0.17.3", + "@esbuild/linux-ppc64": "0.17.3", + "@esbuild/linux-riscv64": "0.17.3", + "@esbuild/linux-s390x": "0.17.3", + "@esbuild/linux-x64": "0.17.3", + "@esbuild/netbsd-x64": "0.17.3", + "@esbuild/openbsd-x64": "0.17.3", + "@esbuild/sunos-x64": "0.17.3", + "@esbuild/win32-arm64": "0.17.3", + "@esbuild/win32-ia32": "0.17.3", + "@esbuild/win32-x64": "0.17.3" } }, - "esbuild-android-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz", - "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz", - "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz", - "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz", - "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz", - "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz", - "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz", - "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz", - "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz", - "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz", - "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz", - "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz", - "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz", - "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz", - "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz", - "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz", - "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz", - "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz", - "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz", - "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz", - "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==", - "dev": true, - "optional": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -3067,9 +3067,9 @@ "dev": true }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "read-pkg": { @@ -3138,9 +3138,9 @@ } }, "sass": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", - "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", diff --git a/package.json b/package.json index 9abdcc346..89fb07492 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,11 @@ }, "devDependencies": { "chokidar-cli": "^3.0", - "esbuild": "^0.15.12", + "esbuild": "^0.17.3", "livereload": "^0.9.3", "npm-run-all": "^4.1.5", - "punycode": "^2.1.1", - "sass": "^1.55.0" + "punycode": "^2.3.0", + "sass": "^1.57.0" }, "dependencies": { "clipboard": "^2.0.11", @@ -28,7 +28,7 @@ "dropzone": "^5.9.3", "markdown-it": "^13.0.1", "markdown-it-task-lists": "^2.1.1", - "snabbdom": "^3.5.0", + "snabbdom": "^3.5.1", "sortablejs": "^1.15.0" } } diff --git a/public/icon-128.png b/public/icon-128.png new file mode 100644 index 000000000..46cc2811b Binary files /dev/null and b/public/icon-128.png differ diff --git a/public/icon-32.png b/public/icon-32.png new file mode 100644 index 000000000..7307ed8f1 Binary files /dev/null and b/public/icon-32.png differ diff --git a/public/icon-64.png b/public/icon-64.png new file mode 100644 index 000000000..854d80faa Binary files /dev/null and b/public/icon-64.png differ diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 000000000..b9f0125a8 Binary files /dev/null and b/public/icon.png differ diff --git a/readme.md b/readme.md index b8bd17232..8b3af303e 100644 --- a/readme.md +++ b/readme.md @@ -45,7 +45,7 @@ Note: Listed services are not tested, vetted nor supported by the official BookS Diagrams.net - Cloudabove + Cloudabove @@ -55,6 +55,9 @@ Note: Listed services are not tested, vetted nor supported by the official BookS Stellar Hosted + + Stellar Hosted + ## 🛣️ Road Map diff --git a/resources/js/code.mjs b/resources/js/code.mjs index 8d8062689..9adc23b1f 100644 --- a/resources/js/code.mjs +++ b/resources/js/code.mjs @@ -25,6 +25,7 @@ import 'codemirror/mode/properties/properties'; import 'codemirror/mode/python/python'; import 'codemirror/mode/ruby/ruby'; import 'codemirror/mode/rust/rust'; +import 'codemirror/mode/scheme/scheme'; import 'codemirror/mode/shell/shell'; import 'codemirror/mode/smarty/smarty'; import 'codemirror/mode/sql/sql'; @@ -76,6 +77,8 @@ const modeMap = { mdown: 'markdown', markdown: 'markdown', ml: 'mllike', + mssql: 'text/x-mssql', + mysql: 'text/x-mysql', nginx: 'nginx', octave: 'text/x-octave', perl: 'perl', @@ -88,16 +91,21 @@ const modeMap = { php: (content) => { return content.includes(' { this.list.innerHTML = resp.data; window.$components.init(this.list); diff --git a/resources/js/components/book-sort.js b/resources/js/components/book-sort.js index 3ffadf991..5ae283fd0 100644 --- a/resources/js/components/book-sort.js +++ b/resources/js/components/book-sort.js @@ -1,4 +1,4 @@ -import Sortable from "sortablejs"; +import Sortable, {MultiDrag} from "sortablejs"; import {Component} from "./component"; import {htmlToDom} from "../services/dom"; @@ -37,6 +37,113 @@ const sortOperations = { }, }; +/** + * The available move actions. + * The active function indicates if the action is possible for the given item. + * The run function performs the move. + * @type {{up: {active(Element, ?Element, Element): boolean, run(Element, ?Element, Element)}}} + */ +const moveActions = { + up: { + active(elem, parent, book) { + return !(elem.previousElementSibling === null && !parent); + }, + run(elem, parent, book) { + const newSibling = elem.previousElementSibling || parent; + newSibling.insertAdjacentElement('beforebegin', elem); + } + }, + down: { + active(elem, parent, book) { + return !(elem.nextElementSibling === null && !parent); + }, + run(elem, parent, book) { + const newSibling = elem.nextElementSibling || parent; + newSibling.insertAdjacentElement('afterend', elem); + } + }, + next_book: { + active(elem, parent, book) { + return book.nextElementSibling !== null; + }, + run(elem, parent, book) { + const newList = book.nextElementSibling.querySelector('ul'); + newList.prepend(elem); + } + }, + prev_book: { + active(elem, parent, book) { + return book.previousElementSibling !== null; + }, + run(elem, parent, book) { + const newList = book.previousElementSibling.querySelector('ul'); + newList.appendChild(elem); + } + }, + next_chapter: { + active(elem, parent, book) { + return elem.dataset.type === 'page' && this.getNextChapter(elem, parent); + }, + run(elem, parent, book) { + const nextChapter = this.getNextChapter(elem, parent); + nextChapter.querySelector('ul').prepend(elem); + }, + getNextChapter(elem, parent) { + const topLevel = (parent || elem); + const topItems = Array.from(topLevel.parentElement.children); + const index = topItems.indexOf(topLevel); + return topItems.slice(index + 1).find(elem => elem.dataset.type === 'chapter'); + } + }, + prev_chapter: { + active(elem, parent, book) { + return elem.dataset.type === 'page' && this.getPrevChapter(elem, parent); + }, + run(elem, parent, book) { + const prevChapter = this.getPrevChapter(elem, parent); + prevChapter.querySelector('ul').append(elem); + }, + getPrevChapter(elem, parent) { + const topLevel = (parent || elem); + const topItems = Array.from(topLevel.parentElement.children); + const index = topItems.indexOf(topLevel); + return topItems.slice(0, index).reverse().find(elem => elem.dataset.type === 'chapter'); + } + }, + book_end: { + active(elem, parent, book) { + return parent || (parent === null && elem.nextElementSibling); + }, + run(elem, parent, book) { + book.querySelector('ul').append(elem); + } + }, + book_start: { + active(elem, parent, book) { + return parent || (parent === null && elem.previousElementSibling); + }, + run(elem, parent, book) { + book.querySelector('ul').prepend(elem); + } + }, + before_chapter: { + active(elem, parent, book) { + return parent; + }, + run(elem, parent, book) { + parent.insertAdjacentElement('beforebegin', elem); + } + }, + after_chapter: { + active(elem, parent, book) { + return parent; + }, + run(elem, parent, book) { + parent.insertAdjacentElement('afterend', elem); + } + }, +}; + export class BookSort extends Component { setup() { @@ -44,15 +151,34 @@ export class BookSort extends Component { this.sortContainer = this.$refs.sortContainer; this.input = this.$refs.input; + Sortable.mount(new MultiDrag()); + const initialSortBox = this.container.querySelector('.sort-box'); this.setupBookSortable(initialSortBox); this.setupSortPresets(); + this.setupMoveActions(); - window.$events.listen('entity-select-confirm', this.bookSelect.bind(this)); + window.$events.listen('entity-select-change', this.bookSelect.bind(this)); } /** - * Setup the handlers for the preset sort type buttons. + * Set up the handlers for the item-level move buttons. + */ + setupMoveActions() { + // Handle move button click + this.container.addEventListener('click', event => { + if (event.target.matches('[data-move]')) { + const action = event.target.getAttribute('data-move'); + const sortItem = event.target.closest('[data-id]'); + this.runSortAction(sortItem, action); + } + }); + + this.updateMoveActionStateForAll(); + } + + /** + * Set up the handlers for the preset sort type buttons. */ setupSortPresets() { let lastSort = ''; @@ -100,16 +226,19 @@ export class BookSort extends Component { const newBookContainer = htmlToDom(resp.data); this.sortContainer.append(newBookContainer); this.setupBookSortable(newBookContainer); + this.updateMoveActionStateForAll(); + + const summary = newBookContainer.querySelector('summary'); + summary.focus(); }); } /** - * Setup the given book container element to have sortable items. + * Set up the given book container element to have sortable items. * @param {Element} bookContainer */ setupBookSortable(bookContainer) { - const sortElems = [bookContainer.querySelector('.sort-list')]; - sortElems.push(...bookContainer.querySelectorAll('.entity-list-item + ul')); + const sortElems = Array.from(bookContainer.querySelectorAll('.sort-list, .sortable-page-sublist')); const bookGroupConfig = { name: 'book', @@ -125,22 +254,40 @@ export class BookSort extends Component { } }; - for (let sortElem of sortElems) { - new Sortable(sortElem, { + for (const sortElem of sortElems) { + Sortable.create(sortElem, { group: sortElem.classList.contains('sort-list') ? bookGroupConfig : chapterGroupConfig, animation: 150, fallbackOnBody: true, swapThreshold: 0.65, - onSort: this.updateMapInput.bind(this), + onSort: (event) => { + this.ensureNoNestedChapters() + this.updateMapInput(); + this.updateMoveActionStateForAll(); + }, dragClass: 'bg-white', ghostClass: 'primary-background-light', multiDrag: true, - multiDragKey: 'CTRL', + multiDragKey: 'Control', selectedClass: 'sortable-selected', }); } } + /** + * Handle nested chapters by moving them to the parent book. + * Needed since sorting with multi-sort only checks group rules based on the active item, + * not all in group, therefore need to manually check after a sort. + * Must be done before updating the map input. + */ + ensureNoNestedChapters() { + const nestedChapters = this.container.querySelectorAll('[data-type="chapter"] [data-type="chapter"]'); + for (const chapter of nestedChapters) { + const parentChapter = chapter.parentElement.closest('[data-type="chapter"]'); + parentChapter.insertAdjacentElement('afterend', chapter); + } + } + /** * Update the input with our sort data. */ @@ -202,4 +349,38 @@ export class BookSort extends Component { } } + /** + * Run the given sort action up the provided sort item. + * @param {Element} item + * @param {String} action + */ + runSortAction(item, action) { + const parentItem = item.parentElement.closest('li[data-id]'); + const parentBook = item.parentElement.closest('[data-type="book"]'); + moveActions[action].run(item, parentItem, parentBook); + this.updateMapInput(); + this.updateMoveActionStateForAll(); + item.scrollIntoView({behavior: 'smooth', block: 'nearest'}); + item.focus(); + } + + /** + * Update the state of the available move actions on this item. + * @param {Element} item + */ + updateMoveActionState(item) { + const parentItem = item.parentElement.closest('li[data-id]'); + const parentBook = item.parentElement.closest('[data-type="book"]'); + for (const [action, functions] of Object.entries(moveActions)) { + const moveButton = item.querySelector(`[data-move="${action}"]`); + moveButton.disabled = !functions.active(item, parentItem, parentBook); + } + } + + updateMoveActionStateForAll() { + const items = this.container.querySelectorAll('[data-type="chapter"],[data-type="page"]'); + for (const item of items) { + this.updateMoveActionState(item); + } + } } \ No newline at end of file diff --git a/resources/js/components/entity-selector.js b/resources/js/components/entity-selector.js index 1384b33a9..09d14b233 100644 --- a/resources/js/components/entity-selector.js +++ b/resources/js/components/entity-selector.js @@ -15,7 +15,6 @@ export class EntitySelector extends Component { this.searchInput = this.$refs.search; this.loading = this.$refs.loading; this.resultsContainer = this.$refs.results; - this.addButton = this.$refs.add; this.search = ''; this.lastClick = 0; @@ -43,15 +42,6 @@ export class EntitySelector extends Component { if (event.keyCode === 13) event.preventDefault(); }); - if (this.addButton) { - this.addButton.addEventListener('click', event => { - if (this.selectedItemData) { - this.confirmSelection(this.selectedItemData); - this.unselectAll(); - } - }); - } - // Keyboard navigation onChildEvent(this.$el, '[data-entity-type]', 'keydown', (e, el) => { if (e.ctrlKey && e.code === 'Enter') { diff --git a/resources/js/components/image-manager.js b/resources/js/components/image-manager.js index a44fffc1b..418b7c98a 100644 --- a/resources/js/components/image-manager.js +++ b/resources/js/components/image-manager.js @@ -140,10 +140,9 @@ export class ImageManager extends Component { } setActiveFilterTab(filterName) { - this.filterTabs.forEach(t => t.classList.remove('selected')); - const activeTab = this.filterTabs.find(t => t.dataset.filter === filterName); - if (activeTab) { - activeTab.classList.add('selected'); + for (const tab of this.filterTabs) { + const selected = tab.dataset.filter === filterName; + tab.setAttribute('aria-selected', selected ? 'true' : 'false'); } } diff --git a/resources/js/components/index.js b/resources/js/components/index.js index 27bce48db..82136184b 100644 --- a/resources/js/components/index.js +++ b/resources/js/components/index.js @@ -41,7 +41,7 @@ export {PagePicker} from "./page-picker.js" export {PermissionsTable} from "./permissions-table.js" export {Pointer} from "./pointer.js" export {Popup} from "./popup.js" -export {SettingAppColorPicker} from "./setting-app-color-picker.js" +export {SettingAppColorScheme} from "./setting-app-color-scheme.js" export {SettingColorPicker} from "./setting-color-picker.js" export {SettingHomepageControl} from "./setting-homepage-control.js" export {ShelfSort} from "./shelf-sort.js" diff --git a/resources/js/components/setting-app-color-picker.js b/resources/js/components/setting-app-color-picker.js deleted file mode 100644 index 68e5abce5..000000000 --- a/resources/js/components/setting-app-color-picker.js +++ /dev/null @@ -1,49 +0,0 @@ -import {Component} from "./component"; - -export class SettingAppColorPicker extends Component { - - setup() { - this.colorInput = this.$refs.input; - this.lightColorInput = this.$refs.lightInput; - - this.colorInput.addEventListener('change', this.updateColor.bind(this)); - this.colorInput.addEventListener('input', this.updateColor.bind(this)); - } - - /** - * Update the app colors as a preview, and create a light version of the color. - */ - updateColor() { - const hexVal = this.colorInput.value; - const rgb = this.hexToRgb(hexVal); - const rgbLightVal = 'rgba('+ [rgb.r, rgb.g, rgb.b, '0.15'].join(',') +')'; - - this.lightColorInput.value = rgbLightVal; - - const customStyles = document.getElementById('custom-styles'); - const oldColor = customStyles.getAttribute('data-color'); - const oldColorLight = customStyles.getAttribute('data-color-light'); - - customStyles.innerHTML = customStyles.innerHTML.split(oldColor).join(hexVal); - customStyles.innerHTML = customStyles.innerHTML.split(oldColorLight).join(rgbLightVal); - - customStyles.setAttribute('data-color', hexVal); - customStyles.setAttribute('data-color-light', rgbLightVal); - } - - /** - * Covert a hex color code to rgb components. - * @attribution https://stackoverflow.com/a/5624139 - * @param {String} hex - * @returns {{r: Number, g: Number, b: Number}} - */ - hexToRgb(hex) { - const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - return { - r: result ? parseInt(result[1], 16) : 0, - g: result ? parseInt(result[2], 16) : 0, - b: result ? parseInt(result[3], 16) : 0 - }; - } - -} diff --git a/resources/js/components/setting-app-color-scheme.js b/resources/js/components/setting-app-color-scheme.js new file mode 100644 index 000000000..71b14badc --- /dev/null +++ b/resources/js/components/setting-app-color-scheme.js @@ -0,0 +1,82 @@ +import {Component} from "./component"; + +export class SettingAppColorScheme extends Component { + + setup() { + this.container = this.$el; + this.mode = this.$opts.mode; + this.lightContainer = this.$refs.lightContainer; + this.darkContainer = this.$refs.darkContainer; + + this.container.addEventListener('tabs-change', event => { + const panel = event.detail.showing; + const newMode = (panel === 'color-scheme-panel-light') ? 'light' : 'dark'; + this.handleModeChange(newMode); + }); + + const onInputChange = (event) => { + this.updateAppColorsFromInputs(); + + if (event.target.name.startsWith('setting-app-color')) { + this.updateLightForInput(event.target); + } + }; + this.container.addEventListener('change', onInputChange); + this.container.addEventListener('input', onInputChange); + } + + handleModeChange(newMode) { + this.mode = newMode; + const isDark = (newMode === 'dark'); + + document.documentElement.classList.toggle('dark-mode', isDark); + this.updateAppColorsFromInputs(); + } + + updateAppColorsFromInputs() { + const inputContainer = this.mode === 'dark' ? this.darkContainer : this.lightContainer; + const inputs = inputContainer.querySelectorAll('input[type="color"]'); + for (const input of inputs) { + const splitName = input.name.split('-'); + const colorPos = splitName.indexOf('color'); + let cssId = splitName.slice(1, colorPos).join('-'); + if (cssId === 'app') { + cssId = 'primary'; + } + + const varName = '--color-' + cssId; + document.body.style.setProperty(varName, input.value); + } + } + + /** + * Update the 'light' app color variant for the given input. + * @param {HTMLInputElement} input + */ + updateLightForInput(input) { + const lightName = input.name.replace('-color', '-color-light'); + const hexVal = input.value; + const rgb = this.hexToRgb(hexVal); + const rgbLightVal = 'rgba('+ [rgb.r, rgb.g, rgb.b, '0.15'].join(',') +')'; + + console.log(input.name, lightName, hexVal, rgbLightVal) + const lightColorInput = this.container.querySelector(`input[name="${lightName}"][type="hidden"]`); + lightColorInput.value = rgbLightVal; + } + + /** + * Covert a hex color code to rgb components. + * @attribution https://stackoverflow.com/a/5624139 + * @param {String} hex + * @returns {{r: Number, g: Number, b: Number}} + */ + hexToRgb(hex) { + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return { + r: result ? parseInt(result[1], 16) : 0, + g: result ? parseInt(result[2], 16) : 0, + b: result ? parseInt(result[3], 16) : 0 + }; + } + +} diff --git a/resources/js/components/setting-color-picker.js b/resources/js/components/setting-color-picker.js index 876e14f20..bfb2c93ce 100644 --- a/resources/js/components/setting-color-picker.js +++ b/resources/js/components/setting-color-picker.js @@ -15,6 +15,6 @@ export class SettingColorPicker extends Component { setValue(value) { this.colorInput.value = value; - this.colorInput.dispatchEvent(new Event('change')); + this.colorInput.dispatchEvent(new Event('change', {bubbles: true})); } } \ No newline at end of file diff --git a/resources/js/components/tabs.js b/resources/js/components/tabs.js index 46063d240..8d22e3e9b 100644 --- a/resources/js/components/tabs.js +++ b/resources/js/components/tabs.js @@ -1,49 +1,49 @@ -import {onSelect} from "../services/dom"; import {Component} from "./component"; /** * Tabs - * Works by matching 'tabToggle' with 'tabContent' sections. + * Uses accessible attributes to drive its functionality. + * On tab wrapping element: + * - role=tablist + * On tabs (Should be a button): + * - id + * - role=tab + * - aria-selected=true/false + * - aria-controls= + * On panels: + * - id + * - tabindex=0 + * - role=tabpanel + * - aria-labelledby= + * - hidden (If not shown by default). */ export class Tabs extends Component { setup() { - this.tabContentsByName = {}; - this.tabButtonsByName = {}; - this.allContents = []; - this.allButtons = []; + this.container = this.$el; + this.tabs = Array.from(this.container.querySelectorAll('[role="tab"]')); + this.panels = Array.from(this.container.querySelectorAll('[role="tabpanel"]')); - for (const [key, elems] of Object.entries(this.$manyRefs || {})) { - if (key.startsWith('toggle')) { - const cleanKey = key.replace('toggle', '').toLowerCase(); - onSelect(elems, e => this.show(cleanKey)); - this.allButtons.push(...elems); - this.tabButtonsByName[cleanKey] = elems; + this.container.addEventListener('click', event => { + const button = event.target.closest('[role="tab"]'); + if (button) { + this.show(button.getAttribute('aria-controls')); } - if (key.startsWith('content')) { - const cleanKey = key.replace('content', '').toLowerCase(); - this.tabContentsByName[cleanKey] = elems; - this.allContents.push(...elems); - } - } + }); } - show(key) { - this.allContents.forEach(c => { - c.classList.add('hidden'); - c.classList.remove('selected'); - }); - this.allButtons.forEach(b => b.classList.remove('selected')); - - const contents = this.tabContentsByName[key] || []; - const buttons = this.tabButtonsByName[key] || []; - if (contents.length > 0) { - contents.forEach(c => { - c.classList.remove('hidden') - c.classList.add('selected') - }); - buttons.forEach(b => b.classList.add('selected')); + show(sectionId) { + for (const panel of this.panels) { + panel.toggleAttribute('hidden', panel.id !== sectionId); } + + for (const tab of this.tabs) { + const tabSection = tab.getAttribute('aria-controls'); + const selected = tabSection === sectionId; + tab.setAttribute('aria-selected', selected ? 'true' : 'false'); + } + + this.$emit('change', {showing: sectionId}); } } \ No newline at end of file diff --git a/resources/js/components/tag-manager.js b/resources/js/components/tag-manager.js index cfbc514a0..24d340553 100644 --- a/resources/js/components/tag-manager.js +++ b/resources/js/components/tag-manager.js @@ -10,10 +10,11 @@ export class TagManager extends Component { } setupListeners() { - this.container.addEventListener('change', event => { + this.container.addEventListener('input', event => { + /** @var {AddRemoveRows} **/ const addRemoveComponent = window.$components.firstOnElement(this.addRemoveComponentEl, 'add-remove-rows'); - if (!this.hasEmptyRows()) { + if (!this.hasEmptyRows() && event.target.value) { addRemoveComponent.add(); } }); diff --git a/resources/js/services/drawio.js b/resources/js/services/drawio.js index dfca83211..67ac4cc0e 100644 --- a/resources/js/services/drawio.js +++ b/resources/js/services/drawio.js @@ -95,8 +95,16 @@ async function upload(imageData, pageUploadedToId) { * @returns {Promise} */ async function load(drawingId) { - const resp = await window.$http.get(window.baseUrl(`/images/drawio/base64/${drawingId}`)); - return `data:image/png;base64,${resp.data.content}`; + try { + const resp = await window.$http.get(window.baseUrl(`/images/drawio/base64/${drawingId}`)); + return `data:image/png;base64,${resp.data.content}`; + } catch (error) { + if (error instanceof window.$http.HttpError) { + window.$events.showResponseError(error); + } + close(); + throw error; + } } export default {show, close, upload, load}; \ No newline at end of file diff --git a/resources/js/services/events.js b/resources/js/services/events.js index 6668014e7..d2dacfa7b 100644 --- a/resources/js/services/events.js +++ b/resources/js/services/events.js @@ -43,10 +43,8 @@ function emitPublic(targetElement, eventName, eventData) { } /** - * Notify of a http error. - * Check for standard scenarios such as validation errors and - * formats an error notification accordingly. - * @param {Error} error + * Notify of standard server-provided validation errors. + * @param {Object} error */ function showValidationErrors(error) { if (!error.status) return; @@ -56,6 +54,17 @@ function showValidationErrors(error) { } } +/** + * Notify standard server-provided error messages. + * @param {Object} error + */ +function showResponseError(error) { + if (!error.status) return; + if (error.status >= 400 && error.data && error.data.message) { + emit('error', error.data.message); + } +} + export default { emit, emitPublic, @@ -63,4 +72,5 @@ export default { success: (msg) => emit('success', msg), error: (msg) => emit('error', msg), showValidationErrors, + showResponseError, } \ No newline at end of file diff --git a/resources/js/services/http.js b/resources/js/services/http.js index 00865e69b..211ea0c92 100644 --- a/resources/js/services/http.js +++ b/resources/js/services/http.js @@ -132,7 +132,7 @@ async function request(url, options = {}) { }; if (!response.ok) { - throw returnData; + throw new HttpError(response, content); } return returnData; @@ -159,10 +159,24 @@ async function getResponseContent(response) { return await response.text(); } +class HttpError extends Error { + constructor(response, content) { + super(response.statusText); + this.data = content; + this.headers = response.headers; + this.redirected = response.redirected; + this.status = response.status; + this.statusText = response.statusText; + this.url = response.url; + this.original = response; + } +} + export default { get: get, post: post, put: put, patch: patch, delete: performDelete, + HttpError: HttpError, }; \ No newline at end of file diff --git a/resources/js/services/keyboard-navigation.js b/resources/js/services/keyboard-navigation.js index 0e1dcf1a7..0f866ceaa 100644 --- a/resources/js/services/keyboard-navigation.js +++ b/resources/js/services/keyboard-navigation.js @@ -86,7 +86,7 @@ export class KeyboardNavigationHandler { */ #getFocusable() { const focusable = []; - const selector = '[tabindex]:not([tabindex="-1"]),[href],button:not([tabindex="-1"]),input:not([type=hidden])'; + const selector = '[tabindex]:not([tabindex="-1"]),[href],button:not([tabindex="-1"],[disabled]),input:not([type=hidden])'; for (const container of this.containers) { focusable.push(...container.querySelectorAll(selector)) } diff --git a/resources/js/services/util.js b/resources/js/services/util.js index 1a56ebf6c..238f8b1d8 100644 --- a/resources/js/services/util.js +++ b/resources/js/services/util.js @@ -34,7 +34,7 @@ export function scrollAndHighlightElement(element) { if (!element) return; element.scrollIntoView({behavior: 'smooth'}); - const color = document.getElementById('custom-styles').getAttribute('data-color-light'); + const color = getComputedStyle(document.body).getPropertyValue('--color-primary-light'); const initColor = window.getComputedStyle(element).getPropertyValue('background-color'); element.style.backgroundColor = color; setTimeout(() => { diff --git a/resources/js/wysiwyg/plugin-drawio.js b/resources/js/wysiwyg/plugin-drawio.js index ad7e09f95..9f4a065ad 100644 --- a/resources/js/wysiwyg/plugin-drawio.js +++ b/resources/js/wysiwyg/plugin-drawio.js @@ -89,7 +89,7 @@ function drawingInit() { return Promise.resolve(''); } - let drawingId = currentNode.getAttribute('drawio-diagram'); + const drawingId = currentNode.getAttribute('drawio-diagram'); return DrawIO.load(drawingId); } diff --git a/resources/lang/ar/entities.php b/resources/lang/ar/entities.php index 49471178c..a7871840d 100644 --- a/resources/lang/ar/entities.php +++ b/resources/lang/ar/entities.php @@ -141,6 +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_named' => 'فرز كتاب :bookName', 'books_sort_name' => 'ترتيب حسب الإسم', 'books_sort_created' => 'ترتيب حسب تاريخ الإنشاء', @@ -149,6 +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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/ar/errors.php b/resources/lang/ar/errors.php index dc0ef2f0f..5726a5e0f 100644 --- a/resources/lang/ar/errors.php +++ b/resources/lang/ar/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'لا يمكن للخادم إنشاء صور مصغرة. الرجاء التأكد من تثبيت إضافة GD PHP.', 'server_upload_limit' => 'الخادم لا يسمح برفع ملفات بهذا الحجم. الرجاء محاولة الرفع بحجم أصغر.', 'uploaded' => 'الخادم لا يسمح برفع ملفات بهذا الحجم. الرجاء محاولة الرفع بحجم أصغر.', + 'file_upload_timeout' => 'انتهت عملية تحميل الملف.', + + // Drawing & Images 'image_upload_error' => 'حدث خطأ خلال رفع الصورة', 'image_upload_type_error' => 'صيغة الصورة المرفوعة غير صالحة', - 'file_upload_timeout' => 'انتهت عملية تحميل الملف.', + '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.', // Attachments 'attachment_not_found' => 'لم يتم العثور على المرفق', diff --git a/resources/lang/ar/settings.php b/resources/lang/ar/settings.php index 1cf0e1998..775e20509 100755 --- a/resources/lang/ar/settings.php +++ b/resources/lang/ar/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'سيتم إدراج أي محتوى مضاف هنا في الجزء السفلي من قسم من كل صفحة. هذا أمر مفيد لتجاوز الأنماط أو إضافة رمز التحليل.', 'app_custom_html_disabled_notice' => 'تم تعطيل محتوى HTML الرئيسي المخصص في صفحة الإعدادات هذه لضمان عكس أي تغييرات متتالية.', 'app_logo' => 'شعار التطبيق', - 'app_logo_desc' => 'يجب أن تكون الصورة بارتفاع 43 بكسل.
سيتم تصغير الصور الأكبر من ذلك.', - 'app_primary_color' => 'اللون الأساسي للتطبيق', - 'app_primary_color_desc' => 'يجب أن تكون القيمة من نوع hex.
اترك الخانة فارغة للرجوع للون الافتراضي.', + '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_homepage' => 'الصفحة الرئيسية للتطبيق', 'app_homepage_desc' => 'الرجاء اختيار صفحة لتصبح الصفحة الرئيسية بدل من الافتراضية. سيتم تجاهل جميع الأذونات الخاصة بالصفحة المختارة.', 'app_homepage_select' => 'اختر صفحة', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'تعطيل التعليقات على جميع الصفحات داخل التطبيق. التعليقات الموجودة من الأصل لن تكون ظاهرة.', // Color settings - 'content_colors' => 'ألوان المحتوى', - 'content_colors_desc' => 'تعيين الألوان لجميع العناصر في التسلسل الهرمي لتنظيم الصفحات. يوصى باختيار الألوان ذات السطوع المماثل للألوان الافتراضية للقراءة.', + '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.', 'bookshelf_color' => 'لون الرف', 'book_color' => 'لون الكتاب', 'chapter_color' => 'لون الفصل', diff --git a/resources/lang/bg/entities.php b/resources/lang/bg/entities.php index 32ed94c5f..88252a332 100644 --- a/resources/lang/bg/entities.php +++ b/resources/lang/bg/entities.php @@ -141,6 +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_named' => 'Сортирай книга :bookName', 'books_sort_name' => 'Сортиране по име', 'books_sort_created' => 'Сортирай по дата на създаване', @@ -149,6 +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_copy' => 'Копирай книгата', 'books_copy_success' => 'Книгата е копирана успешно', diff --git a/resources/lang/bg/errors.php b/resources/lang/bg/errors.php index 27779a483..5d927ea5e 100644 --- a/resources/lang/bg/errors.php +++ b/resources/lang/bg/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Сървърът не може да създаде малки изображения. Моля, увери се, че разширението GD PHP е инсталирано.', 'server_upload_limit' => 'Сървърът не позволява качвания с такъв размер. Моля, пробвайте файл с по-малък размер.', 'uploaded' => 'Сървърът не позволява качвания с такъв размер. Моля, пробвайте файл с по-малък размер.', + 'file_upload_timeout' => 'Качването на файла изтече.', + + // Drawing & Images 'image_upload_error' => 'Възникна грешка при качването на изображението', 'image_upload_type_error' => 'Типът на качваното изображение е невалиден', - 'file_upload_timeout' => 'Качването на файла изтече.', + '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.', // Attachments 'attachment_not_found' => 'Прикачения файл не е намерен', diff --git a/resources/lang/bg/settings.php b/resources/lang/bg/settings.php index 13c148ecc..5e99a3cc9 100644 --- a/resources/lang/bg/settings.php +++ b/resources/lang/bg/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Всяко съдържание, добавено тук, ще бъде поставено в долната част на секцията на всяка страница. Това е удобно за преобладаващи стилове или добавяне на код за анализ.', 'app_custom_html_disabled_notice' => 'Съдържанието на персонализираната HTML шапка е деактивирано на страницата с настройки, за да се гарантира, че евентуални лоши промени могат да бъдат върнати.', 'app_logo' => 'Лого на приложението', - 'app_logo_desc' => 'Това изображение трябва да е с 43px височина.
Големите изображения ще бъдат намалени.', - 'app_primary_color' => 'Основен цвят на приложението', - 'app_primary_color_desc' => 'Изберете основния цвят на приложението, включително на банера, бутоните и линковете.', + '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_homepage' => 'Начлна страница на приложението', 'app_homepage_desc' => 'Изберете начална страница, която ще замени изгледа по подразбиране. Дефинираните права на страницата, която е избрана ще бъдат игнорирани.', 'app_homepage_select' => 'Избери страница', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Изключва коментарите във всички на страници на приложението.
Съществуващите коментари няма да се показват.', // Color settings - 'content_colors' => 'Цвят на съдържанието', - 'content_colors_desc' => 'Настройва цветовете за всички елементи на йерархията за организацията на страницата. Избор на цвят с яркост, близка до цветовете по подразбиране, се препоръчва за четимостта.', + '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.', 'bookshelf_color' => 'Цвят на рафта', 'book_color' => 'Цвят на книгата', 'chapter_color' => 'Цвят на главата', diff --git a/resources/lang/bs/entities.php b/resources/lang/bs/entities.php index ce002249f..aa8a5bcd7 100644 --- a/resources/lang/bs/entities.php +++ b/resources/lang/bs/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Pretraži ovu knjigu', 'books_navigation' => 'Navigacija knjige', 'books_sort' => 'Sortiraj sadržaj knjige', + '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_named' => 'Sortiraj knjigu :bookName', 'books_sort_name' => 'Sortiraj po imenu', 'books_sort_created' => 'Sortiraj po datumu kreiranja', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Poglavlja zadnja', 'books_sort_show_other' => 'Prikaži druge knjige', 'books_sort_save' => 'Spremi trenutni poredak', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/bs/errors.php b/resources/lang/bs/errors.php index 0928d7985..bb7617a77 100644 --- a/resources/lang/bs/errors.php +++ b/resources/lang/bs/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Server ne može kreirati sličice. Provjerite da imate instaliranu GD PHP ekstenziju.', 'server_upload_limit' => 'Server ne dopušta učitavanja ove veličine. Pokušajte sa manjom veličinom fajla.', 'uploaded' => 'Server ne dopušta učitavanja ove veličine. Pokušajte sa manjom veličinom fajla.', + 'file_upload_timeout' => 'Vrijeme učitavanja fajla je isteklo.', + + // Drawing & Images 'image_upload_error' => 'Desila se greška prilikom učitavanja slike', 'image_upload_type_error' => 'Vrsta slike koja se učitava je neispravna', - 'file_upload_timeout' => 'Vrijeme učitavanja fajla je isteklo.', + '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.', // Attachments 'attachment_not_found' => 'Prilog nije pronađen', diff --git a/resources/lang/bs/settings.php b/resources/lang/bs/settings.php index f4204dd68..6f4376d42 100644 --- a/resources/lang/bs/settings.php +++ b/resources/lang/bs/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the section of every page. This is handy for overriding styles or adding analytics code.', 'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.', 'app_logo' => 'Application Logo', - 'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.', - 'app_primary_color' => 'Application Primary Color', - 'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.', + '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_homepage' => 'Application Homepage', 'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.', 'app_homepage_select' => 'Select a page', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disables comments across all pages in the application.
Existing comments are not shown.', // Color settings - 'content_colors' => 'Content Colors', - 'content_colors_desc' => 'Sets 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' => '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.', 'bookshelf_color' => 'Shelf Color', 'book_color' => 'Book Color', 'chapter_color' => 'Chapter Color', diff --git a/resources/lang/ca/entities.php b/resources/lang/ca/entities.php index 8e3d13e37..7f2673da9 100644 --- a/resources/lang/ca/entities.php +++ b/resources/lang/ca/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Cerca en aquest llibre', 'books_navigation' => 'Navegació pel llibre', 'books_sort' => 'Ordena el contingut del llibre', + '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_named' => 'Ordena el llibre :bookName', 'books_sort_name' => 'Ordena per nom', 'books_sort_created' => 'Ordena per data de creació', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Els capítols al final', 'books_sort_show_other' => 'Mostra altres llibres', 'books_sort_save' => 'Desa l\'ordre nou', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/ca/errors.php b/resources/lang/ca/errors.php index 5b9fe4dc0..ebcf63ef5 100644 --- a/resources/lang/ca/errors.php +++ b/resources/lang/ca/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'El servidor no pot crear miniatures. Reviseu que tingueu instal·lada l\'extensió GD del PHP.', 'server_upload_limit' => 'El servidor no permet pujades d\'aquesta mida. Proveu-ho amb una mida de fitxer més petita.', 'uploaded' => 'El servidor no permet pujades d\'aquesta mida. Proveu-ho amb una mida de fitxer més petita.', + 'file_upload_timeout' => 'La pujada del fitxer ha superat el temps màxim d\'espera.', + + // Drawing & Images 'image_upload_error' => 'S\'ha produït un error en pujar la imatge', 'image_upload_type_error' => 'El tipus d\'imatge que heu pujat no és vàlid', - 'file_upload_timeout' => 'La pujada del fitxer ha superat el temps màxim d\'espera.', + '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.', // Attachments 'attachment_not_found' => 'No s\'ha trobat l\'adjunció', diff --git a/resources/lang/ca/settings.php b/resources/lang/ca/settings.php index c6c3b03db..8c1f709bf 100755 --- a/resources/lang/ca/settings.php +++ b/resources/lang/ca/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Aquí podeu afegir contingut que s\'inserirà a la part final de la secció de cada pàgina. És útil per a sobreescriure estils o afegir-hi codi d\'analítiques.', 'app_custom_html_disabled_notice' => 'El contingut personalitzat a la capçalera HTML es desactiva en aquesta pàgina de la configuració per a assegurar que qualsevol canvi que trenqui el web es pugui desfer.', 'app_logo' => 'Logo de l\'aplicació', - 'app_logo_desc' => 'Aquesta imatge hauria de tenir 43 px d\'alçada.
Les imatges grosses es reduiran.', - 'app_primary_color' => 'Color primari de l\'aplicació', - 'app_primary_color_desc' => 'Defineix el color primari de l\'aplicació, incloent-hi la part superior, els botons i els enllaços.', + '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_homepage' => 'Pàgina d\'inici de l\'aplicació', 'app_homepage_desc' => 'Seleccioneu la visualització que es mostrarà a la pàgina d\'inici en lloc de la visualització per defecte. Els permisos de pàgines s\'ignoraran per a les pàgines seleccionades.', 'app_homepage_select' => 'Selecciona una pàgina', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Desactiva els comentaris a totes les pàgines de l\'aplicació.
Els comentaris existents no es mostraran.', // Color settings - 'content_colors' => 'Colors del contingut', - 'content_colors_desc' => 'Defineix els colors de tots els elements de la jerarquia d\'organització de pàgines. És recomanable triar colors amb una brillantor semblant als colors per defecte per a mantenir-ne la llegibilitat.', + '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.', 'bookshelf_color' => 'Color dels prestatges', 'book_color' => 'Color dels llibres', 'chapter_color' => 'Color dels capítols', diff --git a/resources/lang/cs/entities.php b/resources/lang/cs/entities.php index b674c6e63..031d8de9b 100644 --- a/resources/lang/cs/entities.php +++ b/resources/lang/cs/entities.php @@ -141,6 +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_named' => 'Seřadit knihu :bookName', 'books_sort_name' => 'Seřadit podle názvu', 'books_sort_created' => 'Seřadit podle data vytvoření', @@ -149,6 +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_copy' => 'Kopírovat knihu', 'books_copy_success' => 'Kniha byla úspěšně zkopírována', diff --git a/resources/lang/cs/errors.php b/resources/lang/cs/errors.php index 469c7c534..ab509c106 100644 --- a/resources/lang/cs/errors.php +++ b/resources/lang/cs/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Server nedokáže udělat náhledy. Zkontrolujte, že rozšíření GD pro PHP je nainstalováno.', 'server_upload_limit' => 'Server nepovoluje nahrávat tak veliké soubory. Zkuste prosím menší soubor.', 'uploaded' => 'Server nepovoluje nahrávat tak veliké soubory. Zkuste prosím menší soubor.', + 'file_upload_timeout' => 'Nahrávání souboru trvalo příliš dlouho a tak bylo ukončeno.', + + // 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ý.', - 'file_upload_timeout' => 'Nahrávání souboru trvalo příliš dlouho a tak bylo ukončeno.', + '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.', // Attachments 'attachment_not_found' => 'Příloha nenalezena', diff --git a/resources/lang/cs/settings.php b/resources/lang/cs/settings.php index 5302a33fc..b890f11ca 100644 --- a/resources/lang/cs/settings.php +++ b/resources/lang/cs/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Cokoliv sem napíšete bude přidáno na konec sekce v každém místě této aplikace. To se hodí pro přidávání nebo změnu CSS stylů nebo přidání kódu pro analýzu používání (např.: google analytics.).', 'app_custom_html_disabled_notice' => 'Na této stránce nastavení je zakázán vlastní obsah HTML hlavičky, aby bylo zajištěno, že bude možné vrátit případnou problematickou úpravu.', 'app_logo' => 'Logo aplikace', - 'app_logo_desc' => 'Tento obrázek by měl mít výšku 43px.
Větší obrázky zmenšíme na tuto velikost.', - 'app_primary_color' => 'Hlavní barva aplikace', - 'app_primary_color_desc' => 'Nastaví hlavní barvu aplikace včetně panelů, tlačítek a odkazů.', + 'app_logo_desc' => 'Používá se v záhlaví aplikace, a v jiných oblastech. Tento obrázek by měl být velký 86px. Větší obrázky budou zmenšeny.', + 'app_icon' => 'Ikona aplikace', + 'app_icon_desc' => 'Tato ikona se používá pro záložky prohlížeče a ikony zástupců. Obrazek by měl být čtverec o velikosti 256px a formátu PNG.', 'app_homepage' => 'Úvodní stránka aplikace', 'app_homepage_desc' => 'Zvolte si zobrazení, které se použije jako úvodní stránka. U zvolených stránek bude ignorováno jejich oprávnění.', 'app_homepage_select' => 'Zvolte stránku', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Vypne komentáře napříč všemi stránkami.
Existující komentáře se přestanou zobrazovat.', // Color settings - 'content_colors' => 'Barvy obsahu', - '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.', + '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.', 'bookshelf_color' => 'Barva knihovny', 'book_color' => 'Barva knihy', 'chapter_color' => 'Barva kapitoly', diff --git a/resources/lang/cy/entities.php b/resources/lang/cy/entities.php index fa2586f8d..8bf805774 100644 --- a/resources/lang/cy/entities.php +++ b/resources/lang/cy/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Search this book', 'books_navigation' => 'Book Navigation', 'books_sort' => 'Sort Book Contents', + '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_named' => 'Sort Book :bookName', 'books_sort_name' => 'Sort by Name', 'books_sort_created' => 'Sort by Created Date', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Chapters Last', 'books_sort_show_other' => 'Show Other Books', 'books_sort_save' => 'Save New Order', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/cy/errors.php b/resources/lang/cy/errors.php index f681de1c9..0f684998f 100644 --- a/resources/lang/cy/errors.php +++ b/resources/lang/cy/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Ni all y gweinydd greu mân-luniau. Gwiriwch fod gennych yr estyniad GD PHP wedi\'i osod.', 'server_upload_limit' => 'Nid yw\'r gweinydd yn caniatáu uwchlwythiadau o\'r maint hwn. Rhowch gynnig ar faint ffeil llai.', 'uploaded' => 'Nid yw\'r gweinydd yn caniatáu uwchlwythiadau o\'r maint hwn. Rhowch gynnig ar faint ffeil llai.', + 'file_upload_timeout' => 'Mae\'r amser uwchlwytho ffeil wedi dod i ben.', + + // Drawing & Images 'image_upload_error' => 'Bu gwall wrth uwchlwytho\'r ddelwedd', 'image_upload_type_error' => 'Mae\'r math o ddelwedd sy\'n cael ei huwchlwytho yn annilys', - 'file_upload_timeout' => 'Mae\'r amser uwchlwytho ffeil wedi dod i ben.', + '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.', // Attachments 'attachment_not_found' => 'Ni chanfuwyd yr atodiad', diff --git a/resources/lang/cy/settings.php b/resources/lang/cy/settings.php index f4204dd68..6f4376d42 100644 --- a/resources/lang/cy/settings.php +++ b/resources/lang/cy/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the section of every page. This is handy for overriding styles or adding analytics code.', 'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.', 'app_logo' => 'Application Logo', - 'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.', - 'app_primary_color' => 'Application Primary Color', - 'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.', + '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_homepage' => 'Application Homepage', 'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.', 'app_homepage_select' => 'Select a page', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disables comments across all pages in the application.
Existing comments are not shown.', // Color settings - 'content_colors' => 'Content Colors', - 'content_colors_desc' => 'Sets 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' => '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.', 'bookshelf_color' => 'Shelf Color', 'book_color' => 'Book Color', 'chapter_color' => 'Chapter Color', diff --git a/resources/lang/da/entities.php b/resources/lang/da/entities.php index e0a95478c..2066a3969 100644 --- a/resources/lang/da/entities.php +++ b/resources/lang/da/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Søg i denne bog', 'books_navigation' => 'Bognavigation', 'books_sort' => 'Sorter bogindhold', + '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_named' => 'Sorter bog :bookName', 'books_sort_name' => 'Sortér efter navn', 'books_sort_created' => 'Sortér efter oprettelsesdato', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Kapitler sidst', 'books_sort_show_other' => 'Vis andre bøger', 'books_sort_save' => 'Gem ny ordre', + '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_copy' => 'Kopier Bog', 'books_copy_success' => 'Bogen blev kopieret', diff --git a/resources/lang/da/errors.php b/resources/lang/da/errors.php index a1aa1201c..75ef6da20 100644 --- a/resources/lang/da/errors.php +++ b/resources/lang/da/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Serveren kan ikke oprette miniaturer. Kontroller, at GD PHP-udvidelsen er installeret.', 'server_upload_limit' => 'Serveren tillader ikke uploads af denne størrelse. Prøv en mindre filstørrelse.', 'uploaded' => 'Serveren tillader ikke uploads af denne størrelse. Prøv en mindre filstørrelse.', + 'file_upload_timeout' => 'Filuploaden udløb.', + + // Drawing & Images 'image_upload_error' => 'Der opstod en fejl ved upload af billedet', 'image_upload_type_error' => 'Billedtypen, der uploades, er ugyldig', - 'file_upload_timeout' => 'Filuploaden udløb.', + '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.', // Attachments 'attachment_not_found' => 'Vedhæftning ikke fundet', diff --git a/resources/lang/da/settings.php b/resources/lang/da/settings.php index 5d5396cf6..7f432ed2c 100644 --- a/resources/lang/da/settings.php +++ b/resources/lang/da/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Alt indhold tilføjet her, vil blive indsat i bunden af sektionen på alle sider. Dette er brugbart til overskrivning af styles og tilføjelse af analytics kode.', 'app_custom_html_disabled_notice' => 'Brugerdefineret HTML head indhold er deaktiveret på denne indstillingsside for at, at ændringer kan rulles tilbage.', 'app_logo' => 'Applikationslogo', - 'app_logo_desc' => 'Dette billede skal være 43px højt.
Store billeder vil blive skaleret ned.', - 'app_primary_color' => 'Primær applikationsfarve', - 'app_primary_color_desc' => 'Sætter den primære farve for applikationen herunder banneret, knapper og links.', + '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_homepage' => 'Applikationsforside', 'app_homepage_desc' => 'Vælg en visning, der skal vises på forsiden i stedet for standardvisningen. Sidetilladelser ignoreres for de valgte sider.', 'app_homepage_select' => 'Vælg en side', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Deaktiverer kommentarer på tværs af alle sider i applikationen.
Eksisterende kommentarer vises ikke.', // Color settings - 'content_colors' => 'Indholdsfarver', - 'content_colors_desc' => 'Sætter farver for alle elementer i sideorganisationshierarkiet. Valg af farver med en lignende lysstyrke som standardfarverne anbefales af hensyn til læsbarhed.', + '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.', 'bookshelf_color' => 'Bogreolfarve', 'book_color' => 'Bogfarve', 'chapter_color' => 'Kapitelfarve', diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php index 77192cb26..9229faa09 100644 --- a/resources/lang/de/entities.php +++ b/resources/lang/de/entities.php @@ -141,6 +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_named' => 'Buch ":bookName" sortieren', 'books_sort_name' => 'Sortieren nach Namen', 'books_sort_created' => 'Sortieren nach Erstellungsdatum', @@ -149,6 +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_copy' => 'Buch kopieren', 'books_copy_success' => 'Das Buch wurde erfolgreich kopiert', diff --git a/resources/lang/de/errors.php b/resources/lang/de/errors.php index 34b0e715f..9d588ee05 100644 --- a/resources/lang/de/errors.php +++ b/resources/lang/de/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfen Sie, ob die GD PHP-Erweiterung installiert ist.', 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.', 'uploaded' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.', + 'file_upload_timeout' => 'Der Datei-Upload hat das Zeitlimit überschritten.', + + // 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.', - 'file_upload_timeout' => 'Der Datei-Upload hat das Zeitlimit überschritten.', + '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.', // Attachments 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php index 7842034b5..c04eaaafd 100644 --- a/resources/lang/de/settings.php +++ b/resources/lang/de/settings.php @@ -33,11 +33,9 @@ return [ 'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS Styles anzupassen oder Analytics-Code hinzuzufügen.', 'app_custom_html_disabled_notice' => 'Benutzerdefinierte HTML-Kopfzeileninhalte sind auf dieser Einstellungsseite deaktiviert, um sicherzustellen, dass alle Änderungen rückgängig gemacht werden können.', 'app_logo' => 'Anwendungslogo', - 'app_logo_desc' => 'Dieses Bild sollte 43px hoch sein. -Größere Bilder werden verkleinert.', - 'app_primary_color' => 'Primäre Anwendungsfarbe', - 'app_primary_color_desc' => 'Dies sollte ein HEX Wert sein. -Wenn Sie nichts eingeben, wird die Anwendung auf die Standardfarbe zurückgesetzt.', + '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_homepage' => 'Startseite der Anwendung', 'app_homepage_desc' => 'Wählen Sie eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', 'app_homepage_select' => 'Wählen Sie eine Seite aus', @@ -51,8 +49,12 @@ Wenn Sie nichts eingeben, wird die Anwendung auf die Standardfarbe zurückgesetz 'app_disable_comments_desc' => 'Deaktiviert Kommentare über alle Seiten in der Anwendung. Vorhandene Kommentare werden nicht angezeigt.', // Color settings - 'content_colors' => 'Inhaltsfarben', - 'content_colors_desc' => 'Legt Farben für alle Elemente in der Seitenorganisationshierarchie fest. Die Auswahl von Farben mit einer ähnlichen Helligkeit wie die Standardfarben wird zur Lesbarkeit empfohlen.', + '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.', 'bookshelf_color' => 'Regalfarbe', 'book_color' => 'Buchfarbe', 'chapter_color' => 'Kapitelfarbe', diff --git a/resources/lang/de_informal/entities.php b/resources/lang/de_informal/entities.php index 76d7c6bb7..959e8673b 100644 --- a/resources/lang/de_informal/entities.php +++ b/resources/lang/de_informal/entities.php @@ -141,6 +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_named' => 'Buch ":bookName" sortieren', 'books_sort_name' => 'Sortieren nach Namen', 'books_sort_created' => 'Sortieren nach Erstellungsdatum', @@ -149,6 +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_copy' => 'Buch kopieren', 'books_copy_success' => 'Buch erfolgreich kopiert', diff --git a/resources/lang/de_informal/errors.php b/resources/lang/de_informal/errors.php index 84942ade2..c18076ae6 100644 --- a/resources/lang/de_informal/errors.php +++ b/resources/lang/de_informal/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfe, ob die GD PHP-Erweiterung installiert ist.', 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuche es mit einer kleineren Datei.', 'uploaded' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuche es mit einer kleineren Datei.', + 'file_upload_timeout' => 'Der Upload der Datei ist abgelaufen.', + + // 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.', - 'file_upload_timeout' => 'Der Upload der Datei ist abgelaufen.', + '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.', // Attachments 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', diff --git a/resources/lang/de_informal/settings.php b/resources/lang/de_informal/settings.php index f0da529c3..7a51746a4 100644 --- a/resources/lang/de_informal/settings.php +++ b/resources/lang/de_informal/settings.php @@ -33,11 +33,9 @@ return [ 'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS Styles anzupassen oder Analytics-Code hinzuzufügen.', 'app_custom_html_disabled_notice' => 'Benutzerdefinierte HTML-Kopfzeileninhalte sind auf dieser Einstellungsseite deaktiviert, um sicherzustellen, dass alle Änderungen rückgängig gemacht werden können.', 'app_logo' => 'Anwendungslogo', - 'app_logo_desc' => 'Dieses Bild sollte 43px hoch sein. -Größere Bilder werden verkleinert.', - 'app_primary_color' => 'Primäre Anwendungsfarbe', - 'app_primary_color_desc' => 'Dies sollte ein HEX Wert sein. -Wenn du nichts eingibst, wird die Anwendung auf die Standardfarbe zurückgesetzt.', + '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_homepage' => 'Startseite der Anwendung', 'app_homepage_desc' => 'Wähle eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', 'app_homepage_select' => 'Wähle eine Seite aus', @@ -51,8 +49,12 @@ Wenn du nichts eingibst, wird die Anwendung auf die Standardfarbe zurückgesetzt 'app_disable_comments_desc' => 'Deaktiviert Kommentare über alle Seiten in der Anwendung. Vorhandene Kommentare werden nicht angezeigt.', // Color settings - 'content_colors' => 'Inhaltsfarben', - 'content_colors_desc' => 'Legt Farben für alle Elemente in der Seitenorganisationshierarchie fest. Die Auswahl von Farben mit einer ähnlichen Helligkeit wie die Standardfarben wird zur Lesbarkeit empfohlen.', + '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.', 'bookshelf_color' => 'Regalfarbe', 'book_color' => 'Buchfarbe', 'chapter_color' => 'Kapitelfarbe', diff --git a/resources/lang/el/entities.php b/resources/lang/el/entities.php index e2c318d80..55ffc5795 100644 --- a/resources/lang/el/entities.php +++ b/resources/lang/el/entities.php @@ -141,6 +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_named' => 'Ταξινόμηση Βιβλίου :bookname', 'books_sort_name' => 'Ταξινόμηση κατά όνομα', 'books_sort_created' => 'Ταξινόμηση κατά ημερομηνία δημιουργίας', @@ -149,6 +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_copy' => 'Αντιγραφή Βιβλίου', 'books_copy_success' => 'Το βιβλίο αντιγράφηκε επιτυχώς', diff --git a/resources/lang/el/errors.php b/resources/lang/el/errors.php index 6c489d360..86870cdec 100644 --- a/resources/lang/el/errors.php +++ b/resources/lang/el/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Ο διακομιστής δεν μπορεί να δημιουργήσει μικρογραφίες. Παρακαλώ ελέγξτε ότι έχετε την επέκταση GD PHP εγκατεστημένη.', 'server_upload_limit' => 'Ο διακομιστής δεν επιτρέπει τη μεταφόρτωση αυτού του μεγέθους. Παρακαλώ δοκιμάστε ένα μικρότερο μέγεθος αρχείου.', 'uploaded' => 'Ο διακομιστής δεν επιτρέπει τη μεταφόρτωση αυτού του μεγέθους. Παρακαλώ δοκιμάστε ένα μικρότερο μέγεθος αρχείου.', + 'file_upload_timeout' => 'Το χρονικό όριο μεταφόρτωσης αρχείου έληξε.', + + // Drawing & Images 'image_upload_error' => 'Παρουσιάστηκε σφάλμα κατά το ανέβασμα της εικόνας.', 'image_upload_type_error' => 'Ο τύπος εικόνας που μεταφορτώθηκε δεν είναι έγκυρος', - 'file_upload_timeout' => 'Το χρονικό όριο μεταφόρτωσης αρχείου έληξε.', + '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.', // Attachments 'attachment_not_found' => 'Το συνημμένο δεν βρέθηκε', diff --git a/resources/lang/el/settings.php b/resources/lang/el/settings.php index ea508450d..cacf7c855 100644 --- a/resources/lang/el/settings.php +++ b/resources/lang/el/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Οποιοδήποτε περιεχόμενο προστίθεται εδώ θα εισαχθεί στο κάτω μέρος της ενότητας κάθε σελίδας. Αυτό είναι βολικό για την παράκαμψη ή προσθήκη στυλ καθώς και την προσθήκη κώδικα αναλυτικών στοιχείων.', 'app_custom_html_disabled_notice' => 'Το προσαρμοσμένο περιεχόμενο κεφαλίδας HTML είναι απενεργοποιημένο σε αυτήν τη σελίδα ρυθμίσεων, για να διασφαλιστεί ότι τυχόν αλλαγές που θα πραγματοποιηθούν και θα προκαλέσουν δυσλειτουργία στην ιστοσελίδα σας, μπορούν να επαναφερθούν.', 'app_logo' => 'Λογότυπο εφαρμογής', - 'app_logo_desc' => 'Αυτή η εικόνα πρέπει να έχει μέγιστο ύψος 43px.
Οι μεγάλες εικόνες θα μειωθούν.', - 'app_primary_color' => 'Βασικό, χρώμα εφαρμογής', - 'app_primary_color_desc' => 'Ορίζει το κύριο χρώμα για την εφαρμογή, συμπεριλαμβανομένων του banner, των κουμπιών και των συνδέσμων.', + '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_homepage' => 'Αρχική σελίδα εφαρμογής', 'app_homepage_desc' => 'Επιλέξτε μια προβολή για εμφάνιση στην αρχική σελίδα αντί για την προεπιλεγμένη προβολή. Τα δικαιώματα σελίδων αγνοούνται για επιλεγμένες σελίδες.', 'app_homepage_select' => 'Επιλέξτε μια σελίδα', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Απενεργοποιεί τα σχόλια σε όλες τις σελίδες της εφαρμογής.
Τα υπάρχοντα σχόλια δεν εμφανίζονται.', // Color settings - 'content_colors' => 'Χρώματα εφαρμογής', - 'content_colors_desc' => 'Ορίζει τα χρώματα για όλα τα στοιχεία στην ιεραρχία οργάνωσης της ιστοσελίδας.
Συνιστάται η επιλογή χρωμάτων με παρόμοια φωτεινότητα με τα προεπιλεγμένα χρώματα για αναγνωσιμότητα.', + '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.', 'bookshelf_color' => 'Χρώμα Ραφιού', 'book_color' => 'Χρώμα Βιβλίων', 'chapter_color' => 'Χρώμα Κεφαλαίων Βιβλίων', diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index fa2586f8d..8bf805774 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Search this book', 'books_navigation' => 'Book Navigation', 'books_sort' => 'Sort Book Contents', + '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_named' => 'Sort Book :bookName', 'books_sort_name' => 'Sort by Name', 'books_sort_created' => 'Sort by Created Date', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Chapters Last', 'books_sort_show_other' => 'Show Other Books', 'books_sort_save' => 'Save New Order', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 52f96cbe7..703d0edbe 100644 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.', 'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.', 'uploaded' => 'The server does not allow uploads of this size. Please try a smaller file size.', + 'file_upload_timeout' => 'The file upload has timed out.', + + // Drawing & Images 'image_upload_error' => 'An error occurred uploading the image', 'image_upload_type_error' => 'The image type being uploaded is invalid', - 'file_upload_timeout' => 'The file upload has timed out.', + '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.', // Attachments 'attachment_not_found' => 'Attachment not found', diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php index f4204dd68..6f4376d42 100755 --- a/resources/lang/en/settings.php +++ b/resources/lang/en/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the section of every page. This is handy for overriding styles or adding analytics code.', 'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.', 'app_logo' => 'Application Logo', - 'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.', - 'app_primary_color' => 'Application Primary Color', - 'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.', + '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_homepage' => 'Application Homepage', 'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.', 'app_homepage_select' => 'Select a page', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disables comments across all pages in the application.
Existing comments are not shown.', // Color settings - 'content_colors' => 'Content Colors', - 'content_colors_desc' => 'Sets 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' => '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.', 'bookshelf_color' => 'Shelf Color', 'book_color' => 'Book Color', 'chapter_color' => 'Chapter Color', diff --git a/resources/lang/es/auth.php b/resources/lang/es/auth.php index 63383f1ab..13566e811 100644 --- a/resources/lang/es/auth.php +++ b/resources/lang/es/auth.php @@ -20,16 +20,16 @@ return [ 'username' => 'Usuario', 'email' => 'Correo electrónico', 'password' => 'Contraseña', - 'password_confirm' => 'Confirmar Contraseña', + 'password_confirm' => 'Confirmar contraseña', 'password_hint' => 'Debe contener al menos 8 caracteres', - 'forgot_password' => '¿Contraseña Olvidada?', + 'forgot_password' => '¿Contraseña olvidada?', 'remember_me' => 'Recordarme', 'ldap_email_hint' => 'Por favor introduzca un mail para utilizar con esta cuenta.', - 'create_account' => 'Crear una Cuenta', + 'create_account' => 'Crear una cuenta', 'already_have_account' => '¿Ya tienes una cuenta?', 'dont_have_account' => '¿No tienes una cuenta?', - 'social_login' => 'Login Social', - 'social_registration' => 'Registro Social', + 'social_login' => 'Login social', + 'social_registration' => 'Registro social', 'social_registration_text' => 'Registrar y entrar utilizando otro servicio.', 'register_thanks' => '¡Gracias por registrarse!', @@ -44,9 +44,9 @@ return [ 'auto_init_start_link' => 'Continuar con la autenticación', // Password Reset - 'reset_password' => 'Resetear Contraseña', + 'reset_password' => 'Resetear contraseña', 'reset_password_send_instructions' => 'Introduzca su correo electrónico a continuación y le será enviado un correo con un link para la restauración', - 'reset_password_send_button' => 'Enviar Enlace de Reseteo', + 'reset_password_send_button' => 'Enviar enlace de reseteo', 'reset_password_sent' => 'Un enlace para cambiar la contraseña será enviado a su dirección de correo electrónico si existe en nuestro sistema.', 'reset_password_success' => 'Su password ha sido reseteado de manera éxitosa.', 'email_reset_subject' => 'Resetee la contraseña de :appName', @@ -57,7 +57,7 @@ return [ 'email_confirm_subject' => 'Confirme su correo electrónico en :appName', 'email_confirm_greeting' => '¡Gracias por unirse a :appName!', 'email_confirm_text' => 'Por favor confirme su dirección de correo electrónico haciendo click en el siguiente botón:', - 'email_confirm_action' => 'Confirmar Correo Electrónico', + 'email_confirm_action' => 'Confirmar correo electrónico', 'email_confirm_send_error' => 'Confirmation de correo electrónico requerida pero el sistema no pudo enviar el correo. Contacte con el administrador para asegurarse de que el correo electrónico está configurado correctamente.', 'email_confirm_success' => '¡Tu correo electrónico ha sido confirmado! Ahora deberías poder iniciar sesión usando esta dirección de correo electrónico.', 'email_confirm_resent' => 'correo electrónico de confirmación reenviado, compruebe su bandeja de entrada.', diff --git a/resources/lang/es/entities.php b/resources/lang/es/entities.php index a149dc3e3..1489d1867 100644 --- a/resources/lang/es/entities.php +++ b/resources/lang/es/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Buscar en este libro', 'books_navigation' => 'Navegación de libro', 'books_sort' => 'Organizar contenido de libro', + 'books_sort_desc' => 'Mueve capítulos y páginas dentro de un libro para reorganizar su contenido. Se pueden añadir otros libros lo que permite mover fácilmente capítulos y páginas entre libros.', 'books_sort_named' => 'Organizar libro :bookName', 'books_sort_name' => 'Organizar por Nombre', 'books_sort_created' => 'Organizar por Fecha de creación', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Capítulos al final ', 'books_sort_show_other' => 'Mostrar otros libros', 'books_sort_save' => 'Guardar nuevo orden', + 'books_sort_show_other_desc' => 'Añada otros libros aquí para incluirlos en la ordenación, y permita una fácil reorganización entre libros.', + 'books_sort_move_up' => 'Subir', + 'books_sort_move_down' => 'Bajar', + 'books_sort_move_prev_book' => 'Mover al libro anterior', + 'books_sort_move_next_book' => 'Mover al siguiente libro', + 'books_sort_move_prev_chapter' => 'Mover al capítulo anterior', + 'books_sort_move_next_chapter' => 'Mover al siguiente capítulo', + 'books_sort_move_book_start' => 'Mover al inicio del libro', + 'books_sort_move_book_end' => 'Mover al final del libro', + 'books_sort_move_before_chapter' => 'Mover a antes del capítulo', + 'books_sort_move_after_chapter' => 'Mover a después del capítulo', 'books_copy' => 'Copiar Libro', 'books_copy_success' => 'Libro copiado correctamente', diff --git a/resources/lang/es/errors.php b/resources/lang/es/errors.php index 05357421f..508b8c295 100644 --- a/resources/lang/es/errors.php +++ b/resources/lang/es/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'El servidor no puede crear la miniatura de la imagen. Compruebe que tiene la extensión PHP GD instalada.', 'server_upload_limit' => 'El servidor no permite la subida de ficheros de este tamaño. Intente subir un fichero de menor tamaño.', 'uploaded' => 'El servidor no permite la subida de ficheros de este tamaño. Intente subir un fichero de menor tamaño.', + 'file_upload_timeout' => 'La carga del archivo ha caducado.', + + // Drawing & Images 'image_upload_error' => 'Ha ocurrido un error al subir la imagen', 'image_upload_type_error' => 'El tipo de imagen que se quiere subir no es válido', - 'file_upload_timeout' => 'La carga del archivo ha caducado.', + 'drawing_data_not_found' => 'No se han podido cargar los datos del dibujo. Puede que el archivo de dibujo ya no exista o que no tenga permiso para acceder a él.', // Attachments 'attachment_not_found' => 'No se encontró el adjunto', diff --git a/resources/lang/es/settings.php b/resources/lang/es/settings.php index 7bb6e2f19..8fea15670 100644 --- a/resources/lang/es/settings.php +++ b/resources/lang/es/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Cualquier contenido agregado aquí será insertado al final de la sección de cada página. Esto es útil para sobreescribir estilos o agregar código para analíticas web.', 'app_custom_html_disabled_notice' => 'El contenido personalizado para la cabecera está deshabilitado en esta página de ajustes para permitir que cualquier cambio que rompa la funcionalidad pueda ser revertido.', 'app_logo' => 'Logo de la Aplicación', - 'app_logo_desc' => 'Esta imagen debería de ser 43px de altura.
Las imágenes grandes serán escaladas.', - 'app_primary_color' => 'Color Primario de la Aplicación', - 'app_primary_color_desc' => 'Esto debería ser un valor hexadecimal.
Deje el valor vacío para restaurar al valor por defecto.', + 'app_logo_desc' => 'Se utiliza en la cabecera de la aplicación, entre otras áreas. Esta imagen debe ser de 86px de altura. Las imágenes grandes serán reducidas en tamaño.', + 'app_icon' => 'Logo de la Aplicación', + 'app_icon_desc' => 'Se utiliza para las pestañas del navegador y los accesos directos. Debería ser una imagen PNG cuadrada de 256px.', 'app_homepage' => 'Página de inicio', 'app_homepage_desc' => 'Elija la vista que se mostrará en la página de inicio en lugar de la vista predeterminada. Se ignorarán los permisos de la página seleccionada.', 'app_homepage_select' => 'Elija una página', @@ -49,7 +49,11 @@ return [ 'app_disable_comments_desc' => 'Deshabilita los comentarios en todas las páginas de la aplicación.
Los comentarios existentes no se muestran.', // Color settings - 'content_colors' => 'Colores del contenido', + 'color_scheme' => 'Esquema de color de la aplicación', + 'color_scheme_desc' => 'Establecer los colores a usar en la interfaz de BookStack. Los colores pueden configurarse por separado para que los modos oscuros y claros se ajusten mejor al tema y garanticen la legibilidad.', + 'ui_colors_desc' => 'Establezca el color principal y el color de los enlaces para BookStack. El color principal se utiliza principalmente para la cabecera, botones y decoraciones de la interfaz. El color de los enlaces se utiliza para enlaces y acciones de texto, tanto dentro del contenido escrito como en la interfaz de Bookstack.', + 'app_color' => 'Color principal', + 'link_color' => 'Color de enlaces por defecto', 'content_colors_desc' => 'Establece los colores para todos los elementos en la jerarquía de la organización de la página. Se recomienda elegir colores con un brillo similar al predeterminado para mayor legibilidad.', 'bookshelf_color' => 'Color del estante', 'book_color' => 'Color del libro', diff --git a/resources/lang/es_AR/entities.php b/resources/lang/es_AR/entities.php index 943297e5f..de8dd2716 100644 --- a/resources/lang/es_AR/entities.php +++ b/resources/lang/es_AR/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Buscar en este libro', 'books_navigation' => 'Navegación de libro', 'books_sort' => 'Organizar contenido de libro', + 'books_sort_desc' => 'Mueve capítulos y páginas dentro de un libro para reorganizar su contenido. Se pueden añadir otros libros lo que permite mover fácilmente capítulos y páginas entre libros.', 'books_sort_named' => 'Organizar libro :bookName', 'books_sort_name' => 'Organizar por nombre', 'books_sort_created' => 'Organizar por fecha de creación', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Capítulos al final', 'books_sort_show_other' => 'Mostrar otros libros', 'books_sort_save' => 'Guardar nuevo orden', + 'books_sort_show_other_desc' => 'Añada otros libros aquí para incluirlos en la ordenación, y permita una fácil reorganización entre libros.', + 'books_sort_move_up' => 'Subir', + 'books_sort_move_down' => 'Bajar', + 'books_sort_move_prev_book' => 'Mover al libro anterior', + 'books_sort_move_next_book' => 'Mover al siguiente libro', + 'books_sort_move_prev_chapter' => 'Mover al capítulo anterior', + 'books_sort_move_next_chapter' => 'Mover al siguiente capítulo', + 'books_sort_move_book_start' => 'Mover al inicio del libro', + 'books_sort_move_book_end' => 'Mover al final del libro', + 'books_sort_move_before_chapter' => 'Mover a antes del capítulo', + 'books_sort_move_after_chapter' => 'Mover a después del capítulo', 'books_copy' => 'Copiar Libro', 'books_copy_success' => 'Libro copiado correctamente', diff --git a/resources/lang/es_AR/errors.php b/resources/lang/es_AR/errors.php index 7ded67057..4607eb102 100644 --- a/resources/lang/es_AR/errors.php +++ b/resources/lang/es_AR/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'El servidor no puede crear la imagen miniatura. Por favor chequee que tiene la extensión GD instalada.', 'server_upload_limit' => 'El servidor no permite la subida de ficheros de este tamañ. Por favor intente con un fichero de menor tamañ.', 'uploaded' => 'El servidor no permite subir archivos de este tamaño. Por favor intente un tamaño menor.', + 'file_upload_timeout' => 'La carga del archivo ha caducado.', + + // Drawing & Images 'image_upload_error' => 'Ha ocurrido un error al subir la imagen', 'image_upload_type_error' => 'El tipo de imagen subida es inválido.', - 'file_upload_timeout' => 'La carga del archivo ha caducado.', + 'drawing_data_not_found' => 'No se han podido cargar los datos del dibujo. Puede que el archivo de dibujo ya no exista o que no tenga permiso para acceder a él.', // Attachments 'attachment_not_found' => 'No se encuentra el objeto adjunto', diff --git a/resources/lang/es_AR/settings.php b/resources/lang/es_AR/settings.php index 2f4c42399..30c56c686 100644 --- a/resources/lang/es_AR/settings.php +++ b/resources/lang/es_AR/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Cualquier contenido agregado aquí será agregado al final de la sección de cada página. Esto es útil para sobreescribir estilos o agregar código para analíticas.', 'app_custom_html_disabled_notice' => 'El contenido personailzado para la cabecera HTML está deshabilitado en esta configuración para garantizar que cualquier cambio importante se pueda revertir.', 'app_logo' => 'Logo de la aplicación', - 'app_logo_desc' => 'Esta imagen debería ser de 43px en altura.
Las imágenes grandes serán achicadas.', - 'app_primary_color' => 'Color primario de la aplicación', - 'app_primary_color_desc' => 'Esto debería ser un valor hexadecimal.
Deje el valor vacío para reiniciar al valor por defecto.', + 'app_logo_desc' => 'Se utiliza en la cabecera de la aplicación, entre otras áreas. Esta imagen debe ser de 86px de altura. Las imágenes grandes serán reducidas en tamaño.', + 'app_icon' => 'Logo de la Aplicación', + 'app_icon_desc' => 'Se utiliza para las pestañas del navegador y los accesos directos. Debería ser una imagen PNG cuadrada de 256px.', 'app_homepage' => 'Página de inicio de la Aplicación', 'app_homepage_desc' => 'Seleccione una página de inicio para mostrar en lugar de la vista por defecto. Se ignoran los permisos de página para las páginas seleccionadas.', 'app_homepage_select' => 'Seleccione una página', @@ -49,7 +49,11 @@ return [ 'app_disable_comments_desc' => 'Deshabilitar comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.', // Color settings - 'content_colors' => 'Colores del contenido', + 'color_scheme' => 'Esquema de color de la aplicación', + 'color_scheme_desc' => 'Establecer los colores a usar en la interfaz de BookStack. Los colores pueden configurarse por separado para que los modos oscuros y claros se ajusten mejor al tema y garanticen la legibilidad.', + 'ui_colors_desc' => 'Establezca el color principal y el color de los enlaces para BookStack. El color principal se utiliza principalmente para la cabecera, botones y decoraciones de la interfaz. El color de los enlaces se utiliza para enlaces y acciones de texto, tanto dentro del contenido escrito como en la interfaz de Bookstack.', + 'app_color' => 'Color principal', + 'link_color' => 'Color de enlaces por defecto', 'content_colors_desc' => 'Establece los colores para todos los elementos en la jerarquía de la organización de la página. Se recomienda elegir colores con un brillo similar al predeterminado para mayor legibilidad.', 'bookshelf_color' => 'Color del estante', 'book_color' => 'Color del libro', diff --git a/resources/lang/et/entities.php b/resources/lang/et/entities.php index 5b0d761b4..f873b47b5 100644 --- a/resources/lang/et/entities.php +++ b/resources/lang/et/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Otsi sellest raamatust', 'books_navigation' => 'Raamatu sisukord', 'books_sort' => 'Sorteeri raamatu sisu', + '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_named' => 'Sorteeri raamat :bookName', 'books_sort_name' => 'Sorteeri nime järgi', 'books_sort_created' => 'Sorteeri loomisaja järgi', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Peatükid tagapool', 'books_sort_show_other' => 'Näita teisi raamatuid', 'books_sort_save' => 'Salvesta uus järjekord', + '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_copy' => 'Kopeeri raamat', 'books_copy_success' => 'Raamat on kopeeritud', diff --git a/resources/lang/et/errors.php b/resources/lang/et/errors.php index b61dbb16c..adf8f9b6c 100644 --- a/resources/lang/et/errors.php +++ b/resources/lang/et/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Server ei saa piltide eelvaateid tekitada. Veendu, et PHP GD laiendus on paigaldatud.', 'server_upload_limit' => 'Server ei luba nii suurte failide üleslaadimist. Proovi väiksema failiga.', 'uploaded' => 'Server ei luba nii suurte failide üleslaadimist. Proovi väiksema failiga.', + 'file_upload_timeout' => 'Faili üleslaadimine aegus.', + + // Drawing & Images 'image_upload_error' => 'Pildi üleslaadimisel tekkis viga', 'image_upload_type_error' => 'Pildifaili tüüp ei ole korrektne', - 'file_upload_timeout' => 'Faili üleslaadimine aegus.', + '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.', // Attachments 'attachment_not_found' => 'Manust ei leitud', diff --git a/resources/lang/et/settings.php b/resources/lang/et/settings.php index 0dd7551d7..d5ae3f1ce 100644 --- a/resources/lang/et/settings.php +++ b/resources/lang/et/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Siia lisatud sisu lisatakse iga lehe sektsiooni lõppu. See võimaldab stiile üle laadida või lisada analüütika koodi.', 'app_custom_html_disabled_notice' => 'Kohandatud HTML päise sisu on sellel lehel välja lülitatud, et probleemseid muudatusi saaks tagasi võtta.', 'app_logo' => 'Rakenduse logo', - 'app_logo_desc' => 'See pildifail peaks olema 43 pikslit kõrge.
Suuremad pildifailid tehakse väiksemaks.', - 'app_primary_color' => 'Rakenduse põhivärv', - 'app_primary_color_desc' => 'Määrab rakenduse primaarse värvi, sh. päise, nuppude ja linkide jaoks.', + 'app_logo_desc' => 'Seda kasutatakse muuhulgas rakenduse päises. Pildifail peaks olema 86px kõrge. Suuremad pildid tehakse väiksemaks.', + 'app_icon' => 'Rakenduse ikoon', + 'app_icon_desc' => 'Seda ikooni kasutatakse brauseri sakkidel ja järjehoidjate ikoonidena. See peaks olema 256px ruudukujuline PNG.', 'app_homepage' => 'Rakenduse avaleht', 'app_homepage_desc' => 'Vali leht, mida näidata avalehel vaikimisi vaate asemel. Valitud lehele ei rakendata ligipääsuõiguseid.', 'app_homepage_select' => 'Vali leht', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Keelab kommentaarid kogu rakenduses.
Olemasolevaid kommentaare ei näidata.', // Color settings - 'content_colors' => 'Sisuelementide värvid', - 'content_colors_desc' => 'Määrab värvid erinevatele sisuelementidele. Loetavuse huvides on soovituslik valida värvid, mille heledus on sarnane vaikimisi värvidele.', + '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.', 'bookshelf_color' => 'Riiuli värv', 'book_color' => 'Raamatu värv', 'chapter_color' => 'Peatüki värv', diff --git a/resources/lang/eu/entities.php b/resources/lang/eu/entities.php index f1d3121a6..3df02a281 100644 --- a/resources/lang/eu/entities.php +++ b/resources/lang/eu/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Bilatu liburu hau', 'books_navigation' => 'Liburu nabigazioa', 'books_sort' => 'Ordenatu liburu edukiak', + '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_named' => 'Ordenatu :bookName liburua', 'books_sort_name' => 'Ordenatu izenaren arabera', 'books_sort_created' => 'Ordenatu argitaratze-dataren arabera', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Azken kapitulua', 'books_sort_show_other' => 'Erakutsi beste liburuak', 'books_sort_save' => 'Gorde agindu berria', + '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_copy' => 'Kopiatu liburua', 'books_copy_success' => 'Ondo kopiatu da', @@ -157,7 +169,7 @@ return [ 'chapters' => 'Kapituluak', 'x_chapters' => ':count Kapitulu|:count Kapitulu', 'chapters_popular' => 'Kapitulu ikusienak', - 'chapters_new' => 'Kopiatu kapitulua', + 'chapters_new' => 'Kapitulu berria', 'chapters_create' => 'Sortu kapitulu berria', 'chapters_delete' => 'Kapitulua ezabatu', 'chapters_delete_named' => ':chapterName kapitulua ezabatu', diff --git a/resources/lang/eu/errors.php b/resources/lang/eu/errors.php index fd6807b07..8673da630 100644 --- a/resources/lang/eu/errors.php +++ b/resources/lang/eu/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.', 'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.', 'uploaded' => 'The server does not allow uploads of this size. Please try a smaller file size.', + 'file_upload_timeout' => 'The file upload has timed out.', + + // Drawing & Images 'image_upload_error' => 'Errorea gertatu da irudia igotzerakoan', 'image_upload_type_error' => 'The image type being uploaded is invalid', - 'file_upload_timeout' => 'The file upload has timed out.', + '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.', // Attachments 'attachment_not_found' => 'Atxikia ez da aurkitu', diff --git a/resources/lang/eu/settings.php b/resources/lang/eu/settings.php index ef38d964e..b47798e30 100644 --- a/resources/lang/eu/settings.php +++ b/resources/lang/eu/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Hemen sarturiko edozein eduki eremuko behekaldean sartuko da orrialde guztietan. Honek estiloak gainditzeko edo analitika-kodea gehitzeko balio du.', 'app_custom_html_disabled_notice' => 'HTML edukiera desgaituta dago konfigurazio-orri honetan, edozein aldaketa eten daitekeela bermatzeko.', 'app_logo' => 'Aplikazioaren logoa', - 'app_logo_desc' => 'Irudi honek 43px izan behar du altueran.
Irudi handiagoak txikitu egingo dira.', - 'app_primary_color' => 'Aplikazioaren kolore lehenetsia', - 'app_primary_color_desc' => 'Konfiguratu aplikaziorako kolore nagusia, botoi, banner eta estekak barne.', + '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_homepage' => 'Aplikazioko hasiera orria', 'app_homepage_desc' => 'Aukeratu hasierako orriko bista, defektuzkoa beharrean. Orrialde baimenak ez dira kontutan hartuko aukeratutako orrialdeentzat.', 'app_homepage_select' => 'Aukeratu Orria', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disables comments across all pages in the application.
Existing comments are not shown.', // Color settings - 'content_colors' => 'Eduki koloreak', - 'content_colors_desc' => 'Sets 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' => '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.', 'bookshelf_color' => 'Apal kolorea', 'book_color' => 'Liburu kolorea', 'chapter_color' => 'Kapitulu kolorea', diff --git a/resources/lang/fa/activities.php b/resources/lang/fa/activities.php index 77ab33a2e..122efaca6 100644 --- a/resources/lang/fa/activities.php +++ b/resources/lang/fa/activities.php @@ -6,7 +6,7 @@ return [ // Pages - 'page_create' => 'تاریخ ایجاد', + 'page_create' => 'ایجاد صفحه', 'page_create_notification' => 'صفحه با موفقیت ایجاد شد', 'page_update' => 'به روزرسانی صفحه', 'page_update_notification' => 'صفحه با موفقیت به روزرسانی شد', @@ -38,9 +38,9 @@ return [ 'book_sort_notification' => 'کتاب با موفقیت مرتب سازی شد', // Bookshelves - 'bookshelf_create' => 'created shelf', + 'bookshelf_create' => 'ایجاد قفسه', 'bookshelf_create_notification' => 'قفسه کتاب با موفقیت ایجاد شد', - 'bookshelf_create_from_book' => 'converted book to shelf', + 'bookshelf_create_from_book' => 'تبدیل کتاب به قفسه', 'bookshelf_create_from_book_notification' => 'کتاب با موفقیت به یک قفسه تبدیل شد', 'bookshelf_update' => 'به روزرسانی قفسه', 'bookshelf_update_notification' => 'قفسه با موفقیت به روزرسانی شد', diff --git a/resources/lang/fa/entities.php b/resources/lang/fa/entities.php index a97ba694c..a8ac2ef89 100644 --- a/resources/lang/fa/entities.php +++ b/resources/lang/fa/entities.php @@ -107,7 +107,7 @@ return [ 'shelves_permissions_active' => 'مجوزهای قفسه فعال است', 'shelves_permissions_cascade_warning' => 'مجوزهای موجود در قفسه‌ها به طور خودکار به کتاب‌های حاوی اطلاق نمی‌شوند. دلیل آن این است که یک کتاب می تواند در چندین قفسه وجود داشته باشد. با این حال، مجوزها را می‌توان با استفاده از گزینه پایین همین صفحه در کتاب‌های فرزند کپی کرد.', 'shelves_copy_permissions_to_books' => 'کپی مجوزها در کتابها', - 'shelves_copy_permissions' => 'مجوزهای کپی', + 'shelves_copy_permissions' => 'کپی مجوزها', 'shelves_copy_permissions_explain' => 'با این کار تنظیمات مجوز فعلی این قفسه برای همه کتاب‌های موجود در آن اعمال می‌شود. قبل از فعال کردن، مطمئن شوید که هر گونه تغییر در مجوزهای این قفسه، ذخیره شده است.', 'shelves_copy_permission_success' => 'مجوزهای قفسه در :count کتاب کپی شد', @@ -141,6 +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_named' => 'مرتب‌سازی کتاب:bookName', 'books_sort_name' => 'مرتب سازی بر اساس نام', 'books_sort_created' => 'مرتب سازی بر اساس تاریخ ایجاد', @@ -149,6 +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_copy' => 'کپی کتاب', 'books_copy_success' => 'کتاب با موفقیت کپی شد', @@ -169,7 +181,7 @@ return [ 'chapters_move' => 'انتقال فصل', 'chapters_move_named' => 'انتقال فصل :chapterName', 'chapter_move_success' => 'فصل به :bookName منتقل شد', - 'chapters_copy' => 'کپی کردن فصل', + 'chapters_copy' => 'کپی فصل', 'chapters_copy_success' => 'فصل با موفقیت کپی شد', 'chapters_permissions' => 'مجوزهای فصل', 'chapters_empty' => 'در حال حاضر هیچ صفحه ای در این فصل وجود ندارد.', @@ -229,7 +241,7 @@ return [ 'pages_not_in_chapter' => 'صفحه در یک فصل نیست', 'pages_move' => 'انتقال صفحه', 'pages_move_success' => 'صفحه به ":parentName" منتقل شد', - 'pages_copy' => 'صفحه را کپی کنید', + 'pages_copy' => 'کپی صفحه', 'pages_copy_desination' => 'مقصد را کپی کنید', 'pages_copy_success' => 'صفحه با موفقیت کپی شد', 'pages_permissions' => 'مجوزهای صفحه', diff --git a/resources/lang/fa/errors.php b/resources/lang/fa/errors.php index 358396860..8bb5d71cd 100644 --- a/resources/lang/fa/errors.php +++ b/resources/lang/fa/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'سرور نمی تواند تصاویر کوچک ایجاد کند. لطفاً بررسی کنید که پسوند GD PHP را نصب کرده اید.', 'server_upload_limit' => 'سرور اجازه آپلود در این اندازه را نمی دهد. لطفا اندازه فایل کوچکتر را امتحان کنید.', 'uploaded' => 'سرور اجازه آپلود در این اندازه را نمی دهد. لطفا اندازه فایل کوچکتر را امتحان کنید.', + 'file_upload_timeout' => 'زمان بارگذاری فایل به پایان رسیده است.', + + // Drawing & Images 'image_upload_error' => 'هنگام آپلود تصویر خطایی روی داد', 'image_upload_type_error' => 'نوع تصویر در حال آپلود نامعتبر است', - 'file_upload_timeout' => 'زمان بارگذاری فایل به پایان رسیده است.', + '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.', // Attachments 'attachment_not_found' => 'پیوست یافت نشد', diff --git a/resources/lang/fa/settings.php b/resources/lang/fa/settings.php index 7a990684f..0d947fe7e 100644 --- a/resources/lang/fa/settings.php +++ b/resources/lang/fa/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'هر محتوای اضافه شده در اینجا در پایین بخش هر صفحه درج می شود. این برای تغییر سبک ها یا اضافه کردن کد تجزیه و تحلیل مفید است.', 'app_custom_html_disabled_notice' => 'محتوای سر HTML سفارشی در این صفحه تنظیمات غیرفعال است تا اطمینان حاصل شود که هر گونه تغییر شکسته می تواند برگردانده شود.', 'app_logo' => 'لوگوی برنامه', - 'app_logo_desc' => 'این تصویر باید 43 پیکسل ارتفاع داشته باشد.
تصاویر بزرگ کوچک می شوند.', - 'app_primary_color' => 'رنگ اصلی برنامه', - 'app_primary_color_desc' => 'رنگ اصلی برنامه را از جمله بنر، دکمه ها و پیوندها تنظیم می کند.', + '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_homepage' => 'صفحه اصلی برنامه', 'app_homepage_desc' => 'به جای نمای پیش‌فرض، یک نمای را برای نمایش در صفحه اصلی انتخاب کنید. مجوزهای صفحه برای صفحات انتخابی نادیده گرفته می شود.', 'app_homepage_select' => 'یک صفحه را انتخاب کنید', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'نظرات را در تمام صفحات برنامه غیرفعال می کند.
نظرات موجود نشان داده نمی شوند.', // Color settings - 'content_colors' => 'رنگ های محتوا', - 'content_colors_desc' => 'رنگ ها را برای همه عناصر در سلسله مراتب سازمان صفحه تنظیم می کند. برای خوانایی، انتخاب رنگ هایی با روشنایی مشابه با رنگ های پیش فرض توصیه می شود.', + '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.', 'bookshelf_color' => 'رنگ قفسه', 'book_color' => 'رنگ کتاب', 'chapter_color' => 'رنگ فصل', diff --git a/resources/lang/fr/editor.php b/resources/lang/fr/editor.php index f28a1740e..78c4157e8 100644 --- a/resources/lang/fr/editor.php +++ b/resources/lang/fr/editor.php @@ -150,7 +150,7 @@ return [ 'open_link_new' => 'Nouvelle fenêtre', 'remove_link' => 'Retirer le lien', 'insert_collapsible' => 'Insérer un bloc repliable', - 'collapsible_unwrap' => 'Dérouler', + 'collapsible_unwrap' => 'Sortir le contenu', 'edit_label' => 'Modifier le libellé', 'toggle_open_closed' => 'Basculer ouvert/fermé', 'collapsible_edit' => 'Modifier un bloc repliable', diff --git a/resources/lang/fr/entities.php b/resources/lang/fr/entities.php index 2136f22e4..22b451d0c 100644 --- a/resources/lang/fr/entities.php +++ b/resources/lang/fr/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Rechercher dans ce livre', 'books_navigation' => 'Navigation dans le livre', 'books_sort' => 'Trier les contenus du livre', + '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_named' => 'Trier le livre :bookName', 'books_sort_name' => 'Trier par le nom', 'books_sort_created' => 'Trier par la date de création', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Les chapitres en dernier', 'books_sort_show_other' => 'Afficher d\'autres livres', 'books_sort_save' => 'Enregistrer l\'ordre', + '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_copy' => 'Copier le livre', 'books_copy_success' => 'Livre copié avec succès', @@ -224,8 +236,8 @@ return [ 'pages_md_insert_image' => 'Insérer une image', 'pages_md_insert_link' => 'Insérer un lien', 'pages_md_insert_drawing' => 'Insérer un dessin', - 'pages_md_show_preview' => 'Show preview', - 'pages_md_sync_scroll' => 'Sync preview scroll', + 'pages_md_show_preview' => 'Prévisualisation', + 'pages_md_sync_scroll' => 'Défilement prévisualisation', 'pages_not_in_chapter' => 'La page n\'est pas dans un chapitre', 'pages_move' => 'Déplacer la page', 'pages_move_success' => 'Page déplacée à ":parentName"', diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index 9fa9c5a62..b7fb08244 100644 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Le serveur ne peut pas créer de miniature, vérifier que l\'extension PHP GD est installée.', 'server_upload_limit' => 'La taille du fichier est trop grande.', 'uploaded' => 'Le serveur n\'autorise pas l\'envoi d\'un fichier de cette taille. Veuillez essayer avec une taille de fichier réduite.', + 'file_upload_timeout' => 'Le téléchargement du fichier a expiré.', + + // Drawing & Images 'image_upload_error' => 'Une erreur est survenue pendant l\'envoi de l\'image', 'image_upload_type_error' => 'Le format de l\'image envoyée n\'est pas valide', - 'file_upload_timeout' => 'Le téléchargement du fichier a expiré.', + '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.', // Attachments 'attachment_not_found' => 'Fichier joint non trouvé', diff --git a/resources/lang/fr/settings.php b/resources/lang/fr/settings.php index 7f7731c2b..6971a016a 100644 --- a/resources/lang/fr/settings.php +++ b/resources/lang/fr/settings.php @@ -33,14 +33,14 @@ return [ 'app_custom_html_desc' => 'Le contenu inséré ici sera ajouté en bas de la balise de toutes les pages. Vous pouvez l\'utiliser pour ajouter du CSS personnalisé ou un tracker analytique.', 'app_custom_html_disabled_notice' => 'Le contenu de l\'en-tête HTML personnalisé est désactivé sur cette page de paramètres pour garantir que les modifications les plus récentes puissent être annulées.', 'app_logo' => 'Logo de l\'application', - 'app_logo_desc' => 'Cette image doit faire 43px de hauteur.
Les images plus larges seront réduites.', - 'app_primary_color' => 'Couleur principale de l\'application', - 'app_primary_color_desc' => 'Cela devrait être une valeur hexadécimale.
Laisser vide pour rétablir la couleur par défaut.', + '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_homepage' => 'Page d\'accueil de l\'application', 'app_homepage_desc' => 'Choisissez une page à afficher sur la page d\'accueil au lieu de la vue par défaut. Les permissions sont ignorées pour les pages sélectionnées.', 'app_homepage_select' => 'Choisissez une page', 'app_footer_links' => 'Liens de pied de page', - 'app_footer_links_desc' => 'Ajouter des liens à afficher dans le pied de page du site. Ils seront affichés en bas de la plupart des pages, y compris celles qui ne nécessitent pas de connexion. Vous pouvez utiliser une étiquette de "trans::" pour utiliser les traductions définies par le système. Par exemple : utiliser "trans::common.privacy_policy" fournira le texte traduit "Privacy Policy" et "trans::common.terms_of_service" fournira le texte traduit "Terms of Service".', + 'app_footer_links_desc' => 'Ajoutez des liens dans le pied de page du site. Ils seront affichés en bas de la plupart des pages, incluant celles qui ne nécesittent pas de connexion. Vous pouvez utiliser l\'étiquette "trans::" pour utiliser les traductions définies par le système. Par exemple, utiliser "trans::common.privacy_policy" fournira la traduction de "Politique de Confidentalité" et "trans::common.terms_of_service" fournira la traduction de "Conditions d\'utilisation".', 'app_footer_links_label' => 'Libellé du lien', 'app_footer_links_url' => 'URL du lien', 'app_footer_links_add' => 'Ajouter un lien en pied de page', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Désactive les commentaires sur toutes les pages de l\'application. Les commentaires existants ne sont pas affichés.', // Color settings - 'content_colors' => 'Couleur du contenu', - 'content_colors_desc' => 'Définit les couleurs pour tous les éléments de la hiérarchie d\'organisation des pages. Choisir les couleurs avec une luminosité similaire aux couleurs par défaut est recommandé pour la lisibilité.', + '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.', 'bookshelf_color' => 'Couleur des étagères', 'book_color' => 'Couleur des livres', 'chapter_color' => 'Couleur des chapitres', @@ -92,7 +96,7 @@ return [ 'maint_regen_references' => 'Régénérer les références', 'maint_regen_references_desc' => 'Cette action reconstruira l\'index des références croisées dans la base de données. Ceci est généralement géré automatiquement, mais cette action peut être utile pour indexer les anciens contenus ou contenus ajoutés par des méthodes non officielles.', 'maint_regen_references_success' => 'L\'index de référence a été régénéré !', - 'maint_timeout_command_note' => 'Note : Cette action peut prendre du temps pour s\'exécuter, ce qui peut conduire à des problèmes d\'expiration dans certains environnements Web. En tant qu\'alternative, cette action est effectuée à l\'aide d\'une commande de terminal.', + 'maint_timeout_command_note' => 'Note : Cette action peut prendre du temps pour s\'exécuter, ce qui peut conduire à des problèmes d\'expiration dans certains environnements Web. En tant qu\'alternative, cette action peut être effectuée à l\'aide d\'une commande de terminal.', // Recycle Bin 'recycle_bin' => 'Corbeille', @@ -105,19 +109,19 @@ return [ 'recycle_bin_restore' => 'Restaurer', 'recycle_bin_contents_empty' => 'La corbeille est vide', 'recycle_bin_empty' => 'Vider la corbeille', - 'recycle_bin_empty_confirm' => 'Cela détruira définitivement tous les éléments de la corbeille, y compris le contenu contenu de chaque élément. Êtes-vous sûr de vouloir vider la corbeille ?', - 'recycle_bin_destroy_confirm' => 'Cette action supprimera définitivement cet élément, ainsi que tous les éléments enfants listés ci-dessous du système et vous ne pourrez pas restaurer ce contenu. Êtes-vous sûr de vouloir supprimer définitivement cet élément ?', + 'recycle_bin_empty_confirm' => 'Cela détruira définitivement tous les éléments de la corbeille, y compris le contenu de chaque élément. Êtes-vous sûr de vouloir vider la corbeille ?', + 'recycle_bin_destroy_confirm' => 'Cette action supprimera définitivement cet élément du système ainsi que tous les éléments enfants listés ci-dessous et vous ne pourrez plus restaurer ce contenu. Êtes-vous sûr de vouloir supprimer définitivement cet élément ?', 'recycle_bin_destroy_list' => 'Éléments à détruire', 'recycle_bin_restore_list' => 'Éléments à restaurer', 'recycle_bin_restore_confirm' => 'Cette action restaurera l\'élément supprimé, y compris tous les éléments enfants, à leur emplacement d\'origine. Si l\'emplacement d\'origine a été supprimé depuis et est maintenant dans la corbeille, l\'élément parent devra également être restauré.', - 'recycle_bin_restore_deleted_parent' => 'Le parent de cet élément a également été supprimé. Ceux-ci resteront supprimés jusqu\'à ce que ce parent soit également restauré.', + 'recycle_bin_restore_deleted_parent' => 'Le parent de cet élément a aussi été supprimé. Cet élément ne pourra être restauré sans que son parent le soit également.', 'recycle_bin_restore_parent' => 'Restaurer le parent', - 'recycle_bin_destroy_notification' => ':count éléments totaux supprimés de la corbeille.', - 'recycle_bin_restore_notification' => ':count éléments totaux restaurés de la corbeille.', + 'recycle_bin_destroy_notification' => ':count éléments supprimés de la corbeille au total.', + 'recycle_bin_restore_notification' => ':count éléments restaurés de la corbeille au total.', // Audit Log 'audit' => 'Journal d\'audit', - 'audit_desc' => 'Ce journal d\'audit affiche une liste des activités suivies dans le système. Cette liste n\'est pas filtrée contrairement aux listes d\'activités similaires dans le système où les filtres d\'autorisation sont appliqués.', + 'audit_desc' => 'Ce journal d\'audit affiche un suivi des activités de l\'application. Cette liste n\'est pas filtrée contrairement aux suivis d\'activités similaires de l\'application où les filtres d\'autorisation sont appliqués.', 'audit_event_filter' => 'Filtres d\'événement', 'audit_event_filter_no_filter' => 'Pas de filtre', 'audit_deleted_item' => 'Élément supprimé', @@ -134,10 +138,10 @@ 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é| : nombre d\'affectés', + 'roles_x_users_assigned' => '1 utilisateur affecté|:count utilisateurs affectés', 'roles_x_permissions_provided' => '1 permission|:count permissions', - 'roles_assigned_users' => 'Assigned Users', - 'roles_permissions_provided' => 'Provided 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', @@ -177,7 +181,7 @@ return [ // Users 'users' => 'Utilisateurs', - 'users_index_desc' => 'Create & manage individual user accounts within the system. User accounts are used for login and attribution of content & activity. Access permissions are primarily role-based but user content ownership, among other factors, may also affect permissions & access.', + 'users_index_desc' => 'Créer et gérer des comptes utilisateur individuels au sein du système. Les comptes utilisateur sont employés pour la connexion et l\'attribution du contenu et le suivi d\'activité. Les permissions d\'accès sont principalement basées sur les rôles, mais la propriété du contenu de l\'utilisateur, entre autres facteurs, peut également affecter les permissions et l\'accès.', 'user_profile' => 'Profil d\'utilisateur', 'users_add_new' => 'Ajouter un nouvel utilisateur', 'users_search' => 'Rechercher les utilisateurs', @@ -247,8 +251,8 @@ 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_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_create' => 'Créer un nouveau Webhook', 'webhooks_none_created' => 'Aucun webhook n\'a encore été créé.', 'webhooks_edit' => 'Éditer le Webhook', diff --git a/resources/lang/he/common.php b/resources/lang/he/common.php index 50731d5d5..fa7319719 100644 --- a/resources/lang/he/common.php +++ b/resources/lang/he/common.php @@ -25,7 +25,7 @@ return [ 'actions' => 'פעולות', 'view' => 'הצג', 'view_all' => 'הצג הכל', - 'new' => 'New', + 'new' => 'חדש', 'create' => 'צור', 'update' => 'עדכן', 'edit' => 'ערוך', @@ -48,12 +48,12 @@ return [ 'previous' => 'קודם', 'filter_active' => 'מסנן פעיל:', 'filter_clear' => 'נקה מסננים', - 'download' => 'Download', - 'open_in_tab' => 'Open in Tab', + 'download' => 'הורדה', + 'open_in_tab' => 'פתח בכרטיסייה חדשה', // Sort Options 'sort_options' => 'אפשרויות מיון', - 'sort_direction_toggle' => 'Sort Direction Toggle', + 'sort_direction_toggle' => 'החלפת כיוון מיון', 'sort_ascending' => 'מיין בסדר עולה', 'sort_descending' => 'מיין בסדר יורד', 'sort_name' => 'שם', @@ -78,23 +78,23 @@ return [ 'status_active' => 'פעיל', 'status_inactive' => 'לא פעיל', 'never' => 'אף פעם', - 'none' => 'None', + 'none' => 'ללא', // Header - 'homepage' => 'Homepage', + 'homepage' => 'דף הבית', 'header_menu_expand' => 'הרחב תפריט', - 'profile_menu' => 'Profile Menu', + 'profile_menu' => 'תפריט הפרופיל', 'view_profile' => 'הצג פרופיל', 'edit_profile' => 'ערוך פרופיל', 'dark_mode' => 'מצב לילה', 'light_mode' => 'מצב יום', - 'global_search' => 'Global Search', + 'global_search' => 'חיפוש כללי', // Layout tabs 'tab_info' => 'מידע', - 'tab_info_label' => 'Tab: Show Secondary Information', + 'tab_info_label' => 'כרטיסייה: הצג מידע משני', 'tab_content' => 'תוכן', - 'tab_content_label' => 'Tab: Show Primary Content', + 'tab_content_label' => 'כרטיסייה: הצג תוכן ראשי', // Email Content 'email_action_help' => 'אם לא ניתן ללחות על כפתור ״:actionText״, יש להעתיק ולהדביק את הכתובת למטה אל דפדפן האינטרנט שלך:', diff --git a/resources/lang/he/entities.php b/resources/lang/he/entities.php index 7b7bae296..daef1adb4 100644 --- a/resources/lang/he/entities.php +++ b/resources/lang/he/entities.php @@ -141,6 +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_named' => 'מיין את הספר :bookName', 'books_sort_name' => 'מיין לפי שם', 'books_sort_created' => 'מיין לפי תאריך יצירה', @@ -149,6 +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_copy' => 'העתק ספר', 'books_copy_success' => 'ספר הועתק בהצלחה', diff --git a/resources/lang/he/errors.php b/resources/lang/he/errors.php index 2294052bc..ee19b58d8 100644 --- a/resources/lang/he/errors.php +++ b/resources/lang/he/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.', 'server_upload_limit' => 'השרת אינו מרשה העלאת קבצים במשקל זה. אנא נסה להעלות קובץ קטן יותר.', 'uploaded' => 'השרת אינו מרשה העלאת קבצים במשקל זה. אנא נסה להעלות קובץ קטן יותר.', + 'file_upload_timeout' => 'The file upload has timed out.', + + // Drawing & Images 'image_upload_error' => 'התרחשה שגיאה במהלך העלאת התמונה', 'image_upload_type_error' => 'התמונה שהועלתה אינה תקינה', - 'file_upload_timeout' => 'The file upload has timed out.', + '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.', // Attachments 'attachment_not_found' => 'קובץ מצורף לא נמצא', diff --git a/resources/lang/he/preferences.php b/resources/lang/he/preferences.php index e9a47461b..95f86d761 100644 --- a/resources/lang/he/preferences.php +++ b/resources/lang/he/preferences.php @@ -5,14 +5,14 @@ */ return [ - 'shortcuts' => 'Shortcuts', - 'shortcuts_interface' => 'Interface Keyboard Shortcuts', - 'shortcuts_toggle_desc' => 'Here you can enable or disable keyboard system interface shortcuts, used for navigation and actions.', - 'shortcuts_customize_desc' => 'You can customize each of the shortcuts below. Just press your desired key combination after selecting the input for a shortcut.', - 'shortcuts_toggle_label' => 'Keyboard shortcuts enabled', - 'shortcuts_section_navigation' => 'Navigation', - 'shortcuts_section_actions' => 'Common Actions', - 'shortcuts_save' => 'Save Shortcuts', - 'shortcuts_overlay_desc' => 'Note: When shortcuts are enabled a helper overlay is available via pressing "?" which will highlight the available shortcuts for actions currently visible on the screen.', - 'shortcuts_update_success' => 'Shortcut preferences have been updated!', + 'shortcuts' => 'קיצורי דרך', + 'shortcuts_interface' => 'קיצורי מקשים של המערכת', + 'shortcuts_toggle_desc' => 'כאן תוכל להפעיל או לבטל קיצורי דרך לממשק מערכת המקלדת, המשמשים לניווט ולפעולות.', + 'shortcuts_customize_desc' => 'אתה יכול להתאים אישית כל אחד מקיצורי הדרך למטה. פשוט לחץ על צירוף המקשים הרצוי לאחר בחירת הקלט לקיצור דרך.', + 'shortcuts_toggle_label' => 'קיצורי מקשים מופעלים', + 'shortcuts_section_navigation' => 'ניווט', + 'shortcuts_section_actions' => 'פעולות נפוצות', + 'shortcuts_save' => 'שמור קיצורי דרך', + 'shortcuts_overlay_desc' => 'הערה: כאשר קיצורי דרך מופעלים, שכבת-על מסייעת זמינה באמצעות לחיצה על "?" אשר ידגיש את קיצורי הדרך הזמינים לפעולות הנראות כעת על המסך.', + 'shortcuts_update_success' => 'העדפותיך נשמרו!', ]; \ No newline at end of file diff --git a/resources/lang/he/settings.php b/resources/lang/he/settings.php index 4be533f0c..ade3f20e0 100755 --- a/resources/lang/he/settings.php +++ b/resources/lang/he/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'כל קוד שיתווסף כאן, יופיע בתחתית תגית ה head של כל דף. חלק זה שימושי על מנת להגדיר עיצובי CSS והתקנת קוד Analytics', 'app_custom_html_disabled_notice' => 'קוד HTML מותאם מבוטל בדף ההגדרות על מנת לוודא ששינויים שגורמים לבעיה יוכלו להיות מבוטלים לאחר מכן', 'app_logo' => 'לוגו היישום', - 'app_logo_desc' => 'תמונה זו צריכה להיות בגובה 43 פיקסלים. תמונות גדולות יותר יוקטנו.', - 'app_primary_color' => 'צבע עיקרי ליישום', - 'app_primary_color_desc' => 'ערך זה צריך להיות מסוג hex.
יש להשאיר ריק לשימוש בצבע ברירת המחדל', + '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_homepage' => 'דף הבית של היישום', 'app_homepage_desc' => 'אנא בחר דף להצגה בדף הבית במקום דף ברירת המחדל. הרשאות הדף לא יחולו בדפים הנבחרים.', 'app_homepage_select' => 'בחר דף', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'מבטל את התגובות לאורך כל היישום, תגובות קיימות לא יוצגו.', // Color settings - 'content_colors' => 'צבעי התוכן', - 'content_colors_desc' => 'מגדיר צבעים לכל האלמנטים בהיררכיה הארגונית של הדף. לחווית קריאה מיטבית, מומלץ לבחור צבעים בבהירות הדומה לצבעי ברירת המחדל.', + '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.', 'bookshelf_color' => 'צבע המדף', 'book_color' => 'צבע הספר', 'chapter_color' => 'צבע הפרק', diff --git a/resources/lang/hr/entities.php b/resources/lang/hr/entities.php index cad1d50dd..963e087fa 100644 --- a/resources/lang/hr/entities.php +++ b/resources/lang/hr/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Traži knjigu', 'books_navigation' => 'Navigacija knjige', 'books_sort' => 'Razvrstaj sadržaj knjige', + '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_named' => 'Razvrstaj knjigu :bookName', 'books_sort_name' => 'Razvrstaj po imenu', 'books_sort_created' => 'Razvrstaj po datumu nastanka', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Zadnja poglavlja', 'books_sort_show_other' => 'Pokaži ostale knjige', 'books_sort_save' => 'Spremi novi poredak', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/hr/errors.php b/resources/lang/hr/errors.php index 81fadbb50..87f85180e 100644 --- a/resources/lang/hr/errors.php +++ b/resources/lang/hr/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Provjerite imate li instaliranu GD PHP ekstenziju.', 'server_upload_limit' => 'Prevelika količina za server. Pokušajte prenijeti manju veličinu.', 'uploaded' => 'Prevelika količina za server. Pokušajte prenijeti manju veličinu.', + 'file_upload_timeout' => 'Isteklo vrijeme za prijenos datoteke.', + + // Drawing & Images 'image_upload_error' => 'Problem s prenosom slike', 'image_upload_type_error' => 'Nepodržani format slike', - 'file_upload_timeout' => 'Isteklo vrijeme za prijenos datoteke.', + '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.', // Attachments 'attachment_not_found' => 'Prilozi nisu pronađeni', diff --git a/resources/lang/hr/settings.php b/resources/lang/hr/settings.php index c13a53170..8a9524ed2 100644 --- a/resources/lang/hr/settings.php +++ b/resources/lang/hr/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Sav sadržaj dodan ovdje bit će umetnut na dno stranice. To je korisno za stiliziranje i dodavanje analitičkog koda.', 'app_custom_html_disabled_notice' => 'Prilagođeni HTML je onemogućen kako bi se osiguralo vraćanje promjena u slučaju kvara.', 'app_logo' => 'Logo aplikacije', - 'app_logo_desc' => 'Slika smije biti najviše 43px u visinu.
Velike slike će biti smanjene.', - 'app_primary_color' => 'Primarna boja aplikacije', - 'app_primary_color_desc' => 'Postavlja primarnu boju za aplikaciju uključujući natpis, gumbe i veze.', + '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_homepage' => 'Glavna stranica aplikacije', 'app_homepage_desc' => 'Odaberite prikaz svoje glavne stranice umjesto već zadane. Za odabrane stranice ne vrijede zadana dopuštenja.', 'app_homepage_select' => 'Odaberi stranicu', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Onemogući komentare za sve stranice u aplikaciji.
Postojeći komentari nisu prikazani.', // Color settings - 'content_colors' => 'Boja sadržaja', - 'content_colors_desc' => 'Postavljanje boja za sve elemente stranice. Preporuča se odabir boja čija je svjetlina slična zadanim bojama.', + '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.', 'bookshelf_color' => 'Boja police', 'book_color' => 'Boja knjige', 'chapter_color' => 'Boja poglavlja', diff --git a/resources/lang/hu/entities.php b/resources/lang/hu/entities.php index 0c91cdcd3..a0442e28e 100644 --- a/resources/lang/hu/entities.php +++ b/resources/lang/hu/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Keresés ebben a könyvben', 'books_navigation' => 'Könyv navigáció', 'books_sort' => 'Könyv tartalmak rendezése', + '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_named' => ':bookName könyv rendezése', 'books_sort_name' => 'Rendezés név szerint', 'books_sort_created' => 'Rendezés létrehozás dátuma szerint', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Fejezetek hátul', 'books_sort_show_other' => 'Egyéb könyvek mutatása', 'books_sort_save' => 'Új elrendezés mentése', + '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_copy' => 'Könyv másolása', 'books_copy_success' => 'Könyv sikeresen lemásolva', diff --git a/resources/lang/hu/errors.php b/resources/lang/hu/errors.php index ec84daefd..7e31f4d63 100644 --- a/resources/lang/hu/errors.php +++ b/resources/lang/hu/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'A kiszolgáló nem tud létrehozni bélyegképeket. Ellenőrizni kell, hogy telepítve van-a a GD PHP kiterjesztés.', 'server_upload_limit' => 'A kiszolgáló nem engedélyez ilyen méretű feltöltéseket. Kisebb fájlmérettel kell próbálkozni.', 'uploaded' => 'A kiszolgáló nem engedélyez ilyen méretű feltöltéseket. Kisebb fájlmérettel kell próbálkozni.', + 'file_upload_timeout' => 'A fáj feltöltése időtúllépést okozott.', + + // Drawing & Images 'image_upload_error' => 'Hiba történt a kép feltöltése közben', 'image_upload_type_error' => 'A feltöltött kép típusa érvénytelen', - 'file_upload_timeout' => 'A fáj feltöltése időtúllépést okozott.', + '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.', // Attachments 'attachment_not_found' => 'Csatolmány nem található', diff --git a/resources/lang/hu/settings.php b/resources/lang/hu/settings.php index 2014c2a9d..e6084fdcb 100644 --- a/resources/lang/hu/settings.php +++ b/resources/lang/hu/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Az itt hozzáadott bármilyen tartalom be lesz illesztve minden oldal szekciójának aljára. Ez hasznos a stílusok felülírásához van analitikai kódok hozzáadásához.', 'app_custom_html_disabled_notice' => 'Az egyéni HTML fejléc tartalom le van tiltva ezen a beállítási oldalon, hogy az esetleg hibásan megadott módosításokat vissza lehessen állítani.', 'app_logo' => 'Alkalmazás logó', - 'app_logo_desc' => 'A képnek 43px magasnak kell lennie.
A nagy képek át lesznek méretezve.', - 'app_primary_color' => 'Alkalmazás elsődleges színe', - 'app_primary_color_desc' => 'Hexadecimális értéknek kell lennie.
Az alapértelmezés szerinti szín visszaállításához üresen kell hagyni.', + '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_homepage' => 'Alkalmazás kezdőlapja', 'app_homepage_desc' => 'A kezdőlapon az alapértelmezés szerinti nézet helyett megjelenő nézet kiválasztása. A kiválasztott oldalakon figyelmen kívül lesznek hagyva az oldal engedélyek.', 'app_homepage_select' => 'Egy oldal kiválasztása', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Megjegyzések letiltása az alkalmazás összes oldalán.
A már létező megjegyzések el lesznek rejtve.', // Color settings - 'content_colors' => 'Tartalomszínek', - 'content_colors_desc' => 'Beállítja az elemek színét az oldalszervezési hierarchiában. Az olvashatóság szempontjából javasolt az alapértelmezés szerinti színhez hasonló fényerősséget választani.', + '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.', 'bookshelf_color' => 'Polc színe', 'book_color' => 'Könyv színe', 'chapter_color' => 'Fejezet színe', diff --git a/resources/lang/id/entities.php b/resources/lang/id/entities.php index fba8a1ed4..71229e620 100644 --- a/resources/lang/id/entities.php +++ b/resources/lang/id/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Cari buku ini', 'books_navigation' => 'Navigasi Buku', 'books_sort' => 'Sortir Isi Buku', + '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_named' => 'Sortir Buku :bookName', 'books_sort_name' => 'Diurutkan berdasarkan nama', 'books_sort_created' => 'Urutkan berdasarkan Tanggal Dibuat', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Bab Terakhir', 'books_sort_show_other' => 'Tunjukkan Buku Lain', 'books_sort_save' => 'Simpan Pesanan Baru', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/id/errors.php b/resources/lang/id/errors.php index fe3fb6dec..4e93855a4 100644 --- a/resources/lang/id/errors.php +++ b/resources/lang/id/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Server tidak dapat membuat thumbnail. Harap periksa apakah Anda telah memasang ekstensi GD PHP.', 'server_upload_limit' => 'Server tidak mengizinkan unggahan dengan ukuran ini. Harap coba ukuran berkas yang lebih kecil.', 'uploaded' => 'Server tidak mengizinkan unggahan dengan ukuran ini. Harap coba ukuran berkas yang lebih kecil.', + 'file_upload_timeout' => 'Unggahan berkas telah habis waktu.', + + // Drawing & Images 'image_upload_error' => 'Terjadi kesalahan saat mengunggah gambar', 'image_upload_type_error' => 'Jenis gambar yang diunggah tidak valid', - 'file_upload_timeout' => 'Unggahan berkas telah habis waktu.', + '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.', // Attachments 'attachment_not_found' => 'Lampiran tidak ditemukan', diff --git a/resources/lang/id/settings.php b/resources/lang/id/settings.php index 4da41917f..1e3b51b18 100644 --- a/resources/lang/id/settings.php +++ b/resources/lang/id/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Konten apa pun yang ditambahkan di sini akan dimasukkan ke bagian bawah bagian dari setiap halaman. Ini berguna untuk mengganti gaya atau menambahkan kode analitik.', 'app_custom_html_disabled_notice' => 'Kustom konten HTML Head dinonaktifkan pada halaman pengaturan ini untuk memastikan setiap perubahan yang mengganggu dapat dikembalikan.', 'app_logo' => 'Logo Aplikasi', - 'app_logo_desc' => 'Gambar ini seharusnya memiliki ketinggian 43px Gambar besar akan diperkecil.', - 'app_primary_color' => 'Warna Utama Aplikasi', - 'app_primary_color_desc' => 'Menyetel warna utama untuk aplikasi termasuk spanduk, tombol, dan tautan.', + '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_homepage' => 'Beranda Aplikasi', 'app_homepage_desc' => 'Pilih tampilan untuk ditampilkan di beranda alih-alih tampilan default. Izin halaman diabaikan untuk halaman yang dipilih.', 'app_homepage_select' => 'Pilih halaman', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Menonaktifkan komentar di semua halaman dalam aplikasi.
Komentar yang ada tidak ditampilkan.', // Color settings - 'content_colors' => 'Warna Konten', - 'content_colors_desc' => 'Menyetel warna untuk semua elemen dalam hierarki organisasi halaman. Disarankan memilih warna dengan kecerahan yang mirip dengan warna default agar mudah dibaca.', + '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.', 'bookshelf_color' => 'Warna Rak', 'book_color' => 'Warna Buku', 'chapter_color' => 'Warna Bab', diff --git a/resources/lang/it/entities.php b/resources/lang/it/entities.php index d93d6f015..32e3b7b16 100755 --- a/resources/lang/it/entities.php +++ b/resources/lang/it/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Cerca in questo libro', 'books_navigation' => 'Navigazione Libro', 'books_sort' => 'Ordina il contenuto del libro', + 'books_sort_desc' => 'Spostare capitoli e pagine all\'interno di un libro per riorganizzarne il contenuto. È possibile aggiungere altri libri, per spostare facilmente capitoli e pagine da un libro all\'altro.', 'books_sort_named' => 'Ordina il libro :bookName', 'books_sort_name' => 'Ordina per Nome', 'books_sort_created' => 'Ordina per Data di Creazione', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Capitoli Per Ultimi', 'books_sort_show_other' => 'Mostra Altri Libri', 'books_sort_save' => 'Salva il nuovo ordine', + 'books_sort_show_other_desc' => 'Aggiungere qui altri libri per includerli nell\'operazione di ordinamento e consentire una facile riorganizzazione incrociata dei libri.', + 'books_sort_move_up' => 'Muovi su', + 'books_sort_move_down' => 'Muovi giù', + 'books_sort_move_prev_book' => 'Passare al libro precedente', + 'books_sort_move_next_book' => 'Passare al libro successivo', + 'books_sort_move_prev_chapter' => 'Passare al capitolo precedente', + 'books_sort_move_next_chapter' => 'Passare al capitolo successivo', + 'books_sort_move_book_start' => 'Spostarsi all\'inizio del libro', + 'books_sort_move_book_end' => 'Spostarsi alla fine del libro', + 'books_sort_move_before_chapter' => 'Passare al capitolo precedente', + 'books_sort_move_after_chapter' => 'Passare al capitolo successivo', 'books_copy' => 'Copia Libro', 'books_copy_success' => 'Libro copiato con successo', diff --git a/resources/lang/it/errors.php b/resources/lang/it/errors.php index 2176b44ba..815cd22b9 100755 --- a/resources/lang/it/errors.php +++ b/resources/lang/it/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Il server non può creare thumbnail. Controlla che l\'estensione GD sia installata.', 'server_upload_limit' => 'Il server non permette un upload di questa grandezza. Prova con un file più piccolo.', 'uploaded' => 'Il server non consente upload di questa grandezza. Prova un file più piccolo.', + 'file_upload_timeout' => 'Il caricamento del file è andato in timeout.', + + // Drawing & Images 'image_upload_error' => 'C\'è stato un errore caricando l\'immagine', 'image_upload_type_error' => 'Il tipo di immagine caricata non è valido', - 'file_upload_timeout' => 'Il caricamento del file è andato in timeout.', + 'drawing_data_not_found' => 'Non è stato possibile caricare i dati del disegno. È possibile che il file del disegno non esista più o che non si abbia il permesso di accedervi.', // Attachments 'attachment_not_found' => 'Allegato non trovato', diff --git a/resources/lang/it/settings.php b/resources/lang/it/settings.php index 6776c2cb9..27a0db8e0 100755 --- a/resources/lang/it/settings.php +++ b/resources/lang/it/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Qualsiasi contenuto aggiunto qui verrà inserito alla fine della sezione di tutte le pagine. Questo è utile per sovrascrivere lo stile o aggiungere il codice per gli analytics.', 'app_custom_html_disabled_notice' => 'Il contenuto HTML personalizzato è disabilitato su questa pagina impostazioni per garantire che eventuali modifiche possano essere ripristinate.', 'app_logo' => 'Logo applicazione', - 'app_logo_desc' => 'Questa immagine dovrebbe essere 43px in altezza.
Immagini più grandi verranno scalate.', - 'app_primary_color' => 'Colore primario applicazione', - 'app_primary_color_desc' => 'Deve essere un valore hex.
Lascia vuoto per reimpostare il colore di default.', + 'app_logo_desc' => 'Viene utilizzata nella barra di intestazione dell\'applicazione, tra le altre aree. L\'immagine deve avere un\'altezza di 86px. Le immagini più grandi saranno ridimensionate.', + 'app_icon' => 'Icona Applicazione', + 'app_icon_desc' => 'Questa icona viene utilizzata per le schede del browser e per le icone di collegamento. Deve essere un\'immagine PNG quadrata di 256px.', 'app_homepage' => 'Homepage Applicazione', 'app_homepage_desc' => 'Seleziona una pagina da mostrare nella home anzichè quella di default. I permessi della pagina sono ignorati per quella selezionata.', 'app_homepage_select' => 'Seleziona una pagina', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disabilita i commenti su tutte le pagine nell\'applicazione. I commenti esistenti non sono mostrati. ', // Color settings - 'content_colors' => 'Colori del contenuto', - 'content_colors_desc' => 'Imposta i colori per tutti gli elementi nella gerarchia della pagina. È raccomandato scegliere colori con una luminosità simile a quelli di default per una maggiore leggibilità.', + 'color_scheme' => 'Schema di colore dell\'applicazione', + 'color_scheme_desc' => 'Imposta i colori da utilizzare nell\'interfaccia di BookStack. I colori possono essere configurati separatamente per le modalità scura e chiara per adattarsi al meglio al tema e garantire la leggibilità.', + 'ui_colors_desc' => 'Imposta il colore primario e il colore predefinito dei collegamenti per BookStack. Il colore primario è utilizzato principalmente per il banner dell\'intestazione, i pulsanti e le decorazioni dell\'interfaccia. Il colore predefinito dei link è utilizzato per i link e le azioni basate sul testo, sia all\'interno dei contenuti scritti che nell\'interfaccia di Bookstack.', + 'app_color' => 'Colore Principale', + 'link_color' => 'Colore preferito del link', + 'content_colors_desc' => 'Impostare i colori per tutti gli elementi nella gerarchia dell\'organizzazione della pagina. Si consiglia di scegliere colori con una luminosità simile a quella dei colori predefiniti per garantire la leggibilità.', 'bookshelf_color' => 'Colore della libreria', 'book_color' => 'Colore del libro', 'chapter_color' => 'Colore del capitolo', diff --git a/resources/lang/ja/entities.php b/resources/lang/ja/entities.php index 57a644c3f..71f4ac9c6 100644 --- a/resources/lang/ja/entities.php +++ b/resources/lang/ja/entities.php @@ -141,6 +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_named' => 'ブック「:bookName」を並べ替え', 'books_sort_name' => '名前で並べ替え', 'books_sort_created' => '作成日で並べ替え', @@ -149,6 +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_copy' => 'ブックをコピー', 'books_copy_success' => 'ブックが正常にコピーされました', diff --git a/resources/lang/ja/errors.php b/resources/lang/ja/errors.php index d7f1e54ff..2cb189929 100644 --- a/resources/lang/ja/errors.php +++ b/resources/lang/ja/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'このサーバはサムネイルを作成できません。GD PHP extensionがインストールされていることを確認してください。', 'server_upload_limit' => 'このサイズの画像をアップロードすることは許可されていません。ファイルサイズを小さくし、再試行してください。', 'uploaded' => 'このサイズの画像をアップロードすることは許可されていません。ファイルサイズを小さくし、再試行してください。', + 'file_upload_timeout' => 'ファイルのアップロードがタイムアウトしました。', + + // Drawing & Images 'image_upload_error' => '画像アップロード時にエラーが発生しました。', 'image_upload_type_error' => 'アップロード中の画像の種類が無効です', - 'file_upload_timeout' => 'ファイルのアップロードがタイムアウトしました。', + '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.', // Attachments 'attachment_not_found' => '添付ファイルが見つかりません', diff --git a/resources/lang/ja/settings.php b/resources/lang/ja/settings.php index 61e6f69f1..5efaad137 100644 --- a/resources/lang/ja/settings.php +++ b/resources/lang/ja/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'スタイルシートやアナリティクスコード追加したい場合、ここを編集します。これはの最下部に挿入されます。', 'app_custom_html_disabled_notice' => '重大な変更を元に戻せるよう、この設定ページではカスタムのHTML headコンテンツが無効になっています。', 'app_logo' => 'ロゴ', - 'app_logo_desc' => '高さ43pxで表示されます。これを上回る場合、自動で縮小されます。', - 'app_primary_color' => 'プライマリカラー', - 'app_primary_color_desc' => '16進数カラーコードで入力します。空にした場合、デフォルトの色にリセットされます。', + '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_homepage' => 'アプリケーションのホームページ', 'app_homepage_desc' => 'デフォルトのビューの代わりにホームページに表示するビューを選択します。選択したページの権限は無視されます。', 'app_homepage_select' => 'ページを選択', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'アプリケーション内のすべてのページのコメントを無効にします。既存のコメントは表示されません。', // Color settings - 'content_colors' => 'コンテンツの色', - 'content_colors_desc' => 'ページ構成階層のすべての要素に色を設定します。読みやすさを考慮して、デフォルトの色と同じような明るさの色を選ぶことをお勧めします。', + '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.', 'bookshelf_color' => '本棚の色', 'book_color' => 'ブックの色', 'chapter_color' => 'チャプターの色', diff --git a/resources/lang/ka/entities.php b/resources/lang/ka/entities.php index fa2586f8d..8bf805774 100644 --- a/resources/lang/ka/entities.php +++ b/resources/lang/ka/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Search this book', 'books_navigation' => 'Book Navigation', 'books_sort' => 'Sort Book Contents', + '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_named' => 'Sort Book :bookName', 'books_sort_name' => 'Sort by Name', 'books_sort_created' => 'Sort by Created Date', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Chapters Last', 'books_sort_show_other' => 'Show Other Books', 'books_sort_save' => 'Save New Order', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/ka/errors.php b/resources/lang/ka/errors.php index 52f96cbe7..703d0edbe 100644 --- a/resources/lang/ka/errors.php +++ b/resources/lang/ka/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.', 'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.', 'uploaded' => 'The server does not allow uploads of this size. Please try a smaller file size.', + 'file_upload_timeout' => 'The file upload has timed out.', + + // Drawing & Images 'image_upload_error' => 'An error occurred uploading the image', 'image_upload_type_error' => 'The image type being uploaded is invalid', - 'file_upload_timeout' => 'The file upload has timed out.', + '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.', // Attachments 'attachment_not_found' => 'Attachment not found', diff --git a/resources/lang/ka/settings.php b/resources/lang/ka/settings.php index f4204dd68..6f4376d42 100644 --- a/resources/lang/ka/settings.php +++ b/resources/lang/ka/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the section of every page. This is handy for overriding styles or adding analytics code.', 'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.', 'app_logo' => 'Application Logo', - 'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.', - 'app_primary_color' => 'Application Primary Color', - 'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.', + '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_homepage' => 'Application Homepage', 'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.', 'app_homepage_select' => 'Select a page', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disables comments across all pages in the application.
Existing comments are not shown.', // Color settings - 'content_colors' => 'Content Colors', - 'content_colors_desc' => 'Sets 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' => '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.', 'bookshelf_color' => 'Shelf Color', 'book_color' => 'Book Color', 'chapter_color' => 'Chapter Color', diff --git a/resources/lang/ko/entities.php b/resources/lang/ko/entities.php index 3b73e0858..7ae1313c6 100644 --- a/resources/lang/ko/entities.php +++ b/resources/lang/ko/entities.php @@ -141,6 +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_named' => ':bookName 정렬', 'books_sort_name' => '제목', 'books_sort_created' => '만든 날짜', @@ -149,6 +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_copy' => '책 복사하기', 'books_copy_success' => '책 복사함', diff --git a/resources/lang/ko/errors.php b/resources/lang/ko/errors.php index 9dd8225ff..4390ab7ca 100644 --- a/resources/lang/ko/errors.php +++ b/resources/lang/ko/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => '섬네일을 못 만들었습니다. PHP에 GD 확장 도구를 설치하세요.', 'server_upload_limit' => '파일 크기가 서버에서 허용하는 수치를 넘습니다.', 'uploaded' => '파일 크기가 서버에서 허용하는 수치를 넘습니다.', + 'file_upload_timeout' => '파일을 올리는 데 걸리는 시간이 서버에서 허용하는 수치를 넘습니다.', + + // Drawing & Images 'image_upload_error' => '이미지를 올리다 문제가 생겼습니다.', 'image_upload_type_error' => '유효하지 않은 이미지 형식입니다.', - 'file_upload_timeout' => '파일을 올리는 데 걸리는 시간이 서버에서 허용하는 수치를 넘습니다.', + '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.', // Attachments 'attachment_not_found' => '첨부 파일이 없습니다.', diff --git a/resources/lang/ko/settings.php b/resources/lang/ko/settings.php index 76e835a42..e503e54d7 100755 --- a/resources/lang/ko/settings.php +++ b/resources/lang/ko/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => '설정 페이지를 제외한 모든 페이지 head 태그 끝머리에 추가합니다.', 'app_custom_html_disabled_notice' => '문제가 생겨도 설정 페이지에서 되돌릴 수 있어요.', 'app_logo' => '사이트 로고', - 'app_logo_desc' => '높이를 43px로 구성하세요. 큰 이미지는 축소합니다.', - 'app_primary_color' => '사이트 색채', - 'app_primary_color_desc' => '16진수로 구성하세요. 비웠을 때는 기본 색상으로 설정합니다.', + '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_homepage' => '처음 페이지', 'app_homepage_desc' => '고른 페이지에 설정한 권한은 무시합니다.', 'app_homepage_select' => '문서 고르기', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => '모든 페이지에서 댓글을 숨깁니다.', // Color settings - 'content_colors' => '본문 색상', - 'content_colors_desc' => '기본 색상과 유사한 밝기를 가진 색상으로 가독성을 높이는 것을 추천합니다.', + '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.', 'bookshelf_color' => '책꽂이 색상', 'book_color' => '책 색상', 'chapter_color' => '챕터 색상', diff --git a/resources/lang/lt/entities.php b/resources/lang/lt/entities.php index 80eb47918..1d1ee1f81 100644 --- a/resources/lang/lt/entities.php +++ b/resources/lang/lt/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Ieškoti šioje knygoje', 'books_navigation' => 'Knygos naršymas', 'books_sort' => 'Rūšiuoti pagal knygos turinį', + '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_named' => 'Rūšiuoti knygą :bookName', 'books_sort_name' => 'Rūšiuoti pagal vardą', 'books_sort_created' => 'Rūšiuoti pagal sukūrimo datą', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Skyriaus pabaiga', 'books_sort_show_other' => 'Rodyti kitas knygas', 'books_sort_save' => 'Išsaugoti naują įsakymą', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/lt/errors.php b/resources/lang/lt/errors.php index ac93298cb..8dd3b66fd 100644 --- a/resources/lang/lt/errors.php +++ b/resources/lang/lt/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Serveris negali sukurti miniatiūros. Prašome patikrinkite, ar turite įdiegtą GD PHP plėtinį.', 'server_upload_limit' => 'Serveris neleidžia įkelti tokio dydžio failų. Prašome bandykite mažesnį failo dydį.', 'uploaded' => 'Serveris neleidžia įkelti tokio dydžio failų. Prašome bandykite mažesnį failo dydį.', + 'file_upload_timeout' => 'Failo įkėlimo laikas baigėsi', + + // Drawing & Images 'image_upload_error' => 'Įvyko klaida įkeliant vaizdą', 'image_upload_type_error' => 'Vaizdo tipas, kurį norima įkelti, yra neteisingas', - 'file_upload_timeout' => 'Failo įkėlimo laikas baigėsi', + '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.', // Attachments 'attachment_not_found' => 'Priedas nerastas', diff --git a/resources/lang/lt/settings.php b/resources/lang/lt/settings.php index 10c98aa9b..796cbfb84 100644 --- a/resources/lang/lt/settings.php +++ b/resources/lang/lt/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Bet koks čia pridedamas turinys bus prisegamas apačioje kiekvieno puslapio skyriuje. Tai yra patogu svarbesniems stiliams arba pridedant analizės kodą.', 'app_custom_html_disabled_notice' => 'Pasirinktinis HTML antraštės turinys yra išjungtas šiame nustatymų puslapyje užtikrinti, kad bet kokie negeri pokyčiai galėtų būti anuliuojami.', 'app_logo' => 'Programos logotipas', - 'app_logo_desc' => 'Šis vaizdas turėtų būti 43px aukščio.
Dideli vaizdai bus sumažinti.', - 'app_primary_color' => 'Programos pagrindinė spalva', - 'app_primary_color_desc' => 'Nustato pagrindinę spalvą programai, įskaitant reklamjuostę, mygtukus ir nuorodas.', + '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_homepage' => 'Programos pagrindinis puslapis', 'app_homepage_desc' => 'Pasirinkite vaizdą rodyti pagrindiniame paslapyje vietoj numatyto vaizdo. Puslapio leidimai yra ignoruojami pasirinktiems puslapiams.', 'app_homepage_select' => 'Pasirinkti puslapį', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Išjungti komentarus visuose programos puslapiuose.
Esantys komentarai nerodomi.', // Color settings - 'content_colors' => 'Turinio spalvos', - 'content_colors_desc' => 'Nustato spalvas visiems elementams puslapio organizacijos herarchijoje. Rekomenduojama pasirinkti spalvas su panačiu šviesumu kaip numatytos spalvos, kad būtų lengviau skaityti.', + '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.', 'bookshelf_color' => 'Lentynos spalva', 'book_color' => 'Knygos spalva', 'chapter_color' => 'Skyriaus spalva', diff --git a/resources/lang/lv/entities.php b/resources/lang/lv/entities.php index 9ef618f52..62c3379bf 100644 --- a/resources/lang/lv/entities.php +++ b/resources/lang/lv/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Meklēt šajā grāmatā', 'books_navigation' => 'Grāmatas navigācija', 'books_sort' => 'Kārtot grāmatas saturu', + '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_named' => 'Kārtot grāmatu :bookName', 'books_sort_name' => 'Kārtot pēc nosaukuma', 'books_sort_created' => 'Kārtot pēc izveidošanas datuma', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Nodaļas pēdējās', 'books_sort_show_other' => 'Rādīt citas grāmatas', 'books_sort_save' => 'Saglabāt jauno kārtību', + '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_copy' => 'Kopēt grāmatu', 'books_copy_success' => 'Grāmata veiksmīgi nokopēta', diff --git a/resources/lang/lv/errors.php b/resources/lang/lv/errors.php index 0a7190fa6..4e9b5b29a 100644 --- a/resources/lang/lv/errors.php +++ b/resources/lang/lv/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Serveris nevar izveidot samazinātus attēlus. Lūdzu pārbaudiet, vai ir uzstādīts PHP GD paplašinājums.', 'server_upload_limit' => 'Serveris neatļauj šāda izmēra failu ielādi. Lūdzu mēģiniet mazāka izmēra failu.', 'uploaded' => 'Serveris neatļauj šāda izmēra failu ielādi. Lūdzu mēģiniet mazāka izmēra failu.', + 'file_upload_timeout' => 'Faila augšupielādē ir iestājies noilgums.', + + // Drawing & Images 'image_upload_error' => 'Radās kļūda augšupielādējot attēlu', 'image_upload_type_error' => 'Ielādējamā attēla tips nav derīgs', - 'file_upload_timeout' => 'Faila augšupielādē ir iestājies noilgums.', + '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.', // Attachments 'attachment_not_found' => 'Pielikums nav atrasts', diff --git a/resources/lang/lv/settings.php b/resources/lang/lv/settings.php index ec4009b5d..8148228d2 100644 --- a/resources/lang/lv/settings.php +++ b/resources/lang/lv/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Šis saturs tiks pievienots sadaļas apakšā visām lapām. Tas ir noderīgi papildinot CSS stilus vai pievienojot analītikas kodu.', 'app_custom_html_disabled_notice' => 'Pielāgots HTML head saturs ir izslēgts šajā uzstādījumu lapā, lai nodrošinātu, ka iespējams atcelt jebkādas kritiskas izmaiņas.', 'app_logo' => 'Lietotnes logo', - 'app_logo_desc' => 'Attēlam jābūt 43px augstam.
Lielāki attēli tiks samazināti.', - 'app_primary_color' => 'Galvenā aplikācijas krāsa', - 'app_primary_color_desc' => 'Uzstāda primāro krāsu aplikācijai, ieskaitot banneri, pogas un saites.', + '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_homepage' => 'Aplikācijas sākumlapa', 'app_homepage_desc' => 'Izvēlēties skatu, ko rādīt sākumlapā noklusētā skata vietā. Lapas piekļuves tiesības izvēlētajai lapai netiks ņemtas vērā.', 'app_homepage_select' => 'Izvēlēties lapu', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Atslēdz komentārus visās aplikācijas lapās.
Jau eksistējoši komentāri netiks attēloti.', // Color settings - 'content_colors' => 'Satura krāsas', - 'content_colors_desc' => 'Norādīt krāsas visiem lapas hierarhijas elementiem. Lasāmības labad ieteicams izvēlēties krāsas ar līdzīgu spilgtumu kā noklusētajām.', + '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.', 'bookshelf_color' => 'Plaukta krāsa', 'book_color' => 'Grāmatas krāsa', 'chapter_color' => 'Nodaļas krāsa', diff --git a/resources/lang/nb/entities.php b/resources/lang/nb/entities.php index c0f5b0e05..dd34bbeba 100644 --- a/resources/lang/nb/entities.php +++ b/resources/lang/nb/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Søk i boken', 'books_navigation' => 'Boknavigasjon', 'books_sort' => 'Sorter bokinnhold', + '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_named' => 'Sorter boken :bookName', 'books_sort_name' => 'Sorter på navn', 'books_sort_created' => 'Sorter på opprettet dato', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Kapitler sist', 'books_sort_show_other' => 'Vis andre bøker', 'books_sort_save' => 'Lagre sortering', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/nb/errors.php b/resources/lang/nb/errors.php index 7f3bc14c3..66eb2bb78 100644 --- a/resources/lang/nb/errors.php +++ b/resources/lang/nb/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Kan ikke opprette miniatyrbilder. GD PHP er ikke installert.', 'server_upload_limit' => 'Vedlegget er for stort, forsøk med et mindre vedlegg.', 'uploaded' => 'Tjenesten aksepterer ikke vedlegg som er så stor.', + 'file_upload_timeout' => 'Opplastingen gikk ut på tid.', + + // Drawing & Images 'image_upload_error' => 'Bildet kunne ikke lastes opp, forsøk igjen.', 'image_upload_type_error' => 'Bildeformatet støttes ikke, forsøk med et annet format.', - 'file_upload_timeout' => 'Opplastingen gikk ut på tid.', + '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.', // Attachments 'attachment_not_found' => 'Vedlegget ble ikke funnet', diff --git a/resources/lang/nb/settings.php b/resources/lang/nb/settings.php index 54cb7228c..6f903706d 100644 --- a/resources/lang/nb/settings.php +++ b/resources/lang/nb/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Alt innhold som legges til her, blir satt inn i bunnen av -delen på hver side. Dette er praktisk for å overstyre stiler eller legge til analysekode.', 'app_custom_html_disabled_notice' => 'Tilpasset HTML-hodeinnhold er deaktivert på denne innstillingssiden for å sikre at eventuelle endringer ødelegger noe, kan tilbakestilles.', 'app_logo' => 'Applikasjonslogo', - 'app_logo_desc' => 'Dette bildet skal være 43 px høyt.
Store bilder blir nedskalert.', - 'app_primary_color' => 'Applikasjonens primærfarge', - 'app_primary_color_desc' => 'Angir primærfargen for applikasjonen inkludert banner, knapper og lenker.', + '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_homepage' => 'Applikasjonens hjemmeside', 'app_homepage_desc' => 'Velg en visning som skal vises på hjemmesiden i stedet for standardvisningen. Sidetillatelser ignoreres for utvalgte sider.', 'app_homepage_select' => 'Velg en side', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Deaktiver kommentarer på tvers av alle sidene i applikasjonen.
Eksisterende kommentarer vises ikke.', // Color settings - 'content_colors' => 'Innholdsfarger', - 'content_colors_desc' => 'Angir farger for alle elementene i sideorganisasjonshierarkiet. Det anbefales å lese farger med en lignende lysstyrke som standardfargene for lesbarhet.', + '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.', 'bookshelf_color' => 'Hyllefarge', 'book_color' => 'Bokfarge', 'chapter_color' => 'Kapittelfarge', diff --git a/resources/lang/nl/entities.php b/resources/lang/nl/entities.php index 09471feb8..4652d1773 100644 --- a/resources/lang/nl/entities.php +++ b/resources/lang/nl/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Zoeken in dit boek', 'books_navigation' => 'Boek navigatie', 'books_sort' => 'Inhoud van het boek sorteren', + '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_named' => 'Sorteer boek :bookName', 'books_sort_name' => 'Sorteren op naam', 'books_sort_created' => 'Sorteren op datum van aanmaken', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Hoofdstukken laatst', 'books_sort_show_other' => 'Bekijk andere boeken', 'books_sort_save' => 'Nieuwe volgorde opslaan', + '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_copy' => 'Kopieer Boek', 'books_copy_success' => 'Boek succesvol gekopieerd', @@ -224,8 +236,8 @@ return [ 'pages_md_insert_image' => 'Afbeelding invoegen', 'pages_md_insert_link' => 'Entity link invoegen', 'pages_md_insert_drawing' => 'Tekening invoegen', - 'pages_md_show_preview' => 'Show preview', - 'pages_md_sync_scroll' => 'Sync preview scroll', + 'pages_md_show_preview' => 'Toon preview', + 'pages_md_sync_scroll' => 'Synchroniseer preview scroll', 'pages_not_in_chapter' => 'Deze pagina staat niet in een hoofdstuk', 'pages_move' => 'Pagina verplaatsten', 'pages_move_success' => 'Pagina verplaatst naar ":parentName"', diff --git a/resources/lang/nl/errors.php b/resources/lang/nl/errors.php index 9ee41f649..920579e97 100644 --- a/resources/lang/nl/errors.php +++ b/resources/lang/nl/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'De server kon geen miniaturen maken. Controleer of je de GD PHP extensie geïnstalleerd hebt.', 'server_upload_limit' => 'De server staat geen uploads van deze grootte toe. Probeer een kleinere bestandsgrootte.', 'uploaded' => 'De server staat geen uploads van deze grootte toe. Probeer een kleinere bestandsgrootte.', + 'file_upload_timeout' => 'Het uploaden van het bestand is verlopen.', + + // Drawing & Images 'image_upload_error' => 'Er is een fout opgetreden bij het uploaden van de afbeelding', 'image_upload_type_error' => 'Het geüploade afbeeldingstype is ongeldig', - 'file_upload_timeout' => 'Het uploaden van het bestand is verlopen.', + '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.', // Attachments 'attachment_not_found' => 'Bijlage niet gevonden', diff --git a/resources/lang/nl/settings.php b/resources/lang/nl/settings.php index 470805053..5b05d5be2 100644 --- a/resources/lang/nl/settings.php +++ b/resources/lang/nl/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Alle hieronder toegevoegde data wordt aan het einde van de sectie van elke pagina toegevoegd. Gebruik dit om stijlen te overschrijven of analytische code toe te voegen.', 'app_custom_html_disabled_notice' => 'Bovenstaande wordt niet toegevoegd aan deze pagina om ervoor te zorgen dat je foutieve code steeds ongedaan kan maken.', 'app_logo' => 'Applicatielogo', - 'app_logo_desc' => 'De afbeelding moet 43px hoog zijn.
Grotere afbeeldingen worden geschaald.', - 'app_primary_color' => 'Applicatie hoofdkleur', - 'app_primary_color_desc' => 'Stelt de primaire kleur in voor de applicatie, inclusief de banner, knoppen en hyperlinks.', + '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_homepage' => 'Applicatie Startpagina', 'app_homepage_desc' => 'Selecteer een weergave om weer te geven op de startpagina in plaats van de standaard weergave. Paginamachtigingen worden genegeerd voor geselecteerde pagina\'s.', 'app_homepage_select' => 'Selecteer een pagina', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Schakel reacties uit op alle pagina\'s in de applicatie.
Bestaande reacties worden niet getoond.', // Color settings - 'content_colors' => 'Kleuren van inhoud', - 'content_colors_desc' => 'Stelt de kleuren in voor alle elementen van de hiërarchische pagina-indeling. Voor de leesbaarheid wordt aanbevolen kleuren te kiezen met een vergelijkbare helderheid als de standaardkleuren.', + '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.', 'bookshelf_color' => 'Kleur van de Boekenplank', 'book_color' => 'Kleur van het Boek', 'chapter_color' => 'Kleur van het Hoofdstuk', diff --git a/resources/lang/pl/entities.php b/resources/lang/pl/entities.php index b4eed43fb..0063af6d9 100644 --- a/resources/lang/pl/entities.php +++ b/resources/lang/pl/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Wyszukaj w tej książce', 'books_navigation' => 'Nawigacja po książce', 'books_sort' => 'Sortuj zawartość książki', + 'books_sort_desc' => 'Przenieś rozdziały i strony w książce w celu reorganizacji jej treści. Można dodać inne książki, co umożliwia łatwe przenoszenie rozdziałów i stron między książkami.', 'books_sort_named' => 'Sortuj książkę :bookName', 'books_sort_name' => 'Sortuj według nazwy', 'books_sort_created' => 'Sortuj według daty utworzenia', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Rozdziały na końcu', 'books_sort_show_other' => 'Pokaż inne książki', 'books_sort_save' => 'Zapisz nową kolejność', + 'books_sort_show_other_desc' => 'Dodaj tutaj inne książki, aby uwzględnić je w operacji sortowania i umożliwić łatwą wieloksiążkową reorganizację.', + 'books_sort_move_up' => 'Przesuń w górę', + 'books_sort_move_down' => 'Przesuń w dół', + 'books_sort_move_prev_book' => 'Przenieś do poprzedniej książki', + 'books_sort_move_next_book' => 'Przenieś do następnej książki', + 'books_sort_move_prev_chapter' => 'Przenieś do poprzedniego rozdziału', + 'books_sort_move_next_chapter' => 'Przenieś do następnego rozdziału', + 'books_sort_move_book_start' => 'Przenieś na początek książki', + 'books_sort_move_book_end' => 'Przenieś na koniec książki', + 'books_sort_move_before_chapter' => 'Przenieś przed rozdział', + 'books_sort_move_after_chapter' => 'Przenieś za rozdział', 'books_copy' => 'Skopiuj Książkę', 'books_copy_success' => 'Książka skopiowana pomyślnie', diff --git a/resources/lang/pl/errors.php b/resources/lang/pl/errors.php index e493705b5..d91e01f5a 100644 --- a/resources/lang/pl/errors.php +++ b/resources/lang/pl/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Serwer nie może utworzyć miniaturek. Upewnij się że rozszerzenie GD PHP zostało zainstalowane.', 'server_upload_limit' => 'Serwer nie pozwala na przyjęcie pliku o tym rozmiarze. Spróbuj przesłać plik o mniejszym rozmiarze.', 'uploaded' => 'Serwer nie pozwala na przyjęcie pliku o tym rozmiarze. Spróbuj przesłać plik o mniejszym rozmiarze.', + 'file_upload_timeout' => 'Przesyłanie pliku przekroczyło limit czasu.', + + // Drawing & Images 'image_upload_error' => 'Wystąpił błąd podczas przesyłania obrazka', 'image_upload_type_error' => 'Typ przesłanego obrazka jest nieprwidłowy.', - 'file_upload_timeout' => 'Przesyłanie pliku przekroczyło limit czasu.', + 'drawing_data_not_found' => 'Nie można załadować danych rysunku. Plik rysunku może już nie istnieć lub nie masz uprawnień dostępu do niego.', // Attachments 'attachment_not_found' => 'Nie znaleziono załącznika', diff --git a/resources/lang/pl/settings.php b/resources/lang/pl/settings.php index 598f4dcd6..3a7bd2cbb 100644 --- a/resources/lang/pl/settings.php +++ b/resources/lang/pl/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Zawartość dodana tutaj zostanie dołączona na dole sekcji każdej strony. Przydatne przy nadpisywaniu styli lub dodawaniu analityki.', 'app_custom_html_disabled_notice' => 'Niestandardowa zawartość nagłówka HTML jest wyłączona na tej stronie ustawień aby zapewnić, że wszystkie błedne zmiany (braking change) mogą zostać cofnięte.', 'app_logo' => 'Logo aplikacji', - 'app_logo_desc' => 'Ten obrazek powinien mieć nie więcej niż 43px wysokosci.
Większe obrazki zostaną zmniejszone.', - 'app_primary_color' => 'Podstawowy kolor aplikacji', - 'app_primary_color_desc' => 'To powinna być wartość HEX.
Zostaw to pole puste, by powrócić do podstawowego koloru.', + 'app_logo_desc' => 'Jest używany między innymi w pasku nagłówka aplikacji. Ten obraz powinien mieć wysokość 86px. Duże obrazy zostaną przeskalowane w dół.', + 'app_icon' => 'Ikona aplikacji', + 'app_icon_desc' => 'Ta ikona jest używana w zakładkach przeglądarki i ikonach skrótu. Powinien to być obraz PNG o wymiarach 256px.', 'app_homepage' => 'Strona główna', 'app_homepage_desc' => 'Wybierz widok, który będzie wyświetlany na stronie głównej zamiast w widoku domyślnego. Uprawnienia dostępowe są ignorowane dla wybranych stron.', 'app_homepage_select' => 'Wybierz stronę', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Wyłącz komentarze na wszystkich stronach w aplikacji. Istniejące komentarze nie będą pokazywane.', // Color settings - 'content_colors' => 'Kolory zawartości', - 'content_colors_desc' => 'Ustawia kolory dla wszystkich elementów w hierarchii organizacji stron. Wybór kolorów o podobnej jasności do domyślnych kolorów jest zalecany dla czytelności.', + 'color_scheme' => 'Schemat kolorów aplikacji', + 'color_scheme_desc' => 'Ustaw kolory użyte w interfejsie BookStack\'a. Kolory można skonfigurować oddzielnie dla trybu ciemnego i jasnego, aby jak najlepiej pasowały do motywu i zapewniały czytelność.', + 'ui_colors_desc' => 'Ustaw kolor podstawowy i domyślny kolor linku dla BookStack\'a. Podstawowy kolor jest używany głównie do głównego baneru, przycisków i dekoracji interfejsu. Domyślny kolor linku jest używany dla tekstowych linków i akcji, zarówno w napisanej treści, jak i w interfejsie Bookstack\'a.', + 'app_color' => 'Kolor podstawowy', + 'link_color' => 'Domyślny kolor linku', + 'content_colors_desc' => 'Ustaw kolory dla wszystkich elementów w hierarchii organizacji stron. Wybór kolorów o jasności podobnej do domyślnych kolorów jest zalecany dla czytelności.', 'bookshelf_color' => 'Kolor półki', 'book_color' => 'Kolor książki', 'chapter_color' => 'Kolor rozdziału', diff --git a/resources/lang/pt/entities.php b/resources/lang/pt/entities.php index 9fab3949a..bc92ea47e 100644 --- a/resources/lang/pt/entities.php +++ b/resources/lang/pt/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Pesquisar neste livro', 'books_navigation' => 'Navegação do Livro', 'books_sort' => 'Ordenar Conteúdos do Livro', + '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_named' => 'Ordenar Livro :bookName', 'books_sort_name' => 'Ordenar por Nome', 'books_sort_created' => 'Ordenar por Data de Criação', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Capítulos por Último', 'books_sort_show_other' => 'Mostrar Outros Livros', 'books_sort_save' => 'Guardar Nova Ordenação', + '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_copy' => 'Copiar livro', 'books_copy_success' => 'Livro criado com sucesso', @@ -224,8 +236,8 @@ return [ 'pages_md_insert_image' => 'Inserir Imagem', 'pages_md_insert_link' => 'Inserir Link para Entidade', 'pages_md_insert_drawing' => 'Inserir Desenho', - 'pages_md_show_preview' => 'Show preview', - 'pages_md_sync_scroll' => 'Sync preview scroll', + 'pages_md_show_preview' => 'Mostrar pré-visualização', + 'pages_md_sync_scroll' => 'Sincronizar pré-visualização', 'pages_not_in_chapter' => 'A página não está dentro de um capítulo', 'pages_move' => 'Mover Página', 'pages_move_success' => 'Pagina movida para ":parentName"', diff --git a/resources/lang/pt/errors.php b/resources/lang/pt/errors.php index 81c556816..604450866 100644 --- a/resources/lang/pt/errors.php +++ b/resources/lang/pt/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'O servidor não pôde criar as miniaturas de imagem. Por favor, verifique se a extensão GD PHP está instalada.', 'server_upload_limit' => 'O servidor não permite o carregamento de arquivos com esse tamanho. Por favor, tente fazer o carregamento de arquivos mais pequenos.', 'uploaded' => 'O servidor não permite o carregamento de arquivos com esse tamanho. Por favor, tente fazer o carregamento de arquivos mais pequenos.', + 'file_upload_timeout' => 'O carregamento do arquivo expirou.', + + // Drawing & Images 'image_upload_error' => 'Ocorreu um erro no carregamento da imagem', 'image_upload_type_error' => 'O tipo de imagem enviada é inválida', - 'file_upload_timeout' => 'O carregamento do arquivo expirou.', + '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.', // Attachments 'attachment_not_found' => 'Anexo não encontrado', diff --git a/resources/lang/pt/settings.php b/resources/lang/pt/settings.php index c88864fa8..9b43c46ed 100644 --- a/resources/lang/pt/settings.php +++ b/resources/lang/pt/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Quaisquer conteúdos aqui adicionados serão inseridos no final da secção de cada página. Esta é uma maneira útil de sobrescrever estilos e adicionar códigos de análise de site.', 'app_custom_html_disabled_notice' => 'O conteúdo personalizado do HTML está desativado nesta página de configurações, para garantir que quaisquer alterações que acabem maliciosas possam ser revertidas.', 'app_logo' => 'Logo da Aplicação', - 'app_logo_desc' => 'A imagem deve ter 43px de altura.
Imagens maiores serão reduzidas.', - 'app_primary_color' => 'Cor Primária da Aplicação', - 'app_primary_color_desc' => 'Define a cor primária para a aplicação, incluindo o banner, botões e links.', + '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_homepage' => 'Página Inicial', 'app_homepage_desc' => 'Selecione uma opção para ser exibida como página inicial em vez da padrão. Permissões de página serão ignoradas para as páginas selecionadas.', 'app_homepage_select' => 'Selecione uma página', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Desativar comentários em todas as páginas no aplicativo.
Comentários existentes não serão exibidos.', // Color settings - 'content_colors' => 'Cores do Conteúdo', - 'content_colors_desc' => 'Define as cores para todos os elementos da hierarquia de organização de páginas. Escolher cores com brilho similar ao das cores padrão é aconselhável para a legibilidade.', + '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.', 'bookshelf_color' => 'Cor da Prateleira', 'book_color' => 'Cor do Livro', 'chapter_color' => 'Cor do Capítulo', diff --git a/resources/lang/pt_BR/entities.php b/resources/lang/pt_BR/entities.php index 7852fe172..216d8a41d 100644 --- a/resources/lang/pt_BR/entities.php +++ b/resources/lang/pt_BR/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Pesquisar neste livro', 'books_navigation' => 'Navegação do Livro', 'books_sort' => 'Ordenar Conteúdos do Livro', + '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_named' => 'Ordenar Livro :bookName', 'books_sort_name' => 'Ordernar por Nome', 'books_sort_created' => 'Ordenar por Data de Criação', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Capítulos por Último', 'books_sort_show_other' => 'Mostrar Outros Livros', 'books_sort_save' => 'Salvar Nova Ordenação', + '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_copy' => 'Copiar Livro', 'books_copy_success' => 'Livro criado com sucesso', diff --git a/resources/lang/pt_BR/errors.php b/resources/lang/pt_BR/errors.php index 54b6c9fd5..ac16aaa31 100644 --- a/resources/lang/pt_BR/errors.php +++ b/resources/lang/pt_BR/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'O servidor não pôde criar as miniaturas de imagem. Por favor, verifique se a extensão GD PHP está instalada.', 'server_upload_limit' => 'O servidor não permite o upload de arquivos com esse tamanho. Por favor, tente fazer o upload de arquivos de menor tamanho.', 'uploaded' => 'O servidor não permite o upload de arquivos com esse tamanho. Por favor, tente fazer o upload de arquivos de menor tamanho.', + 'file_upload_timeout' => 'O upload do arquivo expirou.', + + // Drawing & Images 'image_upload_error' => 'Um erro aconteceu enquanto o servidor tentava efetuar o upload da imagem', 'image_upload_type_error' => 'O tipo de imagem que está sendo enviada é inválido', - 'file_upload_timeout' => 'O upload do arquivo expirou.', + '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.', // Attachments 'attachment_not_found' => 'Anexo não encontrado', diff --git a/resources/lang/pt_BR/settings.php b/resources/lang/pt_BR/settings.php index 05698d46d..e82d8f4b0 100644 --- a/resources/lang/pt_BR/settings.php +++ b/resources/lang/pt_BR/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Quaisquer conteúdos aqui adicionados serão inseridos no final da seção de cada página. Essa é uma maneira útil de sobrescrever estilos e adicionar códigos de análise de site.', 'app_custom_html_disabled_notice' => 'O conteúdo customizado do HTML está desabilitado nesta página de configurações, para garantir que quaisquer alterações danosas possam ser revertidas.', 'app_logo' => 'Logo da Aplicação', - 'app_logo_desc' => 'A imagem deve ter 43px de altura.
Imagens maiores serão reduzidas.', - 'app_primary_color' => 'Cor Primária da Aplicação', - 'app_primary_color_desc' => 'Define a cor primária para a aplicação, incluindo o banner, botões e links.', + '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_homepage' => 'Página Inicial', 'app_homepage_desc' => 'Selecione uma opção para ser exibida como página inicial em vez da padrão. Permissões de página serão ignoradas para as páginas selecionadas.', 'app_homepage_select' => 'Selecione uma página', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Desativar comentários em todas as páginas no aplicativo.
Comentários existentes não serão exibidos.', // Color settings - 'content_colors' => 'Cores do Conteúdo', - 'content_colors_desc' => 'Define as cores para todos os elementos da hierarquia de organização de páginas. Escolher cores com brilho similar ao das cores padrão é aconselhável para a legibilidade.', + '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.', 'bookshelf_color' => 'Cor da Prateleira', 'book_color' => 'Cor do Livro', 'chapter_color' => 'Cor do Capítulo', diff --git a/resources/lang/ro/activities.php b/resources/lang/ro/activities.php index 92fc94740..86221fce5 100644 --- a/resources/lang/ro/activities.php +++ b/resources/lang/ro/activities.php @@ -38,14 +38,14 @@ return [ 'book_sort_notification' => 'Carte reordonată cu succes', // Bookshelves - 'bookshelf_create' => 'created shelf', - 'bookshelf_create_notification' => 'Shelf successfully created', - 'bookshelf_create_from_book' => 'converted book to shelf', + 'bookshelf_create' => 'raft creat', + 'bookshelf_create_notification' => 'Raftul a fost creat cu succes', + 'bookshelf_create_from_book' => 'cartea a fost convertită in raft', 'bookshelf_create_from_book_notification' => 'Carte transformată cu succes într-un raft', - 'bookshelf_update' => 'updated shelf', - 'bookshelf_update_notification' => 'Shelf successfully updated', - 'bookshelf_delete' => 'deleted shelf', - 'bookshelf_delete_notification' => 'Shelf successfully deleted', + 'bookshelf_update' => 'raftul actualizat', + 'bookshelf_update_notification' => 'Raftul a fost actualizat cu succes', + 'bookshelf_delete' => 'raft șters', + 'bookshelf_delete_notification' => 'Raftul a fost șters cu succes', // Favourites 'favourite_add_notification' => '":name" a fost adăugat la favorite', diff --git a/resources/lang/ro/common.php b/resources/lang/ro/common.php index 76216a454..e48a43da1 100644 --- a/resources/lang/ro/common.php +++ b/resources/lang/ro/common.php @@ -25,7 +25,7 @@ return [ 'actions' => 'Acțiuni', 'view' => 'Vizualizare', 'view_all' => 'Vizualizează tot', - 'new' => 'New', + 'new' => 'Noutăți', 'create' => 'Crează', 'update' => 'Actualzează', 'edit' => 'Editează', @@ -81,14 +81,14 @@ return [ 'none' => 'Niciunul', // Header - 'homepage' => 'Homepage', + 'homepage' => 'Acasă', 'header_menu_expand' => 'Extindere meniu antet', 'profile_menu' => 'Meniu profil', 'view_profile' => 'Vezi profil', 'edit_profile' => 'Editare profil', 'dark_mode' => 'Mod întunecat', 'light_mode' => 'Mod luminos', - 'global_search' => 'Global Search', + 'global_search' => 'Căutare Globală', // Layout tabs 'tab_info' => 'Informații', diff --git a/resources/lang/ro/entities.php b/resources/lang/ro/entities.php index f500e84c7..9f0ca3571 100644 --- a/resources/lang/ro/entities.php +++ b/resources/lang/ro/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Caută în această carte', 'books_navigation' => 'Navigare carte', 'books_sort' => 'Sortează conținutul cărții', + '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_named' => 'Sortează cartea :bookName', 'books_sort_name' => 'Sortează după nume', 'books_sort_created' => 'Sortează după data creării', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Capitole la final', 'books_sort_show_other' => 'Arată alte cărți', 'books_sort_save' => 'Salvează noua ordine', + '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_copy' => 'Copiază cartea', 'books_copy_success' => 'Carte copiată cu succes', diff --git a/resources/lang/ro/errors.php b/resources/lang/ro/errors.php index cda3907af..d5838ba60 100644 --- a/resources/lang/ro/errors.php +++ b/resources/lang/ro/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Serverul nu poate crea miniaturi. Verifică dacă este instalată extensia GD PHP.', 'server_upload_limit' => 'Serverul nu permite încărcarea acestei dimensiuni. Te rog să încerci o dimensiune mai mică a fișierului.', 'uploaded' => 'Serverul nu permite încărcarea acestei dimensiuni. Te rog să încerci o dimensiune mai mică a fișierului.', + 'file_upload_timeout' => 'Încărcarea fișierului a expirat.', + + // Drawing & Images 'image_upload_error' => 'A apărut o eroare la încărcarea imaginii', 'image_upload_type_error' => 'Tipul de imagine încărcat nu este valid', - 'file_upload_timeout' => 'Încărcarea fișierului a expirat.', + '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.', // Attachments 'attachment_not_found' => 'Atașamentul nu a fost găsit', diff --git a/resources/lang/ro/settings.php b/resources/lang/ro/settings.php index 6a2ed6288..feb57a31b 100644 --- a/resources/lang/ro/settings.php +++ b/resources/lang/ro/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Orice conținut adăugat aici va fi inserat în partea de jos a secțiunii a fiecărei pagini. Acest lucru este util pentru a suprascrie stilurile sau pentru a adăuga cod analitic.', 'app_custom_html_disabled_notice' => 'Conținutul headerului HTML personalizat este dezactivat pe această pagină de setări pentru a asigura că modificările pot fi inversate.', 'app_logo' => 'Logo aplicație', - 'app_logo_desc' => 'Această imagine ar trebui să fie de 43px în înălțime.
Imaginile mari vor fi reduse în jos.', - 'app_primary_color' => 'Culoare primară aplicaţie', - 'app_primary_color_desc' => 'Setează culoarea principală pentru aplicație, inclusiv bannerul, butoanele și link-urile.', + '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_homepage' => 'Pagina principală a aplicației', 'app_homepage_desc' => 'Selectează o vizualizare pentru a afișa pe prima pagină în loc de vizualizarea implicită. Permisiunile paginii sunt ignorate pentru paginile selectate.', 'app_homepage_select' => 'Selectează o pagină', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Dezactivează comentariile pentru toate paginile aplicației.
Comentariile existente nu sunt afișate.', // Color settings - 'content_colors' => 'Culori conținut', - 'content_colors_desc' => 'Setează culori pentru toate elementele din ierarhia organizării paginii. Alegerea de culori cu o luminozitate similară cu cea a culorilor implicite este recomandată pentru lizibilitate.', + '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.', 'bookshelf_color' => 'Culoare raft', 'book_color' => 'Culoare carte', 'chapter_color' => 'Culoare capitol', diff --git a/resources/lang/ru/entities.php b/resources/lang/ru/entities.php index 3d0122ee2..052a317bb 100644 --- a/resources/lang/ru/entities.php +++ b/resources/lang/ru/entities.php @@ -141,6 +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_named' => 'Сортировка книги :bookName', 'books_sort_name' => 'По имени', 'books_sort_created' => 'По дате создания', @@ -149,6 +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_copy' => 'Копировать книгу', 'books_copy_success' => 'Книга успешно скопирована', diff --git a/resources/lang/ru/errors.php b/resources/lang/ru/errors.php index 7ea17aa72..23a43c126 100644 --- a/resources/lang/ru/errors.php +++ b/resources/lang/ru/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Сервер не может создавать эскизы. Убедитесь, что у вас установлено расширение GD PHP.', 'server_upload_limit' => 'Сервер не разрешает загрузку файлов такого размера. Попробуйте уменьшить размер файла.', 'uploaded' => 'Сервер не позволяет загружать файлы такого размера. Пожалуйста, попробуйте файл меньше.', + 'file_upload_timeout' => 'Время загрузки файла истекло.', + + // Drawing & Images 'image_upload_error' => 'Произошла ошибка при загрузке изображения', 'image_upload_type_error' => 'Неправильный тип загружаемого изображения', - 'file_upload_timeout' => 'Время загрузки файла истекло.', + '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.', // Attachments 'attachment_not_found' => 'Вложение не найдено', diff --git a/resources/lang/ru/settings.php b/resources/lang/ru/settings.php index 15c98d1a6..912c92b80 100755 --- a/resources/lang/ru/settings.php +++ b/resources/lang/ru/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Любой контент, добавленный здесь, будет вставлен в нижнюю часть раздела каждой страницы. Это удобно для переопределения стилей или добавления кода аналитики.', 'app_custom_html_disabled_notice' => 'Пользовательский контент заголовка HTML отключен на этой странице, чтобы гарантировать отмену любых критических изменений.', 'app_logo' => 'Логотип приложения', - 'app_logo_desc' => 'Это изображение должно быть 43px в высоту.
Большое изображение будет уменьшено.', - 'app_primary_color' => 'Основной цвет приложения', - 'app_primary_color_desc' => 'Значение должно быть указано в hex-формате.
Оставьте пустым чтобы использовать цвет по умолчанию.', + '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_homepage' => 'Стартовая страница приложения', 'app_homepage_desc' => 'Выберите страницу, которая будет отображаться на главной странице вместо стандартной. Права на страницы игнорируются для выбранных страниц.', 'app_homepage_select' => 'Выберите страницу', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Отключение комментариев на всех страницах. Существующие комментарии будут скрыты.', // Color settings - 'content_colors' => 'Цвета элементов иерархии', - 'content_colors_desc' => 'Задает цвета для всех элементов организационной иерархии страницы. Для удобства чтения рекомендуется выбирать цвета, яркость которых близка к цветам по умолчанию.', + '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.', 'bookshelf_color' => 'Цвет полки', 'book_color' => 'Цвет книги', 'chapter_color' => 'Цвет главы', diff --git a/resources/lang/sk/entities.php b/resources/lang/sk/entities.php index 50125231a..a6e203920 100644 --- a/resources/lang/sk/entities.php +++ b/resources/lang/sk/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Hľadať v tejto knihe', 'books_navigation' => 'Navigácia knihy', 'books_sort' => 'Zoradiť 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_named' => 'Zoradiť knihu :bookName', 'books_sort_name' => 'Zoradiť podľa mena', 'books_sort_created' => 'Zoradiť podľa dátumu vytvorenia', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Kapitoly ako posledné', 'books_sort_show_other' => 'Zobraziť ostatné knihy', 'books_sort_save' => 'Uložiť nové zoradenie', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/sk/errors.php b/resources/lang/sk/errors.php index 6230cc00a..93701bfe3 100644 --- a/resources/lang/sk/errors.php +++ b/resources/lang/sk/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Server nedokáže vytvoriť náhľady. Skontrolujte prosím, či máte nainštalované GD rozšírenie PHP.', 'server_upload_limit' => 'Server nedovoľuje nahrávanie súborov s takouto veľkosťou. Skúste prosím menší súbor.', 'uploaded' => 'Server nedovoľuje nahrávanie súborov s takouto veľkosťou. Skúste prosím menší súbor.', + 'file_upload_timeout' => 'Nahrávanie súboru vypršalo.', + + // Drawing & Images 'image_upload_error' => 'Pri nahrávaní obrázka nastala chyba', 'image_upload_type_error' => 'Typ nahrávaného obrázka je neplatný', - 'file_upload_timeout' => 'Nahrávanie súboru vypršalo.', + '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.', // Attachments 'attachment_not_found' => 'Príloha nenájdená', diff --git a/resources/lang/sk/settings.php b/resources/lang/sk/settings.php index 50e2b9509..9116933df 100644 --- a/resources/lang/sk/settings.php +++ b/resources/lang/sk/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Všetok text pridaný sem bude vložený naspodok sekcie na každej stránke. Môže sa to zísť pri zmene štýlu alebo pre pridanie analytického kódu.', 'app_custom_html_disabled_notice' => 'Vlastný obsah hlavičky HTML je na tejto stránke s nastaveniami zakázaný, aby sa zabezpečilo, že sa dajú vrátiť zmeny, ktoré nastali.', 'app_logo' => 'Logo aplikácie', - 'app_logo_desc' => 'Tento obrázok by mal mať 43px na výšku.
Veľké obrázky budú preškálované na menší rozmer.', - 'app_primary_color' => 'Primárna farba pre aplikáciu', - 'app_primary_color_desc' => 'Toto by mala byť hodnota v hex tvare.
Nechajte prázdne ak chcete použiť prednastavenú farbu.', + '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_homepage' => 'Domovská stránka aplikácie', 'app_homepage_desc' => 'Vyberte zobrazenie, ktoré sa má zobraziť na domovskej stránke namiesto predvoleného zobrazenia. Povolenia stránky sa pre vybraté stránky ignorujú.', 'app_homepage_select' => 'Vybrať stránku', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Zakázať komentáre na všetkých stránkach aplikácie. Existujúce komentáre sa nezobrazujú.', // Color settings - 'content_colors' => 'Farby obsahu', - 'content_colors_desc' => 'Nastaví farby pre všetky prvky v hierarchii organizácie stránky. Kvôli čitateľnosti sa odporúča vybrať farby s podobným jasom ako predvolené farby.', + '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.', 'bookshelf_color' => 'Farba police', 'book_color' => 'Farba knihy', 'chapter_color' => 'Farba kapitoly', diff --git a/resources/lang/sl/entities.php b/resources/lang/sl/entities.php index 8e7300ae7..471c2cc3e 100644 --- a/resources/lang/sl/entities.php +++ b/resources/lang/sl/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Išči v tej knjigi', 'books_navigation' => 'Navigacija po knjigi', 'books_sort' => 'Razvrsti vsebino knjige', + '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_named' => 'Razvrsti knjigo :bookName', 'books_sort_name' => 'Razvrsti po imenu', 'books_sort_created' => 'Razvrsti po datumu nastanka', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Nazadnje poglavja', 'books_sort_show_other' => 'Prikaži druge knjige', 'books_sort_save' => 'Shrani novo razvrstitev', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/sl/errors.php b/resources/lang/sl/errors.php index 0d2c10db6..9fd8c5b73 100644 --- a/resources/lang/sl/errors.php +++ b/resources/lang/sl/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Strežnik ne more izdelati sličice. Prosimo preverite če imate GD PHP razširitev nameščeno.', 'server_upload_limit' => 'Strežnik ne dovoli nalaganj take velikosti. Prosimo poskusite z manjšo velikostjo datoteke.', 'uploaded' => 'Strežnik ne dovoli nalaganj take velikosti. Prosimo poskusite zmanjšati velikost datoteke.', + 'file_upload_timeout' => 'Čas nalaganjanja datoteke je potekel.', + + // Drawing & Images 'image_upload_error' => 'Prišlo je do napake med nalaganjem slike', 'image_upload_type_error' => 'Napačen tip (format) slike', - 'file_upload_timeout' => 'Čas nalaganjanja datoteke je potekel.', + '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.', // Attachments 'attachment_not_found' => 'Priloga ni najdena', diff --git a/resources/lang/sl/settings.php b/resources/lang/sl/settings.php index c8f7f177b..201bf53f2 100644 --- a/resources/lang/sl/settings.php +++ b/resources/lang/sl/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Katerakoli vsebina dodana tukaj, bo vstavljena na dno dela vsake strani. To je uporabno za uporabo prevladujočih slogov ali dodajanje analitike.', 'app_custom_html_disabled_notice' => 'Po meri narejena HTML glava vsebine je onemogočena na tej strani z nastavitvami, da se zagotovi, da bodo morebitne zrušitve lahko povrnjene.', 'app_logo' => 'Logotip aplikacije', - 'app_logo_desc' => 'Ta slika bi morala biti 43px visoka.
Velike slike bodo pomanjšane.', - 'app_primary_color' => 'Osnovna barva aplikacije', - 'app_primary_color_desc' => 'Nastavi osnovno barvo za aplikacijo vključno s pasico, gumbi in povezavami.', + '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_homepage' => 'Domača stran aplikacije', 'app_homepage_desc' => 'Izberi pogled, da se pokaže na domači strani, namesto osnovnega pogleda. Dovoljenja strani so prezrta za izbrane strani.', 'app_homepage_select' => 'Izberi stran', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Onemogoči komentarje na vseh straneh v aplikaciji.
Obstoječi komentarji se ne prikazujejo.', // Color settings - 'content_colors' => 'Barve vsebine', - 'content_colors_desc' => 'Nastavi barve za vse elemente v hierarhiji. Izbor barv s podobno barvno svetlostjo je priporočljivo za osnovne barve za branje.', + '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.', 'bookshelf_color' => 'Barva police', 'book_color' => 'knjiga barv', 'chapter_color' => 'barvno poglavje', diff --git a/resources/lang/sv/entities.php b/resources/lang/sv/entities.php index 9ebe28d34..78f3211ed 100644 --- a/resources/lang/sv/entities.php +++ b/resources/lang/sv/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Sök i boken', 'books_navigation' => 'Navigering', 'books_sort' => 'Sortera bokens innehåll', + '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_named' => 'Sortera boken :bookName', 'books_sort_name' => 'Sortera utifrån namn', 'books_sort_created' => 'Sortera utifrån skapelse', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Kapitel sist', 'books_sort_show_other' => 'Visa andra böcker', 'books_sort_save' => 'Spara ordning', + '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_copy' => 'Kopiera bok', 'books_copy_success' => 'Boken har kopierats', diff --git a/resources/lang/sv/errors.php b/resources/lang/sv/errors.php index 1e2cf6f0a..b9b6504da 100644 --- a/resources/lang/sv/errors.php +++ b/resources/lang/sv/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Servern kan inte skapa miniatyrer. Kontrollera att du har PHPs GD-tillägg aktiverat.', 'server_upload_limit' => 'Servern tillåter inte så här stora filer. Prova en mindre fil.', 'uploaded' => 'Servern tillåter inte så här stora filer. Prova en mindre fil.', + 'file_upload_timeout' => 'Filuppladdningen har tagits ut.', + + // Drawing & Images 'image_upload_error' => 'Ett fel inträffade vid uppladdningen', 'image_upload_type_error' => 'Filtypen du försöker ladda upp är ogiltig', - 'file_upload_timeout' => 'Filuppladdningen har tagits ut.', + '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.', // Attachments 'attachment_not_found' => 'Bilagan hittades ej', diff --git a/resources/lang/sv/settings.php b/resources/lang/sv/settings.php index 16ca555b3..0e4b99e89 100644 --- a/resources/lang/sv/settings.php +++ b/resources/lang/sv/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Innehåll i det här fältet placeras längst ner i -sektionen på varje sida. Detta kan användas för att skriva över stilmallar eller lägga in spårningskoder.', 'app_custom_html_disabled_notice' => 'Anpassat innehåll i HTML-huvudet är inaktiverat på denna inställningssida för att säkerställa att eventuella ändringar som påverkar funktionaliteten kan återställas.', 'app_logo' => 'Applikationslogotyp', - 'app_logo_desc' => 'Bilden borde vara minst 43px hög.
Större bilder skalas ner.', - 'app_primary_color' => 'Primärfärg', - 'app_primary_color_desc' => 'Anger den primära färgen för applikationen, inklusive banner, knappar och länkar.', + '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_homepage' => 'Startsida', 'app_homepage_desc' => 'Välj en vy att använda som startsida istället för standardvyn. Behörigheter för valda sidor kommer att ignoreras.', 'app_homepage_select' => 'Välj en sida', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Inaktivera kommentarer på alla sidor i applikationen. Befintliga kommentarer visas inte.', // Color settings - 'content_colors' => 'Innehållsfärger', - 'content_colors_desc' => 'Ställer in färger för alla element i sidornas hierarki. Att välja färger med samma ljusstyrka som standardfärgerna rekommenderas för läsbarhet.', + '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.', 'bookshelf_color' => 'Hyllfärg', 'book_color' => 'Bokfärg', 'chapter_color' => 'Kapitelfärg', diff --git a/resources/lang/tr/entities.php b/resources/lang/tr/entities.php index d90c5070d..b0bb66d34 100644 --- a/resources/lang/tr/entities.php +++ b/resources/lang/tr/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Bu kitapta ara', 'books_navigation' => 'Kitap Navigasyonu', 'books_sort' => 'Kitap İçeriklerini Sırala', + '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_named' => ':bookName Kitabını Sırala', 'books_sort_name' => 'İsme Göre Sırala', 'books_sort_created' => 'Oluşturulma Tarihine Göre Sırala', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'En Son Bölümler', 'books_sort_show_other' => 'Diğer Kitapları Göster', 'books_sort_save' => 'Yeni Düzeni Kaydet', + '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_copy' => 'Kitabı Kopyala', 'books_copy_success' => 'Kitap başarıyla kopyalandı', diff --git a/resources/lang/tr/errors.php b/resources/lang/tr/errors.php index 5a4669efe..d4f9e5337 100644 --- a/resources/lang/tr/errors.php +++ b/resources/lang/tr/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Sunucu, görsel ön izlemelerini oluşturamadı. Lütfen GD PHP eklentisinin kurulu olduğundan emin olun.', 'server_upload_limit' => 'Sunucu bu boyutta dosya yüklemenize izin vermiyor. Lütfen daha küçük bir dosya deneyin.', 'uploaded' => 'Sunucu bu boyutta dosya yüklemenize izin vermiyor. Lütfen daha küçük bir dosya deneyin.', + 'file_upload_timeout' => 'Dosya yüklemesi zaman aşımına uğradı', + + // Drawing & Images 'image_upload_error' => 'Görsel yüklenirken bir hata meydana geldi', 'image_upload_type_error' => 'Yüklemeye çalıştığınız dosya türü geçersizdir', - 'file_upload_timeout' => 'Dosya yüklemesi zaman aşımına uğradı', + '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.', // Attachments 'attachment_not_found' => 'Ek bulunamadı', diff --git a/resources/lang/tr/settings.php b/resources/lang/tr/settings.php index a82355693..9c70e8070 100755 --- a/resources/lang/tr/settings.php +++ b/resources/lang/tr/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Buraya yazacağınız içerik, etiketinin içine ve en sonuna eklenecektir. Bu işlem, stil değişikliklerinin uygulanmasında ya da analytics kodlarının eklenmesinde yararlı olmaktadır.', 'app_custom_html_disabled_notice' => 'Olası hatalı değişikliklerin geriye alınabilmesi için bu sayfanın özelleştirilmiş HTML "head" içeriği devre dışı bırakıldı.', 'app_logo' => 'Uygulama Logosu', - 'app_logo_desc' => 'Bu görsel 43px yüksekliğinde olmalıdır.
Daha büyük görseller otomatik olarak küçültülecektir.', - 'app_primary_color' => 'Uygulamanın Birincil Rengi', - 'app_primary_color_desc' => 'Başlık, butonlar ve bağlantılar da dahil olmak üzere uygulama için ana rengi ayarlar.', + '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_homepage' => 'Ana Sayfa', 'app_homepage_desc' => 'Varsayılan görünüm yerine ana sayfada görünmesi için bir görünüm seçin. Sayfa izinleri, burada seçeceğiniz sayfalar için yok sayılacaktır.', 'app_homepage_select' => 'Bir sayfa seçin', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Bütün sayfalar için yorumları devre dışı bırakır.
Mevcut yorumlar gösterilmeyecektir.', // Color settings - 'content_colors' => 'İçerik Renkleri', - 'content_colors_desc' => 'Sayfa hiyerarşisinde bulunan bütün elemanlar için renkleri ayarlar. Bu renkleri varsayılan renklerin parlaklığına yakın bir parlaklıkta seçmeniz, okunurluğun iyileştirilmesi açısından önerilir.', + '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.', 'bookshelf_color' => 'Raf Rengi', 'book_color' => 'Kitap Rengi', 'chapter_color' => 'Bölüm Rengi', diff --git a/resources/lang/uk/entities.php b/resources/lang/uk/entities.php index 1d9f36657..b165ce7d3 100644 --- a/resources/lang/uk/entities.php +++ b/resources/lang/uk/entities.php @@ -141,6 +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_named' => 'Сортувати книгу :bookName', 'books_sort_name' => 'Сортувати за назвою', 'books_sort_created' => 'Сортувати за датою створення', @@ -149,6 +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_copy' => 'Копіювати книгу', 'books_copy_success' => 'Сторінка успішно скопійована', diff --git a/resources/lang/uk/errors.php b/resources/lang/uk/errors.php index ee99e3954..3cba88576 100644 --- a/resources/lang/uk/errors.php +++ b/resources/lang/uk/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Сервер не може створювати ескізи. Будь ласка, перевірте, чи встановлено розширення GD PHP.', 'server_upload_limit' => 'Сервер не дозволяє завантажувати файли такого розміру. Спробуйте менший розмір файлу.', 'uploaded' => 'Сервер не дозволяє завантажувати файли такого розміру. Спробуйте менший розмір файлу.', + 'file_upload_timeout' => 'Тайм-аут при завантаженні файлу', + + // Drawing & Images 'image_upload_error' => 'Виникла помилка під час завантаження зображення', 'image_upload_type_error' => 'Тип завантаженого зображення недійсний', - 'file_upload_timeout' => 'Тайм-аут при завантаженні файлу', + '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.', // Attachments 'attachment_not_found' => 'Вкладення не знайдено', diff --git a/resources/lang/uk/settings.php b/resources/lang/uk/settings.php index 6de7169a9..49301b68a 100644 --- a/resources/lang/uk/settings.php +++ b/resources/lang/uk/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Будь-який доданий тут вміст буде вставлено в нижню частину розділу кожної сторінки. Це зручно для перевизначення стилів, або додавання коду аналітики.', 'app_custom_html_disabled_notice' => 'На цій сторінці налаштувань відключений користувацький вміст заголовка HTML, щоб гарантувати, що будь-які невдалі зміни можна буде відновити.', 'app_logo' => 'Логотип програми', - 'app_logo_desc' => 'Це зображення має бути висотою 43px.
Великі зображення будуть зменшені.', - 'app_primary_color' => 'Основний колір програми', - 'app_primary_color_desc' => 'Колір потрібно вказати у hex-форматі.
Залиште порожнім, щоб використати стандартний колір.', + '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_homepage' => 'Домашня сторінка програми', 'app_homepage_desc' => 'Виберіть сторінку, яка показуватиметься на домашній сторінці замість перегляду за замовчуванням. Права на сторінку не враховуються для вибраних сторінок.', 'app_homepage_select' => 'Вибрати сторінку', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Вимкнути коментарі на всіх сторінках програми. Існуючі коментарі не відображаються.', // Color settings - 'content_colors' => 'Кольори вмісту', - 'content_colors_desc' => 'Встановлює кольори для всіх елементів в ієрархії організації сторінок. Рекомендуємо вибирати кольори із яскравістю, схожою на кольори за замовчуванням, для кращої читабельності.', + '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.', 'bookshelf_color' => 'Колір полиці', 'book_color' => 'Колір книги', 'chapter_color' => 'Колір глави', diff --git a/resources/lang/uz/entities.php b/resources/lang/uz/entities.php index 90318b902..73486a8ed 100644 --- a/resources/lang/uz/entities.php +++ b/resources/lang/uz/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Search this book', 'books_navigation' => 'Book Navigation', 'books_sort' => 'Sort Book Contents', + '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_named' => 'Sort Book :bookName', 'books_sort_name' => 'Sort by Name', 'books_sort_created' => 'Sort by Created Date', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Chapters Last', 'books_sort_show_other' => 'Show Other Books', 'books_sort_save' => 'Save New Order', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/uz/errors.php b/resources/lang/uz/errors.php index 52f96cbe7..703d0edbe 100644 --- a/resources/lang/uz/errors.php +++ b/resources/lang/uz/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.', 'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.', 'uploaded' => 'The server does not allow uploads of this size. Please try a smaller file size.', + 'file_upload_timeout' => 'The file upload has timed out.', + + // Drawing & Images 'image_upload_error' => 'An error occurred uploading the image', 'image_upload_type_error' => 'The image type being uploaded is invalid', - 'file_upload_timeout' => 'The file upload has timed out.', + '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.', // Attachments 'attachment_not_found' => 'Attachment not found', diff --git a/resources/lang/uz/settings.php b/resources/lang/uz/settings.php index f4204dd68..6f4376d42 100644 --- a/resources/lang/uz/settings.php +++ b/resources/lang/uz/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the section of every page. This is handy for overriding styles or adding analytics code.', 'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.', 'app_logo' => 'Application Logo', - 'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.', - 'app_primary_color' => 'Application Primary Color', - 'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.', + '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_homepage' => 'Application Homepage', 'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.', 'app_homepage_select' => 'Select a page', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Disables comments across all pages in the application.
Existing comments are not shown.', // Color settings - 'content_colors' => 'Content Colors', - 'content_colors_desc' => 'Sets 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' => '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.', 'bookshelf_color' => 'Shelf Color', 'book_color' => 'Book Color', 'chapter_color' => 'Chapter Color', diff --git a/resources/lang/vi/editor.php b/resources/lang/vi/editor.php index 670c1c5e1..6ce9ffec6 100644 --- a/resources/lang/vi/editor.php +++ b/resources/lang/vi/editor.php @@ -8,11 +8,11 @@ return [ // General editor terms 'general' => 'General', - 'advanced' => 'Advanced', + 'advanced' => 'Nâng cao', 'none' => 'None', - 'cancel' => 'Cancel', + 'cancel' => 'Huỷ', 'save' => 'Save', - 'close' => 'Close', + 'close' => 'Đóng', 'undo' => 'Undo', 'redo' => 'Redo', 'left' => 'Left', diff --git a/resources/lang/vi/entities.php b/resources/lang/vi/entities.php index 85dab34bf..fc2e8d62b 100644 --- a/resources/lang/vi/entities.php +++ b/resources/lang/vi/entities.php @@ -141,6 +141,7 @@ return [ 'books_search_this' => 'Tìm cuốn sách này', 'books_navigation' => 'Điều hướng cuốn sách', 'books_sort' => 'Sắp xếp nội dung cuốn sách', + '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_named' => 'Sắp xếp sách :bookName', 'books_sort_name' => 'Sắp xếp theo tên', 'books_sort_created' => 'Sắp xếp theo ngày tạo', @@ -149,6 +150,17 @@ return [ 'books_sort_chapters_last' => 'Các Chương cuối', 'books_sort_show_other' => 'Hiển thị các Sách khác', 'books_sort_save' => 'Lưu thứ tự mới', + '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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/vi/errors.php b/resources/lang/vi/errors.php index e731595f3..cee3b618f 100644 --- a/resources/lang/vi/errors.php +++ b/resources/lang/vi/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => 'Máy chủ không thể tạo ảnh nhỏ. Vui lòng kiểm tra bạn đã cài đặt tiện ích mở rộng GD PHP.', 'server_upload_limit' => 'Máy chủ không cho phép tải lên kích thước này. Vui lòng thử lại với tệp tin nhỏ hơn.', 'uploaded' => 'Máy chủ không cho phép tải lên kích thước này. Vui lòng thử lại với tệp tin nhỏ hơn.', + 'file_upload_timeout' => 'Đã quá thời gian tải lên tệp tin.', + + // Drawing & Images 'image_upload_error' => 'Đã xảy ra lỗi khi đang tải lên ảnh', 'image_upload_type_error' => 'Ảnh đang được tải lên không hợp lệ', - 'file_upload_timeout' => 'Đã quá thời gian tải lên tệp tin.', + '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.', // Attachments 'attachment_not_found' => 'Không tìm thấy đính kèm', diff --git a/resources/lang/vi/settings.php b/resources/lang/vi/settings.php index a135bdd9d..0159acd51 100644 --- a/resources/lang/vi/settings.php +++ b/resources/lang/vi/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => 'Bất cứ nội dung nào được thêm vào đây sẽ được đưa vào phần cuối của khu vực của mỗi trang. Tiện cho việc ghi đè style hoặc thêm mã phân tích dữ liệu.', 'app_custom_html_disabled_notice' => 'Nội dung tùy biến HTML head bị tắt tại trang cài đặt này để đảm bảo mọi thay đổi làm hỏng hệ thống có để được khôi phục.', 'app_logo' => 'Logo Ứng dụng', - 'app_logo_desc' => 'Ảnh này nên có kích thước chiều cao là 43px.
Ảnh lớn sẽ được điều chỉnh tỷ lệ xuống.', - 'app_primary_color' => 'Màu chủ đạo của Ứng dụng', - 'app_primary_color_desc' => 'Đặt màu chủ đạo của ứng dụng kể cả banner, các nút và các đường dẫn liên kết.', + '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_homepage' => 'Trang chủ Ứng dụng', 'app_homepage_desc' => 'Chọn hiển thị để hiện tại trang chủ thay cho hiển thị mặc định. Quyền cho trang được bỏ qua cho các trang được chọn.', 'app_homepage_select' => 'Chọn một trang', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => 'Tắt các bình luận trên tất cả các trang của ứng dụng.
Các bình luận đã tồn tại sẽ không được hiển thị.', // Color settings - 'content_colors' => 'Màu của phần Nội dung', - 'content_colors_desc' => 'Đặt màu cho tất cả các thành phần trong trang theo sự tổ chức kế thừa. Việc chọn màu sắc với cùng độ sáng với màu mặc định là được khuyến nghị giúp cho việc đọc thuận lợi.', + '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.', 'bookshelf_color' => 'Màu Giá sách', 'book_color' => 'Màu Sách', 'chapter_color' => 'Màu Chương', diff --git a/resources/lang/zh_CN/entities.php b/resources/lang/zh_CN/entities.php index 20f068a9a..21830e808 100644 --- a/resources/lang/zh_CN/entities.php +++ b/resources/lang/zh_CN/entities.php @@ -141,6 +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_named' => '排序图书「:bookName」', 'books_sort_name' => '按名称排序', 'books_sort_created' => '创建时间排序', @@ -149,6 +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_copy' => '复制图书', 'books_copy_success' => '图书已成功复制', diff --git a/resources/lang/zh_CN/errors.php b/resources/lang/zh_CN/errors.php index 8a404cb42..1d2147fa3 100644 --- a/resources/lang/zh_CN/errors.php +++ b/resources/lang/zh_CN/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => '服务器无法创建缩略图,请检查您是否安装了GD PHP扩展。', 'server_upload_limit' => '服务器不允许上传此大小的文件。 请尝试较小的文件。', 'uploaded' => '服务器不允许上传此大小的文件。 请尝试较小的文件。', + 'file_upload_timeout' => '文件上传已超时。', + + // Drawing & Images 'image_upload_error' => '上传图片时发生错误', 'image_upload_type_error' => '上传的图像类型无效', - 'file_upload_timeout' => '文件上传已超时。', + '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.', // Attachments 'attachment_not_found' => '找不到附件', diff --git a/resources/lang/zh_CN/settings.php b/resources/lang/zh_CN/settings.php index 88dab170f..889635bd7 100755 --- a/resources/lang/zh_CN/settings.php +++ b/resources/lang/zh_CN/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => '此处添加的任何内容都将插入到每个页面的部分的底部,这对于覆盖样式或添加分析代码很方便。', 'app_custom_html_disabled_notice' => '在此设置页面上禁用了自定义HTML标题内容,以确保可以恢复所有重大更改。', 'app_logo' => '站点Logo', - 'app_logo_desc' => '这个图片的高度应为 43 像素。
大图片将会被缩小。', - 'app_primary_color' => '站点主色', - 'app_primary_color_desc' => '这应该是一个十六进制值。
保留为空以重置为默认颜色。', + '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_homepage' => '站点主页', 'app_homepage_desc' => '选择要在主页上显示的页面来替换默认的页面,选定页面的访问权限将被忽略。', 'app_homepage_select' => '选择一个页面', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => '在站点的所有页面上禁用评论,现有评论也不会显示出来。', // Color settings - 'content_colors' => '内容颜色', - 'content_colors_desc' => '设置页面组织层次中所有元素的颜色。建议选择与默认颜色相似的亮度的颜色。', + '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.', 'bookshelf_color' => '书架颜色', 'book_color' => '图书颜色', 'chapter_color' => '章节颜色', diff --git a/resources/lang/zh_TW/entities.php b/resources/lang/zh_TW/entities.php index bd3ac13d2..350b9f942 100644 --- a/resources/lang/zh_TW/entities.php +++ b/resources/lang/zh_TW/entities.php @@ -141,6 +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_named' => '排序書本 :bookName', 'books_sort_name' => '按名稱排序', 'books_sort_created' => '按建立時間排序', @@ -149,6 +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_copy' => 'Copy Book', 'books_copy_success' => 'Book successfully copied', diff --git a/resources/lang/zh_TW/errors.php b/resources/lang/zh_TW/errors.php index 623c66cba..eb986e606 100644 --- a/resources/lang/zh_TW/errors.php +++ b/resources/lang/zh_TW/errors.php @@ -45,9 +45,12 @@ return [ 'cannot_create_thumbs' => '伺服器無法建立縮圖。請檢查您是否安裝了 PHP 的 GD 擴充程式。', 'server_upload_limit' => '伺服器不允許上傳這個大的檔案。請嘗試較小的檔案。', 'uploaded' => '伺服器不允許上傳這個大的檔案。請嘗試較小的檔案。', + 'file_upload_timeout' => '檔案上傳逾時。', + + // Drawing & Images 'image_upload_error' => '上傳圖片時發生錯誤', 'image_upload_type_error' => '上傳圖片類型無效', - 'file_upload_timeout' => '檔案上傳逾時。', + '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.', // Attachments 'attachment_not_found' => '找不到附件', diff --git a/resources/lang/zh_TW/settings.php b/resources/lang/zh_TW/settings.php index 913b8d6c1..4777184e5 100644 --- a/resources/lang/zh_TW/settings.php +++ b/resources/lang/zh_TW/settings.php @@ -33,9 +33,9 @@ return [ 'app_custom_html_desc' => '此處加入的任何內容都將插入到每個頁面的 部分的底部,這對於覆蓋樣式或加入分析程式碼很方便。', 'app_custom_html_disabled_notice' => '在此設定頁面上停用了自訂 HTML 標題內容,以確保任何重大變更都能被還原。', 'app_logo' => '應用程式圖示', - 'app_logo_desc' => '此圖片的高度應為 43px。
較大的圖片將會被縮小。', - 'app_primary_color' => '應用程式主要色彩', - 'app_primary_color_desc' => '設定應用程式的主要色彩,包含了橫幅、按鈕與連結。', + '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_homepage' => '應用程式首頁', 'app_homepage_desc' => '選取要作為首頁的頁面,這將會取代預設首頁。選定頁面的頁面權限將會被忽略。', 'app_homepage_select' => '選取頁面', @@ -49,8 +49,12 @@ return [ 'app_disable_comments_desc' => '在應用程式的所有頁面停用評論。
既有的評論將不會顯示。', // Color settings - 'content_colors' => '內容顏色', - 'content_colors_desc' => '為頁面層次結構中的所有元素設定顏色。 為了提高可讀性,建議選擇亮度與預設顏色相似的顏色。', + '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.', 'bookshelf_color' => '書架顔色', 'book_color' => '書本顔色', 'chapter_color' => '章節顔色', diff --git a/resources/sass/_blocks.scss b/resources/sass/_blocks.scss index 2794dd954..1d9bfc272 100644 --- a/resources/sass/_blocks.scss +++ b/resources/sass/_blocks.scss @@ -237,6 +237,13 @@ } } +.sub-card { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); + border: 1.5px solid; + @include lightDark(border-color, #E2E2E2, #444); + border-radius: 4px; +} + .outline-hover { border: 1px solid transparent !important; &:hover { diff --git a/resources/sass/_buttons.scss b/resources/sass/_buttons.scss index fb3af06e8..3c6775ad5 100644 --- a/resources/sass/_buttons.scss +++ b/resources/sass/_buttons.scss @@ -25,7 +25,6 @@ button { text-transform: uppercase; border: 1px solid var(--color-primary); vertical-align: top; - @include lightDark(filter, none, saturate(0.8) brightness(0.8)); &:hover, &:focus, &:active { background-color: var(--color-primary); text-decoration: none; @@ -85,10 +84,7 @@ button { user-select: none; font-size: 0.75rem; line-height: 1.4em; - color: var(--color-primary); - @include whenDark { - color: #AAA; - } + color: var(--color-link); &:active { outline: 0; } @@ -96,8 +92,8 @@ button { text-decoration: none; } &:hover, &:focus { - color: var(--color-primary); - fill: var(--color-primary); + color: var(--color-link); + fill: var(--color-link); } } .text-button.hover-underline:hover { diff --git a/resources/sass/_colors.scss b/resources/sass/_colors.scss index c51f01659..aff9ff6d0 100644 --- a/resources/sass/_colors.scss +++ b/resources/sass/_colors.scss @@ -9,11 +9,14 @@ background-color: var(--color-primary-light); @include whenDark { background: #000; - .text-primary { + .text-link { color: #AAA !important; } } } +.link-background { + background-color: var(--color-link) !important; +} /* * Status text colors @@ -41,6 +44,11 @@ fill: var(--color-primary) !important; } +.text-link, .text-link:hover, .text-link-hover:hover { + color: var(--color-link) !important; + fill: var(--color-link) !important; +} + .text-muted { @include lightDark(color, #575757, #888888, true); fill: currentColor !important; diff --git a/resources/sass/_components.scss b/resources/sass/_components.scss index ab1d506c7..2150f6d07 100644 --- a/resources/sass/_components.scss +++ b/resources/sass/_components.scss @@ -607,36 +607,37 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { } -.tab-container .nav-tabs { +.tab-container [role="tablist"] { + display: flex; + align-items: end; + justify-items: start; text-align: start; border-bottom: 1px solid #DDD; @include lightDark(border-color, #ddd, #444); margin-bottom: $-m; - .tab-item { - padding: $-s; - @include lightDark(color, #666, #999); - &.selected { - border-bottom-width: 3px; - } - } } -.nav-tabs { - text-align: center; - a, .tab-item { - padding: $-m; - display: inline-block; - @include lightDark(color, #666, #999); - cursor: pointer; - border-right: 1px solid rgba(0, 0, 0, 0.1); - border-bottom: 2px solid transparent; - &.selected { - border-bottom: 2px solid var(--color-primary); - } - &:last-child { - border-right: 0; - } +.tab-container [role="tablist"] button[role="tab"], +.image-manager [role="tablist"] button[role="tab"] { + display: inline-block; + padding: $-s; + @include lightDark(color, rgba(0, 0, 0, .5), rgba(255, 255, 255, .5)); + cursor: pointer; + border-bottom: 2px solid transparent; + margin-bottom: -1px; + &[aria-selected="true"] { + color: var(--color-link) !important; + border-bottom-color: var(--color-link) !important; } + &:hover, &:focus { + @include lightDark(color, rgba(0, 0, 0, .8), rgba(255, 255, 255, .8)); + @include lightDark(border-bottom-color, rgba(0, 0, 0, .2), rgba(255, 255, 255, .2)); + } +} +.tab-container [role="tablist"].controls-card { + margin-bottom: 0; + border-bottom: 0; + padding: 0 $-xs; } .image-picker .none { diff --git a/resources/sass/_forms.scss b/resources/sass/_forms.scss index ef14f6221..b7fc52f7d 100644 --- a/resources/sass/_forms.scss +++ b/resources/sass/_forms.scss @@ -258,7 +258,6 @@ input[type=color] { border-radius: 2px; display: inline-block; border: 2px solid currentColor; - opacity: 0.6; overflow: hidden; fill: currentColor; .svg-icon { diff --git a/resources/sass/_header.scss b/resources/sass/_header.scss index aa560e8e0..c1b6af4c6 100644 --- a/resources/sass/_header.scss +++ b/resources/sass/_header.scss @@ -22,9 +22,6 @@ header { border-bottom: 1px solid #DDD; box-shadow: $bs-card; @include lightDark(border-bottom-color, #DDD, #000); - @include whenDark { - filter: saturate(0.8) brightness(0.8); - } .header-links { display: flex; align-items: center; diff --git a/resources/sass/_layout.scss b/resources/sass/_layout.scss index 4c7de600b..19333faf7 100644 --- a/resources/sass/_layout.scss +++ b/resources/sass/_layout.scss @@ -268,6 +268,11 @@ body.flexbox { } } +.sticky-top-m { + position: sticky; + top: $-m; +} + /** * Visibility */ @@ -428,7 +433,7 @@ body.flexbox { display: none; } .tri-layout-left-contents > *, .tri-layout-right-contents > * { - @include lightDark(opacity, 0.6, 0.7); + @include lightDark(opacity, 0.6, 0.75); transition: opacity ease-in-out 120ms; &:hover, &:focus-within { opacity: 1 !important; @@ -437,7 +442,6 @@ body.flexbox { opacity: 1 !important; } } - } @include smaller-than($m) { diff --git a/resources/sass/_lists.scss b/resources/sass/_lists.scss index 86a89051f..33e500d6a 100644 --- a/resources/sass/_lists.scss +++ b/resources/sass/_lists.scss @@ -232,7 +232,7 @@ } // Sortable Lists -.sortable-page-list, .sortable-page-list ul { +.sortable-page-list, .sortable-page-sublist { list-style: none; } .sort-box { @@ -267,7 +267,7 @@ .entity-list-item > span:first-child { align-self: flex-start; } - .sortable-selected .entity-list-item, .sortable-selected .entity-list-item:hover { + .sortable-selected, .sortable-selected:hover { outline: 1px dotted var(--color-primary); background-color: var(--color-primary-light) !important; } @@ -278,12 +278,13 @@ > ul { margin-inline-start: 0; } - ul { + .sortable-page-sublist { margin-bottom: $-m; margin-top: 0; padding-inline-start: $-m; } li { + @include lightDark(background-color, #FFF, #222); border: 1px solid; @include lightDark(border-color, #DDD, #666); margin-top: -1px; @@ -302,6 +303,36 @@ .sortable-page-list li.placeholder:before { position: absolute; } +.sort-box summary { + list-style: none; + font-size: .9rem; + cursor: pointer; +} +.sort-box summary::-webkit-details-marker { + display: none; +} +details.sort-box summary .caret-container svg { + transition: transform ease-in-out 120ms; +} +details.sort-box[open] summary .caret-container svg { + transform: rotate(90deg); +} +.sort-box-actions .icon-button { + opacity: .6; +} +.sort-box .flex-container-row:hover .sort-box-actions .icon-button, +.sort-box .flex-container-row:focus-within .sort-box-actions .icon-button { + opacity: 1; +} +.sort-box-actions .icon-button[disabled] { + visibility: hidden; +} +.sort-box-actions .dropdown-menu button[disabled] { + display: none; +} +.sort-list-handle { + cursor: grab; +} .activity-list-item { padding: $-s 0; diff --git a/resources/sass/_text.scss b/resources/sass/_text.scss index 6c68bd12b..edf8ce614 100644 --- a/resources/sass/_text.scss +++ b/resources/sass/_text.scss @@ -90,7 +90,7 @@ h2.list-heading { * Link styling */ a { - color: var(--color-primary); + color: var(--color-link); fill: currentColor; cursor: pointer; text-decoration: none; @@ -107,7 +107,7 @@ a { display: inline-block; } &:focus img:only-child { - outline: 2px dashed var(--color-primary); + outline: 2px dashed var(--color-link); outline-offset: 2px; } } diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss index e1242bdda..aac9223f9 100644 --- a/resources/sass/_variables.scss +++ b/resources/sass/_variables.scss @@ -39,6 +39,7 @@ $fs-s: 12px; :root { --color-primary: #206ea7; --color-primary-light: rgba(32,110,167,0.15); + --color-link: #206ea7; --color-page: #206ea7; --color-page-draft: #7e50b1; diff --git a/resources/sass/styles.scss b/resources/sass/styles.scss index 23959d1f8..668cb5c85 100644 --- a/resources/sass/styles.scss +++ b/resources/sass/styles.scss @@ -113,7 +113,7 @@ $loadingSize: 10px; &:focus { top: $-xl; outline-offset: -10px; - outline: 2px dotted var(--color-primary); + outline: 2px dotted var(--color-link); } } @@ -187,18 +187,14 @@ $loadingSize: 10px; height: 400px; padding-top: $-l; } - .entity-selector-add button { - margin: 0; - display: block; - width: 100%; - border: 0; - border-top: 1px solid #DDD; - } &.compact { font-size: 10px; .entity-item-snippet { display: none; } + h4 { + font-size: 14px; + } } } diff --git a/resources/views/attachments/manager-list.blade.php b/resources/views/attachments/manager-list.blade.php index ebb1c24aa..f1dfe2b82 100644 --- a/resources/views/attachments/manager-list.blade.php +++ b/resources/views/attachments/manager-list.blade.php @@ -14,13 +14,13 @@ option:event-emit-select:name="insert" type="button" title="{{ trans('entities.attachments_insert_link') }}" - class="drag-card-action text-center text-primary">@icon('link') + class="drag-card-action text-center text-link">@icon('link') + class="drag-card-action text-center text-link">@icon('edit')
diff --git a/resources/views/attachments/manager.blade.php b/resources/views/attachments/manager.blade.php index 724ca9c8e..7d14d00e7 100644 --- a/resources/views/attachments/manager.blade.php +++ b/resources/views/attachments/manager.blade.php @@ -9,25 +9,54 @@
-

{{ trans('entities.attachments_explain') }} {{ trans('entities.attachments_explain_instant_save') }}

+

{{ trans('entities.attachments_explain') }} {{ trans('entities.attachments_explain_instant_save') }}

-