diff --git a/.env.example b/.env.example index f5e81277c..47f2367b0 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,11 @@ +# This file, when named as ".env" in the root of your BookStack install +# folder, is used for the core configuration of the application. +# By default this file contains the most common required options but +# a full list of options can be found in the '.env.example.complete' file. + +# NOTE: If any of your values contain a space or a hash you will need to +# wrap the entire value in quotes. (eg. MAIL_FROM_NAME="BookStack Mailer") + # Application key # Used for encryption where needed. # Run `php artisan key:generate` to generate a valid key. @@ -5,7 +13,7 @@ APP_KEY=SomeRandomString # Application URL # Remove the hash below and set a URL if using BookStack behind -# a proxy, if using a third-party authentication option. +# a proxy or if using a third-party authentication option. # This must be the root URL that you want to host BookStack on. # All URL's in BookStack will be generated using this value. #APP_URL=https://example.com @@ -25,11 +33,10 @@ MAIL_FROM_NAME=BookStack MAIL_FROM=bookstack@example.com # SMTP mail options +# These settings can be checked using the "Send a Test Email" +# feature found in the "Settings > Maintenance" area of the system. MAIL_HOST=localhost MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null -MAIL_ENCRYPTION=null - - -# A full list of options can be found in the '.env.example.complete' file. \ No newline at end of file +MAIL_ENCRYPTION=null \ No newline at end of file diff --git a/.env.example.complete b/.env.example.complete index 472ca051b..39e7b4360 100644 --- a/.env.example.complete +++ b/.env.example.complete @@ -270,4 +270,12 @@ API_DEFAULT_ITEM_COUNT=100 API_MAX_ITEM_COUNT=500 # The number of API requests that can be made per minute by a single user. -API_REQUESTS_PER_MIN=180 \ No newline at end of file +API_REQUESTS_PER_MIN=180 + +# Enable the logging of failed email+password logins with the given message. +# The default log channel below uses the php 'error_log' function which commonly +# results in messages being output to the webserver error logs. +# The message can contain a %u parameter which will be replaced with the login +# user identifier (Username or email). +LOG_FAILED_LOGIN_MESSAGE=false +LOG_FAILED_LOGIN_CHANNEL=errorlog_plain_webserver diff --git a/.github/translators.txt b/.github/translators.txt index 098751fcd..e9ea8ffba 100644 --- a/.github/translators.txt +++ b/.github/translators.txt @@ -61,7 +61,7 @@ Rodrigo Saczuk Niz (rodrigoniz) :: Portuguese, Brazilian aekramer :: Dutch JachuPL :: Polish milesteg :: Hungarian -Beenbag :: German +Beenbag :: German; German Informal Lett3rs :: Danish Julian (julian.henneberg) :: German; German Informal 3GNWn :: Danish @@ -98,3 +98,25 @@ Thinkverse (thinkverse) :: Swedish alef (toishoki) :: Turkish Robbert Feunekes (Muukuro) :: Dutch seohyeon.joo :: Korean +Orenda (OREDNA) :: Bulgarian +Marek Pavelka (marapavelka) :: Czech +Venkinovec :: Czech +Tommy Ku (tommyku) :: Chinese Traditional; Japanese +Michał Bielejewski (bielej) :: Polish +jozefrebjak :: Slovak +Ikhwan Koo (Ikhwan.Koo) :: Korean +Whay (remkovdhoef) :: Dutch +jc7115 :: Chinese Traditional +주서현 (seohyeon.joo) :: Korean +ReadySystems :: Arabic +HFinch :: German; German Informal +brechtgijsens :: Dutch +Lowkey (v587ygq) :: Chinese Simplified +sdl-blue :: German Informal +sqlik :: Polish +Roy van Schaijk (royvanschaijk) :: Dutch +Simsimpicpic :: French +Zenahr Barzani (Zenahr) :: German; Japanese; Dutch; German Informal +tatsuya.info :: Japanese +fadiapp :: Arabic +Jakub “Jéžiš” Bouček (jakubboucek) :: Czech diff --git a/app/Actions/ActivityService.php b/app/Actions/ActivityService.php index 9b69cbb17..e6b004f01 100644 --- a/app/Actions/ActivityService.php +++ b/app/Actions/ActivityService.php @@ -4,6 +4,7 @@ use BookStack\Auth\Permissions\PermissionService; use BookStack\Auth\User; use BookStack\Entities\Entity; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Log; class ActivityService { @@ -49,7 +50,7 @@ class ActivityService protected function newActivityForUser(string $key, ?int $bookId = null): Activity { return $this->activity->newInstance()->forceFill([ - 'key' => strtolower($key), + 'key' => strtolower($key), 'user_id' => $this->user->id, 'book_id' => $bookId ?? 0, ]); @@ -64,8 +65,8 @@ class ActivityService { $activities = $entity->activity()->get(); $entity->activity()->update([ - 'extra' => $entity->name, - 'entity_id' => 0, + 'extra' => $entity->name, + 'entity_id' => 0, 'entity_type' => '', ]); return $activities; @@ -99,7 +100,7 @@ class ActivityService $query = $this->activity->newQuery()->where('entity_type', '=', $entity->getMorphClass()) ->where('entity_id', '=', $entity->id); } - + $activity = $this->permissionService ->filterRestrictedEntityRelations($query, 'activities', 'entity_id', 'entity_type') ->orderBy('created_at', 'desc') @@ -159,4 +160,20 @@ class ActivityService session()->flash('success', $message); } } + + /** + * Log out a failed login attempt, Providing the given username + * as part of the message if the '%u' string is used. + */ + public function logFailedLogin(string $username) + { + $message = config('logging.failed_login.message'); + if (!$message) { + return; + } + + $message = str_replace("%u", $username, $message); + $channel = config('logging.failed_login.channel'); + Log::channel($channel)->warning($message); + } } diff --git a/app/Actions/Tag.php b/app/Actions/Tag.php index 38d0458e4..80a911508 100644 --- a/app/Actions/Tag.php +++ b/app/Actions/Tag.php @@ -9,6 +9,7 @@ use BookStack\Model; class Tag extends Model { protected $fillable = ['name', 'value', 'order']; + protected $hidden = ['id', 'entity_id', 'entity_type']; /** * Get the entity that this tag belongs to diff --git a/app/Actions/TagRepo.php b/app/Actions/TagRepo.php index 0cbfa4163..0297d8bc6 100644 --- a/app/Actions/TagRepo.php +++ b/app/Actions/TagRepo.php @@ -2,71 +2,31 @@ use BookStack\Auth\Permissions\PermissionService; use BookStack\Entities\Entity; +use DB; +use Illuminate\Support\Collection; -/** - * Class TagRepo - * @package BookStack\Repos - */ class TagRepo { protected $tag; - protected $entity; protected $permissionService; /** * TagRepo constructor. - * @param \BookStack\Actions\Tag $attr - * @param \BookStack\Entities\Entity $ent - * @param \BookStack\Auth\Permissions\PermissionService $ps */ - public function __construct(Tag $attr, Entity $ent, PermissionService $ps) + public function __construct(Tag $tag, PermissionService $ps) { - $this->tag = $attr; - $this->entity = $ent; + $this->tag = $tag; $this->permissionService = $ps; } - /** - * Get an entity instance of its particular type. - * @param $entityType - * @param $entityId - * @param string $action - * @return \Illuminate\Database\Eloquent\Model|null|static - */ - public function getEntity($entityType, $entityId, $action = 'view') - { - $entityInstance = $this->entity->getEntityInstance($entityType); - $searchQuery = $entityInstance->where('id', '=', $entityId)->with('tags'); - $searchQuery = $this->permissionService->enforceEntityRestrictions($entityType, $searchQuery, $action); - return $searchQuery->first(); - } - - /** - * Get all tags for a particular entity. - * @param string $entityType - * @param int $entityId - * @return mixed - */ - public function getForEntity($entityType, $entityId) - { - $entity = $this->getEntity($entityType, $entityId); - if ($entity === null) { - return collect(); - } - - return $entity->tags; - } - /** * Get tag name suggestions from scanning existing tag names. * If no search term is given the 50 most popular tag names are provided. - * @param $searchTerm - * @return array */ - public function getNameSuggestions($searchTerm = false) + public function getNameSuggestions(?string $searchTerm): Collection { - $query = $this->tag->select('*', \DB::raw('count(*) as count'))->groupBy('name'); + $query = $this->tag->select('*', DB::raw('count(*) as count'))->groupBy('name'); if ($searchTerm) { $query = $query->where('name', 'LIKE', $searchTerm . '%')->orderBy('name', 'desc'); @@ -82,13 +42,10 @@ class TagRepo * Get tag value suggestions from scanning existing tag values. * If no search is given the 50 most popular values are provided. * Passing a tagName will only find values for a tags with a particular name. - * @param $searchTerm - * @param $tagName - * @return array */ - public function getValueSuggestions($searchTerm = false, $tagName = false) + public function getValueSuggestions(?string $searchTerm, ?string $tagName): Collection { - $query = $this->tag->select('*', \DB::raw('count(*) as count'))->groupBy('value'); + $query = $this->tag->select('*', DB::raw('count(*) as count'))->groupBy('value'); if ($searchTerm) { $query = $query->where('value', 'LIKE', $searchTerm . '%')->orderBy('value', 'desc'); @@ -96,7 +53,7 @@ class TagRepo $query = $query->orderBy('count', 'desc')->take(50); } - if ($tagName !== false) { + if ($tagName) { $query = $query->where('name', '=', $tagName); } @@ -106,35 +63,28 @@ class TagRepo /** * Save an array of tags to an entity - * @param \BookStack\Entities\Entity $entity - * @param array $tags - * @return array|\Illuminate\Database\Eloquent\Collection */ - public function saveTagsToEntity(Entity $entity, $tags = []) + public function saveTagsToEntity(Entity $entity, array $tags = []): iterable { $entity->tags()->delete(); - $newTags = []; - foreach ($tags as $tag) { - if (trim($tag['name']) === '') { - continue; - } - $newTags[] = $this->newInstanceFromInput($tag); - } + + $newTags = collect($tags)->filter(function ($tag) { + return boolval(trim($tag['name'])); + })->map(function ($tag) { + return $this->newInstanceFromInput($tag); + })->all(); return $entity->tags()->saveMany($newTags); } /** * Create a new Tag instance from user input. - * @param $input - * @return \BookStack\Actions\Tag + * Input must be an array with a 'name' and an optional 'value' key. */ - protected function newInstanceFromInput($input) + protected function newInstanceFromInput(array $input): Tag { $name = trim($input['name']); $value = isset($input['value']) ? trim($input['value']) : ''; - // Any other modification or cleanup required can go here - $values = ['name' => $name, 'value' => $value]; - return $this->tag->newInstance($values); + return $this->tag->newInstance(['name' => $name, 'value' => $value]); } } diff --git a/app/Auth/Access/ExternalAuthService.php b/app/Auth/Access/ExternalAuthService.php index db8bd2dfb..4c71db21a 100644 --- a/app/Auth/Access/ExternalAuthService.php +++ b/app/Auth/Access/ExternalAuthService.php @@ -3,6 +3,8 @@ use BookStack\Auth\Role; use BookStack\Auth\User; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; class ExternalAuthService { @@ -39,22 +41,14 @@ class ExternalAuthService /** * Match an array of group names to BookStack system roles. * Formats group names to be lower-case and hyphenated. - * @param array $groupNames - * @return \Illuminate\Support\Collection */ - protected function matchGroupsToSystemsRoles(array $groupNames) + protected function matchGroupsToSystemsRoles(array $groupNames): Collection { foreach ($groupNames as $i => $groupName) { $groupNames[$i] = str_replace(' ', '-', trim(strtolower($groupName))); } - $roles = Role::query()->where(function (Builder $query) use ($groupNames) { - $query->whereIn('name', $groupNames); - foreach ($groupNames as $groupName) { - $query->orWhere('external_auth_id', 'LIKE', '%' . $groupName . '%'); - } - })->get(); - + $roles = Role::query()->get(['id', 'external_auth_id', 'display_name']); $matchedRoles = $roles->filter(function (Role $role) use ($groupNames) { return $this->roleMatchesGroupNames($role, $groupNames); }); diff --git a/app/Auth/Access/RegistrationService.php b/app/Auth/Access/RegistrationService.php index 9136b37b5..b85f7ffd8 100644 --- a/app/Auth/Access/RegistrationService.php +++ b/app/Auth/Access/RegistrationService.php @@ -71,15 +71,15 @@ class RegistrationService // Start email confirmation flow if required if ($this->emailConfirmationService->confirmationRequired() && !$emailConfirmed) { $newUser->save(); - $message = ''; try { $this->emailConfirmationService->sendConfirmation($newUser); + session()->flash('sent-email-confirmation', true); } catch (Exception $e) { $message = trans('auth.email_confirm_send_error'); + throw new UserRegistrationException($message, '/register/confirm'); } - throw new UserRegistrationException($message, '/register/confirm'); } return $newUser; diff --git a/app/Auth/Access/Saml2Service.php b/app/Auth/Access/Saml2Service.php index 8f9a24cde..89ddd0011 100644 --- a/app/Auth/Access/Saml2Service.php +++ b/app/Auth/Access/Saml2Service.php @@ -311,7 +311,6 @@ class Saml2Service extends ExternalAuthService /** * Get the user from the database for the specified details. - * @throws SamlException * @throws UserRegistrationException */ protected function getOrRegisterUser(array $userDetails): ?User diff --git a/app/Auth/Permissions/JointPermission.php b/app/Auth/Permissions/JointPermission.php index c48549b8f..8d1776bd8 100644 --- a/app/Auth/Permissions/JointPermission.php +++ b/app/Auth/Permissions/JointPermission.php @@ -3,25 +3,26 @@ use BookStack\Auth\Role; use BookStack\Entities\Entity; use BookStack\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphOne; class JointPermission extends Model { + protected $primaryKey = null; public $timestamps = false; /** * Get the role that this points to. - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function role() + public function role(): BelongsTo { return $this->belongsTo(Role::class); } /** * Get the entity this points to. - * @return \Illuminate\Database\Eloquent\Relations\MorphOne */ - public function entity() + public function entity(): MorphOne { return $this->morphOne(Entity::class, 'entity'); } diff --git a/app/Auth/Permissions/PermissionsRepo.php b/app/Auth/Permissions/PermissionsRepo.php index 56ef19301..ce61093cc 100644 --- a/app/Auth/Permissions/PermissionsRepo.php +++ b/app/Auth/Permissions/PermissionsRepo.php @@ -1,8 +1,9 @@ permission = $permission; $this->role = $role; @@ -29,46 +27,34 @@ class PermissionsRepo /** * Get all the user roles from the system. - * @return \Illuminate\Database\Eloquent\Collection|static[] */ - public function getAllRoles() + public function getAllRoles(): Collection { return $this->role->all(); } /** * Get all the roles except for the provided one. - * @param Role $role - * @return mixed */ - public function getAllRolesExcept(Role $role) + public function getAllRolesExcept(Role $role): Collection { return $this->role->where('id', '!=', $role->id)->get(); } /** * Get a role via its ID. - * @param $id - * @return mixed */ - public function getRoleById($id) + public function getRoleById($id): Role { - return $this->role->findOrFail($id); + return $this->role->newQuery()->findOrFail($id); } /** * Save a new role into the system. - * @param array $roleData - * @return Role */ - public function saveNewRole($roleData) + public function saveNewRole(array $roleData): Role { $role = $this->role->newInstance($roleData); - $role->name = str_replace(' ', '-', strtolower($roleData['display_name'])); - // Prevent duplicate names - while ($this->role->where('name', '=', $role->name)->count() > 0) { - $role->name .= strtolower(Str::random(2)); - } $role->save(); $permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : []; @@ -80,13 +66,11 @@ class PermissionsRepo /** * Updates an existing role. * Ensure Admin role always have core permissions. - * @param $roleId - * @param $roleData - * @throws PermissionsException */ - public function updateRole($roleId, $roleData) + public function updateRole($roleId, array $roleData) { - $role = $this->role->findOrFail($roleId); + /** @var Role $role */ + $role = $this->role->newQuery()->findOrFail($roleId); $permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : []; if ($role->system_name === 'admin') { @@ -108,16 +92,19 @@ class PermissionsRepo /** * Assign an list of permission names to an role. - * @param Role $role - * @param array $permissionNameArray */ - public function assignRolePermissions(Role $role, $permissionNameArray = []) + public function assignRolePermissions(Role $role, array $permissionNameArray = []) { $permissions = []; $permissionNameArray = array_values($permissionNameArray); - if ($permissionNameArray && count($permissionNameArray) > 0) { - $permissions = $this->permission->whereIn('name', $permissionNameArray)->pluck('id')->toArray(); + + if ($permissionNameArray) { + $permissions = $this->permission->newQuery() + ->whereIn('name', $permissionNameArray) + ->pluck('id') + ->toArray(); } + $role->permissions()->sync($permissions); } @@ -126,13 +113,13 @@ class PermissionsRepo * Check it's not an admin role or set as default before deleting. * If an migration Role ID is specified the users assign to the current role * will be added to the role of the specified id. - * @param $roleId - * @param $migrateRoleId * @throws PermissionsException + * @throws Exception */ public function deleteRole($roleId, $migrateRoleId) { - $role = $this->role->findOrFail($roleId); + /** @var Role $role */ + $role = $this->role->newQuery()->findOrFail($roleId); // Prevent deleting admin role or default registration role. if ($role->system_name && in_array($role->system_name, $this->systemRoles)) { @@ -142,9 +129,9 @@ class PermissionsRepo } if ($migrateRoleId) { - $newRole = $this->role->find($migrateRoleId); + $newRole = $this->role->newQuery()->find($migrateRoleId); if ($newRole) { - $users = $role->users->pluck('id')->toArray(); + $users = $role->users()->pluck('id')->toArray(); $newRole->users()->sync($users); } } diff --git a/app/Auth/Permissions/RolePermission.php b/app/Auth/Permissions/RolePermission.php index 8b07b3073..7f44ff815 100644 --- a/app/Auth/Permissions/RolePermission.php +++ b/app/Auth/Permissions/RolePermission.php @@ -3,6 +3,9 @@ use BookStack\Auth\Role; use BookStack\Model; +/** + * @property int $id + */ class RolePermission extends Model { /** diff --git a/app/Auth/Role.php b/app/Auth/Role.php index df9b1cea9..13ec6df16 100644 --- a/app/Auth/Role.php +++ b/app/Auth/Role.php @@ -3,13 +3,16 @@ use BookStack\Auth\Permissions\JointPermission; use BookStack\Auth\Permissions\RolePermission; use BookStack\Model; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Relations\HasMany; /** * Class Role + * @property int $id * @property string $display_name * @property string $description * @property string $external_auth_id - * @package BookStack\Auth + * @property string $system_name */ class Role extends Model { @@ -26,9 +29,8 @@ class Role extends Model /** * Get all related JointPermissions. - * @return \Illuminate\Database\Eloquent\Relations\HasMany */ - public function jointPermissions() + public function jointPermissions(): HasMany { return $this->hasMany(JointPermission::class); } @@ -43,10 +45,8 @@ class Role extends Model /** * Check if this role has a permission. - * @param $permissionName - * @return bool */ - public function hasPermission($permissionName) + public function hasPermission(string $permissionName): bool { $permissions = $this->getRelationValue('permissions'); foreach ($permissions as $permission) { @@ -59,7 +59,6 @@ class Role extends Model /** * Add a permission to this role. - * @param RolePermission $permission */ public function attachPermission(RolePermission $permission) { @@ -68,7 +67,6 @@ class Role extends Model /** * Detach a single permission from this role. - * @param RolePermission $permission */ public function detachPermission(RolePermission $permission) { @@ -76,39 +74,33 @@ class Role extends Model } /** - * Get the role object for the specified role. - * @param $roleName - * @return Role + * Get the role of the specified display name. */ - public static function getRole($roleName) + public static function getRole(string $displayName): ?Role { - return static::query()->where('name', '=', $roleName)->first(); + return static::query()->where('display_name', '=', $displayName)->first(); } /** * Get the role object for the specified system role. - * @param $roleName - * @return Role */ - public static function getSystemRole($roleName) + public static function getSystemRole(string $systemName): ?Role { - return static::query()->where('system_name', '=', $roleName)->first(); + return static::query()->where('system_name', '=', $systemName)->first(); } /** * Get all visible roles - * @return mixed */ - public static function visible() + public static function visible(): Collection { return static::query()->where('hidden', '=', false)->orderBy('name')->get(); } /** * Get the roles that can be restricted. - * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection */ - public static function restrictable() + public static function restrictable(): Collection { return static::query()->where('system_name', '!=', 'admin')->get(); } diff --git a/app/Auth/User.php b/app/Auth/User.php index a581d9993..f65ef5316 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -49,7 +49,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ protected $hidden = [ 'password', 'remember_token', 'system_name', 'email_confirmed', 'external_auth_id', 'email', - 'created_at', 'updated_at', + 'created_at', 'updated_at', 'image_id', ]; /** @@ -101,12 +101,10 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Check if the user has a role. - * @param $role - * @return mixed */ - public function hasRole($role) + public function hasRole($roleId): bool { - return $this->roles->pluck('name')->contains($role); + return $this->roles->pluck('id')->contains($roleId); } /** @@ -163,7 +161,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Attach a role to this user. - * @param Role $role */ public function attachRole(Role $role) { diff --git a/app/Auth/UserRepo.php b/app/Auth/UserRepo.php index cfa7bfce1..fdb8c0923 100644 --- a/app/Auth/UserRepo.php +++ b/app/Auth/UserRepo.php @@ -238,7 +238,7 @@ class UserRepo */ public function getAllRoles() { - return $this->role->newQuery()->orderBy('name', 'asc')->get(); + return $this->role->newQuery()->orderBy('display_name', 'asc')->get(); } /** diff --git a/app/Config/app.php b/app/Config/app.php index a9956edd8..8a1d17528 100755 --- a/app/Config/app.php +++ b/app/Config/app.php @@ -52,7 +52,7 @@ return [ 'locale' => env('APP_LANG', 'en'), // Locales available - 'locales' => ['en', 'ar', 'cs', 'da', 'de', 'de_informal', 'es', 'es_AR', 'fa', 'fr', 'he', 'hu', 'it', 'ja', 'ko', 'nl', 'pt', 'pt_BR', 'sk', 'sl', 'sv', 'pl', 'ru', 'th', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW',], + 'locales' => ['en', 'ar', 'bg', 'cs', 'da', 'de', 'de_informal', 'es', 'es_AR', 'fa', 'fr', 'he', 'hu', 'it', 'ja', 'ko', 'nl', 'pt', 'pt_BR', 'sk', 'sl', 'sv', 'pl', 'ru', 'th', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW',], // Application Fallback Locale 'fallback_locale' => 'en', diff --git a/app/Config/logging.php b/app/Config/logging.php index 0b55dc24d..afd56e482 100644 --- a/app/Config/logging.php +++ b/app/Config/logging.php @@ -1,5 +1,7 @@ 'debug', ], + // Custom errorlog implementation that logs out a plain, + // non-formatted message intended for the webserver log. + 'errorlog_plain_webserver' => [ + 'driver' => 'monolog', + 'level' => 'debug', + 'handler' => ErrorLogHandler::class, + 'handler_with' => [4], + 'formatter' => LineFormatter::class, + 'formatter_with' => [ + 'format' => "%message%", + ], + ], + 'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], + + // Testing channel + // Uses a shared testing instance during tests + // so that logs can be checked against. + 'testing' => [ + 'driver' => 'testing', + ], + ], + + + // Failed Login Message + // Allows a configurable message to be logged when a login request fails. + 'failed_login' => [ + 'message' => env('LOG_FAILED_LOGIN_MESSAGE', null), + 'channel' => env('LOG_FAILED_LOGIN_CHANNEL', 'errorlog_plain_webserver'), ], ]; diff --git a/app/Config/saml2.php b/app/Config/saml2.php index 5f2c1395b..d695abf32 100644 --- a/app/Config/saml2.php +++ b/app/Config/saml2.php @@ -101,7 +101,7 @@ return [ 'url' => env('SAML2_IDP_SLO', null), // URL location of the IdP where the SP will send the SLO Response (ResponseLocation) // if not set, url for the SLO Request will be used - 'responseUrl' => '', + 'responseUrl' => null, // SAML protocol binding to be used when returning the // message. Onelogin Toolkit supports for this endpoint the // HTTP-Redirect binding only diff --git a/app/Entities/Book.php b/app/Entities/Book.php index 38b7d4a8c..af8344b88 100644 --- a/app/Entities/Book.php +++ b/app/Entities/Book.php @@ -19,7 +19,7 @@ class Book extends Entity implements HasCoverImage public $searchFactor = 2; protected $fillable = ['name', 'description']; - protected $hidden = ['restricted', 'pivot']; + protected $hidden = ['restricted', 'pivot', 'image_id']; /** * Get the url for this book. diff --git a/app/Entities/Bookshelf.php b/app/Entities/Bookshelf.php index c7ba840e0..474ba51cd 100644 --- a/app/Entities/Bookshelf.php +++ b/app/Entities/Bookshelf.php @@ -12,7 +12,7 @@ class Bookshelf extends Entity implements HasCoverImage protected $fillable = ['name', 'description', 'image_id']; - protected $hidden = ['restricted']; + protected $hidden = ['restricted', 'image_id']; /** * Get the books in this shelf. diff --git a/app/Entities/Chapter.php b/app/Entities/Chapter.php index 848bc6448..3290afcfa 100644 --- a/app/Entities/Chapter.php +++ b/app/Entities/Chapter.php @@ -12,6 +12,7 @@ class Chapter extends BookChild public $searchFactor = 1.3; protected $fillable = ['name', 'description', 'priority', 'book_id']; + protected $hidden = ['restricted', 'pivot']; /** * Get the pages that this chapter contains. diff --git a/app/Entities/Entity.php b/app/Entities/Entity.php index 5013c39cf..120290d8f 100644 --- a/app/Entities/Entity.php +++ b/app/Entities/Entity.php @@ -238,10 +238,8 @@ class Entity extends Ownable /** * Gets a limited-length version of the entities name. - * @param int $length - * @return string */ - public function getShortName($length = 25) + public function getShortName(int $length = 25): string { if (mb_strlen($this->name) <= $length) { return $this->name; @@ -288,7 +286,7 @@ class Entity extends Ownable public function rebuildPermissions() { /** @noinspection PhpUnhandledExceptionInspection */ - Permissions::buildJointPermissionsForEntity($this); + Permissions::buildJointPermissionsForEntity(clone $this); } /** @@ -297,7 +295,7 @@ class Entity extends Ownable public function indexForSearch() { $searchService = app()->make(SearchService::class); - $searchService->indexEntity($this); + $searchService->indexEntity(clone $this); } /** diff --git a/app/Entities/Managers/PageContent.php b/app/Entities/Managers/PageContent.php index 36bc2445c..e417b1caa 100644 --- a/app/Entities/Managers/PageContent.php +++ b/app/Entities/Managers/PageContent.php @@ -108,7 +108,7 @@ class PageContent protected function toPlainText(): string { $html = $this->render(true); - return strip_tags($html); + return html_entity_decode(strip_tags($html)); } /** diff --git a/app/Entities/Page.php b/app/Entities/Page.php index 76dc628fb..32ba2981d 100644 --- a/app/Entities/Page.php +++ b/app/Entities/Page.php @@ -21,12 +21,14 @@ use Permissions; */ class Page extends BookChild { - protected $fillable = ['name', 'html', 'priority', 'markdown']; + protected $fillable = ['name', 'priority', 'markdown']; protected $simpleAttributes = ['name', 'id', 'slug']; public $textField = 'text'; + protected $hidden = ['html', 'markdown', 'text', 'restricted', 'pivot']; + /** * Get the entities that are visible to the current user. */ diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index e49eeb1ef..e5f13463c 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -180,12 +180,11 @@ class PageRepo $page->template = ($input['template'] === 'true'); } + $pageContent = new PageContent($page); + $pageContent->setNewHTML($input['html']); $this->baseRepo->update($page, $input); // Update with new details - $page->fill($input); - $pageContent = new PageContent($page); - $pageContent->setNewHTML($input['html']); $page->revision_count++; if (setting('app-editor') !== 'markdown') { @@ -211,7 +210,7 @@ class PageRepo */ protected function savePageRevision(Page $page, string $summary = null) { - $revision = new PageRevision($page->toArray()); + $revision = new PageRevision($page->getAttributes()); if (setting('app-editor') !== 'markdown') { $revision->markdown = ''; @@ -279,7 +278,7 @@ class PageRepo $revision = $page->revisions()->where('id', '=', $revisionId)->first(); $page->fill($revision->toArray()); $content = new PageContent($page); - $content->setNewHTML($page->html); + $content->setNewHTML($revision->html); $page->updated_by = user()->id; $page->refreshSlug(); $page->save(); diff --git a/app/Entities/SearchOptions.php b/app/Entities/SearchOptions.php new file mode 100644 index 000000000..a121bd793 --- /dev/null +++ b/app/Entities/SearchOptions.php @@ -0,0 +1,141 @@ + $value) { + $instance->$type = $value; + } + return $instance; + } + + /** + * Create a new instance from a request. + * Will look for a classic string term and use that + * Otherwise we'll use the details from an advanced search form. + */ + public static function fromRequest(Request $request): SearchOptions + { + if (!$request->has('search') && !$request->has('term')) { + return static::fromString(''); + } + + if ($request->has('term')) { + return static::fromString($request->get('term')); + } + + $instance = new static(); + $inputs = $request->only(['search', 'types', 'filters', 'exact', 'tags']); + $instance->searches = explode(' ', $inputs['search'] ?? []); + $instance->exacts = array_filter($inputs['exact'] ?? []); + $instance->tags = array_filter($inputs['tags'] ?? []); + foreach (($inputs['filters'] ?? []) as $filterKey => $filterVal) { + if (empty($filterVal)) { + continue; + } + $instance->filters[$filterKey] = $filterVal === 'true' ? '' : $filterVal; + } + if (isset($inputs['types']) && count($inputs['types']) < 4) { + $instance->filters['type'] = implode('|', $inputs['types']); + } + return $instance; + } + + /** + * Decode a search string into an array of terms. + */ + protected static function decode(string $searchString): array + { + $terms = [ + 'searches' => [], + 'exacts' => [], + 'tags' => [], + 'filters' => [] + ]; + + $patterns = [ + 'exacts' => '/"(.*?)"/', + 'tags' => '/\[(.*?)\]/', + 'filters' => '/\{(.*?)\}/' + ]; + + // Parse special terms + foreach ($patterns as $termType => $pattern) { + $matches = []; + preg_match_all($pattern, $searchString, $matches); + if (count($matches) > 0) { + $terms[$termType] = $matches[1]; + $searchString = preg_replace($pattern, '', $searchString); + } + } + + // Parse standard terms + foreach (explode(' ', trim($searchString)) as $searchTerm) { + if ($searchTerm !== '') { + $terms['searches'][] = $searchTerm; + } + } + + // Split filter values out + $splitFilters = []; + foreach ($terms['filters'] as $filter) { + $explodedFilter = explode(':', $filter, 2); + $splitFilters[$explodedFilter[0]] = (count($explodedFilter) > 1) ? $explodedFilter[1] : ''; + } + $terms['filters'] = $splitFilters; + + return $terms; + } + + /** + * Encode this instance to a search string. + */ + public function toString(): string + { + $string = implode(' ', $this->searches ?? []); + + foreach ($this->exacts as $term) { + $string .= ' "' . $term . '"'; + } + + foreach ($this->tags as $term) { + $string .= " [{$term}]"; + } + + foreach ($this->filters as $filterName => $filterVal) { + $string .= ' {' . $filterName . ($filterVal ? ':' . $filterVal : '') . '}'; + } + + return $string; + } + +} \ No newline at end of file diff --git a/app/Entities/SearchService.php b/app/Entities/SearchService.php index ee9b87786..11b731cd0 100644 --- a/app/Entities/SearchService.php +++ b/app/Entities/SearchService.php @@ -39,10 +39,6 @@ class SearchService /** * SearchService constructor. - * @param SearchTerm $searchTerm - * @param EntityProvider $entityProvider - * @param Connection $db - * @param PermissionService $permissionService */ public function __construct(SearchTerm $searchTerm, EntityProvider $entityProvider, Connection $db, PermissionService $permissionService) { @@ -54,7 +50,6 @@ class SearchService /** * Set the database connection - * @param Connection $connection */ public function setConnection(Connection $connection) { @@ -63,23 +58,18 @@ class SearchService /** * Search all entities in the system. - * @param string $searchString - * @param string $entityType - * @param int $page - * @param int $count - Count of each entity to search, Total returned could can be larger and not guaranteed. - * @param string $action - * @return array[int, Collection]; + * The provided count is for each entity to search, + * Total returned could can be larger and not guaranteed. */ - public function searchEntities($searchString, $entityType = 'all', $page = 1, $count = 20, $action = 'view') + public function searchEntities(SearchOptions $searchOpts, string $entityType = 'all', int $page = 1, int $count = 20, string $action = 'view'): array { - $terms = $this->parseSearchString($searchString); $entityTypes = array_keys($this->entityProvider->all()); $entityTypesToSearch = $entityTypes; if ($entityType !== 'all') { $entityTypesToSearch = $entityType; - } else if (isset($terms['filters']['type'])) { - $entityTypesToSearch = explode('|', $terms['filters']['type']); + } else if (isset($searchOpts->filters['type'])) { + $entityTypesToSearch = explode('|', $searchOpts->filters['type']); } $results = collect(); @@ -90,8 +80,8 @@ class SearchService if (!in_array($entityType, $entityTypes)) { continue; } - $search = $this->searchEntityTable($terms, $entityType, $page, $count, $action); - $entityTotal = $this->searchEntityTable($terms, $entityType, $page, $count, $action, true); + $search = $this->searchEntityTable($searchOpts, $entityType, $page, $count, $action); + $entityTotal = $this->searchEntityTable($searchOpts, $entityType, $page, $count, $action, true); if ($entityTotal > $page * $count) { $hasMore = true; } @@ -103,29 +93,26 @@ class SearchService 'total' => $total, 'count' => count($results), 'has_more' => $hasMore, - 'results' => $results->sortByDesc('score')->values() + 'results' => $results->sortByDesc('score')->values(), ]; } /** * Search a book for entities - * @param integer $bookId - * @param string $searchString - * @return Collection */ - public function searchBook($bookId, $searchString) + public function searchBook(int $bookId, string $searchString): Collection { - $terms = $this->parseSearchString($searchString); + $opts = SearchOptions::fromString($searchString); $entityTypes = ['page', 'chapter']; - $entityTypesToSearch = isset($terms['filters']['type']) ? explode('|', $terms['filters']['type']) : $entityTypes; + $entityTypesToSearch = isset($opts->filters['type']) ? explode('|', $opts->filters['type']) : $entityTypes; $results = collect(); foreach ($entityTypesToSearch as $entityType) { if (!in_array($entityType, $entityTypes)) { continue; } - $search = $this->buildEntitySearchQuery($terms, $entityType)->where('book_id', '=', $bookId)->take(20)->get(); + $search = $this->buildEntitySearchQuery($opts, $entityType)->where('book_id', '=', $bookId)->take(20)->get(); $results = $results->merge($search); } return $results->sortByDesc('score')->take(20); @@ -133,30 +120,23 @@ class SearchService /** * Search a book for entities - * @param integer $chapterId - * @param string $searchString - * @return Collection */ - public function searchChapter($chapterId, $searchString) + public function searchChapter(int $chapterId, string $searchString): Collection { - $terms = $this->parseSearchString($searchString); - $pages = $this->buildEntitySearchQuery($terms, 'page')->where('chapter_id', '=', $chapterId)->take(20)->get(); + $opts = SearchOptions::fromString($searchString); + $pages = $this->buildEntitySearchQuery($opts, 'page')->where('chapter_id', '=', $chapterId)->take(20)->get(); return $pages->sortByDesc('score'); } /** * Search across a particular entity type. - * @param array $terms - * @param string $entityType - * @param int $page - * @param int $count - * @param string $action - * @param bool $getCount Return the total count of the search + * Setting getCount = true will return the total + * matching instead of the items themselves. * @return \Illuminate\Database\Eloquent\Collection|int|static[] */ - public function searchEntityTable($terms, $entityType = 'page', $page = 1, $count = 20, $action = 'view', $getCount = false) + public function searchEntityTable(SearchOptions $searchOpts, string $entityType = 'page', int $page = 1, int $count = 20, string $action = 'view', bool $getCount = false) { - $query = $this->buildEntitySearchQuery($terms, $entityType, $action); + $query = $this->buildEntitySearchQuery($searchOpts, $entityType, $action); if ($getCount) { return $query->count(); } @@ -167,22 +147,18 @@ class SearchService /** * Create a search query for an entity - * @param array $terms - * @param string $entityType - * @param string $action - * @return EloquentBuilder */ - protected function buildEntitySearchQuery($terms, $entityType = 'page', $action = 'view') + protected function buildEntitySearchQuery(SearchOptions $searchOpts, string $entityType = 'page', string $action = 'view'): EloquentBuilder { $entity = $this->entityProvider->get($entityType); $entitySelect = $entity->newQuery(); // Handle normal search terms - if (count($terms['search']) > 0) { + if (count($searchOpts->searches) > 0) { $subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', \DB::raw('SUM(score) as score')); $subQuery->where('entity_type', '=', $entity->getMorphClass()); - $subQuery->where(function (Builder $query) use ($terms) { - foreach ($terms['search'] as $inputTerm) { + $subQuery->where(function (Builder $query) use ($searchOpts) { + foreach ($searchOpts->searches as $inputTerm) { $query->orWhere('term', 'like', $inputTerm .'%'); } })->groupBy('entity_type', 'entity_id'); @@ -193,9 +169,9 @@ class SearchService } // Handle exact term matching - if (count($terms['exact']) > 0) { - $entitySelect->where(function (EloquentBuilder $query) use ($terms, $entity) { - foreach ($terms['exact'] as $inputTerm) { + if (count($searchOpts->exacts) > 0) { + $entitySelect->where(function (EloquentBuilder $query) use ($searchOpts, $entity) { + foreach ($searchOpts->exacts as $inputTerm) { $query->where(function (EloquentBuilder $query) use ($inputTerm, $entity) { $query->where('name', 'like', '%'.$inputTerm .'%') ->orWhere($entity->textField, 'like', '%'.$inputTerm .'%'); @@ -205,12 +181,12 @@ class SearchService } // Handle tag searches - foreach ($terms['tags'] as $inputTerm) { + foreach ($searchOpts->tags as $inputTerm) { $this->applyTagSearch($entitySelect, $inputTerm); } // Handle filters - foreach ($terms['filters'] as $filterTerm => $filterValue) { + foreach ($searchOpts->filters as $filterTerm => $filterValue) { $functionName = Str::camel('filter_' . $filterTerm); if (method_exists($this, $functionName)) { $this->$functionName($entitySelect, $entity, $filterValue); @@ -220,60 +196,10 @@ class SearchService return $this->permissionService->enforceEntityRestrictions($entityType, $entitySelect, $action); } - - /** - * Parse a search string into components. - * @param $searchString - * @return array - */ - protected function parseSearchString($searchString) - { - $terms = [ - 'search' => [], - 'exact' => [], - 'tags' => [], - 'filters' => [] - ]; - - $patterns = [ - 'exact' => '/"(.*?)"/', - 'tags' => '/\[(.*?)\]/', - 'filters' => '/\{(.*?)\}/' - ]; - - // Parse special terms - foreach ($patterns as $termType => $pattern) { - $matches = []; - preg_match_all($pattern, $searchString, $matches); - if (count($matches) > 0) { - $terms[$termType] = $matches[1]; - $searchString = preg_replace($pattern, '', $searchString); - } - } - - // Parse standard terms - foreach (explode(' ', trim($searchString)) as $searchTerm) { - if ($searchTerm !== '') { - $terms['search'][] = $searchTerm; - } - } - - // Split filter values out - $splitFilters = []; - foreach ($terms['filters'] as $filter) { - $explodedFilter = explode(':', $filter, 2); - $splitFilters[$explodedFilter[0]] = (count($explodedFilter) > 1) ? $explodedFilter[1] : ''; - } - $terms['filters'] = $splitFilters; - - return $terms; - } - /** * Get the available query operators as a regex escaped list. - * @return mixed */ - protected function getRegexEscapedOperators() + protected function getRegexEscapedOperators(): string { $escapedOperators = []; foreach ($this->queryOperators as $operator) { @@ -284,11 +210,8 @@ class SearchService /** * Apply a tag search term onto a entity query. - * @param EloquentBuilder $query - * @param string $tagTerm - * @return mixed */ - protected function applyTagSearch(EloquentBuilder $query, $tagTerm) + protected function applyTagSearch(EloquentBuilder $query, string $tagTerm): EloquentBuilder { preg_match("/^(.*?)((".$this->getRegexEscapedOperators().")(.*?))?$/", $tagTerm, $tagSplit); $query->whereHas('tags', function (EloquentBuilder $query) use ($tagSplit) { @@ -318,7 +241,6 @@ class SearchService /** * Index the given entity. - * @param Entity $entity */ public function indexEntity(Entity $entity) { diff --git a/app/Entities/SlugGenerator.php b/app/Entities/SlugGenerator.php index 459a5264a..e8bc556ab 100644 --- a/app/Entities/SlugGenerator.php +++ b/app/Entities/SlugGenerator.php @@ -1,5 +1,7 @@ [ 'name' => 'required|string|max:255', 'description' => 'string|max:1000', + 'tags' => 'array', ], 'update' => [ 'name' => 'string|min:1|max:255', 'description' => 'string|max:1000', + 'tags' => 'array', ], ]; diff --git a/app/Http/Controllers/Api/BooksExportApiController.php b/app/Http/Controllers/Api/BookExportApiController.php similarity index 96% rename from app/Http/Controllers/Api/BooksExportApiController.php rename to app/Http/Controllers/Api/BookExportApiController.php index 605f8f408..31fe5250f 100644 --- a/app/Http/Controllers/Api/BooksExportApiController.php +++ b/app/Http/Controllers/Api/BookExportApiController.php @@ -5,9 +5,8 @@ use BookStack\Entities\ExportService; use BookStack\Entities\Repos\BookRepo; use Throwable; -class BooksExportApiController extends ApiController +class BookExportApiController extends ApiController { - protected $bookRepo; protected $exportService; diff --git a/app/Http/Controllers/Api/ChapterApiController.php b/app/Http/Controllers/Api/ChapterApiController.php new file mode 100644 index 000000000..50aa8834e --- /dev/null +++ b/app/Http/Controllers/Api/ChapterApiController.php @@ -0,0 +1,104 @@ + [ + 'book_id' => 'required|integer', + 'name' => 'required|string|max:255', + 'description' => 'string|max:1000', + 'tags' => 'array', + ], + 'update' => [ + 'book_id' => 'integer', + 'name' => 'string|min:1|max:255', + 'description' => 'string|max:1000', + 'tags' => 'array', + ], + ]; + + /** + * ChapterController constructor. + */ + public function __construct(ChapterRepo $chapterRepo) + { + $this->chapterRepo = $chapterRepo; + } + + /** + * Get a listing of chapters visible to the user. + */ + public function list() + { + $chapters = Chapter::visible(); + return $this->apiListingResponse($chapters, [ + 'id', 'book_id', 'name', 'slug', 'description', 'priority', + 'created_at', 'updated_at', 'created_by', 'updated_by', + ]); + } + + /** + * Create a new chapter in the system. + */ + public function create(Request $request) + { + $this->validate($request, $this->rules['create']); + + $bookId = $request->get('book_id'); + $book = Book::visible()->findOrFail($bookId); + $this->checkOwnablePermission('chapter-create', $book); + + $chapter = $this->chapterRepo->create($request->all(), $book); + Activity::add($chapter, 'chapter_create', $book->id); + + return response()->json($chapter->load(['tags'])); + } + + /** + * View the details of a single chapter. + */ + public function read(string $id) + { + $chapter = Chapter::visible()->with(['tags', 'createdBy', 'updatedBy', 'pages' => function (HasMany $query) { + $query->visible()->get(['id', 'name', 'slug']); + }])->findOrFail($id); + return response()->json($chapter); + } + + /** + * Update the details of a single chapter. + */ + public function update(Request $request, string $id) + { + $chapter = Chapter::visible()->findOrFail($id); + $this->checkOwnablePermission('chapter-update', $chapter); + + $updatedChapter = $this->chapterRepo->update($chapter, $request->all()); + Activity::add($chapter, 'chapter_update', $chapter->book->id); + + return response()->json($updatedChapter->load(['tags'])); + } + + /** + * Delete a chapter from the system. + */ + public function delete(string $id) + { + $chapter = Chapter::visible()->findOrFail($id); + $this->checkOwnablePermission('chapter-delete', $chapter); + + $this->chapterRepo->destroy($chapter); + Activity::addMessage('chapter_delete', $chapter->name, $chapter->book->id); + + return response('', 204); + } +} diff --git a/app/Http/Controllers/Api/ChapterExportApiController.php b/app/Http/Controllers/Api/ChapterExportApiController.php new file mode 100644 index 000000000..f19f29e9d --- /dev/null +++ b/app/Http/Controllers/Api/ChapterExportApiController.php @@ -0,0 +1,54 @@ +chapterRepo = $chapterRepo; + $this->exportService = $exportService; + parent::__construct(); + } + + /** + * Export a chapter as a PDF file. + * @throws Throwable + */ + public function exportPdf(int $id) + { + $chapter = Chapter::visible()->findOrFail($id); + $pdfContent = $this->exportService->chapterToPdf($chapter); + return $this->downloadResponse($pdfContent, $chapter->slug . '.pdf'); + } + + /** + * Export a chapter as a contained HTML file. + * @throws Throwable + */ + public function exportHtml(int $id) + { + $chapter = Chapter::visible()->findOrFail($id); + $htmlContent = $this->exportService->chapterToContainedHtml($chapter); + return $this->downloadResponse($htmlContent, $chapter->slug . '.html'); + } + + /** + * Export a chapter as a plain text file. + */ + public function exportPlainText(int $id) + { + $chapter = Chapter::visible()->findOrFail($id); + $textContent = $this->exportService->chapterToPlainText($chapter); + return $this->downloadResponse($textContent, $chapter->slug . '.txt'); + } +} diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 8f5da49ed..0830693bc 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -8,6 +8,7 @@ use BookStack\Uploads\AttachmentService; use Exception; use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Http\Request; +use Illuminate\Support\MessageBag; use Illuminate\Validation\ValidationException; class AttachmentController extends Controller @@ -60,25 +61,17 @@ class AttachmentController extends Controller /** * Update an uploaded attachment. * @throws ValidationException - * @throws NotFoundException */ public function uploadUpdate(Request $request, $attachmentId) { $this->validate($request, [ - 'uploaded_to' => 'required|integer|exists:pages,id', 'file' => 'required|file' ]); - $pageId = $request->get('uploaded_to'); - $page = $this->pageRepo->getById($pageId); - $attachment = $this->attachment->findOrFail($attachmentId); - - $this->checkOwnablePermission('page-update', $page); + $attachment = $this->attachment->newQuery()->findOrFail($attachmentId); + $this->checkOwnablePermission('view', $attachment->page); + $this->checkOwnablePermission('page-update', $attachment->page); $this->checkOwnablePermission('attachment-create', $attachment); - - if (intval($pageId) !== intval($attachment->uploaded_to)) { - return $this->jsonError(trans('errors.attachment_page_mismatch')); - } $uploadedFile = $request->file('file'); @@ -92,57 +85,87 @@ class AttachmentController extends Controller } /** - * Update the details of an existing file. - * @throws ValidationException - * @throws NotFoundException + * Get the update form for an attachment. + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function update(Request $request, $attachmentId) + public function getUpdateForm(string $attachmentId) { - $this->validate($request, [ - 'uploaded_to' => 'required|integer|exists:pages,id', - 'name' => 'required|string|min:1|max:255', - 'link' => 'string|min:1|max:255' - ]); - - $pageId = $request->get('uploaded_to'); - $page = $this->pageRepo->getById($pageId); $attachment = $this->attachment->findOrFail($attachmentId); - $this->checkOwnablePermission('page-update', $page); + $this->checkOwnablePermission('page-update', $attachment->page); $this->checkOwnablePermission('attachment-create', $attachment); - if (intval($pageId) !== intval($attachment->uploaded_to)) { - return $this->jsonError(trans('errors.attachment_page_mismatch')); + return view('attachments.manager-edit-form', [ + 'attachment' => $attachment, + ]); + } + + /** + * Update the details of an existing file. + */ + public function update(Request $request, string $attachmentId) + { + $attachment = $this->attachment->newQuery()->findOrFail($attachmentId); + + try { + $this->validate($request, [ + 'attachment_edit_name' => 'required|string|min:1|max:255', + 'attachment_edit_url' => 'string|min:1|max:255' + ]); + } catch (ValidationException $exception) { + return response()->view('attachments.manager-edit-form', array_merge($request->only(['attachment_edit_name', 'attachment_edit_url']), [ + 'attachment' => $attachment, + 'errors' => new MessageBag($exception->errors()), + ]), 422); } - $attachment = $this->attachmentService->updateFile($attachment, $request->all()); - return response()->json($attachment); + $this->checkOwnablePermission('view', $attachment->page); + $this->checkOwnablePermission('page-update', $attachment->page); + $this->checkOwnablePermission('attachment-create', $attachment); + + $attachment = $this->attachmentService->updateFile($attachment, [ + 'name' => $request->get('attachment_edit_name'), + 'link' => $request->get('attachment_edit_url'), + ]); + + return view('attachments.manager-edit-form', [ + 'attachment' => $attachment, + ]); } /** * Attach a link to a page. - * @throws ValidationException * @throws NotFoundException */ public function attachLink(Request $request) { - $this->validate($request, [ - 'uploaded_to' => 'required|integer|exists:pages,id', - 'name' => 'required|string|min:1|max:255', - 'link' => 'required|string|min:1|max:255' - ]); + $pageId = $request->get('attachment_link_uploaded_to'); + + try { + $this->validate($request, [ + 'attachment_link_uploaded_to' => 'required|integer|exists:pages,id', + 'attachment_link_name' => 'required|string|min:1|max:255', + 'attachment_link_url' => 'required|string|min:1|max:255' + ]); + } catch (ValidationException $exception) { + return response()->view('attachments.manager-link-form', array_merge($request->only(['attachment_link_name', 'attachment_link_url']), [ + 'pageId' => $pageId, + 'errors' => new MessageBag($exception->errors()), + ]), 422); + } - $pageId = $request->get('uploaded_to'); $page = $this->pageRepo->getById($pageId); $this->checkPermission('attachment-create-all'); $this->checkOwnablePermission('page-update', $page); - $attachmentName = $request->get('name'); - $link = $request->get('link'); + $attachmentName = $request->get('attachment_link_name'); + $link = $request->get('attachment_link_url'); $attachment = $this->attachmentService->saveNewFromLink($attachmentName, $link, $pageId); - return response()->json($attachment); + return view('attachments.manager-link-form', [ + 'pageId' => $pageId, + ]); } /** @@ -152,7 +175,9 @@ class AttachmentController extends Controller { $page = $this->pageRepo->getById($pageId); $this->checkOwnablePermission('page-view', $page); - return response()->json($page->attachments); + return view('attachments.manager-list', [ + 'attachments' => $page->attachments->all(), + ]); } /** @@ -163,14 +188,13 @@ class AttachmentController extends Controller public function sortForPage(Request $request, int $pageId) { $this->validate($request, [ - 'files' => 'required|array', - 'files.*.id' => 'required|integer', + 'order' => 'required|array', ]); $page = $this->pageRepo->getById($pageId); $this->checkOwnablePermission('page-update', $page); - $attachments = $request->get('files'); - $this->attachmentService->updateFileOrderWithinPage($attachments, $pageId); + $attachmentOrder = $request->get('order'); + $this->attachmentService->updateFileOrderWithinPage($attachmentOrder, $pageId); return response()->json(['message' => trans('entities.attachments_order_updated')]); } @@ -179,7 +203,7 @@ class AttachmentController extends Controller * @throws FileNotFoundException * @throws NotFoundException */ - public function get(int $attachmentId) + public function get(string $attachmentId) { $attachment = $this->attachment->findOrFail($attachmentId); try { @@ -200,11 +224,9 @@ class AttachmentController extends Controller /** * Delete a specific attachment in the system. - * @param $attachmentId - * @return mixed * @throws Exception */ - public function delete(int $attachmentId) + public function delete(string $attachmentId) { $attachment = $this->attachment->findOrFail($attachmentId); $this->checkOwnablePermission('attachment-delete', $attachment); diff --git a/app/Http/Controllers/AuditLogController.php b/app/Http/Controllers/AuditLogController.php new file mode 100644 index 000000000..a3ef01baa --- /dev/null +++ b/app/Http/Controllers/AuditLogController.php @@ -0,0 +1,51 @@ +checkPermission('settings-manage'); + $this->checkPermission('users-manage'); + + $listDetails = [ + 'order' => $request->get('order', 'desc'), + 'event' => $request->get('event', ''), + 'sort' => $request->get('sort', 'created_at'), + 'date_from' => $request->get('date_from', ''), + 'date_to' => $request->get('date_to', ''), + ]; + + $query = Activity::query() + ->with(['entity', 'user']) + ->orderBy($listDetails['sort'], $listDetails['order']); + + if ($listDetails['event']) { + $query->where('key', '=', $listDetails['event']); + } + + if ($listDetails['date_from']) { + $query->where('created_at', '>=', $listDetails['date_from']); + } + if ($listDetails['date_to']) { + $query->where('created_at', '<=', $listDetails['date_to']); + } + + $activities = $query->paginate(100); + $activities->appends($listDetails); + + $keys = DB::table('activities')->select('key')->distinct()->pluck('key'); + $this->setPageTitle(trans('settings.audit')); + return view('settings.audit', [ + 'activities' => $activities, + 'listDetails' => $listDetails, + 'activityKeys' => $keys, + ]); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index fb2573b5c..8084ce1a5 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -2,6 +2,7 @@ namespace BookStack\Http\Controllers\Auth; +use Activity; use BookStack\Auth\Access\SocialAuthService; use BookStack\Exceptions\LoginAttemptEmailNeededException; use BookStack\Exceptions\LoginAttemptException; @@ -76,9 +77,13 @@ class LoginController extends Controller ]); } + // Store the previous location for redirect after login $previous = url()->previous(''); - if (setting('app-public') && $previous && $previous !== url('/login')) { - redirect()->setIntendedUrl($previous); + if ($previous && $previous !== url('/login') && setting('app-public')) { + $isPreviousFromInstance = (strpos($previous, url('/')) === 0); + if ($isPreviousFromInstance) { + redirect()->setIntendedUrl($previous); + } } return view('auth.login', [ @@ -98,6 +103,7 @@ class LoginController extends Controller public function login(Request $request) { $this->validateLogin($request); + $username = $request->get($this->username()); // If the class is using the ThrottlesLogins trait, we can automatically throttle // the login attempts for this application. We'll key this by the username and @@ -106,6 +112,7 @@ class LoginController extends Controller $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); + Activity::logFailedLogin($username); return $this->sendLockoutResponse($request); } @@ -114,6 +121,7 @@ class LoginController extends Controller return $this->sendLoginResponse($request); } } catch (LoginAttemptException $exception) { + Activity::logFailedLogin($username); return $this->sendLoginAttemptExceptionResponse($exception, $request); } @@ -122,6 +130,7 @@ class LoginController extends Controller // user surpasses their maximum number of attempts they will get locked out. $this->incrementLoginAttempts($request); + Activity::logFailedLogin($username); return $this->sendFailedLoginResponse($request); } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 2e8e8ed2e..6a1dfcb01 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Http\Exceptions\HttpResponseException; use Illuminate\Http\Request; use Illuminate\Routing\Controller as BaseController; +use Illuminate\Validation\ValidationException; abstract class Controller extends BaseController { @@ -132,23 +133,6 @@ abstract class Controller extends BaseController return response()->json(['message' => $messageText, 'status' => 'error'], $statusCode); } - /** - * Create the response for when a request fails validation. - * @param \Illuminate\Http\Request $request - * @param array $errors - * @return \Symfony\Component\HttpFoundation\Response - */ - protected function buildFailedValidationResponse(Request $request, array $errors) - { - if ($request->expectsJson()) { - return response()->json(['validation' => $errors], 422); - } - - return redirect()->to($this->getRedirectUrl()) - ->withInput($request->input()) - ->withErrors($errors, $this->errorBag()); - } - /** * Create a response that forces a download in the browser. * @param string $content diff --git a/app/Http/Controllers/Images/DrawioImageController.php b/app/Http/Controllers/Images/DrawioImageController.php index 106dfd630..29b1e9027 100644 --- a/app/Http/Controllers/Images/DrawioImageController.php +++ b/app/Http/Controllers/Images/DrawioImageController.php @@ -30,7 +30,10 @@ class DrawioImageController extends Controller $parentTypeFilter = $request->get('filter_type', null); $imgData = $this->imageRepo->getEntityFiltered('drawio', $parentTypeFilter, $page, 24, $uploadedToFilter, $searchTerm); - return response()->json($imgData); + return view('components.image-manager-list', [ + 'images' => $imgData['images'], + 'hasMore' => $imgData['has_more'], + ]); } /** @@ -72,6 +75,7 @@ class DrawioImageController extends Controller if ($imageData === null) { return $this->jsonError("Image data could not be found"); } + return response()->json([ 'content' => base64_encode($imageData) ]); diff --git a/app/Http/Controllers/Images/GalleryImageController.php b/app/Http/Controllers/Images/GalleryImageController.php index e506215ca..61907c003 100644 --- a/app/Http/Controllers/Images/GalleryImageController.php +++ b/app/Http/Controllers/Images/GalleryImageController.php @@ -6,6 +6,7 @@ use BookStack\Exceptions\ImageUploadException; use BookStack\Uploads\ImageRepo; use Illuminate\Http\Request; use BookStack\Http\Controllers\Controller; +use Illuminate\Validation\ValidationException; class GalleryImageController extends Controller { @@ -13,7 +14,6 @@ class GalleryImageController extends Controller /** * GalleryImageController constructor. - * @param ImageRepo $imageRepo */ public function __construct(ImageRepo $imageRepo) { @@ -24,8 +24,6 @@ class GalleryImageController extends Controller /** * Get a list of gallery images, in a list. * Can be paged and filtered by entity. - * @param Request $request - * @return \Illuminate\Http\JsonResponse */ public function list(Request $request) { @@ -35,14 +33,15 @@ class GalleryImageController extends Controller $parentTypeFilter = $request->get('filter_type', null); $imgData = $this->imageRepo->getEntityFiltered('gallery', $parentTypeFilter, $page, 24, $uploadedToFilter, $searchTerm); - return response()->json($imgData); + return view('components.image-manager-list', [ + 'images' => $imgData['images'], + 'hasMore' => $imgData['has_more'], + ]); } /** * Store a new gallery image in the system. - * @param Request $request - * @return Illuminate\Http\JsonResponse - * @throws \Exception + * @throws ValidationException */ public function create(Request $request) { diff --git a/app/Http/Controllers/Images/ImageController.php b/app/Http/Controllers/Images/ImageController.php index 9c67704dd..7d06facff 100644 --- a/app/Http/Controllers/Images/ImageController.php +++ b/app/Http/Controllers/Images/ImageController.php @@ -6,8 +6,11 @@ use BookStack\Http\Controllers\Controller; use BookStack\Repos\PageRepo; use BookStack\Uploads\Image; use BookStack\Uploads\ImageRepo; +use Exception; use Illuminate\Filesystem\Filesystem as File; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Validation\ValidationException; class ImageController extends Controller { @@ -17,9 +20,6 @@ class ImageController extends Controller /** * ImageController constructor. - * @param Image $image - * @param File $file - * @param ImageRepo $imageRepo */ public function __construct(Image $image, File $file, ImageRepo $imageRepo) { @@ -31,8 +31,6 @@ class ImageController extends Controller /** * Provide an image file from storage. - * @param string $path - * @return mixed */ public function showImage(string $path) { @@ -47,13 +45,10 @@ class ImageController extends Controller /** * Update image details - * @param Request $request - * @param integer $id - * @return \Illuminate\Http\JsonResponse * @throws ImageUploadException - * @throws \Exception + * @throws ValidationException */ - public function update(Request $request, $id) + public function update(Request $request, string $id) { $this->validate($request, [ 'name' => 'required|min:2|string' @@ -64,47 +59,50 @@ class ImageController extends Controller $this->checkOwnablePermission('image-update', $image); $image = $this->imageRepo->updateImageDetails($image, $request->all()); - return response()->json($image); + + $this->imageRepo->loadThumbs($image); + return view('components.image-manager-form', [ + 'image' => $image, + 'dependantPages' => null, + ]); } /** - * Show the usage of an image on pages. + * Get the form for editing the given image. + * @throws Exception */ - public function usage(int $id) + public function edit(Request $request, string $id) { $image = $this->imageRepo->getById($id); $this->checkImagePermission($image); - $pages = Page::visible()->where('html', 'like', '%' . $image->url . '%')->get(['id', 'name', 'slug', 'book_id']); - foreach ($pages as $page) { - $page->url = $page->getUrl(); - $page->html = ''; - $page->text = ''; + if ($request->has('delete')) { + $dependantPages = $this->imageRepo->getPagesUsingImage($image); } - $result = count($pages) > 0 ? $pages : false; - return response()->json($result); + $this->imageRepo->loadThumbs($image); + return view('components.image-manager-form', [ + 'image' => $image, + 'dependantPages' => $dependantPages ?? null, + ]); } /** * Deletes an image and all thumbnail/image files - * @param int $id - * @return \Illuminate\Http\JsonResponse - * @throws \Exception + * @throws Exception */ - public function destroy($id) + public function destroy(string $id) { $image = $this->imageRepo->getById($id); $this->checkOwnablePermission('image-delete', $image); $this->checkImagePermission($image); $this->imageRepo->destroyImage($image); - return response()->json(trans('components.images_deleted')); + return response(''); } /** * Check related page permission and ensure type is drawio or gallery. - * @param Image $image */ protected function checkImagePermission(Image $image) { diff --git a/app/Http/Controllers/MaintenanceController.php b/app/Http/Controllers/MaintenanceController.php new file mode 100644 index 000000000..664a896b2 --- /dev/null +++ b/app/Http/Controllers/MaintenanceController.php @@ -0,0 +1,68 @@ +checkPermission('settings-manage'); + $this->setPageTitle(trans('settings.maint')); + + // Get application version + $version = trim(file_get_contents(base_path('version'))); + + return view('settings.maintenance', ['version' => $version]); + } + + /** + * Action to clean-up images in the system. + */ + public function cleanupImages(Request $request, ImageService $imageService) + { + $this->checkPermission('settings-manage'); + + $checkRevisions = !($request->get('ignore_revisions', 'false') === 'true'); + $dryRun = !($request->has('confirm')); + + $imagesToDelete = $imageService->deleteUnusedImages($checkRevisions, $dryRun); + $deleteCount = count($imagesToDelete); + if ($deleteCount === 0) { + $this->showWarningNotification(trans('settings.maint_image_cleanup_nothing_found')); + return redirect('/settings/maintenance')->withInput(); + } + + if ($dryRun) { + session()->flash('cleanup-images-warning', trans('settings.maint_image_cleanup_warning', ['count' => $deleteCount])); + } else { + $this->showSuccessNotification(trans('settings.maint_image_cleanup_success', ['count' => $deleteCount])); + } + + return redirect('/settings/maintenance#image-cleanup')->withInput(); + } + + /** + * Action to send a test e-mail to the current user. + */ + public function sendTestEmail() + { + $this->checkPermission('settings-manage'); + + try { + user()->notify(new TestEmail()); + $this->showSuccessNotification(trans('settings.maint_send_test_email_success', ['address' => user()->email])); + } catch (\Exception $exception) { + $errorMessage = trans('errors.maintenance_test_email_failure') . "\n" . $exception->getMessage(); + $this->showErrorNotification($errorMessage); + } + + return redirect('/settings/maintenance#image-cleanup')->withInput(); + } +} diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index b216c19a8..57d70fb32 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -163,6 +163,8 @@ class PageController extends Controller public function getPageAjax(int $pageId) { $page = $this->pageRepo->getById($pageId); + $page->setHidden(array_diff($page->getHidden(), ['html', 'markdown'])); + $page->addHidden(['book']); return response()->json($page); } diff --git a/app/Http/Controllers/PageRevisionController.php b/app/Http/Controllers/PageRevisionController.php index 3c65b50ac..797f5db8f 100644 --- a/app/Http/Controllers/PageRevisionController.php +++ b/app/Http/Controllers/PageRevisionController.php @@ -1,5 +1,6 @@ fill($revision->toArray()); + // TODO - Refactor PageContent so we don't need to juggle this + $page->html = $revision->html; + $page->html = (new PageContent($page))->render(); $this->setPageTitle(trans('entities.pages_revision_named', ['pageName' => $page->getShortName()])); return view('pages.revision', [ @@ -73,6 +77,9 @@ class PageRevisionController extends Controller $diff = (new Htmldiff)->diff($prevContent, $revision->html); $page->fill($revision->toArray()); + // TODO - Refactor PageContent so we don't need to juggle this + $page->html = $revision->html; + $page->html = (new PageContent($page))->render(); $this->setPageTitle(trans('entities.pages_revision_named', ['pageName'=>$page->getShortName()])); return view('pages.revision', [ diff --git a/app/Http/Controllers/PermissionController.php b/app/Http/Controllers/PermissionController.php index 148ae5cd6..1200d44ab 100644 --- a/app/Http/Controllers/PermissionController.php +++ b/app/Http/Controllers/PermissionController.php @@ -2,7 +2,9 @@ use BookStack\Auth\Permissions\PermissionsRepo; use BookStack\Exceptions\PermissionsException; +use Exception; use Illuminate\Http\Request; +use Illuminate\Validation\ValidationException; class PermissionController extends Controller { @@ -11,7 +13,6 @@ class PermissionController extends Controller /** * PermissionController constructor. - * @param \BookStack\Auth\Permissions\PermissionsRepo $permissionsRepo */ public function __construct(PermissionsRepo $permissionsRepo) { @@ -31,7 +32,6 @@ class PermissionController extends Controller /** * Show the form to create a new role - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function createRole() { @@ -41,15 +41,13 @@ class PermissionController extends Controller /** * Store a new role in the system. - * @param Request $request - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function storeRole(Request $request) { $this->checkPermission('user-roles-manage'); $this->validate($request, [ - 'display_name' => 'required|min:3|max:200', - 'description' => 'max:250' + 'display_name' => 'required|min:3|max:180', + 'description' => 'max:180' ]); $this->permissionsRepo->saveNewRole($request->all()); @@ -59,11 +57,9 @@ class PermissionController extends Controller /** * Show the form for editing a user role. - * @param $id - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws PermissionsException */ - public function editRole($id) + public function editRole(string $id) { $this->checkPermission('user-roles-manage'); $role = $this->permissionsRepo->getRoleById($id); @@ -75,18 +71,14 @@ class PermissionController extends Controller /** * Updates a user role. - * @param Request $request - * @param $id - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @throws PermissionsException - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ - public function updateRole(Request $request, $id) + public function updateRole(Request $request, string $id) { $this->checkPermission('user-roles-manage'); $this->validate($request, [ - 'display_name' => 'required|min:3|max:200', - 'description' => 'max:250' + 'display_name' => 'required|min:3|max:180', + 'description' => 'max:180' ]); $this->permissionsRepo->updateRole($id, $request->all()); @@ -97,10 +89,8 @@ class PermissionController extends Controller /** * Show the view to delete a role. * Offers the chance to migrate users. - * @param $id - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function showDeleteRole($id) + public function showDeleteRole(string $id) { $this->checkPermission('user-roles-manage'); $role = $this->permissionsRepo->getRoleById($id); @@ -113,11 +103,9 @@ class PermissionController extends Controller /** * Delete a role from the system, * Migrate from a previous role if set. - * @param Request $request - * @param $id - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws Exception */ - public function deleteRole(Request $request, $id) + public function deleteRole(Request $request, string $id) { $this->checkPermission('user-roles-manage'); diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index a5d57741d..8105843b5 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -6,6 +6,7 @@ use BookStack\Entities\Bookshelf; use BookStack\Entities\Entity; use BookStack\Entities\Managers\EntityContext; use BookStack\Entities\SearchService; +use BookStack\Entities\SearchOptions; use Illuminate\Http\Request; class SearchController extends Controller @@ -33,20 +34,22 @@ class SearchController extends Controller */ public function search(Request $request) { - $searchTerm = $request->get('term'); - $this->setPageTitle(trans('entities.search_for_term', ['term' => $searchTerm])); + $searchOpts = SearchOptions::fromRequest($request); + $fullSearchString = $searchOpts->toString(); + $this->setPageTitle(trans('entities.search_for_term', ['term' => $fullSearchString])); $page = intval($request->get('page', '0')) ?: 1; - $nextPageLink = url('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1)); + $nextPageLink = url('/search?term=' . urlencode($fullSearchString) . '&page=' . ($page+1)); - $results = $this->searchService->searchEntities($searchTerm, 'all', $page, 20); + $results = $this->searchService->searchEntities($searchOpts, 'all', $page, 20); return view('search.all', [ 'entities' => $results['results'], 'totalResults' => $results['total'], - 'searchTerm' => $searchTerm, + 'searchTerm' => $fullSearchString, 'hasNextPage' => $results['has_more'], - 'nextPageLink' => $nextPageLink + 'nextPageLink' => $nextPageLink, + 'options' => $searchOpts, ]); } @@ -84,7 +87,7 @@ class SearchController extends Controller // Search for entities otherwise show most popular if ($searchTerm !== false) { $searchTerm .= ' {type:'. implode('|', $entityTypes) .'}'; - $entities = $this->searchService->searchEntities($searchTerm, 'all', 1, 20, $permission)['results']; + $entities = $this->searchService->searchEntities(SearchOptions::fromString($searchTerm), 'all', 1, 20, $permission)['results']; } else { $entities = $this->viewService->getPopular(20, 0, $entityTypes, $permission); } diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index feb6521f3..50d91d388 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -1,9 +1,7 @@ get('section', ''); return redirect(rtrim($redirectLocation, '#')); } - - /** - * Show the page for application maintenance. - */ - public function showMaintenance() - { - $this->checkPermission('settings-manage'); - $this->setPageTitle(trans('settings.maint')); - - // Get application version - $version = trim(file_get_contents(base_path('version'))); - - return view('settings.maintenance', ['version' => $version]); - } - - /** - * Action to clean-up images in the system. - */ - public function cleanupImages(Request $request, ImageService $imageService) - { - $this->checkPermission('settings-manage'); - - $checkRevisions = !($request->get('ignore_revisions', 'false') === 'true'); - $dryRun = !($request->has('confirm')); - - $imagesToDelete = $imageService->deleteUnusedImages($checkRevisions, $dryRun); - $deleteCount = count($imagesToDelete); - if ($deleteCount === 0) { - $this->showWarningNotification(trans('settings.maint_image_cleanup_nothing_found')); - return redirect('/settings/maintenance')->withInput(); - } - - if ($dryRun) { - session()->flash('cleanup-images-warning', trans('settings.maint_image_cleanup_warning', ['count' => $deleteCount])); - } else { - $this->showSuccessNotification(trans('settings.maint_image_cleanup_success', ['count' => $deleteCount])); - } - - return redirect('/settings/maintenance#image-cleanup')->withInput(); - } - - /** - * Action to send a test e-mail to the current user. - */ - public function sendTestEmail() - { - $this->checkPermission('settings-manage'); - - try { - user()->notify(new TestEmail()); - $this->showSuccessNotification(trans('settings.maint_send_test_email_success', ['address' => user()->email])); - } catch (\Exception $exception) { - $errorMessage = trans('errors.maintenance_test_email_failure') . "\n" . $exception->getMessage(); - $this->showErrorNotification($errorMessage); - } - - - return redirect('/settings/maintenance#image-cleanup')->withInput(); - } } diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 6abbeeeba..8c6d6748f 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -10,7 +10,6 @@ class TagController extends Controller /** * TagController constructor. - * @param $tagRepo */ public function __construct(TagRepo $tagRepo) { @@ -18,39 +17,23 @@ class TagController extends Controller parent::__construct(); } - /** - * Get all the Tags for a particular entity - * @param $entityType - * @param $entityId - * @return \Illuminate\Http\JsonResponse - */ - public function getForEntity($entityType, $entityId) - { - $tags = $this->tagRepo->getForEntity($entityType, $entityId); - return response()->json($tags); - } - /** * Get tag name suggestions from a given search term. - * @param Request $request - * @return \Illuminate\Http\JsonResponse */ public function getNameSuggestions(Request $request) { - $searchTerm = $request->get('search', false); + $searchTerm = $request->get('search', null); $suggestions = $this->tagRepo->getNameSuggestions($searchTerm); return response()->json($suggestions); } /** * Get tag value suggestions from a given search term. - * @param Request $request - * @return \Illuminate\Http\JsonResponse */ public function getValueSuggestions(Request $request) { - $searchTerm = $request->get('search', false); - $tagName = $request->get('name', false); + $searchTerm = $request->get('search', null); + $tagName = $request->get('name', null); $suggestions = $this->tagRepo->getValueSuggestions($searchTerm, $tagName); return response()->json($suggestions); } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 97ec31dcc..651dedc0d 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -66,8 +66,8 @@ class UserController extends Controller { $this->checkPermission('users-manage'); $validationRules = [ - 'name' => 'required', - 'email' => 'required|email|unique:users,email' + 'name' => 'required', + 'email' => 'required|email|unique:users,email' ]; $authMethod = config('auth.method'); diff --git a/app/Http/Middleware/ApiAuthenticate.php b/app/Http/Middleware/ApiAuthenticate.php index 15962b3b0..728057bed 100644 --- a/app/Http/Middleware/ApiAuthenticate.php +++ b/app/Http/Middleware/ApiAuthenticate.php @@ -35,9 +35,9 @@ class ApiAuthenticate { // Return if the user is already found to be signed in via session-based auth. // This is to make it easy to browser the API via browser after just logging into the system. - if (signedInUser()) { + if (signedInUser() || session()->isStarted()) { $this->ensureEmailConfirmedIfRequested(); - if (!auth()->user()->can('access-api')) { + if (!user()->can('access-api')) { throw new ApiAuthException(trans('errors.api_user_no_api_permission'), 403); } return; diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 9a8affa88..df8c44d35 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -44,6 +44,10 @@ class Authenticate ], 401); } + if (session()->get('sent-email-confirmation') === true) { + return redirect('/register/confirm'); + } + return redirect('/register/confirm/awaiting'); } } diff --git a/app/Http/Middleware/Localization.php b/app/Http/Middleware/Localization.php index d24e8a9b5..c0ac7a7c4 100644 --- a/app/Http/Middleware/Localization.php +++ b/app/Http/Middleware/Localization.php @@ -19,6 +19,7 @@ class Localization */ protected $localeMap = [ 'ar' => 'ar', + 'bg' => 'bg_BG', 'da' => 'da_DK', 'de' => 'de_DE', 'de_informal' => 'de_DE', diff --git a/app/Uploads/Attachment.php b/app/Uploads/Attachment.php index 3f0b447df..66c032be5 100644 --- a/app/Uploads/Attachment.php +++ b/app/Uploads/Attachment.php @@ -3,6 +3,13 @@ use BookStack\Entities\Page; use BookStack\Ownable; +/** + * @property int id + * @property string name + * @property string path + * @property string extension + * @property bool external + */ class Attachment extends Ownable { protected $fillable = ['name', 'order']; @@ -30,13 +37,28 @@ class Attachment extends Ownable /** * Get the url of this file. - * @return string */ - public function getUrl() + public function getUrl(): string { if ($this->external && strpos($this->path, 'http') !== 0) { return $this->path; } return url('/attachments/' . $this->id); } + + /** + * Generate a HTML link to this attachment. + */ + public function htmlLink(): string + { + return ''.e($this->name).''; + } + + /** + * Generate a markdown link to this attachment. + */ + public function markdownLink(): string + { + return '['. $this->name .']('. $this->getUrl() .')'; + } } diff --git a/app/Uploads/AttachmentService.php b/app/Uploads/AttachmentService.php index ae4fb6e96..02220771a 100644 --- a/app/Uploads/AttachmentService.php +++ b/app/Uploads/AttachmentService.php @@ -109,14 +109,14 @@ class AttachmentService extends UploadService } /** - * Updates the file ordering for a listing of attached files. - * @param array $attachmentList - * @param $pageId + * Updates the ordering for a listing of attached files. */ - public function updateFileOrderWithinPage($attachmentList, $pageId) + public function updateFileOrderWithinPage(array $attachmentOrder, string $pageId) { - foreach ($attachmentList as $index => $attachment) { - Attachment::where('uploaded_to', '=', $pageId)->where('id', '=', $attachment['id'])->update(['order' => $index]); + foreach ($attachmentOrder as $index => $attachmentId) { + Attachment::query()->where('uploaded_to', '=', $pageId) + ->where('id', '=', $attachmentId) + ->update(['order' => $index]); } } diff --git a/app/Uploads/ImageRepo.php b/app/Uploads/ImageRepo.php index b7a21809f..a08555085 100644 --- a/app/Uploads/ImageRepo.php +++ b/app/Uploads/ImageRepo.php @@ -185,7 +185,7 @@ class ImageRepo * Load thumbnails onto an image object. * @throws Exception */ - protected function loadThumbs(Image $image) + public function loadThumbs(Image $image) { $image->thumbs = [ 'gallery' => $this->getThumbnail($image, 150, 150, false), @@ -219,4 +219,20 @@ class ImageRepo return null; } } + + /** + * Get the user visible pages using the given image. + */ + public function getPagesUsingImage(Image $image): array + { + $pages = Page::visible() + ->where('html', 'like', '%' . $image->url . '%') + ->get(['id', 'name', 'slug', 'book_id']); + + foreach ($pages as $page) { + $page->url = $page->getUrl(); + } + + return $pages->all(); + } } diff --git a/app/Uploads/ImageService.php b/app/Uploads/ImageService.php index 756149fe7..89744386d 100644 --- a/app/Uploads/ImageService.php +++ b/app/Uploads/ImageService.php @@ -124,29 +124,24 @@ class ImageService extends UploadService } /** - * Saves a new image - * @param string $imageName - * @param string $imageData - * @param string $type - * @param int $uploadedTo - * @return Image + * Save a new image into storage. * @throws ImageUploadException */ - private function saveNew($imageName, $imageData, $type, $uploadedTo = 0) + private function saveNew(string $imageName, string $imageData, string $type, int $uploadedTo = 0): Image { $storage = $this->getStorage($type); $secureUploads = setting('app-secure-images'); - $imageName = str_replace(' ', '-', $imageName); + $fileName = $this->cleanImageFileName($imageName); $imagePath = '/uploads/images/' . $type . '/' . Date('Y-m') . '/'; - while ($storage->exists($imagePath . $imageName)) { - $imageName = Str::random(3) . $imageName; + while ($storage->exists($imagePath . $fileName)) { + $fileName = Str::random(3) . $fileName; } - $fullPath = $imagePath . $imageName; + $fullPath = $imagePath . $fileName; if ($secureUploads) { - $fullPath = $imagePath . Str::random(16) . '-' . $imageName; + $fullPath = $imagePath . Str::random(16) . '-' . $fileName; } try { @@ -175,6 +170,23 @@ class ImageService extends UploadService return $image; } + /** + * Clean up an image file name to be both URL and storage safe. + */ + protected function cleanImageFileName(string $name): string + { + $name = str_replace(' ', '-', $name); + $nameParts = explode('.', $name); + $extension = array_pop($nameParts); + $name = implode('.', $nameParts); + $name = Str::slug($name); + + if (strlen($name) === 0) { + $name = Str::random(10); + } + + return $name . '.' . $extension; + } /** * Checks if the image is a gif. Returns true if it is, else false. @@ -223,6 +235,7 @@ class ImageService extends UploadService $storage->setVisibility($thumbFilePath, 'public'); $this->cache->put('images-' . $image->id . '-' . $thumbFilePath, $thumbFilePath, 60 * 60 * 72); + return $this->getPublicUrl($thumbFilePath); } @@ -292,11 +305,9 @@ class ImageService extends UploadService /** * Destroys an image at the given path. - * Searches for image thumbnails in addition to main provided path.. - * @param string $path - * @return bool + * Searches for image thumbnails in addition to main provided path. */ - protected function destroyImagesFromPath(string $path) + protected function destroyImagesFromPath(string $path): bool { $storage = $this->getStorage(); @@ -306,8 +317,7 @@ class ImageService extends UploadService // Delete image files $imagesToDelete = $allImages->filter(function ($imagePath) use ($imageFileName) { - $expectedIndex = strlen($imagePath) - strlen($imageFileName); - return strpos($imagePath, $imageFileName) === $expectedIndex; + return basename($imagePath) === $imageFileName; }); $storage->delete($imagesToDelete->all()); diff --git a/app/helpers.php b/app/helpers.php index 65da1853b..83017c37d 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -153,10 +153,6 @@ function icon(string $name, array $attrs = []): string * Generate a url with multiple parameters for sorting purposes. * Works out the logic to set the correct sorting direction * Discards empty parameters and allows overriding. - * @param string $path - * @param array $data - * @param array $overrideData - * @return string */ function sortUrl(string $path, array $data, array $overrideData = []): string { @@ -166,7 +162,7 @@ function sortUrl(string $path, array $data, array $overrideData = []): string // Change sorting direction is already sorted on current attribute if (isset($overrideData['sort']) && $overrideData['sort'] === $data['sort']) { $queryData['order'] = ($data['order'] === 'asc') ? 'desc' : 'asc'; - } else { + } elseif (isset($overrideData['sort'])) { $queryData['order'] = 'asc'; } diff --git a/composer.json b/composer.json index 80e8b0a61..59fc909d6 100644 --- a/composer.json +++ b/composer.json @@ -13,14 +13,14 @@ "ext-mbstring": "*", "ext-tidy": "*", "ext-xml": "*", - "barryvdh/laravel-dompdf": "^0.8.5", - "barryvdh/laravel-snappy": "^0.4.5", + "barryvdh/laravel-dompdf": "^0.8.6", + "barryvdh/laravel-snappy": "^0.4.7", "doctrine/dbal": "^2.9", "facade/ignition": "^1.4", "fideloper/proxy": "^4.0", "gathercontent/htmldiff": "^0.2.1", "intervention/image": "^2.5", - "laravel/framework": "^6.12", + "laravel/framework": "^6.18", "laravel/socialite": "^4.3.2", "league/commonmark": "^1.4", "league/flysystem-aws-s3-v3": "^1.0", diff --git a/composer.lock b/composer.lock index 3ddd28e5a..b22874455 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bbe47cff4f167fd6ce7047dff4602a78", + "content-hash": "34390536dd685e0bc49b179babaa06ec", "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.134.3", + "version": "3.154.6", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "3de2711a47e7c3f5e93a5c83f019188fd23f852f" + "reference": "83a1382930359e4d4f4c9187239f059d5b282520" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3de2711a47e7c3f5e93a5c83f019188fd23f852f", - "reference": "3de2711a47e7c3f5e93a5c83f019188fd23f852f", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/83a1382930359e4d4f4c9187239f059d5b282520", + "reference": "83a1382930359e4d4f4c9187239f059d5b282520", "shasum": "" }, "require": { @@ -40,6 +40,7 @@ "ext-pcntl": "*", "ext-sockets": "*", "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^4.8.35|^5.4.3", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", @@ -88,25 +89,25 @@ "s3", "sdk" ], - "time": "2020-04-03T18:11:51+00:00" + "time": "2020-09-18T18:16:42+00:00" }, { "name": "barryvdh/laravel-dompdf", - "version": "v0.8.6", + "version": "v0.8.7", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-dompdf.git", - "reference": "d7108f78cf5254a2d8c224542967f133e5a6d4e8" + "reference": "30310e0a675462bf2aa9d448c8dcbf57fbcc517d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/d7108f78cf5254a2d8c224542967f133e5a6d4e8", - "reference": "d7108f78cf5254a2d8c224542967f133e5a6d4e8", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/30310e0a675462bf2aa9d448c8dcbf57fbcc517d", + "reference": "30310e0a675462bf2aa9d448c8dcbf57fbcc517d", "shasum": "" }, "require": { "dompdf/dompdf": "^0.8", - "illuminate/support": "^5.5|^6|^7", + "illuminate/support": "^5.5|^6|^7|^8", "php": ">=7" }, "type": "library", @@ -144,25 +145,31 @@ "laravel", "pdf" ], - "time": "2020-02-25T20:44:34+00:00" + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2020-09-07T11:50:18+00:00" }, { "name": "barryvdh/laravel-snappy", - "version": "v0.4.7", + "version": "v0.4.8", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-snappy.git", - "reference": "c412d0c8f40b1326ba0fb16e94957fd1e68374f0" + "reference": "1903ab84171072b6bff8d98eb58d38b2c9aaf645" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/c412d0c8f40b1326ba0fb16e94957fd1e68374f0", - "reference": "c412d0c8f40b1326ba0fb16e94957fd1e68374f0", + "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/1903ab84171072b6bff8d98eb58d38b2c9aaf645", + "reference": "1903ab84171072b6bff8d98eb58d38b2c9aaf645", "shasum": "" }, "require": { - "illuminate/filesystem": "^5.5|^6|^7", - "illuminate/support": "^5.5|^6|^7", + "illuminate/filesystem": "^5.5|^6|^7|^8", + "illuminate/support": "^5.5|^6|^7|^8", "knplabs/knp-snappy": "^1", "php": ">=7" }, @@ -205,7 +212,7 @@ "wkhtmltoimage", "wkhtmltopdf" ], - "time": "2020-02-25T20:52:15+00:00" + "time": "2020-09-07T12:33:10+00:00" }, { "name": "cogpowered/finediff", @@ -260,20 +267,20 @@ }, { "name": "doctrine/cache", - "version": "1.10.0", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62" + "reference": "13e3381b25847283a91948d04640543941309727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", "shasum": "" }, "require": { - "php": "~7.1" + "php": "~7.1 || ^8.0" }, "conflict": { "doctrine/common": ">2.2,<2.4" @@ -338,20 +345,34 @@ "redis", "xcache" ], - "time": "2019-11-29T15:36:20+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-07-07T18:54:01+00:00" }, { "name": "doctrine/dbal", - "version": "v2.10.1", + "version": "2.10.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8" + "reference": "47433196b6390d14409a33885ee42b6208160643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", - "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/47433196b6390d14409a33885ee42b6208160643", + "reference": "47433196b6390d14409a33885ee42b6208160643", "shasum": "" }, "require": { @@ -361,11 +382,14 @@ "php": "^7.2" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.1", "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.11.3", - "phpunit/phpunit": "^8.4.1", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0" + "nikic/php-parser": "^4.4", + "phpstan/phpstan": "^0.12.40", + "phpunit/phpunit": "^8.5.5", + "psalm/plugin-phpunit": "^0.10.0", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "^3.14.2" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -430,24 +454,38 @@ "sqlserver", "sqlsrv" ], - "time": "2020-01-04T12:56:21+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2020-09-12T21:20:41+00:00" }, { "name": "doctrine/event-manager", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "629572819973f13486371cb611386eb17851e85c" + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", - "reference": "629572819973f13486371cb611386eb17851e85c", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9@dev" @@ -506,37 +544,55 @@ "event system", "events" ], - "time": "2019-11-10T09:48:07+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" }, { "name": "doctrine/inflector", - "version": "1.3.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", - "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -565,32 +621,52 @@ "email": "schmittjoh@gmail.com" } ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ "inflection", - "pluralize", - "singularize", - "string" + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" ], - "time": "2019-10-30T19:59:35+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2020-05-29T15:13:26+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -635,37 +711,53 @@ "parser", "php" ], - "time": "2019-10-30T14:39:59+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" }, { "name": "dompdf/dompdf", - "version": "v0.8.5", + "version": "v0.8.6", "source": { "type": "git", "url": "https://github.com/dompdf/dompdf.git", - "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56" + "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/6782abfc090b132134cd6cea0ec6d76f0fce2c56", - "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db91d81866c69a42dad1d2926f61515a1e3f42c5", + "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "phenx/php-font-lib": "^0.5.1", + "phenx/php-font-lib": "^0.5.2", "phenx/php-svg-lib": "^0.3.3", "php": "^7.1" }, "require-dev": { + "mockery/mockery": "^1.3", "phpunit/phpunit": "^7.5", "squizlabs/php_codesniffer": "^3.5" }, "suggest": { "ext-gd": "Needed to process images", "ext-gmagick": "Improves image processing performance", - "ext-imagick": "Improves image processing performance" + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" }, "type": "library", "extra": { @@ -701,7 +793,7 @@ ], "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "homepage": "https://github.com/dompdf/dompdf", - "time": "2020-02-20T03:52:51+00:00" + "time": "2020-08-30T22:54:22+00:00" }, { "name": "dragonmantank/cron-expression", @@ -759,16 +851,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.17", + "version": "2.1.20", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" + "reference": "f46887bc48db66c7f38f668eb7d6ae54583617ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", - "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f46887bc48db66c7f38f668eb7d6ae54583617ff", + "reference": "f46887bc48db66c7f38f668eb7d6ae54583617ff", "shasum": "" }, "require": { @@ -792,7 +884,7 @@ }, "autoload": { "psr-4": { - "Egulias\\EmailValidator\\": "EmailValidator" + "Egulias\\EmailValidator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -813,31 +905,32 @@ "validation", "validator" ], - "time": "2020-02-13T22:36:52+00:00" + "time": "2020-09-06T13:44:32+00:00" }, { "name": "facade/flare-client-php", - "version": "1.3.2", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/facade/flare-client-php.git", - "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004" + "reference": "451fadf38e9f635e7f8e1f5b3cf5c9eb82f11799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004", - "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/451fadf38e9f635e7f8e1f5b3cf5c9eb82f11799", + "reference": "451fadf38e9f635e7f8e1f5b3cf5c9eb82f11799", "shasum": "" }, "require": { "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "^5.5|^6.0|^7.0", + "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0", "php": "^7.1", "symfony/http-foundation": "^3.3|^4.1|^5.0", + "symfony/mime": "^3.4|^4.0|^5.1", "symfony/var-dumper": "^3.4|^4.0|^5.0" }, "require-dev": { - "larapack/dd": "^1.1", + "friendsofphp/php-cs-fixer": "^2.14", "phpunit/phpunit": "^7.5.16", "spatie/phpunit-snapshot-assertions": "^2.0" }, @@ -867,20 +960,26 @@ "flare", "reporting" ], - "time": "2020-03-02T15:52:04+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2020-09-18T06:35:11+00:00" }, { "name": "facade/ignition", - "version": "1.16.1", + "version": "1.16.3", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d" + "reference": "19674150bb46a4de0ba138c747f538fe7be11dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/af05ac5ee8587395d7474ec0681c08776a2cb09d", - "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d", + "url": "https://api.github.com/repos/facade/ignition/zipball/19674150bb46a4de0ba138c747f538fe7be11dbc", + "reference": "19674150bb46a4de0ba138c747f538fe7be11dbc", "shasum": "" }, "require": { @@ -938,25 +1037,30 @@ "laravel", "page" ], - "time": "2020-03-05T12:39:07+00:00" + "time": "2020-07-13T15:54:05+00:00" }, { "name": "facade/ignition-contracts", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/facade/ignition-contracts.git", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" + "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/aeab1ce8b68b188a43e81758e750151ad7da796b", + "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b", "shasum": "" }, "require": { "php": "^7.1" }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "phpunit/phpunit": "^7.5|^8.0", + "vimeo/psalm": "^3.12" + }, "type": "library", "autoload": { "psr-4": { @@ -982,20 +1086,20 @@ "flare", "ignition" ], - "time": "2019-08-30T14:06:08+00:00" + "time": "2020-07-14T10:10:28+00:00" }, { "name": "fideloper/proxy", - "version": "4.3.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a" + "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", - "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", + "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", "shasum": "" }, "require": { @@ -1036,20 +1140,20 @@ "proxy", "trusted proxy" ], - "time": "2020-02-22T01:51:47+00:00" + "time": "2020-06-23T01:36:47+00:00" }, { "name": "filp/whoops", - "version": "2.7.1", + "version": "2.7.3", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "fff6f1e4f36be0e0d0b84d66b413d9dcb0c49130" + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/fff6f1e4f36be0e0d0b84d66b413d9dcb0c49130", - "reference": "fff6f1e4f36be0e0d0b84d66b413d9dcb0c49130", + "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", "shasum": "" }, "require": { @@ -1097,7 +1201,7 @@ "throwable", "whoops" ], - "time": "2020-01-15T10:00:00+00:00" + "time": "2020-06-14T09:00:00+00:00" }, { "name": "gathercontent/htmldiff", @@ -1150,23 +1254,24 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.2", + "version": "6.5.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5" + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", @@ -1174,7 +1279,6 @@ "psr/log": "^1.1" }, "suggest": { - "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", @@ -1213,7 +1317,7 @@ "rest", "web service" ], - "time": "2019-12-23T11:57:10+00:00" + "time": "2020-06-16T21:01:06+00:00" }, { "name": "guzzlehttp/promises", @@ -1565,27 +1669,27 @@ }, { "name": "laravel/framework", - "version": "v6.18.3", + "version": "v6.18.40", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "4e48acfaba87f08320a2764d36c3b6a4a4112ccf" + "reference": "e42450df0896b7130ccdb5290a114424e18887c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/4e48acfaba87f08320a2764d36c3b6a4a4112ccf", - "reference": "4e48acfaba87f08320a2764d36c3b6a4a4112ccf", + "url": "https://api.github.com/repos/laravel/framework/zipball/e42450df0896b7130ccdb5290a114424e18887c9", + "reference": "e42450df0896b7130ccdb5290a114424e18887c9", "shasum": "" }, "require": { - "doctrine/inflector": "^1.1", + "doctrine/inflector": "^1.4|^2.0", "dragonmantank/cron-expression": "^2.0", "egulias/email-validator": "^2.1.10", "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", "league/commonmark": "^1.3", - "league/flysystem": "^1.0.8", + "league/flysystem": "^1.0.34", "monolog/monolog": "^1.12|^2.0", "nesbot/carbon": "^2.0", "opis/closure": "^3.1", @@ -1599,6 +1703,7 @@ "symfony/finder": "^4.3.4", "symfony/http-foundation": "^4.3.4", "symfony/http-kernel": "^4.3.4", + "symfony/polyfill-php73": "^1.17", "symfony/process": "^4.3.4", "symfony/routing": "^4.3.4", "symfony/var-dumper": "^4.3.4", @@ -1655,6 +1760,7 @@ "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", "ext-pcntl": "Required to use all features of the queue worker.", @@ -1670,6 +1776,7 @@ "moontoast/math": "Required to use ordered UUIDs (^1.1).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "predis/predis": "Required to use the predis connector (^1.1.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", "symfony/cache": "Required to PSR-6 cache bridge (^4.3.4).", @@ -1707,33 +1814,34 @@ "framework", "laravel" ], - "time": "2020-03-24T16:37:50+00:00" + "time": "2020-09-09T15:02:20+00:00" }, { "name": "laravel/socialite", - "version": "v4.3.2", + "version": "v4.4.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "4bd66ee416fea04398dee5b8c32d65719a075db4" + "reference": "80951df0d93435b773aa00efe1fad6d5015fac75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/4bd66ee416fea04398dee5b8c32d65719a075db4", - "reference": "4bd66ee416fea04398dee5b8c32d65719a075db4", + "url": "https://api.github.com/repos/laravel/socialite/zipball/80951df0d93435b773aa00efe1fad6d5015fac75", + "reference": "80951df0d93435b773aa00efe1fad6d5015fac75", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/guzzle": "~6.0", + "guzzlehttp/guzzle": "^6.0|^7.0", "illuminate/http": "~5.7.0|~5.8.0|^6.0|^7.0", "illuminate/support": "~5.7.0|~5.8.0|^6.0|^7.0", - "league/oauth1-client": "~1.0", + "league/oauth1-client": "^1.0", "php": "^7.1.3" }, "require-dev": { "illuminate/contracts": "~5.7.0|~5.8.0|^6.0|^7.0", "mockery/mockery": "^1.0", + "orchestra/testbench": "^3.7|^3.8|^4.0|^5.0", "phpunit/phpunit": "^7.0|^8.0" }, "type": "library", @@ -1771,39 +1879,39 @@ "laravel", "oauth" ], - "time": "2020-02-04T15:30:01+00:00" + "time": "2020-06-03T13:30:03+00:00" }, { "name": "league/commonmark", - "version": "1.4.2", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "9e780d972185e4f737a03bade0fd34a9e67bbf31" + "reference": "45832dfed6007b984c0d40addfac48d403dc6432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/9e780d972185e4f737a03bade0fd34a9e67bbf31", - "reference": "9e780d972185e4f737a03bade0fd34a9e67bbf31", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/45832dfed6007b984c0d40addfac48d403dc6432", + "reference": "45832dfed6007b984c0d40addfac48d403dc6432", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "scrutinizer/ocular": "1.7.*" }, "require-dev": { "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.1", + "commonmark/commonmark.js": "0.29.2", "erusev/parsedown": "~1.0", "ext-json": "*", "github/gfm": "0.29.0", "michelf/php-markdown": "~1.4", "mikehaertl/php-shellcommand": "^1.4", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", "scrutinizer/ocular": "^1.5", "symfony/finder": "^4.2" }, @@ -1811,11 +1919,6 @@ "bin/commonmark" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, "autoload": { "psr-4": { "League\\CommonMark\\": "src" @@ -1871,20 +1974,20 @@ "type": "tidelift" } ], - "time": "2020-04-24T13:39:56+00:00" + "time": "2020-09-13T14:44:46+00:00" }, { "name": "league/flysystem", - "version": "1.0.66", + "version": "1.0.70", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21" + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/021569195e15f8209b1c4bebb78bd66aa4f08c21", - "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/585824702f534f8d3cf7fab7225e8466cc4b7493", + "reference": "585824702f534f8d3cf7fab7225e8466cc4b7493", "shasum": "" }, "require": { @@ -1895,7 +1998,7 @@ "league/flysystem-sftp": "<1.0.6" }, "require-dev": { - "phpspec/phpspec": "^3.4", + "phpspec/phpspec": "^3.4 || ^4.0 || ^5.0 || ^6.0", "phpunit/phpunit": "^5.7.26" }, "suggest": { @@ -1955,24 +2058,30 @@ "sftp", "storage" ], - "time": "2020-03-17T18:58:12+00:00" + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2020-07-26T07:20:36+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "1.0.24", + "version": "1.0.28", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "4382036bde5dc926f9b8b337e5bdb15e5ec7b570" + "reference": "af7384a12f7cd7d08183390d930c9d0ec629c990" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4382036bde5dc926f9b8b337e5bdb15e5ec7b570", - "reference": "4382036bde5dc926f9b8b337e5bdb15e5ec7b570", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/af7384a12f7cd7d08183390d930c9d0ec629c990", + "reference": "af7384a12f7cd7d08183390d930c9d0ec629c990", "shasum": "" }, "require": { - "aws/aws-sdk-php": "^3.0.0", + "aws/aws-sdk-php": "^3.20.0", "league/flysystem": "^1.0.40", "php": ">=5.5.0" }, @@ -2002,40 +2111,48 @@ } ], "description": "Flysystem adapter for the AWS S3 SDK v3.x", - "time": "2020-02-23T13:31:58+00:00" + "time": "2020-08-22T08:43:01+00:00" }, { "name": "league/oauth1-client", - "version": "1.7.0", + "version": "v1.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth1-client.git", - "reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647" + "reference": "3a68155c3f27a91f4b66a2dc03996cd6f3281c9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/fca5f160650cb74d23fc11aa570dd61f86dcf647", - "reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/3a68155c3f27a91f4b66a2dc03996cd6f3281c9f", + "reference": "3a68155c3f27a91f4b66a2dc03996cd6f3281c9f", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.0", - "php": ">=5.5.0" + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "php": ">=7.1" }, "require-dev": { - "mockery/mockery": "^0.9", - "phpunit/phpunit": "^4.0", - "squizlabs/php_codesniffer": "^2.0" + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^2.16.1", + "mockery/mockery": "^1.3", + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-simplexml": "For decoding XML-based responses." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.0-dev", + "dev-develop": "2.0-dev" } }, "autoload": { "psr-4": { - "League\\OAuth1\\": "src/" + "League\\OAuth1\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2065,24 +2182,24 @@ "tumblr", "twitter" ], - "time": "2016-08-17T00:36:58+00:00" + "time": "2020-09-04T11:07:03+00:00" }, { "name": "monolog/monolog", - "version": "2.0.2", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8" + "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c861fcba2ca29404dc9e617eedd9eff4616986b8", - "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5", + "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5", "shasum": "" }, "require": { - "php": "^7.2", + "php": ">=7.2", "psr/log": "^1.0.1" }, "provide": { @@ -2093,11 +2210,11 @@ "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^6.0", "graylog2/gelf-php": "^1.4.2", - "jakub-onderka/php-parallel-lint": "^0.9", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", "phpspec/prophecy": "^1.6.1", - "phpunit/phpunit": "^8.3", + "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3", "ruflin/elastica": ">=0.90 <3.0", @@ -2146,29 +2263,39 @@ "logging", "psr-3" ], - "time": "2019-12-20T14:22:59+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:41:23+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "52168cb9472de06979613d365c7f1ab8798be895" + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/52168cb9472de06979613d365c7f1ab8798be895", - "reference": "52168cb9472de06979613d365c7f1ab8798be895", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", "shasum": "" }, "require": { - "php": ">=5.4.0", - "symfony/polyfill-mbstring": "^1.4" + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.2", - "phpunit/phpunit": "^4.8.36|^7.5.15" + "composer/xdebug-handler": "^1.4", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" }, "bin": [ "bin/jp.php" @@ -2176,7 +2303,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -2203,33 +2330,35 @@ "json", "jsonpath" ], - "time": "2019-12-30T18:03:34+00:00" + "time": "2020-07-31T21:01:56+00:00" }, { "name": "nesbot/carbon", - "version": "2.32.2", + "version": "2.40.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc" + "reference": "6c7646154181013ecd55e80c201b9fd873c6ee5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f10e22cf546704fab1db4ad4b9dedbc5c797a0dc", - "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/6c7646154181013ecd55e80c201b9fd873c6ee5d", + "reference": "6c7646154181013ecd55e80c201b9fd873c6ee5d", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", "symfony/translation": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", - "kylekatarnls/multi-tester": "^1.1", - "phpmd/phpmd": "^2.8", - "phpstan/phpstan": "^0.11", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.35", "phpunit/phpunit": "^7.5 || ^8.0", "squizlabs/php_codesniffer": "^3.4" }, @@ -2239,12 +2368,18 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.x-dev", + "dev-3.x": "3.x-dev" }, "laravel": { "providers": [ "Carbon\\Laravel\\ServiceProvider" ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -2274,7 +2409,17 @@ "datetime", "time" ], - "time": "2020-03-31T13:43:19+00:00" + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2020-09-11T19:00:58+00:00" }, { "name": "nunomaduro/collision", @@ -2392,16 +2537,16 @@ }, { "name": "opis/closure", - "version": "3.5.1", + "version": "3.5.7", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969" + "reference": "4531e53afe2fc660403e76fb7644e95998bff7bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/93ebc5712cdad8d5f489b500c59d122df2e53969", - "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969", + "url": "https://api.github.com/repos/opis/closure/zipball/4531e53afe2fc660403e76fb7644e95998bff7bf", + "reference": "4531e53afe2fc660403e76fb7644e95998bff7bf", "shasum": "" }, "require": { @@ -2449,7 +2594,7 @@ "serialization", "serialize" ], - "time": "2019-11-29T22:36:02+00:00" + "time": "2020-09-06T17:02:15+00:00" }, { "name": "paragonie/random_compat", @@ -2498,20 +2643,20 @@ }, { "name": "phenx/php-font-lib", - "version": "0.5.1", + "version": "0.5.2", "source": { "type": "git", "url": "https://github.com/PhenX/php-font-lib.git", - "reference": "760148820110a1ae0936e5cc35851e25a938bc97" + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/760148820110a1ae0936e5cc35851e25a938bc97", - "reference": "760148820110a1ae0936e5cc35851e25a938bc97", + "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", "shasum": "" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" }, "type": "library", "autoload": { @@ -2531,7 +2676,7 @@ ], "description": "A library to read, parse, export and make subsets of different types of font files.", "homepage": "https://github.com/PhenX/php-font-lib", - "time": "2017-09-13T16:14:37+00:00" + "time": "2020-03-08T15:31:32+00:00" }, { "name": "phenx/php-svg-lib", @@ -2575,24 +2720,24 @@ }, { "name": "phpoption/phpoption", - "version": "1.7.3", + "version": "1.7.5", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae" + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae", - "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", "shasum": "" }, "require": { "php": "^5.5.9 || ^7.0 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.3", - "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { @@ -2626,26 +2771,37 @@ "php", "type" ], - "time": "2020-03-21T18:07:53+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2020-07-20T17:29:33+00:00" }, { "name": "predis/predis", - "version": "v1.1.1", + "version": "v1.1.6", "source": { "type": "git", - "url": "https://github.com/nrk/predis.git", - "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1" + "url": "https://github.com/predis/predis.git", + "reference": "9930e933c67446962997b05201c69c2319bf26de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1", - "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1", + "url": "https://api.github.com/repos/predis/predis/zipball/9930e933c67446962997b05201c69c2319bf26de", + "reference": "9930e933c67446962997b05201c69c2319bf26de", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { + "cweagans/composer-patches": "^1.6", "phpunit/phpunit": "~4.8" }, "suggest": { @@ -2653,6 +2809,18 @@ "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" }, "type": "library", + "extra": { + "composer-exit-on-patch-failure": true, + "patches": { + "phpunit/phpunit-mock-objects": { + "Fix PHP 7 and 8 compatibility": "./tests/phpunit_mock_objects.patch" + }, + "phpunit/phpunit": { + "Fix PHP 7 compatibility": "./tests/phpunit_php7.patch", + "Fix PHP 8 compatibility": "./tests/phpunit_php8.patch" + } + } + }, "autoload": { "psr-4": { "Predis\\": "src/" @@ -2666,17 +2834,29 @@ { "name": "Daniele Alessandri", "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net" + "homepage": "http://clorophilla.net", + "role": "Creator & Maintainer" + }, + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" } ], "description": "Flexible and feature-complete Redis client for PHP and HHVM", - "homepage": "http://github.com/nrk/predis", + "homepage": "http://github.com/predis/predis", "keywords": [ "nosql", "predis", "redis" ], - "time": "2016-06-16T16:22:20+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2020-09-11T19:18:05+00:00" }, { "name": "psr/container", @@ -3001,16 +3181,16 @@ }, { "name": "robrichards/xmlseclibs", - "version": "3.0.4", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/robrichards/xmlseclibs.git", - "reference": "0a53d3c3aa87564910cae4ed01416441d3ae0db5" + "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/0a53d3c3aa87564910cae4ed01416441d3ae0db5", - "reference": "0a53d3c3aa87564910cae4ed01416441d3ae0db5", + "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/f8f19e58f26cdb42c54b214ff8a820760292f8df", + "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df", "shasum": "" }, "require": { @@ -3035,20 +3215,20 @@ "xml", "xmldsig" ], - "time": "2019-11-05T11:44:22+00:00" + "time": "2020-09-05T13:00:25+00:00" }, { "name": "sabberworm/php-css-parser", - "version": "8.3.0", + "version": "8.3.1", "source": { "type": "git", "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "91bcc3e3fdb7386c9a2e0e0aa09ca75cc43f121f" + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/91bcc3e3fdb7386c9a2e0e0aa09ca75cc43f121f", - "reference": "91bcc3e3fdb7386c9a2e0e0aa09ca75cc43f121f", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", "shasum": "" }, "require": { @@ -3080,20 +3260,20 @@ "parser", "stylesheet" ], - "time": "2019-02-22T07:42:52+00:00" + "time": "2020-06-01T09:10:00+00:00" }, { "name": "scrivo/highlight.php", - "version": "v9.18.1.1", + "version": "v9.18.1.2", "source": { "type": "git", "url": "https://github.com/scrivo/highlight.php.git", - "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558" + "reference": "efb6e445494a9458aa59b0af5edfa4bdcc6809d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558", - "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/efb6e445494a9458aa59b0af5edfa4bdcc6809d9", + "reference": "efb6e445494a9458aa59b0af5edfa4bdcc6809d9", "shasum": "" }, "require": { @@ -3149,7 +3329,13 @@ "highlight.php", "syntax" ], - "time": "2020-03-02T05:59:21+00:00" + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], + "time": "2020-08-27T03:24:44+00:00" }, { "name": "socialiteproviders/discord", @@ -3227,26 +3413,26 @@ }, { "name": "socialiteproviders/manager", - "version": "v3.5", + "version": "v3.6", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570" + "reference": "fc8dbcf0061f12bfe0cc347e9655af932860ad36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570", - "reference": "7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/fc8dbcf0061f12bfe0cc347e9655af932860ad36", + "reference": "fc8dbcf0061f12bfe0cc347e9655af932860ad36", "shasum": "" }, "require": { - "illuminate/support": "~5.4|~5.7.0|~5.8.0|^6.0|^7.0", - "laravel/socialite": "~3.0|~4.0", - "php": "^5.6 || ^7.0" + "illuminate/support": "^6.0|^7.0|^8.0", + "laravel/socialite": "~4.0|~5.0", + "php": "^7.2" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.0" + "mockery/mockery": "^1.2", + "phpunit/phpunit": "^8.0" }, "type": "library", "extra": { @@ -3277,28 +3463,35 @@ { "name": "Miguel Piedrafita", "email": "soy@miguelpiedrafita.com" + }, + { + "name": "atymic", + "email": "atymicq@gmail.com", + "homepage": "https://atymic.dev" } ], "description": "Easily add new or override built-in providers in Laravel Socialite.", - "time": "2020-03-08T16:54:44+00:00" + "homepage": "https://socialiteproviders.com/", + "time": "2020-09-08T10:41:06+00:00" }, { "name": "socialiteproviders/microsoft-azure", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Microsoft-Azure.git", - "reference": "d7a703a782eb9f7eae0db803beaa3ddec19ef372" + "reference": "b22f4696cccecd6de902cf0bc923de7fc2e4608e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Microsoft-Azure/zipball/d7a703a782eb9f7eae0db803beaa3ddec19ef372", - "reference": "d7a703a782eb9f7eae0db803beaa3ddec19ef372", + "url": "https://api.github.com/repos/SocialiteProviders/Microsoft-Azure/zipball/b22f4696cccecd6de902cf0bc923de7fc2e4608e", + "reference": "b22f4696cccecd6de902cf0bc923de7fc2e4608e", "shasum": "" }, "require": { + "ext-json": "*", "php": "^5.6 || ^7.0", - "socialiteproviders/manager": "~3.0" + "socialiteproviders/manager": "~2.0 || ~3.0" }, "type": "library", "autoload": { @@ -3317,23 +3510,24 @@ } ], "description": "Microsoft Azure OAuth2 Provider for Laravel Socialite", - "time": "2017-01-25T09:48:29+00:00" + "time": "2020-04-30T23:01:40+00:00" }, { "name": "socialiteproviders/okta", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Okta.git", - "reference": "dcda13432c80060cd84d4cb5f2af422d280ab895" + "reference": "7c2512f0872316b139e3eea1c50c9351747a57ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Okta/zipball/dcda13432c80060cd84d4cb5f2af422d280ab895", - "reference": "dcda13432c80060cd84d4cb5f2af422d280ab895", + "url": "https://api.github.com/repos/SocialiteProviders/Okta/zipball/7c2512f0872316b139e3eea1c50c9351747a57ea", + "reference": "7c2512f0872316b139e3eea1c50c9351747a57ea", "shasum": "" }, "require": { + "ext-json": "*", "php": "^5.6 || ^7.0", "socialiteproviders/manager": "~2.0 || ~3.0" }, @@ -3354,7 +3548,7 @@ } ], "description": "Okta OAuth2 Provider for Laravel Socialite", - "time": "2017-11-21T05:31:47+00:00" + "time": "2019-09-06T15:27:03+00:00" }, { "name": "socialiteproviders/slack", @@ -3395,19 +3589,20 @@ }, { "name": "socialiteproviders/twitch", - "version": "v5.1", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Twitch.git", - "reference": "f9b1f90a94f539e1b29e84ee0f731f42d59f3213" + "reference": "9ee6fe196d7c28777139b3cde04cbd537cf7e652" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Twitch/zipball/f9b1f90a94f539e1b29e84ee0f731f42d59f3213", - "reference": "f9b1f90a94f539e1b29e84ee0f731f42d59f3213", + "url": "https://api.github.com/repos/SocialiteProviders/Twitch/zipball/9ee6fe196d7c28777139b3cde04cbd537cf7e652", + "reference": "9ee6fe196d7c28777139b3cde04cbd537cf7e652", "shasum": "" }, "require": { + "ext-json": "*", "php": "^5.6 || ^7.0", "socialiteproviders/manager": "~2.0 || ~3.0" }, @@ -3428,7 +3623,7 @@ } ], "description": "Twitch OAuth2 Provider for Laravel Socialite", - "time": "2019-07-01T10:35:46+00:00" + "time": "2020-05-06T22:51:30+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -3494,22 +3689,23 @@ }, { "name": "symfony/console", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7" + "reference": "b39fd99b9297b67fb7633b7d8083957a97e1e727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7", - "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7", + "url": "https://api.github.com/repos/symfony/console/zipball/b39fd99b9297b67fb7633b7d8083957a97e1e727", + "reference": "b39fd99b9297b67fb7633b7d8083957a97e1e727", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { @@ -3566,24 +3762,38 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-03-30T11:41:10+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T07:07:21+00:00" }, { "name": "symfony/css-selector", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b" + "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/afc26133a6fbdd4f8842e38893e0ee4685c7c94b", - "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/bf17dc9f6ce144e41f786c32435feea4d8e11dcc", + "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "type": "library", "extra": { @@ -3619,25 +3829,40 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-05T09:39:30+00:00" }, { "name": "symfony/debug", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "346636d2cae417992ecfd761979b2ab98b339a45" + "reference": "aeb73aca16a8f1fe958230fe44e6cf4c84cbb85e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45", - "reference": "346636d2cae417992ecfd761979b2ab98b339a45", + "url": "https://api.github.com/repos/symfony/debug/zipball/aeb73aca16a8f1fe958230fe44e6cf4c84cbb85e", + "reference": "aeb73aca16a8f1fe958230fe44e6cf4c84cbb85e", "shasum": "" }, "require": { - "php": "^7.1.3", - "psr/log": "~1.0" + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/http-kernel": "<3.4" @@ -3675,26 +3900,41 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-10T07:47:39+00:00" }, { "name": "symfony/error-handler", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358" + "reference": "2434fb32851f252e4f27691eee0b77c16198db62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/7e9828fc98aa1cf27b422fe478a84f5b0abb7358", - "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/2434fb32851f252e4f27691eee0b77c16198db62", + "reference": "2434fb32851f252e4f27691eee0b77c16198db62", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "psr/log": "~1.0", "symfony/debug": "^4.4.5", + "symfony/polyfill-php80": "^1.15", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -3731,24 +3971,38 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2020-03-30T14:07:33+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-17T09:56:45+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed" + "reference": "3e8ea5ccddd00556b86d69d42f99f1061a704030" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abc8e3618bfdb55e44c8c6a00abd333f831bbfed", - "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3e8ea5ccddd00556b86d69d42f99f1061a704030", + "reference": "3e8ea5ccddd00556b86d69d42f99f1061a704030", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/event-dispatcher-contracts": "^1.1" }, "conflict": { @@ -3801,24 +4055,38 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-13T14:18:44+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.7", + "version": "v1.1.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18" + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18", - "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "suggest": { "psr/event-dispatcher": "", @@ -3828,6 +4096,10 @@ "extra": { "branch-alias": { "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3859,24 +4131,38 @@ "interoperability", "standards" ], - "time": "2019-09-17T09:54:03+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/finder", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "5729f943f9854c5781984ed4907bbb817735776b" + "reference": "2a78590b2c7e3de5c429628457c47541c58db9c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b", - "reference": "5729f943f9854c5781984ed4907bbb817735776b", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a78590b2c7e3de5c429628457c47541c58db9c7", + "reference": "2a78590b2c7e3de5c429628457c47541c58db9c7", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "type": "library", "extra": { @@ -3908,24 +4194,38 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-17T09:56:45+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b" + "reference": "e3e5a62a6631a461954d471e7206e3750dbe8ee1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62f92509c9abfd1f73e17b8cf1b72c0bdac6611b", - "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e3e5a62a6631a461954d471e7206e3750dbe8ee1", + "reference": "e3e5a62a6631a461954d471e7206e3750dbe8ee1", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/mime": "^4.3|^5.0", "symfony/polyfill-mbstring": "~1.1" }, @@ -3963,30 +4263,45 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-03-30T14:07:33+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-17T07:39:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc" + "reference": "2bb7b90ecdc79813c0bf237b7ff20e79062b5188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f356a489e51856b99908005eb7f2c51a1dfc95dc", - "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2bb7b90ecdc79813c0bf237b7ff20e79062b5188", + "reference": "2bb7b90ecdc79813c0bf237b7ff20e79062b5188", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "psr/log": "~1.0", "symfony/error-handler": "^4.4", "symfony/event-dispatcher": "^4.4", "symfony/http-foundation": "^4.4|^5.0", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9" + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/browser-kit": "<4.3", @@ -4053,24 +4368,38 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-03-30T14:59:15+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T08:09:29+00:00" }, { "name": "symfony/mime", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "6dde9dc70155e91b850b1d009d1f841c54bc4aba" + "reference": "50ad671306d3d3ffb888d95b4fb1859496831e3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/6dde9dc70155e91b850b1d009d1f841c54bc4aba", - "reference": "6dde9dc70155e91b850b1d009d1f841c54bc4aba", + "url": "https://api.github.com/repos/symfony/mime/zipball/50ad671306d3d3ffb888d95b4fb1859496831e3a", + "reference": "50ad671306d3d3ffb888d95b4fb1859496831e3a", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -4115,20 +4444,34 @@ "mime", "mime-type" ], - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-17T09:56:45+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.15.0", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", "shasum": "" }, "require": { @@ -4140,7 +4483,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4173,20 +4520,34 @@ "polyfill", "portable" ], - "time": "2020-02-27T09:26:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.15.0", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8" + "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/ad6d62792bfbcfc385dd34b424d4fcf9712a32c8", - "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36", + "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36", "shasum": "" }, "require": { @@ -4198,7 +4559,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4232,25 +4597,40 @@ "portable", "shim" ], - "time": "2020-03-09T19:04:49+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.15.0", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", - "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251", "shasum": "" }, "require": { "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", "symfony/polyfill-php72": "^1.10" }, "suggest": { @@ -4259,7 +4639,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4279,6 +4663,10 @@ "name": "Laurent Bassin", "email": "laurent@bassin.info" }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -4294,20 +4682,115 @@ "portable", "shim" ], - "time": "2020-03-09T19:04:49+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-04T06:02:08+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.15.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.18.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", "shasum": "" }, "require": { @@ -4319,7 +4802,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4353,20 +4840,111 @@ "portable", "shim" ], - "time": "2020-03-09T19:04:49+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.15.0", + "name": "symfony/polyfill-php70", + "version": "v1.18.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "37b0976c78b94856543260ce09b460a7bc852747" + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747", - "reference": "37b0976c78b94856543260ce09b460a7bc852747", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "639447d008615574653fb3bc60d1986d7172eaae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", + "reference": "639447d008615574653fb3bc60d1986d7172eaae", "shasum": "" }, "require": { @@ -4375,7 +4953,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4408,20 +4990,34 @@ "portable", "shim" ], - "time": "2020-02-27T09:26:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.15.0", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7" + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", - "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", "shasum": "" }, "require": { @@ -4430,7 +5026,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4466,24 +5066,118 @@ "portable", "shim" ], - "time": "2020-02-27T09:26:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" }, { - "name": "symfony/process", - "version": "v4.4.7", + "name": "symfony/polyfill-php80", + "version": "v1.18.1", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3e40e87a20eaf83a1db825e1fa5097ae89042db3", - "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-14T12:35:20+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "65e70bab62f3da7089a8d4591fb23fbacacb3479" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/65e70bab62f3da7089a8d4591fb23fbacacb3479", + "reference": "65e70bab62f3da7089a8d4591fb23fbacacb3479", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" }, "type": "library", "extra": { @@ -4515,24 +5209,38 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:31:43+00:00" }, { "name": "symfony/routing", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8" + "reference": "e3387963565da9bae51d1d3ab8041646cc93bd04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0f562fa613e288d7dbae6c63abbc9b33ed75a8f8", - "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8", + "url": "https://api.github.com/repos/symfony/routing/zipball/e3387963565da9bae51d1d3ab8041646cc93bd04", + "reference": "e3387963565da9bae51d1d3ab8041646cc93bd04", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "conflict": { "symfony/config": "<4.2", @@ -4591,24 +5299,38 @@ "uri", "url" ], - "time": "2020-03-30T11:41:10+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-10T07:27:51+00:00" }, { "name": "symfony/service-contracts", - "version": "v1.1.8", + "version": "v1.1.9", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" + "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", - "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b776d18b303a39f56c63747bcb977ad4b27aca26", + "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "psr/container": "^1.0" }, "suggest": { @@ -4618,6 +5340,10 @@ "extra": { "branch-alias": { "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4649,24 +5375,38 @@ "interoperability", "standards" ], - "time": "2019-10-14T12:27:06+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/translation", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "4e54d336f2eca5facad449d0b0118bb449375b76" + "reference": "700e6e50174b0cdcf0fa232773bec5c314680575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/4e54d336f2eca5facad449d0b0118bb449375b76", - "reference": "4e54d336f2eca5facad449d0b0118bb449375b76", + "url": "https://api.github.com/repos/symfony/translation/zipball/700e6e50174b0cdcf0fa232773bec5c314680575", + "reference": "700e6e50174b0cdcf0fa232773bec5c314680575", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^1.1.6|^2" }, @@ -4725,24 +5465,38 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-17T09:56:45+00:00" }, { "name": "symfony/translation-contracts", - "version": "v1.1.7", + "version": "v1.1.10", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "364518c132c95642e530d9b2d217acbc2ccac3e6" + "reference": "84180a25fad31e23bebd26ca09d89464f082cacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/364518c132c95642e530d9b2d217acbc2ccac3e6", - "reference": "364518c132c95642e530d9b2d217acbc2ccac3e6", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/84180a25fad31e23bebd26ca09d89464f082cacc", + "reference": "84180a25fad31e23bebd26ca09d89464f082cacc", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "suggest": { "symfony/translation-implementation": "" @@ -4751,6 +5505,10 @@ "extra": { "branch-alias": { "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4782,26 +5540,41 @@ "interoperability", "standards" ], - "time": "2019-09-17T11:12:18+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:08:58+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a" + "reference": "1bef32329f3166486ab7cb88599cae4875632b99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5a0c2d93006131a36cf6f767d10e2ca8333b0d4a", - "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1bef32329f3166486ab7cb88599cae4875632b99", + "reference": "1bef32329f3166486ab7cb88599cae4875632b99", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5" + "symfony/polyfill-php72": "~1.5", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", @@ -4858,30 +5631,44 @@ "debug", "dump" ], - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-17T07:31:35+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.2", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15" + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15", - "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^5.5 || ^7.0", + "php": "^5.5 || ^7.0 || ^8.0", "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" }, "type": "library", "extra": { @@ -4907,31 +5694,31 @@ ], "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "time": "2019-10-24T08:53:34+00:00" + "time": "2020-07-13T06:12:54+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v3.6.2", + "version": "v3.6.7", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "786a947e57086cf236cefdee80784634224b99fa" + "reference": "2065beda6cbe75e2603686907b2e45f6f3a5ad82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/786a947e57086cf236cefdee80784634224b99fa", - "reference": "786a947e57086cf236cefdee80784634224b99fa", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2065beda6cbe75e2603686907b2e45f6f3a5ad82", + "reference": "2065beda6cbe75e2603686907b2e45f6f3a5ad82", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0", - "phpoption/phpoption": "^1.5", - "symfony/polyfill-ctype": "^1.9" + "php": "^5.4 || ^7.0 || ^8.0", + "phpoption/phpoption": "^1.5.2", + "symfony/polyfill-ctype": "^1.17" }, "require-dev": { "ext-filter": "*", "ext-pcre": "*", - "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0" }, "suggest": { "ext-filter": "Required to use the boolean validator.", @@ -4970,40 +5757,52 @@ "env", "environment" ], - "time": "2020-03-27T23:36:02+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2020-07-14T19:04:52+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.2.9", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "42d5da5379a7860093f8e4032167e4cb5ebec180" + "reference": "233c10688f4c1a6e66ed2ef123038b1363d1bedc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/42d5da5379a7860093f8e4032167e4cb5ebec180", - "reference": "42d5da5379a7860093f8e4032167e4cb5ebec180", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/233c10688f4c1a6e66ed2ef123038b1363d1bedc", + "reference": "233c10688f4c1a6e66ed2ef123038b1363d1bedc", "shasum": "" }, "require": { - "illuminate/routing": "^5.5|^6|^7", - "illuminate/session": "^5.5|^6|^7", - "illuminate/support": "^5.5|^6|^7", - "maximebf/debugbar": "^1.15.1", - "php": ">=7.0", - "symfony/debug": "^3|^4|^5", - "symfony/finder": "^3|^4|^5" + "illuminate/routing": "^6|^7|^8", + "illuminate/session": "^6|^7|^8", + "illuminate/support": "^6|^7|^8", + "maximebf/debugbar": "^1.16.3", + "php": ">=7.2", + "symfony/debug": "^4.3|^5", + "symfony/finder": "^4.3|^5" }, "require-dev": { - "laravel/framework": "5.5.x" + "orchestra/testbench-dusk": "^4|^5|^6", + "phpunit/phpunit": "^8.5|^9.0", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.5-dev" }, "laravel": { "providers": [ @@ -5040,43 +5839,53 @@ "profiler", "webprofiler" ], - "time": "2020-02-25T20:42:23+00:00" + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2020-09-07T19:32:39+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.6.7", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "edd69c5e0508972c81f1f7173236de2459c45814" + "reference": "affa55122f83575888d4ebf1728992686e8223de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/edd69c5e0508972c81f1f7173236de2459c45814", - "reference": "edd69c5e0508972c81f1f7173236de2459c45814", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/affa55122f83575888d4ebf1728992686e8223de", + "reference": "affa55122f83575888d4ebf1728992686e8223de", "shasum": "" }, "require": { "barryvdh/reflection-docblock": "^2.0.6", - "composer/composer": "^1.6", + "composer/composer": "^1.6 || ^2.0@dev", "doctrine/dbal": "~2.3", - "illuminate/console": "^5.5|^6|^7", - "illuminate/filesystem": "^5.5|^6|^7", - "illuminate/support": "^5.5|^6|^7", - "php": ">=7.2" + "ext-json": "*", + "illuminate/console": "^6 || ^7 || ^8", + "illuminate/filesystem": "^6 || ^7 || ^8", + "illuminate/support": "^6 || ^7 || ^8", + "php": ">=7.2", + "phpdocumentor/type-resolver": "^1.1.0" }, "require-dev": { - "illuminate/config": "^5.5|^6|^7", - "illuminate/view": "^5.5|^6|^7", + "friendsofphp/php-cs-fixer": "^2", + "illuminate/config": "^6 || ^7 || ^8", + "illuminate/view": "^6 || ^7 || ^8", "mockery/mockery": "^1.3", - "orchestra/testbench": "^3|^4", - "phpro/grumphp": "^0.17.1", - "squizlabs/php_codesniffer": "^3" + "orchestra/testbench": "^4 || ^5 || ^6", + "phpunit/phpunit": "^8.5 || ^9", + "spatie/phpunit-snapshot-assertions": "^1.4 || ^2.2 || ^3", + "vimeo/psalm": "^3.12" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.8-dev" }, "laravel": { "providers": [ @@ -5111,7 +5920,13 @@ "phpstorm", "sublime" ], - "time": "2020-02-25T20:41:32+00:00" + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2020-09-07T07:36:37+00:00" }, { "name": "barryvdh/reflection-docblock", @@ -5164,16 +5979,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.6", + "version": "1.2.8", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e" + "reference": "8a7ecad675253e4654ea05505233285377405215" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/47fe531de31fca4a1b997f87308e7d7804348f7e", - "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215", + "reference": "8a7ecad675253e4654ea05505233285377405215", "shasum": "" }, "require": { @@ -5216,20 +6031,34 @@ "ssl", "tls" ], - "time": "2020-01-13T10:02:55+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-08-23T12:54:47+00:00" }, { "name": "composer/composer", - "version": "1.10.1", + "version": "1.10.13", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011" + "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/b912a45da3e2b22f5cb5a23e441b697a295ba011", - "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011", + "url": "https://api.github.com/repos/composer/composer/zipball/47c841ba3b2d3fc0b4b13282cf029ea18b66d78b", + "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b", "shasum": "" }, "require": { @@ -5237,7 +6066,7 @@ "composer/semver": "^1.0", "composer/spdx-licenses": "^1.2", "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", + "justinrainbow/json-schema": "^5.2.10", "php": "^5.3.2 || ^7.0", "psr/log": "^1.0", "seld/jsonlint": "^1.4", @@ -5252,7 +6081,7 @@ }, "require-dev": { "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^3.4" + "symfony/phpunit-bridge": "^4.2" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -5296,20 +6125,34 @@ "dependency", "package" ], - "time": "2020-03-13T19:34:27+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-09-09T09:46:34+00:00" }, { "name": "composer/semver", - "version": "1.5.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" + "reference": "114f819054a2ea7db03287f5efb757e2af6e4079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", + "url": "https://api.github.com/repos/composer/semver/zipball/114f819054a2ea7db03287f5efb757e2af6e4079", + "reference": "114f819054a2ea7db03287f5efb757e2af6e4079", "shasum": "" }, "require": { @@ -5357,20 +6200,34 @@ "validation", "versioning" ], - "time": "2020-01-13T12:06:48+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-09-09T09:34:06+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.3", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" + "reference": "6946f785871e2314c60b4524851f3702ea4f2223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/6946f785871e2314c60b4524851f3702ea4f2223", + "reference": "6946f785871e2314c60b4524851f3702ea4f2223", "shasum": "" }, "require": { @@ -5417,20 +6274,34 @@ "spdx", "validator" ], - "time": "2020-02-14T07:44:31+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-07-15T15:35:07+00:00" }, { "name": "composer/xdebug-handler", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" + "reference": "ebd27a9866ae8254e873866f795491f02418c5a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ebd27a9866ae8254e873866f795491f02418c5a5", + "reference": "ebd27a9866ae8254e873866f795491f02418c5a5", "shasum": "" }, "require": { @@ -5461,24 +6332,38 @@ "Xdebug", "performance" ], - "time": "2020-03-01T12:26:26+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-08-19T10:27:58+00:00" }, { "name": "doctrine/instantiator", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -5517,7 +6402,21 @@ "constructor", "instantiate" ], - "time": "2019-10-21T16:45:58+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" }, { "name": "fzaninotto/faker", @@ -5571,20 +6470,20 @@ }, { "name": "hamcrest/hamcrest-php", - "version": "v2.0.0", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", - "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", "shasum": "" }, "require": { - "php": "^5.3|^7.0" + "php": "^5.3|^7.0|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", @@ -5592,14 +6491,13 @@ "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/php-file-iterator": "1.3.3", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "^1.0" + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -5609,26 +6507,26 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD" + "BSD-3-Clause" ], "description": "This is the PHP port of Hamcrest Matchers", "keywords": [ "test" ], - "time": "2016-01-20T08:20:44+00:00" + "time": "2020-07-09T08:09:16+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.9", + "version": "5.2.10", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "44c6787311242a979fa15c704327c20e7221a0e4" + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", - "reference": "44c6787311242a979fa15c704327c20e7221a0e4", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", "shasum": "" }, "require": { @@ -5681,20 +6579,20 @@ "json", "schema" ], - "time": "2019-09-25T14:49:45+00:00" + "time": "2020-05-27T16:41:55+00:00" }, { "name": "laravel/browser-kit-testing", - "version": "v5.1.3", + "version": "v5.1.4", "source": { "type": "git", "url": "https://github.com/laravel/browser-kit-testing.git", - "reference": "cb0cf22cf38fe8796842adc8b9ad550ded2a1377" + "reference": "7664a30d2dbabcdb0315bfaa867fef2df8cb8fb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/browser-kit-testing/zipball/cb0cf22cf38fe8796842adc8b9ad550ded2a1377", - "reference": "cb0cf22cf38fe8796842adc8b9ad550ded2a1377", + "url": "https://api.github.com/repos/laravel/browser-kit-testing/zipball/7664a30d2dbabcdb0315bfaa867fef2df8cb8fb1", + "reference": "7664a30d2dbabcdb0315bfaa867fef2df8cb8fb1", "shasum": "" }, "require": { @@ -5706,7 +6604,7 @@ "illuminate/support": "~5.7.0|~5.8.0|^6.0", "mockery/mockery": "^1.0", "php": ">=7.1.3", - "phpunit/phpunit": "^7.0|^8.0", + "phpunit/phpunit": "^7.5|^8.0", "symfony/console": "^4.2", "symfony/css-selector": "^4.2", "symfony/dom-crawler": "^4.2", @@ -5719,7 +6617,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -5742,20 +6640,20 @@ "laravel", "testing" ], - "time": "2019-07-30T14:57:44+00:00" + "time": "2020-08-25T16:54:44+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.16.1", + "version": "v1.16.3", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "58998b818c6567fac01e35b8a4b70c1a64530556" + "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/58998b818c6567fac01e35b8a4b70c1a64530556", - "reference": "58998b818c6567fac01e35b8a4b70c1a64530556", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/1a1605b8e9bacb34cc0c6278206d699772e1d372", + "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372", "shasum": "" }, "require": { @@ -5803,29 +6701,29 @@ "debug", "debugbar" ], - "time": "2019-11-24T09:46:11+00:00" + "time": "2020-05-06T07:06:27+00:00" }, { "name": "mockery/mockery", - "version": "1.3.1", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be" + "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be", - "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be", + "url": "https://api.github.com/repos/mockery/mockery/zipball/60fa2f67f6e4d3634bb4a45ff3171fa52215800d", + "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "~2.0", + "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", "php": ">=5.6.0" }, "require-dev": { - "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" + "phpunit/phpunit": "^5.7.10|^6.5|^7.5|^8.5|^9.3" }, "type": "library", "extra": { @@ -5868,24 +6766,24 @@ "test double", "testing" ], - "time": "2019-12-26T09:49:15+00:00" + "time": "2020-08-11T18:10:21+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.9.5", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "replace": { "myclabs/deep-copy": "self.version" @@ -5916,7 +6814,13 @@ "object", "object graph" ], - "time": "2020-01-17T21:11:47+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-06-29T13:22:24+00:00" }, { "name": "phar-io/manifest", @@ -6022,28 +6926,25 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "2.0.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~6" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -6070,32 +6971,31 @@ "reflection", "static analysis" ], - "time": "2018-08-07T13:53:10+00:00" + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.1.0", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "shasum": "" }, "require": { - "ext-filter": "^7.1", - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/type-resolver": "^1.0", - "webmozart/assert": "^1" + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "doctrine/instantiator": "^1", - "mockery/mockery": "^1" + "mockery/mockery": "~1.3.2" }, "type": "library", "extra": { @@ -6123,34 +7023,33 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-02-22T12:28:44+00:00" + "time": "2020-09-03T19:13:55+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.1.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "shasum": "" }, "require": { - "php": "^7.2", + "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "^7.2", - "mockery/mockery": "~1" + "ext-tokenizer": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { @@ -6169,7 +7068,7 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-02-18T18:59:58+00:00" + "time": "2020-09-17T18:55:26+00:00" }, { "name": "phploc/phploc", @@ -6222,33 +7121,33 @@ }, { "name": "phpspec/prophecy", - "version": "v1.10.3", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" + "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", + "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + "doctrine/instantiator": "^1.2", + "php": "^7.2", + "phpdocumentor/reflection-docblock": "^5.0", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -6281,7 +7180,7 @@ "spy", "stub" ], - "time": "2020-03-05T15:02:03+00:00" + "time": "2020-07-08T12:44:21+00:00" }, { "name": "phpunit/php-code-coverage", @@ -6537,16 +7436,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.3", + "version": "8.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "67750516bc02f300e2742fed2f50177f8f37bedf" + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/67750516bc02f300e2742fed2f50177f8f37bedf", - "reference": "67750516bc02f300e2742fed2f50177f8f37bedf", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", "shasum": "" }, "require": { @@ -6616,7 +7515,17 @@ "testing", "xunit" ], - "time": "2020-03-31T08:52:04+00:00" + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-22T07:06:58+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -7278,20 +8187,20 @@ }, { "name": "seld/jsonlint", - "version": "1.7.2", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" + "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/590cfec960b77fd55e39b7d9246659e95dd6d337", + "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0" + "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" @@ -7323,20 +8232,30 @@ "parser", "validator" ], - "time": "2019-10-24T14:27:39+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2020-08-25T06:56:57+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", "shasum": "" }, "require": { @@ -7367,20 +8286,20 @@ "keywords": [ "phar" ], - "time": "2020-02-14T15:25:33+00:00" + "time": "2020-07-07T18:42:57+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.5.4", + "version": "3.5.6", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "dceec07328401de6211037abbb18bda423677e26" + "reference": "e97627871a7eab2f70e59166072a6b767d5834e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dceec07328401de6211037abbb18bda423677e26", - "reference": "dceec07328401de6211037abbb18bda423677e26", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/e97627871a7eab2f70e59166072a6b767d5834e0", + "reference": "e97627871a7eab2f70e59166072a6b767d5834e0", "shasum": "" }, "require": { @@ -7418,24 +8337,24 @@ "phpcs", "standards" ], - "time": "2020-01-30T22:20:29+00:00" + "time": "2020-08-10T04:50:15+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162" + "reference": "6dd1e7adef4b7efeeb9691fd619279027d4dcf85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4d0fb3374324071ecdd94898367a3fa4b5563162", - "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6dd1e7adef4b7efeeb9691fd619279027d4dcf85", + "reference": "6dd1e7adef4b7efeeb9691fd619279027d4dcf85", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, @@ -7479,24 +8398,38 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2020-03-29T19:12:22+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-12T06:20:35+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.7", + "version": "v4.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7" + "reference": "27575bcbc68db1f6d06218891296572c9b845704" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/fe297193bf2e6866ed900ed2d5869362768df6a7", - "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/27575bcbc68db1f6d06218891296572c9b845704", + "reference": "27575bcbc68db1f6d06218891296572c9b845704", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", @@ -7529,7 +8462,21 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:54:36+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-21T17:19:37+00:00" }, { "name": "theseer/fdomdocument", @@ -7573,23 +8520,23 @@ }, { "name": "theseer/tokenizer", - "version": "1.1.3", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + "reference": "75a63c33a8577608444246075ea0af0d052e452a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -7604,33 +8551,40 @@ "authors": [ { "name": "Arne Blankerts", - "role": "Developer", - "email": "arne@blankerts.de" + "email": "arne@blankerts.de", + "role": "Developer" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" }, { "name": "webmozart/assert", - "version": "1.7.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "aed98a490f9a8f78468232db345ab9cf606cf598" + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598", - "reference": "aed98a490f9a8f78468232db345ab9cf606cf598", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0", + "php": "^5.3.3 || ^7.0 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "vimeo/psalm": "<3.6.0" + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" }, "require-dev": { "phpunit/phpunit": "^4.8.36 || ^7.5.13" @@ -7657,7 +8611,7 @@ "check", "validate" ], - "time": "2020-02-14T12:15:55+00:00" + "time": "2020-07-08T17:02:28+00:00" }, { "name": "wnx/laravel-stats", diff --git a/database/migrations/2020_08_04_111754_drop_joint_permissions_id.php b/database/migrations/2020_08_04_111754_drop_joint_permissions_id.php new file mode 100644 index 000000000..bb953a5bf --- /dev/null +++ b/database/migrations/2020_08_04_111754_drop_joint_permissions_id.php @@ -0,0 +1,37 @@ +dropColumn('id'); + $table->primary(['role_id', 'entity_type', 'entity_id', 'action'], 'joint_primary'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('joint_permissions', function (Blueprint $table) { + $table->dropPrimary(['role_id', 'entity_type', 'entity_id', 'action']); + }); + + Schema::table('joint_permissions', function (Blueprint $table) { + $table->increments('id')->unsigned(); + }); + } +} diff --git a/database/migrations/2020_08_04_131052_remove_role_name_field.php b/database/migrations/2020_08_04_131052_remove_role_name_field.php new file mode 100644 index 000000000..f3cafb732 --- /dev/null +++ b/database/migrations/2020_08_04_131052_remove_role_name_field.php @@ -0,0 +1,37 @@ +dropColumn('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('roles', function (Blueprint $table) { + $table->string('name')->index(); + }); + + DB::table('roles')->update([ + "name" => DB::raw("lower(replace(`display_name`, ' ', '-'))"), + ]); + } +} diff --git a/database/migrations/2020_09_19_094251_add_activity_indexes.php b/database/migrations/2020_09_19_094251_add_activity_indexes.php new file mode 100644 index 000000000..544b01e1f --- /dev/null +++ b/database/migrations/2020_09_19_094251_add_activity_indexes.php @@ -0,0 +1,34 @@ +index('key'); + $table->index('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function(Blueprint $table) { + $table->dropIndex('key'); + $table->dropIndex('created_at'); + }); + } +} diff --git a/dev/api/requests/chapters-create.json b/dev/api/requests/chapters-create.json new file mode 100644 index 000000000..ca06fc298 --- /dev/null +++ b/dev/api/requests/chapters-create.json @@ -0,0 +1,9 @@ +{ + "book_id": 1, + "name": "My fantastic new chapter", + "description": "This is a great new chapter that I've created via the API", + "tags": [ + {"name": "Category", "value": "Top Content"}, + {"name": "Rating", "value": "Highest"} + ] +} \ No newline at end of file diff --git a/dev/api/requests/chapters-update.json b/dev/api/requests/chapters-update.json new file mode 100644 index 000000000..6bd3a3e5c --- /dev/null +++ b/dev/api/requests/chapters-update.json @@ -0,0 +1,9 @@ +{ + "book_id": 1, + "name": "My fantastic updated chapter", + "description": "This is an updated chapter that I've altered via the API", + "tags": [ + {"name": "Category", "value": "Kinda Good Content"}, + {"name": "Rating", "value": "Medium"} + ] +} \ No newline at end of file diff --git a/dev/api/responses/books-read.json b/dev/api/responses/books-read.json index 11408e9ab..2e43f5f87 100644 --- a/dev/api/responses/books-read.json +++ b/dev/api/responses/books-read.json @@ -7,15 +7,12 @@ "updated_at": "2020-01-12 14:11:51", "created_by": { "id": 1, - "name": "Admin", - "image_id": 48 + "name": "Admin" }, "updated_by": { "id": 1, - "name": "Admin", - "image_id": 48 + "name": "Admin" }, - "image_id": 452, "tags": [ { "id": 13, diff --git a/dev/api/responses/chapters-create.json b/dev/api/responses/chapters-create.json new file mode 100644 index 000000000..7aac27687 --- /dev/null +++ b/dev/api/responses/chapters-create.json @@ -0,0 +1,38 @@ +{ + "book_id": 1, + "priority": 6, + "name": "My fantastic new chapter", + "description": "This is a great new chapter that I've created via the API", + "created_by": 1, + "updated_by": 1, + "slug": "my-fantastic-new-chapter", + "updated_at": "2020-05-22 22:59:55", + "created_at": "2020-05-22 22:59:55", + "id": 74, + "book": { + "id": 1, + "name": "BookStack User Guide", + "slug": "bookstack-user-guide", + "description": "This is a general guide on using BookStack on a day-to-day basis.", + "created_at": "2019-05-05 21:48:46", + "updated_at": "2019-12-11 20:57:31", + "created_by": 1, + "updated_by": 1 + }, + "tags": [ + { + "name": "Category", + "value": "Top Content", + "order": 0, + "created_at": "2020-05-22 22:59:55", + "updated_at": "2020-05-22 22:59:55" + }, + { + "name": "Rating", + "value": "Highest", + "order": 0, + "created_at": "2020-05-22 22:59:55", + "updated_at": "2020-05-22 22:59:55" + } + ] +} \ No newline at end of file diff --git a/dev/api/responses/chapters-list.json b/dev/api/responses/chapters-list.json new file mode 100644 index 000000000..0c1fc5fc2 --- /dev/null +++ b/dev/api/responses/chapters-list.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "id": 1, + "book_id": 1, + "name": "Content Creation", + "slug": "content-creation", + "description": "How to create documentation on whatever subject you need to write about.", + "priority": 3, + "created_at": "2019-05-05 21:49:56", + "updated_at": "2019-09-28 11:24:23", + "created_by": 1, + "updated_by": 1 + }, + { + "id": 2, + "book_id": 1, + "name": "Managing Content", + "slug": "managing-content", + "description": "How to keep things organised and orderly in the system for easier navigation and better user experience.", + "priority": 5, + "created_at": "2019-05-05 21:58:07", + "updated_at": "2019-10-17 15:05:34", + "created_by": 3, + "updated_by": 3 + } + ], + "total": 40 +} \ No newline at end of file diff --git a/dev/api/responses/chapters-read.json b/dev/api/responses/chapters-read.json new file mode 100644 index 000000000..2eddad895 --- /dev/null +++ b/dev/api/responses/chapters-read.json @@ -0,0 +1,59 @@ +{ + "id": 1, + "book_id": 1, + "slug": "content-creation", + "name": "Content Creation", + "description": "How to create documentation on whatever subject you need to write about.", + "priority": 3, + "created_at": "2019-05-05 21:49:56", + "updated_at": "2019-09-28 11:24:23", + "created_by": { + "id": 1, + "name": "Admin" + }, + "updated_by": { + "id": 1, + "name": "Admin" + }, + "tags": [ + { + "name": "Category", + "value": "Guide", + "order": 0, + "created_at": "2020-05-22 22:51:51", + "updated_at": "2020-05-22 22:51:51" + } + ], + "pages": [ + { + "id": 1, + "book_id": 1, + "chapter_id": 1, + "name": "How to create page content", + "slug": "how-to-create-page-content", + "priority": 0, + "created_at": "2019-05-05 21:49:58", + "updated_at": "2019-08-26 14:32:59", + "created_by": 1, + "updated_by": 1, + "draft": 0, + "revision_count": 2, + "template": 0 + }, + { + "id": 7, + "book_id": 1, + "chapter_id": 1, + "name": "Good book structure", + "slug": "good-book-structure", + "priority": 1, + "created_at": "2019-05-05 22:01:55", + "updated_at": "2019-06-06 12:03:04", + "created_by": 3, + "updated_by": 3, + "draft": 0, + "revision_count": 1, + "template": 0 + } + ] +} \ No newline at end of file diff --git a/dev/api/responses/chapters-update.json b/dev/api/responses/chapters-update.json new file mode 100644 index 000000000..a7edb15b0 --- /dev/null +++ b/dev/api/responses/chapters-update.json @@ -0,0 +1,38 @@ +{ + "id": 75, + "book_id": 1, + "slug": "my-fantastic-updated-chapter", + "name": "My fantastic updated chapter", + "description": "This is an updated chapter that I've altered via the API", + "priority": 7, + "created_at": "2020-05-22 23:03:35", + "updated_at": "2020-05-22 23:07:20", + "created_by": 1, + "updated_by": 1, + "book": { + "id": 1, + "name": "BookStack User Guide", + "slug": "bookstack-user-guide", + "description": "This is a general guide on using BookStack on a day-to-day basis.", + "created_at": "2019-05-05 21:48:46", + "updated_at": "2019-12-11 20:57:31", + "created_by": 1, + "updated_by": 1 + }, + "tags": [ + { + "name": "Category", + "value": "Kinda Good Content", + "order": 0, + "created_at": "2020-05-22 23:07:20", + "updated_at": "2020-05-22 23:07:20" + }, + { + "name": "Rating", + "value": "Medium", + "order": 0, + "created_at": "2020-05-22 23:07:20", + "updated_at": "2020-05-22 23:07:20" + } + ] +} \ No newline at end of file diff --git a/dev/api/responses/shelves-read.json b/dev/api/responses/shelves-read.json index 8a8e2348b..634fbb5a5 100644 --- a/dev/api/responses/shelves-read.json +++ b/dev/api/responses/shelves-read.json @@ -5,15 +5,12 @@ "description": "This is my shelf with some books", "created_by": { "id": 1, - "name": "Admin", - "image_id": 48 + "name": "Admin" }, "updated_by": { "id": 1, - "name": "Admin", - "image_id": 48 + "name": "Admin" }, - "image_id": 501, "created_at": "2020-04-10 13:24:09", "updated_at": "2020-04-10 13:31:04", "tags": [ diff --git a/dev/docs/components.md b/dev/docs/components.md new file mode 100644 index 000000000..832765dd6 --- /dev/null +++ b/dev/docs/components.md @@ -0,0 +1,99 @@ +# JavaScript Components + +This document details the format for JavaScript components in BookStack. This is a really simple class-based setup with a few helpers provided. + +#### Defining a Component in JS + +```js +class Dropdown { + setup() { + this.toggle = this.$refs.toggle; + this.menu = this.$refs.menu; + + this.speed = parseInt(this.$opts.speed); + } +} +``` + +All usage of $refs, $manyRefs and $opts should be done at the top of the `setup` function so any requirements can be easily seen. + +#### Using a Component in HTML + +A component is used like so: + +```html +
+ + + +
+``` + +The names will be parsed and new component instance will be created if a matching name is found in the `components/index.js` componentMapping. + +#### Element References + +Within a component you'll often need to refer to other element instances. This can be done like so: + +```html +
+ View more +
+``` + +You can then access the span element as `this.$refs.toggle` in your component. + +#### Component Options + +```html +
+
+``` + +Will result with `this.$opts` being: + +```json +{ + "delay": "500", + "show": "" +} +``` + +#### Global Helpers + +There are various global helper libraries which can be used in components: + +```js +// HTTP service +window.$http.get(url, params); +window.$http.post(url, data); +window.$http.put(url, data); +window.$http.delete(url, data); +window.$http.patch(url, data); + +// Global event system +// Emit a global event +window.$events.emit(eventName, eventData); +// Listen to a global event +window.$events.listen(eventName, callback); +// Show a success message +window.$events.success(message); +// Show an error message +window.$events.error(message); +// Show validation errors, if existing, as an error notification +window.$events.showValidationErrors(error); + +// Translator +// Take the given plural text and count to decide on what plural option +// to use, Similar to laravel's trans_choice function but instead +// takes the direction directly instead of a translation key. +window.trans_plural(translationString, count, replacements); + +// Component System +// Parse and initialise any components from the given root el down. +window.components.init(rootEl); +// Get the first active component of the given name +window.components.first(name); +``` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 243a19a9b..c5b9fc393 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,239 +2,10 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { @@ -256,22 +27,6 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -280,268 +35,28 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -557,221 +72,16 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -780,9 +90,9 @@ } }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -792,55 +102,19 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.4.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "chokidar-cli": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.1.0.tgz", + "integrity": "sha512-6n21AVpW6ywuEPoxJcLXMA2p4T+SLjWsXKny/9yTWFz0kKxESI3eUylpeV97LylING/27T/RVTY0f2/0QaWq9Q==", "dev": true, "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "chokidar": "^3.2.3", + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1", + "yargs": "^13.3.0" } }, "clipboard": { @@ -854,47 +128,20 @@ } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "codemirror": { - "version": "5.52.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.52.2.tgz", - "integrity": "sha512-WCGCixNUck2HGvY8/ZNI1jYfxPG5cRHv0VjmWuNzbtCLz8qYA5d+je4QhSSCtCaagyeOwMi/HmmPTjBgiTm2lQ==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.57.0.tgz", + "integrity": "sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg==" }, "color-convert": { "version": "1.9.3", @@ -911,232 +158,31 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", "which": "^1.2.9" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1146,138 +192,15 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "dropzone": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.7.0.tgz", - "integrity": "sha512-kOltiZXH5cO/72I22JjE+w6BoT6uaVLfWdFMsi1PMKFkU6BZWpqRwjnsRm0o6ANGTBuZar5Piu7m/CbKqRPiYg==" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.7.2.tgz", + "integrity": "sha512-m217bJHtf0J1IiKn4Tv6mnu1h5QvQNBnKZ39gma7hzGQhIZMxYq1vYEHs4AVd4ThFwmALys+52NAOD4zdLTG4w==" }, "emoji-regex": { "version": "7.0.3", @@ -1285,57 +208,10 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" }, "error-ex": { "version": "1.3.2", @@ -1347,22 +223,28 @@ } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -1370,243 +252,18 @@ "is-symbol": "^1.0.2" } }, + "esbuild": { + "version": "0.6.30", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.6.30.tgz", + "integrity": "sha512-ZSZY461UPzTYYC3rqy1QiMtngk2WyXf+58MgC7tC22jkI90FXNgEl0hN3ipfn/UgZYzTW2GBcHiO7t0rSbHT7g==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1616,264 +273,43 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "locate-path": "^3.0.0" } }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globule": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", - "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.12", - "minimatch": "~3.0.2" - } - }, "good-listener": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", @@ -1883,27 +319,11 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1913,15 +333,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1929,250 +340,17 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2188,76 +366,16 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, "is-extglob": { @@ -2266,20 +384,11 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-glob": { "version": "4.0.1", @@ -2296,175 +405,40 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { - "has": "^1.0.1" + "has-symbols": "^1.0.1" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", "requires": { "uc.micro": "^1.0.1" } @@ -2482,47 +456,21 @@ } }, "livereload-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", - "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", + "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", "dev": true }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -2533,98 +481,28 @@ "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.0.tgz", + "integrity": "sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg==", "requires": { "argparse": "^1.0.7", "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } @@ -2634,240 +512,17 @@ "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==" }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2877,253 +532,20 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -3134,18 +556,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -3161,239 +571,42 @@ "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "opts": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", - "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", - "dev": true - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -3414,83 +627,20 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-key": { @@ -3499,54 +649,31 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, "pify": { @@ -3555,409 +682,30 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "path-type": "^3.0.0" } }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, "requires": { - "picomatch": "^2.0.7" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "picomatch": "^2.2.1" } }, "require-directory": { @@ -3967,192 +715,27 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { - "glob": "^7.1.3" + "path-parse": "^1.0.6" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "sass": { + "version": "1.26.10", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", + "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - } - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } + "chokidar": ">=2.0.0 <4.0.0" } }, "select": { @@ -4161,15 +744,9 @@ "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -4178,54 +755,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -4242,195 +771,20 @@ "dev": true }, "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "sortablejs": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==" }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -4438,15 +792,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -4454,200 +808,72 @@ } }, "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^4.1.0" } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "style-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", - "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.6.4" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4657,126 +883,11 @@ "has-flag": "^3.0.0" } }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "terser": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", - "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4786,225 +897,11 @@ "is-number": "^7.0.0" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -5015,1041 +912,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "vue": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", - "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" - }, - "vuedraggable": { - "version": "2.23.2", - "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.2.tgz", - "integrity": "sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==", - "requires": { - "sortablejs": "^1.10.1" - } - }, - "watchpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", - "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack": { - "version": "4.42.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", - "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -6060,45 +922,22 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -6108,68 +947,38 @@ "async-limiter": "~1.0.0" } }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index a05851987..a8ec0df93 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,33 @@ { "private": true, "scripts": { - "build": "webpack", - "production": "NODE_ENV=production webpack && rm -f ./public/dist/*styles.js", - "build-profile": "NODE_ENV=production webpack --profile --json > webpack-stats.json && rm -f ./public/dist/*styles.js", + "build:css:dev": "sass ./resources/sass:./public/dist", + "build:css:watch": "sass ./resources/sass:./public/dist --watch", + "build:css:production": "sass ./resources/sass:./public/dist -s compressed", + "build:js:dev": "esbuild --bundle ./resources/js/index.js --outfile=public/dist/app.js --sourcemap --target=es2020", + "build:js:watch": "chokidar \"./resources/**/*.js\" -c \"npm run build:js:dev\"", + "build:js:production": "NODE_ENV=production esbuild --bundle ./resources/js/index.js --outfile=public/dist/app.js --sourcemap --minify", + "build": "npm-run-all --parallel build:*:dev", + "production": "npm-run-all --parallel build:*:production", "dev": "npm-run-all --parallel watch livereload", - "watch": "webpack --watch", + "watch": "npm-run-all --parallel build:*:watch", "livereload": "livereload ./public/dist/", "permissions": "chown -R $USER:$USER bootstrap/cache storage public/uploads" }, "devDependencies": { - "css-loader": "^3.4.2", + "chokidar-cli": "^2.1.0", + "esbuild": "0.6.30", "livereload": "^0.9.1", - "mini-css-extract-plugin": "^0.9.0", - "node-sass": "^4.13.1", "npm-run-all": "^4.1.5", - "sass-loader": "^8.0.2", - "style-loader": "^1.1.3", - "webpack": "^4.42.1", - "webpack-cli": "^3.3.11" + "punycode": "^2.1.1", + "sass": "^1.26.10" }, "dependencies": { "clipboard": "^2.0.6", - "codemirror": "^5.52.2", - "dropzone": "^5.7.0", - "markdown-it": "^10.0.0", + "codemirror": "^5.57.0", + "dropzone": "^5.7.2", + "markdown-it": "^11.0.0", "markdown-it-task-lists": "^2.1.1", - "sortablejs": "^1.10.2", - "vue": "^2.6.11", - "vuedraggable": "^2.23.2" - }, - "browser": { - "vue": "vue/dist/vue.common.js" + "sortablejs": "^1.10.2" } } diff --git a/phpcs.xml b/phpcs.xml index 009791fc9..ccde28033 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -3,6 +3,7 @@ The coding standard for BookStack. app */migrations/* + */tests/* \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index 85538c446..70f1c1f9c 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -51,5 +51,7 @@ + + diff --git a/readme.md b/readme.md index 2c68d094c..0c0626f5b 100644 --- a/readme.md +++ b/readme.md @@ -51,7 +51,7 @@ All development on BookStack is currently done on the master branch. When it's t * [Node.js](https://nodejs.org/en/) v10.0+ -This project uses SASS for CSS development and this is built, along with the JavaScript, using webpack. The below npm commands can be used to install the dependencies & run the build tasks: +This project uses SASS for CSS development and this is built, along with the JavaScript, using a range of npm scripts. The below npm commands can be used to install the dependencies & run the build tasks: ``` bash # Install NPM Dependencies @@ -157,8 +157,7 @@ These are the great open-source projects used to help build BookStack: * [Laravel](http://laravel.com/) * [TinyMCE](https://www.tinymce.com/) * [CodeMirror](https://codemirror.net) -* [Vue.js](http://vuejs.org/) -* [Sortable](https://github.com/SortableJS/Sortable) & [Vue.Draggable](https://github.com/SortableJS/Vue.Draggable) +* [Sortable](https://github.com/SortableJS/Sortable) * [Google Material Icons](https://material.io/icons/) * [Dropzone.js](http://www.dropzonejs.com/) * [clipboard.js](https://clipboardjs.com/) diff --git a/resources/js/components/add-remove-rows.js b/resources/js/components/add-remove-rows.js new file mode 100644 index 000000000..9a5f019c5 --- /dev/null +++ b/resources/js/components/add-remove-rows.js @@ -0,0 +1,54 @@ +import {onChildEvent} from "../services/dom"; +import {uniqueId} from "../services/util"; + +/** + * AddRemoveRows + * Allows easy row add/remove controls onto a table. + * Needs a model row to use when adding a new row. + * @extends {Component} + */ +class AddRemoveRows { + setup() { + this.modelRow = this.$refs.model; + this.addButton = this.$refs.add; + this.removeSelector = this.$opts.removeSelector; + this.rowSelector = this.$opts.rowSelector; + this.setupListeners(); + } + + setupListeners() { + this.addButton.addEventListener('click', this.add.bind(this)); + + onChildEvent(this.$el, this.removeSelector, 'click', (e) => { + const row = e.target.closest(this.rowSelector); + row.remove(); + }); + } + + // For external use + add() { + const clone = this.modelRow.cloneNode(true); + clone.classList.remove('hidden'); + this.setClonedInputNames(clone); + this.modelRow.parentNode.insertBefore(clone, this.modelRow); + window.components.init(clone); + } + + /** + * Update the HTML names of a clone to be unique if required. + * Names can use placeholder values. For exmaple, a model row + * may have name="tags[randrowid][name]". + * These are the available placeholder values: + * - randrowid - An random string ID, applied the same across the row. + * @param {HTMLElement} clone + */ + setClonedInputNames(clone) { + const rowId = uniqueId(); + const randRowIdElems = clone.querySelectorAll(`[name*="randrowid"]`); + for (const elem of randRowIdElems) { + elem.name = elem.name.split('randrowid').join(rowId); + } + } +} + +export default AddRemoveRows; \ No newline at end of file diff --git a/resources/js/components/ajax-delete-row.js b/resources/js/components/ajax-delete-row.js new file mode 100644 index 000000000..2feb3d5ac --- /dev/null +++ b/resources/js/components/ajax-delete-row.js @@ -0,0 +1,32 @@ +/** + * AjaxDelete + * @extends {Component} + */ +import {onSelect} from "../services/dom"; + +class AjaxDeleteRow { + setup() { + this.row = this.$el; + this.url = this.$opts.url; + this.deleteButtons = this.$manyRefs.delete; + + onSelect(this.deleteButtons, this.runDelete.bind(this)); + } + + runDelete() { + this.row.style.opacity = '0.7'; + this.row.style.pointerEvents = 'none'; + + window.$http.delete(this.url).then(resp => { + if (typeof resp.data === 'object' && resp.data.message) { + window.$events.emit('success', resp.data.message); + } + this.row.remove(); + }).catch(err => { + this.row.style.opacity = null; + this.row.style.pointerEvents = null; + }); + } +} + +export default AjaxDeleteRow; \ No newline at end of file diff --git a/resources/js/components/ajax-form.js b/resources/js/components/ajax-form.js new file mode 100644 index 000000000..91029d042 --- /dev/null +++ b/resources/js/components/ajax-form.js @@ -0,0 +1,82 @@ +import {onEnterPress, onSelect} from "../services/dom"; + +/** + * Ajax Form + * Will handle button clicks or input enter press events and submit + * the data over ajax. Will always expect a partial HTML view to be returned. + * Fires an 'ajax-form-success' event when submitted successfully. + * + * Will handle a real form if that's what the component is added to + * otherwise will act as a fake form element. + * + * @extends {Component} + */ +class AjaxForm { + setup() { + this.container = this.$el; + this.responseContainer = this.container; + this.url = this.$opts.url; + this.method = this.$opts.method || 'post'; + this.successMessage = this.$opts.successMessage; + this.submitButtons = this.$manyRefs.submit || []; + + if (this.$opts.responseContainer) { + this.responseContainer = this.container.closest(this.$opts.responseContainer); + } + + this.setupListeners(); + } + + setupListeners() { + + if (this.container.tagName === 'FORM') { + this.container.addEventListener('submit', this.submitRealForm.bind(this)); + return; + } + + onEnterPress(this.container, event => { + this.submitFakeForm(); + event.preventDefault(); + }); + + this.submitButtons.forEach(button => onSelect(button, this.submitFakeForm.bind(this))); + } + + submitFakeForm() { + const fd = new FormData(); + const inputs = this.container.querySelectorAll(`[name]`); + for (const input of inputs) { + fd.append(input.getAttribute('name'), input.value); + } + this.submit(fd); + } + + submitRealForm(event) { + event.preventDefault(); + const fd = new FormData(this.container); + this.submit(fd); + } + + async submit(formData) { + this.responseContainer.style.opacity = '0.7'; + this.responseContainer.style.pointerEvents = 'none'; + + try { + const resp = await window.$http[this.method.toLowerCase()](this.url, formData); + this.$emit('success', {formData}); + this.responseContainer.innerHTML = resp.data; + if (this.successMessage) { + window.$events.emit('success', this.successMessage); + } + } catch (err) { + this.responseContainer.innerHTML = err.data; + } + + window.components.init(this.responseContainer); + this.responseContainer.style.opacity = null; + this.responseContainer.style.pointerEvents = null; + } + +} + +export default AjaxForm; \ No newline at end of file diff --git a/resources/js/components/attachments.js b/resources/js/components/attachments.js new file mode 100644 index 000000000..6dcfe9f12 --- /dev/null +++ b/resources/js/components/attachments.js @@ -0,0 +1,79 @@ +/** + * Attachments + * @extends {Component} + */ +import {showLoading} from "../services/dom"; + +class Attachments { + + setup() { + this.container = this.$el; + this.pageId = this.$opts.pageId; + this.editContainer = this.$refs.editContainer; + this.listContainer = this.$refs.listContainer; + this.mainTabs = this.$refs.mainTabs; + this.list = this.$refs.list; + + this.setupListeners(); + } + + setupListeners() { + const reloadListBound = this.reloadList.bind(this); + this.container.addEventListener('dropzone-success', reloadListBound); + this.container.addEventListener('ajax-form-success', reloadListBound); + + this.container.addEventListener('sortable-list-sort', event => { + this.updateOrder(event.detail.ids); + }); + + this.container.addEventListener('event-emit-select-edit', event => { + this.startEdit(event.detail.id); + }); + + this.container.addEventListener('event-emit-select-edit-back', event => { + this.stopEdit(); + }); + + this.container.addEventListener('event-emit-select-insert', event => { + const insertContent = event.target.closest('[data-drag-content]').getAttribute('data-drag-content'); + const contentTypes = JSON.parse(insertContent); + window.$events.emit('editor::insert', { + html: contentTypes['text/html'], + markdown: contentTypes['text/plain'], + }); + }); + } + + reloadList() { + this.stopEdit(); + this.mainTabs.components.tabs.show('items'); + window.$http.get(`/attachments/get/page/${this.pageId}`).then(resp => { + this.list.innerHTML = resp.data; + window.components.init(this.list); + }); + } + + updateOrder(idOrder) { + window.$http.put(`/attachments/sort/page/${this.pageId}`, {order: idOrder}).then(resp => { + window.$events.emit('success', resp.data.message); + }); + } + + async startEdit(id) { + this.editContainer.classList.remove('hidden'); + this.listContainer.classList.add('hidden'); + + showLoading(this.editContainer); + const resp = await window.$http.get(`/attachments/edit/${id}`); + this.editContainer.innerHTML = resp.data; + window.components.init(this.editContainer); + } + + stopEdit() { + this.editContainer.classList.add('hidden'); + this.listContainer.classList.remove('hidden'); + } + +} + +export default Attachments; \ No newline at end of file diff --git a/resources/js/components/auto-suggest.js b/resources/js/components/auto-suggest.js new file mode 100644 index 000000000..68de49b4a --- /dev/null +++ b/resources/js/components/auto-suggest.js @@ -0,0 +1,152 @@ +import {escapeHtml} from "../services/util"; +import {onChildEvent} from "../services/dom"; + +const ajaxCache = {}; + +/** + * AutoSuggest + * @extends {Component} + */ +class AutoSuggest { + setup() { + this.parent = this.$el.parentElement; + this.container = this.$el; + this.type = this.$opts.type; + this.url = this.$opts.url; + this.input = this.$refs.input; + this.list = this.$refs.list; + + this.lastPopulated = 0; + this.setupListeners(); + } + + setupListeners() { + this.input.addEventListener('input', this.requestSuggestions.bind(this)); + this.input.addEventListener('focus', this.requestSuggestions.bind(this)); + this.input.addEventListener('keydown', event => { + if (event.key === 'Tab') { + this.hideSuggestions(); + } + }); + + this.input.addEventListener('blur', this.hideSuggestionsIfFocusedLost.bind(this)); + this.container.addEventListener('keydown', this.containerKeyDown.bind(this)); + + onChildEvent(this.list, 'button', 'click', (event, el) => { + this.selectSuggestion(el.textContent); + }); + onChildEvent(this.list, 'button', 'keydown', (event, el) => { + if (event.key === 'Enter') { + this.selectSuggestion(el.textContent); + } + }); + + } + + selectSuggestion(value) { + this.input.value = value; + this.lastPopulated = Date.now(); + this.input.focus(); + this.input.dispatchEvent(new Event('input', {bubbles: true})); + this.input.dispatchEvent(new Event('change', {bubbles: true})); + this.hideSuggestions(); + } + + containerKeyDown(event) { + if (event.key === 'Enter') event.preventDefault(); + if (this.list.classList.contains('hidden')) return; + + // Down arrow + if (event.key === 'ArrowDown') { + this.moveFocus(true); + event.preventDefault(); + } + // Up Arrow + else if (event.key === 'ArrowUp') { + this.moveFocus(false); + event.preventDefault(); + } + // Escape key + else if (event.key === 'Escape') { + this.hideSuggestions(); + event.preventDefault(); + } + } + + moveFocus(forward = true) { + const focusables = Array.from(this.container.querySelectorAll('input,button')); + const index = focusables.indexOf(document.activeElement); + const newFocus = focusables[index + (forward ? 1 : -1)]; + if (newFocus) { + newFocus.focus() + } + } + + async requestSuggestions() { + if (Date.now() - this.lastPopulated < 50) { + return; + } + + const nameFilter = this.getNameFilterIfNeeded(); + const search = this.input.value.slice(0, 3).toLowerCase(); + const suggestions = await this.loadSuggestions(search, nameFilter); + let toShow = suggestions.slice(0, 6); + if (search.length > 0) { + toShow = suggestions.filter(val => { + return val.toLowerCase().includes(search); + }).slice(0, 6); + } + + this.displaySuggestions(toShow); + } + + getNameFilterIfNeeded() { + if (this.type !== 'value') return null; + return this.parent.querySelector('input').value; + } + + /** + * @param {String} search + * @param {String|null} nameFilter + * @returns {Promise} + */ + async loadSuggestions(search, nameFilter = null) { + const params = {search, name: nameFilter}; + const cacheKey = `${this.url}:${JSON.stringify(params)}`; + + if (ajaxCache[cacheKey]) { + return ajaxCache[cacheKey]; + } + + const resp = await window.$http.get(this.url, params); + ajaxCache[cacheKey] = resp.data; + return resp.data; + } + + /** + * @param {String[]} suggestions + */ + displaySuggestions(suggestions) { + if (suggestions.length === 0) { + return this.hideSuggestions(); + } + + this.list.innerHTML = suggestions.map(value => `
  • `).join(''); + this.list.style.display = 'block'; + for (const button of this.list.querySelectorAll('button')) { + button.addEventListener('blur', this.hideSuggestionsIfFocusedLost.bind(this)); + } + } + + hideSuggestions() { + this.list.style.display = 'none'; + } + + hideSuggestionsIfFocusedLost(event) { + if (!this.container.contains(event.relatedTarget)) { + this.hideSuggestions(); + } + } +} + +export default AutoSuggest; \ No newline at end of file diff --git a/resources/js/components/code-editor.js b/resources/js/components/code-editor.js new file mode 100644 index 000000000..2e3506ec7 --- /dev/null +++ b/resources/js/components/code-editor.js @@ -0,0 +1,117 @@ +import Code from "../services/code"; +import {onChildEvent, onEnterPress, onSelect} from "../services/dom"; + +/** + * Code Editor + * @extends {Component} + */ +class CodeEditor { + + setup() { + this.container = this.$refs.container; + this.popup = this.$el; + this.editorInput = this.$refs.editor; + this.languageLinks = this.$manyRefs.languageLink; + this.saveButton = this.$refs.saveButton; + this.languageInput = this.$refs.languageInput; + this.historyDropDown = this.$refs.historyDropDown; + this.historyList = this.$refs.historyList; + + this.callback = null; + this.editor = null; + this.history = {}; + this.historyKey = 'code_history'; + this.setupListeners(); + } + + setupListeners() { + this.container.addEventListener('keydown', event => { + if (event.ctrlKey && event.key === 'Enter') { + this.save(); + } + }); + + onSelect(this.languageLinks, event => { + const language = event.target.dataset.lang; + this.languageInput.value = language; + this.updateEditorMode(language); + }); + + onEnterPress(this.languageInput, e => this.save()); + onSelect(this.saveButton, e => this.save()); + + onChildEvent(this.historyList, 'button', 'click', (event, elem) => { + event.preventDefault(); + const historyTime = elem.dataset.time; + if (this.editor) { + this.editor.setValue(this.history[historyTime]); + } + }); + } + + save() { + if (this.callback) { + this.callback(this.editor.getValue(), this.languageInput.value); + } + this.hide(); + } + + open(code, language, callback) { + this.languageInput.value = language; + this.callback = callback; + + this.show(); + this.updateEditorMode(language); + + Code.setContent(this.editor, code); + } + + show() { + if (!this.editor) { + this.editor = Code.popupEditor(this.editorInput, this.languageInput.value); + } + this.loadHistory(); + this.popup.components.popup.show(() => { + Code.updateLayout(this.editor); + this.editor.focus(); + }, () => { + this.addHistory() + }); + } + + hide() { + this.popup.components.popup.hide(); + this.addHistory(); + } + + updateEditorMode(language) { + Code.setMode(this.editor, language, this.editor.getValue()); + } + + loadHistory() { + this.history = JSON.parse(window.sessionStorage.getItem(this.historyKey) || '{}'); + const historyKeys = Object.keys(this.history).reverse(); + this.historyDropDown.classList.toggle('hidden', historyKeys.length === 0); + this.historyList.innerHTML = historyKeys.map(key => { + const localTime = (new Date(parseInt(key))).toLocaleTimeString(); + return `
  • `; + }).join(''); + } + + addHistory() { + if (!this.editor) return; + const code = this.editor.getValue(); + if (!code) return; + + // Stop if we'd be storing the same as the last item + const lastHistoryKey = Object.keys(this.history).pop(); + if (this.history[lastHistoryKey] === code) return; + + this.history[String(Date.now())] = code; + const historyString = JSON.stringify(this.history); + window.sessionStorage.setItem(this.historyKey, historyString); + } + +} + +export default CodeEditor; \ No newline at end of file diff --git a/resources/js/components/collapsible.js b/resources/js/components/collapsible.js index a630f38f2..544f91008 100644 --- a/resources/js/components/collapsible.js +++ b/resources/js/components/collapsible.js @@ -37,7 +37,7 @@ class Collapsible { } openIfContainsError() { - const error = this.content.querySelector('.text-neg'); + const error = this.content.querySelector('.text-neg.text-small'); if (error) { this.open(); } diff --git a/resources/js/components/dropdown.js b/resources/js/components/dropdown.js index 367c956ce..7b1ce3055 100644 --- a/resources/js/components/dropdown.js +++ b/resources/js/components/dropdown.js @@ -3,14 +3,16 @@ import {onSelect} from "../services/dom"; /** * Dropdown * Provides some simple logic to create simple dropdown menus. + * @extends {Component} */ class DropDown { - constructor(elem) { - this.container = elem; - this.menu = elem.querySelector('.dropdown-menu, [dropdown-menu]'); - this.moveMenu = elem.hasAttribute('dropdown-move-menu'); - this.toggle = elem.querySelector('[dropdown-toggle]'); + setup() { + this.container = this.$el; + this.menu = this.$refs.menu; + this.toggle = this.$refs.toggle; + this.moveMenu = this.$opts.moveMenu; + this.direction = (document.dir === 'rtl') ? 'right' : 'left'; this.body = document.body; this.showing = false; diff --git a/resources/js/components/dropzone.js b/resources/js/components/dropzone.js new file mode 100644 index 000000000..e7273df62 --- /dev/null +++ b/resources/js/components/dropzone.js @@ -0,0 +1,77 @@ +import DropZoneLib from "dropzone"; +import {fadeOut} from "../services/animations"; + +/** + * Dropzone + * @extends {Component} + */ +class Dropzone { + setup() { + this.container = this.$el; + this.url = this.$opts.url; + this.successMessage = this.$opts.successMessage; + this.removeMessage = this.$opts.removeMessage; + this.uploadLimitMessage = this.$opts.uploadLimitMessage; + this.timeoutMessage = this.$opts.timeoutMessage; + + const _this = this; + this.dz = new DropZoneLib(this.container, { + addRemoveLinks: true, + dictRemoveFile: this.removeMessage, + timeout: Number(window.uploadTimeout) || 60000, + maxFilesize: Number(window.uploadLimit) || 256, + url: this.url, + withCredentials: true, + init() { + this.dz = this; + this.dz.on('sending', _this.onSending.bind(_this)); + this.dz.on('success', _this.onSuccess.bind(_this)); + this.dz.on('error', _this.onError.bind(_this)); + } + }); + } + + onSending(file, xhr, data) { + + const token = window.document.querySelector('meta[name=token]').getAttribute('content'); + data.append('_token', token); + + xhr.ontimeout = (e) => { + this.dz.emit('complete', file); + this.dz.emit('error', file, this.timeoutMessage); + } + } + + onSuccess(file, data) { + this.$emit('success', {file, data}); + + if (this.successMessage) { + window.$events.emit('success', this.successMessage); + } + + fadeOut(file.previewElement, 800, () => { + this.dz.removeFile(file); + }); + } + + onError(file, errorMessage, xhr) { + this.$emit('error', {file, errorMessage, xhr}); + + const setMessage = (message) => { + const messsageEl = file.previewElement.querySelector('[data-dz-errormessage]'); + messsageEl.textContent = message; + } + + if (xhr && xhr.status === 413) { + setMessage(this.uploadLimitMessage); + } else if (errorMessage.file) { + setMessage(errorMessage.file); + } + } + + removeAll() { + this.dz.removeAllFiles(true); + } +} + +export default Dropzone; \ No newline at end of file diff --git a/resources/js/components/entity-search.js b/resources/js/components/entity-search.js new file mode 100644 index 000000000..8b1861ecf --- /dev/null +++ b/resources/js/components/entity-search.js @@ -0,0 +1,59 @@ +import {onSelect} from "../services/dom"; + +/** + * Class EntitySearch + * @extends {Component} + */ +class EntitySearch { + setup() { + this.entityId = this.$opts.entityId; + this.entityType = this.$opts.entityType; + + this.contentView = this.$refs.contentView; + this.searchView = this.$refs.searchView; + this.searchResults = this.$refs.searchResults; + this.searchInput = this.$refs.searchInput; + this.searchForm = this.$refs.searchForm; + this.clearButton = this.$refs.clearButton; + this.loadingBlock = this.$refs.loadingBlock; + + this.setupListeners(); + } + + setupListeners() { + this.searchInput.addEventListener('change', this.runSearch.bind(this)); + this.searchForm.addEventListener('submit', e => { + e.preventDefault(); + this.runSearch(); + }); + + onSelect(this.clearButton, this.clearSearch.bind(this)); + } + + runSearch() { + const term = this.searchInput.value.trim(); + if (term.length === 0) { + return this.clearSearch(); + } + + this.searchView.classList.remove('hidden'); + this.contentView.classList.add('hidden'); + this.loadingBlock.classList.remove('hidden'); + + const url = window.baseUrl(`/search/${this.entityType}/${this.entityId}`); + window.$http.get(url, {term}).then(resp => { + this.searchResults.innerHTML = resp.data; + }).catch(console.error).then(() => { + this.loadingBlock.classList.add('hidden'); + }); + } + + clearSearch() { + this.searchView.classList.add('hidden'); + this.contentView.classList.remove('hidden'); + this.loadingBlock.classList.add('hidden'); + this.searchInput.value = ''; + } +} + +export default EntitySearch; \ No newline at end of file diff --git a/resources/js/components/entity-selector-popup.js b/resources/js/components/entity-selector-popup.js index 147f7b583..0104eace7 100644 --- a/resources/js/components/entity-selector-popup.js +++ b/resources/js/components/entity-selector-popup.js @@ -1,27 +1,29 @@ - +/** + * Entity Selector Popup + * @extends {Component} + */ class EntitySelectorPopup { - constructor(elem) { - this.elem = elem; + setup() { + this.elem = this.$el; + this.selectButton = this.$refs.select; window.EntitySelectorPopup = this; this.callback = null; this.selection = null; - this.selectButton = elem.querySelector('.entity-link-selector-confirm'); this.selectButton.addEventListener('click', this.onSelectButtonClick.bind(this)); - window.$events.listen('entity-select-change', this.onSelectionChange.bind(this)); window.$events.listen('entity-select-confirm', this.onSelectionConfirm.bind(this)); } show(callback) { this.callback = callback; - this.elem.components.overlay.show(); + this.elem.components.popup.show(); } hide() { - this.elem.components.overlay.hide(); + this.elem.components.popup.hide(); } onSelectButtonClick() { diff --git a/resources/js/components/event-emit-select.js b/resources/js/components/event-emit-select.js new file mode 100644 index 000000000..cf0215850 --- /dev/null +++ b/resources/js/components/event-emit-select.js @@ -0,0 +1,29 @@ +import {onSelect} from "../services/dom"; + +/** + * EventEmitSelect + * Component will simply emit an event when selected. + * + * Has one required option: "name". + * A name of "hello" will emit a component DOM event of + * "event-emit-select-name" + * + * All options will be set as the "detail" of the event with + * their values included. + * + * @extends {Component} + */ +class EventEmitSelect { + setup() { + this.container = this.$el; + this.name = this.$opts.name; + + + onSelect(this.$el, () => { + this.$emit(this.name, this.$opts); + }); + } + +} + +export default EventEmitSelect; \ No newline at end of file diff --git a/resources/js/components/image-manager.js b/resources/js/components/image-manager.js new file mode 100644 index 000000000..c974ab1b0 --- /dev/null +++ b/resources/js/components/image-manager.js @@ -0,0 +1,208 @@ +import {onChildEvent, onSelect, removeLoading, showLoading} from "../services/dom"; + +/** + * ImageManager + * @extends {Component} + */ +class ImageManager { + + setup() { + + // Options + this.uploadedTo = this.$opts.uploadedTo; + + // Element References + this.container = this.$el; + this.popupEl = this.$refs.popup; + this.searchForm = this.$refs.searchForm; + this.searchInput = this.$refs.searchInput; + this.cancelSearch = this.$refs.cancelSearch; + this.listContainer = this.$refs.listContainer; + this.filterTabs = this.$manyRefs.filterTabs; + this.selectButton = this.$refs.selectButton; + this.formContainer = this.$refs.formContainer; + this.dropzoneContainer = this.$refs.dropzoneContainer; + + // Instance data + this.type = 'gallery'; + this.lastSelected = {}; + this.lastSelectedTime = 0; + this.callback = null; + this.resetState = () => { + this.hasData = false; + this.page = 1; + this.filter = 'all'; + }; + this.resetState(); + + this.setupListeners(); + + window.ImageManager = this; + } + + setupListeners() { + onSelect(this.filterTabs, e => { + this.resetAll(); + this.filter = e.target.dataset.filter; + this.setActiveFilterTab(this.filter); + this.loadGallery(); + }); + + this.searchForm.addEventListener('submit', event => { + this.resetListView(); + this.loadGallery(); + event.preventDefault(); + }); + + onSelect(this.cancelSearch, event => { + this.resetListView(); + this.resetSearchView(); + this.loadGallery(); + this.cancelSearch.classList.remove('active'); + }); + + this.searchInput.addEventListener('input', event => { + this.cancelSearch.classList.toggle('active', this.searchInput.value.trim()); + }); + + onChildEvent(this.listContainer, '.load-more', 'click', async event => { + showLoading(event.target); + this.page++; + await this.loadGallery(); + event.target.remove(); + }); + + this.listContainer.addEventListener('event-emit-select-image', this.onImageSelectEvent.bind(this)); + + onSelect(this.selectButton, () => { + if (this.callback) { + this.callback(this.lastSelected); + } + this.hide(); + }); + + onChildEvent(this.formContainer, '#image-manager-delete', 'click', event => { + if (this.lastSelected) { + this.loadImageEditForm(this.lastSelected.id, true); + } + }); + + this.formContainer.addEventListener('ajax-form-success', this.refreshGallery.bind(this)); + this.container.addEventListener('dropzone-success', this.refreshGallery.bind(this)); + } + + show(callback, type = 'gallery') { + this.resetAll(); + + this.callback = callback; + this.type = type; + this.popupEl.components.popup.show(); + this.dropzoneContainer.classList.toggle('hidden', type !== 'gallery'); + + if (!this.hasData) { + this.loadGallery(); + this.hasData = true; + } + } + + hide() { + this.popupEl.components.popup.hide(); + } + + async loadGallery() { + const params = { + page: this.page, + search: this.searchInput.value || null, + uploaded_to: this.uploadedTo, + filter_type: this.filter === 'all' ? null : this.filter, + }; + + const {data: html} = await window.$http.get(`images/${this.type}`, params); + this.addReturnedHtmlElementsToList(html); + removeLoading(this.listContainer); + } + + addReturnedHtmlElementsToList(html) { + const el = document.createElement('div'); + el.innerHTML = html; + window.components.init(el); + for (const child of [...el.children]) { + this.listContainer.appendChild(child); + } + } + + 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'); + } + } + + resetAll() { + this.resetState(); + this.resetListView(); + this.resetSearchView(); + this.resetEditForm(); + this.setActiveFilterTab('all'); + this.selectButton.classList.add('hidden'); + } + + resetSearchView() { + this.searchInput.value = ''; + } + + resetEditForm() { + this.formContainer.innerHTML = ''; + } + + resetListView() { + showLoading(this.listContainer); + this.page = 1; + } + + refreshGallery() { + this.resetListView(); + this.loadGallery(); + } + + onImageSelectEvent(event) { + const image = JSON.parse(event.detail.data); + const isDblClick = ((image && image.id === this.lastSelected.id) + && Date.now() - this.lastSelectedTime < 400); + const alreadySelected = event.target.classList.contains('selected'); + [...this.listContainer.querySelectorAll('.selected')].forEach(el => { + el.classList.remove('selected'); + }); + + if (!alreadySelected) { + event.target.classList.add('selected'); + this.loadImageEditForm(image.id); + } else { + this.resetEditForm(); + } + this.selectButton.classList.toggle('hidden', alreadySelected); + + if (isDblClick && this.callback) { + this.callback(image); + this.hide(); + } + + this.lastSelected = image; + this.lastSelectedTime = Date.now(); + } + + async loadImageEditForm(imageId, requestDelete = false) { + if (!requestDelete) { + this.formContainer.innerHTML = ''; + } + + const params = requestDelete ? {delete: true} : {}; + const {data: formHtml} = await window.$http.get(`/images/edit/${imageId}`, params); + this.formContainer.innerHTML = formHtml; + window.components.init(this.formContainer); + } + +} + +export default ImageManager; \ No newline at end of file diff --git a/resources/js/components/index.js b/resources/js/components/index.js index 112827330..87c496c91 100644 --- a/resources/js/components/index.js +++ b/resources/js/components/index.js @@ -1,109 +1,266 @@ -import dropdown from "./dropdown"; -import overlay from "./overlay"; -import backToTop from "./back-to-top"; -import notification from "./notification"; -import chapterToggle from "./chapter-toggle"; -import expandToggle from "./expand-toggle"; -import entitySelectorPopup from "./entity-selector-popup"; -import entitySelector from "./entity-selector"; -import sidebar from "./sidebar"; -import pagePicker from "./page-picker"; -import pageComments from "./page-comments"; -import wysiwygEditor from "./wysiwyg-editor"; -import markdownEditor from "./markdown-editor"; -import editorToolbox from "./editor-toolbox"; -import imagePicker from "./image-picker"; -import collapsible from "./collapsible"; -import toggleSwitch from "./toggle-switch"; -import pageDisplay from "./page-display"; -import shelfSort from "./shelf-sort"; -import homepageControl from "./homepage-control"; -import headerMobileToggle from "./header-mobile-toggle"; -import listSortControl from "./list-sort-control"; -import triLayout from "./tri-layout"; -import breadcrumbListing from "./breadcrumb-listing"; -import permissionsTable from "./permissions-table"; -import customCheckbox from "./custom-checkbox"; -import bookSort from "./book-sort"; -import settingAppColorPicker from "./setting-app-color-picker"; -import settingColorPicker from "./setting-color-picker"; -import entityPermissionsEditor from "./entity-permissions-editor"; -import templateManager from "./template-manager"; -import newUserPassword from "./new-user-password"; -import detailsHighlighter from "./details-highlighter"; -import codeHighlighter from "./code-highlighter"; +import addRemoveRows from "./add-remove-rows.js" +import ajaxDeleteRow from "./ajax-delete-row.js" +import ajaxForm from "./ajax-form.js" +import attachments from "./attachments.js" +import autoSuggest from "./auto-suggest.js" +import backToTop from "./back-to-top.js" +import bookSort from "./book-sort.js" +import breadcrumbListing from "./breadcrumb-listing.js" +import chapterToggle from "./chapter-toggle.js" +import codeEditor from "./code-editor.js" +import codeHighlighter from "./code-highlighter.js" +import collapsible from "./collapsible.js" +import customCheckbox from "./custom-checkbox.js" +import detailsHighlighter from "./details-highlighter.js" +import dropdown from "./dropdown.js" +import dropzone from "./dropzone.js" +import editorToolbox from "./editor-toolbox.js" +import entityPermissionsEditor from "./entity-permissions-editor.js" +import entitySearch from "./entity-search.js" +import entitySelector from "./entity-selector.js" +import entitySelectorPopup from "./entity-selector-popup.js" +import eventEmitSelect from "./event-emit-select.js" +import expandToggle from "./expand-toggle.js" +import headerMobileToggle from "./header-mobile-toggle.js" +import homepageControl from "./homepage-control.js" +import imageManager from "./image-manager.js" +import imagePicker from "./image-picker.js" +import index from "./index.js" +import listSortControl from "./list-sort-control.js" +import markdownEditor from "./markdown-editor.js" +import newUserPassword from "./new-user-password.js" +import notification from "./notification.js" +import optionalInput from "./optional-input.js" +import pageComments from "./page-comments.js" +import pageDisplay from "./page-display.js" +import pageEditor from "./page-editor.js" +import pagePicker from "./page-picker.js" +import permissionsTable from "./permissions-table.js" +import popup from "./popup.js" +import settingAppColorPicker from "./setting-app-color-picker.js" +import settingColorPicker from "./setting-color-picker.js" +import shelfSort from "./shelf-sort.js" +import sidebar from "./sidebar.js" +import sortableList from "./sortable-list.js" +import submitOnChange from "./submit-on-change.js" +import tabs from "./tabs.js" +import tagManager from "./tag-manager.js" +import templateManager from "./template-manager.js" +import toggleSwitch from "./toggle-switch.js" +import triLayout from "./tri-layout.js" +import wysiwygEditor from "./wysiwyg-editor.js" const componentMapping = { - 'dropdown': dropdown, - 'overlay': overlay, - 'back-to-top': backToTop, - 'notification': notification, - 'chapter-toggle': chapterToggle, - 'expand-toggle': expandToggle, - 'entity-selector-popup': entitySelectorPopup, - 'entity-selector': entitySelector, - 'sidebar': sidebar, - 'page-picker': pagePicker, - 'page-comments': pageComments, - 'wysiwyg-editor': wysiwygEditor, - 'markdown-editor': markdownEditor, - 'editor-toolbox': editorToolbox, - 'image-picker': imagePicker, - 'collapsible': collapsible, - 'toggle-switch': toggleSwitch, - 'page-display': pageDisplay, - 'shelf-sort': shelfSort, - 'homepage-control': homepageControl, - 'header-mobile-toggle': headerMobileToggle, - 'list-sort-control': listSortControl, - 'tri-layout': triLayout, - 'breadcrumb-listing': breadcrumbListing, - 'permissions-table': permissionsTable, - 'custom-checkbox': customCheckbox, - 'book-sort': bookSort, - 'setting-app-color-picker': settingAppColorPicker, - 'setting-color-picker': settingColorPicker, - 'entity-permissions-editor': entityPermissionsEditor, - 'template-manager': templateManager, - 'new-user-password': newUserPassword, - 'details-highlighter': detailsHighlighter, - 'code-highlighter': codeHighlighter, + "add-remove-rows": addRemoveRows, + "ajax-delete-row": ajaxDeleteRow, + "ajax-form": ajaxForm, + "attachments": attachments, + "auto-suggest": autoSuggest, + "back-to-top": backToTop, + "book-sort": bookSort, + "breadcrumb-listing": breadcrumbListing, + "chapter-toggle": chapterToggle, + "code-editor": codeEditor, + "code-highlighter": codeHighlighter, + "collapsible": collapsible, + "custom-checkbox": customCheckbox, + "details-highlighter": detailsHighlighter, + "dropdown": dropdown, + "dropzone": dropzone, + "editor-toolbox": editorToolbox, + "entity-permissions-editor": entityPermissionsEditor, + "entity-search": entitySearch, + "entity-selector": entitySelector, + "entity-selector-popup": entitySelectorPopup, + "event-emit-select": eventEmitSelect, + "expand-toggle": expandToggle, + "header-mobile-toggle": headerMobileToggle, + "homepage-control": homepageControl, + "image-manager": imageManager, + "image-picker": imagePicker, + "index": index, + "list-sort-control": listSortControl, + "markdown-editor": markdownEditor, + "new-user-password": newUserPassword, + "notification": notification, + "optional-input": optionalInput, + "page-comments": pageComments, + "page-display": pageDisplay, + "page-editor": pageEditor, + "page-picker": pagePicker, + "permissions-table": permissionsTable, + "popup": popup, + "setting-app-color-picker": settingAppColorPicker, + "setting-color-picker": settingColorPicker, + "shelf-sort": shelfSort, + "sidebar": sidebar, + "sortable-list": sortableList, + "submit-on-change": submitOnChange, + "tabs": tabs, + "tag-manager": tagManager, + "template-manager": templateManager, + "toggle-switch": toggleSwitch, + "tri-layout": triLayout, + "wysiwyg-editor": wysiwygEditor, }; window.components = {}; -const componentNames = Object.keys(componentMapping); - /** * Initialize components of the given name within the given element. * @param {String} componentName * @param {HTMLElement|Document} parentElement */ -function initComponent(componentName, parentElement) { - let elems = parentElement.querySelectorAll(`[${componentName}]`); - if (elems.length === 0) return; - - let component = componentMapping[componentName]; - if (typeof window.components[componentName] === "undefined") window.components[componentName] = []; +function searchForComponentInParent(componentName, parentElement) { + const elems = parentElement.querySelectorAll(`[${componentName}]`); for (let j = 0, jLen = elems.length; j < jLen; j++) { - let instance = new component(elems[j]); - if (typeof elems[j].components === 'undefined') elems[j].components = {}; - elems[j].components[componentName] = instance; - window.components[componentName].push(instance); + initComponent(componentName, elems[j]); } } +/** + * Initialize a component instance on the given dom element. + * @param {String} name + * @param {Element} element + */ +function initComponent(name, element) { + const componentModel = componentMapping[name]; + if (componentModel === undefined) return; + + // Create our component instance + let instance; + try { + instance = new componentModel(element); + instance.$el = element; + const allRefs = parseRefs(name, element); + instance.$refs = allRefs.refs; + instance.$manyRefs = allRefs.manyRefs; + instance.$opts = parseOpts(name, element); + instance.$emit = (eventName, data = {}) => { + data.from = instance; + const event = new CustomEvent(`${name}-${eventName}`, { + bubbles: true, + detail: data + }); + instance.$el.dispatchEvent(event); + }; + if (typeof instance.setup === 'function') { + instance.setup(); + } + } catch (e) { + console.error('Failed to create component', e, name, element); + } + + + // Add to global listing + if (typeof window.components[name] === "undefined") { + window.components[name] = []; + } + window.components[name].push(instance); + + // Add to element listing + if (typeof element.components === 'undefined') { + element.components = {}; + } + element.components[name] = instance; +} + +/** + * Parse out the element references within the given element + * for the given component name. + * @param {String} name + * @param {Element} element + */ +function parseRefs(name, element) { + const refs = {}; + const manyRefs = {}; + + const prefix = `${name}@` + const selector = `[refs*="${prefix}"]`; + const refElems = [...element.querySelectorAll(selector)]; + if (element.matches(selector)) { + refElems.push(element); + } + + for (const el of refElems) { + const refNames = el.getAttribute('refs') + .split(' ') + .filter(str => str.startsWith(prefix)) + .map(str => str.replace(prefix, '')) + .map(kebabToCamel); + for (const ref of refNames) { + refs[ref] = el; + if (typeof manyRefs[ref] === 'undefined') { + manyRefs[ref] = []; + } + manyRefs[ref].push(el); + } + } + return {refs, manyRefs}; +} + +/** + * Parse out the element component options. + * @param {String} name + * @param {Element} element + * @return {Object} + */ +function parseOpts(name, element) { + const opts = {}; + const prefix = `option:${name}:`; + for (const {name, value} of element.attributes) { + if (name.startsWith(prefix)) { + const optName = name.replace(prefix, ''); + opts[kebabToCamel(optName)] = value || ''; + } + } + return opts; +} + +/** + * Convert a kebab-case string to camelCase + * @param {String} kebab + * @returns {string} + */ +function kebabToCamel(kebab) { + const ucFirst = (word) => word.slice(0,1).toUpperCase() + word.slice(1); + const words = kebab.split('-'); + return words[0] + words.slice(1).map(ucFirst).join(''); +} + /** * Initialize all components found within the given element. * @param parentElement */ function initAll(parentElement) { if (typeof parentElement === 'undefined') parentElement = document; - for (let i = 0, len = componentNames.length; i < len; i++) { - initComponent(componentNames[i], parentElement); + + // Old attribute system + for (const componentName of Object.keys(componentMapping)) { + searchForComponentInParent(componentName, parentElement); + } + + // New component system + const componentElems = parentElement.querySelectorAll(`[component],[components]`); + + for (const el of componentElems) { + const componentNames = `${el.getAttribute('component') || ''} ${(el.getAttribute('components'))}`.toLowerCase().split(' ').filter(Boolean); + for (const name of componentNames) { + initComponent(name, el); + } } } window.components.init = initAll; +window.components.first = (name) => (window.components[name] || [null])[0]; export default initAll; + +/** + * @typedef Component + * @property {HTMLElement} $el + * @property {Object} $refs + * @property {Object} $manyRefs + * @property {Object} $opts + * @property {function(string, Object)} $emit + */ \ No newline at end of file diff --git a/resources/js/components/markdown-editor.js b/resources/js/components/markdown-editor.js index cc9a7b859..c371a9839 100644 --- a/resources/js/components/markdown-editor.js +++ b/resources/js/components/markdown-editor.js @@ -8,12 +8,11 @@ import DrawIO from "../services/drawio"; class MarkdownEditor { - constructor(elem) { - this.elem = elem; + setup() { + this.elem = this.$el; - const pageEditor = document.getElementById('page-editor'); - this.pageId = pageEditor.getAttribute('page-id'); - this.textDirection = pageEditor.getAttribute('text-direction'); + this.pageId = this.$opts.pageId; + this.textDirection = this.$opts.textDirection; this.markdown = new MarkdownIt({html: true}); this.markdown.use(mdTasksLists, {label: true}); @@ -27,12 +26,18 @@ class MarkdownEditor { this.onMarkdownScroll = this.onMarkdownScroll.bind(this); - this.display.addEventListener('load', () => { + const displayLoad = () => { this.displayDoc = this.display.contentDocument; this.init(); - }); + }; - window.$events.emitPublic(elem, 'editor-markdown::setup', { + if (this.display.contentDocument.readyState === 'complete') { + displayLoad(); + } else { + this.display.addEventListener('load', displayLoad.bind(this)); + } + + window.$events.emitPublic(this.elem, 'editor-markdown::setup', { markdownIt: this.markdown, displayEl: this.display, codeMirrorInstance: this.cm, @@ -251,7 +256,7 @@ class MarkdownEditor { } const clipboard = new Clipboard(event.dataTransfer); - if (clipboard.hasItems()) { + if (clipboard.hasItems() && clipboard.getImages().length > 0) { const cursorPos = cm.coordsChar({left: event.pageX, top: event.pageY}); cm.setCursor(cursorPos); event.stopPropagation(); @@ -558,6 +563,12 @@ class MarkdownEditor { this.cm.setCursor(cursorPos.line + prependLineCount, cursorPos.ch); }); + // Insert editor content at the current location + window.$events.listen('editor::insert', (eventContent) => { + const markdown = getContentToInsert(eventContent); + this.cm.replaceSelection(markdown); + }); + // Focus on editor window.$events.listen('editor::focus', () => { this.cm.focus(); diff --git a/resources/js/components/optional-input.js b/resources/js/components/optional-input.js new file mode 100644 index 000000000..eab58e42a --- /dev/null +++ b/resources/js/components/optional-input.js @@ -0,0 +1,28 @@ +import {onSelect} from "../services/dom"; + +class OptionalInput { + setup() { + this.removeButton = this.$refs.remove; + this.showButton = this.$refs.show; + this.input = this.$refs.input; + this.setupListeners(); + } + + setupListeners() { + onSelect(this.removeButton, () => { + this.input.value = ''; + this.input.classList.add('hidden'); + this.removeButton.classList.add('hidden'); + this.showButton.classList.remove('hidden'); + }); + + onSelect(this.showButton, () => { + this.input.classList.remove('hidden'); + this.removeButton.classList.remove('hidden'); + this.showButton.classList.add('hidden'); + }); + } + +} + +export default OptionalInput; \ No newline at end of file diff --git a/resources/js/components/overlay.js b/resources/js/components/overlay.js deleted file mode 100644 index 6963ba9d1..000000000 --- a/resources/js/components/overlay.js +++ /dev/null @@ -1,43 +0,0 @@ -import {fadeIn, fadeOut} from "../services/animations"; - -class Overlay { - - constructor(elem) { - this.container = elem; - elem.addEventListener('click', event => { - if (event.target === elem) return this.hide(); - }); - - window.addEventListener('keyup', event => { - if (event.key === 'Escape') { - this.hide(); - } - }); - - let closeButtons = elem.querySelectorAll('.popup-header-close'); - for (let i=0; i < closeButtons.length; i++) { - closeButtons[i].addEventListener('click', this.hide.bind(this)); - } - } - - hide(onComplete = null) { this.toggle(false, onComplete); } - show(onComplete = null) { this.toggle(true, onComplete); } - - toggle(show = true, onComplete) { - if (show) { - fadeIn(this.container, 240, onComplete); - } else { - fadeOut(this.container, 240, onComplete); - } - } - - focusOnBody() { - const body = this.container.querySelector('.popup-body'); - if (body) { - body.focus(); - } - } - -} - -export default Overlay; \ No newline at end of file diff --git a/resources/js/components/page-comments.js b/resources/js/components/page-comments.js index 5d826cba1..c86eead1b 100644 --- a/resources/js/components/page-comments.js +++ b/resources/js/components/page-comments.js @@ -1,16 +1,31 @@ import {scrollAndHighlightElement} from "../services/util"; +/** + * @extends {Component} + */ class PageComments { - constructor(elem) { - this.elem = elem; - this.pageId = Number(elem.getAttribute('page-id')); + setup() { + this.elem = this.$el; + this.pageId = Number(this.$opts.pageId); + + // Element references + this.container = this.$refs.commentContainer; + this.formContainer = this.$refs.formContainer; + this.commentCountBar = this.$refs.commentCountBar; + this.addButtonContainer = this.$refs.addButtonContainer; + this.replyToRow = this.$refs.replyToRow; + + // Translations + this.updatedText = this.$opts.updatedText; + this.deletedText = this.$opts.deletedText; + this.createdText = this.$opts.createdText; + this.countText = this.$opts.countText; + + // Internal State this.editingComment = null; this.parentId = null; - this.container = elem.querySelector('[comment-container]'); - this.formContainer = elem.querySelector('[comment-form-container]'); - if (this.formContainer) { this.form = this.formContainer.querySelector('form'); this.formInput = this.form.querySelector('textarea'); @@ -32,13 +47,14 @@ class PageComments { if (actionElem === null) return; event.preventDefault(); - let action = actionElem.getAttribute('action'); - if (action === 'edit') this.editComment(actionElem.closest('[comment]')); + const action = actionElem.getAttribute('action'); + const comment = actionElem.closest('[comment]'); + if (action === 'edit') this.editComment(comment); if (action === 'closeUpdateForm') this.closeUpdateForm(); - if (action === 'delete') this.deleteComment(actionElem.closest('[comment]')); + if (action === 'delete') this.deleteComment(comment); if (action === 'addComment') this.showForm(); if (action === 'hideForm') this.hideForm(); - if (action === 'reply') this.setReply(actionElem.closest('[comment]')); + if (action === 'reply') this.setReply(comment); if (action === 'remove-reply-to') this.removeReplyTo(); } @@ -69,14 +85,15 @@ class PageComments { }; this.showLoading(form); let commentId = this.editingComment.getAttribute('comment'); - window.$http.put(`/ajax/comment/${commentId}`, reqData).then(resp => { + window.$http.put(`/comment/${commentId}`, reqData).then(resp => { let newComment = document.createElement('div'); newComment.innerHTML = resp.data; this.editingComment.innerHTML = newComment.children[0].innerHTML; - window.$events.emit('success', window.trans('entities.comment_updated_success')); + window.$events.success(this.updatedText); window.components.init(this.editingComment); this.closeUpdateForm(); this.editingComment = null; + }).catch(window.$events.showValidationErrors).then(() => { this.hideLoading(form); }); } @@ -84,9 +101,9 @@ class PageComments { deleteComment(commentElem) { let id = commentElem.getAttribute('comment'); this.showLoading(commentElem.querySelector('[comment-content]')); - window.$http.delete(`/ajax/comment/${id}`).then(resp => { + window.$http.delete(`/comment/${id}`).then(resp => { commentElem.parentNode.removeChild(commentElem); - window.$events.emit('success', window.trans('entities.comment_deleted_success')); + window.$events.success(this.deletedText); this.updateCount(); this.hideForm(); }); @@ -101,21 +118,24 @@ class PageComments { parent_id: this.parentId || null, }; this.showLoading(this.form); - window.$http.post(`/ajax/page/${this.pageId}/comment`, reqData).then(resp => { + window.$http.post(`/comment/${this.pageId}`, reqData).then(resp => { let newComment = document.createElement('div'); newComment.innerHTML = resp.data; let newElem = newComment.children[0]; this.container.appendChild(newElem); window.components.init(newElem); - window.$events.emit('success', window.trans('entities.comment_created_success')); + window.$events.success(this.createdText); this.resetForm(); this.updateCount(); + }).catch(err => { + window.$events.showValidationErrors(err); + this.hideLoading(this.form); }); } updateCount() { let count = this.container.children.length; - this.elem.querySelector('[comments-title]').textContent = window.trans_choice('entities.comment_count', count, {count}); + this.elem.querySelector('[comments-title]').textContent = window.trans_plural(this.countText, count, {count}); } resetForm() { @@ -129,7 +149,7 @@ class PageComments { showForm() { this.formContainer.style.display = 'block'; this.formContainer.parentNode.style.display = 'block'; - this.elem.querySelector('[comment-add-button-container]').style.display = 'none'; + this.addButtonContainer.style.display = 'none'; this.formInput.focus(); this.formInput.scrollIntoView({behavior: "smooth"}); } @@ -137,14 +157,12 @@ class PageComments { hideForm() { this.formContainer.style.display = 'none'; this.formContainer.parentNode.style.display = 'none'; - const addButtonContainer = this.elem.querySelector('[comment-add-button-container]'); if (this.getCommentCount() > 0) { - this.elem.appendChild(addButtonContainer) + this.elem.appendChild(this.addButtonContainer) } else { - const countBar = this.elem.querySelector('[comment-count-bar]'); - countBar.appendChild(addButtonContainer); + this.commentCountBar.appendChild(this.addButtonContainer); } - addButtonContainer.style.display = 'block'; + this.addButtonContainer.style.display = 'block'; } getCommentCount() { @@ -154,15 +172,15 @@ class PageComments { setReply(commentElem) { this.showForm(); this.parentId = Number(commentElem.getAttribute('local-id')); - this.elem.querySelector('[comment-form-reply-to]').style.display = 'block'; - let replyLink = this.elem.querySelector('[comment-form-reply-to] a'); + this.replyToRow.style.display = 'block'; + const replyLink = this.replyToRow.querySelector('a'); replyLink.textContent = `#${this.parentId}`; replyLink.href = `#comment${this.parentId}`; } removeReplyTo() { this.parentId = null; - this.elem.querySelector('[comment-form-reply-to]').style.display = 'none'; + this.replyToRow.style.display = 'none'; } showLoading(formElem) { diff --git a/resources/js/components/page-editor.js b/resources/js/components/page-editor.js new file mode 100644 index 000000000..266e19182 --- /dev/null +++ b/resources/js/components/page-editor.js @@ -0,0 +1,183 @@ +import * as Dates from "../services/dates"; +import {onSelect} from "../services/dom"; + +/** + * Page Editor + * @extends {Component} + */ +class PageEditor { + setup() { + // Options + this.draftsEnabled = this.$opts.draftsEnabled === 'true'; + this.editorType = this.$opts.editorType; + this.pageId = Number(this.$opts.pageId); + this.isNewDraft = this.$opts.pageNewDraft === 'true'; + this.hasDefaultTitle = this.$opts.isDefaultTitle || false; + + // Elements + this.container = this.$el; + this.titleElem = this.$refs.titleContainer.querySelector('input'); + this.saveDraftButton = this.$refs.saveDraft; + this.discardDraftButton = this.$refs.discardDraft; + this.discardDraftWrap = this.$refs.discardDraftWrap; + this.draftDisplay = this.$refs.draftDisplay; + this.draftDisplayIcon = this.$refs.draftDisplayIcon; + this.changelogInput = this.$refs.changelogInput; + this.changelogDisplay = this.$refs.changelogDisplay; + + // Translations + this.draftText = this.$opts.draftText; + this.autosaveFailText = this.$opts.autosaveFailText; + this.editingPageText = this.$opts.editingPageText; + this.draftDiscardedText = this.$opts.draftDiscardedText; + this.setChangelogText = this.$opts.setChangelogText; + + // State data + this.editorHTML = ''; + this.editorMarkdown = ''; + this.autoSave = { + interval: null, + frequency: 30000, + last: 0, + }; + + if (this.pageId !== 0 && this.draftsEnabled) { + window.setTimeout(() => { + this.startAutoSave(); + }, 1000); + } + this.draftDisplay.innerHTML = this.draftText; + + this.setupListeners(); + this.setInitialFocus(); + } + + setupListeners() { + // Listen to save events from editor + window.$events.listen('editor-save-draft', this.saveDraft.bind(this)); + window.$events.listen('editor-save-page', this.savePage.bind(this)); + + // Listen to content changes from the editor + window.$events.listen('editor-html-change', html => { + this.editorHTML = html; + }); + window.$events.listen('editor-markdown-change', markdown => { + this.editorMarkdown = markdown; + }); + + // Changelog controls + this.changelogInput.addEventListener('change', this.updateChangelogDisplay.bind(this)); + + // Draft Controls + onSelect(this.saveDraftButton, this.saveDraft.bind(this)); + onSelect(this.discardDraftButton, this.discardDraft.bind(this)); + } + + setInitialFocus() { + if (this.hasDefaultTitle) { + return this.titleElem.select(); + } + + window.setTimeout(() => { + window.$events.emit('editor::focus', ''); + }, 500); + } + + startAutoSave() { + let lastContent = this.titleElem.value.trim() + '::' + this.editorHTML; + this.autoSaveInterval = window.setInterval(() => { + // Stop if manually saved recently to prevent bombarding the server + let savedRecently = (Date.now() - this.autoSave.last < (this.autoSave.frequency)/2); + if (savedRecently) return; + const newContent = this.titleElem.value.trim() + '::' + this.editorHTML; + if (newContent !== lastContent) { + lastContent = newContent; + this.saveDraft(); + } + + }, this.autoSave.frequency); + } + + savePage() { + this.container.closest('form').submit(); + } + + async saveDraft() { + const data = { + name: this.titleElem.value.trim(), + html: this.editorHTML, + }; + + if (this.editorType === 'markdown') { + data.markdown = this.editorMarkdown; + } + + try { + const resp = await window.$http.put(`/ajax/page/${this.pageId}/save-draft`, data); + if (!this.isNewDraft) { + this.toggleDiscardDraftVisibility(true); + } + this.draftNotifyChange(`${resp.data.message} ${Dates.utcTimeStampToLocalTime(resp.data.timestamp)}`); + this.autoSave.last = Date.now(); + } catch (err) { + // Save the editor content in LocalStorage as a last resort, just in case. + try { + const saveKey = `draft-save-fail-${(new Date()).toISOString()}`; + window.localStorage.setItem(saveKey, JSON.stringify(data)); + } catch (err) {} + + window.$events.emit('error', this.autosaveFailText); + } + + } + + draftNotifyChange(text) { + this.draftDisplay.innerText = text; + this.draftDisplayIcon.classList.add('visible'); + window.setTimeout(() => { + this.draftDisplayIcon.classList.remove('visible'); + }, 2000); + } + + async discardDraft() { + let response; + try { + response = await window.$http.get(`/ajax/page/${this.pageId}`); + } catch (e) { + return console.error(e); + } + + if (this.autoSave.interval) { + window.clearInterval(this.autoSave.interval); + } + + this.draftDisplay.innerText = this.editingPageText; + this.toggleDiscardDraftVisibility(false); + window.$events.emit('editor-html-update', response.data.html || ''); + window.$events.emit('editor-markdown-update', response.data.markdown || response.data.html); + + this.titleElem.value = response.data.name; + window.setTimeout(() => { + this.startAutoSave(); + }, 1000); + window.$events.emit('success', this.draftDiscardedText); + + } + + updateChangelogDisplay() { + let summary = this.changelogInput.value.trim(); + if (summary.length === 0) { + summary = this.setChangelogText; + } else if (summary.length > 16) { + summary = summary.slice(0, 16) + '...'; + } + this.changelogDisplay.innerText = summary; + } + + toggleDiscardDraftVisibility(show) { + this.discardDraftWrap.classList.toggle('hidden', !show); + } + +} + +export default PageEditor; \ No newline at end of file diff --git a/resources/js/components/popup.js b/resources/js/components/popup.js new file mode 100644 index 000000000..13cf69d21 --- /dev/null +++ b/resources/js/components/popup.js @@ -0,0 +1,61 @@ +import {fadeIn, fadeOut} from "../services/animations"; +import {onSelect} from "../services/dom"; + +/** + * Popup window that will contain other content. + * This component provides the show/hide functionality + * with the ability for popup@hide child references to close this. + * @extends {Component} + */ +class Popup { + + setup() { + this.container = this.$el; + this.hideButtons = this.$manyRefs.hide || []; + + this.onkeyup = null; + this.onHide = null; + this.setupListeners(); + } + + setupListeners() { + let lastMouseDownTarget = null; + this.container.addEventListener('mousedown', event => { + lastMouseDownTarget = event.target; + }); + + this.container.addEventListener('click', event => { + if (event.target === this.container && lastMouseDownTarget === this.container) { + return this.hide(); + } + }); + + onSelect(this.hideButtons, e => this.hide()); + } + + hide(onComplete = null) { + fadeOut(this.container, 240, onComplete); + if (this.onkeyup) { + window.removeEventListener('keyup', this.onkeyup); + this.onkeyup = null; + } + if (this.onHide) { + this.onHide(); + } + } + + show(onComplete = null, onHide = null) { + fadeIn(this.container, 240, onComplete); + + this.onkeyup = (event) => { + if (event.key === 'Escape') { + this.hide(); + } + }; + window.addEventListener('keyup', this.onkeyup); + this.onHide = onHide; + } + +} + +export default Popup; \ No newline at end of file diff --git a/resources/js/components/sortable-list.js b/resources/js/components/sortable-list.js new file mode 100644 index 000000000..0af0e11c9 --- /dev/null +++ b/resources/js/components/sortable-list.js @@ -0,0 +1,39 @@ +import Sortable from "sortablejs"; + +/** + * SortableList + * + * Can have data set on the dragged items by setting a 'data-drag-content' attribute. + * This attribute must contain JSON where the keys are content types and the values are + * the data to set on the data-transfer. + * + * @extends {Component} + */ +class SortableList { + setup() { + this.container = this.$el; + this.handleSelector = this.$opts.handleSelector; + + const sortable = new Sortable(this.container, { + handle: this.handleSelector, + animation: 150, + onSort: () => { + this.$emit('sort', {ids: sortable.toArray()}); + }, + setData(dataTransferItem, dragEl) { + const jsonContent = dragEl.getAttribute('data-drag-content'); + if (jsonContent) { + const contentByType = JSON.parse(jsonContent); + for (const [type, content] of Object.entries(contentByType)) { + dataTransferItem.setData(type, content); + } + } + }, + revertOnSpill: true, + dropBubble: true, + dragoverBubble: false, + }); + } +} + +export default SortableList; \ No newline at end of file diff --git a/resources/js/components/submit-on-change.js b/resources/js/components/submit-on-change.js new file mode 100644 index 000000000..979967242 --- /dev/null +++ b/resources/js/components/submit-on-change.js @@ -0,0 +1,19 @@ +/** + * Submit on change + * Simply submits a parent form when this input is changed. + * @extends {Component} + */ +class SubmitOnChange { + + setup() { + this.$el.addEventListener('change', () => { + const form = this.$el.closest('form'); + if (form) { + form.submit(); + } + }); + } + +} + +export default SubmitOnChange; \ No newline at end of file diff --git a/resources/js/components/tabs.js b/resources/js/components/tabs.js new file mode 100644 index 000000000..7121d7044 --- /dev/null +++ b/resources/js/components/tabs.js @@ -0,0 +1,51 @@ +/** + * Tabs + * Works by matching 'tabToggle' with 'tabContent' sections. + * @extends {Component} + */ +import {onSelect} from "../services/dom"; + +class Tabs { + + setup() { + this.tabContentsByName = {}; + this.tabButtonsByName = {}; + this.allContents = []; + this.allButtons = []; + + 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; + } + 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')); + } + } + +} + +export default Tabs; \ No newline at end of file diff --git a/resources/js/components/tag-manager.js b/resources/js/components/tag-manager.js new file mode 100644 index 000000000..99302b6c0 --- /dev/null +++ b/resources/js/components/tag-manager.js @@ -0,0 +1,32 @@ +/** + * TagManager + * @extends {Component} + */ +class TagManager { + setup() { + this.addRemoveComponentEl = this.$refs.addRemove; + this.container = this.$el; + this.rowSelector = this.$opts.rowSelector; + + this.setupListeners(); + } + + setupListeners() { + this.container.addEventListener('change', event => { + const addRemoveComponent = this.addRemoveComponentEl.components['add-remove-rows']; + if (!this.hasEmptyRows()) { + addRemoveComponent.add(); + } + }); + } + + hasEmptyRows() { + const rows = this.container.querySelectorAll(this.rowSelector); + const firstEmpty = [...rows].find(row => { + return [...row.querySelectorAll('input')].filter(input => input.value).length === 0; + }); + return firstEmpty !== undefined; + } +} + +export default TagManager; \ No newline at end of file diff --git a/resources/js/components/wysiwyg-editor.js b/resources/js/components/wysiwyg-editor.js index 1c8c71099..a32e78161 100644 --- a/resources/js/components/wysiwyg-editor.js +++ b/resources/js/components/wysiwyg-editor.js @@ -137,7 +137,7 @@ function codePlugin() { if (!elemIsCodeBlock(selectedNode)) { const providedCode = editor.selection.getNode().textContent; - window.vues['code-editor'].open(providedCode, '', (code, lang) => { + window.components.first('code-editor').open(providedCode, '', (code, lang) => { const wrap = document.createElement('div'); wrap.innerHTML = `
    `; wrap.querySelector('code').innerText = code; @@ -155,7 +155,7 @@ function codePlugin() { let lang = selectedNode.hasAttribute('data-lang') ? selectedNode.getAttribute('data-lang') : ''; let currentCode = selectedNode.querySelector('textarea').textContent; - window.vues['code-editor'].open(currentCode, lang, (code, lang) => { + window.components.first('code-editor').open(currentCode, lang, (code, lang) => { const editorElem = selectedNode.querySelector('.CodeMirror'); const cmInstance = editorElem.CodeMirror; if (cmInstance) { @@ -236,7 +236,7 @@ function codePlugin() { }); } -function drawIoPlugin(drawioUrl, isDarkMode) { +function drawIoPlugin(drawioUrl, isDarkMode, pageId) { let pageEditor = null; let currentNode = null; @@ -270,7 +270,6 @@ function drawIoPlugin(drawioUrl, isDarkMode) { async function updateContent(pngData) { const id = "image-" + Math.random().toString(16).slice(2); const loadingImage = window.baseUrl('/loading.gif'); - const pageId = Number(document.getElementById('page-editor').getAttribute('page-id')); // Handle updating an existing image if (currentNode) { @@ -402,6 +401,11 @@ function listenForBookStackEditorEvents(editor) { editor.setContent(content); }); + // Insert editor content at the current location + window.$events.listen('editor::insert', ({html}) => { + editor.insertContent(html); + }); + // Focus on the editor window.$events.listen('editor::focus', () => { editor.focus(); @@ -410,19 +414,19 @@ function listenForBookStackEditorEvents(editor) { class WysiwygEditor { - constructor(elem) { - this.elem = elem; - const pageEditor = document.getElementById('page-editor'); - this.pageId = pageEditor.getAttribute('page-id'); - this.textDirection = pageEditor.getAttribute('text-direction'); + setup() { + this.elem = this.$el; + + this.pageId = this.$opts.pageId; + this.textDirection = this.$opts.textDirection; this.isDarkMode = document.documentElement.classList.contains('dark-mode'); - this.plugins = "image table textcolor paste link autolink fullscreen imagetools code customhr autosave lists codeeditor media"; + this.plugins = "image table textcolor paste link autolink fullscreen code customhr autosave lists codeeditor media"; this.loadPlugins(); this.tinyMceConfig = this.getTinyMceConfig(); - window.$events.emitPublic(elem, 'editor-tinymce::pre-init', {config: this.tinyMceConfig}); + window.$events.emitPublic(this.elem, 'editor-tinymce::pre-init', {config: this.tinyMceConfig}); window.tinymce.init(this.tinyMceConfig); } @@ -433,7 +437,7 @@ class WysiwygEditor { const drawioUrlElem = document.querySelector('[drawio-url]'); if (drawioUrlElem) { const url = drawioUrlElem.getAttribute('drawio-url'); - drawIoPlugin(url, this.isDarkMode); + drawIoPlugin(url, this.isDarkMode, this.pageId); this.plugins += ' drawio'; } @@ -639,6 +643,7 @@ class WysiwygEditor { }); + // Custom drop event handling editor.on('drop', function (event) { let dom = editor.dom, rng = tinymce.dom.RangeUtils.getCaretRangeFromPoint(event.clientX, event.clientY, editor.getDoc()); diff --git a/resources/js/index.js b/resources/js/index.js index e0c7b34e5..ffdb54e19 100644 --- a/resources/js/index.js +++ b/resources/js/index.js @@ -7,11 +7,10 @@ window.baseUrl = function(path) { }; // Set events and http services on window -import Events from "./services/events" +import events from "./services/events" import httpInstance from "./services/http" -const eventManager = new Events(); window.$http = httpInstance; -window.$events = eventManager; +window.$events = events; // Translation setup // Creates a global function with name 'trans' to be used in the same way as Laravel's translation system @@ -19,14 +18,8 @@ import Translations from "./services/translations" const translator = new Translations(); window.trans = translator.get.bind(translator); window.trans_choice = translator.getPlural.bind(translator); +window.trans_plural = translator.parsePlural.bind(translator); -// Make services available to Vue instances -import Vue from "vue" -Vue.prototype.$http = httpInstance; -Vue.prototype.$events = eventManager; - -// Load Vues and components -import vues from "./vues/vues" +// Load Components import components from "./components" -vues(); components(); \ No newline at end of file diff --git a/resources/js/services/dom.js b/resources/js/services/dom.js index 966a4540e..7a7b2c9bc 100644 --- a/resources/js/services/dom.js +++ b/resources/js/services/dom.js @@ -25,17 +25,42 @@ export function onEvents(listenerElement, events, callback) { /** * Helper to run an action when an element is selected. * A "select" is made to be accessible, So can be a click, space-press or enter-press. - * @param listenerElement - * @param callback + * @param {HTMLElement|Array} elements + * @param {function} callback */ -export function onSelect(listenerElement, callback) { - listenerElement.addEventListener('click', callback); - listenerElement.addEventListener('keydown', (event) => { - if (event.key === 'Enter' || event.key === ' ') { - event.preventDefault(); +export function onSelect(elements, callback) { + if (!Array.isArray(elements)) { + elements = [elements]; + } + + for (const listenerElement of elements) { + listenerElement.addEventListener('click', callback); + listenerElement.addEventListener('keydown', (event) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + callback(event); + } + }); + } +} + +/** + * Listen to enter press on the given element(s). + * @param {HTMLElement|Array} elements + * @param {function} callback + */ +export function onEnterPress(elements, callback) { + if (!Array.isArray(elements)) { + elements = [elements]; + } + + const listener = event => { + if (event.key === 'Enter') { callback(event); } - }); + } + + elements.forEach(e => e.addEventListener('keypress', listener)); } /** @@ -72,4 +97,24 @@ export function findText(selector, text) { } } return null; +} + +/** + * Show a loading indicator in the given element. + * This will effectively clear the element. + * @param {Element} element + */ +export function showLoading(element) { + element.innerHTML = `
    `; +} + +/** + * Remove any loading indicators within the given element. + * @param {Element} element + */ +export function removeLoading(element) { + const loadingEls = element.querySelectorAll('.loading-container'); + for (const el of loadingEls) { + el.remove(); + } } \ No newline at end of file diff --git a/resources/js/services/events.js b/resources/js/services/events.js index fa3ed7fdf..6668014e7 100644 --- a/resources/js/services/events.js +++ b/resources/js/services/events.js @@ -1,55 +1,66 @@ +const listeners = {}; +const stack = []; + /** - * Simple global events manager + * Emit a custom event for any handlers to pick-up. + * @param {String} eventName + * @param {*} eventData */ -class Events { - constructor() { - this.listeners = {}; - this.stack = []; - } - - /** - * Emit a custom event for any handlers to pick-up. - * @param {String} eventName - * @param {*} eventData - * @returns {Events} - */ - emit(eventName, eventData) { - this.stack.push({name: eventName, data: eventData}); - if (typeof this.listeners[eventName] === 'undefined') return this; - let eventsToStart = this.listeners[eventName]; - for (let i = 0; i < eventsToStart.length; i++) { - let event = eventsToStart[i]; - event(eventData); - } - return this; - } - - /** - * Listen to a custom event and run the given callback when that event occurs. - * @param {String} eventName - * @param {Function} callback - * @returns {Events} - */ - listen(eventName, callback) { - if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; - this.listeners[eventName].push(callback); - return this; - } - - /** - * Emit an event for public use. - * Sends the event via the native DOM event handling system. - * @param {Element} targetElement - * @param {String} eventName - * @param {Object} eventData - */ - emitPublic(targetElement, eventName, eventData) { - const event = new CustomEvent(eventName, { - detail: eventData, - bubbles: true - }); - targetElement.dispatchEvent(event); +function emit(eventName, eventData) { + stack.push({name: eventName, data: eventData}); + if (typeof listeners[eventName] === 'undefined') return this; + let eventsToStart = listeners[eventName]; + for (let i = 0; i < eventsToStart.length; i++) { + let event = eventsToStart[i]; + event(eventData); } } -export default Events; \ No newline at end of file +/** + * Listen to a custom event and run the given callback when that event occurs. + * @param {String} eventName + * @param {Function} callback + * @returns {Events} + */ +function listen(eventName, callback) { + if (typeof listeners[eventName] === 'undefined') listeners[eventName] = []; + listeners[eventName].push(callback); +} + +/** + * Emit an event for public use. + * Sends the event via the native DOM event handling system. + * @param {Element} targetElement + * @param {String} eventName + * @param {Object} eventData + */ +function emitPublic(targetElement, eventName, eventData) { + const event = new CustomEvent(eventName, { + detail: eventData, + bubbles: true + }); + targetElement.dispatchEvent(event); +} + +/** + * Notify of a http error. + * Check for standard scenarios such as validation errors and + * formats an error notification accordingly. + * @param {Error} error + */ +function showValidationErrors(error) { + if (!error.status) return; + if (error.status === 422 && error.data) { + const message = Object.values(error.data).flat().join('\n'); + emit('error', message); + } +} + +export default { + emit, + emitPublic, + listen, + success: (msg) => emit('success', msg), + error: (msg) => emit('error', msg), + showValidationErrors, +} \ No newline at end of file diff --git a/resources/js/services/http.js b/resources/js/services/http.js index 06dac9864..8ecd6c109 100644 --- a/resources/js/services/http.js +++ b/resources/js/services/http.js @@ -67,11 +67,23 @@ async function dataRequest(method, url, data = null) { body: data, }; + // Send data as JSON if a plain object if (typeof data === 'object' && !(data instanceof FormData)) { - options.headers = {'Content-Type': 'application/json'}; + options.headers = { + 'Content-Type': 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + }; options.body = JSON.stringify(data); } + // Ensure FormData instances are sent over POST + // Since Laravel does not read multipart/form-data from other types + // of request. Hence the addition of the magic _method value. + if (data instanceof FormData && method !== 'post') { + data.append('_method', method); + options.method = 'post'; + } + return request(url, options) } @@ -109,7 +121,7 @@ async function request(url, options = {}) { const response = await fetch(url, options); const content = await getResponseContent(response); - return { + const returnData = { data: content, headers: response.headers, redirected: response.redirected, @@ -117,7 +129,13 @@ async function request(url, options = {}) { statusText: response.statusText, url: response.url, original: response, + }; + + if (!response.ok) { + throw returnData; } + + return returnData; } /** diff --git a/resources/js/services/translations.js b/resources/js/services/translations.js index b595a05e6..62bb51f56 100644 --- a/resources/js/services/translations.js +++ b/resources/js/services/translations.js @@ -47,7 +47,19 @@ class Translator { */ getPlural(key, count, replacements) { const text = this.getTransText(key); - const splitText = text.split('|'); + return this.parsePlural(text, count, replacements); + } + + /** + * Parse the given translation and find the correct plural option + * to use. Similar format at laravel's 'trans_choice' helper. + * @param {String} translation + * @param {Number} count + * @param {Object} replacements + * @returns {String} + */ + parsePlural(translation, count, replacements) { + const splitText = translation.split('|'); const exactCountRegex = /^{([0-9]+)}/; const rangeRegex = /^\[([0-9]+),([0-9*]+)]/; let result = null; diff --git a/resources/js/services/util.js b/resources/js/services/util.js index b2f291872..de2ca20c1 100644 --- a/resources/js/services/util.js +++ b/resources/js/services/util.js @@ -45,4 +45,29 @@ export function scrollAndHighlightElement(element) { element.classList.remove('selectFade'); element.style.backgroundColor = ''; }, 3000); +} + +/** + * Escape any HTML in the given 'unsafe' string. + * Take from https://stackoverflow.com/a/6234804. + * @param {String} unsafe + * @returns {string} + */ +export function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +/** + * Generate a random unique ID. + * + * @returns {string} + */ +export function uniqueId() { + const S4 = () => (((1+Math.random())*0x10000)|0).toString(16).substring(1); + return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); } \ No newline at end of file diff --git a/resources/js/vues/attachment-manager.js b/resources/js/vues/attachment-manager.js deleted file mode 100644 index 2467c646d..000000000 --- a/resources/js/vues/attachment-manager.js +++ /dev/null @@ -1,142 +0,0 @@ -import draggable from "vuedraggable"; -import dropzone from "./components/dropzone"; - -function mounted() { - this.pageId = this.$el.getAttribute('page-id'); - this.file = this.newFile(); - - this.$http.get(window.baseUrl(`/attachments/get/page/${this.pageId}`)).then(resp => { - this.files = resp.data; - }).catch(err => { - this.checkValidationErrors('get', err); - }); -} - -let data = { - pageId: null, - files: [], - fileToEdit: null, - file: {}, - tab: 'list', - editTab: 'file', - errors: {link: {}, edit: {}, delete: {}} -}; - -const components = {dropzone, draggable}; - -let methods = { - - newFile() { - return {page_id: this.pageId}; - }, - - getFileUrl(file) { - if (file.external && file.path.indexOf('http') !== 0) { - return file.path; - } - return window.baseUrl(`/attachments/${file.id}`); - }, - - fileSortUpdate() { - this.$http.put(window.baseUrl(`/attachments/sort/page/${this.pageId}`), {files: this.files}).then(resp => { - this.$events.emit('success', resp.data.message); - }).catch(err => { - this.checkValidationErrors('sort', err); - }); - }, - - startEdit(file) { - this.fileToEdit = Object.assign({}, file); - this.fileToEdit.link = file.external ? file.path : ''; - this.editTab = file.external ? 'link' : 'file'; - }, - - deleteFile(file) { - if (!file.deleting) { - return this.$set(file, 'deleting', true); - } - - this.$http.delete(window.baseUrl(`/attachments/${file.id}`)).then(resp => { - this.$events.emit('success', resp.data.message); - this.files.splice(this.files.indexOf(file), 1); - }).catch(err => { - this.checkValidationErrors('delete', err) - }); - }, - - uploadSuccess(upload) { - this.files.push(upload.data); - this.$events.emit('success', trans('entities.attachments_file_uploaded')); - }, - - uploadSuccessUpdate(upload) { - let fileIndex = this.filesIndex(upload.data); - if (fileIndex === -1) { - this.files.push(upload.data) - } else { - this.files.splice(fileIndex, 1, upload.data); - } - - if (this.fileToEdit && this.fileToEdit.id === upload.data.id) { - this.fileToEdit = Object.assign({}, upload.data); - } - this.$events.emit('success', trans('entities.attachments_file_updated')); - }, - - checkValidationErrors(groupName, err) { - if (typeof err.response.data === "undefined" && typeof err.response.data === "undefined") return; - this.errors[groupName] = err.response.data; - }, - - getUploadUrl(file) { - let url = window.baseUrl(`/attachments/upload`); - if (typeof file !== 'undefined') url += `/${file.id}`; - return url; - }, - - cancelEdit() { - this.fileToEdit = null; - }, - - attachNewLink(file) { - file.uploaded_to = this.pageId; - this.errors.link = {}; - this.$http.post(window.baseUrl('/attachments/link'), file).then(resp => { - this.files.push(resp.data); - this.file = this.newFile(); - this.$events.emit('success', trans('entities.attachments_link_attached')); - }).catch(err => { - this.checkValidationErrors('link', err); - }); - }, - - updateFile(file) { - $http.put(window.baseUrl(`/attachments/${file.id}`), file).then(resp => { - let search = this.filesIndex(resp.data); - if (search === -1) { - this.files.push(resp.data); - } else { - this.files.splice(search, 1, resp.data); - } - - if (this.fileToEdit && !file.external) this.fileToEdit.link = ''; - this.fileToEdit = false; - - this.$events.emit('success', trans('entities.attachments_updated_success')); - }).catch(err => { - this.checkValidationErrors('edit', err); - }); - }, - - filesIndex(file) { - for (let i = 0, len = this.files.length; i < len; i++) { - if (this.files[i].id === file.id) return i; - } - return -1; - } - -}; - -export default { - data, methods, mounted, components, -}; \ No newline at end of file diff --git a/resources/js/vues/code-editor.js b/resources/js/vues/code-editor.js deleted file mode 100644 index f888e6227..000000000 --- a/resources/js/vues/code-editor.js +++ /dev/null @@ -1,46 +0,0 @@ -import codeLib from "../services/code"; - -const methods = { - show() { - if (!this.editor) this.editor = codeLib.popupEditor(this.$refs.editor, this.language); - this.$refs.overlay.components.overlay.show(() => { - codeLib.updateLayout(this.editor); - this.editor.focus(); - }); - }, - hide() { - this.$refs.overlay.components.overlay.hide(); - }, - updateEditorMode(language) { - codeLib.setMode(this.editor, language, this.editor.getValue()); - }, - updateLanguage(lang) { - this.language = lang; - this.updateEditorMode(lang); - }, - open(code, language, callback) { - this.show(); - this.updateEditorMode(language); - this.language = language; - codeLib.setContent(this.editor, code); - this.code = code; - this.callback = callback; - }, - save() { - if (!this.callback) return; - this.callback(this.editor.getValue(), this.language); - this.hide(); - } -}; - -const data = { - editor: null, - language: '', - code: '', - callback: null -}; - -export default { - methods, - data -}; \ No newline at end of file diff --git a/resources/js/vues/components/autosuggest.js b/resources/js/vues/components/autosuggest.js deleted file mode 100644 index 9832a9eb4..000000000 --- a/resources/js/vues/components/autosuggest.js +++ /dev/null @@ -1,131 +0,0 @@ - -const template = ` -
    - -
      -
    • {{suggestion}}
    • -
    -
    -`; - -function data() { - return { - suggestions: [], - showSuggestions: false, - active: 0, - }; -} - -const ajaxCache = {}; - -const props = ['url', 'type', 'value', 'placeholder', 'name']; - -function getNameInputVal(valInput) { - let parentRow = valInput.parentNode.parentNode; - let nameInput = parentRow.querySelector('[autosuggest-type="name"]'); - return (nameInput === null) ? '' : nameInput.value; -} - -const methods = { - - inputUpdate(inputValue) { - this.$emit('input', inputValue); - let params = {}; - - if (this.type === 'value') { - let nameVal = getNameInputVal(this.$el); - if (nameVal !== "") params.name = nameVal; - } - - this.getSuggestions(inputValue.slice(0, 3), params).then(suggestions => { - if (inputValue.length === 0) { - this.displaySuggestions(suggestions.slice(0, 6)); - return; - } - // Filter to suggestions containing searched term - suggestions = suggestions.filter(item => { - return item.toLowerCase().indexOf(inputValue.toLowerCase()) !== -1; - }).slice(0, 4); - this.displaySuggestions(suggestions); - }); - }, - - inputBlur() { - setTimeout(() => { - this.$emit('blur'); - this.showSuggestions = false; - }, 100); - }, - - inputKeydown(event) { - if (event.key === 'Enter') event.preventDefault(); - if (!this.showSuggestions) return; - - // Down arrow - if (event.key === 'ArrowDown') { - this.active = (this.active === this.suggestions.length - 1) ? 0 : this.active+1; - } - // Up Arrow - else if (event.key === 'ArrowUp') { - this.active = (this.active === 0) ? this.suggestions.length - 1 : this.active-1; - } - // Enter key - else if ((event.key === 'Enter') && !event.shiftKey) { - this.selectSuggestion(this.suggestions[this.active]); - } - // Escape key - else if (event.key === 'Escape') { - this.showSuggestions = false; - } - }, - - displaySuggestions(suggestions) { - if (suggestions.length === 0) { - this.suggestions = []; - this.showSuggestions = false; - return; - } - - this.suggestions = suggestions; - this.showSuggestions = true; - this.active = 0; - }, - - selectSuggestion(suggestion) { - this.$refs.input.value = suggestion; - this.$refs.input.focus(); - this.$emit('input', suggestion); - this.showSuggestions = false; - }, - - /** - * Get suggestions from BookStack. Store and use local cache if already searched. - * @param {String} input - * @param {Object} params - */ - getSuggestions(input, params) { - params.search = input; - const cacheKey = `${this.url}:${JSON.stringify(params)}`; - - if (typeof ajaxCache[cacheKey] !== "undefined") { - return Promise.resolve(ajaxCache[cacheKey]); - } - - return this.$http.get(this.url, params).then(resp => { - ajaxCache[cacheKey] = resp.data; - return resp.data; - }); - } - -}; - -export default {template, data, props, methods}; \ No newline at end of file diff --git a/resources/js/vues/components/dropzone.js b/resources/js/vues/components/dropzone.js deleted file mode 100644 index 1c045727f..000000000 --- a/resources/js/vues/components/dropzone.js +++ /dev/null @@ -1,80 +0,0 @@ -import DropZone from "dropzone"; -import { fadeOut } from "../../services/animations"; - -const template = ` -
    - -
    -`; - -const props = ['placeholder', 'uploadUrl', 'uploadedTo']; - -function mounted() { - const container = this.$el; - const _this = this; - this._dz = new DropZone(container, { - addRemoveLinks: true, - dictRemoveFile: trans('components.image_upload_remove'), - timeout: Number(window.uploadTimeout) || 60000, - maxFilesize: Number(window.uploadLimit) || 256, - url: function() { - return _this.uploadUrl; - }, - init: function () { - const dz = this; - - dz.on('sending', function (file, xhr, data) { - const token = window.document.querySelector('meta[name=token]').getAttribute('content'); - data.append('_token', token); - const uploadedTo = typeof _this.uploadedTo === 'undefined' ? 0 : _this.uploadedTo; - data.append('uploaded_to', uploadedTo); - - xhr.ontimeout = function (e) { - dz.emit('complete', file); - dz.emit('error', file, trans('errors.file_upload_timeout')); - } - }); - - dz.on('success', function (file, data) { - _this.$emit('success', {file, data}); - fadeOut(file.previewElement, 800, () => { - dz.removeFile(file); - }); - }); - - dz.on('error', function (file, errorMessage, xhr) { - _this.$emit('error', {file, errorMessage, xhr}); - - function setMessage(message) { - const messsageEl = file.previewElement.querySelector('[data-dz-errormessage]'); - messsageEl.textContent = message; - } - - if (xhr && xhr.status === 413) { - setMessage(trans('errors.server_upload_limit')) - } else if (errorMessage.file) { - setMessage(errorMessage.file); - } - - }); - } - }); -} - -function data() { - return {}; -} - -const methods = { - onClose: function () { - this._dz.removeAllFiles(true); - } -}; - -export default { - template, - props, - mounted, - data, - methods -}; diff --git a/resources/js/vues/entity-dashboard.js b/resources/js/vues/entity-dashboard.js deleted file mode 100644 index d10da7000..000000000 --- a/resources/js/vues/entity-dashboard.js +++ /dev/null @@ -1,44 +0,0 @@ -let data = { - id: null, - type: '', - searching: false, - searchTerm: '', - searchResults: '', -}; - -let computed = { - -}; - -let methods = { - - searchBook() { - if (this.searchTerm.trim().length === 0) return; - this.searching = true; - this.searchResults = ''; - let url = window.baseUrl(`/search/${this.type}/${this.id}`); - url += `?term=${encodeURIComponent(this.searchTerm)}`; - this.$http.get(url).then(resp => { - this.searchResults = resp.data; - }); - }, - - checkSearchForm() { - this.searching = this.searchTerm > 0; - }, - - clearSearch() { - this.searching = false; - this.searchTerm = ''; - } - -}; - -function mounted() { - this.id = Number(this.$el.getAttribute('entity-id')); - this.type = this.$el.getAttribute('entity-type'); -} - -export default { - data, computed, methods, mounted -}; \ No newline at end of file diff --git a/resources/js/vues/image-manager.js b/resources/js/vues/image-manager.js deleted file mode 100644 index 6df12d16d..000000000 --- a/resources/js/vues/image-manager.js +++ /dev/null @@ -1,204 +0,0 @@ -import * as Dates from "../services/dates"; -import dropzone from "./components/dropzone"; - -let page = 1; -let previousClickTime = 0; -let previousClickImage = 0; -let dataLoaded = false; -let callback = false; -let baseUrl = ''; - -let preSearchImages = []; -let preSearchHasMore = false; - -const data = { - images: [], - - imageType: false, - uploadedTo: false, - - selectedImage: false, - dependantPages: false, - showing: false, - filter: null, - hasMore: false, - searching: false, - searchTerm: '', - - imageUpdateSuccess: false, - imageDeleteSuccess: false, - deleteConfirm: false, -}; - -const methods = { - - show(providedCallback, imageType = null) { - callback = providedCallback; - this.showing = true; - this.$el.children[0].components.overlay.show(); - - // Get initial images if they have not yet been loaded in. - if (dataLoaded && imageType === this.imageType) return; - if (imageType) { - this.imageType = imageType; - this.resetState(); - } - this.fetchData(); - dataLoaded = true; - }, - - hide() { - if (this.$refs.dropzone) { - this.$refs.dropzone.onClose(); - } - this.showing = false; - this.selectedImage = false; - this.$el.children[0].components.overlay.hide(); - }, - - async fetchData() { - const params = { - page, - search: this.searching ? this.searchTerm : null, - uploaded_to: this.uploadedTo || null, - filter_type: this.filter, - }; - - const {data} = await this.$http.get(baseUrl, params); - this.images = this.images.concat(data.images); - this.hasMore = data.has_more; - page++; - }, - - setFilterType(filterType) { - this.filter = filterType; - this.resetState(); - this.fetchData(); - }, - - resetState() { - this.cancelSearch(); - this.resetListView(); - this.deleteConfirm = false; - baseUrl = window.baseUrl(`/images/${this.imageType}`); - }, - - resetListView() { - this.images = []; - this.hasMore = false; - page = 1; - }, - - searchImages() { - if (this.searchTerm === '') return this.cancelSearch(); - - // Cache current settings for later - if (!this.searching) { - preSearchImages = this.images; - preSearchHasMore = this.hasMore; - } - - this.searching = true; - this.resetListView(); - this.fetchData(); - }, - - cancelSearch() { - if (!this.searching) return; - this.searching = false; - this.searchTerm = ''; - this.images = preSearchImages; - this.hasMore = preSearchHasMore; - }, - - imageSelect(image) { - const dblClickTime = 300; - const currentTime = Date.now(); - const timeDiff = currentTime - previousClickTime; - const isDblClick = timeDiff < dblClickTime && image.id === previousClickImage; - - if (isDblClick) { - this.callbackAndHide(image); - } else { - this.selectedImage = image; - this.deleteConfirm = false; - this.dependantPages = false; - } - - previousClickTime = currentTime; - previousClickImage = image.id; - }, - - callbackAndHide(imageResult) { - if (callback) callback(imageResult); - this.hide(); - }, - - async saveImageDetails() { - let url = window.baseUrl(`/images/${this.selectedImage.id}`); - try { - await this.$http.put(url, this.selectedImage) - } catch (error) { - if (error.response.status === 422) { - let errors = error.response.data; - let message = ''; - Object.keys(errors).forEach((key) => { - message += errors[key].join('\n'); - }); - this.$events.emit('error', message); - } - } - }, - - async deleteImage() { - - if (!this.deleteConfirm) { - const url = window.baseUrl(`/images/usage/${this.selectedImage.id}`); - try { - const {data} = await this.$http.get(url); - this.dependantPages = data; - } catch (error) { - console.error(error); - } - this.deleteConfirm = true; - return; - } - - const url = window.baseUrl(`/images/${this.selectedImage.id}`); - await this.$http.delete(url); - this.images.splice(this.images.indexOf(this.selectedImage), 1); - this.selectedImage = false; - this.$events.emit('success', trans('components.image_delete_success')); - this.deleteConfirm = false; - }, - - getDate(stringDate) { - return Dates.formatDateTime(new Date(stringDate)); - }, - - uploadSuccess(event) { - this.images.unshift(event.data); - this.$events.emit('success', trans('components.image_upload_success')); - }, -}; - -const computed = { - uploadUrl() { - return window.baseUrl(`/images/${this.imageType}`); - } -}; - -function mounted() { - window.ImageManager = this; - this.imageType = this.$el.getAttribute('image-type'); - this.uploadedTo = this.$el.getAttribute('uploaded-to'); - baseUrl = window.baseUrl('/images/' + this.imageType) -} - -export default { - mounted, - methods, - data, - computed, - components: {dropzone}, -}; diff --git a/resources/js/vues/page-editor.js b/resources/js/vues/page-editor.js deleted file mode 100644 index a79ad2049..000000000 --- a/resources/js/vues/page-editor.js +++ /dev/null @@ -1,167 +0,0 @@ -import * as Dates from "../services/dates"; - -let autoSaveFrequency = 30; - -let autoSave = false; -let draftErroring = false; - -let currentContent = { - title: false, - html: false -}; - -let lastSave = 0; - -function mounted() { - let elem = this.$el; - this.draftsEnabled = elem.getAttribute('drafts-enabled') === 'true'; - this.editorType = elem.getAttribute('editor-type'); - this.pageId= Number(elem.getAttribute('page-id')); - this.isNewDraft = Number(elem.getAttribute('page-new-draft')) === 1; - this.isUpdateDraft = Number(elem.getAttribute('page-update-draft')) === 1; - this.titleElem = elem.querySelector('input[name=name]'); - this.hasDefaultTitle = this.titleElem.closest('[is-default-value]') !== null; - - if (this.pageId !== 0 && this.draftsEnabled) { - window.setTimeout(() => { - this.startAutoSave(); - }, 1000); - } - - if (this.isUpdateDraft || this.isNewDraft) { - this.draftText = trans('entities.pages_editing_draft'); - } else { - this.draftText = trans('entities.pages_editing_page'); - } - - // Listen to save events from editor - window.$events.listen('editor-save-draft', this.saveDraft); - window.$events.listen('editor-save-page', this.savePage); - - // Listen to content changes from the editor - window.$events.listen('editor-html-change', html => { - this.editorHTML = html; - }); - window.$events.listen('editor-markdown-change', markdown => { - this.editorMarkdown = markdown; - }); - - this.setInitialFocus(); -} - -let data = { - draftsEnabled: false, - editorType: 'wysiwyg', - pagedId: 0, - isNewDraft: false, - isUpdateDraft: false, - - draftText: '', - draftUpdated : false, - changeSummary: '', - - editorHTML: '', - editorMarkdown: '', - - hasDefaultTitle: false, - titleElem: null, -}; - -let methods = { - - setInitialFocus() { - if (this.hasDefaultTitle) { - this.titleElem.select(); - } else { - window.setTimeout(() => { - this.$events.emit('editor::focus', ''); - }, 500); - } - }, - - startAutoSave() { - currentContent.title = this.titleElem.value.trim(); - currentContent.html = this.editorHTML; - - autoSave = window.setInterval(() => { - // Return if manually saved recently to prevent bombarding the server - if (Date.now() - lastSave < (1000 * autoSaveFrequency)/2) return; - const newTitle = this.titleElem.value.trim(); - const newHtml = this.editorHTML; - - if (newTitle !== currentContent.title || newHtml !== currentContent.html) { - currentContent.html = newHtml; - currentContent.title = newTitle; - this.saveDraft(); - } - - }, 1000 * autoSaveFrequency); - }, - - saveDraft() { - if (!this.draftsEnabled) return; - - const data = { - name: this.titleElem.value.trim(), - html: this.editorHTML - }; - - if (this.editorType === 'markdown') data.markdown = this.editorMarkdown; - - const url = window.baseUrl(`/ajax/page/${this.pageId}/save-draft`); - window.$http.put(url, data).then(response => { - draftErroring = false; - if (!this.isNewDraft) this.isUpdateDraft = true; - this.draftNotifyChange(`${response.data.message} ${Dates.utcTimeStampToLocalTime(response.data.timestamp)}`); - lastSave = Date.now(); - }, errorRes => { - if (draftErroring) return; - window.$events.emit('error', trans('errors.page_draft_autosave_fail')); - draftErroring = true; - }); - }, - - savePage() { - this.$el.closest('form').submit(); - }, - - draftNotifyChange(text) { - this.draftText = text; - this.draftUpdated = true; - window.setTimeout(() => { - this.draftUpdated = false; - }, 2000); - }, - - discardDraft() { - let url = window.baseUrl(`/ajax/page/${this.pageId}`); - window.$http.get(url).then(response => { - if (autoSave) window.clearInterval(autoSave); - - this.draftText = trans('entities.pages_editing_page'); - this.isUpdateDraft = false; - window.$events.emit('editor-html-update', response.data.html); - window.$events.emit('editor-markdown-update', response.data.markdown || response.data.html); - - this.titleElem.value = response.data.name; - window.setTimeout(() => { - this.startAutoSave(); - }, 1000); - window.$events.emit('success', trans('entities.pages_draft_discarded')); - }); - }, - -}; - -let computed = { - changeSummaryShort() { - let len = this.changeSummary.length; - if (len === 0) return trans('entities.pages_edit_set_changelog'); - if (len <= 16) return this.changeSummary; - return this.changeSummary.slice(0, 16) + '...'; - } -}; - -export default { - mounted, data, methods, computed, -}; \ No newline at end of file diff --git a/resources/js/vues/search.js b/resources/js/vues/search.js deleted file mode 100644 index c0b828b96..000000000 --- a/resources/js/vues/search.js +++ /dev/null @@ -1,193 +0,0 @@ -import * as Dates from "../services/dates"; - -let data = { - terms: '', - termString : '', - search: { - type: { - page: true, - chapter: true, - book: true, - bookshelf: true, - }, - exactTerms: [], - tagTerms: [], - option: {}, - dates: { - updated_after: false, - updated_before: false, - created_after: false, - created_before: false, - } - } -}; - -let computed = { - -}; - -let methods = { - - appendTerm(term) { - this.termString += ' ' + term; - this.termString = this.termString.replace(/\s{2,}/g, ' '); - this.termString = this.termString.replace(/^\s+/, ''); - this.termString = this.termString.replace(/\s+$/, ''); - }, - - exactParse(searchString) { - this.search.exactTerms = []; - let exactFilter = /"(.+?)"/g; - let matches; - while ((matches = exactFilter.exec(searchString)) !== null) { - this.search.exactTerms.push(matches[1]); - } - }, - - exactChange() { - let exactFilter = /"(.+?)"/g; - this.termString = this.termString.replace(exactFilter, ''); - let matchesTerm = this.search.exactTerms.filter(term => term.trim() !== '').map(term => `"${term}"`).join(' '); - this.appendTerm(matchesTerm); - }, - - addExact() { - this.search.exactTerms.push(''); - setTimeout(() => { - let exactInputs = document.querySelectorAll('.exact-input'); - exactInputs[exactInputs.length - 1].focus(); - }, 100); - }, - - removeExact(index) { - this.search.exactTerms.splice(index, 1); - this.exactChange(); - }, - - tagParse(searchString) { - this.search.tagTerms = []; - let tagFilter = /\[(.+?)\]/g; - let matches; - while ((matches = tagFilter.exec(searchString)) !== null) { - this.search.tagTerms.push(matches[1]); - } - }, - - tagChange() { - let tagFilter = /\[(.+?)\]/g; - this.termString = this.termString.replace(tagFilter, ''); - let matchesTerm = this.search.tagTerms.filter(term => { - return term.trim() !== ''; - }).map(term => { - return `[${term}]` - }).join(' '); - this.appendTerm(matchesTerm); - }, - - addTag() { - this.search.tagTerms.push(''); - setTimeout(() => { - let tagInputs = document.querySelectorAll('.tag-input'); - tagInputs[tagInputs.length - 1].focus(); - }, 100); - }, - - removeTag(index) { - this.search.tagTerms.splice(index, 1); - this.tagChange(); - }, - - typeParse(searchString) { - let typeFilter = /{\s?type:\s?(.*?)\s?}/; - let match = searchString.match(typeFilter); - let type = this.search.type; - if (!match) { - type.page = type.book = type.chapter = type.bookshelf = true; - return; - } - let splitTypes = match[1].replace(/ /g, '').split('|'); - type.page = (splitTypes.indexOf('page') !== -1); - type.chapter = (splitTypes.indexOf('chapter') !== -1); - type.book = (splitTypes.indexOf('book') !== -1); - type.bookshelf = (splitTypes.indexOf('bookshelf') !== -1); - }, - - typeChange() { - let typeFilter = /{\s?type:\s?(.*?)\s?}/; - let type = this.search.type; - if (type.page === type.chapter === type.book === type.bookshelf) { - this.termString = this.termString.replace(typeFilter, ''); - return; - } - let selectedTypes = Object.keys(type).filter(type => this.search.type[type]).join('|'); - let typeTerm = '{type:'+selectedTypes+'}'; - if (this.termString.match(typeFilter)) { - this.termString = this.termString.replace(typeFilter, typeTerm); - return; - } - this.appendTerm(typeTerm); - }, - - optionParse(searchString) { - let optionFilter = /{([a-z_\-:]+?)}/gi; - let matches; - while ((matches = optionFilter.exec(searchString)) !== null) { - this.search.option[matches[1].toLowerCase()] = true; - } - }, - - optionChange(optionName) { - let isChecked = this.search.option[optionName]; - if (isChecked) { - this.appendTerm(`{${optionName}}`); - } else { - this.termString = this.termString.replace(`{${optionName}}`, ''); - } - }, - - updateSearch(e) { - e.preventDefault(); - window.location = window.baseUrl('/search?term=' + encodeURIComponent(this.termString)); - }, - - enableDate(optionName) { - this.search.dates[optionName.toLowerCase()] = Dates.getCurrentDay(); - this.dateChange(optionName); - }, - - dateParse(searchString) { - let dateFilter = /{([a-z_\-]+?):([a-z_\-0-9]+?)}/gi; - let dateTags = Object.keys(this.search.dates); - let matches; - while ((matches = dateFilter.exec(searchString)) !== null) { - if (dateTags.indexOf(matches[1]) === -1) continue; - this.search.dates[matches[1].toLowerCase()] = matches[2]; - } - }, - - dateChange(optionName) { - let dateFilter = new RegExp('{\\s?'+optionName+'\\s?:([a-z_\\-0-9]+?)}', 'gi'); - this.termString = this.termString.replace(dateFilter, ''); - if (!this.search.dates[optionName]) return; - this.appendTerm(`{${optionName}:${this.search.dates[optionName]}}`); - }, - - dateRemove(optionName) { - this.search.dates[optionName] = false; - this.dateChange(optionName); - } - -}; - -function created() { - this.termString = document.querySelector('[name=searchTerm]').value; - this.typeParse(this.termString); - this.exactParse(this.termString); - this.tagParse(this.termString); - this.optionParse(this.termString); - this.dateParse(this.termString); -} - -export default { - data, computed, methods, created -}; diff --git a/resources/js/vues/tag-manager.js b/resources/js/vues/tag-manager.js deleted file mode 100644 index 65233cbb6..000000000 --- a/resources/js/vues/tag-manager.js +++ /dev/null @@ -1,68 +0,0 @@ -import draggable from 'vuedraggable'; -import autosuggest from './components/autosuggest'; - -const data = { - entityId: false, - entityType: null, - tags: [], -}; - -const components = {draggable, autosuggest}; -const directives = {}; - -const methods = { - - addEmptyTag() { - this.tags.push({name: '', value: '', key: Math.random().toString(36).substring(7)}); - }, - - /** - * When an tag changes check if another empty editable field needs to be added onto the end. - * @param tag - */ - tagChange(tag) { - let tagPos = this.tags.indexOf(tag); - if (tagPos === this.tags.length-1 && (tag.name !== '' || tag.value !== '')) this.addEmptyTag(); - }, - - /** - * When an tag field loses focus check the tag to see if its - * empty and therefore could be removed from the list. - * @param tag - */ - tagBlur(tag) { - let isLast = (this.tags.indexOf(tag) === this.tags.length-1); - if (tag.name !== '' || tag.value !== '' || isLast) return; - let cPos = this.tags.indexOf(tag); - this.tags.splice(cPos, 1); - }, - - removeTag(tag) { - let tagPos = this.tags.indexOf(tag); - if (tagPos === -1) return; - this.tags.splice(tagPos, 1); - }, - - getTagFieldName(index, key) { - return `tags[${index}][${key}]`; - }, -}; - -function mounted() { - this.entityId = Number(this.$el.getAttribute('entity-id')); - this.entityType = this.$el.getAttribute('entity-type'); - - let url = window.baseUrl(`/ajax/tags/get/${this.entityType}/${this.entityId}`); - this.$http.get(url).then(response => { - let tags = response.data; - for (let i = 0, len = tags.length; i < len; i++) { - tags[i].key = Math.random().toString(36).substring(7); - } - this.tags = tags; - this.addEmptyTag(); - }); -} - -export default { - data, methods, mounted, components, directives -}; \ No newline at end of file diff --git a/resources/js/vues/vues.js b/resources/js/vues/vues.js deleted file mode 100644 index ec192372d..000000000 --- a/resources/js/vues/vues.js +++ /dev/null @@ -1,40 +0,0 @@ -import Vue from "vue"; - -function exists(id) { - return document.getElementById(id) !== null; -} - -import searchSystem from "./search"; -import entityDashboard from "./entity-dashboard"; -import codeEditor from "./code-editor"; -import imageManager from "./image-manager"; -import tagManager from "./tag-manager"; -import attachmentManager from "./attachment-manager"; -import pageEditor from "./page-editor"; - -let vueMapping = { - 'search-system': searchSystem, - 'entity-dashboard': entityDashboard, - 'code-editor': codeEditor, - 'image-manager': imageManager, - 'tag-manager': tagManager, - 'attachment-manager': attachmentManager, - 'page-editor': pageEditor, -}; - -window.vues = {}; - -function load() { - let ids = Object.keys(vueMapping); - for (let i = 0, len = ids.length; i < len; i++) { - if (!exists(ids[i])) continue; - let config = vueMapping[ids[i]]; - config.el = '#' + ids[i]; - window.vues[ids[i]] = new Vue(config); - } -} - -export default load; - - - diff --git a/resources/lang/ar/activities.php b/resources/lang/ar/activities.php index 348eba398..d7c8ed798 100644 --- a/resources/lang/ar/activities.php +++ b/resources/lang/ar/activities.php @@ -36,7 +36,7 @@ return [ 'book_sort_notification' => 'تمت إعادة سرد الكتاب بنجاح', // Bookshelves - 'bookshelf_create' => 'created Bookshelf', + 'bookshelf_create' => 'تم إنشاء رف الكتب', 'bookshelf_create_notification' => 'Bookshelf Successfully Created', 'bookshelf_update' => 'updated bookshelf', 'bookshelf_update_notification' => 'Bookshelf Successfully Updated', diff --git a/resources/lang/ar/common.php b/resources/lang/ar/common.php index 193844390..220b54892 100644 --- a/resources/lang/ar/common.php +++ b/resources/lang/ar/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'نسخ', 'reply' => 'رد', 'delete' => 'حذف', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'بحث', 'search_clear' => 'مسح البحث', 'reset' => 'إعادة تعيين', diff --git a/resources/lang/ar/components.php b/resources/lang/ar/components.php index aa3935bd9..74d9bcdc7 100644 --- a/resources/lang/ar/components.php +++ b/resources/lang/ar/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'المزيد', 'image_image_name' => 'اسم الصورة', 'image_delete_used' => 'هذه الصورة مستخدمة بالصفحات أدناه.', - 'image_delete_confirm' => 'اضغط زر الحذف مرة أخرى لتأكيد حذف هذه الصورة.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'تحديد الصورة', 'image_dropzone' => 'قم بإسقاط الصورة أو اضغط هنا للرفع', 'images_deleted' => 'تم حذف الصور', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'تعديل الشفرة', 'code_language' => 'لغة الشفرة', 'code_content' => 'محتويات الشفرة', + 'code_session_history' => 'Session History', 'code_save' => 'حفظ الشفرة', ]; diff --git a/resources/lang/ar/entities.php b/resources/lang/ar/entities.php index 9278c8cf3..31835cb32 100644 --- a/resources/lang/ar/entities.php +++ b/resources/lang/ar/entities.php @@ -11,7 +11,7 @@ return [ 'recently_updated_pages' => 'صفحات حُدثت مؤخراً', 'recently_created_chapters' => 'فصول أنشئت مؤخراً', 'recently_created_books' => 'كتب أنشئت مؤخراً', - 'recently_created_shelves' => 'Recently Created Shelves', + 'recently_created_shelves' => 'الأرفف المنشأة مؤخراً', 'recently_update' => 'حُدثت مؤخراً', 'recently_viewed' => 'عُرضت مؤخراً', 'recent_activity' => 'نشاطات حديثة', @@ -47,17 +47,18 @@ return [ 'search_no_pages' => 'لم يطابق بحثكم أي صفحة', 'search_for_term' => 'ابحث عن :term', 'search_more' => 'المزيد من النتائج', - 'search_filters' => 'تصفية البحث', + 'search_advanced' => 'بحث مفصل', + 'search_terms' => 'البحث باستخدام المصطلحات', 'search_content_type' => 'نوع المحتوى', 'search_exact_matches' => 'نتائج مطابقة تماماً', 'search_tags' => 'بحث الوسوم', - 'search_options' => 'Options', + 'search_options' => 'الخيارات', 'search_viewed_by_me' => 'تم استعراضها من قبلي', 'search_not_viewed_by_me' => 'لم يتم استعراضها من قبلي', 'search_permissions_set' => 'حزمة الأذونات', 'search_created_by_me' => 'أنشئت بواسطتي', 'search_updated_by_me' => 'حُدثت بواسطتي', - 'search_date_options' => 'Date Options', + 'search_date_options' => 'خيارات التاريخ', 'search_updated_before' => 'حدثت قبل', 'search_updated_after' => 'حدثت بعد', 'search_created_before' => 'أنشئت قبل', @@ -66,22 +67,22 @@ return [ 'search_update' => 'تحديث البحث', // Shelves - 'shelf' => 'Shelf', - 'shelves' => 'Shelves', - 'x_shelves' => ':count Shelf|:count Shelves', - 'shelves_long' => 'Bookshelves', - 'shelves_empty' => 'No shelves have been created', - 'shelves_create' => 'Create New Shelf', + 'shelf' => 'رف', + 'shelves' => 'الأرفف', + 'x_shelves' => ':count رف|:count أرفف', + 'shelves_long' => 'أرفف الكتب', + 'shelves_empty' => 'لم يتم إنشاء أي أرفف', + 'shelves_create' => 'إنشاء رف جديد', 'shelves_popular' => 'Popular Shelves', - 'shelves_new' => 'New Shelves', - 'shelves_new_action' => 'New Shelf', + 'shelves_new' => 'أرفف جديدة', + 'shelves_new_action' => 'رف جديد', 'shelves_popular_empty' => 'The most popular shelves will appear here.', 'shelves_new_empty' => 'The most recently created shelves will appear here.', - 'shelves_save' => 'Save Shelf', + 'shelves_save' => 'حفظ الرف', 'shelves_books' => 'Books on this shelf', - 'shelves_add_books' => 'Add books to this shelf', - 'shelves_drag_books' => 'Drag books here to add them to this shelf', - 'shelves_empty_contents' => 'This shelf has no books assigned to it', + 'shelves_add_books' => 'إضافة كتب لهذا الرف', + 'shelves_drag_books' => 'اسحب الكتب هنا لإضافتها لهذا الرف', + 'shelves_empty_contents' => 'لا توجد كتب مخصصة لهذا الرف', 'shelves_edit_and_assign' => 'Edit shelf to assign books', 'shelves_edit_named' => 'Edit Bookshelf :name', 'shelves_edit' => 'Edit Bookshelf', @@ -99,13 +100,13 @@ return [ // Books 'book' => 'كتاب', - 'books' => 'كتب', + 'books' => 'الكتب', 'x_books' => ':count كتاب|:count كتب', 'books_empty' => 'لم يتم إنشاء أي كتب', 'books_popular' => 'كتب رائجة', 'books_recent' => 'كتب حديثة', 'books_new' => 'كتب جديدة', - 'books_new_action' => 'New Book', + 'books_new_action' => 'كتاب جديد', 'books_popular_empty' => 'الكتب الأكثر رواجاً ستظهر هنا.', 'books_new_empty' => 'الكتب المنشأة مؤخراً ستظهر هنا.', 'books_create' => 'إنشاء كتاب جديد', @@ -128,8 +129,8 @@ return [ 'books_navigation' => 'تصفح الكتاب', 'books_sort' => 'فرز محتويات الكتاب', 'books_sort_named' => 'فرز كتاب :bookName', - 'books_sort_name' => 'Sort by Name', - 'books_sort_created' => 'Sort by Created Date', + 'books_sort_name' => 'ترتيب حسب الإسم', + 'books_sort_created' => 'ترتيب حسب تاريخ الإنشاء', 'books_sort_updated' => 'Sort by Updated Date', 'books_sort_chapters_first' => 'Chapters First', 'books_sort_chapters_last' => 'Chapters Last', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'رفع ملف', 'attachments_link' => 'إرفاق رابط', 'attachments_set_link' => 'تحديد الرابط', - 'attachments_delete_confirm' => 'اضغط على زر الحذف مرة أخرى لتأكيد حذف المرفق.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'أسقط الملفات أو اضغط هنا لإرفاق ملف', 'attachments_no_files' => 'لم يتم رفع أي ملفات', 'attachments_explain_link' => 'بالإمكان إرفاق رابط في حال عدم تفضيل رفع ملف. قد يكون الرابط لصفحة أخرى أو لملف في أحد خدمات التخزين السحابي.', @@ -263,7 +264,8 @@ return [ 'attachment_link' => 'رابط المرفق', 'attachments_link_url' => 'Link to file', 'attachments_link_url_hint' => 'رابط الموقع أو الملف', - 'attach' => 'Attach', + 'attach' => 'إرفاق', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'تعديل الملف', 'attachments_edit_file_name' => 'اسم الملف', 'attachments_edit_drop_upload' => 'أسقط الملفات أو اضغط هنا للرفع والاستبدال', @@ -273,10 +275,10 @@ return [ 'attachments_file_uploaded' => 'تم رفع الملف بنجاح', 'attachments_file_updated' => 'تم تحديث الملف بنجاح', 'attachments_link_attached' => 'تم إرفاق الرابط بالصفحة بنجاح', - 'templates' => 'Templates', - 'templates_set_as_template' => 'Page is a template', - 'templates_explain_set_as_template' => 'You can set this page as a template so its contents be utilized when creating other pages. Other users will be able to use this template if they have view permissions for this page.', - 'templates_replace_content' => 'Replace page content', + 'templates' => 'القوالب', + 'templates_set_as_template' => 'هذه الصفحة عبارة عن قالب', + 'templates_explain_set_as_template' => 'يمكنك تعيين هذه الصفحة كقالب بحيث تستخدم محتوياتها عند إنشاء صفحات أخرى. سيتمكن المستخدمون الآخرون من استخدام هذا القالب إذا كان لديهم أذونات عرض لهذه الصفحة.', + 'templates_replace_content' => 'استبدال محتوى الصفحة', 'templates_append_content' => 'Append to page content', 'templates_prepend_content' => 'Prepend to page content', @@ -307,8 +309,8 @@ return [ 'comment_in_reply_to' => 'رداً على :commentId', // Revision - 'revision_delete_confirm' => 'Are you sure you want to delete this revision?', - 'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.', - 'revision_delete_success' => 'Revision deleted', - 'revision_cannot_delete_latest' => 'Cannot delete the latest revision.' + 'revision_delete_confirm' => 'هل أنت متأكد من أنك تريد حذف هذا الإصدار؟', + 'revision_restore_confirm' => 'هل أنت متأكد من أنك تريد استعادة هذا الإصدار؟ سيتم استبدال محتوى الصفحة الحالية.', + 'revision_delete_success' => 'تم حذف الإصدار', + 'revision_cannot_delete_latest' => 'لايمكن حذف آخر إصدار.' ]; \ No newline at end of file diff --git a/resources/lang/ar/errors.php b/resources/lang/ar/errors.php index 2714d3dbb..cbf1d5958 100644 --- a/resources/lang/ar/errors.php +++ b/resources/lang/ar/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'انتهت عملية تحميل الملف.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'لم يتم العثور على المرفق', // Pages diff --git a/resources/lang/ar/settings.php b/resources/lang/ar/settings.php index 0a689c5d5..3b94cdfc6 100755 --- a/resources/lang/ar/settings.php +++ b/resources/lang/ar/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'الأدوار', 'role_user_roles' => 'أدوار المستخدمين', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'إدارة إعدادات التطبيق', 'role_asset' => 'Asset Permissions', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'الكل', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Expiry Date', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Delete Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/bg/activities.php b/resources/lang/bg/activities.php new file mode 100644 index 000000000..a5001bc79 --- /dev/null +++ b/resources/lang/bg/activities.php @@ -0,0 +1,48 @@ + 'създадена страница', + 'page_create_notification' => 'Страницата беше успешно създадена', + 'page_update' => 'обновена страница', + 'page_update_notification' => 'Страницата успешно обновена', + 'page_delete' => 'изтрита страница', + 'page_delete_notification' => 'Страницата беше успешно изтрита', + 'page_restore' => 'възстановена страница', + 'page_restore_notification' => 'Страницата беше успешно възстановена', + 'page_move' => 'преместена страница', + + // Chapters + 'chapter_create' => 'създадена страница', + 'chapter_create_notification' => 'Главата беше успешно създадена', + 'chapter_update' => 'обновена глава', + 'chapter_update_notification' => 'Главата беше успешно обновена', + 'chapter_delete' => 'изтрита глава', + 'chapter_delete_notification' => 'Главата беше успешно изтрита', + 'chapter_move' => 'преместена глава', + + // Books + 'book_create' => 'създадена книга', + 'book_create_notification' => 'Книгата беше успешно създадена', + 'book_update' => 'обновена книга', + 'book_update_notification' => 'Книгата беше успешно обновена', + 'book_delete' => 'изтрита книга', + 'book_delete_notification' => 'Книгата беше успешно изтрита', + 'book_sort' => 'сортирана книга', + 'book_sort_notification' => 'Книгата беше успешно преподредена', + + // Bookshelves + 'bookshelf_create' => 'създаден рафт', + 'bookshelf_create_notification' => 'Рафтът беше успешно създаден', + 'bookshelf_update' => 'обновен рафт', + 'bookshelf_update_notification' => 'Рафтът беше успешно обновен', + 'bookshelf_delete' => 'изтрит рафт', + 'bookshelf_delete_notification' => 'Рафтът беше успешно изтрит', + + // Other + 'commented_on' => 'коментирано на', +]; diff --git a/resources/lang/bg/auth.php b/resources/lang/bg/auth.php new file mode 100644 index 000000000..018e871e1 --- /dev/null +++ b/resources/lang/bg/auth.php @@ -0,0 +1,77 @@ + 'Въведените удостоверителни данни не съвпадат с нашите записи.', + 'throttle' => 'Твърде много опити за влизане. Опитайте пак след :seconds секунди.', + + // Login & Register + 'sign_up' => 'Регистриране', + 'log_in' => 'Влизане', + 'log_in_with' => 'Влизане с :socialDriver', + 'sign_up_with' => 'Регистриране с :socialDriver', + 'logout' => 'Изход', + + 'name' => 'Име', + 'username' => 'Потребител', + 'email' => 'Имейл', + 'password' => 'Парола', + 'password_confirm' => 'Потвърди паролата', + 'password_hint' => 'Трябва да бъде поне 7 символа', + 'forgot_password' => 'Забравена парола?', + 'remember_me' => 'Запомни ме', + 'ldap_email_hint' => 'Моля въведете емейл, който да използвате за дадения акаунт.', + 'create_account' => 'Създай Акаунт', + 'already_have_account' => 'Вече имате акаунт?', + 'dont_have_account' => 'Нямате акаунт?', + 'social_login' => 'Влизане по друг начин', + 'social_registration' => 'Регистрация по друг начин', + 'social_registration_text' => 'Регистрация и влизане използвайки друг начин.', + + 'register_thanks' => 'Благодарим Ви за регистрацията!', + 'register_confirm' => 'Моля проверете своя емейл и натиснете върху бутона за потвърждение, за да влезете в :appName.', + 'registrations_disabled' => 'Регистрациите към момента са забранени', + 'registration_email_domain_invalid' => 'Този емейл домейн към момента няма достъп до приложението', + 'register_success' => 'Благодарим Ви за регистрацията! В момента сте регистриран и сте вписани в приложението.', + + + // Password Reset + 'reset_password' => 'Нулиране на паролата', + 'reset_password_send_instructions' => 'Въведете емейла си и ще ви бъде изпратен емейл с линк за нулиране на паролата.', + 'reset_password_send_button' => 'Изпращане на линк за нулиране', + 'reset_password_sent' => 'Линк за нулиране на паролата ще Ви бъде изпратен на :email, ако емейлът Ви бъде открит в системата.', + 'reset_password_success' => 'Паролата Ви е променена успешно.', + 'email_reset_subject' => 'Възстановете паролата си за :appName', + 'email_reset_text' => 'Вие получихте този емейл, защото поискахте вашата парола да бъде занулена.', + 'email_reset_not_requested' => 'Ако Вие не сте поискали зануляването на паролата, няма нужда от други действия.', + + + // Email Confirmation + 'email_confirm_subject' => 'Потвърди емейла си за :appName', + 'email_confirm_greeting' => 'Благодарим Ви, че се присъединихте към :appName!', + 'email_confirm_text' => 'Моля, потвърдете вашия имейл адрес, като следвате връзката по-долу:', + 'email_confirm_action' => 'Потвърдете имейл', + 'email_confirm_send_error' => 'Нужно ви е потвърждение чрез емейл, но системата не успя да го изпрати. Моля свържете се с администратора, за да проверите дали вашият емейл адрес е конфигуриран правилно.', + 'email_confirm_success' => 'Адресът на електронната ви поща е потвърден!', + 'email_confirm_resent' => 'Беше изпратен имейл с потвърждение, Моля, проверете кутията си.', + + 'email_not_confirmed' => 'Имейл адресът не е потвърден', + 'email_not_confirmed_text' => 'Вашият емейл адрес все още не е потвърден.', + 'email_not_confirmed_click_link' => 'Моля да последвате линка, който ви беше изпратен непосредствено след регистрацията.', + 'email_not_confirmed_resend' => 'Ако не откривате писмото, може да го изпратите отново като попълните формуляра по-долу.', + 'email_not_confirmed_resend_button' => 'Изпрати отново емейла за потвърждение', + + // User Invite + 'user_invite_email_subject' => 'Вие бяхте поканен да се присъедините към :appName!', + 'user_invite_email_greeting' => 'Беше създаден акаунт за Вас във :appName.', + 'user_invite_email_text' => 'Натисните бутона по-долу за да определите парола и да получите достъп:', + 'user_invite_email_action' => 'Парола на акаунта', + 'user_invite_page_welcome' => 'Добре дошли в :appName!', + 'user_invite_page_text' => 'За да финализирате вашият акаунт и да получите достъп трябва да определите парола, която да бъде използвана за следващия влизания в :appName.', + 'user_invite_page_confirm_button' => 'Потвърди паролата', + 'user_invite_success' => 'Паролата е потвърдена и вече имате достъп до :appName!' +]; \ No newline at end of file diff --git a/resources/lang/bg/common.php b/resources/lang/bg/common.php new file mode 100644 index 000000000..99930ddf4 --- /dev/null +++ b/resources/lang/bg/common.php @@ -0,0 +1,80 @@ + 'Отказ', + 'confirm' => 'Потвърди', + 'back' => 'Назад', + 'save' => 'Запази', + 'continue' => 'Продължи', + 'select' => 'Избери', + 'toggle_all' => 'Избери всички', + 'more' => 'Повече', + + // Form Labels + 'name' => 'Име', + 'description' => 'Описание', + 'role' => 'Роля', + 'cover_image' => 'Основно изображение', + 'cover_image_description' => 'Картината трябва да е приблизително 440х250 пиксела.', + + // Actions + 'actions' => 'Действия', + 'view' => 'Преглед', + 'view_all' => 'Преглед на всички', + 'create' => 'Създай', + 'update' => 'Обновяване', + 'edit' => 'Редактиране', + 'sort' => 'Сортиране', + 'move' => 'Преместване', + 'copy' => 'Копирай', + 'reply' => 'Отговори', + 'delete' => 'Изтрий', + 'delete_confirm' => 'Confirm Deletion', + 'search' => 'Търси', + 'search_clear' => 'Изчисти търсенето', + 'reset' => 'Нулирай', + 'remove' => 'Премахване', + 'add' => 'Добави', + 'fullscreen' => 'Пълен екран', + + // Sort Options + 'sort_options' => 'Опции за сортиране', + 'sort_direction_toggle' => 'Активирай сортиране', + 'sort_ascending' => 'Сортирай възходящо', + 'sort_descending' => 'Низходящо сортиране', + 'sort_name' => 'Име', + 'sort_created_at' => 'Дата на създаване', + 'sort_updated_at' => 'Дата на обновяване', + + // Misc + 'deleted_user' => 'Изтриване на потребител', + 'no_activity' => 'Няма активност за показване', + 'no_items' => 'Няма налични артикули', + 'back_to_top' => 'Върнете се в началото', + 'toggle_details' => 'Активирай детайли', + 'toggle_thumbnails' => 'Активирай миниатюри', + 'details' => 'Подробности', + 'grid_view' => 'Табличен изглед', + 'list_view' => 'Изглед списък', + 'default' => 'Основен', + 'breadcrumb' => 'Трасиране', + + // Header + 'profile_menu' => 'Профил меню', + 'view_profile' => 'Разглеждане на профил', + 'edit_profile' => 'Редактиране на профила', + 'dark_mode' => 'Тъмен режим', + 'light_mode' => 'Светъл режим', + + // Layout tabs + 'tab_info' => 'Информация', + 'tab_content' => 'Съдържание', + + // Email Content + 'email_action_help' => 'Ако имате проблеми с бутона ":actionText" по-горе, копирайте и поставете URL адреса по-долу в уеб браузъра си:', + 'email_rights' => 'Всички права запазени', +]; diff --git a/resources/lang/bg/components.php b/resources/lang/bg/components.php new file mode 100644 index 000000000..b15aa6f79 --- /dev/null +++ b/resources/lang/bg/components.php @@ -0,0 +1,34 @@ + 'Избор на изображение', + 'image_all' => 'Всички', + 'image_all_title' => 'Преглед на всички изображения', + 'image_book_title' => 'Виж изображенията прикачени към тази книга', + 'image_page_title' => 'Виж изображенията прикачени към страницата', + 'image_search_hint' => 'Търси по име на картина', + 'image_uploaded' => 'Качено :uploadedDate', + 'image_load_more' => 'Зареди повече', + 'image_image_name' => 'Име на изображението', + 'image_delete_used' => 'Това изображение е използвано в страницата по-долу.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', + 'image_select_image' => 'Изберете изображение', + 'image_dropzone' => 'Поставете тук изображение или кликнете тук за да качите', + 'images_deleted' => 'Изображението е изтрито', + 'image_preview' => 'Преглед на изображенията', + 'image_upload_success' => 'Изображението бе качено успешно', + 'image_update_success' => 'Данните за изобтажението са обновенни успешно', + 'image_delete_success' => 'Изображението е успешно изтрито', + 'image_upload_remove' => 'Премахване', + + // Code Editor + 'code_editor' => 'Редактиране на кода', + 'code_language' => 'Език на кода', + 'code_content' => 'Съдържание на кода', + 'code_session_history' => 'Session History', + 'code_save' => 'Запази кода', +]; diff --git a/resources/lang/bg/entities.php b/resources/lang/bg/entities.php new file mode 100644 index 000000000..796bcd975 --- /dev/null +++ b/resources/lang/bg/entities.php @@ -0,0 +1,316 @@ + 'Наскоро създадени', + 'recently_created_pages' => 'Наскоро създадени страници', + 'recently_updated_pages' => 'Наскоро актуализирани страници', + 'recently_created_chapters' => 'Наскоро създадени глави', + 'recently_created_books' => 'Наскоро създадени книги', + 'recently_created_shelves' => 'Наскоро създадени рафтове', + 'recently_update' => 'Наскоро актуализирани', + 'recently_viewed' => 'Скорошно разгледани', + 'recent_activity' => 'Последна активност', + 'create_now' => 'Създай една сега', + 'revisions' => 'Ревизии', + 'meta_revision' => 'Ревизия #:revisionCount', + 'meta_created' => 'Създадено преди :timeLength', + 'meta_created_name' => 'Създадено преди :timeLength от :user', + 'meta_updated' => 'Актуализирано :timeLength', + 'meta_updated_name' => 'Актуализирано преди :timeLength от :user', + 'entity_select' => 'Избор на обект', + 'images' => 'Изображения', + 'my_recent_drafts' => 'Моите скорошни драфтове', + 'my_recently_viewed' => 'Моите скорошни преглеждания', + 'no_pages_viewed' => 'Не сте прегледали никакви страници', + 'no_pages_recently_created' => 'Не са били създавани страници скоро', + 'no_pages_recently_updated' => 'Не са били актуализирани страници скоро', + 'export' => 'Експортиране', + 'export_html' => 'Прикачени уеб файлове', + 'export_pdf' => 'PDF файл', + 'export_text' => 'Обикновен текстов файл', + + // Permissions and restrictions + 'permissions' => 'Права', + 'permissions_intro' => 'Веднъж добавени, тези права ще вземат приоритет над всички други установени права.', + 'permissions_enable' => 'Разреши уникални права', + 'permissions_save' => 'Запази права', + + // Search + 'search_results' => 'Резултати от търсенето', + 'search_total_results_found' => ':count резултати намерени|:count общо намерени резултати', + 'search_clear' => 'Изчисти търсенето', + 'search_no_pages' => 'Няма страници отговарящи на търсенето', + 'search_for_term' => 'Търси :term', + 'search_more' => 'Още резултати', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', + 'search_content_type' => 'Тип на съдържание', + 'search_exact_matches' => 'Точни съвпадения', + 'search_tags' => 'Търсене на тагове', + 'search_options' => 'Настройки', + 'search_viewed_by_me' => 'Прегледано от мен', + 'search_not_viewed_by_me' => 'Непрегледано от мен', + 'search_permissions_set' => 'Задаване на права', + 'search_created_by_me' => 'Създадено от мен', + 'search_updated_by_me' => 'Обновено от мен', + 'search_date_options' => 'Настройки на дати', + 'search_updated_before' => 'Обновено преди', + 'search_updated_after' => 'Обновено след', + 'search_created_before' => 'Създадено преди', + 'search_created_after' => 'Създадено след', + 'search_set_date' => 'Задаване на дата', + 'search_update' => 'Обнови търсенето', + + // Shelves + 'shelf' => 'Рафт', + 'shelves' => 'Рафтове', + 'x_shelves' => ':count Рафт|:count Рафтове', + 'shelves_long' => 'Рафтове с книги', + 'shelves_empty' => 'Няма създадени рафтове', + 'shelves_create' => 'Създай нов рафт', + 'shelves_popular' => 'Популярни рафтове', + 'shelves_new' => 'Нови рафтове', + 'shelves_new_action' => 'Нов рафт', + 'shelves_popular_empty' => 'Най-популярните рафтове ще излязат тук.', + 'shelves_new_empty' => 'Най-новите рафтове ще излязат тук.', + 'shelves_save' => 'Запази рафт', + 'shelves_books' => 'Книги на този рафт', + 'shelves_add_books' => 'Добави книги към този рафт', + 'shelves_drag_books' => 'Издърпай книги тук, за да ги добавиш към рафта', + 'shelves_empty_contents' => 'Този рафт няма добавени книги', + 'shelves_edit_and_assign' => 'Редактирай рафта за да добавиш книги', + 'shelves_edit_named' => 'Редактирай рафт с книги :name', + 'shelves_edit' => 'Редактирай рафт с книги', + 'shelves_delete' => 'Изтрий рафт с книги', + 'shelves_delete_named' => 'Изтрий рафт с книги :name', + 'shelves_delete_explain' => "Ще бъде изтрит рафта с книги със следното име ':name'. Съдържащите се книги няма да бъдат изтрити.", + 'shelves_delete_confirmation' => 'Сигурни ли сте, че искате да изтриете този рафт с книги?', + 'shelves_permissions' => 'Настройки за достъп до рафта с книги', + 'shelves_permissions_updated' => 'Настройките за достъп до рафта с книги е обновен', + 'shelves_permissions_active' => 'Настройките за достъп до рафта с книги е активен', + 'shelves_copy_permissions_to_books' => 'Копирай настойките за достъп към книгите', + 'shelves_copy_permissions' => 'Копирай настройките за достъп', + 'shelves_copy_permissions_explain' => 'Това ще приложи настоящите настройки за достъп на този рафт с книги за всички книги, съдържащи се в него. Преди да активирате, уверете се, че всички промени в настройките за достъп на този рафт са запазени.', + 'shelves_copy_permission_success' => 'Настройките за достъп на рафта с книги бяха копирани върху :count books', + + // Books + 'book' => 'Книга', + 'books' => 'Книги', + 'x_books' => ':count Книга|:count Книги', + 'books_empty' => 'Няма създадени книги', + 'books_popular' => 'Популярни книги', + 'books_recent' => 'Скоро разглеждани книги', + 'books_new' => 'Нови книги', + 'books_new_action' => 'Нова книга', + 'books_popular_empty' => 'Най-популярните книги ще излязат тук.', + 'books_new_empty' => 'Най-новите книги ще излязат тук.', + 'books_create' => 'Създай нова книга', + 'books_delete' => 'Изтрита книга', + 'books_delete_named' => 'Изтрий книга :bookName', + 'books_delete_explain' => 'Това действие ще изтрие книга с името \':bookName\'. Всички страници и глави ще бъдат изтрити.', + 'books_delete_confirmation' => 'Сигурен ли сте, че искате да изтриете книгата?', + 'books_edit' => 'Редактиране на книга', + 'books_edit_named' => 'Редактирай книга :bookName', + 'books_form_book_name' => 'Име на книга', + 'books_save' => 'Запази книга', + 'books_permissions' => 'Настройки за достъп до книгата', + 'books_permissions_updated' => 'Настройките за достъп до книгата бяха обновени', + 'books_empty_contents' => 'Няма създадени страници или глави към тази книга.', + 'books_empty_create_page' => 'Създаване на нова страница', + 'books_empty_sort_current_book' => 'Сортирай настоящата книга', + 'books_empty_add_chapter' => 'Добавяне на раздел', + 'books_permissions_active' => 'Настройките за достъп до книгата са активни', + 'books_search_this' => 'Търси в книгата', + 'books_navigation' => 'Навигация на книгата', + 'books_sort' => 'Сортирай съдържанието на книгата', + 'books_sort_named' => 'Сортирай книга :bookName', + 'books_sort_name' => 'Сортиране по име', + 'books_sort_created' => 'Сортирай по дата на създаване', + 'books_sort_updated' => 'Сортирай по дата на обновяване', + 'books_sort_chapters_first' => 'Първа глава', + 'books_sort_chapters_last' => 'Последна глава', + 'books_sort_show_other' => 'Покажи други книги', + 'books_sort_save' => 'Запази новата подредба', + + // Chapters + 'chapter' => 'Глава', + 'chapters' => 'Глави', + 'x_chapters' => ':count Глава|:count Глави', + 'chapters_popular' => 'Популярни глави', + 'chapters_new' => 'Нова глава', + 'chapters_create' => 'Създай нова глава', + 'chapters_delete' => 'Изтрий глава', + 'chapters_delete_named' => 'Изтрий глава :chapterName', + 'chapters_delete_explain' => 'Ще бъде изтрита глава с име \':chapterName\'. Всички страници в нея ще бъдат премахнати и добавени в основната книга.', + 'chapters_delete_confirm' => 'Сигурни ли сте, че искате да изтриете тази глава?', + 'chapters_edit' => 'Редактирай глава', + 'chapters_edit_named' => 'Актуализирай глава :chapterName', + 'chapters_save' => 'Запази глава', + 'chapters_move' => 'Премести глава', + 'chapters_move_named' => 'Премести глава :chapterName', + 'chapter_move_success' => 'Главата беше преместена в :bookName', + 'chapters_permissions' => 'Настойки за достъп на главата', + 'chapters_empty' => 'Няма създадени страници в тази глава.', + 'chapters_permissions_active' => 'Настройките за достъп до глава са активни', + 'chapters_permissions_success' => 'Настройките за достъп до главата бяха обновени', + 'chapters_search_this' => 'Търси в тази глава', + + // Pages + 'page' => 'Страница', + 'pages' => 'Страници', + 'x_pages' => ':count Страница|:count Страници', + 'pages_popular' => 'Популярни страници', + 'pages_new' => 'Нова страница', + 'pages_attachments' => 'Прикачени файлове', + 'pages_navigation' => 'Навигация на страница', + 'pages_delete' => 'Изтрий страница', + 'pages_delete_named' => 'Изтрий страница :pageName', + 'pages_delete_draft_named' => 'Изтрий чернова :pageName', + 'pages_delete_draft' => 'Изтрий чернова', + 'pages_delete_success' => 'Страницата е изтрита', + 'pages_delete_draft_success' => 'Черновата на страницата бе изтрита', + 'pages_delete_confirm' => 'Сигурни ли сте, че искате да изтриете тази страница?', + 'pages_delete_draft_confirm' => 'Сигурни ли сте, че искате да изтриете тази чернова?', + 'pages_editing_named' => 'Редактиране на страница :pageName', + 'pages_edit_draft_options' => 'Настройки на черновата', + 'pages_edit_save_draft' => 'Запазване на чернова', + 'pages_edit_draft' => 'Редактирай на черновата', + 'pages_editing_draft' => 'Редактиране на чернова', + 'pages_editing_page' => 'Редактиране на страница', + 'pages_edit_draft_save_at' => 'Черновата е запазена в ', + 'pages_edit_delete_draft' => 'Изтрий чернова', + 'pages_edit_discard_draft' => 'Отхвърляне на черновата', + 'pages_edit_set_changelog' => 'Задайте регистър на промените', + 'pages_edit_enter_changelog_desc' => 'Въведете кратко резюме на промените, които сте създали', + 'pages_edit_enter_changelog' => 'Въведи регистър на промените', + 'pages_save' => 'Запазване на страницата', + 'pages_title' => 'Заглавие на страницата', + 'pages_name' => 'Име на страницата', + 'pages_md_editor' => 'Редактор', + 'pages_md_preview' => 'Предварителен преглед', + 'pages_md_insert_image' => 'Добавяна на изображение', + 'pages_md_insert_link' => 'Добави линк към обекта', + 'pages_md_insert_drawing' => 'Вмъкни рисунка', + 'pages_not_in_chapter' => 'Страницата не принадлежи в никоя глава', + 'pages_move' => 'Премести страницата', + 'pages_move_success' => 'Страницата беше преместена в ":parentName"', + 'pages_copy' => 'Копиране на страницата', + 'pages_copy_desination' => 'Копиране на дестинацията', + 'pages_copy_success' => 'Страницата беше успешно копирана', + 'pages_permissions' => 'Настройки за достъп на страницата', + 'pages_permissions_success' => 'Настройките за достъп до страницата бяха обновени', + 'pages_revision' => 'Ревизия', + 'pages_revisions' => 'Ревизии на страницата', + 'pages_revisions_named' => 'Ревизии на страницата :pageName', + 'pages_revision_named' => 'Ревизия на страницата :pageName', + 'pages_revisions_created_by' => 'Създадено от', + 'pages_revisions_date' => 'Дата на ревизията', + 'pages_revisions_number' => '№', + 'pages_revisions_numbered' => 'Ревизия №:id', + 'pages_revisions_numbered_changes' => 'Ревизия №:id Промени', + 'pages_revisions_changelog' => 'История на промените', + 'pages_revisions_changes' => 'Промени', + 'pages_revisions_current' => 'Текуща версия', + 'pages_revisions_preview' => 'Предварителен преглед', + 'pages_revisions_restore' => 'Възстановяване', + 'pages_revisions_none' => 'Тази страница няма ревизии', + 'pages_copy_link' => 'Копирай връзката', + 'pages_edit_content_link' => 'Редактиране на съдържанието', + 'pages_permissions_active' => 'Настройките за достъп до страницата са активни', + 'pages_initial_revision' => 'Първо публикуване', + 'pages_initial_name' => 'Нова страница', + 'pages_editing_draft_notification' => 'В момента редактирате чернова, която беше последно обновена :timeDiff.', + 'pages_draft_edited_notification' => 'Тази страница беше актуализирана от тогава. Препоръчително е да изтриете настоящата чернова.', + 'pages_draft_edit_active' => [ + 'start_a' => ':count потребителя започнаха да редактират настоящата страница', + 'start_b' => ':userName в момента редактира тази страница', + 'time_a' => 'от както страницата беше актуализирана', + 'time_b' => 'в последните :minCount минути', + 'message' => ':start :time. Внимавайте да не попречите на актуализацията на другия!', + ], + 'pages_draft_discarded' => 'Черновата беше отхърлена, Редактора беше обновен с актуалното съдържание на страницата', + 'pages_specific' => 'Определена страница', + 'pages_is_template' => 'Шаблон на страницата', + + // Editor Sidebar + 'page_tags' => 'Тагове на страницата', + 'chapter_tags' => 'Тагове на главата', + 'book_tags' => 'Тагове на книгата', + 'shelf_tags' => 'Тагове на рафта', + 'tag' => 'Таг', + 'tags' => 'Тагове', + 'tag_name' => 'Име на таг', + 'tag_value' => 'Съдържание на тага (Опционално)', + 'tags_explain' => "Добавете няколко тага за да категоризирате по добре вашето съдържание. \n Може да добавите съдържание на таговете за по-подробна организация.", + 'tags_add' => 'Добави друг таг', + 'tags_remove' => 'Премахни този таг', + 'attachments' => 'Прикачени файлове', + 'attachments_explain' => 'Прикачете файлове или линкове, които да са видими на вашата страница. Същите ще бъдат видими във вашето странично поле.', + 'attachments_explain_instant_save' => 'Промените тук се запазват веднага.', + 'attachments_items' => 'Прикачен файл', + 'attachments_upload' => 'Прикачен файл', + 'attachments_link' => 'Прикачване на линк', + 'attachments_set_link' => 'Поставяне на линк', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', + 'attachments_dropzone' => 'Поставете файлове или цъкнете тук за да прикачите файл', + 'attachments_no_files' => 'Няма прикачени фалове', + 'attachments_explain_link' => 'Може да прикачите линк, ако не искате да качвате файл. Този линк може да бъде към друга страница или към файл в облакова пространство.', + 'attachments_link_name' => 'Има на линка', + 'attachment_link' => 'Линк към прикачения файл', + 'attachments_link_url' => 'Линк към файла', + 'attachments_link_url_hint' => 'Url на сайт или файл', + 'attach' => 'Прикачване', + 'attachments_insert_link' => 'Add Attachment Link to Page', + 'attachments_edit_file' => 'Редактирай файл', + 'attachments_edit_file_name' => 'Име на файл', + 'attachments_edit_drop_upload' => 'Поставете файл или цъкнете тук за да прикачите и обновите', + 'attachments_order_updated' => 'Прикачения файл беше обновен', + 'attachments_updated_success' => 'Данните на прикачения файл бяха обновени', + 'attachments_deleted' => 'Прикачения файл беше изтрит', + 'attachments_file_uploaded' => 'Файлът беше качен успешно', + 'attachments_file_updated' => 'Файлът беше обновен успешно', + 'attachments_link_attached' => 'Линкът беше успешно прикачен към страницата', + 'templates' => 'Шаблони', + 'templates_set_as_template' => 'Страницата е шаблон', + 'templates_explain_set_as_template' => 'Можете да зададете тази страница като шаблон, така че нейното съдържание да бъде използвано при създаването на други страници. Други потребители ще могат да използват този шаблон, ако имат разрешения за преглед на тази страница.', + 'templates_replace_content' => 'Замени съдържанието на страницата', + 'templates_append_content' => 'Добави в края на съдържанието на страницата', + 'templates_prepend_content' => 'Добави в началото на съдържанието на страницата', + + // Profile View + 'profile_user_for_x' => 'Потребител от :time', + 'profile_created_content' => 'Създадено съдържание', + 'profile_not_created_pages' => ':userName не е създал страници', + 'profile_not_created_chapters' => ':userName не е създавал глави', + 'profile_not_created_books' => ':userName не е създавал книги', + 'profile_not_created_shelves' => ':userName не е създавал рафтове', + + // Comments + 'comment' => 'Коментирай', + 'comments' => 'Коментари', + 'comment_add' => 'Добавяне на коментар', + 'comment_placeholder' => 'Напишете коментар', + 'comment_count' => '{0} Няма коментари|{1} 1 коментар|[2,*] :count коментара', + 'comment_save' => 'Запази коментар', + 'comment_saving' => 'Запазване на коментар...', + 'comment_deleting' => 'Изтриване на коментар...', + 'comment_new' => 'Нов коментар', + 'comment_created' => 'коментирано :createDiff', + 'comment_updated' => 'Актуализирано :updateDiff от :username', + 'comment_deleted_success' => 'Коментарът е изтрит', + 'comment_created_success' => 'Коментарът е добавен', + 'comment_updated_success' => 'Коментарът е обновен', + 'comment_delete_confirm' => 'Наистина ли искате да изтриете този коментар?', + 'comment_in_reply_to' => 'В отговор на :commentId', + + // Revision + 'revision_delete_confirm' => 'Наистина ли искате да изтриете тази версия?', + 'revision_restore_confirm' => 'Сигурни ли сте, че искате да изтриете тази версия? Настоящата страница ще бъде заместена.', + 'revision_delete_success' => 'Версията беше изтрита', + 'revision_cannot_delete_latest' => 'Не може да изтриете последната версия.' +]; \ No newline at end of file diff --git a/resources/lang/bg/errors.php b/resources/lang/bg/errors.php new file mode 100644 index 000000000..4b062af06 --- /dev/null +++ b/resources/lang/bg/errors.php @@ -0,0 +1,102 @@ + 'Нямате права за достъп до избраната страница.', + 'permissionJson' => 'Нямате права да извършите тази операция.', + + // Auth + 'error_user_exists_different_creds' => 'Потребител с емайл :email вече съществува но с други данни.', + 'email_already_confirmed' => 'Емейлът вече беше потвърден. Моля опитрайте да влезете.', + 'email_confirmation_invalid' => 'Този код за достъп не е валиден или вече е бил използван, Моля опитрайте се да се регистрирате отново.', + 'email_confirmation_expired' => 'Кодът за потвърждение изтече, нов емейл за потвърждение беше изпратен.', + 'email_confirmation_awaiting' => 'Емайл адреса, който използвате трябва да се потвърди', + 'ldap_fail_anonymous' => 'LDAP протокола прекъсна, използвайки анонимни настройки', + 'ldap_fail_authed' => 'Опита за достъп чрез LDAP с използваната парола не беше успешен', + 'ldap_extension_not_installed' => 'LDAP PHP не беше инсталирана', + 'ldap_cannot_connect' => 'Не може да се свържете с Ldap сървъра, първоначалната връзка се разпадна', + 'saml_already_logged_in' => 'Вече сте влезли', + 'saml_user_not_registered' => 'Потребителят :name не е регистриран и автоматичната регистрация не е достъпна', + 'saml_no_email_address' => 'Не успяхме да намерим емейл адрес, за този потребител, от информацията предоставена от външната система', + 'saml_invalid_response_id' => 'Заявката от външната система не е разпознат от процеса започнат от това приложение. Връщането назад след влизане може да породи този проблем.', + 'saml_fail_authed' => 'Влизането чрез :system не беше успешно, системата не успя да оторизира потребителя', + 'social_no_action_defined' => 'Действието не беше дефинирано', + 'social_login_bad_response' => "Възникна грешка по време на :socialAccount login: \n:error", + 'social_account_in_use' => 'Този :socialAccount вече е използван. Опитайте се да влезете чрез опцията за :socialAccount.', + 'social_account_email_in_use' => 'Този емейл адрес вече е бил използван. Ако вече имате профил, може да го свържете чрез :socialAccount от вашия профил.', + 'social_account_existing' => 'Този :socialAccount вече в свързан с вашия профил.', + 'social_account_already_used_existing' => 'Този :socialAccount вече се използва от друг потребител.', + 'social_account_not_used' => 'Този :socialAccount не е свързан с профил. Моля свържете го с вашия профил. ', + 'social_account_register_instructions' => 'Ако все още нямате профил, може да се регистрирате чрез :socialAccount опцията.', + 'social_driver_not_found' => 'Social driver not found', + 'social_driver_not_configured' => 'Your :socialAccount social settings are not configured correctly.', + 'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.', + + // System + 'path_not_writable' => 'File path :filePath could not be uploaded to. Ensure it is writable to the server.', + 'cannot_get_image_from_url' => 'Cannot get image from :url', + '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.', + '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.', + + // Attachments + 'attachment_not_found' => 'Attachment not found', + + // Pages + 'page_draft_autosave_fail' => 'Failed to save draft. Ensure you have internet connection before saving this page', + 'page_custom_home_deletion' => 'Cannot delete a page while it is set as a homepage', + + // Entities + 'entity_not_found' => 'Entity not found', + 'bookshelf_not_found' => 'Bookshelf not found', + 'book_not_found' => 'Book not found', + 'page_not_found' => 'Page not found', + 'chapter_not_found' => 'Chapter not found', + 'selected_book_not_found' => 'The selected book was not found', + 'selected_book_chapter_not_found' => 'The selected Book or Chapter was not found', + 'guests_cannot_save_drafts' => 'Guests cannot save drafts', + + // Users + 'users_cannot_delete_only_admin' => 'You cannot delete the only admin', + 'users_cannot_delete_guest' => 'You cannot delete the guest user', + + // Roles + 'role_cannot_be_edited' => 'This role cannot be edited', + 'role_system_cannot_be_deleted' => 'This role is a system role and cannot be deleted', + 'role_registration_default_cannot_delete' => 'This role cannot be deleted while set as the default registration role', + 'role_cannot_remove_only_admin' => 'This user is the only user assigned to the administrator role. Assign the administrator role to another user before attempting to remove it here.', + + // Comments + 'comment_list' => 'An error occurred while fetching the comments.', + 'cannot_add_comment_to_draft' => 'Не може да добавяте коментари към чернова.', + 'comment_add' => 'Възникна грешка при актуализиране/добавяне на коментар.', + 'comment_delete' => 'Възникна грешка при изтриването на коментара.', + 'empty_comment' => 'Не може да добавите празен коментар.', + + // Error pages + '404_page_not_found' => 'Страницата не е намерена', + 'sorry_page_not_found' => 'Страницата, която търсите не може да бъде намерена.', + 'sorry_page_not_found_permission_warning' => 'Ако смятате, че тази страница съществува, най-вероятно нямате право да я преглеждате.', + 'return_home' => 'Назад към Начало', + 'error_occurred' => 'Възникна грешка', + 'app_down' => ':appName не е достъпно в момента', + 'back_soon' => 'Ще се върне обратно онлайн скоро.', + + // API errors + 'api_no_authorization_found' => 'Но беше намерен код за достъп в заявката', + 'api_bad_authorization_format' => 'В заявката имаше код за достъп, но формата изглежда е неправилен', + 'api_user_token_not_found' => 'Няма открит API код, който да отговоря на предоставения такъв', + 'api_incorrect_token_secret' => 'Секретния код, който беше предоставен за достъп до API-а е неправилен', + 'api_user_no_api_permission' => 'Собственика на АPI кода няма право да прави API заявки', + 'api_user_token_expired' => 'Кода за достъп, който беше използван, вече не е валиден', + + // Settings & Maintenance + 'maintenance_test_email_failure' => 'Беше върната грешка, когато се изпрати тестовият емейл:', + +]; diff --git a/resources/lang/bg/pagination.php b/resources/lang/bg/pagination.php new file mode 100644 index 000000000..7844171ee --- /dev/null +++ b/resources/lang/bg/pagination.php @@ -0,0 +1,12 @@ + '« Предишна', + 'next' => 'Следваща »', + +]; diff --git a/resources/lang/bg/passwords.php b/resources/lang/bg/passwords.php new file mode 100644 index 000000000..871fdeea8 --- /dev/null +++ b/resources/lang/bg/passwords.php @@ -0,0 +1,15 @@ + 'Паролите трябва да имат поне 8 символа и да съвпадат с потвърждението.', + 'user' => "Не можем да намерим потребител с този имейл адрес.", + 'token' => 'Кодът за зануляване на паролата е невалиден за този емейл адрес.', + 'sent' => 'Пратихме връзка за нулиране на паролата до имейла ви!', + 'reset' => 'Вашата парола е нулирана!', + +]; diff --git a/resources/lang/bg/settings.php b/resources/lang/bg/settings.php new file mode 100644 index 000000000..e8612c3d7 --- /dev/null +++ b/resources/lang/bg/settings.php @@ -0,0 +1,230 @@ + 'Настройки', + 'settings_save' => 'Запази настройките', + 'settings_save_success' => 'Настройките са записани', + + // App Settings + 'app_customization' => 'Персонализиране', + 'app_features_security' => 'Екстри и Сигурност', + 'app_name' => 'Име на приложението', + 'app_name_desc' => 'Това име е включено във всяка шапка и във всеки имейл изпратен от системата.', + 'app_name_header' => 'Покажи името в шапката', + 'app_public_access' => 'Публичен достъп', + 'app_public_access_desc' => 'Активирането на тази настройка, ще позволи на гости, които не са влезли в системта, да имат достъп до съдържанието на вашето приложение.', + 'app_public_access_desc_guest' => 'Достъпа на гостите може да бъде контролиран от "Guest" потребителя.', + 'app_public_access_toggle' => 'Позволяване на публичен достъп', + 'app_public_viewing' => 'Позволване на публичен достъп?', + 'app_secure_images' => 'По-висока сигурност при качване на изображения', + 'app_secure_images_toggle' => 'Активиране на по-висока сигурност при качване на изображения', + 'app_secure_images_desc' => 'С цел производителност, всички изображения са публични. Тази настройка добавя случаен, труден за отгатване низ от символи пред линка на изображението. Подсигурете, че индексите на директорията не са включени за да предотвратите лесен достъп.', + 'app_editor' => 'Редактор на страница', + 'app_editor_desc' => 'Изберете кой редактор да се използва от всички потребители за да редактират страници.', + 'app_custom_html' => 'Персонализирано съдържание на HTML шапката', + 'app_custom_html_desc' => 'Всяко съдържание, добавено тук, ще бъде поставено в долната част на секцията на всяка страница. Това е удобно за преобладаващи стилове или добавяне на код за анализ.', + 'app_custom_html_disabled_notice' => 'Съдържанието на персонализираната HTML шапка е деактивирано на страницата с настройки, за да се гарантира, че евентуални лоши промени могат да бъдат върнати.', + 'app_logo' => 'Лого на приложението', + 'app_logo_desc' => 'Това изображение трябва да е с 43px височина.
    Големите изображения ще бъдат намалени.', + 'app_primary_color' => 'Основен цвят на приложението', + 'app_primary_color_desc' => 'Изберете основния цвят на приложението, включително на банера, бутоните и линковете.', + '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', + 'app_disable_comments' => 'Disable Comments', + 'app_disable_comments_toggle' => 'Disable comments', + '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.', + 'bookshelf_color' => 'Shelf Color', + 'book_color' => 'Book Color', + 'chapter_color' => 'Chapter Color', + 'page_color' => 'Page Color', + 'page_draft_color' => 'Page Draft Color', + + // Registration Settings + 'reg_settings' => 'Registration', + 'reg_enable' => 'Enable Registration', + 'reg_enable_toggle' => 'Enable registration', + 'reg_enable_desc' => 'When registration is enabled user will be able to sign themselves up as an application user. Upon registration they are given a single, default user role.', + 'reg_default_role' => 'Default user role after registration', + 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', + 'reg_email_confirmation' => 'Email Confirmation', + 'reg_email_confirmation_toggle' => 'Require email confirmation', + 'reg_confirm_email_desc' => 'If domain restriction is used then email confirmation will be required and this option will be ignored.', + 'reg_confirm_restrict_domain' => 'Domain Restriction', + 'reg_confirm_restrict_domain_desc' => 'Enter a comma separated list of email domains you would like to restrict registration to. Users will be sent an email to confirm their address before being allowed to interact with the application.
    Note that users will be able to change their email addresses after successful registration.', + 'reg_confirm_restrict_domain_placeholder' => 'No restriction set', + + // Maintenance settings + 'maint' => 'Maintenance', + 'maint_image_cleanup' => 'Cleanup Images', + 'maint_image_cleanup_desc' => "Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.", + 'maint_image_cleanup_ignore_revisions' => 'Ignore images in revisions', + 'maint_image_cleanup_run' => 'Run Cleanup', + 'maint_image_cleanup_warning' => ':count potentially unused images were found. Are you sure you want to delete these images?', + 'maint_image_cleanup_success' => ':count potentially unused images found and deleted!', + 'maint_image_cleanup_nothing_found' => 'No unused images found, Nothing deleted!', + 'maint_send_test_email' => 'Send a Test Email', + 'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.', + 'maint_send_test_email_run' => 'Send test email', + 'maint_send_test_email_success' => 'Email sent to :address', + 'maint_send_test_email_mail_subject' => 'Test Email', + 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', + 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + + // Role Settings + 'roles' => 'Roles', + 'role_user_roles' => 'User Roles', + 'role_create' => 'Create New Role', + 'role_create_success' => 'Role successfully created', + 'role_delete' => 'Delete Role', + 'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.', + 'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.', + 'role_delete_no_migration' => "Don't migrate users", + 'role_delete_sure' => 'Are you sure you want to delete this role?', + 'role_delete_success' => 'Role successfully deleted', + 'role_edit' => 'Редактиране на роля', + 'role_details' => 'Детайли на роля', + 'role_name' => 'Име на ролята', + 'role_desc' => 'Кратко описание на ролята', + 'role_external_auth_id' => 'Външни ауторизиращи ID-a', + 'role_system' => 'Настойки за достъп на системата', + 'role_manage_users' => 'Управление на потребители', + 'role_manage_roles' => 'Управление роли и права', + 'role_manage_entity_permissions' => 'Управление на правата за достъп всички книги, глави и страници', + 'role_manage_own_entity_permissions' => 'Управление на правата за достъп на собствени книги, глави и страници', + 'role_manage_page_templates' => 'Управление на шаблони на страници', + 'role_access_api' => 'Достъп до API на системата', + 'role_manage_settings' => 'Управление на настройките на приложението', + 'role_asset' => 'Настройки за достъп до активи', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', + 'role_asset_desc' => 'Тези настойки за достъп контролират достъпа по подразбиране до активите в системата. Настойките за достъп до книги, глави и страници ще отменят тези настройки.', + 'role_asset_admins' => 'Администраторите автоматично получават достъп до цялото съдържание, но тези опции могат да показват или скриват опциите за потребителския интерфейс.', + 'role_all' => 'Всички', + 'role_own' => 'Собствени', + 'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to', + 'role_save' => 'Save Role', + 'role_update_success' => 'Role successfully updated', + 'role_users' => 'Users in this role', + 'role_users_none' => 'No users are currently assigned to this role', + + // Users + 'users' => 'Users', + 'user_profile' => 'User Profile', + 'users_add_new' => 'Add New User', + 'users_search' => 'Search Users', + 'users_details' => 'User Details', + 'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.', + 'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.', + 'users_role' => 'User Roles', + 'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.', + 'users_password' => 'User Password', + 'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 characters long.', + 'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.', + 'users_send_invite_option' => 'Send user invite email', + 'users_external_auth_id' => 'External Authentication ID', + 'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.', + 'users_password_warning' => 'Only fill the below if you would like to change your password.', + 'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.', + 'users_delete' => 'Delete User', + 'users_delete_named' => 'Delete user :userName', + 'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.', + 'users_delete_confirm' => 'Are you sure you want to delete this user?', + 'users_delete_success' => 'Users successfully removed', + 'users_edit' => 'Edit User', + 'users_edit_profile' => 'Edit Profile', + 'users_edit_success' => 'User successfully updated', + 'users_avatar' => 'User Avatar', + 'users_avatar_desc' => 'Select an image to represent this user. This should be approx 256px square.', + 'users_preferred_language' => 'Preferred Language', + 'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.', + 'users_social_accounts' => 'Social Accounts', + 'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not revoke previously authorized access. Revoke access from your profile settings on the connected social account.', + 'users_social_connect' => 'Connect Account', + 'users_social_disconnect' => 'Disconnect Account', + 'users_social_connected' => ':socialAccount account was successfully attached to your profile.', + 'users_social_disconnected' => ':socialAccount account was successfully disconnected from your profile.', + 'users_api_tokens' => 'API Tokens', + 'users_api_tokens_none' => 'No API tokens have been created for this user', + 'users_api_tokens_create' => 'Create Token', + 'users_api_tokens_expires' => 'Expires', + 'users_api_tokens_docs' => 'API Documentation', + + // API Tokens + 'user_api_token_create' => 'Create API Token', + 'user_api_token_name' => 'Name', + 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', + 'user_api_token_expiry' => 'Expiry Date', + 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_success' => 'API token successfully created', + 'user_api_token_update_success' => 'API token successfully updated', + 'user_api_token' => 'API Token', + 'user_api_token_id' => 'Token ID', + 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', + 'user_api_token_secret' => 'Token Secret', + 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', + 'user_api_token_delete' => 'Delete Token', + 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', + 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', + 'user_api_token_delete_success' => 'API token successfully deleted', + + //! If editing translations files directly please ignore this in all + //! languages apart from en. Content will be auto-copied from en. + //!//////////////////////////////// + 'language_select' => [ + 'en' => 'English', + 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', + 'cs' => 'Česky', + 'da' => 'Dansk', + 'de' => 'Deutsch (Sie)', + 'de_informal' => 'Deutsch (Du)', + 'es' => 'Español', + 'es_AR' => 'Español Argentina', + 'fr' => 'Français', + 'he' => 'עברית', + 'hu' => 'Magyar', + 'it' => 'Italian', + 'ja' => '日本語', + 'ko' => '한국어', + 'nl' => 'Nederlands', + 'pl' => 'Polski', + 'pt_BR' => 'Português do Brasil', + 'ru' => 'Русский', + 'sk' => 'Slovensky', + 'sl' => 'Slovenščina', + 'sv' => 'Svenska', + 'tr' => 'Türkçe', + 'uk' => 'Українська', + 'vi' => 'Tiếng Việt', + 'zh_CN' => '简体中文', + 'zh_TW' => '繁體中文', + ] + //!//////////////////////////////// +]; diff --git a/resources/lang/bg/validation.php b/resources/lang/bg/validation.php new file mode 100644 index 000000000..76b57a2a3 --- /dev/null +++ b/resources/lang/bg/validation.php @@ -0,0 +1,114 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values', + 'filled' => 'The :attribute field is required.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'exists' => 'The selected :attribute is invalid.', + 'image' => 'The :attribute must be an image.', + 'image_extension' => 'The :attribute must have a valid & supported image extension.', + 'in' => 'The selected :attribute is invalid.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'no_double_extension' => 'The :attribute must only have a single file extension.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'url' => 'The :attribute format is invalid.', + 'uploaded' => 'The file could not be uploaded. The server may not accept files of this size.', + + // Custom validation lines + 'custom' => [ + 'password-confirm' => [ + 'required_with' => 'Password confirmation required', + ], + ], + + // Custom validation attributes + 'attributes' => [], +]; diff --git a/resources/lang/cs/activities.php b/resources/lang/cs/activities.php index 23fce8108..92f4df8b6 100644 --- a/resources/lang/cs/activities.php +++ b/resources/lang/cs/activities.php @@ -6,43 +6,43 @@ return [ // Pages - 'page_create' => 'vytvořená stránka', + 'page_create' => 'vytvořil/a stránku', 'page_create_notification' => 'Stránka byla úspěšně vytvořena', - 'page_update' => 'aktualizovaná stránka', + 'page_update' => 'aktualizoval/a stránku', 'page_update_notification' => 'Stránka byla úspěšně aktualizována', - 'page_delete' => 'smazaná stránka', + 'page_delete' => 'odstranil/a stránku', 'page_delete_notification' => 'Stránka byla úspěšně smazána', - 'page_restore' => 'renovovaná stránka', - 'page_restore_notification' => 'Stránka byla úspěšně renovována', - 'page_move' => 'přesunutá stránka', + 'page_restore' => 'obnovil/a stránku', + 'page_restore_notification' => 'Stránka byla úspěšně obnovena', + 'page_move' => 'přesunul/a stránku', // Chapters - 'chapter_create' => 'vytvořená kapitola', + 'chapter_create' => 'vytvořil/a kapitolu', 'chapter_create_notification' => 'Kapitola byla úspěšně vytvořena', - 'chapter_update' => 'aktualizovaná kapitola', + 'chapter_update' => 'aktualizoval/a kapitolu', 'chapter_update_notification' => 'Kapitola byla úspěšně aktualizována', - 'chapter_delete' => 'smazaná kapitola', + 'chapter_delete' => 'smazal/a kapitolu', 'chapter_delete_notification' => 'Kapitola byla úspěšně smazána', - 'chapter_move' => 'přesunutá kapitola', + 'chapter_move' => 'přesunul/a kapitolu', // Books - 'book_create' => 'vytvořená kniha', + 'book_create' => 'vytvořil/a knihu', 'book_create_notification' => 'Kniha byla úspěšně vytvořena', - 'book_update' => 'aktualizovaná kniha', + 'book_update' => 'aktualizoval/a knihu', 'book_update_notification' => 'Kniha byla úspěšně aktualizována', - 'book_delete' => 'smazaná kniha', + 'book_delete' => 'smazal/a knihu', 'book_delete_notification' => 'Kniha byla úspěšně smazána', - 'book_sort' => 'seřazená kniha', + 'book_sort' => 'seřadil/a knihu', 'book_sort_notification' => 'Kniha byla úspěšně seřazena', // Bookshelves - 'bookshelf_create' => 'vytvořená knihovna', - 'bookshelf_create_notification' => 'Knihovna úspěšně vytvořena', - 'bookshelf_update' => 'aktualizovaná knihovna', + 'bookshelf_create' => 'vytvořil/a knihovnu', + 'bookshelf_create_notification' => 'Knihovna byla úspěšně vytvořena', + 'bookshelf_update' => 'aktualizoval/a knihovnu', 'bookshelf_update_notification' => 'Knihovna byla úspěšně aktualizována', - 'bookshelf_delete' => 'smazaná knihovna', - 'bookshelf_delete_notification' => 'Knihovna byla úspěšně smazána', + 'bookshelf_delete' => 'odstranil/a knihovnu', + 'bookshelf_delete_notification' => 'Knihovna byla úspěšně odstraněna', // Other - 'commented_on' => 'okomentováno v', + 'commented_on' => 'okomentoval/a', ]; diff --git a/resources/lang/cs/auth.php b/resources/lang/cs/auth.php index 0e841686d..c59ee85d9 100644 --- a/resources/lang/cs/auth.php +++ b/resources/lang/cs/auth.php @@ -6,72 +6,72 @@ */ return [ - 'failed' => 'Neplatné přihlašovací údaje.', - 'throttle' => 'Příliš pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.', + 'failed' => 'Tyto přihlašovací údaje neodpovídají našim záznamům.', + 'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.', // Login & Register 'sign_up' => 'Registrace', 'log_in' => 'Přihlášení', - 'log_in_with' => 'Přihlásit přes :socialDriver', - 'sign_up_with' => 'Registrovat se přes :socialDriver', + 'log_in_with' => 'Přihlásit se pomocí :socialDriver', + 'sign_up_with' => 'Registrovat se pomocí :socialDriver', 'logout' => 'Odhlásit', 'name' => 'Jméno', - 'username' => 'Jméno účtu', + 'username' => 'Uživatelské jméno', 'email' => 'E-mail', 'password' => 'Heslo', - 'password_confirm' => 'Potvrdit heslo', - 'password_hint' => 'Musí mít víc než 7 znaků', + 'password_confirm' => 'Oveření hesla', + 'password_hint' => 'Musí mít více než 7 znaků', 'forgot_password' => 'Zapomněli jste heslo?', - 'remember_me' => 'Neodhlašovat', + 'remember_me' => 'Zapamatovat si mě', 'ldap_email_hint' => 'Zadejte email, který chcete přiřadit k tomuto účtu.', 'create_account' => 'Vytvořit účet', - 'already_have_account' => 'Máte už založený účet?', - 'dont_have_account' => 'Nemáte učet?', - 'social_login' => 'Přihlášení přes sociální sítě', - 'social_registration' => 'Registrace přes sociální sítě', - 'social_registration_text' => 'Registrovat a přihlásit se přes jinou službu', + 'already_have_account' => 'Již máte účet?', + 'dont_have_account' => 'Nemáte účet?', + 'social_login' => 'Přihlášení pomocí sociálních sítí', + 'social_registration' => 'Přihlášení pomocí sociálních sítí', + 'social_registration_text' => 'Registrovat a přihlásit se pomocí jiné služby.', - 'register_thanks' => 'Díky za registraci!', - 'register_confirm' => 'Zkontrolujte prosím váš email a klikněte na potvrzovací tlačítko pro dokončení registrace do :appName.', - 'registrations_disabled' => 'Registrace jsou momentálně pozastaveny', - 'registration_email_domain_invalid' => 'Registrace z této emailové domény nejsou povoleny.', - 'register_success' => 'Díky za registraci! Jste registrovaní a přihlášení.', + 'register_thanks' => 'Děkujeme za registraci!', + 'register_confirm' => 'Zkontrolujte prosím svůj e-mail a klikněte na potvrzovací tlačítko pro přístup do :appName.', + 'registrations_disabled' => 'Registrace jsou aktuálně zakázány', + 'registration_email_domain_invalid' => 'Tato e-mailová doména nemá přístup k této aplikaci', + 'register_success' => 'Děkujeme za registraci! Nyní jste zaregistrováni a přihlášeni.', // Password Reset - 'reset_password' => 'Resetovat heslo', - 'reset_password_send_instructions' => 'Zadejte vaší emailovou adresu a bude vám zaslán odkaz na resetování hesla.', - 'reset_password_send_button' => 'Poslat odkaz pro reset hesla', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', - 'reset_password_success' => 'Vaše heslo bylo úspěšně resetováno.', - 'email_reset_subject' => 'Reset hesla do :appName', - 'email_reset_text' => 'Tento email jste obdrželi, protože jsme dostali žádost o resetování vašeho hesla k účtu v :appName.', - 'email_reset_not_requested' => 'Pokud jste o reset vašeho hesla nežádali, prostě tento dopis smažte a je to.', + 'reset_password' => 'Obnovit heslo', + 'reset_password_send_instructions' => 'Níže zadejte svou e-mailovou adresu a bude vám zaslán e-mail s odkazem pro obnovení hesla.', + 'reset_password_send_button' => 'Zaslat odkaz pro obnovení', + 'reset_password_sent' => 'Odkaz pro obnovení hesla bude odeslán na :email, pokud bude tato e-mailová adresa nalezena v systému.', + 'reset_password_success' => 'Vaše heslo bylo úspěšně obnoveno.', + 'email_reset_subject' => 'Obnovit heslo do :appName', + 'email_reset_text' => 'Tento e-mail jste obdrželi, protože jsme obdrželi žádost o obnovení hesla k vašemu účtu.', + 'email_reset_not_requested' => 'Pokud jste o obnovení hesla nežádali, není vyžadována žádná další akce.', // Email Confirmation - 'email_confirm_subject' => 'Potvrďte vaši emailovou adresu pro :appName', + 'email_confirm_subject' => 'Potvrďte svůj e-mail pro :appName', 'email_confirm_greeting' => 'Díky že jste se přidali do :appName!', - 'email_confirm_text' => 'Prosíme potvrďte funkčnost vaší emailové adresy kliknutím na tlačítko níže:', - 'email_confirm_action' => 'Potvrdit emailovou adresu', - 'email_confirm_send_error' => 'Potvrzení emailové adresy je vyžadováno, ale systém vám nedokázal odeslat email. Kontaktujte správce aby to dal do kupy a potvrzovací email vám dorazil.', - 'email_confirm_success' => 'Vaše emailová adresa byla potvrzena!', - 'email_confirm_resent' => 'Email s žádostí o potvrzení vaší emailové adresy byl odeslán. Podívejte se do příchozí pošty.', + 'email_confirm_text' => 'Prosíme potvrďte svou e-mailovou adresu kliknutím na níže uvedené tlačítko:', + 'email_confirm_action' => 'Potvrdit e-mail', + 'email_confirm_send_error' => 'Potvrzení e-mailu je vyžadováno, ale systém nemohl odeslat e-mail. Obraťte se na správce, abyste se ujistili, že je e-mail správně nastaven.', + 'email_confirm_success' => 'Váš e-mail byla potvrzen!', + 'email_confirm_resent' => 'E-mail s potvrzením byl znovu odeslán. Zkontrolujte svou příchozí poštu.', - 'email_not_confirmed' => 'Emailová adresa nebyla potvrzena', - 'email_not_confirmed_text' => 'Vaše emailová adresa nebyla dosud potvrzena.', - 'email_not_confirmed_click_link' => 'Klikněte na odkaz v emailu který jsme vám zaslali ihned po registraci.', - 'email_not_confirmed_resend' => 'Pokud nemůžete nalézt email v příchozí poště, můžete si jej nechat poslat znovu pomocí formuláře níže.', - 'email_not_confirmed_resend_button' => 'Znovu poslat email pro potvrzení emailové adresy', + 'email_not_confirmed' => 'E-mailová adresa nebyla potvrzena', + 'email_not_confirmed_text' => 'Vaše e-mailová adresa nebyla dosud potvrzena.', + 'email_not_confirmed_click_link' => 'Klikněte prosím na odkaz v e-mailu, který byl odeslán krátce po registraci.', + 'email_not_confirmed_resend' => 'Pokud nemůžete e-mail nalézt, můžete znovu odeslat potvrzovací e-mail odesláním níže uvedeného formuláře.', + 'email_not_confirmed_resend_button' => 'Znovu odeslat potvrzovací e-mail', // User Invite - 'user_invite_email_subject' => 'Byl jste pozván do :appName!', + 'user_invite_email_subject' => 'Byli jste pozváni přidat se do :appName!', 'user_invite_email_greeting' => 'Byl pro vás vytvořen účet na :appName.', - 'user_invite_email_text' => 'Klikněte na tlačítko níže pro nastavení hesla k účtu a získání přístupu:', - 'user_invite_email_action' => 'Nastavit heslo účtu', + 'user_invite_email_text' => 'Klikněte na níže uvedené tlačítko pro nastavení hesla k účtu a získání přístupu:', + 'user_invite_email_action' => 'Nastavit heslo k účtu', 'user_invite_page_welcome' => 'Vítejte v :appName!', - 'user_invite_page_text' => 'Chcete-li dokončit svůj účet a získat přístup, musíte nastavit heslo, které bude použito k přihlášení do :appName při budoucích návštěvách.', + 'user_invite_page_text' => 'Pro dokončení vašeho účtu a získání přístupu musíte nastavit heslo, které bude použito k přihlášení do :appName při budoucích návštěvách.', 'user_invite_page_confirm_button' => 'Potvrdit heslo', 'user_invite_success' => 'Heslo nastaveno, nyní máte přístup k :appName!' -]; \ No newline at end of file +]; diff --git a/resources/lang/cs/common.php b/resources/lang/cs/common.php index 3586a6126..bdfaa2eea 100644 --- a/resources/lang/cs/common.php +++ b/resources/lang/cs/common.php @@ -5,38 +5,39 @@ return [ // Buttons - 'cancel' => 'Storno', + 'cancel' => 'Zrušit', 'confirm' => 'Potvrdit', 'back' => 'Zpět', 'save' => 'Uložit', 'continue' => 'Pokračovat', - 'select' => 'Zvolit', + 'select' => 'Vybrat', 'toggle_all' => 'Přepnout vše', 'more' => 'Více', // Form Labels - 'name' => 'Jméno', + 'name' => 'Název', 'description' => 'Popis', - 'role' => 'Funkce', - 'cover_image' => 'Obrázek na přebal', - 'cover_image_description' => 'Obrázek by měl být asi 440 × 250px.', + 'role' => 'Role', + 'cover_image' => 'Obrázek obálky', + 'cover_image_description' => 'Obrázek by měl být přibližně 440×250px.', // Actions 'actions' => 'Akce', - 'view' => 'Pohled', + 'view' => 'Zobrazit', 'view_all' => 'Zobrazit vše', 'create' => 'Vytvořit', 'update' => 'Aktualizovat', 'edit' => 'Upravit', - 'sort' => 'Řadit', + 'sort' => 'Seřadit', 'move' => 'Přesunout', 'copy' => 'Kopírovat', 'reply' => 'Odpovědět', - 'delete' => 'Smazat', + 'delete' => 'Odstranit', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Hledat', - 'search_clear' => 'Vyčistit hledání', - 'reset' => 'Resetovat', - 'remove' => 'Odstranit', + 'search_clear' => 'Vymazat hledání', + 'reset' => 'Obnovit', + 'remove' => 'Odebrat', 'add' => 'Přidat', 'fullscreen' => 'Celá obrazovka', @@ -45,35 +46,35 @@ return [ 'sort_direction_toggle' => 'Přepínač směru řazení', 'sort_ascending' => 'Řadit vzestupně', 'sort_descending' => 'Řadit sestupně', - 'sort_name' => 'Jméno', + 'sort_name' => 'Název', 'sort_created_at' => 'Datum vytvoření', 'sort_updated_at' => 'Datum aktualizace', // Misc - 'deleted_user' => 'Smazaný uživatel', + 'deleted_user' => 'Odstraněný uživatel', 'no_activity' => 'Žádná aktivita k zobrazení', - 'no_items' => 'Žádné položky nejsou k mání', + 'no_items' => 'Žádné položky k dispozici', 'back_to_top' => 'Zpět na začátek', - 'toggle_details' => 'Ukázat detaily', - 'toggle_thumbnails' => 'Ukázat náhledy', - 'details' => 'Detaily', - 'grid_view' => 'Zobrazit dlaždice', - 'list_view' => 'Zobrazit seznam', + 'toggle_details' => 'Přepnout podrobnosti', + 'toggle_thumbnails' => 'Přepnout náhledy', + 'details' => 'Podrobnosti', + 'grid_view' => 'Zobrazení mřížky', + 'list_view' => 'Zobrazení seznamu', 'default' => 'Výchozí', 'breadcrumb' => 'Drobečková navigace', // Header 'profile_menu' => 'Nabídka profilu', - 'view_profile' => 'Ukázat profil', + 'view_profile' => 'Zobrazit profil', 'edit_profile' => 'Upravit profil', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Tmavý režim', + 'light_mode' => 'Světelný režim', // Layout tabs - 'tab_info' => 'Info', + 'tab_info' => 'Informace', 'tab_content' => 'Obsah', // Email Content - 'email_action_help' => 'Pokud se vám nedaří kliknout na tlačítko ":actionText", zkopírujte odkaz níže přímo do webového prohlížeče:', + 'email_action_help' => 'Pokud se vám nedaří kliknout na tlačítko „:actionText“, zkopírujte a vložte níže uvedenou URL do vašeho webového prohlížeče:', 'email_rights' => 'Všechna práva vyhrazena', ]; diff --git a/resources/lang/cs/components.php b/resources/lang/cs/components.php index a62914f1b..178f92149 100644 --- a/resources/lang/cs/components.php +++ b/resources/lang/cs/components.php @@ -5,29 +5,30 @@ return [ // Image Manager - 'image_select' => 'Volba obrázku', + 'image_select' => 'Výběr obrázku', 'image_all' => 'Vše', 'image_all_title' => 'Zobrazit všechny obrázky', - 'image_book_title' => 'Zobrazit obrázky nahrané k této knize', - 'image_page_title' => 'Zobrazit obrázky nahrané k této stránce', + 'image_book_title' => 'Zobrazit obrázky nahrané do této knihy', + 'image_page_title' => 'Zobrazit obrázky nahrané na tuto stránku', 'image_search_hint' => 'Hledat podle názvu obrázku', 'image_uploaded' => 'Nahráno :uploadedDate', 'image_load_more' => 'Načíst další', 'image_image_name' => 'Název obrázku', - 'image_delete_used' => 'Tento obrázek je použit v následujících stránkách.', - 'image_delete_confirm' => 'Stisknětě smazat ještě jednou pro potvrzení smazání tohoto obrázku.', - 'image_select_image' => 'Zvolte obrázek', - 'image_dropzone' => 'Přetáhněte sem obrázky myší nebo sem klikněte pro vybrání souboru.', - 'images_deleted' => 'Obrázky smazány', + 'image_delete_used' => 'Tento obrázek je použit na níže uvedených stránkách.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', + 'image_select_image' => 'Vyberte obrázek', + 'image_dropzone' => 'Přetáhněte obrázky nebo klikněte sem pro nahrání', + 'images_deleted' => 'Obrázky odstraněny', 'image_preview' => 'Náhled obrázku', 'image_upload_success' => 'Obrázek byl úspěšně nahrán', 'image_update_success' => 'Podrobnosti o obrázku byly úspěšně aktualizovány', - 'image_delete_success' => 'Obrázek byl úspěšně smazán', - 'image_upload_remove' => 'Odstranit', + 'image_delete_success' => 'Obrázek byl úspěšně odstraněn', + 'image_upload_remove' => 'Odebrat', // Code Editor 'code_editor' => 'Upravit kód', 'code_language' => 'Jazyk kódu', 'code_content' => 'Obsah kódu', + 'code_session_history' => 'Historie relace', 'code_save' => 'Uložit kód', ]; diff --git a/resources/lang/cs/entities.php b/resources/lang/cs/entities.php index 579d49127..f8597ebb5 100644 --- a/resources/lang/cs/entities.php +++ b/resources/lang/cs/entities.php @@ -11,72 +11,73 @@ return [ 'recently_updated_pages' => 'Nedávno aktualizované stránky', 'recently_created_chapters' => 'Nedávno vytvořené kapitoly', 'recently_created_books' => 'Nedávno vytvořené knihy', - 'recently_created_shelves' => 'Recently Created Shelves', + 'recently_created_shelves' => 'Nedávno vytvořené knihovny', 'recently_update' => 'Nedávno aktualizované', - 'recently_viewed' => 'Nedávno prohlížené', - 'recent_activity' => 'Nedávné činnosti', - 'create_now' => 'Vytvořte jí', + 'recently_viewed' => 'Nedávno zobrazené', + 'recent_activity' => 'Nedávné aktivity', + 'create_now' => 'Vytvořte ji nyní', 'revisions' => 'Revize', - 'meta_revision' => 'Revize #:revisionCount', + 'meta_revision' => 'Revize č. :revisionCount', 'meta_created' => 'Vytvořeno :timeLength', 'meta_created_name' => 'Vytvořeno :timeLength uživatelem :user', 'meta_updated' => 'Aktualizováno :timeLength', 'meta_updated_name' => 'Aktualizováno :timeLength uživatelem :user', - 'entity_select' => 'Volba prvku', + 'entity_select' => 'Výběr entity', 'images' => 'Obrázky', 'my_recent_drafts' => 'Mé nedávné koncepty', - 'my_recently_viewed' => 'Naposledy navštívené', - 'no_pages_viewed' => 'Zatím jste nic neshlédli', - 'no_pages_recently_created' => 'Zatím nebyly vytvořeny žádné stránky', - 'no_pages_recently_updated' => 'Zatím nebyly aktualizovány žádné stránky', - 'export' => 'Export', - 'export_html' => 'Všeobjímající HTML', - 'export_pdf' => 'PDF dokument', - 'export_text' => 'Čistý text (txt)', + 'my_recently_viewed' => 'Mé nedávno zobrazené', + 'no_pages_viewed' => 'Nezobrazili jste žádné stránky', + 'no_pages_recently_created' => 'Nedávno nebyly vytvořeny žádné stránky', + 'no_pages_recently_updated' => 'Nedávno nebyly aktualizovány žádné stránky', + 'export' => 'Exportovat', + 'export_html' => 'Konsolidovaný webový soubor', + 'export_pdf' => 'Soubor PDF', + 'export_text' => 'Textový soubor', // Permissions and restrictions - 'permissions' => 'Práva', - 'permissions_intro' => 'Zaškrtnutím překryjete práva v uživatelských rolích nastavením níže.', - 'permissions_enable' => 'Zapnout vlastní práva', - 'permissions_save' => 'Uložit práva', + 'permissions' => 'Oprávnění', + 'permissions_intro' => 'Pokud je povoleno, tato oprávnění budou mít přednost před všemi nastavenými oprávněními role.', + 'permissions_enable' => 'Povolit vlastní oprávnění', + 'permissions_save' => 'Uložit oprávnění', // Search 'search_results' => 'Výsledky hledání', 'search_total_results_found' => 'Nalezen :count výsledek|Nalezeny :count výsledky|Nalezeny :count výsledky|Nalezeny :count výsledky|Nalezeno :count výsledků', - 'search_clear' => 'Vyčistit hledání', - 'search_no_pages' => 'Žádná stránka neodpovídá hledanému výrazu', + 'search_clear' => 'Vymazat hledání', + 'search_no_pages' => 'Tomuto hledání neodpovídají žádné stránky', 'search_for_term' => 'Hledat :term', 'search_more' => 'Další výsledky', - 'search_filters' => 'Filtry hledání', + 'search_advanced' => 'Rozšířené hledání', + 'search_terms' => 'Hledané výrazy', 'search_content_type' => 'Typ obsahu', - 'search_exact_matches' => 'Musí obsahovat', - 'search_tags' => 'Hledat štítky (tagy)', - 'search_options' => 'Volby', - 'search_viewed_by_me' => 'Shlédnuto mnou', - 'search_not_viewed_by_me' => 'Neshlédnuto mnou', - 'search_permissions_set' => 'Sada práv', + 'search_exact_matches' => 'Přesné shody', + 'search_tags' => 'Hledat štítky', + 'search_options' => 'Možnosti', + 'search_viewed_by_me' => 'Zobrazeno mnou', + 'search_not_viewed_by_me' => 'Nezobrazeno mnou', + 'search_permissions_set' => 'Sada oprávnění', 'search_created_by_me' => 'Vytvořeno mnou', - 'search_updated_by_me' => 'Aktualizováno', - 'search_date_options' => 'Volby datumu', + 'search_updated_by_me' => 'Aktualizováno mnou', + 'search_date_options' => 'Možnosti data', 'search_updated_before' => 'Aktualizováno před', 'search_updated_after' => 'Aktualizováno po', 'search_created_before' => 'Vytvořeno před', 'search_created_after' => 'Vytvořeno po', - 'search_set_date' => 'Datum', - 'search_update' => 'Hledat znovu', + 'search_set_date' => 'Nastavit datum', + 'search_update' => 'Aktualizovat hledání', // Shelves 'shelf' => 'Knihovna', 'shelves' => 'Knihovny', - 'x_shelves' => ':count Shelf|:count Shelves', + 'x_shelves' => '{0}:count knihoven|{1}:count knihovna|[2,4]:count knihovny|[5,*]:count knihoven', 'shelves_long' => 'Knihovny', - 'shelves_empty' => 'Žádné knihovny nebyly vytvořeny', + 'shelves_empty' => 'Nebyly vytvořeny žádné knihovny', 'shelves_create' => 'Vytvořit novou knihovnu', 'shelves_popular' => 'Populární knihovny', 'shelves_new' => 'Nové knihovny', - 'shelves_new_action' => 'New Shelf', + 'shelves_new_action' => 'Nová Knihovna', 'shelves_popular_empty' => 'Nejpopulárnější knihovny se objeví zde.', - 'shelves_new_empty' => 'Nejnovější knihovny se objeví zde.', + 'shelves_new_empty' => 'Zde se objeví nejnověji vytvořené knihovny.', 'shelves_save' => 'Uložit knihovnu', 'shelves_books' => 'Knihy v této knihovně', 'shelves_add_books' => 'Přidat knihy do knihovny', @@ -85,67 +86,67 @@ return [ 'shelves_edit_and_assign' => 'Pro přidáni knih do knihovny stiskněte úprvy.', 'shelves_edit_named' => 'Upravit knihovnu :name', 'shelves_edit' => 'Upravit knihovnu', - 'shelves_delete' => 'Smazat knihovnu', - 'shelves_delete_named' => 'Smazat knihovnu :name', - 'shelves_delete_explain' => "Chystáte se smazat knihovnu ':name'. Knihy v ní obsažené zůstanou zachovány.", - 'shelves_delete_confirmation' => 'Opravdu chcete smazat tuto knihovnu?', - 'shelves_permissions' => 'Práva knihovny', - 'shelves_permissions_updated' => 'Práva knihovny byla aktualizována', - 'shelves_permissions_active' => 'Účinná práva knihovny', - 'shelves_copy_permissions_to_books' => 'Přenést práva na knihy', - 'shelves_copy_permissions' => 'Zkopírovat práva', - 'shelves_copy_permissions_explain' => 'Práva knihovny budou aplikována na všechny knihy v ní obsažené. Před použitím se ujistěte, že jste uložili změny práv knihovny.', - 'shelves_copy_permission_success' => 'Práva knihovny přenesena na knihy (celkem :count)', + 'shelves_delete' => 'Odstranit knihovnu', + 'shelves_delete_named' => 'Odstranit knihovnu :name', + 'shelves_delete_explain' => "Toto odstraní knihovnu s názvem ‚:name‘. Obsažené knihy nebudou odstraněny.", + 'shelves_delete_confirmation' => 'Opravdu chcete odstranit tuto knihovnu?', + 'shelves_permissions' => 'Oprávnění knihovny', + 'shelves_permissions_updated' => 'Oprávnění knihovny byla aktualizována', + 'shelves_permissions_active' => 'Oprávnění knihovny jsou aktivní', + 'shelves_copy_permissions_to_books' => 'Kopírovat oprávnění na knihy', + 'shelves_copy_permissions' => 'Kopírovat oprávnění', + 'shelves_copy_permissions_explain' => 'Toto použije aktuální nastavení oprávnění této knihovny na všechny knihy v ní obsažené. Před aktivací se ujistěte, že byly uloženy všechny změny oprávnění této knihovny.', + 'shelves_copy_permission_success' => 'Oprávnění knihovny byla zkopírována na :count knih', // Books 'book' => 'Kniha', 'books' => 'Knihy', - 'x_books' => ':count Kniha|:count Knihy|:count Knihy|:count Knihy|:count Knih', - 'books_empty' => 'Žádné knihy nebyly vytvořeny', - 'books_popular' => 'Populární knihy', + 'x_books' => '{0}:count knih|{1}:count kniha|[2,4]:count knihy|[5,*]:count knih', + 'books_empty' => 'Nebyly vytvořeny žádné knihy', + 'books_popular' => 'Oblíbené knihy', 'books_recent' => 'Nedávné knihy', 'books_new' => 'Nové knihy', - 'books_new_action' => 'New Book', - 'books_popular_empty' => 'Zde budou zobrazeny nejpopulárnější knihy.', - 'books_new_empty' => 'Zde budou zobrazeny nově vytvořené knihy.', + 'books_new_action' => 'Nová kniha', + 'books_popular_empty' => 'Zde se objeví nejoblíbenější knihy.', + 'books_new_empty' => 'Zde se objeví nejnověji vytvořené knihy.', 'books_create' => 'Vytvořit novou knihu', - 'books_delete' => 'Smazat knihu', - 'books_delete_named' => 'Smazat knihu :bookName', - 'books_delete_explain' => 'Kniha \':bookName\' bude smazána. Všechny její stránky a kapitoly budou taktéž smazány.', - 'books_delete_confirmation' => 'Opravdu chcete tuto knihu smazat.', + 'books_delete' => 'Odstranit knihu', + 'books_delete_named' => 'Odstranit knihu :bookName', + 'books_delete_explain' => 'Toto odstraní knihu s názvem ‚:bookName‘. Všechny stránky a kapitoly budou odebrány.', + 'books_delete_confirmation' => 'Opravdu chcete odstranit tuto knihu?', 'books_edit' => 'Upravit knihu', 'books_edit_named' => 'Upravit knihu :bookName', 'books_form_book_name' => 'Název knihy', 'books_save' => 'Uložit knihu', - 'books_permissions' => 'Práva knihy', - 'books_permissions_updated' => 'Práva knihy upravena', - 'books_empty_contents' => 'V této knize nebyly vytvořeny žádné stránky ani kapitoly.', + 'books_permissions' => 'Oprávnění knihy', + 'books_permissions_updated' => 'Oprávnění knihy aktualizována', + 'books_empty_contents' => 'Pro tuto knihu nebyly vytvořeny žádné stránky nebo kapitoly.', 'books_empty_create_page' => 'Vytvořit novou stránku', - 'books_empty_sort_current_book' => 'Seřadit tuto knihu', + 'books_empty_sort_current_book' => 'Seřadit aktuální knihu', 'books_empty_add_chapter' => 'Přidat kapitolu', - 'books_permissions_active' => 'Účinná práva knihy', + 'books_permissions_active' => 'Oprávnění knihy jsou aktivní', 'books_search_this' => 'Prohledat tuto knihu', - 'books_navigation' => 'Obsah knihy', + 'books_navigation' => 'Navigace knihy', 'books_sort' => 'Seřadit obsah knihy', 'books_sort_named' => 'Seřadit knihu :bookName', - 'books_sort_name' => 'Sort by Name', - 'books_sort_created' => 'Sort by Created Date', - 'books_sort_updated' => 'Sort by Updated Date', - 'books_sort_chapters_first' => 'Chapters First', - 'books_sort_chapters_last' => 'Chapters Last', - 'books_sort_show_other' => 'Ukázat ostatní knihy', + 'books_sort_name' => 'Seřadit podle názvu', + 'books_sort_created' => 'Seřadit podle data vytvoření', + 'books_sort_updated' => 'Seřadit podle data aktualizace', + 'books_sort_chapters_first' => 'Kapitoly první', + 'books_sort_chapters_last' => 'Kapitoly poslední', + 'books_sort_show_other' => 'Zobrazit ostatní knihy', 'books_sort_save' => 'Uložit nové pořadí', // Chapters 'chapter' => 'Kapitola', 'chapters' => 'Kapitoly', - 'x_chapters' => ':count kapitola|:count kapitoly|:count kapitoly|:count kapitoly|:count kapitol', + 'x_chapters' => '{0}:count Kapitol|{1}:count Kapitola|[2,4]:count Kapitoly|[5,*]:count Kapitol', 'chapters_popular' => 'Populární kapitoly', 'chapters_new' => 'Nová kapitola', 'chapters_create' => 'Vytvořit novou kapitolu', 'chapters_delete' => 'Smazat kapitolu', 'chapters_delete_named' => 'Smazat kapitolu :chapterName', - 'chapters_delete_explain' => 'Kapitola \':chapterName\' bude smazána. Všechny stránky v ní obsažené budou přesunuty přímo pod samotnou knihu.', + 'chapters_delete_explain' => "Kapitola ':chapterName' bude smazána. Všechny stránky v ní obsažené budou přesunuty přímo pod samotnou knihu.", 'chapters_delete_confirm' => 'Opravdu chcete tuto kapitolu smazat?', 'chapters_edit' => 'Upravit kapitolu', 'chapters_edit_named' => 'Upravit kapitolu :chapterName', @@ -162,7 +163,7 @@ return [ // Pages 'page' => 'Stránka', 'pages' => 'Stránky', - 'x_pages' => ':count strana|:count strany|:count strany|:count strany|:count stran', + 'x_pages' => '{0}:count Stran|{1}:count Strana|[2,4]:count Strany|[5,*]:count Stran', 'pages_popular' => 'Populární stránky', 'pages_new' => 'Nová stránka', 'pages_attachments' => 'Přílohy', @@ -170,55 +171,55 @@ return [ 'pages_delete' => 'Smazat stránku', 'pages_delete_named' => 'Smazat stránku :pageName', 'pages_delete_draft_named' => 'Smazat koncept stránky :pageName', - 'pages_delete_draft' => 'Smazat koncept stránky', - 'pages_delete_success' => 'Stránka smazána', - 'pages_delete_draft_success' => 'Koncept stránky smazán', - 'pages_delete_confirm' => 'Opravdu chcete tuto stránku smazat?', - 'pages_delete_draft_confirm' => 'Opravdu chcete tento koncept stránky smazat?', + 'pages_delete_draft' => 'Odstranit koncept stránky', + 'pages_delete_success' => 'Stránka odstraněna', + 'pages_delete_draft_success' => 'Koncept stránky odstraněn', + 'pages_delete_confirm' => 'Opravdu chcete odstranit tuto stránku?', + 'pages_delete_draft_confirm' => 'Opravdu chcete odstranit tento koncept stránky?', 'pages_editing_named' => 'Úpravy stránky :pageName', - 'pages_edit_draft_options' => 'Draft Options', + 'pages_edit_draft_options' => 'Možnosti konceptu', 'pages_edit_save_draft' => 'Uložit koncept', 'pages_edit_draft' => 'Upravit koncept stránky', - 'pages_editing_draft' => 'Úpravy konceptu', + 'pages_editing_draft' => 'Úprava konceptu', 'pages_editing_page' => 'Úpravy stránky', 'pages_edit_draft_save_at' => 'Koncept uložen v ', - 'pages_edit_delete_draft' => 'Smazat koncept', + 'pages_edit_delete_draft' => 'Odstranit koncept', 'pages_edit_discard_draft' => 'Zahodit koncept', - 'pages_edit_set_changelog' => 'Zadat komentář ke změnám', - 'pages_edit_enter_changelog_desc' => 'Zadejte stručný popis změn, které jste provedli.', - 'pages_edit_enter_changelog' => 'Vložit komentáře ke změnám', + 'pages_edit_set_changelog' => 'Nastavit protokol změn', + 'pages_edit_enter_changelog_desc' => 'Zadejte stručný popis změn, které jste provedli', + 'pages_edit_enter_changelog' => 'Zadejte protokol změn', 'pages_save' => 'Uložit stránku', 'pages_title' => 'Nadpis stránky', 'pages_name' => 'Název stránky', 'pages_md_editor' => 'Editor', 'pages_md_preview' => 'Náhled', 'pages_md_insert_image' => 'Vložit obrázek', - 'pages_md_insert_link' => 'Vložit odkaz na prvek', + 'pages_md_insert_link' => 'Vložit odkaz na entitu', 'pages_md_insert_drawing' => 'Vložit kresbu', - 'pages_not_in_chapter' => 'Stránka není součástí žádné kapitoly', + 'pages_not_in_chapter' => 'Stránka není v kapitole', 'pages_move' => 'Přesunout stránku', 'pages_move_success' => 'Stránka přesunuta do ":parentName"', 'pages_copy' => 'Kopírovat stránku', 'pages_copy_desination' => 'Cíl kopírování', 'pages_copy_success' => 'Stránka byla úspěšně zkopírována', - 'pages_permissions' => 'Práva stránky', - 'pages_permissions_success' => 'Práva stránky aktualizována', + 'pages_permissions' => 'Oprávnění stránky', + 'pages_permissions_success' => 'Oprávnění stránky aktualizována', 'pages_revision' => 'Revize', 'pages_revisions' => 'Revize stránky', - 'pages_revisions_named' => 'Revize stránky :pageName', - 'pages_revision_named' => 'Revize stránky :pageName', + 'pages_revisions_named' => 'Revize stránky pro :pageName', + 'pages_revision_named' => 'Revize stránky pro :pageName', 'pages_revisions_created_by' => 'Vytvořeno uživatelem', 'pages_revisions_date' => 'Datum revize', - 'pages_revisions_number' => '#', - 'pages_revisions_numbered' => 'Revision #:id', - 'pages_revisions_numbered_changes' => 'Revision #:id Changes', - 'pages_revisions_changelog' => 'Komentáře změn', + 'pages_revisions_number' => 'Č.', + 'pages_revisions_numbered' => 'Revize č. :id', + 'pages_revisions_numbered_changes' => 'Změny revize č. :id', + 'pages_revisions_changelog' => 'Protokol změn', 'pages_revisions_changes' => 'Změny', 'pages_revisions_current' => 'Aktuální verze', 'pages_revisions_preview' => 'Náhled', - 'pages_revisions_restore' => 'Renovovat', + 'pages_revisions_restore' => 'Obnovit', 'pages_revisions_none' => 'Tato stránka nemá žádné revize', - 'pages_copy_link' => 'Zkopírovat odkaz', + 'pages_copy_link' => 'Kopírovat odkaz', 'pages_edit_content_link' => 'Upravit obsah', 'pages_permissions_active' => 'Účinná práva stránky', 'pages_initial_revision' => 'První vydání', @@ -227,14 +228,14 @@ return [ 'pages_draft_edited_notification' => 'Tato stránka se od té doby změnila. Je doporučeno aktuální koncept zahodit.', 'pages_draft_edit_active' => [ 'start_a' => 'Uživatelé začali upravovat tuto stránku (celkem :count)', - 'start_b' => 'Uživatel :userName začal upravovat tuto stránku', + 'start_b' => ':userName začal/a upravovat tuto stránku', 'time_a' => 'od doby, kdy byla tato stránky naposledy aktualizována', 'time_b' => 'v posledních minutách (:minCount min.)', 'message' => ':start :time. Dávejte pozor abyste nepřepsali změny ostatním!', ], - 'pages_draft_discarded' => 'Koncept zahozen. Editor nyní obsahuje aktuální verzi stránky.', + 'pages_draft_discarded' => 'Koncept byl zahozen. Editor nyní obsahuje aktuální verzi stránky.', 'pages_specific' => 'Konkrétní stránka', - 'pages_is_template' => 'Page Template', + 'pages_is_template' => 'Šablona stránky', // Editor Sidebar 'page_tags' => 'Štítky stránky', @@ -243,11 +244,11 @@ return [ 'shelf_tags' => 'Štítky knihovny', 'tag' => 'Štítek', 'tags' => 'Štítky', - 'tag_name' => 'Tag Name', - 'tag_value' => 'Hodnota Štítku (volitelné)', + 'tag_name' => 'Název štítku', + 'tag_value' => 'Hodnota štítku (volitelné)', 'tags_explain' => "Přidejte si štítky pro lepší kategorizaci knih. \n Štítky mohou nést i hodnotu pro detailnější klasifikaci.", 'tags_add' => 'Přidat další štítek', - 'tags_remove' => 'Remove this tag', + 'tags_remove' => 'Odstranit tento štítek', 'attachments' => 'Přílohy', 'attachments_explain' => 'Nahrajte soubory nebo připojte odkazy, které se zobrazí na stránce. Budou k nalezení v postranní liště.', 'attachments_explain_instant_save' => 'Změny zde provedené se okamžitě ukládají.', @@ -255,15 +256,16 @@ return [ 'attachments_upload' => 'Nahrát soubor', 'attachments_link' => 'Připojit odkaz', 'attachments_set_link' => 'Nastavit odkaz', - 'attachments_delete_confirm' => 'Stiskněte smazat znovu pro potvrzení smazání.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Přetáhněte sem soubory myší nebo sem kliknětě pro vybrání souboru.', 'attachments_no_files' => 'Žádné soubory nebyli nahrány', - 'attachments_explain_link' => 'Můžete pouze připojit odkaz pokud nechcete nahrávat soubor přímo. Může to být odkaz na jinou stránku nebo na soubor v cloudu.', + 'attachments_explain_link' => 'Můžete pouze připojit odkaz, pokud nechcete nahrávat soubor přímo. Může to být odkaz na jinou stránku nebo na soubor v cloudu.', 'attachments_link_name' => 'Název odkazu', 'attachment_link' => 'Odkaz na přílohu', 'attachments_link_url' => 'Odkaz na soubor', 'attachments_link_url_hint' => 'URL stránky nebo souboru', 'attach' => 'Připojit', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Upravit soubor', 'attachments_edit_file_name' => 'Název souboru', 'attachments_edit_drop_upload' => 'Přetáhněte sem soubor myší nebo klikněte pro nahrání nového a následné přepsání starého.', @@ -273,26 +275,26 @@ return [ 'attachments_file_uploaded' => 'Soubor byl úspěšně nahrán', 'attachments_file_updated' => 'Soubor byl úspěšně aktualizován', 'attachments_link_attached' => 'Odkaz úspěšně přiložen ke stránce', - 'templates' => 'Templates', - 'templates_set_as_template' => 'Page is a template', - 'templates_explain_set_as_template' => 'You can set this page as a template so its contents be utilized when creating other pages. Other users will be able to use this template if they have view permissions for this page.', - 'templates_replace_content' => 'Replace page content', - 'templates_append_content' => 'Append to page content', - 'templates_prepend_content' => 'Prepend to page content', + 'templates' => 'Šablony', + 'templates_set_as_template' => 'Tato stránka je šablona', + 'templates_explain_set_as_template' => 'Tuto stránku můžete nastavit jako šablonu, aby byl její obsah využit při vytváření dalších stránek. Ostatní uživatelé budou moci použít tuto šablonu, pokud mají oprávnění k zobrazení této stránky.', + 'templates_replace_content' => 'Nahradit obsah stránky', + 'templates_append_content' => 'Připojit za obsah stránky', + 'templates_prepend_content' => 'Připojit před obsah stránky', // Profile View 'profile_user_for_x' => 'Uživatelem již :time', 'profile_created_content' => 'Vytvořený obsah', - 'profile_not_created_pages' => ':userName nevytvořil/a žádný obsah', + 'profile_not_created_pages' => ':userName nevytvořil/a žádné stránky', 'profile_not_created_chapters' => ':userName nevytvořil/a žádné kapitoly', 'profile_not_created_books' => ':userName nevytvořil/a žádné knihy', - 'profile_not_created_shelves' => ':userName has not created any shelves', + 'profile_not_created_shelves' => ':userName nevytvořil/a žádné knihovny', // Comments 'comment' => 'Komentář', 'comments' => 'Komentáře', 'comment_add' => 'Přidat komentář', - 'comment_placeholder' => 'Zanechat komentář zde', + 'comment_placeholder' => 'Zanechte komentář zde', 'comment_count' => '{0} Bez komentářů|{1} 1 komentář|[2,4] :count komentáře|[5,*] :count komentářů', 'comment_save' => 'Uložit komentář', 'comment_saving' => 'Ukládání komentáře...', @@ -308,7 +310,7 @@ return [ // Revision 'revision_delete_confirm' => 'Opravdu chcete smazat tuto revizi?', - 'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.', + 'revision_restore_confirm' => 'Jste si jisti, že chcete obnovit tuto revizi? Aktuální obsah stránky bude nahrazen.', 'revision_delete_success' => 'Revize smazána', 'revision_cannot_delete_latest' => 'Nelze smazat poslední revizi.' -]; \ No newline at end of file +]; diff --git a/resources/lang/cs/errors.php b/resources/lang/cs/errors.php index f3b87fc02..a498906cb 100644 --- a/resources/lang/cs/errors.php +++ b/resources/lang/cs/errors.php @@ -9,31 +9,31 @@ return [ 'permissionJson' => 'Nemáte povolení k provedení požadované akce.', // Auth - 'error_user_exists_different_creds' => 'Uživatel s emailem :email již existuje ale s jinými přihlašovacími údaji.', - 'email_already_confirmed' => 'Emailová adresa již byla potvrzena. Zkuste se přihlásit.', + 'error_user_exists_different_creds' => 'Uživatel s e-mailem :email již existuje ale s jinými přihlašovacími údaji.', + 'email_already_confirmed' => 'E-mailová adresa již byla potvrzena. Zkuste se přihlásit.', 'email_confirmation_invalid' => 'Tento potvrzovací odkaz již neplatí nebo už byl použit. Zkuste prosím registraci znovu.', 'email_confirmation_expired' => 'Potvrzovací odkaz už neplatí, email s novým odkazem už byl poslán.', - 'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed', + 'email_confirmation_awaiting' => 'E-mailová adresa pro používaný účet musí být potvrzena', 'ldap_fail_anonymous' => 'Přístup k adresáři LDAP jako anonymní uživatel (anonymous bind) selhal', 'ldap_fail_authed' => 'Přístup k adresáři LDAP pomocí zadaného jména (dn) a hesla selhal', 'ldap_extension_not_installed' => 'Není nainstalováno rozšíření LDAP pro PHP', 'ldap_cannot_connect' => 'Nelze se připojit k adresáři LDAP. Prvotní připojení selhalo.', - 'saml_already_logged_in' => 'Already logged in', - 'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled', + 'saml_already_logged_in' => 'Již jste přihlášeni', + 'saml_user_not_registered' => 'Uživatel :name není registrován a automatická registrace je zakázána', 'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system', 'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.', - 'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization', + 'saml_fail_authed' => 'Přihlášení pomocí :system selhalo, systém neposkytl úspěšnou autorizaci', 'social_no_action_defined' => 'Nebyla zvolena žádá akce', 'social_login_bad_response' => "Nastala chyba během přihlašování přes :socialAccount \n:error", 'social_account_in_use' => 'Tento účet na :socialAccount se již používá. Pokuste se s ním přihlásit volbou Přihlásit přes :socialAccount.', - 'social_account_email_in_use' => 'Emailová adresa :email se již používá. Pokud máte již máte náš účet, můžete si jej propojit se svým účtem na :socialAccount v nastavení vašeho profilu.', + 'social_account_email_in_use' => 'E-mailová adresa :email se již používá. Pokud máte již máte náš účet, můžete si jej propojit se svým účtem na :socialAccount v nastavení vašeho profilu.', 'social_account_existing' => 'Tento účet na :socialAccount je již propojen s vaším profilem zde.', 'social_account_already_used_existing' => 'Tento účet na :socialAccount je již používán jiným uživatelem.', 'social_account_not_used' => 'Tento účet na :socialAccount není spřažen s žádným uživatelem. Prosím přiřaďtě si jej v nastavení svého profilu.', 'social_account_register_instructions' => 'Pokud ještě nemáte náš účet, můžete se zaregistrovat pomocí vašeho účtu na :socialAccount.', 'social_driver_not_found' => 'Doplněk pro tohoto správce identity nebyl nalezen.', 'social_driver_not_configured' => 'Nastavení vašeho účtu na :socialAccount není správné. :socialAccount musí mít vaše svolení pro naší aplikaci vás přihlásit.', - 'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.', + 'invite_token_expired' => 'Odkaz v pozvánce již bohužel expiroval. Namísto toho ale můžete zkusit resetovat heslo do Vašeho účtu.', // System 'path_not_writable' => 'Nelze zapisovat na cestu k souboru :filePath. Zajistěte aby se dalo nahrávat na server.', @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Nahrávání souboru trvalo příliš dlouho a tak bylo ukončeno.', // Attachments - 'attachment_page_mismatch' => 'Došlo ke zmatení stránky během nahrávání přílohy.', 'attachment_not_found' => 'Příloha nenalezena', // Pages @@ -61,11 +60,11 @@ return [ 'chapter_not_found' => 'Kapitola nenalezena', 'selected_book_not_found' => 'Vybraná kniha nebyla nalezena', 'selected_book_chapter_not_found' => 'Zvolená kniha nebo kapitola nebyla nalezena', - 'guests_cannot_save_drafts' => 'Návštěvníci z řad veřejnosti nemohou ukládat koncepty.', + 'guests_cannot_save_drafts' => 'Nepřihlášení návštěvníci nemohou ukládat koncepty.', // Users 'users_cannot_delete_only_admin' => 'Nemůžete smazat posledního administrátora', - 'users_cannot_delete_guest' => 'Uživatele host není možno smazat', + 'users_cannot_delete_guest' => 'Uživatele Guest není možno smazat', // Roles 'role_cannot_be_edited' => 'Tuto roli nelze editovat', @@ -74,30 +73,30 @@ return [ 'role_cannot_remove_only_admin' => 'Tento uživatel má roli administrátora. Přiřaďte roli administrátora někomu jinému než jí odeberete zde.', // Comments - 'comment_list' => 'Při dotahování komentářů nastala chyba.', + 'comment_list' => 'Při načítání komentářů nastala chyba.', 'cannot_add_comment_to_draft' => 'Nemůžete přidávat komentáře ke konceptu.', - 'comment_add' => 'Při přidávání / aktualizaci komentáře nastala chyba.', + 'comment_add' => 'Při přidávání / úpravě komentáře nastala chyba.', 'comment_delete' => 'Při mazání komentáře nastala chyba.', 'empty_comment' => 'Nemůžete přidat prázdný komentář.', // Error pages '404_page_not_found' => 'Stránka nenalezena', - 'sorry_page_not_found' => 'Omlouváme se, ale stránka, kterou hledáte nebyla nalezena.', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found' => 'Omlouváme se, ale stránka, kterou hledáte, nebyla nalezena.', + 'sorry_page_not_found_permission_warning' => 'Pokud myslíte, že by stránka měla existovat, možná jen nemáte oprávnění pro její zobrazení.', 'return_home' => 'Návrat domů', 'error_occurred' => 'Nastala chyba', 'app_down' => ':appName je momentálně vypnutá', 'back_soon' => 'Brzy naběhne.', // API errors - 'api_no_authorization_found' => 'No authorization token found on the request', - 'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect', - 'api_user_token_not_found' => 'No matching API token was found for the provided authorization token', - 'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect', - 'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls', - 'api_user_token_expired' => 'The authorization token used has expired', + 'api_no_authorization_found' => 'V požadavku nebyla nalezen žádný autorizační token', + 'api_bad_authorization_format' => 'V požadavku byl nalezen autorizační token, ale jeho formát se zdá být chybný', + 'api_user_token_not_found' => 'Pro poskytnutý autorizační token nebyl nalezen žádný odpovídající API token', + 'api_incorrect_token_secret' => 'Poskytnutý Token Secret neodpovídá použitému API tokenu', + 'api_user_no_api_permission' => 'Vlastník použitého API tokenu nemá oprávnění provádět API volání', + 'api_user_token_expired' => 'Platnost autorizačního tokenu vypršela', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => 'Při posílání testovacího e-mailu nastala chyba:', ]; diff --git a/resources/lang/cs/pagination.php b/resources/lang/cs/pagination.php index 6281ff058..eb0beabb9 100644 --- a/resources/lang/cs/pagination.php +++ b/resources/lang/cs/pagination.php @@ -6,7 +6,7 @@ */ return [ - 'previous' => '\'« P', - 'next' => 'Dal', + 'previous' => '« Předchozí', + 'next' => 'Další »', ]; diff --git a/resources/lang/cs/passwords.php b/resources/lang/cs/passwords.php index 368523630..cc5669d48 100644 --- a/resources/lang/cs/passwords.php +++ b/resources/lang/cs/passwords.php @@ -6,10 +6,10 @@ */ return [ - 'password' => 'Heslo musí být alespoň 6 znaků dlouhé a shodovat se v obou polích.', - 'user' => "Nemůžeme najít uživatele se zadanou emailovou adresou.", - 'token' => 'The password reset token is invalid for this email address.', - 'sent' => 'Poslali jsme vám odkaz pro reset hesla!', - 'reset' => 'Vaše heslo bylo resetováno!', + 'password' => 'Heslo musí mít alespoň osm znaků a musí odpovídat potvrzení.', + 'user' => "Nemůžeme nalézt uživatele s touto e-mailovou adresou.", + 'token' => 'Token pro obnovení hesla je neplatný pro tuto e-mailovou adresu.', + 'sent' => 'Poslali jsme vám e-mail s odkazem pro obnovení hesla!', + 'reset' => 'Vaše heslo bylo obnoveno!', ]; diff --git a/resources/lang/cs/settings.php b/resources/lang/cs/settings.php index a5b60ba58..5f7e1a470 100644 --- a/resources/lang/cs/settings.php +++ b/resources/lang/cs/settings.php @@ -12,84 +12,98 @@ return [ 'settings_save_success' => 'Nastavení bylo uloženo', // App Settings - 'app_customization' => 'Customization', - 'app_features_security' => 'Features & Security', + 'app_customization' => 'Přizpůsobení', + 'app_features_security' => 'Funkce a zabezpečení', 'app_name' => 'Název aplikace', - 'app_name_desc' => 'Název se bude zobrazovat v záhlaví této aplikace a v odesílaných emailech.', + 'app_name_desc' => 'Název se bude zobrazovat v záhlaví této aplikace a v odesílaných e-mailech.', 'app_name_header' => 'Zobrazovát název aplikace v záhlaví?', - 'app_public_access' => 'Public Access', - 'app_public_access_desc' => 'Enabling this option will allow visitors, that are not logged-in, to access content in your BookStack instance.', - 'app_public_access_desc_guest' => 'Access for public visitors can be controlled through the "Guest" user.', - 'app_public_access_toggle' => 'Allow public access', + 'app_public_access' => 'Veřejný přístup', + 'app_public_access_desc' => 'Povolení této volby umožní návštěvníkům, kteří nejsou přihlášeni, přístup k obsahu v instanci BookStack.', + 'app_public_access_desc_guest' => 'Přístup veřejnosti je možné kontrolovat prostřednictvím uživatele "Guest".', + 'app_public_access_toggle' => 'Povolit veřejný přístup', 'app_public_viewing' => 'Povolit prohlížení veřejností?', - 'app_secure_images' => 'Nahrávat obrázky neveřejně a zabezpečeně?', - 'app_secure_images_toggle' => 'Enable higher security image uploads', - 'app_secure_images_desc' => 'Z výkonnostních důvodů jsou všechny obrázky veřejné. Tato volba přidá do adresy obrázku náhodné číslo, aby nikdo neodhadnul adresu obrázku. Zajistěte ať adresáře nikomu nezobrazují seznam souborů.', + 'app_secure_images' => 'Povolit vyšší zabezpečení obrázků ?', + 'app_secure_images_toggle' => 'Povolit vyšší zabezpečení obrázků', + 'app_secure_images_desc' => 'Z výkonnostních důvodů jsou všechny obrázky veřejné. Tato volba přidá do adresy obrázku náhodný řetězec, aby nikdo neodhadnul adresu obrázku. Ujistěte se, že není povoleno indexování adresářů, abyste zamezili snadnému přístupu.', 'app_editor' => 'Editor stránek', 'app_editor_desc' => 'Zvolte který editor budou užívat všichni uživatelé k úpravě stránek.', 'app_custom_html' => 'Vlastní HTML kód pro sekci hlavičky ().', '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' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.', + 'app_custom_html_disabled_notice' => 'Vlastní HTML hlavička je na této stránce nastavení zakázána, aby bylo možné vrátit změny zpět.', 'app_logo' => 'Logo aplikace', 'app_logo_desc' => 'Obrázek by měl mít 43 pixelů na výšku.
    Větší obrázky zmenšíme na tuto velikost.', 'app_primary_color' => 'Hlavní barva aplikace', 'app_primary_color_desc' => 'Zápis by měl být hexa (#aabbcc).
    Pro základní barvu nechte pole prázdné.', 'app_homepage' => 'Úvodní stránka aplikace', - 'app_homepage_desc' => 'Zvolte pohled který se objeví jako úvodní stránka po přihlášení. Pokud zvolíte stránku, její specifická oprávnění budou ignorována (výjimka z výjimky 😜).', + 'app_homepage_desc' => 'Zvolte pohled, 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', 'app_disable_comments' => 'Zakázání komentářů', - 'app_disable_comments_toggle' => 'Disable comments', - 'app_disable_comments_desc' => 'Zakáže komentáře napříč všemi stránkami. Existující komentáře se přestanou zobrazovat.', + 'app_disable_comments_toggle' => 'Zakázat komentáře', + 'app_disable_comments_desc' => 'Zakáže komentáře napříč všemi stránkami.
    Existující komentáře se přestanou zobrazovat.', // 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.', - 'bookshelf_color' => 'Shelf Color', - 'book_color' => 'Book Color', - 'chapter_color' => 'Chapter Color', - 'page_color' => 'Page Color', + 'content_colors' => 'Barvy obsahu', + 'content_colors_desc' => 'Nastaví barvy pro všechny prvky v hierarchii organizace stránek. Pro čitelnost je doporučeno zvolit barvy s podobným jasem jako výchozí barvy.', + 'bookshelf_color' => 'Barva Knihovny', + 'book_color' => 'Barva Knihy', + 'chapter_color' => 'Barva Kapitoly', + 'page_color' => 'Barva Stránky', 'page_draft_color' => 'Page Draft Color', // Registration Settings 'reg_settings' => 'Nastavení registrace', - 'reg_enable' => 'Enable Registration', - 'reg_enable_toggle' => 'Enable registration', - 'reg_enable_desc' => 'When registration is enabled user will be able to sign themselves up as an application user. Upon registration they are given a single, default user role.', + 'reg_enable' => 'Povolit Registrace', + 'reg_enable_toggle' => 'Povolit registrace', + 'reg_enable_desc' => 'Při povolení registrace se budou moct tito uživatelé přihlásit a obdrží výchozí uživatelskou roli.', 'reg_default_role' => 'Role přiřazená po registraci', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', - 'reg_email_confirmation' => 'Email Confirmation', - 'reg_email_confirmation_toggle' => 'Require email confirmation', + 'reg_enable_external_warning' => 'Výše uvedená volba je ignorována, pokud je aktivní externí LDAP nebo SAML ověření. Uživatelské účty pro neexistující členy budou automaticky vytvořeny po přihlášení přes externí autentifikační systém.', + 'reg_email_confirmation' => 'Potvrzení e-mailem', + 'reg_email_confirmation_toggle' => 'Vyžadovat potvrzení e-mailem', 'reg_confirm_email_desc' => 'Pokud zapnete omezení emailové domény, tak bude ověřování emailové adresy vyžadováno vždy.', 'reg_confirm_restrict_domain' => 'Omezit registraci podle domény', 'reg_confirm_restrict_domain_desc' => 'Zadejte emailové domény, kterým bude povolena registrace uživatelů. Oddělujete čárkou. Uživatelům bude odeslán email s odkazem pro potvrzení vlastnictví emailové adresy. Bez potvrzení nebudou moci aplikaci používat.
    Pozn.: Uživatelé si mohou emailovou adresu změnit po úspěšné registraci.', - 'reg_confirm_restrict_domain_placeholder' => 'Žádná omezení nebyla nastvena', + 'reg_confirm_restrict_domain_placeholder' => 'Žádná omezení nebyla nastavena', // Maintenance settings 'maint' => 'Údržba', - 'maint_image_cleanup' => 'Pročistění obrázků', - 'maint_image_cleanup_desc' => "Prohledá stránky a jejich revize, aby zjistil, které obrázky a kresby jsou momentálně používány a které jsou zbytečné. Zajistěte plnou zálohu databáze a obrázků než se do toho pustíte.", + 'maint_image_cleanup' => 'Promazání obrázků', + 'maint_image_cleanup_desc' => 'Prohledá stránky a jejich revize, aby zjistil, které obrázky a kresby jsou momentálně používány a které jsou zbytečné. Zajistěte plnou zálohu databáze a obrázků než se do toho pustíte.', 'maint_image_cleanup_ignore_revisions' => 'Ignorovat obrázky v revizích', - 'maint_image_cleanup_run' => 'Spustit pročištění', + 'maint_image_cleanup_run' => 'Spustit Promazání', 'maint_image_cleanup_warning' => 'Nalezeno :count potenciálně nepoužitých obrázků. Jste si jistí, že je chcete smazat?', 'maint_image_cleanup_success' => 'Potenciálně nepoužité obrázky byly smazány. Celkem :count.', 'maint_image_cleanup_nothing_found' => 'Žádné potenciálně nepoužité obrázky nebyly nalezeny. Nic nebylo smazáno.', - 'maint_send_test_email' => 'Send a Test Email', - 'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.', - 'maint_send_test_email_run' => 'Send test email', - 'maint_send_test_email_success' => 'Email sent to :address', + 'maint_send_test_email' => 'Odeslat zkušební e-mail', + 'maint_send_test_email_desc' => 'Toto pošle zkušební e-mail na vaši e-mailovou adresu uvedenou ve vašem profilu.', + 'maint_send_test_email_run' => 'Odeslat zkušební e-mail', + 'maint_send_test_email_success' => 'E-mail odeslán na :address', 'maint_send_test_email_mail_subject' => 'Test Email', 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Role', 'role_user_roles' => 'Uživatelské role', 'role_create' => 'Vytvořit novou roli', 'role_create_success' => 'Role byla úspěšně vytvořena', 'role_delete' => 'Smazat roli', - 'role_delete_confirm' => 'Role \':roleName\' bude smazána.', - 'role_delete_users_assigned' => 'Role je přiřazena :userCount uživatelům. Pokud jim chcete náhradou přidělit jinou roli, zvolte jednu z následujících.', - 'role_delete_no_migration' => "Nepřiřazovat uživatelům náhradní roli", + 'role_delete_confirm' => "Role ':roleName' bude smazána.", + 'role_delete_users_assigned' => 'Role je přiřazena :userCount uživatelům. Pokud je chcete přesunout do jiné role, zvolte jednu z následujících.', + 'role_delete_no_migration' => 'Nepřiřazovat uživatelům novou roli', 'role_delete_sure' => 'Opravdu chcete tuto roli smazat?', 'role_delete_success' => 'Role byla úspěšně smazána', 'role_edit' => 'Upravit roli', @@ -102,82 +116,83 @@ return [ 'role_manage_roles' => 'Správa rolí a jejich práv', 'role_manage_entity_permissions' => 'Správa práv všech knih, kapitol a stránek', 'role_manage_own_entity_permissions' => 'Správa práv vlastních knih, kapitol a stránek', - 'role_manage_page_templates' => 'Manage page templates', - 'role_access_api' => 'Access system API', + 'role_manage_page_templates' => 'Spravovat šablony stránek', + 'role_access_api' => 'Přístup k API systému', 'role_manage_settings' => 'Správa nastavení aplikace', 'role_asset' => 'Práva děl', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Tato práva řídí přístup k dílům v rámci systému. Specifická práva na knihách, kapitolách a stránkách překryjí tato nastavení.', 'role_asset_admins' => 'Administrátoři automaticky dostávají přístup k veškerému obsahu, ale tyto volby mohou ukázat nebo skrýt volby v uživatelském rozhraní.', 'role_all' => 'Vše', 'role_own' => 'Vlastní', - 'role_controlled_by_asset' => 'Řídí se dílem do kterého jsou nahrávány', + 'role_controlled_by_asset' => 'Řídí se obsahem do kterého jsou nahrávány', 'role_save' => 'Uloži roli', - 'role_update_success' => 'Role úspěšně aktualizována', - 'role_users' => 'Uživatelé mající tuto roli', - 'role_users_none' => 'Žádný uživatel nemá tuto roli.', + 'role_update_success' => 'Role úspěšně upravena', + 'role_users' => 'Uživatelé, kteří mají tuto roli', + 'role_users_none' => 'Žádný uživatel tuto roli nemá.', // Users 'users' => 'Uživatelé', 'user_profile' => 'Profil uživatele', 'users_add_new' => 'Přidat nového uživatele', 'users_search' => 'Vyhledávání uživatelů', - 'users_details' => 'User Details', + 'users_details' => 'Údaje o uživateli', 'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.', 'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.', 'users_role' => 'Uživatelské role', - 'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.', - 'users_password' => 'User Password', + 'users_role_desc' => 'Vyberte, do kterých rolí bude uživatel přiřazen. Pokud je uživatel přiřazen k více rolím, oprávnění z těchto rolí se budou skládat a budou dostávat všechny schopnosti přiřazených rolí.', + 'users_password' => 'Uživatelské heslo', 'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 characters long.', 'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.', 'users_send_invite_option' => 'Send user invite email', 'users_external_auth_id' => 'Přihlašovací identifikátory třetích stran', 'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.', 'users_password_warning' => 'Vyplňujte pouze v případě, že chcete heslo změnit:', - 'users_system_public' => 'Symbolizuje libovolného veřejného návštěvníka, který navštívil vaší aplikaci. Nelze ho použít k přihlášení ale je přiřazen automaticky veřejnosti.', + 'users_system_public' => 'Symbolizuje každého nepřihlášeného návštěvníka, který navštívil vaší aplikaci. Nelze ho použít k přihlášení ale je přiřazen automaticky nepřihlášeným.', 'users_delete' => 'Smazat uživatele', - 'users_delete_named' => 'Smazat uživatele :userName', + 'users_delete_named' => 'Odstranit uživatele :userName', 'users_delete_warning' => 'Uživatel \':userName\' bude úplně smazán ze systému.', 'users_delete_confirm' => 'Opravdu chcete tohoto uživatele smazat?', 'users_delete_success' => 'Uživatel byl úspěšně smazán', 'users_edit' => 'Upravit uživatele', 'users_edit_profile' => 'Upravit profil', 'users_edit_success' => 'Uživatel byl úspěšně aktualizován', - 'users_avatar' => 'Uživatelský obrázek', + 'users_avatar' => 'Obrázek uživatele', 'users_avatar_desc' => 'Obrázek by měl být čtverec 256 pixelů široký. Bude oříznut do kruhu.', - 'users_preferred_language' => 'Upřednostňovaný jazyk', - 'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.', + 'users_preferred_language' => 'Preferovaný jazyk', + 'users_preferred_language_desc' => 'tato volba ovlivní pouze jazyk používaný v uživatelském rozhraní aplikace. Vobla nemá vliv na žádný uživateli vytvářený obsah.', 'users_social_accounts' => 'Přidružené účty ze sociálních sítí', - 'users_social_accounts_info' => 'Zde můžete přidat vaše účty ze sociálních sítí pro pohodlnější přihlašování. Zrušení přidružení zde neznamená, že tato aplikace pozbude práva číst detaily z vašeho účtu. Zakázat této aplikaci přístup k detailům vašeho účtu musíte přímo ve vašem profilu na dané sociální síti.', + 'users_social_accounts_info' => 'Zde můžete přidat vaše účty ze sociálních sítí pro pohodlnější přihlašování. Zrušení přidružení účtů neznamená, že tato aplikace ztratí práva číst detaily z vašeho účtu. Zakázat této aplikaci přístup k detailům vašeho účtu musíte přímo ve svém profilu na dané sociální síti.', 'users_social_connect' => 'Přidružit účet', 'users_social_disconnect' => 'Zrušit přidružení', 'users_social_connected' => 'Účet :socialAccount byl úspěšně přidružen k vašemu profilu.', 'users_social_disconnected' => 'Přidružení účtu :socialAccount k vašemu profilu bylo úspěšně zrušeno.', - 'users_api_tokens' => 'API Tokens', - 'users_api_tokens_none' => 'No API tokens have been created for this user', - 'users_api_tokens_create' => 'Create Token', - 'users_api_tokens_expires' => 'Expires', - 'users_api_tokens_docs' => 'API Documentation', + 'users_api_tokens' => 'API Klíče', + 'users_api_tokens_none' => 'Pro tohoto uživatele nebyly vytvořeny žádné API klíče', + 'users_api_tokens_create' => 'Vytvořit Token', + 'users_api_tokens_expires' => 'Vyprší', + 'users_api_tokens_docs' => 'API Dokumentace', // API Tokens - 'user_api_token_create' => 'Create API Token', - 'user_api_token_name' => 'Name', - 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', - 'user_api_token_expiry' => 'Expiry Date', - 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', - 'user_api_token_create_success' => 'API token successfully created', - 'user_api_token_update_success' => 'API token successfully updated', + 'user_api_token_create' => 'Vytvořit API Klíč', + 'user_api_token_name' => 'Název', + 'user_api_token_name_desc' => 'Zadejte srozumitelný název tokenu, který vám později může pomoci připomenout účet, za jakým jste token vytvářeli.', + 'user_api_token_expiry' => 'Datum expirace', + 'user_api_token_expiry_desc' => 'Zadejte datum, kdy platnost tokenu vyprší. Po tomto datu nebudou požadavky, které používají tento token, fungovat. Pokud ponecháte pole prázdné, bude tokenu nastavena platnost na dalších 100 let.', + 'user_api_token_create_secret_message' => 'Ihned po vytvoření tokenu Vám bude vygenerován a zobrazen "Token ID" a "Token Secret". Upozorňujeme, že "Token Secret" bude možné zobrazit pouze jednou, ujistěte se, že si jej poznamenáte a uložíte na bezpečné místo před tím, než budete pokračovat dále.', + 'user_api_token_create_success' => 'API token úspěšně vytvořen', + 'user_api_token_update_success' => 'API token úspěšně updaten', 'user_api_token' => 'API Token', 'user_api_token_id' => 'Token ID', - 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', + 'user_api_token_id_desc' => 'Toto je neupravitelný systémový identifikátor generovaný pro tento klíč, který musí být uveden v API requestu.', 'user_api_token_secret' => 'Token Secret', - 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', - 'user_api_token_delete' => 'Delete Token', - 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', - 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', - 'user_api_token_delete_success' => 'API token successfully deleted', + 'user_api_token_secret_desc' => 'Toto je systémem generovaný "secret" pro tento klíč, který musí být v API requestech. Toto bude zobrazeno pouze jednou, takže si uložte tuto hodnotu na bezpečné místo.', + 'user_api_token_created' => 'Token vytvořen :timeAgo', + 'user_api_token_updated' => 'Token aktualizován :timeAgo', + 'user_api_token_delete' => 'Odstranit Token', + 'user_api_token_delete_warning' => 'Tímto plně smažete tento API klíč s názvem \':tokenName\' ze systému.', + 'user_api_token_delete_confirm' => 'Opravdu chcete odstranit tento API klíč?', + 'user_api_token_delete_success' => 'API Klíč úspěšně odstraněn', //! If editing translations files directly please ignore this in all //! languages apart from en. Content will be auto-copied from en. @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/cs/validation.php b/resources/lang/cs/validation.php index 13a8f790f..08f326d5e 100644 --- a/resources/lang/cs/validation.php +++ b/resources/lang/cs/validation.php @@ -30,7 +30,7 @@ return [ 'digits' => ':attribute musí být :digits pozic dlouhé.', 'digits_between' => ':attribute musí být dlouhé nejméně :min a nejvíce :max pozic.', 'email' => ':attribute není platný formát.', - 'ends_with' => 'The :attribute must end with one of the following: :values', + 'ends_with' => ':attribute musí končit jednou z následujících hodnot: :values', 'filled' => ':attribute musí být vyplněno.', 'gt' => [ 'numeric' => ':attribute musí být větší než :value.', @@ -46,7 +46,7 @@ return [ ], 'exists' => 'Zvolená hodnota pro :attribute není platná.', 'image' => ':attribute musí být obrázek.', - 'image_extension' => 'The :attribute must have a valid & supported image extension.', + 'image_extension' => ':attribute musí mít platné a podporované rozšíření obrázku.', 'in' => 'Zvolená hodnota pro :attribute je neplatná.', 'integer' => ':attribute musí být celé číslo.', 'ip' => ':attribute musí být platnou IP adresou.', @@ -78,7 +78,7 @@ return [ 'string' => ':attribute musí být delší než :min znaků.', 'array' => ':attribute musí obsahovat více než :min prvků.', ], - 'no_double_extension' => 'The :attribute must only have a single file extension.', + 'no_double_extension' => ':attribute musí obsahovat pouze jednu příponu souboru.', 'not_in' => 'Zvolená hodnota pro :attribute je neplatná.', 'not_regex' => ':attribute musí být regulární výraz.', 'numeric' => ':attribute musí být číslo.', @@ -105,7 +105,7 @@ return [ // Custom validation lines 'custom' => [ 'password-confirm' => [ - 'required_with' => 'Password confirmation required', + 'required_with' => 'Ověření hesla je vyžadováno', ], ], diff --git a/resources/lang/da/auth.php b/resources/lang/da/auth.php index a78f5c1c2..f060b24b8 100644 --- a/resources/lang/da/auth.php +++ b/resources/lang/da/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Nulstil adgangskode', 'reset_password_send_instructions' => 'Indtast din E-Mail herunder og du vil blive sendt en E-Mail med et link til at nulstille din adgangskode.', 'reset_password_send_button' => 'Send link til nulstilling', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => 'Et link til nulstilling af adgangskode sendes til :email, hvis den e-mail-adresse findes i systemet.', 'reset_password_success' => 'Din adgangskode er blevet nulstillet.', 'email_reset_subject' => 'Nulstil din :appName adgangskode', 'email_reset_text' => 'Du modtager denne E-Mail fordi vi har modtaget en anmodning om at nulstille din adgangskode.', diff --git a/resources/lang/da/common.php b/resources/lang/da/common.php index 008a9d24e..dbd76d03c 100644 --- a/resources/lang/da/common.php +++ b/resources/lang/da/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopier', 'reply' => 'Besvar', 'delete' => 'Slet', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Søg', 'search_clear' => 'Ryd søgning', 'reset' => 'Nulstil', @@ -66,8 +67,8 @@ return [ 'profile_menu' => 'Profilmenu', 'view_profile' => 'Vis profil', 'edit_profile' => 'Redigér Profil', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Mørk tilstand', + 'light_mode' => 'Lys tilstand', // Layout tabs 'tab_info' => 'Info', diff --git a/resources/lang/da/components.php b/resources/lang/da/components.php index 135dc9d56..28e1404cd 100644 --- a/resources/lang/da/components.php +++ b/resources/lang/da/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Indlæse mere', 'image_image_name' => 'Billednavn', 'image_delete_used' => 'Dette billede er brugt på siderne nedenfor.', - 'image_delete_confirm' => 'Tryk på slet igen for at bekræft at du ønsker at slette dette billede.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Vælg billede', 'image_dropzone' => 'Træk-og-slip billede eller klik her for at uploade', 'images_deleted' => 'Billede slettet', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Rediger kode', 'code_language' => 'Kodesprog', 'code_content' => 'Kodeindhold', + 'code_session_history' => 'Session History', 'code_save' => 'Gem kode', ]; diff --git a/resources/lang/da/entities.php b/resources/lang/da/entities.php index 3a2467773..a38ac8371 100644 --- a/resources/lang/da/entities.php +++ b/resources/lang/da/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Ingen sider matchede søgning', 'search_for_term' => 'Søgning for :term', 'search_more' => 'Flere resultater', - 'search_filters' => 'Søgefiltre', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Indholdstype', 'search_exact_matches' => 'Nøjagtige matches', 'search_tags' => 'Tagsøgninger', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Upload fil', 'attachments_link' => 'Vedhæft link', 'attachments_set_link' => 'Sæt link', - 'attachments_delete_confirm' => 'Tryk på slet igen for at bekræft at du ønsker at slette denne vedhæftning.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Slip filer eller klik her for at vedhæfte en fil', 'attachments_no_files' => 'Ingen filer er blevet overført', 'attachments_explain_link' => 'Du kan vedhæfte et link, hvis du foretrækker ikke at uploade en fil. Dette kan være et link til en anden side eller et link til en fil i skyen.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link til filen', 'attachments_link_url_hint' => 'Adresse (URL) på side eller fil', 'attach' => 'Vedhæft', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Rediger fil', 'attachments_edit_file_name' => 'Filnavn', 'attachments_edit_drop_upload' => 'Slip filer eller klik her for at uploade og overskrive', diff --git a/resources/lang/da/errors.php b/resources/lang/da/errors.php index e5a388c33..0f6287fbc 100644 --- a/resources/lang/da/errors.php +++ b/resources/lang/da/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Filuploaden udløb.', // Attachments - 'attachment_page_mismatch' => 'Der blev fundet en uoverensstemmelse på siden under opdatering af vedhæftet fil', 'attachment_not_found' => 'Vedhæftning ikke fundet', // Pages @@ -83,7 +82,7 @@ return [ // Error pages '404_page_not_found' => 'Siden blev ikke fundet', 'sorry_page_not_found' => 'Beklager, siden du leder efter blev ikke fundet.', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => 'Hvis du forventede, at denne side skulle eksistere, har du muligvis ikke tilladelse til at se den.', 'return_home' => 'Gå tilbage til hjem', 'error_occurred' => 'Der opstod en fejl', 'app_down' => ':appName er nede lige nu', diff --git a/resources/lang/da/pagination.php b/resources/lang/da/pagination.php index 85bd12fc3..821d78047 100644 --- a/resources/lang/da/pagination.php +++ b/resources/lang/da/pagination.php @@ -6,7 +6,7 @@ */ return [ - 'previous' => '« Previous', - 'next' => 'Next »', + 'previous' => '« Forrige', + 'next' => 'Næste »', ]; diff --git a/resources/lang/da/passwords.php b/resources/lang/da/passwords.php index 035ccb2d1..343fa2b85 100644 --- a/resources/lang/da/passwords.php +++ b/resources/lang/da/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => 'Adgangskoder skal være mindst otte tegn og svare til bekræftelsen.', 'user' => "Vi kan ikke finde en bruger med den e-mail adresse.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'Linket til nulstilling af adgangskode er ugyldigt for denne e-mail-adresse.', 'sent' => 'Vi har sendt dig en e-mail med et link til at nulstille adgangskoden!', 'reset' => 'Dit kodeord er blevet nulstillet!', diff --git a/resources/lang/da/settings.php b/resources/lang/da/settings.php index b6f14a421..0cb62a186 100644 --- a/resources/lang/da/settings.php +++ b/resources/lang/da/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'E-Mail levering ser ud til at virke!', 'maint_send_test_email_mail_text' => 'Tillykke! Da du har modtaget denne mailnotifikation, ser det ud som om, at dine mailindstillinger er opsat korrekt.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roller', 'role_user_roles' => 'Brugerroller', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Tilgå system-API', 'role_manage_settings' => 'Administrer app-indstillinger', 'role_asset' => 'Tilladelser for medier og "assets"', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Disse tilladelser kontrollerer standardadgang til medier og "assets" i systemet. Tilladelser til bøger, kapitler og sider tilsidesætter disse tilladelser.', 'role_asset_admins' => 'Administratorer får automatisk adgang til alt indhold, men disse indstillinger kan vise eller skjule UI-indstillinger.', 'role_all' => 'Alle', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', @@ -192,7 +208,7 @@ return [ 'es' => 'Español', 'es_AR' => 'Español Argentina', 'fr' => 'Français', - 'he' => 'עברית', + 'he' => 'Hebraisk', 'hu' => 'Magyar', 'it' => 'Italian', 'ja' => '日本語', diff --git a/resources/lang/de/common.php b/resources/lang/de/common.php index 5d0ad554a..fc44a9250 100644 --- a/resources/lang/de/common.php +++ b/resources/lang/de/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopieren', 'reply' => 'Antworten', 'delete' => 'Löschen', + 'delete_confirm' => 'Löschen Bestätigen', 'search' => 'Suchen', 'search_clear' => 'Suche löschen', 'reset' => 'Zurücksetzen', diff --git a/resources/lang/de/components.php b/resources/lang/de/components.php index 4e56722a8..bda1ce376 100644 --- a/resources/lang/de/components.php +++ b/resources/lang/de/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Mehr', 'image_image_name' => 'Bildname', 'image_delete_used' => 'Dieses Bild wird auf den folgenden Seiten benutzt. ', - 'image_delete_confirm' => 'Bitte klicken Sie erneut auf löschen, wenn Sie dieses Bild wirklich entfernen möchten.', + 'image_delete_confirm_text' => 'Möchten Sie dieses Bild wirklich löschen?', 'image_select_image' => 'Bild auswählen', 'image_dropzone' => 'Ziehen Sie Bilder hierher oder klicken Sie, um ein Bild auszuwählen', 'images_deleted' => 'Bilder gelöscht', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Code editieren', 'code_language' => 'Code Sprache', 'code_content' => 'Code Inhalt', + 'code_session_history' => 'Sitzungsverlauf', 'code_save' => 'Code speichern', ]; diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php index e666c664c..d65786421 100644 --- a/resources/lang/de/entities.php +++ b/resources/lang/de/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Keine Seiten gefunden', 'search_for_term' => 'Nach :term suchen', 'search_more' => 'Mehr Ergebnisse', - 'search_filters' => 'Filter', + 'search_advanced' => 'Erweiterte Suche', + 'search_terms' => 'Suchbegriffe', 'search_content_type' => 'Inhaltstyp', 'search_exact_matches' => 'Exakte Treffer', 'search_tags' => 'Nach Schlagwort suchen', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Datei hochladen', 'attachments_link' => 'Link hinzufügen', 'attachments_set_link' => 'Link setzen', - 'attachments_delete_confirm' => 'Klicken Sie erneut auf löschen, um diesen Anhang zu entfernen.', + 'attachments_delete' => 'Sind Sie sicher, dass Sie diesen Anhang löschen möchten?', 'attachments_dropzone' => 'Ziehen Sie Dateien hierher oder klicken Sie, um eine Datei auszuwählen', 'attachments_no_files' => 'Es wurden bisher keine Dateien hochgeladen.', 'attachments_explain_link' => 'Wenn Sie keine Datei hochladen möchten, können Sie stattdessen einen Link hinzufügen. Dieser Link kann auf eine andere Seite oder eine Datei im Internet weisen.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link zu einer Datei', 'attachments_link_url_hint' => 'URL einer Seite oder Datei', 'attach' => 'Hinzufügen', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Datei bearbeiten', 'attachments_edit_file_name' => 'Dateiname', 'attachments_edit_drop_upload' => 'Ziehen Sie Dateien hierher, um diese hochzuladen und zu überschreiben', diff --git a/resources/lang/de/errors.php b/resources/lang/de/errors.php index 205a8a632..32be9b248 100644 --- a/resources/lang/de/errors.php +++ b/resources/lang/de/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Der Upload der Datei ist abgelaufen.', // Attachments - 'attachment_page_mismatch' => 'Die Seite stimmte nach dem Hochladen des Anhangs nicht überein.', 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', // Pages diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php index d8ffedbf2..66307fab1 100644 --- a/resources/lang/de/settings.php +++ b/resources/lang/de/settings.php @@ -84,6 +84,20 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'maint_send_test_email_mail_greeting' => 'E-Mail-Versand scheint zu funktionieren!', 'maint_send_test_email_mail_text' => 'Glückwunsch! Da Sie diese E-Mail Benachrichtigung erhalten haben, scheinen Ihre E-Mail-Einstellungen korrekt konfiguriert zu sein.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Rollen', 'role_user_roles' => 'Benutzer-Rollen', @@ -109,6 +123,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'role_access_api' => 'Systemzugriffs-API', 'role_manage_settings' => 'Globaleinstellungen verwalten', 'role_asset' => 'Berechtigungen', + 'roles_system_warning' => 'Beachten Sie, dass der Zugriff auf eine der oben genannten drei Berechtigungen einem Benutzer erlauben kann, seine eigenen Berechtigungen oder die Rechte anderer im System zu ändern. Weisen Sie nur Rollen, mit diesen Berechtigungen, vertrauenswürdigen Benutzern zu.', 'role_asset_desc' => 'Diese Berechtigungen gelten für den Standard-Zugriff innerhalb des Systems. Berechtigungen für Bücher, Kapitel und Seiten überschreiben diese Berechtigungenen.', 'role_asset_admins' => 'Administratoren erhalten automatisch Zugriff auf alle Inhalte, aber diese Optionen können Oberflächenoptionen ein- oder ausblenden.', 'role_all' => 'Alle', @@ -188,6 +203,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dänisch', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/de_informal/common.php b/resources/lang/de_informal/common.php index c54b23afc..c18f786f6 100644 --- a/resources/lang/de_informal/common.php +++ b/resources/lang/de_informal/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopieren', 'reply' => 'Antworten', 'delete' => 'Löschen', + 'delete_confirm' => 'Löschen Bestätigen', 'search' => 'Suchen', 'search_clear' => 'Suche löschen', 'reset' => 'Zurücksetzen', diff --git a/resources/lang/de_informal/components.php b/resources/lang/de_informal/components.php index 4d98235a4..56060ea23 100644 --- a/resources/lang/de_informal/components.php +++ b/resources/lang/de_informal/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Mehr', 'image_image_name' => 'Bildname', 'image_delete_used' => 'Dieses Bild wird auf den folgenden Seiten benutzt. ', - 'image_delete_confirm' => 'Bitte klicke erneut auf löschen, wenn Du dieses Bild wirklich entfernen möchtest.', + 'image_delete_confirm_text' => 'Bist Du sicher, dass Du diese Seite löschen möchtest?', 'image_select_image' => 'Bild auswählen', 'image_dropzone' => 'Ziehe Bilder hierher oder klicke hier, um ein Bild auszuwählen', 'images_deleted' => 'Bilder gelöscht', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Code editieren', 'code_language' => 'Code Sprache', 'code_content' => 'Code Inhalt', + 'code_session_history' => 'Sitzungsverlauf', 'code_save' => 'Code speichern', ]; diff --git a/resources/lang/de_informal/entities.php b/resources/lang/de_informal/entities.php index 3888035c3..a1b628b89 100644 --- a/resources/lang/de_informal/entities.php +++ b/resources/lang/de_informal/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Keine Seiten gefunden', 'search_for_term' => 'Nach :term suchen', 'search_more' => 'Mehr Ergebnisse', - 'search_filters' => 'Filter', + 'search_advanced' => 'Erweiterte Suche', + 'search_terms' => 'Suchbegriffe', 'search_content_type' => 'Inhaltstyp', 'search_exact_matches' => 'Exakte Treffer', 'search_tags' => 'Nach Schlagwort suchen', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Datei hochladen', 'attachments_link' => 'Link hinzufügen', 'attachments_set_link' => 'Link setzen', - 'attachments_delete_confirm' => 'Klicke erneut auf löschen, um diesen Anhang zu entfernen.', + 'attachments_delete' => 'Bist Du sicher, dass Du diesen Anhang löschen möchtest?', 'attachments_dropzone' => 'Ziehe Dateien hierher oder klicke hier, um eine Datei auszuwählen', 'attachments_no_files' => 'Es wurden bisher keine Dateien hochgeladen.', 'attachments_explain_link' => 'Wenn Du keine Datei hochladen möchtest, kannst Du stattdessen einen Link hinzufügen. Dieser Link kann auf eine andere Seite oder eine Datei im Internet verweisen.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link zu einer Datei', 'attachments_link_url_hint' => 'URL einer Seite oder Datei', 'attach' => 'Hinzufügen', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Datei bearbeiten', 'attachments_edit_file_name' => 'Dateiname', 'attachments_edit_drop_upload' => 'Ziehe Dateien hierher, um diese hochzuladen und zu überschreiben', diff --git a/resources/lang/de_informal/errors.php b/resources/lang/de_informal/errors.php index 3707dbf13..656c3c236 100644 --- a/resources/lang/de_informal/errors.php +++ b/resources/lang/de_informal/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Der Upload der Datei ist abgelaufen.', // Attachments - 'attachment_page_mismatch' => 'Die Seite stimmte nach dem Hochladen des Anhangs nicht überein.', 'attachment_not_found' => 'Anhang konnte nicht gefunden werden.', // Pages diff --git a/resources/lang/de_informal/passwords.php b/resources/lang/de_informal/passwords.php index 3da092cb8..0dd28c019 100644 --- a/resources/lang/de_informal/passwords.php +++ b/resources/lang/de_informal/passwords.php @@ -8,8 +8,8 @@ return [ 'password' => 'Passwörter müssen aus mindestens sechs Zeichen bestehen und mit der eingegebenen Wiederholung übereinstimmen.', 'user' => "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.", - 'token' => 'Der Link zum Zurücksetzen Ihres Passworts ist entweder ungültig oder abgelaufen.', - 'sent' => 'Der Link zum Zurücksetzen Ihres Passwortes wurde Ihnen per E-Mail zugesendet.', - 'reset' => 'Ihr Passwort wurde zurückgesetzt!', + 'token' => 'Der Token zum Zurücksetzen des Passworts für diese E-Mail-Adresse ist ungültig.', + 'sent' => 'Wir haben dir einen Link zum Zurücksetzen des Passwortes per E-Mail geschickt!', + 'reset' => 'Dein Passwort wurde zurückgesetzt!', ]; diff --git a/resources/lang/de_informal/settings.php b/resources/lang/de_informal/settings.php index a39e00e04..a0ddc5a04 100644 --- a/resources/lang/de_informal/settings.php +++ b/resources/lang/de_informal/settings.php @@ -84,6 +84,20 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'maint_send_test_email_mail_greeting' => 'E-Mail-Versand scheint zu funktionieren!', 'maint_send_test_email_mail_text' => 'Glückwunsch! Da du diese E-Mail Benachrichtigung erhalten hast, scheinen deine E-Mail-Einstellungen korrekt konfiguriert zu sein.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Rollen', 'role_user_roles' => 'Benutzer-Rollen', @@ -109,6 +123,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'role_access_api' => 'Systemzugriffs-API', 'role_manage_settings' => 'Globaleinstellungen verwalten', 'role_asset' => 'Berechtigungen', + 'roles_system_warning' => 'Beachten Sie, dass der Zugriff auf eine der oben genannten drei Berechtigungen einem Benutzer erlauben kann, seine eigenen Berechtigungen oder die Rechte anderer im System zu ändern. Weisen Sie nur Rollen, mit diesen Berechtigungen, vertrauenswürdigen Benutzern zu.', 'role_asset_desc' => 'Diese Berechtigungen gelten für den Standard-Zugriff innerhalb des Systems. Berechtigungen für Bücher, Kapitel und Seiten überschreiben diese Berechtigungenen.', 'role_asset_admins' => 'Administratoren erhalten automatisch Zugriff auf alle Inhalte, aber diese Optionen können Oberflächenoptionen ein- oder ausblenden.', 'role_all' => 'Alle', @@ -188,6 +203,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dänisch', 'de' => 'Deutsch (Sie)', @@ -195,7 +211,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 'es' => 'Español', 'es_AR' => 'Español Argentina', 'fr' => 'Français', - 'he' => 'Hebräisch', + 'he' => 'עברית', 'hu' => 'Magyar', 'it' => 'Italian', 'ja' => '日本語', diff --git a/resources/lang/en/common.php b/resources/lang/en/common.php index 68c58b92b..e87bd11a5 100644 --- a/resources/lang/en/common.php +++ b/resources/lang/en/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copy', 'reply' => 'Reply', 'delete' => 'Delete', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Search', 'search_clear' => 'Clear Search', 'reset' => 'Reset', diff --git a/resources/lang/en/components.php b/resources/lang/en/components.php index d8e8981fb..48a0a32fa 100644 --- a/resources/lang/en/components.php +++ b/resources/lang/en/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Load More', 'image_image_name' => 'Image Name', 'image_delete_used' => 'This image is used in the pages below.', - 'image_delete_confirm' => 'Click delete again to confirm you want to delete this image.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Select Image', 'image_dropzone' => 'Drop images or click here to upload', 'images_deleted' => 'Images Deleted', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Edit Code', 'code_language' => 'Code Language', 'code_content' => 'Code Content', + 'code_session_history' => 'Session History', 'code_save' => 'Save Code', ]; diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index 6bbc723b0..f64867a56 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'No pages matched this search', 'search_for_term' => 'Search for :term', 'search_more' => 'More Results', - 'search_filters' => 'Search Filters', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Content Type', 'search_exact_matches' => 'Exact Matches', 'search_tags' => 'Tag Searches', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Upload File', 'attachments_link' => 'Attach Link', 'attachments_set_link' => 'Set Link', - 'attachments_delete_confirm' => 'Click delete again to confirm you want to delete this attachment.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Drop files or click here to attach a file', 'attachments_no_files' => 'No files have been uploaded', 'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link to file', 'attachments_link_url_hint' => 'Url of site or file', 'attach' => 'Attach', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Edit File', 'attachments_edit_file_name' => 'File Name', 'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite', diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 06a5285f5..79024e482 100644 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'The file upload has timed out.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'Attachment not found', // Pages diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php index f1345c743..e280396a2 100755 --- a/resources/lang/en/settings.php +++ b/resources/lang/en/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roles', 'role_user_roles' => 'User Roles', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Manage app settings', 'role_asset' => 'Asset Permissions', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'All', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Expiry Date', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Delete Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/es/common.php b/resources/lang/es/common.php index 4f4f7f600..9c6575a53 100644 --- a/resources/lang/es/common.php +++ b/resources/lang/es/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copiar', 'reply' => 'Responder', 'delete' => 'Borrar', + 'delete_confirm' => 'Confirmar borrado', 'search' => 'Buscar', 'search_clear' => 'Limpiar búsqueda', 'reset' => 'Resetear', diff --git a/resources/lang/es/components.php b/resources/lang/es/components.php index f92519912..fb4929ad4 100644 --- a/resources/lang/es/components.php +++ b/resources/lang/es/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Cargar más', 'image_image_name' => 'Nombre de imagen', 'image_delete_used' => 'Esta imagen está siendo utilizada en las páginas mostradas a continuación.', - 'image_delete_confirm' => 'Haga click de nuevo para confirmar que quiere borrar esta imagen.', + 'image_delete_confirm_text' => '¿Estás seguro de que quieres eliminar esta imagen?', 'image_select_image' => 'Seleccionar Imagen', 'image_dropzone' => 'Arrastre las imágenes o hacer click aquí para Subir', 'images_deleted' => 'Imágenes borradas', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Editar Código', 'code_language' => 'Lenguaje del Código', 'code_content' => 'Contenido del Código', + 'code_session_history' => 'Historial de la sesión', 'code_save' => 'Guardar Código', ]; diff --git a/resources/lang/es/entities.php b/resources/lang/es/entities.php index f67a0a3a3..aac632419 100644 --- a/resources/lang/es/entities.php +++ b/resources/lang/es/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Ninguna página encontrada para la búsqueda', 'search_for_term' => 'Búsqueda por :term', 'search_more' => 'Más Resultados', - 'search_filters' => 'Filtros de Búsqueda', + 'search_advanced' => 'Búsqueda Avanzada', + 'search_terms' => 'Términos de búsqueda', 'search_content_type' => 'Tipo de Contenido', 'search_exact_matches' => 'Coincidencias Exactas', 'search_tags' => 'Búsquedas Etiquetadas', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Subir Archivo', 'attachments_link' => 'Adjuntar Enlace', 'attachments_set_link' => 'Ajustar Enlace', - 'attachments_delete_confirm' => 'Haga click en borrar nuevamente para confirmar que quiere borrar este adjunto.', + 'attachments_delete' => '¿Está seguro de que quiere eliminar este archivo adjunto?', 'attachments_dropzone' => 'Arrastre ficheros aquí o haga click aquí para adjuntar un fichero', 'attachments_no_files' => 'No se han subido ficheros', 'attachments_explain_link' => 'Puede agregar un enlace si prefiere no subir un archivo. Puede ser un enlace a otra página o un enlace a un fichero en la nube.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Enlace a fichero', 'attachments_link_url_hint' => 'Url del sitio o fichero', 'attach' => 'Adjuntar', + 'attachments_insert_link' => 'Añadir enlace al adjunto en la página', 'attachments_edit_file' => 'Editar fichero', 'attachments_edit_file_name' => 'Nombre del fichero', 'attachments_edit_drop_upload' => 'Arrastre a los ficheros o haga click aquí para subir y sobreescribir', diff --git a/resources/lang/es/errors.php b/resources/lang/es/errors.php index ce69b6157..f83ec4b80 100644 --- a/resources/lang/es/errors.php +++ b/resources/lang/es/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'La carga del archivo ha caducado.', // Attachments - 'attachment_page_mismatch' => 'Página no coincidente durante la subida del adjunto ', 'attachment_not_found' => 'No se encontró el adjunto', // Pages diff --git a/resources/lang/es/settings.php b/resources/lang/es/settings.php index 7f249b04e..48473acef 100644 --- a/resources/lang/es/settings.php +++ b/resources/lang/es/settings.php @@ -13,12 +13,12 @@ return [ // App Settings 'app_customization' => 'Personalización', - 'app_features_security' => 'Características & Seguridad', + 'app_features_security' => 'Características y seguridad', 'app_name' => 'Nombre de la aplicación', - 'app_name_desc' => 'Este nombre se muestra en la cabecera y en cualquier correo electrónico', - 'app_name_header' => 'Mostrar el nombre de la aplicación en la cabecera', - 'app_public_access' => 'Acceso Público', - 'app_public_access_desc' => 'Activando esta opción permitirá que usuarios sin iniciar sesión puedan ver el contenido de tu aplicación Bookstack.', + 'app_name_desc' => 'Este nombre se muestra en la cabecera y en cualquier correo electrónico enviado por el sistema.', + 'app_name_header' => 'Mostrar nombre en la cabecera', + 'app_public_access' => 'Acceso público', + 'app_public_access_desc' => 'Activar esta opción permitirá a los visitantes que no hayan iniciado sesión, poder ver el contenido de tu BookStack.', 'app_public_access_desc_guest' => 'El acceso público para visitantes puede ser controlado a través del usuario "Guest".', 'app_public_access_toggle' => 'Permitir acceso público', 'app_public_viewing' => '¿Permitir acceso público?', @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => '¡El envío de correos electrónicos parece funcionar!', 'maint_send_test_email_mail_text' => '¡Enhorabuena! Al recibir esta notificación de correo electrónico, tu configuración de correo electrónico parece estar ajustada correctamente.', + // Audit Log + 'audit' => 'Registro de Auditoría', + 'audit_desc' => 'Este registro de auditoría muestra una lista de actividades registradas en el sistema. Esta lista no está filtrada a diferencia de las listas de actividad similares en el sistema donde se aplican los filtros de permisos.', + 'audit_event_filter' => 'Filtro de eventos', + 'audit_event_filter_no_filter' => 'Sin filtro', + 'audit_deleted_item' => 'Elemento eliminado', + 'audit_deleted_item_name' => 'Nombre: :name', + 'audit_table_user' => 'Usuario', + 'audit_table_event' => 'Evento', + 'audit_table_item' => 'Elemento relacionado', + 'audit_table_date' => 'Fecha de la actividad', + 'audit_date_from' => 'Rango de fecha desde', + 'audit_date_to' => 'Rango de fecha hasta', + // Role Settings 'roles' => 'Roles', 'role_user_roles' => 'Roles de usuario', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'API de sistema de acceso', 'role_manage_settings' => 'Gestionar ajustes de la aplicación', 'role_asset' => 'Permisos de contenido', + 'roles_system_warning' => 'Tenga en cuenta que el acceso a cualquiera de los tres permisos anteriores puede permitir a un usuario alterar sus propios privilegios o los privilegios de otros en el sistema. Sólo asignar roles con estos permisos a usuarios de confianza.', 'role_asset_desc' => 'Estos permisos controlan el acceso por defecto a los contenidos del sistema. Los permisos de Libros, Capítulos y Páginas sobreescribiran estos permisos.', 'role_asset_admins' => 'A los administradores se les asigna automáticamente permisos para acceder a todo el contenido pero estas opciones podrían mostrar u ocultar opciones de la interfaz.', 'role_all' => 'Todo', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Dale a tu token un nombre legible como un recordatorio futuro de su propósito.', 'user_api_token_expiry' => 'Fecha de expiración', 'user_api_token_expiry_desc' => 'Establece una fecha en la que este token expira. Después de esta fecha, las solicitudes realizadas usando este token ya no funcionarán. Dejar este campo en blanco fijará un vencimiento de 100 años en el futuro.', - 'user_api_token_create_secret_message' => 'Inmediatamente después de crear este token se generarán y mostrarán sus correspondientes "Token ID" y "Token Secret". El "Token Secret" sólo se mostrará una vez, así que asegúrese de copiar el valor a un lugar seguro antes de proceder.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'Token API creado correctamente', 'user_api_token_update_success' => 'Token API actualizado correctamente', 'user_api_token' => 'Token API', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'Este es un identificador no editable generado por el sistema y único para este token que necesitará ser proporcionado en solicitudes de API.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'Esta es una clave no editable generada por el sistema que necesitará ser proporcionada en solicitudes de API. Solo se monstraré esta vez así que guarde su valor en un lugar seguro.', - 'user_api_token_created' => 'Token creado :timeAgo', - 'user_api_token_updated' => 'Token actualizado :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Borrar token', 'user_api_token_delete_warning' => 'Esto eliminará completamente este token API con el nombre \':tokenName\' del sistema.', 'user_api_token_delete_confirm' => '¿Está seguro de que desea borrar este API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Danés', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/es_AR/auth.php b/resources/lang/es_AR/auth.php index 834511041..2f957f46d 100644 --- a/resources/lang/es_AR/auth.php +++ b/resources/lang/es_AR/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Restablecer la contraseña', 'reset_password_send_instructions' => 'Introduzca su correo electrónico a continuación y se le enviará un correo electrónico con un enlace para la restauración', 'reset_password_send_button' => 'Enviar enlace de restauración', - '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_sent' => 'Si la dirección de correo electrónico :email existe en el sistema, se enviará un enlace para restablecer la contraseña.', 'reset_password_success' => 'Su contraseña se restableció con éxito.', 'email_reset_subject' => 'Restauración de la contraseña de para la aplicación :appName', 'email_reset_text' => 'Ud. esta recibiendo este correo electrónico debido a que recibimos una solicitud de restauración de la contraseña de su cuenta.', diff --git a/resources/lang/es_AR/common.php b/resources/lang/es_AR/common.php index 0051e9c22..c6bef56bc 100644 --- a/resources/lang/es_AR/common.php +++ b/resources/lang/es_AR/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copiar', 'reply' => 'Responder', 'delete' => 'Borrar', + 'delete_confirm' => 'Confirmar eliminación', 'search' => 'Buscar', 'search_clear' => 'Limpiar búsqueda', 'reset' => 'Restablecer', diff --git a/resources/lang/es_AR/components.php b/resources/lang/es_AR/components.php index d205afbc1..f7be88589 100644 --- a/resources/lang/es_AR/components.php +++ b/resources/lang/es_AR/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Cargar más', 'image_image_name' => 'Nombre de imagen', 'image_delete_used' => 'Esta imagen esta siendo utilizada en las páginas a continuación.', - 'image_delete_confirm' => 'Haga click de nuevo para confirmar que quiere borrar esta imagen.', + 'image_delete_confirm_text' => '¿Está seguro que quiere eliminar esta imagen?', 'image_select_image' => 'Seleccionar Imagen', 'image_dropzone' => 'Arrastre las imágenes o hacer click aquí para Subir', 'images_deleted' => 'Imágenes borradas', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Editar Código', 'code_language' => 'Lenguaje del Código', 'code_content' => 'Contenido del Código', + 'code_session_history' => 'Historial de la sesión', 'code_save' => 'Guardar Código', ]; diff --git a/resources/lang/es_AR/entities.php b/resources/lang/es_AR/entities.php index 700e873c3..3cd205ad9 100644 --- a/resources/lang/es_AR/entities.php +++ b/resources/lang/es_AR/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Ninguna página encontrada para la búsqueda', 'search_for_term' => 'Busqueda por :term', 'search_more' => 'Más resultados', - 'search_filters' => 'Filtros de búsqueda', + 'search_advanced' => 'Búsqueda Avanzada', + 'search_terms' => 'Términos de búsqueda', 'search_content_type' => 'Tipo de contenido', 'search_exact_matches' => 'Coincidencias exactas', 'search_tags' => 'Búsquedas de etiquetas', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Archivo adjuntado', 'attachments_link' => 'Adjuntar enlace', 'attachments_set_link' => 'Establecer enlace', - 'attachments_delete_confirm' => 'Presione en borrar nuevamente para confirmar que quiere borrar este elemento adjunto.', + 'attachments_delete' => '¿Está seguro que desea eliminar el archivo adjunto?', 'attachments_dropzone' => 'Arrastre archivos aquí o presione aquí para adjuntar un archivo', 'attachments_no_files' => 'No se adjuntó ningún archivo', 'attachments_explain_link' => 'Usted puede agregar un enlace o si lo prefiere puede agregar un archivo. Esto puede ser un enlace a otra página o un enlace a un archivo en la nube.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Enlace a archivo', 'attachments_link_url_hint' => 'URL del sitio o archivo', 'attach' => 'Adjuntar', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Editar archivo', 'attachments_edit_file_name' => 'Nombre del archivo', 'attachments_edit_drop_upload' => 'Arrastre los archivos o presione aquí para subir o sobreescribir', diff --git a/resources/lang/es_AR/errors.php b/resources/lang/es_AR/errors.php index c640492fe..41719a5bc 100644 --- a/resources/lang/es_AR/errors.php +++ b/resources/lang/es_AR/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'La carga del archivo ha caducado.', // Attachments - 'attachment_page_mismatch' => 'Página no coincidente durante la subida del adjunto ', 'attachment_not_found' => 'No se encuentra el objeto adjunto', // Pages diff --git a/resources/lang/es_AR/passwords.php b/resources/lang/es_AR/passwords.php index ab386c0d7..f9e24939b 100644 --- a/resources/lang/es_AR/passwords.php +++ b/resources/lang/es_AR/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => 'La contraseña debe ser como mínimo de seis caracteres y coincidir con la confirmación.', 'user' => "No podemos encontrar un usuario con esta dirección de correo electrónico.", - 'token' => 'El token de modificación de contraseña no es válido para esta dirección de correo electrónico.', + 'token' => 'El token para restablecer la contraseña no es válido para esta dirección de correo electrónico.', 'sent' => '¡Hemos enviado a su cuenta de correo electrónico un enlace para restaurar su contraseña!', 'reset' => '¡Su contraseña fue restaurada!', diff --git a/resources/lang/es_AR/settings.php b/resources/lang/es_AR/settings.php index 9a27eedfd..641b10c28 100644 --- a/resources/lang/es_AR/settings.php +++ b/resources/lang/es_AR/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => '¡El envío de correos electrónicos parece funcionar!', 'maint_send_test_email_mail_text' => '¡Enhorabuena! Al recibir esta notificación de correo electrónico, tu configuración de correo electrónico parece estar ajustada correctamente.', + // Audit Log + 'audit' => 'Registro de Auditoría', + 'audit_desc' => 'Este registro de auditoría muestra una lista de actividades registradas en el sistema. Esta lista no está filtrada a diferencia de las listas de actividad similares en el sistema donde se aplican los filtros de permisos.', + 'audit_event_filter' => 'Filtro de eventos', + 'audit_event_filter_no_filter' => 'Sin filtro', + 'audit_deleted_item' => 'Elemento eliminado', + 'audit_deleted_item_name' => 'Nombre: :name', + 'audit_table_user' => 'Usuario', + 'audit_table_event' => 'Evento', + 'audit_table_item' => 'Elemento relacionado', + 'audit_table_date' => 'Fecha de la actividad', + 'audit_date_from' => 'Rango de fecha desde', + 'audit_date_to' => 'Rango de fecha hasta', + // Role Settings 'roles' => 'Roles', 'role_user_roles' => 'Roles de usuario', @@ -107,6 +121,7 @@ return [ 'role_access_api' => 'API de sistema de acceso', 'role_manage_settings' => 'Gestionar ajustes de activos', 'role_asset' => 'Permisos de activos', + 'roles_system_warning' => 'Tenga en cuenta que el acceso a cualquiera de los tres permisos anteriores puede permitir a un usuario alterar sus propios privilegios o los privilegios de otros en el sistema. Sólo asignar roles con estos permisos a usuarios de confianza.', 'role_asset_desc' => 'Estos permisos controlan el acceso por defecto a los activos del sistema. Permisos a Libros, Capítulos y Páginas sobreescribiran estos permisos.', 'role_asset_admins' => 'Los administradores reciben automáticamente acceso a todo el contenido pero estas opciones pueden mostrar u ocultar opciones de UI.', 'role_all' => 'Todo', @@ -165,16 +180,16 @@ return [ 'user_api_token_name_desc' => 'Dale a tu token un nombre legible como un recordatorio futuro de su propósito.', 'user_api_token_expiry' => 'Fecha de expiración', 'user_api_token_expiry_desc' => 'Establece una fecha en la que este token expira. Después de esta fecha, las solicitudes realizadas usando este token ya no funcionarán. Dejar este campo en blanco fijará un vencimiento de 100 años en el futuro.', - 'user_api_token_create_secret_message' => 'Inmediatamente después de crear este token se generarán y mostrarán sus correspondientes "Token ID" y "Token Secret". El "Token Secret" sólo se mostrará una vez, así que asegúrese de copiar el valor a un lugar seguro antes de proceder.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'Token API creado correctamente', 'user_api_token_update_success' => 'Token API actualizado correctamente', 'user_api_token' => 'Token API', 'user_api_token_id' => 'Token ID', 'user_api_token_id_desc' => 'Este es un identificador no editable generado por el sistema y único para este token que necesitará ser proporcionado en solicitudes de API.', - 'user_api_token_secret' => 'Token Secret', + 'user_api_token_secret' => 'Clave de Token', 'user_api_token_secret_desc' => 'Esta es una clave no editable generada por el sistema que necesitará ser proporcionada en solicitudes de API. Solo se monstraré esta vez así que guarde su valor en un lugar seguro.', - 'user_api_token_created' => 'Token creado :timeAgo', - 'user_api_token_updated' => 'Token actualizado :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Borrar token', 'user_api_token_delete_warning' => 'Esto eliminará completamente este token API con el nombre \':tokenName\' del sistema.', 'user_api_token_delete_confirm' => '¿Está seguro de que desea borrar este API token?', @@ -186,6 +201,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Danés', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/fa/common.php b/resources/lang/fa/common.php index 68c58b92b..e87bd11a5 100644 --- a/resources/lang/fa/common.php +++ b/resources/lang/fa/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copy', 'reply' => 'Reply', 'delete' => 'Delete', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Search', 'search_clear' => 'Clear Search', 'reset' => 'Reset', diff --git a/resources/lang/fa/components.php b/resources/lang/fa/components.php index d8e8981fb..48a0a32fa 100644 --- a/resources/lang/fa/components.php +++ b/resources/lang/fa/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Load More', 'image_image_name' => 'Image Name', 'image_delete_used' => 'This image is used in the pages below.', - 'image_delete_confirm' => 'Click delete again to confirm you want to delete this image.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Select Image', 'image_dropzone' => 'Drop images or click here to upload', 'images_deleted' => 'Images Deleted', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Edit Code', 'code_language' => 'Code Language', 'code_content' => 'Code Content', + 'code_session_history' => 'Session History', 'code_save' => 'Save Code', ]; diff --git a/resources/lang/fa/entities.php b/resources/lang/fa/entities.php index 6bbc723b0..f64867a56 100644 --- a/resources/lang/fa/entities.php +++ b/resources/lang/fa/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'No pages matched this search', 'search_for_term' => 'Search for :term', 'search_more' => 'More Results', - 'search_filters' => 'Search Filters', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Content Type', 'search_exact_matches' => 'Exact Matches', 'search_tags' => 'Tag Searches', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Upload File', 'attachments_link' => 'Attach Link', 'attachments_set_link' => 'Set Link', - 'attachments_delete_confirm' => 'Click delete again to confirm you want to delete this attachment.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Drop files or click here to attach a file', 'attachments_no_files' => 'No files have been uploaded', 'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link to file', 'attachments_link_url_hint' => 'Url of site or file', 'attach' => 'Attach', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Edit File', 'attachments_edit_file_name' => 'File Name', 'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite', diff --git a/resources/lang/fa/errors.php b/resources/lang/fa/errors.php index 06a5285f5..79024e482 100644 --- a/resources/lang/fa/errors.php +++ b/resources/lang/fa/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'The file upload has timed out.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'Attachment not found', // Pages diff --git a/resources/lang/fa/settings.php b/resources/lang/fa/settings.php index f1345c743..2bd314cf0 100644 --- a/resources/lang/fa/settings.php +++ b/resources/lang/fa/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roles', 'role_user_roles' => 'User Roles', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Manage app settings', 'role_asset' => 'Asset Permissions', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'All', diff --git a/resources/lang/fr/common.php b/resources/lang/fr/common.php index 81dde84c4..6571db60c 100644 --- a/resources/lang/fr/common.php +++ b/resources/lang/fr/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copier', 'reply' => 'Répondre', 'delete' => 'Supprimer', + 'delete_confirm' => 'Confirmer la suppression', 'search' => 'Chercher', 'search_clear' => 'Réinitialiser la recherche', 'reset' => 'Réinitialiser', diff --git a/resources/lang/fr/components.php b/resources/lang/fr/components.php index 2f6ff8bf9..6cce4f804 100644 --- a/resources/lang/fr/components.php +++ b/resources/lang/fr/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Charger plus', 'image_image_name' => 'Nom de l\'image', 'image_delete_used' => 'Cette image est utilisée dans les pages ci-dessous.', - 'image_delete_confirm' => 'Confirmez que vous souhaitez bien supprimer cette image.', + 'image_delete_confirm_text' => 'Êtes-vous sûr de vouloir supprimer cette image ?', 'image_select_image' => 'Sélectionner l\'image', 'image_dropzone' => 'Glissez les images ici ou cliquez pour les ajouter', 'images_deleted' => 'Images supprimées', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Editer le code', 'code_language' => 'Langage du code', 'code_content' => 'Contenu du code', + 'code_session_history' => 'Historique de session', 'code_save' => 'Enregistrer le code', ]; diff --git a/resources/lang/fr/entities.php b/resources/lang/fr/entities.php index d52dbfda3..bc37fa52c 100644 --- a/resources/lang/fr/entities.php +++ b/resources/lang/fr/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Aucune page correspondant à cette recherche', 'search_for_term' => 'recherche pour :term', 'search_more' => 'Plus de résultats', - 'search_filters' => 'Filtres de recherche', + 'search_advanced' => 'Recherche avancée', + 'search_terms' => 'Mot-clé', 'search_content_type' => 'Type de contenu', 'search_exact_matches' => 'Correspondances exactes', 'search_tags' => 'Recherche par tags', @@ -87,7 +88,7 @@ return [ 'shelves_edit' => 'Modifier l\'étagère', 'shelves_delete' => 'Supprimer l\'étagère', 'shelves_delete_named' => 'Supprimer l\'étagère :name', - 'shelves_delete_explain' => "Ceci va supprimer l\\'étagère nommée \\':bookName\\'. Les livres contenus dans cette étagère ne seront pas supprimés.", + 'shelves_delete_explain' => "Ceci va supprimer l'étagère nommée ':name'. Les livres contenus dans cette étagère ne seront pas supprimés.", 'shelves_delete_confirmation' => 'Êtes-vous sûr(e) de vouloir supprimer cette étagère ?', 'shelves_permissions' => 'Permissions de l\'étagère', 'shelves_permissions_updated' => 'Permissions de l\'étagère mises à jour', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Uploader un fichier', 'attachments_link' => 'Attacher un lien', 'attachments_set_link' => 'Définir un lien', - 'attachments_delete_confirm' => 'Cliquer une seconde fois sur supprimer pour valider la suppression.', + 'attachments_delete' => 'Êtes-vous sûr de vouloir supprimer la pièce jointe ?', 'attachments_dropzone' => 'Glissez des fichiers ou cliquez ici pour attacher des fichiers', 'attachments_no_files' => 'Aucun fichier ajouté', 'attachments_explain_link' => 'Vous pouvez attacher un lien si vous ne souhaitez pas uploader un fichier.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Lien sur un fichier', 'attachments_link_url_hint' => 'URL du site ou du fichier', 'attach' => 'Attacher', + 'attachments_insert_link' => 'Ajouter un lien de pièce jointe à la page', 'attachments_edit_file' => 'Modifier le fichier', 'attachments_edit_file_name' => 'Nom du fichier', 'attachments_edit_drop_upload' => 'Glissez un fichier ou cliquer pour mettre à jour le fichier', diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index 2c697e67d..c1c14fe31 100644 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Le téléchargement du fichier a expiré.', // Attachments - 'attachment_page_mismatch' => 'Page incorrecte durant la mise à jour du fichier joint', 'attachment_not_found' => 'Fichier joint non trouvé', // Pages diff --git a/resources/lang/fr/settings.php b/resources/lang/fr/settings.php index d2096ed75..0a24f9cde 100644 --- a/resources/lang/fr/settings.php +++ b/resources/lang/fr/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'La livraison d\'email semble fonctionner !', 'maint_send_test_email_mail_text' => 'Félicitations ! Lorsque vous avez reçu cette notification par courriel, vos paramètres d\'email semblent être configurés correctement.', + // 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_event_filter' => 'Filtres d\'événement', + 'audit_event_filter_no_filter' => 'Pas de filtre', + 'audit_deleted_item' => 'Élément supprimé', + 'audit_deleted_item_name' => 'Nom: :name', + 'audit_table_user' => 'Utilisateur', + 'audit_table_event' => 'Evènement', + 'audit_table_item' => 'Élément Associé', + 'audit_table_date' => 'Date d\'activation', + 'audit_date_from' => 'À partir du', + 'audit_date_to' => 'Jusqu\'au', + // Role Settings 'roles' => 'Rôles', 'role_user_roles' => 'Rôles des utilisateurs', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Accès à l\'API du système', 'role_manage_settings' => 'Gérer les préférences de l\'application', 'role_asset' => 'Permissions des ressources', + 'roles_system_warning' => 'Sachez que l\'accès à l\'une des trois permissions ci-dessus peut permettre à un utilisateur de modifier ses propres privilèges ou les privilèges des autres utilisateurs du système. Attribuer uniquement des rôles avec ces permissions à des utilisateurs de confiance.', 'role_asset_desc' => 'Ces permissions contrôlent l\'accès par défaut des ressources dans le système. Les permissions dans les livres, les chapitres et les pages ignoreront ces permissions', 'role_asset_admins' => 'Les administrateurs ont automatiquement accès à tous les contenus mais les options suivantes peuvent afficher ou masquer certaines options de l\'interface.', 'role_all' => 'Tous', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bulgare', 'cs' => 'Česky', 'da' => 'Danois', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/he/common.php b/resources/lang/he/common.php index 0dc1cc43d..8a6311abd 100644 --- a/resources/lang/he/common.php +++ b/resources/lang/he/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'העתק', 'reply' => 'השב', 'delete' => 'מחק', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'חיפוש', 'search_clear' => 'נקה חיפוש', 'reset' => 'איפוס', diff --git a/resources/lang/he/components.php b/resources/lang/he/components.php index 73dbe4e18..84ff7c310 100644 --- a/resources/lang/he/components.php +++ b/resources/lang/he/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'טען עוד', 'image_image_name' => 'שם התמונה', 'image_delete_used' => 'תמונה זו בשימוש בדפים שמתחת', - 'image_delete_confirm' => 'לחץ ״מחק״ שוב על מנת לאשר שברצונך למחוק תמונה זו', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'בחר תמונה', 'image_dropzone' => 'גרור תמונות או לחץ כאן להעלאה', 'images_deleted' => 'התמונות נמחקו', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'ערוך קוד', 'code_language' => 'שפת הקוד', 'code_content' => 'תוכן הקוד', + 'code_session_history' => 'Session History', 'code_save' => 'שמור קוד', ]; diff --git a/resources/lang/he/entities.php b/resources/lang/he/entities.php index 2fb0e82ec..8eef64efa 100644 --- a/resources/lang/he/entities.php +++ b/resources/lang/he/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'לא נמצאו דפים התואמים לחיפוש', 'search_for_term' => 'חפש את :term', 'search_more' => 'תוצאות נוספות', - 'search_filters' => 'מסנני חיפוש', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'סוג התוכן', 'search_exact_matches' => 'התאמות מדויקות', 'search_tags' => 'חפש בתגים', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'העלה קובץ', 'attachments_link' => 'צרף קישור', 'attachments_set_link' => 'הגדר קישור', - 'attachments_delete_confirm' => 'יש ללחוץ שוב על מחיקה על מנת לאשר את מחיקת הקובץ המצורף', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'גרור לכאן קבצים או לחץ על מנת לצרף קבצים', 'attachments_no_files' => 'לא הועלו קבצים', 'attachments_explain_link' => 'ניתן לצרף קישור במקום העלאת קובץ, קישור זה יכול להוביל לדף אחר או לכל קובץ באינטרנט', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'קישור לקובץ', 'attachments_link_url_hint' => 'כתובת האתר או הקובץ', 'attach' => 'צרף', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'ערוך קובץ', 'attachments_edit_file_name' => 'שם הקובץ', 'attachments_edit_drop_upload' => 'גרור קבצים או לחץ כאן על מנת להעלות קבצים במקום הקבצים הקיימים', diff --git a/resources/lang/he/errors.php b/resources/lang/he/errors.php index 9920f1b98..f6a01d3a3 100644 --- a/resources/lang/he/errors.php +++ b/resources/lang/he/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'The file upload has timed out.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'קובץ מצורף לא נמצא', // Pages diff --git a/resources/lang/he/settings.php b/resources/lang/he/settings.php index e3cd0ead5..c90e834b3 100755 --- a/resources/lang/he/settings.php +++ b/resources/lang/he/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'תפקידים', 'role_user_roles' => 'תפקידי משתמשים', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'ניהול הגדרות יישום', 'role_asset' => 'הרשאות משאבים', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'הרשאות אלו שולטות בגישת ברירת המחדל למשאבים בתוך המערכת. הרשאות של ספרים, פרקים ודפים יגברו על הרשאות אלו.', 'role_asset_admins' => 'מנהלים מקבלים הרשאה מלאה לכל התוכן אך אפשרויות אלו עלולות להציג או להסתיר אפשרויות בממשק', 'role_all' => 'הכל', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Expiry Date', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Delete Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/hu/common.php b/resources/lang/hu/common.php index 3abd3bf27..51a6476d0 100644 --- a/resources/lang/hu/common.php +++ b/resources/lang/hu/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Másolás', 'reply' => 'Válasz', 'delete' => 'Törlés', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Keresés', 'search_clear' => 'Keresés törlése', 'reset' => 'Visszaállítás', diff --git a/resources/lang/hu/components.php b/resources/lang/hu/components.php index 1f98df2df..80afacf33 100644 --- a/resources/lang/hu/components.php +++ b/resources/lang/hu/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Több betöltése', 'image_image_name' => 'Kép neve', 'image_delete_used' => 'Ez a kép a lenti oldalakon van használatban.', - 'image_delete_confirm' => 'A kép törléséhez ismét rá kell kattintani a törlésre.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Kép kiválasztása', 'image_dropzone' => 'Képek feltöltése ejtéssel vagy kattintással', 'images_deleted' => 'Képek törölve', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Kód szerkesztése', 'code_language' => 'Kód nyelve', 'code_content' => 'Kód tartalom', + 'code_session_history' => 'Session History', 'code_save' => 'Kód mentése', ]; diff --git a/resources/lang/hu/entities.php b/resources/lang/hu/entities.php index 6593212f0..b580d0b02 100644 --- a/resources/lang/hu/entities.php +++ b/resources/lang/hu/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Nincsenek a keresésnek megfelelő oldalak', 'search_for_term' => ':term keresése', 'search_more' => 'További eredmények', - 'search_filters' => 'Keresési szűrők', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Tartalomtípus', 'search_exact_matches' => 'Pontos egyezések', 'search_tags' => 'Címke keresések', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Fájlfeltöltés', 'attachments_link' => 'Hivatkozás csatolása', 'attachments_set_link' => 'Hivatkozás beállítása', - 'attachments_delete_confirm' => 'A csatolmány törléséhez ismét rá kell kattintani a törlésre.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Fájlok csatolása ejtéssel vagy kattintással', 'attachments_no_files' => 'Nincsenek fájlok feltöltve', 'attachments_explain_link' => 'Fájl feltöltése helyett hozzá lehet kapcsolni egy hivatkozást. Ez egy hivatkozás lesz egy másik oldalra vagy egy fájlra a felhőben.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Hivatkozás fájlra', 'attachments_link_url_hint' => 'Weboldal vagy fájl webcíme', 'attach' => 'Csatolás', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Fájl szerkesztése', 'attachments_edit_file_name' => 'Fájl neve', 'attachments_edit_drop_upload' => 'Feltöltés és felülírás ejtéssel vagy kattintással', diff --git a/resources/lang/hu/errors.php b/resources/lang/hu/errors.php index 668e57783..64229a19f 100644 --- a/resources/lang/hu/errors.php +++ b/resources/lang/hu/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'A fáj feltöltése időtúllépést okozott.', // Attachments - 'attachment_page_mismatch' => 'Oldal eltárás csatolmány frissítése közben', 'attachment_not_found' => 'Csatolmány nem található', // Pages diff --git a/resources/lang/hu/settings.php b/resources/lang/hu/settings.php index f0c59da4b..82485e104 100644 --- a/resources/lang/hu/settings.php +++ b/resources/lang/hu/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Az email kézbesítés működőképesnek tűnik!', 'maint_send_test_email_mail_text' => 'Gratulálunk! Mivel ez az email figyelmeztetés megérkezett az email beállítások megfelelőek.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Szerepkörök', 'role_user_roles' => 'Felhasználói szerepkörök', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Hozzáférés a rendszer API-hoz', 'role_manage_settings' => 'Alkalmazás beállításainak kezelése', 'role_asset' => 'Eszköz jogosultságok', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Ezek a jogosultság vezérlik a alapértelmezés szerinti hozzáférést a rendszerben található eszközökhöz. A könyvek, fejezetek és oldalak jogosultságai felülírják ezeket a jogosultságokat.', 'role_asset_admins' => 'Az adminisztrátorok automatikusan hozzáférést kapnak minden tartalomhoz, de ezek a beállítások megjeleníthetnek vagy elrejthetnek felhasználói felület beállításokat.', 'role_all' => 'Összes', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Lejárati dátum', 'user_api_token_expiry_desc' => 'Dátum megadása ameddig a vezérjel érvényes. Ez után a dátum után az ezzel a vezérjellel történő kérések nem fognak működni. Üresen hagyva a lejárati idő 100 évre lesz beállítva.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API vezérjel sikeresen létrehozva', 'user_api_token_update_success' => 'API vezérjel sikeresen frissítve', 'user_api_token' => 'API vezérjel', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/it/auth.php b/resources/lang/it/auth.php index 8e8ff8f07..a1c4b7048 100755 --- a/resources/lang/it/auth.php +++ b/resources/lang/it/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Reimposta Password', 'reset_password_send_instructions' => 'Inserisci il tuo indirizzo sotto e ti verrà inviata una mail contenente un link per resettare la tua password.', 'reset_password_send_button' => 'Invia Link Reset', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => 'Un link di reset della password verrà inviato a :email se la mail verrà trovata nel sistema.', 'reset_password_success' => 'La tua password è stata resettata correttamente.', 'email_reset_subject' => 'Reimposta la password di :appName', 'email_reset_text' => 'Stai ricevendo questa mail perché abbiamo ricevuto una richiesta di reset della password per il tuo account.', diff --git a/resources/lang/it/common.php b/resources/lang/it/common.php index 73b4cad54..9676962bd 100755 --- a/resources/lang/it/common.php +++ b/resources/lang/it/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copia', 'reply' => 'Rispondi', 'delete' => 'Elimina', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Cerca', 'search_clear' => 'Pulisci Ricerca', 'reset' => 'Azzera', @@ -66,8 +67,8 @@ return [ 'profile_menu' => 'Menu del profilo', 'view_profile' => 'Visualizza Profilo', 'edit_profile' => 'Modifica Profilo', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Modalità Scura', + 'light_mode' => 'Modalità Chiara', // Layout tabs 'tab_info' => 'Info', diff --git a/resources/lang/it/components.php b/resources/lang/it/components.php index 360409646..aa1c8f4a6 100755 --- a/resources/lang/it/components.php +++ b/resources/lang/it/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Carica Altre', 'image_image_name' => 'Nome Immagine', 'image_delete_used' => 'Questa immagine è usata nelle pagine elencate.', - 'image_delete_confirm' => 'Clicca elimina nuovamente per confermare.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Seleziona Immagine', 'image_dropzone' => 'Rilascia immagini o clicca qui per caricarle', 'images_deleted' => 'Immagini Eliminate', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Modifica Codice', 'code_language' => 'Linguaggio Codice', 'code_content' => 'Contenuto Codice', + 'code_session_history' => 'Cronologia Sessione', 'code_save' => 'Salva Codice', ]; diff --git a/resources/lang/it/entities.php b/resources/lang/it/entities.php index 9f6acd133..ebc197650 100755 --- a/resources/lang/it/entities.php +++ b/resources/lang/it/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Nessuna pagina corrisponde alla ricerca', 'search_for_term' => 'Ricerca per :term', 'search_more' => 'Più Risultati', - 'search_filters' => 'Filtri Ricerca', + 'search_advanced' => 'Ricerca Avanzata', + 'search_terms' => 'Termini Ricerca', 'search_content_type' => 'Tipo di Contenuto', 'search_exact_matches' => 'Corrispondenza Esatta', 'search_tags' => 'Ricerche Tag', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Carica File', 'attachments_link' => 'Allega Link', 'attachments_set_link' => 'Imposta Link', - 'attachments_delete_confirm' => 'Clicca elimina nuovamente per confermare l\'eliminazione di questo allegato.', + 'attachments_delete' => 'Sei sicuro di voler eliminare questo allegato?', 'attachments_dropzone' => 'Rilascia file o clicca qui per allegare un file', 'attachments_no_files' => 'Nessun file è stato caricato', 'attachments_explain_link' => 'Puoi allegare un link se preferisci non caricare un file. Questo può essere un link a un\'altra pagina o a un file nel cloud.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link al file', 'attachments_link_url_hint' => 'Url del sito o del file', 'attach' => 'Allega', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Modifica File', 'attachments_edit_file_name' => 'Nome File', 'attachments_edit_drop_upload' => 'Rilascia file o clicca qui per caricare e sovrascrivere', diff --git a/resources/lang/it/errors.php b/resources/lang/it/errors.php index ca605cde0..3e48ad762 100755 --- a/resources/lang/it/errors.php +++ b/resources/lang/it/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Il caricamento del file è andato in timeout.', // Attachments - 'attachment_page_mismatch' => 'La pagina non è corrisposta durante l\'aggiornamento dell\'allegato', 'attachment_not_found' => 'Allegato non trovato', // Pages diff --git a/resources/lang/it/settings.php b/resources/lang/it/settings.php index 34342d3c7..b49281851 100755 --- a/resources/lang/it/settings.php +++ b/resources/lang/it/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'L\'invio delle email sembra funzionare!', 'maint_send_test_email_mail_text' => 'Congratulazioni! Siccome hai ricevuto questa notifica email, le tue impostazioni sembrano essere configurate correttamente.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Ruoli', 'role_user_roles' => 'Ruoli Utente', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Gestire impostazioni app', 'role_asset' => 'Permessi Entità', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Questi permessi controllano l\'accesso di default alle entità. I permessi nei Libri, Capitoli e Pagine sovrascriveranno questi.', 'role_asset_admins' => 'Gli amministratori hanno automaticamente accesso a tutti i contenuti ma queste opzioni possono mostrare o nascondere le opzioni della UI.', 'role_all' => 'Tutti', @@ -154,30 +169,30 @@ return [ 'users_social_disconnected' => 'L\'account :socialAccount è stato disconnesso correttamente dal tuo profilo.', 'users_api_tokens' => 'API Tokens', 'users_api_tokens_none' => 'No API tokens have been created for this user', - 'users_api_tokens_create' => 'Create Token', - 'users_api_tokens_expires' => 'Expires', + 'users_api_tokens_create' => 'Crea Token', + 'users_api_tokens_expires' => 'Scade', 'users_api_tokens_docs' => 'API Documentation', // API Tokens - 'user_api_token_create' => 'Create API Token', + 'user_api_token_create' => 'Crea Token API', 'user_api_token_name' => 'Nome', 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Data di scadenza', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', - 'user_api_token' => 'API Token', + 'user_api_token' => 'Token API', 'user_api_token_id' => 'Token ID', 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', - 'user_api_token_delete' => 'Delete Token', + 'user_api_token_created' => 'Token Aggiornato :timeAgo', + 'user_api_token_updated' => 'Token Aggiornato :timeAgo', + 'user_api_token_delete' => 'Elimina Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', - 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', - 'user_api_token_delete_success' => 'API token successfully deleted', + 'user_api_token_delete_confirm' => 'Sei sicuri di voler eliminare questo token API?', + 'user_api_token_delete_success' => 'Token API eliminato correttamente', //! If editing translations files directly please ignore this in all //! languages apart from en. Content will be auto-copied from en. @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Danese', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/ja/activities.php b/resources/lang/ja/activities.php index de1ca1ac6..1cc60eb54 100644 --- a/resources/lang/ja/activities.php +++ b/resources/lang/ja/activities.php @@ -36,13 +36,13 @@ return [ 'book_sort_notification' => '並び順を変更しました', // Bookshelves - 'bookshelf_create' => 'created Bookshelf', - 'bookshelf_create_notification' => 'Bookshelf Successfully Created', - 'bookshelf_update' => 'updated bookshelf', - 'bookshelf_update_notification' => 'Bookshelf Successfully Updated', - 'bookshelf_delete' => 'deleted bookshelf', - 'bookshelf_delete_notification' => 'Bookshelf Successfully Deleted', + 'bookshelf_create' => '本棚を作成:', + 'bookshelf_create_notification' => '本棚を作成しました', + 'bookshelf_update' => '本棚を更新:', + 'bookshelf_update_notification' => '本棚を更新しました', + 'bookshelf_delete' => 'ブックが削除されました。', + 'bookshelf_delete_notification' => '本棚を削除しました', // Other - 'commented_on' => 'commented on', + 'commented_on' => 'コメントする', ]; diff --git a/resources/lang/ja/auth.php b/resources/lang/ja/auth.php index a700ffb95..6163a5fc1 100644 --- a/resources/lang/ja/auth.php +++ b/resources/lang/ja/auth.php @@ -26,8 +26,8 @@ return [ 'remember_me' => 'ログイン情報を保存する', 'ldap_email_hint' => 'このアカウントで使用するEメールアドレスを入力してください。', 'create_account' => 'アカウント作成', - 'already_have_account' => 'Already have an account?', - 'dont_have_account' => 'Don\'t have an account?', + 'already_have_account' => 'すでにアカウントをお持ちですか?', + 'dont_have_account' => '初めての登録ですか?', 'social_login' => 'SNSログイン', 'social_registration' => 'SNS登録', 'social_registration_text' => '他のサービスで登録 / ログインする', diff --git a/resources/lang/ja/common.php b/resources/lang/ja/common.php index 9611e232b..7932dc713 100644 --- a/resources/lang/ja/common.php +++ b/resources/lang/ja/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copy', 'reply' => '返信', 'delete' => '削除', + 'delete_confirm' => 'Confirm Deletion', 'search' => '検索', 'search_clear' => '検索をクリア', 'reset' => 'リセット', diff --git a/resources/lang/ja/components.php b/resources/lang/ja/components.php index 7cc560b43..c4e444337 100644 --- a/resources/lang/ja/components.php +++ b/resources/lang/ja/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'さらに読み込む', 'image_image_name' => '画像名', 'image_delete_used' => 'この画像は以下のページで利用されています。', - 'image_delete_confirm' => '削除してもよろしければ、再度ボタンを押して下さい。', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => '画像を選択', 'image_dropzone' => '画像をドロップするか、クリックしてアップロード', 'images_deleted' => '画像を削除しました', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'コードを編集する', 'code_language' => 'プログラミング言語の選択', 'code_content' => 'プログラム内容', + 'code_session_history' => 'セッション履歴', 'code_save' => 'プログラムを保存', ]; diff --git a/resources/lang/ja/entities.php b/resources/lang/ja/entities.php index 4f1a855ff..2e5bfda75 100644 --- a/resources/lang/ja/entities.php +++ b/resources/lang/ja/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'ページが見つかりませんでした。', 'search_for_term' => ':term の検索結果', 'search_more' => 'さらに表示', - 'search_filters' => '検索フィルタ', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => '種類', 'search_exact_matches' => '完全一致', 'search_tags' => 'タグ検索', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'アップロード', 'attachments_link' => 'リンクを添付', 'attachments_set_link' => 'リンクを設定', - 'attachments_delete_confirm' => 'もう一度クリックし、削除を確認してください。', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'ファイルをドロップするか、クリックして選択', 'attachments_no_files' => 'ファイルはアップロードされていません', 'attachments_explain_link' => 'ファイルをアップロードしたくない場合、他のページやクラウド上のファイルへのリンクを添付できます。', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'ファイルURL', 'attachments_link_url_hint' => 'WebサイトまたはファイルへのURL', 'attach' => '添付', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'ファイルを編集', 'attachments_edit_file_name' => 'ファイル名', 'attachments_edit_drop_upload' => 'ファイルをドロップするか、クリックしてアップロード', diff --git a/resources/lang/ja/errors.php b/resources/lang/ja/errors.php index ace2f77bd..983e07a3a 100644 --- a/resources/lang/ja/errors.php +++ b/resources/lang/ja/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'ファイルのアップロードがタイムアウトしました。', // Attachments - 'attachment_page_mismatch' => '添付を更新するページが一致しません', 'attachment_not_found' => '添付ファイルが見つかりません。', // Pages diff --git a/resources/lang/ja/settings.php b/resources/lang/ja/settings.php index c7a9773e3..303ff57bf 100644 --- a/resources/lang/ja/settings.php +++ b/resources/lang/ja/settings.php @@ -17,7 +17,7 @@ return [ 'app_name' => 'アプリケーション名', 'app_name_desc' => 'この名前はヘッダーやEメール内で表示されます。', 'app_name_header' => 'ヘッダーにアプリケーション名を表示する', - 'app_public_access' => 'Public Access', + 'app_public_access' => 'パブリック・アクセス', 'app_public_access_desc' => 'Enabling this option will allow visitors, that are not logged-in, to access content in your BookStack instance.', 'app_public_access_desc_guest' => 'Access for public visitors can be controlled through the "Guest" user.', 'app_public_access_toggle' => 'Allow public access', @@ -36,13 +36,13 @@ return [ 'app_primary_color_desc' => '16進数カラーコードで入力します。空にした場合、デフォルトの色にリセットされます。', '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', + 'app_homepage_select' => 'ページを選択', 'app_disable_comments' => 'コメントを無効にする', - 'app_disable_comments_toggle' => 'Disable comments', + 'app_disable_comments_toggle' => 'コメントを無効にする', 'app_disable_comments_desc' => 'アプリケーション内のすべてのページのコメントを無効にします。既存のコメントは表示されません。', // Color settings - 'content_colors' => '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.', 'bookshelf_color' => 'Shelf Color', 'book_color' => 'Book Color', @@ -65,22 +65,36 @@ return [ 'reg_confirm_restrict_domain_placeholder' => '制限しない', // Maintenance settings - 'maint' => 'Maintenance', + 'maint' => 'メンテナンス', 'maint_image_cleanup' => 'Cleanup Images', 'maint_image_cleanup_desc' => "Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.", 'maint_image_cleanup_ignore_revisions' => 'Ignore images in revisions', - 'maint_image_cleanup_run' => 'Run Cleanup', + 'maint_image_cleanup_run' => 'クリーンアップを実行', 'maint_image_cleanup_warning' => ':count potentially unused images were found. Are you sure you want to delete these images?', 'maint_image_cleanup_success' => ':count potentially unused images found and deleted!', 'maint_image_cleanup_nothing_found' => 'No unused images found, Nothing deleted!', - 'maint_send_test_email' => 'Send a Test Email', + 'maint_send_test_email' => 'テストメールを送信', 'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.', 'maint_send_test_email_run' => 'Send test email', 'maint_send_test_email_success' => 'Email sent to :address', - 'maint_send_test_email_mail_subject' => 'Test Email', + 'maint_send_test_email_mail_subject' => 'テストメール', 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => '役割', 'role_user_roles' => '役割', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'アプリケーション設定の管理', 'role_asset' => 'アセット権限', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => '各アセットに対するデフォルトの権限を設定します。ここで設定した権限が優先されます。', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => '全て', @@ -126,7 +141,7 @@ return [ 'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.', 'users_role' => 'ユーザ役割', 'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.', - 'users_password' => 'User Password', + 'users_password' => 'ユーザー パスワード', 'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 characters long.', 'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.', 'users_send_invite_option' => 'Send user invite email', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Expiry Date', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Delete Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/ko/activities.php b/resources/lang/ko/activities.php index c3fedeb45..a56316ef8 100644 --- a/resources/lang/ko/activities.php +++ b/resources/lang/ko/activities.php @@ -10,27 +10,27 @@ return [ 'page_create_notification' => '문서 만듦', 'page_update' => '문서 수정', 'page_update_notification' => '문서 수정함', - 'page_delete' => '문서 지우기', + 'page_delete' => '삭제 된 페이지', 'page_delete_notification' => '문서 지움', 'page_restore' => '문서 복원', 'page_restore_notification' => '문서 복원함', - 'page_move' => '문서 옮기기', + 'page_move' => '문서 이동됨', // Chapters 'chapter_create' => '챕터 만들기', 'chapter_create_notification' => '챕터 만듦', 'chapter_update' => '챕터 바꾸기', 'chapter_update_notification' => '챕터 바꿈', - 'chapter_delete' => '챕터 지우기', + 'chapter_delete' => '삭제된 챕터', 'chapter_delete_notification' => '챕터 지움', - 'chapter_move' => '챕터 옮기기', + 'chapter_move' => '챕터 이동된', // Books 'book_create' => '책자 만들기', 'book_create_notification' => '책자 만듦', 'book_update' => '책자 바꾸기', 'book_update_notification' => '책자 바꿈', - 'book_delete' => '책자 지우기', + 'book_delete' => '삭제 된 책자', 'book_delete_notification' => '책자 지움', 'book_sort' => '책자 정렬', 'book_sort_notification' => '책자 정렬함', @@ -40,7 +40,7 @@ return [ 'bookshelf_create_notification' => '서가 만듦', 'bookshelf_update' => '서가 바꾸기', 'bookshelf_update_notification' => '서가 바꿈', - 'bookshelf_delete' => '서가 지우기', + 'bookshelf_delete' => '삭제된 서가', 'bookshelf_delete_notification' => '서가 지움', // Other diff --git a/resources/lang/ko/auth.php b/resources/lang/ko/auth.php index 9c4d98bcb..0bff8724c 100644 --- a/resources/lang/ko/auth.php +++ b/resources/lang/ko/auth.php @@ -6,8 +6,8 @@ */ return [ - 'failed' => '가입하지 않았거나 비밀번호가 틀립니다.', - 'throttle' => '여러 번 실패했습니다. :seconds초 후에 다시 시도하세요.', + 'failed' => '자격 증명이 기록과 일치하지 않습니다.', + 'throttle' => '로그인 시도가 너무 많습니다. :seconds초 후에 다시 시도하세요.', // Login & Register 'sign_up' => '가입', @@ -43,7 +43,7 @@ return [ 'reset_password' => '비밀번호 바꾸기', 'reset_password_send_instructions' => '메일 주소를 입력하세요. 이 주소로 해당 과정을 위한 링크를 보낼 것입니다.', 'reset_password_send_button' => '메일 보내기', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => '시스템에서 이메일 주소가 발견되면, 암호 재설정 링크가 :email로 전송된다.', 'reset_password_success' => '비밀번호를 바꿨습니다.', 'email_reset_subject' => ':appName 비밀번호 바꾸기', 'email_reset_text' => '비밀번호를 바꿉니다.', @@ -70,8 +70,8 @@ return [ 'user_invite_email_greeting' => ':appName에서 가입한 기록이 있습니다.', 'user_invite_email_text' => '다음 버튼을 눌러 확인하세요:', 'user_invite_email_action' => '비밀번호 설정', - 'user_invite_page_welcome' => ':appName로 접속했습니다.', + 'user_invite_page_welcome' => ':appName에 오신 것을 환영합니다!', 'user_invite_page_text' => ':appName에 로그인할 때 입력할 비밀번호를 설정하세요.', 'user_invite_page_confirm_button' => '비밀번호 확인', - 'user_invite_success' => '이제 :appName에 접근할 수 있습니다.' + 'user_invite_success' => '암호가 설정되었고, 이제 :appName에 접근할 수 있습니다.' ]; \ No newline at end of file diff --git a/resources/lang/ko/common.php b/resources/lang/ko/common.php index 67cc87bd2..934c3f607 100644 --- a/resources/lang/ko/common.php +++ b/resources/lang/ko/common.php @@ -29,12 +29,13 @@ return [ 'update' => '바꾸기', 'edit' => '수정', 'sort' => '정렬', - 'move' => '옮기기', + 'move' => '이동', 'copy' => '복사', 'reply' => '답글', - 'delete' => '지우기', + 'delete' => '삭제', + 'delete_confirm' => 'Confirm Deletion', 'search' => '검색', - 'search_clear' => '기록 지우기', + 'search_clear' => '검색 지우기', 'reset' => '리셋', 'remove' => '제거', 'add' => '추가', diff --git a/resources/lang/ko/components.php b/resources/lang/ko/components.php index 397d0d187..1eadfccfa 100644 --- a/resources/lang/ko/components.php +++ b/resources/lang/ko/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => '더 로드하기', 'image_image_name' => '이미지 이름', 'image_delete_used' => '이 이미지는 다음 문서들이 쓰고 있습니다.', - 'image_delete_confirm' => '이 이미지를 지울 건가요?', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => '이미지 선택', 'image_dropzone' => '여기에 이미지를 드롭하거나 여기를 클릭하세요. 이미지를 올릴 수 있습니다.', 'images_deleted' => '이미지 삭제함', @@ -29,5 +29,6 @@ return [ 'code_editor' => '코드 수정', 'code_language' => '언어', 'code_content' => '내용', + 'code_session_history' => 'Session History', 'code_save' => '저장', ]; diff --git a/resources/lang/ko/entities.php b/resources/lang/ko/entities.php index a166cda40..a238b9a8c 100644 --- a/resources/lang/ko/entities.php +++ b/resources/lang/ko/entities.php @@ -24,7 +24,7 @@ return [ 'meta_updated_name' => '수정함 :timeLength, :user', 'entity_select' => '항목 선택', 'images' => '이미지', - 'my_recent_drafts' => '쓰다 만 문서', + 'my_recent_drafts' => '내 최근의 초안 문서', 'my_recently_viewed' => '내가 읽은 문서', 'no_pages_viewed' => '문서 없음', 'no_pages_recently_created' => '문서 없음', @@ -43,11 +43,12 @@ return [ // Search 'search_results' => '검색 결과', 'search_total_results_found' => ':count개|총 :count개', - 'search_clear' => '기록 지우기', + 'search_clear' => '검색 지우기', 'search_no_pages' => '결과 없음', 'search_for_term' => ':term 검색', 'search_more' => '더 많은 결과', - 'search_filters' => '고급 검색', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => '형식', 'search_exact_matches' => '정확히 일치', 'search_tags' => '꼬리표 일치', @@ -85,8 +86,8 @@ return [ 'shelves_edit_and_assign' => '서가 바꾸기로 책자를 추가하세요.', 'shelves_edit_named' => ':name 바꾸기', 'shelves_edit' => '서가 바꾸기', - 'shelves_delete' => '서가 지우기', - 'shelves_delete_named' => ':name 지우기', + 'shelves_delete' => '서가 삭제하기', + 'shelves_delete_named' => ':name 삭제하기', 'shelves_delete_explain' => ":name을 지웁니다. 책자는 지우지 않습니다.", 'shelves_delete_confirmation' => '이 서가를 지울 건가요?', 'shelves_permissions' => '서가 권한', @@ -109,7 +110,7 @@ return [ 'books_popular_empty' => '많이 읽은 책자 목록', 'books_new_empty' => '새로운 책자 목록', 'books_create' => '책자 만들기', - 'books_delete' => '책자 지우기', + 'books_delete' => '책자 삭제하기', 'books_delete_named' => ':bookName(을)를 지웁니다.', 'books_delete_explain' => ':bookName에 있는 모든 챕터와 문서도 지웁니다.', 'books_delete_confirmation' => '이 책자를 지울 건가요?', @@ -143,15 +144,15 @@ return [ 'chapters_popular' => '많이 읽은 챕터', 'chapters_new' => '새로운 챕터', 'chapters_create' => '챕터 만들기', - 'chapters_delete' => '챕터 지우기', + 'chapters_delete' => '챕터 삭제하기', 'chapters_delete_named' => ':chapterName(을)를 지웁니다.', 'chapters_delete_explain' => ':chapterName에 있는 모든 문서는 챕터에서 벗어날 뿐 지우지 않습니다.', 'chapters_delete_confirm' => '이 챕터를 지울 건가요?', 'chapters_edit' => '챕터 바꾸기', 'chapters_edit_named' => ':chapterName 바꾸기', 'chapters_save' => '저장', - 'chapters_move' => '챕터 옮기기', - 'chapters_move_named' => ':chapterName 옮기기', + 'chapters_move' => '챕터 이동하기', + 'chapters_move_named' => ':chapterName 이동하기', 'chapter_move_success' => ':bookName(으)로 옮김', 'chapters_permissions' => '챕터 권한', 'chapters_empty' => '이 챕터에 문서가 없습니다.', @@ -167,22 +168,22 @@ return [ 'pages_new' => '새로운 문서', 'pages_attachments' => '첨부', 'pages_navigation' => '목차', - 'pages_delete' => '문서 지우기', - 'pages_delete_named' => ':pageName 지우기', - 'pages_delete_draft_named' => ':pageName 지우기', - 'pages_delete_draft' => '쓰다 만 문서 지우기', + 'pages_delete' => '문서 삭제하기', + 'pages_delete_named' => ':pageName 삭제하기', + 'pages_delete_draft_named' => ':pageName 초안 문서 삭제하기', + 'pages_delete_draft' => '초안 문서 삭제하기', 'pages_delete_success' => '문서 지움', - 'pages_delete_draft_success' => '쓰다 만 문서 지움', + 'pages_delete_draft_success' => '초안 문서 지움', 'pages_delete_confirm' => '이 문서를 지울 건가요?', - 'pages_delete_draft_confirm' => '쓰다 만 문서를 지울 건가요?', + 'pages_delete_draft_confirm' => '초안 문서를 삭제할 건가요?', 'pages_editing_named' => ':pageName 수정', - 'pages_edit_draft_options' => '쓰다 만 문서 선택', - 'pages_edit_save_draft' => '보관', - 'pages_edit_draft' => '쓰다 만 문서 수정', - 'pages_editing_draft' => '쓰다 만 문서 수정', + 'pages_edit_draft_options' => '초안 문서 옵션', + 'pages_edit_save_draft' => '초안으로 저장', + 'pages_edit_draft' => '초안 문서 수정', + 'pages_editing_draft' => '초안 문서 수정', 'pages_editing_page' => '문서 수정', 'pages_edit_draft_save_at' => '보관함: ', - 'pages_edit_delete_draft' => '삭제', + 'pages_edit_delete_draft' => '초안 삭제', 'pages_edit_discard_draft' => '폐기', 'pages_edit_set_changelog' => '수정본 설명', 'pages_edit_enter_changelog_desc' => '수정본 설명', @@ -196,7 +197,7 @@ return [ 'pages_md_insert_link' => '내부 링크', 'pages_md_insert_drawing' => '드로잉 추가', 'pages_not_in_chapter' => '챕터에 있는 문서가 아닙니다.', - 'pages_move' => '문서 옮기기', + 'pages_move' => '문서 이동하기', 'pages_move_success' => ':parentName(으)로 옮김', 'pages_copy' => '문서 복제', 'pages_copy_desination' => '복제할 위치', @@ -223,8 +224,8 @@ return [ 'pages_permissions_active' => '문서 권한 허용함', 'pages_initial_revision' => '처음 판본', 'pages_initial_name' => '제목 없음', - 'pages_editing_draft_notification' => ':timeDiff에 쓰다 만 문서입니다.', - 'pages_draft_edited_notification' => '최근에 수정한 문서이기 때문에 쓰다 만 문서를 폐기하는 편이 좋습니다.', + 'pages_editing_draft_notification' => ':timeDiff에 초안 문서입니다.', + 'pages_draft_edited_notification' => '최근에 수정한 문서이기 때문에 초안 문서를 폐기하는 편이 좋습니다.', 'pages_draft_edit_active' => [ 'start_a' => ':count명이 이 문서를 수정하고 있습니다.', 'start_b' => ':userName이 이 문서를 수정하고 있습니다.', @@ -232,7 +233,7 @@ return [ 'time_b' => '(:minCount분 전)', 'message' => ':start :time. 다른 사용자의 수정본을 덮어쓰지 않도록 주의하세요.', ], - 'pages_draft_discarded' => '쓰다 만 문서를 지웠습니다. 에디터에 현재 판본이 나타납니다.', + 'pages_draft_discarded' => '초안 문서를 지웠습니다. 에디터에 현재 판본이 나타납니다.', 'pages_specific' => '특정한 문서', 'pages_is_template' => '템플릿', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => '파일 올리기', 'attachments_link' => '링크로 첨부', 'attachments_set_link' => '링크 설정', - 'attachments_delete_confirm' => '삭제하려면 버튼을 한 번 더 클릭하세요.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => '여기에 파일을 드롭하거나 여기를 클릭하세요.', 'attachments_no_files' => '올린 파일 없음', 'attachments_explain_link' => '파일을 올리지 않고 링크로 첨부할 수 있습니다.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => '파일로 링크', 'attachments_link_url_hint' => '파일 주소', 'attach' => '파일 첨부', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => '파일 수정', 'attachments_edit_file_name' => '파일 이름', 'attachments_edit_drop_upload' => '여기에 파일을 드롭하거나 여기를 클릭하세요. 파일을 올리거나 덮어쓸 수 있습니다.', diff --git a/resources/lang/ko/errors.php b/resources/lang/ko/errors.php index a9e917e91..093288c83 100644 --- a/resources/lang/ko/errors.php +++ b/resources/lang/ko/errors.php @@ -13,7 +13,7 @@ return [ 'email_already_confirmed' => '확인이 끝난 메일 주소입니다. 로그인하세요.', 'email_confirmation_invalid' => '이 링크는 더 이상 유효하지 않습니다. 다시 가입하세요.', 'email_confirmation_expired' => '이 링크는 더 이상 유효하지 않습니다. 메일을 다시 보냈습니다.', - 'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed', + 'email_confirmation_awaiting' => '사용 중인 계정의 이메일 주소를 확인해 주어야 합니다.', 'ldap_fail_anonymous' => '익명 정보로 LDAP 서버에 접근할 수 없습니다.', 'ldap_fail_authed' => '이 정보로 LDAP 서버에 접근할 수 없습니다.', 'ldap_extension_not_installed' => 'PHP에 LDAP 확장 도구를 설치하세요.', @@ -46,11 +46,10 @@ return [ 'file_upload_timeout' => '파일을 올리는 데 걸리는 시간이 서버에서 허용하는 수치를 넘습니다.', // Attachments - 'attachment_page_mismatch' => '올리는 위치와 현재 문서가 다릅니다.', 'attachment_not_found' => '첨부 파일이 없습니다.', // Pages - 'page_draft_autosave_fail' => '쓰다 만 문서를 유실했습니다. 인터넷 연결 상태를 확인하세요.', + 'page_draft_autosave_fail' => '초안 문서를 유실했습니다. 인터넷 연결 상태를 확인하세요.', 'page_custom_home_deletion' => '처음 페이지는 지울 수 없습니다.', // Entities @@ -61,7 +60,7 @@ return [ 'chapter_not_found' => '챕터가 없습니다.', 'selected_book_not_found' => '고른 책자가 없습니다.', 'selected_book_chapter_not_found' => '고른 책자나 챕터가 없습니다.', - 'guests_cannot_save_drafts' => 'Guest는 쓰다 만 문서를 보관할 수 없습니다.', + 'guests_cannot_save_drafts' => 'Guest는 초안 문서를 보관할 수 없습니다.', // Users 'users_cannot_delete_only_admin' => 'Admin을 삭제할 수 없습니다.', @@ -75,7 +74,7 @@ return [ // Comments 'comment_list' => '댓글을 가져오다 문제가 생겼습니다.', - 'cannot_add_comment_to_draft' => '쓰다 만 문서에 댓글을 달 수 없습니다.', + 'cannot_add_comment_to_draft' => '초안 문서에 댓글을 달 수 없습니다.', 'comment_add' => '댓글을 등록하다 문제가 생겼습니다.', 'comment_delete' => '댓글을 지우다 문제가 생겼습니다.', 'empty_comment' => '빈 댓글은 등록할 수 없습니다.', @@ -83,21 +82,21 @@ return [ // Error pages '404_page_not_found' => '404 Not Found', 'sorry_page_not_found' => '문서를 못 찾았습니다.', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => '이 페이지가 존재하기를 기대했다면, 볼 수 있는 권한이 없을 수 있다.', 'return_home' => '처음으로 돌아가기', 'error_occurred' => '문제가 생겼습니다.', 'app_down' => ':appName에 문제가 있는 것 같습니다', 'back_soon' => '곧 되돌아갑니다.', // API errors - 'api_no_authorization_found' => 'No authorization token found on the request', - 'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect', - 'api_user_token_not_found' => 'No matching API token was found for the provided authorization token', - 'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect', - 'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls', - 'api_user_token_expired' => 'The authorization token used has expired', + 'api_no_authorization_found' => '요청에서 인증 토큰을 찾을 수 없다.', + 'api_bad_authorization_format' => '요청에서 인증 토큰을 찾았지만, 형식이 잘못된 것 같다.', + 'api_user_token_not_found' => '제공된 인증 토큰과 일치하는 API 토큰을 찾을 수 없다.', + 'api_incorrect_token_secret' => '사용한 API 토큰에 대해 제공한 시크릿이 맞지 않는다.', + 'api_user_no_api_permission' => '사용한 API 토큰의 소유자가, API 호출을 할 수 있는 권한이 없다.', + 'api_user_token_expired' => '사용된 인증 토큰이 만료되었다.', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => '테스트 이메일 발송할 때 발생한 오류:', ]; diff --git a/resources/lang/ko/passwords.php b/resources/lang/ko/passwords.php index 016339771..f93902aef 100644 --- a/resources/lang/ko/passwords.php +++ b/resources/lang/ko/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => '여덟 글자를 넘어야 합니다.', 'user' => "메일 주소를 가진 사용자가 없습니다.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => '비밀번호 재설정 토큰이 이 이메일 주소에 유효하지 않습니다.', 'sent' => '메일을 보냈습니다.', 'reset' => '비밀번호를 바꿨습니다.', diff --git a/resources/lang/ko/settings.php b/resources/lang/ko/settings.php index e7cec851a..7c368543f 100755 --- a/resources/lang/ko/settings.php +++ b/resources/lang/ko/settings.php @@ -48,7 +48,7 @@ return [ 'book_color' => '책 색상', 'chapter_color' => '챕터 색상', 'page_color' => '페이지 색상', - 'page_draft_color' => '드래프트 페이지 색상', + 'page_draft_color' => '초안 페이지 색상', // Registration Settings 'reg_settings' => '가입', @@ -56,7 +56,7 @@ return [ 'reg_enable_toggle' => '사이트 가입 허용', 'reg_enable_desc' => '가입한 사용자는 단일한 권한을 가집니다.', 'reg_default_role' => '가입한 사용자의 기본 권한', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', + 'reg_enable_external_warning' => '외부 LDAP 또는 SAML 인증이 활성화되어 있는 동안에는 위의 옵션이 무시된다. 사용 중인 외부 시스템에 대해 인증이 성공하면, 존재하지 않는 회원에 대한 사용자 계정이 자동으로 생성된다.', 'reg_email_confirmation' => '메일 주소 확인', 'reg_email_confirmation_toggle' => '주소 확인 요구', 'reg_confirm_email_desc' => '도메인 차단을 쓰고 있으면 메일 주소를 확인해야 하고, 이 설정은 무시합니다.', @@ -81,12 +81,26 @@ return [ 'maint_send_test_email_mail_greeting' => '이메일 전송이 성공하였습니다.', 'maint_send_test_email_mail_text' => '축하합니다! 이 메일을 받음으로 이메일 설정이 정상적으로 되었음을 확인하였습니다.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => '권한', 'role_user_roles' => '사용자 권한', 'role_create' => '권한 만들기', 'role_create_success' => '권한 만듦', - 'role_delete' => '권한 지우기', + 'role_delete' => '권한 제거', 'role_delete_confirm' => ':roleName(을)를 지웁니다.', 'role_delete_users_assigned' => '이 권한을 가진 사용자 :userCount명에 할당할 권한을 고르세요.', 'role_delete_no_migration' => "할당하지 않음", @@ -106,6 +120,7 @@ return [ 'role_access_api' => '시스템 접근 API', 'role_manage_settings' => '사이트 설정 관리', 'role_asset' => '권한 항목', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => '책자, 챕터, 문서별 권한은 이 설정에 우선합니다.', 'role_asset_admins' => 'Admin 권한은 어디든 접근할 수 있지만 이 설정은 사용자 인터페이스에서 해당 활동을 표시할지 결정합니다.', 'role_all' => '모든 항목', @@ -126,12 +141,12 @@ return [ 'users_details_desc_no_email' => '사용자 이름을 바꿉니다.', 'users_role' => '사용자 권한', 'users_role_desc' => '고른 권한 모두를 적용합니다.', - 'users_password' => '비밀번호', + 'users_password' => '사용자 비밀번호', 'users_password_desc' => '여섯 글자를 넘어야 합니다.', 'users_send_invite_text' => '비밀번호 설정을 권유하는 메일을 보내거나 내가 정할 수 있습니다.', 'users_send_invite_option' => '메일 보내기', 'users_external_auth_id' => 'LDAP 확인', - 'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.', + 'users_external_auth_id_desc' => '외부 인증 시스템과 통신할 때 사용자와 연결시키는 데 사용되는 ID 입니다.', 'users_password_warning' => '비밀번호를 바꿀 때만 쓰세요.', 'users_system_public' => '계정 없는 모든 사용자에 할당한 사용자입니다. 이 사용자로 로그인할 수 없어요.', 'users_delete' => '사용자 삭제', @@ -153,7 +168,7 @@ return [ 'users_social_connected' => ':socialAccount(와)과 연결했습니다.', 'users_social_disconnected' => ':socialAccount(와)과의 연결을 끊었습니다.', 'users_api_tokens' => 'API 토큰', - 'users_api_tokens_none' => 'No API tokens have been created for this user', + 'users_api_tokens_none' => '이 사용자를 위해 생성된 API 토큰이 없습니다.', 'users_api_tokens_create' => '토큰 만들기', 'users_api_tokens_expires' => '만료', 'users_api_tokens_docs' => 'API 설명서', @@ -161,23 +176,23 @@ return [ // API Tokens 'user_api_token_create' => 'API 토큰 만들기', 'user_api_token_name' => '제목', - 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', + 'user_api_token_name_desc' => '토큰이 의도한 목적을 향후에 상기시키기 위해 알아보기 쉬운 이름을 지정한다.', 'user_api_token_expiry' => '만료일', - 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', - 'user_api_token_create_success' => 'API token successfully created', - 'user_api_token_update_success' => 'API token successfully updated', + 'user_api_token_expiry_desc' => '이 토큰이 만료되는 날짜를 설정한다. 이 날짜가 지나면 이 토큰을 사용하여 만든 요청은 더 이상 작동하지 않는다. 이 칸을 공백으로 두면 100년 뒤가 만기가 된다.', + 'user_api_token_create_secret_message' => '이 토큰을 만든 직후 "토큰 ID"와 "토큰 시크릿"이 생성되서 표시 된다. 시크릿은 한 번만 표시되므로 계속 진행하기 전에 안전하고 안심할 수 있는 곳에 값을 복사한다.', + 'user_api_token_create_success' => 'API 토큰이 성공적으로 생성되었다.', + 'user_api_token_update_success' => 'API 토큰이 성공적으로 갱신되었다.', 'user_api_token' => 'API 토큰', 'user_api_token_id' => '토큰 ID', - 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', - 'user_api_token_secret' => 'Token Secret', - 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_id_desc' => '이 토큰은 API 요청으로 제공되어야 하는 편집 불가능한 시스템이 생성한 식별자다.', + 'user_api_token_secret' => '토큰 시크릿', + 'user_api_token_secret_desc' => '이것은 API 요청시 제공되어야 할 이 토큰에 대한 시스템에서 생성된 시크릿이다. 이 값은 한 번만 표시되므로 안전하고 한심할 수 있는 곳에 이 값을 복사한다.', + 'user_api_token_created' => ':timeAgo 전에 토큰이 생성되었다.', + 'user_api_token_updated' => ':timeAgo 전에 토큰이 갱신되었다.', 'user_api_token_delete' => '토큰 삭제', - 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', - 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', - 'user_api_token_delete_success' => 'API token successfully deleted', + 'user_api_token_delete_warning' => '이렇게 하면 시스템에서 \':tokenName\'이라는 이름을 가진 이 API 토큰이 완전히 삭제된다.', + 'user_api_token_delete_confirm' => '이 API 토큰을 삭제하시겠습니까?', + 'user_api_token_delete_success' => 'API 토큰이 성공적으로 삭제되었다.', //! If editing translations files directly please ignore this in all //! languages apart from en. Content will be auto-copied from en. @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', @@ -192,7 +208,7 @@ return [ 'es' => 'Español', 'es_AR' => 'Español Argentina', 'fr' => 'Français', - 'he' => 'עברית', + 'he' => '히브리어', 'hu' => 'Magyar', 'it' => 'Italian', 'ja' => '日本語', diff --git a/resources/lang/nl/common.php b/resources/lang/nl/common.php index f228fa6c4..7a2d633c6 100644 --- a/resources/lang/nl/common.php +++ b/resources/lang/nl/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopiëren', 'reply' => 'Beantwoorden', 'delete' => 'Verwijder', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Zoek', 'search_clear' => 'Zoekopdracht wissen', 'reset' => 'Resetten', diff --git a/resources/lang/nl/components.php b/resources/lang/nl/components.php index 4083b57be..f40ac15b0 100644 --- a/resources/lang/nl/components.php +++ b/resources/lang/nl/components.php @@ -5,7 +5,7 @@ return [ // Image Manager - 'image_select' => 'Afbeelding selecteren', + 'image_select' => 'Selecteer Afbeelding', 'image_all' => 'Alles', 'image_all_title' => 'Alle afbeeldingen weergeven', 'image_book_title' => 'Afbeeldingen van dit boek weergeven', @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Meer Laden', 'image_image_name' => 'Afbeeldingsnaam', 'image_delete_used' => 'Deze afbeeldingen is op onderstaande pagina\'s in gebruik.', - 'image_delete_confirm' => 'Klik opnieuw op verwijderen om de afbeelding echt te verwijderen.', + 'image_delete_confirm_text' => 'Weet u zeker dat u deze afbeelding wilt verwijderen?', 'image_select_image' => 'Kies Afbeelding', 'image_dropzone' => 'Sleep afbeeldingen hier of klik hier om te uploaden', 'images_deleted' => 'Verwijderde Afbeeldingen', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Code invoegen', 'code_language' => 'Code taal', 'code_content' => 'Code', + 'code_session_history' => 'Zittingsgeschiedenis', 'code_save' => 'Sla code op', ]; diff --git a/resources/lang/nl/entities.php b/resources/lang/nl/entities.php index a88be7711..399d97f25 100644 --- a/resources/lang/nl/entities.php +++ b/resources/lang/nl/entities.php @@ -30,9 +30,9 @@ return [ 'no_pages_recently_created' => 'Er zijn geen recent aangemaakte pagina\'s', 'no_pages_recently_updated' => 'Er zijn geen recente wijzigingen', 'export' => 'Exporteren', - 'export_html' => 'Contained Web File', - 'export_pdf' => 'PDF File', - 'export_text' => 'Plain Text File', + 'export_html' => 'Ingesloten Webbestand', + 'export_pdf' => 'PDF Bestand', + 'export_text' => 'Normaal Tekstbestand', // Permissions and restrictions 'permissions' => 'Permissies', @@ -47,22 +47,23 @@ return [ 'search_no_pages' => 'Er zijn geen pagina\'s gevonden', 'search_for_term' => 'Zoeken op :term', 'search_more' => 'Meer resultaten', - 'search_filters' => 'Zoek filters', - 'search_content_type' => 'Content Type', + 'search_advanced' => 'Uitgebreid zoeken', + 'search_terms' => 'Zoektermen', + 'search_content_type' => 'Inhoudstype', 'search_exact_matches' => 'Exacte Matches', 'search_tags' => 'Zoek tags', - 'search_options' => 'Options', + 'search_options' => 'Opties', 'search_viewed_by_me' => 'Bekeken door mij', 'search_not_viewed_by_me' => 'Niet bekeken door mij', 'search_permissions_set' => 'Permissies gezet', 'search_created_by_me' => 'Door mij gemaakt', 'search_updated_by_me' => 'Door mij geupdate', - 'search_date_options' => 'Date Options', + 'search_date_options' => 'Datum Opties', 'search_updated_before' => 'Geupdate voor', 'search_updated_after' => 'Geupdate na', - 'search_created_before' => 'Gecreeerd voor', - 'search_created_after' => 'Gecreeerd na', - 'search_set_date' => 'Zet datum', + 'search_created_before' => 'Gecreëerd voor', + 'search_created_after' => 'Gecreëerd na', + 'search_set_date' => 'Stel datum in', 'search_update' => 'Update zoekresultaten', // Shelves @@ -74,7 +75,7 @@ return [ 'shelves_create' => 'Nieuwe Boekenplank Aanmaken', 'shelves_popular' => 'Populaire Boekenplanken', 'shelves_new' => 'Nieuwe Boekenplanken', - 'shelves_new_action' => 'New Shelf', + 'shelves_new_action' => 'Nieuwe Boekplank', 'shelves_popular_empty' => 'De meest populaire boekenplanken worden hier weergegeven.', 'shelves_new_empty' => 'De meest recent aangemaakt boekenplanken worden hier weergeven.', 'shelves_save' => 'Boekenplanken Opslaan', @@ -105,9 +106,9 @@ return [ 'books_popular' => 'Populaire Boeken', 'books_recent' => 'Recente Boeken', 'books_new' => 'Nieuwe Boeken', - 'books_new_action' => 'New Book', + 'books_new_action' => 'Nieuw Boek', 'books_popular_empty' => 'De meest populaire boeken worden hier weergegeven.', - 'books_new_empty' => 'The most recently created books will appear here.', + 'books_new_empty' => 'De meest recent aangemaakte boeken verschijnen hier.', 'books_create' => 'Nieuw Boek Aanmaken', 'books_delete' => 'Boek Verwijderen', 'books_delete_named' => 'Verwijder Boek :bookName', @@ -128,11 +129,11 @@ return [ 'books_navigation' => 'Boek Navigatie', 'books_sort' => 'Inhoud van het boek sorteren', 'books_sort_named' => 'Sorteer Boek :bookName', - 'books_sort_name' => 'Sort by Name', - 'books_sort_created' => 'Sort by Created Date', - 'books_sort_updated' => 'Sort by Updated Date', - 'books_sort_chapters_first' => 'Chapters First', - 'books_sort_chapters_last' => 'Chapters Last', + 'books_sort_name' => 'Sorteren op Naam', + 'books_sort_created' => 'Sorteren op datum van aanmaken', + 'books_sort_updated' => 'Sorteren op datum van bijgewerkt', + 'books_sort_chapters_first' => 'Hoofdstukken eerst', + 'books_sort_chapters_last' => 'Hoofdstukken Laatst', 'books_sort_show_other' => 'Bekijk Andere Boeken', 'books_sort_save' => 'Nieuwe Order Opslaan', @@ -177,7 +178,7 @@ return [ 'pages_delete_confirm' => 'Weet je zeker dat je deze pagina wilt verwijderen?', 'pages_delete_draft_confirm' => 'Weet je zeker dat je dit concept wilt verwijderen?', 'pages_editing_named' => 'Pagina :pageName Bewerken', - 'pages_edit_draft_options' => 'Draft Options', + 'pages_edit_draft_options' => 'Concept Opties', 'pages_edit_save_draft' => 'Concept opslaan', 'pages_edit_draft' => 'Paginaconcept Bewerken', 'pages_editing_draft' => 'Concept Bewerken', @@ -195,13 +196,13 @@ return [ 'pages_md_preview' => 'Voorbeeld', 'pages_md_insert_image' => 'Afbeelding Invoegen', 'pages_md_insert_link' => 'Entity Link Invoegen', - 'pages_md_insert_drawing' => 'Insert Drawing', + 'pages_md_insert_drawing' => 'Tekening Toevoegen', 'pages_not_in_chapter' => 'Deze pagina staat niet in een hoofdstuk', 'pages_move' => 'Pagina Verplaatsten', 'pages_move_success' => 'Pagina verplaatst naar ":parentName"', - 'pages_copy' => 'Copy Page', - 'pages_copy_desination' => 'Copy Destination', - 'pages_copy_success' => 'Page successfully copied', + 'pages_copy' => 'Pagina Kopiëren', + 'pages_copy_desination' => 'Kopieerbestemming', + 'pages_copy_success' => 'Pagina succesvol gekopieerd', 'pages_permissions' => 'Pagina Permissies', 'pages_permissions_success' => 'Pagina Permissies bijgwerkt', 'pages_revision' => 'Revisie', @@ -211,12 +212,12 @@ return [ 'pages_revisions_created_by' => 'Aangemaakt door', 'pages_revisions_date' => 'Revisiedatum', 'pages_revisions_number' => '#', - 'pages_revisions_numbered' => 'Revision #:id', - 'pages_revisions_numbered_changes' => 'Revision #:id Changes', - 'pages_revisions_changelog' => 'Changelog', + 'pages_revisions_numbered' => 'Revisie #:id', + 'pages_revisions_numbered_changes' => 'Revisie #:id Wijzigingen', + 'pages_revisions_changelog' => 'Wijzigingslogboek', 'pages_revisions_changes' => 'Wijzigingen', 'pages_revisions_current' => 'Huidige Versie', - 'pages_revisions_preview' => 'Preview', + 'pages_revisions_preview' => 'Voorbeeld', 'pages_revisions_restore' => 'Herstellen', 'pages_revisions_none' => 'Deze pagina heeft geen revisies', 'pages_copy_link' => 'Link Kopiëren', @@ -224,31 +225,31 @@ return [ 'pages_permissions_active' => 'Pagina Permissies Actief', 'pages_initial_revision' => 'Eerste publicatie', 'pages_initial_name' => 'Nieuwe Pagina', - 'pages_editing_draft_notification' => 'You are currently editing a draft that was last saved :timeDiff.', - 'pages_draft_edited_notification' => 'This page has been updated by since that time. It is recommended that you discard this draft.', + 'pages_editing_draft_notification' => 'U bewerkt momenteel een concept dat voor het laatst is opgeslagen op :timeDiff.', + 'pages_draft_edited_notification' => 'Deze pagina is sindsdien bijgewerkt. Het wordt aanbevolen dat u dit concept verwijderd.', 'pages_draft_edit_active' => [ - 'start_a' => ':count users have started editing this page', - 'start_b' => ':userName has started editing this page', + 'start_a' => ':count gebruikers zijn begonnen deze pagina te bewerken', + 'start_b' => ':userName is begonnen met het bewerken van deze pagina', 'time_a' => 'since the pages was last updated', - 'time_b' => 'in the last :minCount minutes', - 'message' => ':start :time. Take care not to overwrite each other\'s updates!', + 'time_b' => 'in de laatste :minCount minuten', + 'message' => ':start :time. Let op om elkaars updates niet te overschrijven!', ], - 'pages_draft_discarded' => 'Draft discarded, The editor has been updated with the current page content', - 'pages_specific' => 'Specific Page', - 'pages_is_template' => 'Page Template', + 'pages_draft_discarded' => 'Concept verwijderd, de editor is bijgewerkt met de huidige pagina-inhoud', + 'pages_specific' => 'Specifieke Pagina', + 'pages_is_template' => 'Paginasjabloon', // Editor Sidebar 'page_tags' => 'Pagina Labels', - 'chapter_tags' => 'Chapter Tags', - 'book_tags' => 'Book Tags', - 'shelf_tags' => 'Shelf Tags', + 'chapter_tags' => 'Tags van Hoofdstuk', + 'book_tags' => 'Tags van Boeken', + 'shelf_tags' => 'Tags van Boekplanken', 'tag' => 'Label', 'tags' => 'Tags', - 'tag_name' => 'Tag Name', + 'tag_name' => 'Naam Tag', 'tag_value' => 'Label Waarde (Optioneel)', 'tags_explain' => "Voeg labels toe om de inhoud te categoriseren. \n Je kunt meerdere labels toevoegen.", 'tags_add' => 'Voeg een extra label toe', - 'tags_remove' => 'Remove this tag', + 'tags_remove' => 'Deze tag verwijderen', 'attachments' => 'Bijlages', 'attachments_explain' => 'Upload bijlages of voeg een link toe. Deze worden zichtbaar in het navigatiepaneel.', 'attachments_explain_instant_save' => 'Wijzigingen worden meteen opgeslagen.', @@ -256,7 +257,7 @@ return [ 'attachments_upload' => 'Bestand Uploaden', 'attachments_link' => 'Link Toevoegen', 'attachments_set_link' => 'Zet Link', - 'attachments_delete_confirm' => 'Klik opnieuw op \'verwijderen\' om de bijlage definitief te verwijderen.', + 'attachments_delete' => 'Weet u zeker dat u deze bijlage wilt verwijderen?', 'attachments_dropzone' => 'Sleep hier een bestand of klik hier om een bestand toe te voegen', 'attachments_no_files' => 'Er zijn geen bestanden geüpload', 'attachments_explain_link' => 'Je kunt een link toevoegen als je geen bestanden wilt uploaden. Dit kan een link naar een andere pagina op deze website zijn, maar ook een link naar een andere website.', @@ -265,6 +266,7 @@ return [ 'attachments_link_url' => 'Link naar bestand', 'attachments_link_url_hint' => 'Url, site of bestand', 'attach' => 'Koppelen', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Bestand Bewerken', 'attachments_edit_file_name' => 'Bestandsnaam', 'attachments_edit_drop_upload' => 'Sleep een bestand of klik hier om te uploaden en te overschrijven', @@ -274,12 +276,12 @@ return [ 'attachments_file_uploaded' => 'Bestand succesvol geüpload', 'attachments_file_updated' => 'Bestand succesvol bijgewerkt', 'attachments_link_attached' => 'Link successfully gekoppeld aan de pagina', - 'templates' => 'Templates', - 'templates_set_as_template' => 'Page is a template', - 'templates_explain_set_as_template' => 'You can set this page as a template so its contents be utilized when creating other pages. Other users will be able to use this template if they have view permissions for this page.', - 'templates_replace_content' => 'Replace page content', - 'templates_append_content' => 'Append to page content', - 'templates_prepend_content' => 'Prepend to page content', + 'templates' => 'Sjablonen', + 'templates_set_as_template' => 'Pagina is een sjabloon', + 'templates_explain_set_as_template' => 'Je kunt deze pagina als template instellen zodat de inhoud wordt gebruikt bij het maken van andere pagina\'s. Andere gebruikers kunnen deze template gebruiken als ze rechten hebben om deze pagina te bekijken.', + 'templates_replace_content' => 'Pagina-inhoud vervangen', + 'templates_append_content' => 'Toevoegen aan pagina-inhoud', + 'templates_prepend_content' => 'Voeg vooraan toe aan pagina-inhoud', // Profile View 'profile_user_for_x' => 'Lid sinds :time', @@ -287,12 +289,12 @@ return [ 'profile_not_created_pages' => ':userName heeft geen pagina\'s gemaakt', 'profile_not_created_chapters' => ':userName heeft geen hoofdstukken gemaakt', 'profile_not_created_books' => ':userName heeft geen boeken gemaakt', - 'profile_not_created_shelves' => ':userName has not created any shelves', + 'profile_not_created_shelves' => ':userName heeft nog geen boekenplanken gemaakt', // Comments 'comment' => 'Reactie', 'comments' => 'Reacties', - 'comment_add' => 'Add Comment', + 'comment_add' => 'Reactie Toevoegen', 'comment_placeholder' => 'Laat hier een reactie achter', 'comment_count' => '{0} Geen reacties|{1} 1 Reactie|[2,*] :count Reacties', 'comment_save' => 'Sla reactie op', @@ -309,7 +311,7 @@ return [ // Revision 'revision_delete_confirm' => 'Weet u zeker dat u deze revisie wilt verwijderen?', - 'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.', + 'revision_restore_confirm' => 'Weet u zeker dat u deze revisie wilt herstellen? De huidige pagina-inhoud wordt vervangen.', 'revision_delete_success' => 'Revisie verwijderd', 'revision_cannot_delete_latest' => 'Kan de laatste revisie niet verwijderen.' ]; \ No newline at end of file diff --git a/resources/lang/nl/errors.php b/resources/lang/nl/errors.php index dca27ca39..585346748 100644 --- a/resources/lang/nl/errors.php +++ b/resources/lang/nl/errors.php @@ -13,7 +13,7 @@ return [ 'email_already_confirmed' => 'Het e-mailadres is al bevestigd. Probeer in te loggen.', 'email_confirmation_invalid' => 'Deze bevestigingstoken is ongeldig, Probeer opnieuw te registreren.', 'email_confirmation_expired' => 'De bevestigingstoken is verlopen, Een nieuwe bevestigingsmail is verzonden.', - 'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed', + 'email_confirmation_awaiting' => 'Het e-mail adres van dit account moet worden bevestigd', 'ldap_fail_anonymous' => 'LDAP toegang kon geen \'anonymous bind\' uitvoeren', 'ldap_fail_authed' => 'LDAP toegang was niet mogelijk met de opgegeven dn & wachtwoord', 'ldap_extension_not_installed' => 'LDAP PHP-extensie is niet geïnstalleerd', @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Het uploaden van het bestand is verlopen.', // Attachments - 'attachment_page_mismatch' => 'Bij het bijwerken van de bijlage bleek de pagina onjuist', 'attachment_not_found' => 'Bijlage niet gevonden', // Pages @@ -83,21 +82,21 @@ return [ // Error pages '404_page_not_found' => 'Pagina Niet Gevonden', 'sorry_page_not_found' => 'Sorry, de pagina die je zocht is niet beschikbaar.', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => 'Als u verwacht dat deze pagina bestaat heeft u misschien geen rechten om het te bekijken.', 'return_home' => 'Terug naar home', 'error_occurred' => 'Er Ging Iets Fout', 'app_down' => ':appName is nu niet beschikbaar', 'back_soon' => 'Komt snel weer online.', // API errors - 'api_no_authorization_found' => 'No authorization token found on the request', - 'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect', - 'api_user_token_not_found' => 'No matching API token was found for the provided authorization token', - 'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect', - 'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls', - 'api_user_token_expired' => 'The authorization token used has expired', + 'api_no_authorization_found' => 'Geen autorisatie token gevonden', + 'api_bad_authorization_format' => 'Een autorisatie token is gevonden, maar het formaat schijnt onjuist te zijn', + 'api_user_token_not_found' => 'Er is geen overeenkomende API token gevonden voor de opgegeven autorisatie token', + 'api_incorrect_token_secret' => 'Het opgegeven geheim voor de API token is onjuist', + 'api_user_no_api_permission' => 'De eigenaar van de gebruikte API token heeft geen toestemming om API calls te maken', + 'api_user_token_expired' => 'De gebruikte autorisatie token is verlopen', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => 'Fout opgetreden bij het verzenden van een test email:', ]; diff --git a/resources/lang/nl/passwords.php b/resources/lang/nl/passwords.php index e0f36816c..4b27f03c2 100644 --- a/resources/lang/nl/passwords.php +++ b/resources/lang/nl/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => 'Wachtwoorden moeten overeenkomen en minimaal zes tekens lang zijn.', 'user' => "We kunnen niemand vinden met dat e-mailadres.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'Het wachtwoord reset token is ongeldig voor dit e-mailadres.', 'sent' => 'We hebben je een link gestuurd om je wachtwoord te herstellen!', 'reset' => 'Je wachtwoord is hersteld!', diff --git a/resources/lang/nl/settings.php b/resources/lang/nl/settings.php index cdd1b6fef..4c87095b4 100644 --- a/resources/lang/nl/settings.php +++ b/resources/lang/nl/settings.php @@ -44,9 +44,9 @@ return [ // Color settings 'content_colors' => 'Kleuren inhoud', 'content_colors_desc' => 'Stelt de kleuren in voor alle elementen in de pagina-organisatieleiding. Het kiezen van kleuren met dezelfde helderheid als de standaard kleuren wordt aanbevolen voor de leesbaarheid.', - 'bookshelf_color' => 'Shelf Color', - 'book_color' => 'Book Color', - 'chapter_color' => 'Chapter Color', + 'bookshelf_color' => 'Kleur van de Boekenplank', + 'book_color' => 'Kleur van het Boek', + 'chapter_color' => 'Kleur van het Hoofdstuk', 'page_color' => 'Pagina kleur', 'page_draft_color' => 'Klad pagina kleur', @@ -56,7 +56,7 @@ return [ 'reg_enable_toggle' => 'Registratie inschakelen', 'reg_enable_desc' => 'Wanneer registratie is ingeschakeld, kan de gebruiker zich aanmelden als een gebruiker. Na registratie krijgen ze een enkele, standaard gebruikersrol.', 'reg_default_role' => 'Standaard rol na registratie', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', + 'reg_enable_external_warning' => 'De optie hierboven wordt niet gebruikt terwijl LDAP authenticatie actief is. Gebruikersaccounts voor niet-bestaande leden zullen automatisch worden gecreëerd als authenticatie tegen het gebruikte LDAP-systeem succesvol is.', 'reg_email_confirmation' => 'E-mail bevestiging', 'reg_email_confirmation_toggle' => 'E-mailbevestiging verplichten', 'reg_confirm_email_desc' => 'Als domeinrestricties aan staan dan is altijd e-maibevestiging nodig. Onderstaande instelling wordt dan genegeerd.', @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'E-mailbezorging lijkt te werken!', 'maint_send_test_email_mail_text' => 'Gefeliciteerd! Nu je deze e-mailmelding hebt ontvangen, lijken je e-mailinstellingen correct te zijn geconfigureerd.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Rollen', 'role_user_roles' => 'Gebruikrollen', @@ -103,9 +117,10 @@ return [ 'role_manage_entity_permissions' => 'Beheer alle boeken-, hoofdstukken- en paginaresitrcties', 'role_manage_own_entity_permissions' => 'Beheer restricties van je eigen boeken, hoofdstukken en pagina\'s', 'role_manage_page_templates' => 'Paginasjablonen beheren', - 'role_access_api' => 'Access system API', + 'role_access_api' => 'Ga naar systeem API', 'role_manage_settings' => 'Beheer app instellingen', 'role_asset' => 'Asset Permissies', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Deze permissies bepalen de standaardtoegangsrechten. Permissies op boeken, hoofdstukken en pagina\'s overschrijven deze instelling.', 'role_asset_admins' => 'Beheerders krijgen automatisch toegang tot alle inhoud, maar deze opties kunnen interface opties tonen of verbergen.', 'role_all' => 'Alles', @@ -160,11 +175,11 @@ return [ // API Tokens 'user_api_token_create' => 'Create API Token', - 'user_api_token_name' => 'Name', + 'user_api_token_name' => 'Naam', 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', - 'user_api_token_expiry' => 'Expiry Date', + 'user_api_token_expiry' => 'Vervaldatum', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,9 +187,9 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', - 'user_api_token_delete' => 'Delete Token', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', + 'user_api_token_delete' => 'Token Verwijderen', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', 'user_api_token_delete_success' => 'API token successfully deleted', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/pl/auth.php b/resources/lang/pl/auth.php index bb46cb2de..01d74b99c 100644 --- a/resources/lang/pl/auth.php +++ b/resources/lang/pl/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Resetowanie hasła', 'reset_password_send_instructions' => 'Wprowadź adres e-mail powiązany z Twoim kontem, by otrzymać link do resetowania hasła.', 'reset_password_send_button' => 'Wyślij link do resetowania hasła', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => 'Link z resetem hasła zostanie wysłany na :email jeśli mamy ten adres w systemie.', 'reset_password_success' => 'Hasło zostało zresetowane pomyślnie.', 'email_reset_subject' => 'Resetowanie hasła do :appName', 'email_reset_text' => 'Otrzymujesz tę wiadomość ponieważ ktoś zażądał zresetowania hasła do Twojego konta.', diff --git a/resources/lang/pl/common.php b/resources/lang/pl/common.php index 9fe313858..c93d0b9e1 100644 --- a/resources/lang/pl/common.php +++ b/resources/lang/pl/common.php @@ -33,12 +33,13 @@ return [ 'copy' => 'Skopiuj', 'reply' => 'Odpowiedz', 'delete' => 'Usuń', + 'delete_confirm' => 'Potwierdź usunięcie', 'search' => 'Szukaj', 'search_clear' => 'Wyczyść wyszukiwanie', 'reset' => 'Resetuj', 'remove' => 'Usuń', 'add' => 'Dodaj', - 'fullscreen' => 'Fullscreen', + 'fullscreen' => 'Pełny ekran', // Sort Options 'sort_options' => 'Opcje sortowania', @@ -60,14 +61,14 @@ return [ 'grid_view' => 'Widok kafelkowy', 'list_view' => 'Widok listy', 'default' => 'Domyślny', - 'breadcrumb' => 'Breadcrumb', + 'breadcrumb' => 'Ścieżka nawigacji', // Header 'profile_menu' => 'Menu profilu', 'view_profile' => 'Zobacz profil', 'edit_profile' => 'Edytuj profil', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Tryb ciemny', + 'light_mode' => 'Tryb jasny', // Layout tabs 'tab_info' => 'Informacje', diff --git a/resources/lang/pl/components.php b/resources/lang/pl/components.php index b189c8171..b03ca3550 100644 --- a/resources/lang/pl/components.php +++ b/resources/lang/pl/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Wczytaj więcej', 'image_image_name' => 'Nazwa obrazka', 'image_delete_used' => 'Ten obrazek jest używany na stronach wyświetlonych poniżej.', - 'image_delete_confirm' => 'Kliknij ponownie Usuń by potwierdzić usunięcie obrazka.', + 'image_delete_confirm_text' => 'Czy na pewno chcesz usunąć ten obraz?', 'image_select_image' => 'Wybierz obrazek', 'image_dropzone' => 'Upuść obrazki tutaj lub kliknij by wybrać obrazki do przesłania', 'images_deleted' => 'Usunięte obrazki', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Edytuj kod', 'code_language' => 'Język kodu', 'code_content' => 'Zawartość kodu', + 'code_session_history' => 'Historia sesji', 'code_save' => 'Zapisz kod', ]; diff --git a/resources/lang/pl/entities.php b/resources/lang/pl/entities.php index 9a1b7f9d2..89a934291 100644 --- a/resources/lang/pl/entities.php +++ b/resources/lang/pl/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Brak stron spełniających zadane kryterium', 'search_for_term' => 'Szukaj :term', 'search_more' => 'Więcej wyników', - 'search_filters' => 'Filtry wyszukiwania', + 'search_advanced' => 'Wyszukiwanie zaawansowane', + 'search_terms' => 'Szukane frazy', 'search_content_type' => 'Rodzaj treści', 'search_exact_matches' => 'Dokładne frazy', 'search_tags' => 'Tagi wyszukiwania', @@ -256,7 +257,7 @@ return [ 'attachments_upload' => 'Dodaj plik', 'attachments_link' => 'Dodaj link', 'attachments_set_link' => 'Ustaw link', - 'attachments_delete_confirm' => 'Kliknij ponownie Usuń by potwierdzić usunięcie załącznika.', + 'attachments_delete' => 'Jesteś pewien, że chcesz usunąć ten załącznik?', 'attachments_dropzone' => 'Upuść pliki lub kliknij tutaj by przesłać pliki', 'attachments_no_files' => 'Nie przesłano żadnych plików', 'attachments_explain_link' => 'Możesz załączyć link jeśli nie chcesz przesyłać pliku. Może być to link do innej strony lub link do pliku w chmurze.', @@ -265,6 +266,7 @@ return [ 'attachments_link_url' => 'Link do pliku', 'attachments_link_url_hint' => 'Strona lub plik', 'attach' => 'Załącz', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Edytuj plik', 'attachments_edit_file_name' => 'Nazwa pliku', 'attachments_edit_drop_upload' => 'Upuść pliki lub kliknij tutaj by przesłać pliki i nadpisać istniejące', diff --git a/resources/lang/pl/errors.php b/resources/lang/pl/errors.php index 5273906a0..5f5ec9db2 100644 --- a/resources/lang/pl/errors.php +++ b/resources/lang/pl/errors.php @@ -13,7 +13,7 @@ return [ 'email_already_confirmed' => 'E-mail został potwierdzony, spróbuj się zalogować.', 'email_confirmation_invalid' => 'Ten token jest nieprawidłowy lub został już wykorzystany. Spróbuj zarejestrować się ponownie.', 'email_confirmation_expired' => 'Ten token potwierdzający wygasł. Wysłaliśmy Ci kolejny.', - 'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed', + 'email_confirmation_awaiting' => 'Adres e-mail dla używanego konta musi zostać potwierdzony', 'ldap_fail_anonymous' => 'Dostęp LDAP przy użyciu anonimowego powiązania nie powiódł się', 'ldap_fail_authed' => 'Dostęp LDAP przy użyciu tego DN i hasła nie powiódł się', 'ldap_extension_not_installed' => 'Rozszerzenie LDAP PHP nie zostało zainstalowane', @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Przesyłanie pliku przekroczyło limit czasu.', // Attachments - 'attachment_page_mismatch' => 'Niezgodność strony podczas aktualizacji załącznika', 'attachment_not_found' => 'Nie znaleziono załącznika', // Pages @@ -83,21 +82,21 @@ return [ // Error pages '404_page_not_found' => 'Strona nie została znaleziona', 'sorry_page_not_found' => 'Przepraszamy, ale strona której szukasz nie została znaleziona.', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => 'Jeśli spodziewałeś się, że ta strona istnieje, prawdopodobnie nie masz uprawnień do jej wyświetlenia.', 'return_home' => 'Powrót do strony głównej', 'error_occurred' => 'Wystąpił błąd', 'app_down' => ':appName jest aktualnie wyłączona', 'back_soon' => 'Niedługo zostanie uruchomiona ponownie.', // API errors - 'api_no_authorization_found' => 'No authorization token found on the request', - 'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect', - 'api_user_token_not_found' => 'No matching API token was found for the provided authorization token', - 'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect', - 'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls', - 'api_user_token_expired' => 'The authorization token used has expired', + 'api_no_authorization_found' => 'Nie znaleziono tokenu autoryzacji dla żądania', + 'api_bad_authorization_format' => 'Token autoryzacji został znaleziony w żądaniu, ale format okazał się nieprawidłowy', + 'api_user_token_not_found' => 'Nie znaleziono pasującego tokenu API dla podanego tokenu autoryzacji', + 'api_incorrect_token_secret' => 'Podany sekret dla tego API jest nieprawidłowy', + 'api_user_no_api_permission' => 'Właściciel używanego tokenu API nie ma uprawnień do wykonywania zapytań do API', + 'api_user_token_expired' => 'Token uwierzytelniania wygasł', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => 'Błąd podczas wysyłania testowej wiadomości e-mail:', ]; diff --git a/resources/lang/pl/passwords.php b/resources/lang/pl/passwords.php index 02f920127..7b67bf38d 100644 --- a/resources/lang/pl/passwords.php +++ b/resources/lang/pl/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => 'Hasło musi zawierać co najmniej 6 znaków i być zgodne z powtórzeniem.', 'user' => "Nie znaleziono użytkownika o takim adresie e-mail.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'Token resetowania hasła jest nieprawidłowy dla tego adresu e-mail.', 'sent' => 'Wysłaliśmy Ci link do resetowania hasła!', 'reset' => 'Twoje hasło zostało zresetowane!', diff --git a/resources/lang/pl/settings.php b/resources/lang/pl/settings.php index eefe2b19e..4d7936e48 100644 --- a/resources/lang/pl/settings.php +++ b/resources/lang/pl/settings.php @@ -56,7 +56,7 @@ return [ 'reg_enable_toggle' => 'Włącz rejestrację', 'reg_enable_desc' => 'Kiedy rejestracja jest włączona użytkownicy mogą się rejestrować. Po rejestracji otrzymują jedną domyślną rolę użytkownika.', 'reg_default_role' => 'Domyślna rola użytkownika po rejestracji', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', + 'reg_enable_external_warning' => 'Powyższa opcja jest ignorowana, gdy zewnętrzne uwierzytelnianie LDAP lub SAML jest aktywne. Konta użytkowników dla nieistniejących użytkowników zostaną automatycznie utworzone, jeśli uwierzytelnianie za pomocą systemu zewnętrznego zakończy się sukcesem.', 'reg_email_confirmation' => 'Potwierdzenie adresu email', 'reg_email_confirmation_toggle' => 'Wymagaj potwierdzenia adresu email', 'reg_confirm_email_desc' => 'Jeśli restrykcje domenowe zostały ustawione, potwierdzenie adresu stanie się konieczne, a poniższa wartośc zostanie zignorowana.', @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Wygląda na to, że wysyłka wiadomości e-mail działa!', 'maint_send_test_email_mail_text' => 'Gratulacje! Otrzymałeś tego e-maila więc Twoje ustawienia poczty elektronicznej wydają się być prawidłowo skonfigurowane.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Role', 'role_user_roles' => 'Role użytkowników', @@ -103,9 +117,10 @@ return [ 'role_manage_entity_permissions' => 'Zarządzanie uprawnieniami książek, rozdziałów i stron', 'role_manage_own_entity_permissions' => 'Zarządzanie uprawnieniami własnych książek, rozdziałów i stron', 'role_manage_page_templates' => 'Zarządzaj szablonami stron', - 'role_access_api' => 'Access system API', + 'role_access_api' => 'Dostęp do systemowego API', 'role_manage_settings' => 'Zarządzanie ustawieniami aplikacji', 'role_asset' => 'Zarządzanie zasobami', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Te ustawienia kontrolują zarządzanie zasobami systemu. Uprawnienia książek, rozdziałów i stron nadpisują te ustawienia.', 'role_asset_admins' => 'Administratorzy mają automatycznie dostęp do wszystkich treści, ale te opcję mogą być pokazywać lub ukrywać opcje interfejsu użytkownika.', 'role_all' => 'Wszyscy', @@ -131,7 +146,7 @@ return [ 'users_send_invite_text' => 'Możesz wybrać wysłanie do tego użytkownika wiadomości e-mail z zaproszeniem, która pozwala mu ustawić własne hasło, w przeciwnym razie możesz ustawić je samemu.', 'users_send_invite_option' => 'Wyślij e-mail z zaproszeniem', 'users_external_auth_id' => 'Zewnętrzne identyfikatory autentykacji', - 'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.', + 'users_external_auth_id_desc' => 'Jest to identyfikator używany do dopasowania tego użytkownika podczas komunikacji z zewnętrznym systemem uwierzytelniania.', 'users_password_warning' => 'Wypełnij poniżej tylko jeśli chcesz zmienić swoje hasło:', 'users_system_public' => 'Ten użytkownik reprezentuje każdego gościa odwiedzającego tę aplikację. Nie można się na niego zalogować, lecz jest przyznawany automatycznie.', 'users_delete' => 'Usuń użytkownika', @@ -141,7 +156,7 @@ return [ 'users_delete_success' => 'Użytkownik usunięty pomyślnie', 'users_edit' => 'Edytuj użytkownika', 'users_edit_profile' => 'Edytuj profil', - 'users_edit_success' => 'Użytkownik zaktualizowany pomyśłnie', + 'users_edit_success' => 'Użytkownik zaktualizowany pomyślnie', 'users_avatar' => 'Avatar użytkownika', 'users_avatar_desc' => 'Ten obrazek powinien posiadać wymiary 256x256px.', 'users_preferred_language' => 'Preferowany język', @@ -152,32 +167,32 @@ return [ 'users_social_disconnect' => 'Odłącz konto', 'users_social_connected' => ':socialAccount zostało dodane do Twojego profilu.', 'users_social_disconnected' => ':socialAccount zostało odłączone od Twojego profilu.', - 'users_api_tokens' => 'API Tokens', - 'users_api_tokens_none' => 'No API tokens have been created for this user', - 'users_api_tokens_create' => 'Create Token', - 'users_api_tokens_expires' => 'Expires', - 'users_api_tokens_docs' => 'API Documentation', + 'users_api_tokens' => 'Tokeny API', + 'users_api_tokens_none' => 'Nie utworzono tokenów API dla tego użytkownika', + 'users_api_tokens_create' => 'Utwórz token', + 'users_api_tokens_expires' => 'Wygasa', + 'users_api_tokens_docs' => 'Dokumentacja API', // API Tokens - 'user_api_token_create' => 'Create API Token', - 'user_api_token_name' => 'Name', - 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', - 'user_api_token_expiry' => 'Expiry Date', - 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', - 'user_api_token_create_success' => 'API token successfully created', - 'user_api_token_update_success' => 'API token successfully updated', - 'user_api_token' => 'API Token', + 'user_api_token_create' => 'Utwórz klucz API', + 'user_api_token_name' => 'Nazwa', + 'user_api_token_name_desc' => 'Nadaj swojemu tokenowi czytelną nazwę jako opisującego jego cel.', + 'user_api_token_expiry' => 'Data ważności', + 'user_api_token_expiry_desc' => 'Ustaw datę, kiedy ten token wygasa. Po tej dacie żądania wykonane przy użyciu tego tokenu nie będą już działać. Pozostawienie tego pola pustego, ustawi ważność na 100 lat.', + 'user_api_token_create_secret_message' => 'Natychmiast po utworzeniu tego tokenu zostanie wygenerowany i wyświetlony "Identyfikator tokenu"" i "Token Secret". Sekret zostanie wyświetlony tylko raz, więc przed kontynuacją upewnij się, że zostanie on skopiowany w bezpiecznie miejsce.', + 'user_api_token_create_success' => 'Klucz API został poprawnie wygenerowany', + 'user_api_token_update_success' => 'Klucz API został poprawnie zaktualizowany', + 'user_api_token' => 'Token API', 'user_api_token_id' => 'Token ID', - 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', - 'user_api_token_secret' => 'Token Secret', - 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', - 'user_api_token_delete' => 'Delete Token', - 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', - 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', - 'user_api_token_delete_success' => 'API token successfully deleted', + 'user_api_token_id_desc' => 'Jest to nieedytowalny identyfikator wygenerowany przez system dla tego tokenu, który musi być dostarczony w żądaniach API.', + 'user_api_token_secret' => 'Token Api', + 'user_api_token_secret_desc' => 'To jest wygenerowany przez system sekretny token, który musi być dostarczony w żądaniach API. Token zostanie wyświetlany tylko raz, więc skopiuj go w bezpiecznie miejsce.', + 'user_api_token_created' => 'Token utworzony :timeAgo', + 'user_api_token_updated' => 'Token zaktualizowany :timeAgo', + 'user_api_token_delete' => 'Usuń token', + 'user_api_token_delete_warning' => 'Spowoduje to całkowite usunięcie tokenu API o nazwie \':tokenName\' z systemu.', + 'user_api_token_delete_confirm' => 'Czy jesteś pewien, że chcesz usunąć ten token?', + 'user_api_token_delete_success' => 'Token API został poprawnie usunięty', //! If editing translations files directly please ignore this in all //! languages apart from en. Content will be auto-copied from en. @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/pt/common.php b/resources/lang/pt/common.php index 68c58b92b..e87bd11a5 100644 --- a/resources/lang/pt/common.php +++ b/resources/lang/pt/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copy', 'reply' => 'Reply', 'delete' => 'Delete', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Search', 'search_clear' => 'Clear Search', 'reset' => 'Reset', diff --git a/resources/lang/pt/components.php b/resources/lang/pt/components.php index d8e8981fb..48a0a32fa 100644 --- a/resources/lang/pt/components.php +++ b/resources/lang/pt/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Load More', 'image_image_name' => 'Image Name', 'image_delete_used' => 'This image is used in the pages below.', - 'image_delete_confirm' => 'Click delete again to confirm you want to delete this image.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Select Image', 'image_dropzone' => 'Drop images or click here to upload', 'images_deleted' => 'Images Deleted', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Edit Code', 'code_language' => 'Code Language', 'code_content' => 'Code Content', + 'code_session_history' => 'Session History', 'code_save' => 'Save Code', ]; diff --git a/resources/lang/pt/entities.php b/resources/lang/pt/entities.php index 6bbc723b0..f64867a56 100644 --- a/resources/lang/pt/entities.php +++ b/resources/lang/pt/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'No pages matched this search', 'search_for_term' => 'Search for :term', 'search_more' => 'More Results', - 'search_filters' => 'Search Filters', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Content Type', 'search_exact_matches' => 'Exact Matches', 'search_tags' => 'Tag Searches', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Upload File', 'attachments_link' => 'Attach Link', 'attachments_set_link' => 'Set Link', - 'attachments_delete_confirm' => 'Click delete again to confirm you want to delete this attachment.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Drop files or click here to attach a file', 'attachments_no_files' => 'No files have been uploaded', 'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link to file', 'attachments_link_url_hint' => 'Url of site or file', 'attach' => 'Attach', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Edit File', 'attachments_edit_file_name' => 'File Name', 'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite', diff --git a/resources/lang/pt/errors.php b/resources/lang/pt/errors.php index 06a5285f5..79024e482 100644 --- a/resources/lang/pt/errors.php +++ b/resources/lang/pt/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'The file upload has timed out.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'Attachment not found', // Pages diff --git a/resources/lang/pt/settings.php b/resources/lang/pt/settings.php index f1345c743..2bd314cf0 100644 --- a/resources/lang/pt/settings.php +++ b/resources/lang/pt/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roles', 'role_user_roles' => 'User Roles', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Manage app settings', 'role_asset' => 'Asset Permissions', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'All', diff --git a/resources/lang/pt_BR/auth.php b/resources/lang/pt_BR/auth.php index 094cdf4d2..b2c3072c4 100644 --- a/resources/lang/pt_BR/auth.php +++ b/resources/lang/pt_BR/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Redefinir Senha', 'reset_password_send_instructions' => 'Insira seu e-mail abaixo e uma mensagem com o link de redefinição de senha lhe será enviada.', 'reset_password_send_button' => 'Enviar o Link de Redefinição', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => 'Um link de redefinição de senha será enviado para :email se o endereço de e-mail for encontrado no sistema.', 'reset_password_success' => 'Sua senha foi redefinida com sucesso.', 'email_reset_subject' => 'Redefina a senha de :appName', 'email_reset_text' => 'Você recebeu esse e-mail pois recebemos uma solicitação de redefinição de senha para a sua conta.', diff --git a/resources/lang/pt_BR/common.php b/resources/lang/pt_BR/common.php index e57467ec1..8b0dffe6e 100644 --- a/resources/lang/pt_BR/common.php +++ b/resources/lang/pt_BR/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copiar', 'reply' => 'Responder', 'delete' => 'Excluir', + 'delete_confirm' => 'Confirmar Exclusão', 'search' => 'Pesquisar', 'search_clear' => 'Limpar Pesquisa', 'reset' => 'Redefinir', @@ -66,8 +67,8 @@ return [ 'profile_menu' => 'Menu de Perfil', 'view_profile' => 'Visualizar Perfil', 'edit_profile' => 'Editar Perfil', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Modo Escuro', + 'light_mode' => 'Modo Claro', // Layout tabs 'tab_info' => 'Informações', diff --git a/resources/lang/pt_BR/components.php b/resources/lang/pt_BR/components.php index e45101452..a1210d52c 100644 --- a/resources/lang/pt_BR/components.php +++ b/resources/lang/pt_BR/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Carregar Mais', 'image_image_name' => 'Nome da Imagem', 'image_delete_used' => 'Essa imagem é usada nas páginas abaixo.', - 'image_delete_confirm' => 'Clique em Excluir novamente para confirmar que você deseja mesmo eliminar a imagem.', + 'image_delete_confirm_text' => 'Tem certeza de que deseja excluir essa imagem?', 'image_select_image' => 'Selecionar Imagem', 'image_dropzone' => 'Arraste imagens ou clique aqui para fazer upload', 'images_deleted' => 'Imagens Excluídas', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Editar Código', 'code_language' => 'Linguagem do Código', 'code_content' => 'Código', + 'code_session_history' => 'Histórico de Sessão', 'code_save' => 'Salvar Código', ]; diff --git a/resources/lang/pt_BR/entities.php b/resources/lang/pt_BR/entities.php index 323ce083f..b37d17931 100644 --- a/resources/lang/pt_BR/entities.php +++ b/resources/lang/pt_BR/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Nenhuma página corresponde à pesquisa', 'search_for_term' => 'Pesquisar por :term', 'search_more' => 'Mais Resultados', - 'search_filters' => 'Filtros de Pesquisa', + 'search_advanced' => 'Pesquisa Avançada', + 'search_terms' => 'Termos da Pesquisa', 'search_content_type' => 'Tipo de Conteúdo', 'search_exact_matches' => 'Correspondências Exatas', 'search_tags' => 'Persquisar Tags', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Upload de Arquivos', 'attachments_link' => 'Links Anexados', 'attachments_set_link' => 'Definir Link', - 'attachments_delete_confirm' => 'Clique novamente em Excluir para confirmar a exclusão desse anexo.', + 'attachments_delete' => 'Tem certeza de que deseja excluir esse anexo?', 'attachments_dropzone' => 'Arraste arquivos para cá ou clique para anexar arquivos', 'attachments_no_files' => 'Nenhum arquivo foi enviado', 'attachments_explain_link' => 'Você pode anexar um link se preferir não fazer o upload do arquivo. O link poderá ser para uma outra página ou para um arquivo na nuvem.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link para o Arquivo', 'attachments_link_url_hint' => 'URL do site ou arquivo', 'attach' => 'Anexar', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Editar Arquivo', 'attachments_edit_file_name' => 'Nome do Arquivo', 'attachments_edit_drop_upload' => 'Arraste arquivos para cá ou clique para anexar arquivos e sobrescreve-los', diff --git a/resources/lang/pt_BR/errors.php b/resources/lang/pt_BR/errors.php index 0758c3e97..c65d7f496 100644 --- a/resources/lang/pt_BR/errors.php +++ b/resources/lang/pt_BR/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'O upload do arquivo expirou.', // Attachments - 'attachment_page_mismatch' => 'Erro de \'Page mismatch\' durante a atualização do anexo', 'attachment_not_found' => 'Anexo não encontrado', // Pages diff --git a/resources/lang/pt_BR/passwords.php b/resources/lang/pt_BR/passwords.php index 07865c43d..fde9e2937 100644 --- a/resources/lang/pt_BR/passwords.php +++ b/resources/lang/pt_BR/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => 'Senhas devem ter ao menos oito caracteres e ser iguais à confirmação.', 'user' => "Não pudemos encontrar um usuário com o e-mail fornecido.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'O token de redefinição de senha é inválido para este endereço de e-mail.', 'sent' => 'Enviamos o link de redefinição de senha para o seu e-mail!', 'reset' => 'Sua senha foi redefinida com sucesso!', diff --git a/resources/lang/pt_BR/settings.php b/resources/lang/pt_BR/settings.php index 7176eb9f3..a4da2ad88 100644 --- a/resources/lang/pt_BR/settings.php +++ b/resources/lang/pt_BR/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'O envio de e-mails parece funcionar!', 'maint_send_test_email_mail_text' => 'Parabéns! Já que você recebeu esta notificação, suas opções de e-mail parecem estar configuradas corretamente.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Cargos', 'role_user_roles' => 'Cargos de Usuário', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Acessar API do sistema', 'role_manage_settings' => 'Gerenciar configurações da aplicação', 'role_asset' => 'Permissões de Ativos', + 'roles_system_warning' => 'Esteja ciente de que o acesso a qualquer uma das três permissões acima pode permitir que um usuário altere seus próprios privilégios ou privilégios de outros usuários no sistema. Apenas atribua cargos com essas permissões para usuários confiáveis.', 'role_asset_desc' => 'Essas permissões controlam o acesso padrão para os ativos dentro do sistema. Permissões em Livros, Capítulos e Páginas serão sobrescritas por essas permissões.', 'role_asset_admins' => 'Administradores recebem automaticamente acesso a todo o conteúdo, mas essas opções podem mostrar ou ocultar as opções da Interface de Usuário.', 'role_all' => 'Todos', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/ru/common.php b/resources/lang/ru/common.php index 12fac6507..12eac6912 100644 --- a/resources/lang/ru/common.php +++ b/resources/lang/ru/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Скопировать', 'reply' => 'Ответить', 'delete' => 'Удалить', + 'delete_confirm' => 'Подтвердить удаление', 'search' => 'Поиск', 'search_clear' => 'Очистить поиск', 'reset' => 'Сбросить', diff --git a/resources/lang/ru/components.php b/resources/lang/ru/components.php index d85fca008..12b1dd7cf 100644 --- a/resources/lang/ru/components.php +++ b/resources/lang/ru/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Загрузить еще', 'image_image_name' => 'Название изображения', 'image_delete_used' => 'Это изображение используется на странице ниже.', - 'image_delete_confirm' => 'Нажмите \'Удалить\' еще раз для подтверждения удаления.', + 'image_delete_confirm_text' => 'Вы уверены, что хотите удалить это изображение?', 'image_select_image' => 'Выбрать изображение', 'image_dropzone' => 'Перетащите изображение или кликните для загрузки', 'images_deleted' => 'Изображения удалены', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Изменить код', 'code_language' => 'Язык кода', 'code_content' => 'Содержимое кода', + 'code_session_history' => 'История сессии', 'code_save' => 'Сохранить код', ]; diff --git a/resources/lang/ru/entities.php b/resources/lang/ru/entities.php index fc180061a..b27e041c2 100644 --- a/resources/lang/ru/entities.php +++ b/resources/lang/ru/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Нет страниц, соответствующих этому поиску', 'search_for_term' => 'Искать :term', 'search_more' => 'Еще результаты', - 'search_filters' => 'Фильтры поиска', + 'search_advanced' => 'Расширенный поиск', + 'search_terms' => 'Поисковые запросы', 'search_content_type' => 'Тип содержимого', 'search_exact_matches' => 'Точные соответствия', 'search_tags' => 'Поиск по тегам', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Загрузить файл', 'attachments_link' => 'Присоединить ссылку', 'attachments_set_link' => 'Установить ссылку', - 'attachments_delete_confirm' => 'Нажмите \'Удалить\' еще раз, чтобы подтвердить удаление этого файла.', + 'attachments_delete' => 'Вы уверены, что хотите удалить это вложение?', 'attachments_dropzone' => 'Перетащите файл сюда или нажмите здесь, чтобы загрузить файл', 'attachments_no_files' => 'Файлы не загружены', 'attachments_explain_link' => 'Вы можете присоединить ссылку, если вы предпочитаете не загружать файл. Это может быть ссылка на другую страницу или ссылка на файл в облаке.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Ссылка на файл', 'attachments_link_url_hint' => 'URL-адрес сайта или файла', 'attach' => 'Прикрепить', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Редактировать файл', 'attachments_edit_file_name' => 'Название файла', 'attachments_edit_drop_upload' => 'Перетащите файлы или нажмите здесь, чтобы загрузить и перезаписать', diff --git a/resources/lang/ru/errors.php b/resources/lang/ru/errors.php index 0cc4a72b1..e8f537ecd 100644 --- a/resources/lang/ru/errors.php +++ b/resources/lang/ru/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Время загрузки файла истекло.', // Attachments - 'attachment_page_mismatch' => 'Несоответствие страницы во время обновления вложения', 'attachment_not_found' => 'Вложение не найдено', // Pages diff --git a/resources/lang/ru/settings.php b/resources/lang/ru/settings.php index 0981aaa73..b6dcf91df 100755 --- a/resources/lang/ru/settings.php +++ b/resources/lang/ru/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Доставка электронной почты работает!', 'maint_send_test_email_mail_text' => 'Поздравляем! Поскольку вы получили это письмо, электронная почта настроена правильно.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Роли', 'role_user_roles' => 'Роли пользователя', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Доступ к системному API', 'role_manage_settings' => 'Управление настройками приложения', 'role_asset' => 'Права доступа к материалам', + 'roles_system_warning' => 'Имейте в виду, что доступ к любому из указанных выше трех разрешений может позволить пользователю изменить свои собственные привилегии или привилегии других пользователей системы. Назначить роли с этими правами только доверенным пользователям.', 'role_asset_desc' => 'Эти разрешения контролируют доступ по умолчанию к параметрам внутри системы. Разрешения на книги, главы и страницы перезапишут эти разрешения.', 'role_asset_admins' => 'Администраторы автоматически получают доступ ко всему контенту, но эти опции могут отображать или скрывать параметры пользовательского интерфейса.', 'role_all' => 'Все', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/sk/activities.php b/resources/lang/sk/activities.php index 444d78e95..f07506c29 100644 --- a/resources/lang/sk/activities.php +++ b/resources/lang/sk/activities.php @@ -36,13 +36,13 @@ return [ 'book_sort_notification' => 'Kniha úspešne znovu zoradená', // Bookshelves - 'bookshelf_create' => 'created Bookshelf', - 'bookshelf_create_notification' => 'Bookshelf Successfully Created', - 'bookshelf_update' => 'updated bookshelf', - 'bookshelf_update_notification' => 'Bookshelf Successfully Updated', - 'bookshelf_delete' => 'deleted bookshelf', - 'bookshelf_delete_notification' => 'Bookshelf Successfully Deleted', + 'bookshelf_create' => 'vytvorená knižnica', + 'bookshelf_create_notification' => 'Knižnica úspešne vytvorená', + 'bookshelf_update' => 'aktualizovaná knižnica', + 'bookshelf_update_notification' => 'Knižnica úspešne aktualizovaná', + 'bookshelf_delete' => 'odstránená knižnica', + 'bookshelf_delete_notification' => 'Knižnica úspešne odstránená', // Other - 'commented_on' => 'commented on', + 'commented_on' => 'komentované na', ]; diff --git a/resources/lang/sk/auth.php b/resources/lang/sk/auth.php index 2b2e83a17..ccde1f040 100644 --- a/resources/lang/sk/auth.php +++ b/resources/lang/sk/auth.php @@ -18,7 +18,7 @@ return [ 'name' => 'Meno', 'username' => 'Používateľské meno', - 'email' => 'Email', + 'email' => 'E-mail', 'password' => 'Heslo', 'password_confirm' => 'Potvrdiť heslo', 'password_hint' => 'Musí mať viac ako 7 znakov', @@ -26,8 +26,8 @@ return [ 'remember_me' => 'Zapamätať si ma', 'ldap_email_hint' => 'Zadajte prosím email, ktorý sa má použiť pre tento účet.', 'create_account' => 'Vytvoriť účet', - 'already_have_account' => 'Already have an account?', - 'dont_have_account' => 'Don\'t have an account?', + 'already_have_account' => 'Už máte svoj ​​účet?', + 'dont_have_account' => 'Nemáte účet?', 'social_login' => 'Sociálne prihlásenie', 'social_registration' => 'Sociálna registrácia', 'social_registration_text' => 'Registrovať sa a prihlásiť sa použitím inej služby.', @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Reset hesla', 'reset_password_send_instructions' => 'Zadajte svoj email nižšie a bude Vám odoslaný email s odkazom pre reset hesla.', 'reset_password_send_button' => 'Poslať odkaz na reset hesla', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => 'Odkaz na obnovenie hesla bude odoslaný na :email, ak sa táto e-mailová adresa nachádza v systéme.', 'reset_password_success' => 'Vaše heslo bolo úspešne resetované.', 'email_reset_subject' => 'Reset Vášho :appName hesla', 'email_reset_text' => 'Tento email Ste dostali pretože sme dostali požiadavku na reset hesla pre Váš účet.', @@ -66,12 +66,12 @@ return [ 'email_not_confirmed_resend_button' => 'Znova odoslať overovací email', // User Invite - 'user_invite_email_subject' => 'You have been invited to join :appName!', - 'user_invite_email_greeting' => 'An account has been created for you on :appName.', - 'user_invite_email_text' => 'Click the button below to set an account password and gain access:', - 'user_invite_email_action' => 'Set Account Password', - 'user_invite_page_welcome' => 'Welcome to :appName!', - 'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.', - 'user_invite_page_confirm_button' => 'Confirm Password', - 'user_invite_success' => 'Password set, you now have access to :appName!' + 'user_invite_email_subject' => 'Dostali ste pozvánku na pripojenie sa k aplikácii :appName!', + 'user_invite_email_greeting' => 'Účet pre :appName bol pre vás vytvorený.', + 'user_invite_email_text' => 'Kliknutím na tlačidlo nižšie nastavíte heslo k účtu a získate prístup:', + 'user_invite_email_action' => 'Heslo k účtu', + 'user_invite_page_welcome' => 'Vitajte na stránke :appName!', + 'user_invite_page_text' => 'Ak chcete dokončiť svoj účet a získať prístup, musíte nastaviť heslo, ktoré sa použije na prihlásenie do aplikácie :appName pri budúcich návštevách.', + 'user_invite_page_confirm_button' => 'Potvrdiť heslo', + 'user_invite_success' => 'Nastavené heslo, teraz máte prístup k :appName!' ]; \ No newline at end of file diff --git a/resources/lang/sk/common.php b/resources/lang/sk/common.php index 5674fd5a7..555c2c6f2 100644 --- a/resources/lang/sk/common.php +++ b/resources/lang/sk/common.php @@ -11,8 +11,8 @@ return [ 'save' => 'Uložiť', 'continue' => 'Pokračovať', 'select' => 'Vybrať', - 'toggle_all' => 'Toggle All', - 'more' => 'More', + 'toggle_all' => 'Prepnúť všetko', + 'more' => 'Viac', // Form Labels 'name' => 'Meno', @@ -24,30 +24,31 @@ return [ // Actions 'actions' => 'Akcie', 'view' => 'Zobraziť', - 'view_all' => 'View All', + 'view_all' => 'Zobraziť všetko', 'create' => 'Vytvoriť', 'update' => 'Aktualizovať', 'edit' => 'Editovať', 'sort' => 'Zoradiť', 'move' => 'Presunúť', - 'copy' => 'Copy', - 'reply' => 'Reply', + 'copy' => 'Kopírovať', + 'reply' => 'Odpovedať', 'delete' => 'Zmazať', - 'search' => 'Hľadť', + 'delete_confirm' => 'Potvrdiť zmazanie', + 'search' => 'Hľadať', 'search_clear' => 'Vyčistiť hľadanie', - 'reset' => 'Reset', + 'reset' => 'Resetovať', 'remove' => 'Odstrániť', - 'add' => 'Add', - 'fullscreen' => 'Fullscreen', + 'add' => 'Pridať', + 'fullscreen' => 'Celá obrazovka', // Sort Options - 'sort_options' => 'Sort Options', - 'sort_direction_toggle' => 'Sort Direction Toggle', - 'sort_ascending' => 'Sort Ascending', - 'sort_descending' => 'Sort Descending', - 'sort_name' => 'Name', - 'sort_created_at' => 'Created Date', - 'sort_updated_at' => 'Updated Date', + 'sort_options' => 'Možnosti triedenia', + 'sort_direction_toggle' => 'Zoradiť smerový prepínač', + 'sort_ascending' => 'Zoradiť vzostupne', + 'sort_descending' => 'Zoradiť zostupne', + 'sort_name' => 'Meno', + 'sort_created_at' => 'Dátum vytvorenia', + 'sort_updated_at' => 'Aktualizované dňa', // Misc 'deleted_user' => 'Odstránený používateľ', @@ -56,22 +57,22 @@ return [ 'back_to_top' => 'Späť nahor', 'toggle_details' => 'Prepnúť detaily', 'toggle_thumbnails' => 'Prepnúť náhľady', - 'details' => 'Details', - 'grid_view' => 'Grid View', - 'list_view' => 'List View', - 'default' => 'Default', + 'details' => 'Podrobnosti', + 'grid_view' => 'Zobrazenie v mriežke', + 'list_view' => 'Zobraziť ako zoznam', + 'default' => 'Predvolené', 'breadcrumb' => 'Breadcrumb', // Header - 'profile_menu' => 'Profile Menu', + 'profile_menu' => 'Menu profilu', 'view_profile' => 'Zobraziť profil', 'edit_profile' => 'Upraviť profil', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Tmavý režim', + 'light_mode' => 'Svetlý režim', // Layout tabs - 'tab_info' => 'Info', - 'tab_content' => 'Content', + 'tab_info' => 'Informácie', + 'tab_content' => 'Obsah', // Email Content 'email_action_help' => 'Ak máte problém klinkúť na tlačidlo ":actionText", skopírujte a vložte URL uvedenú nižšie do Vášho prehliadača:', diff --git a/resources/lang/sk/components.php b/resources/lang/sk/components.php index 726d83614..a6bae619c 100644 --- a/resources/lang/sk/components.php +++ b/resources/lang/sk/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Načítať viac', 'image_image_name' => 'Názov obrázka', 'image_delete_used' => 'Tento obrázok je použitý na stránkach uvedených nižšie.', - 'image_delete_confirm' => 'Kliknite znova na zmazať pre potvrdenie zmazania tohto obrázka.', + 'image_delete_confirm_text' => 'Naozaj chcete vymazať tento obrázok?', 'image_select_image' => 'Vybrať obrázok', 'image_dropzone' => 'Presuňte obrázky sem alebo kliknite sem pre nahranie', 'images_deleted' => 'Obrázky zmazané', @@ -23,11 +23,12 @@ return [ 'image_upload_success' => 'Obrázok úspešne nahraný', 'image_update_success' => 'Detaily obrázka úspešne aktualizované', 'image_delete_success' => 'Obrázok úspešne zmazaný', - 'image_upload_remove' => 'Remove', + 'image_upload_remove' => 'Odstrániť', // Code Editor - 'code_editor' => 'Edit Code', - 'code_language' => 'Code Language', - 'code_content' => 'Code Content', - 'code_save' => 'Save Code', + 'code_editor' => 'Upraviť kód', + 'code_language' => 'Kód jazyka', + 'code_content' => 'Obsah kódu', + 'code_session_history' => 'História relácií', + 'code_save' => 'Ulož kód', ]; diff --git a/resources/lang/sk/entities.php b/resources/lang/sk/entities.php index 2b42ca86c..1e6bf4972 100644 --- a/resources/lang/sk/entities.php +++ b/resources/lang/sk/entities.php @@ -11,13 +11,13 @@ return [ 'recently_updated_pages' => 'Nedávno aktualizované stránky', 'recently_created_chapters' => 'Nedávno vytvorené kapitoly', 'recently_created_books' => 'Nedávno vytvorené knihy', - 'recently_created_shelves' => 'Recently Created Shelves', + 'recently_created_shelves' => 'Nedávno vytvorené knižnice', 'recently_update' => 'Nedávno aktualizované', 'recently_viewed' => 'Nedávno zobrazené', 'recent_activity' => 'Nedávna aktivita', 'create_now' => 'Vytvoriť teraz', 'revisions' => 'Revízie', - 'meta_revision' => 'Revision #:revisionCount', + 'meta_revision' => 'Upravené vydanie #:revisionCount', 'meta_created' => 'Vytvorené :timeLength', 'meta_created_name' => 'Vytvorené :timeLength používateľom :user', 'meta_updated' => 'Aktualizované :timeLength', @@ -29,8 +29,8 @@ return [ 'no_pages_viewed' => 'Nepozreli ste si žiadne stránky', 'no_pages_recently_created' => 'Žiadne stránky neboli nedávno vytvorené', 'no_pages_recently_updated' => 'Žiadne stránky neboli nedávno aktualizované', - 'export' => 'Export', - 'export_html' => 'Contained Web File', + 'export' => 'Exportovať', + 'export_html' => 'Obsahovaný webový súbor', 'export_pdf' => 'PDF súbor', 'export_text' => 'Súbor s čistým textom', @@ -42,56 +42,57 @@ return [ // Search 'search_results' => 'Výsledky hľadania', - 'search_total_results_found' => ':count result found|:count total results found', + 'search_total_results_found' => ':count výsledok found|:počet nájdených výsledkov', 'search_clear' => 'Vyčistiť hľadanie', 'search_no_pages' => 'Žiadne stránky nevyhovujú tomuto hľadaniu', 'search_for_term' => 'Hľadať :term', - 'search_more' => 'More Results', - 'search_filters' => 'Search Filters', - 'search_content_type' => 'Content Type', - 'search_exact_matches' => 'Exact Matches', - 'search_tags' => 'Tag Searches', - 'search_options' => 'Options', - 'search_viewed_by_me' => 'Viewed by me', - 'search_not_viewed_by_me' => 'Not viewed by me', - 'search_permissions_set' => 'Permissions set', - 'search_created_by_me' => 'Created by me', - 'search_updated_by_me' => 'Updated by me', - 'search_date_options' => 'Date Options', - 'search_updated_before' => 'Updated before', - 'search_updated_after' => 'Updated after', - 'search_created_before' => 'Created before', - 'search_created_after' => 'Created after', - 'search_set_date' => 'Set Date', - 'search_update' => 'Update Search', + 'search_more' => 'Načítať ďalšie výsledky', + 'search_advanced' => 'Rozšírené vyhľadávanie', + 'search_terms' => 'Hľadané výrazy', + 'search_content_type' => 'Typ obsahu', + 'search_exact_matches' => 'Presná zhoda', + 'search_tags' => 'Vyhľadávanie značiek', + 'search_options' => 'Možnosti', + 'search_viewed_by_me' => 'Videné mnou', + 'search_not_viewed_by_me' => 'Nevidené mnou', + 'search_permissions_set' => 'Oprávnenia', + 'search_created_by_me' => 'Vytvorené mnou', + 'search_updated_by_me' => 'Aktualizované mnou', + 'search_date_options' => 'Možnosti dátumu', + 'search_updated_before' => 'Aktualizované pred', + 'search_updated_after' => 'Aktualizované po', + 'search_created_before' => 'Vytvorené pred', + 'search_created_after' => 'Vytvorené po', + 'search_set_date' => 'Nastaviť Dátum', + 'search_update' => 'Aktualizujte vyhľadávanie', // Shelves - 'shelf' => 'Shelf', - 'shelves' => 'Shelves', - 'x_shelves' => ':count Shelf|:count Shelves', - 'shelves_long' => 'Bookshelves', - 'shelves_empty' => 'No shelves have been created', - 'shelves_create' => 'Create New Shelf', - 'shelves_popular' => 'Popular Shelves', - 'shelves_new' => 'New Shelves', - 'shelves_new_action' => 'New Shelf', - 'shelves_popular_empty' => 'The most popular shelves will appear here.', - 'shelves_new_empty' => 'The most recently created shelves will appear here.', - 'shelves_save' => 'Save Shelf', - 'shelves_books' => 'Books on this shelf', - 'shelves_add_books' => 'Add books to this shelf', - 'shelves_drag_books' => 'Drag books here to add them to this shelf', - 'shelves_empty_contents' => 'This shelf has no books assigned to it', - 'shelves_edit_and_assign' => 'Edit shelf to assign books', - 'shelves_edit_named' => 'Edit Bookshelf :name', - 'shelves_edit' => 'Edit Bookshelf', - 'shelves_delete' => 'Delete Bookshelf', - 'shelves_delete_named' => 'Delete Bookshelf :name', - 'shelves_delete_explain' => "This will delete the bookshelf with the name ':name'. Contained books will not be deleted.", - 'shelves_delete_confirmation' => 'Are you sure you want to delete this bookshelf?', - 'shelves_permissions' => 'Bookshelf Permissions', - 'shelves_permissions_updated' => 'Bookshelf Permissions Updated', - 'shelves_permissions_active' => 'Bookshelf Permissions Active', + 'shelf' => 'Polica', + 'shelves' => 'Police', + 'x_shelves' => ':count Shelf|:count Police', + 'shelves_long' => 'Poličky na knihy', + 'shelves_empty' => 'Neboli vytvorené žiadne police', + 'shelves_create' => 'Vytvoriť novú policu', + 'shelves_popular' => 'Populárne police', + 'shelves_new' => 'Nové police', + 'shelves_new_action' => 'Nová polica', + 'shelves_popular_empty' => 'Najpopulárnejšie police sa objavia tu.', + 'shelves_new_empty' => 'Najpopulárnejšie police sa objavia tu.', + 'shelves_save' => 'Uložiť policu', + 'shelves_books' => 'Knihy na tejto polici', + 'shelves_add_books' => 'Pridať knihy do tejto police', + 'shelves_drag_books' => 'Potiahnite knihy sem a pridajte ich do tejto police', + 'shelves_empty_contents' => 'Táto polica nemá priradené žiadne knihy', + 'shelves_edit_and_assign' => 'Uprav policu a priraď knihy', + 'shelves_edit_named' => 'Upraviť poličku::name', + 'shelves_edit' => 'Upraviť policu', + 'shelves_delete' => 'Odstrániť knižnicu', + 'shelves_delete_named' => 'Odstrániť knižnicu :name', + 'shelves_delete_explain' => "Týmto vymažete policu s názvom ': name'. Obsahované knihy sa neodstránia.", + 'shelves_delete_confirmation' => 'Ste si istý, že chcete zmazať túto knižnicu?', + 'shelves_permissions' => 'Oprávnenia knižnice', + 'shelves_permissions_updated' => 'Oprávnenia knižnice aktualizované', + 'shelves_permissions_active' => 'Oprávnenia knižnice aktívne', 'shelves_copy_permissions_to_books' => 'Copy Permissions to Books', 'shelves_copy_permissions' => 'Copy Permissions', 'shelves_copy_permissions_explain' => 'This will apply the current permission settings of this bookshelf to all books contained within. Before activating, ensure any changes to the permissions of this bookshelf have been saved.', @@ -256,7 +257,7 @@ return [ 'attachments_upload' => 'Nahrať súbor', 'attachments_link' => 'Priložiť odkaz', 'attachments_set_link' => 'Nastaviť odkaz', - 'attachments_delete_confirm' => 'Kliknite znova na zmazať pre potvrdenie zmazania prílohy.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Presuňte súbory alebo klinknite sem pre priloženie súboru', 'attachments_no_files' => 'Žiadne súbory neboli nahrané', 'attachments_explain_link' => 'Ak nechcete priložiť súbor, môžete priložiť odkaz. Môže to byť odkaz na inú stránku alebo odkaz na súbor v cloude.', @@ -265,6 +266,7 @@ return [ 'attachments_link_url' => 'Odkaz na súbor', 'attachments_link_url_hint' => 'Url stránky alebo súboru', 'attach' => 'Priložiť', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Upraviť súbor', 'attachments_edit_file_name' => 'Názov súboru', 'attachments_edit_drop_upload' => 'Presuňte súbory sem alebo klinknite pre nahranie a prepis', @@ -304,12 +306,12 @@ return [ 'comment_deleted_success' => 'Comment deleted', 'comment_created_success' => 'Comment added', 'comment_updated_success' => 'Comment updated', - 'comment_delete_confirm' => 'Are you sure you want to delete this comment?', - 'comment_in_reply_to' => 'In reply to :commentId', + 'comment_delete_confirm' => 'Ste si istý, že chcete odstrániť tento komentár?', + 'comment_in_reply_to' => 'Odpovedať na :commentId', // Revision 'revision_delete_confirm' => 'Naozaj chcete túto revíziu odstrániť?', - 'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.', + 'revision_restore_confirm' => 'Naozaj chcete obnoviť túto revíziu? Aktuálny obsah stránky sa nahradí.', 'revision_delete_success' => 'Revízia bola vymazaná', 'revision_cannot_delete_latest' => 'Nie je možné vymazať poslednú revíziu.' ]; \ No newline at end of file diff --git a/resources/lang/sk/errors.php b/resources/lang/sk/errors.php index 3b52a667c..c045d473d 100644 --- a/resources/lang/sk/errors.php +++ b/resources/lang/sk/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Nahrávanie súboru vypršalo.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'Attachment not found', // Pages diff --git a/resources/lang/sk/passwords.php b/resources/lang/sk/passwords.php index 30ed1b782..5b80f62da 100644 --- a/resources/lang/sk/passwords.php +++ b/resources/lang/sk/passwords.php @@ -6,9 +6,9 @@ */ return [ - 'password' => 'Heslo musí obsahovať aspoň šesť znakov a musí byť rovnaké ako potvrdzujúce.', + 'password' => 'Heslo musí obsahovať aspoň osem znakov a musí byť rovnaké ako potvrdzujúce.', 'user' => "Nenašli sme používateľa s takou emailovou adresou.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'Token na obnovenie hesla je pre túto e-mailovú adresu neplatný.', 'sent' => 'Poslali sme Vám email s odkazom na reset hesla!', 'reset' => 'Vaše heslo bolo resetované!', diff --git a/resources/lang/sk/settings.php b/resources/lang/sk/settings.php index 75a847b0a..8b1615798 100644 --- a/resources/lang/sk/settings.php +++ b/resources/lang/sk/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roly', 'role_user_roles' => 'Používateľské roly', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Spravovať nastavenia aplikácie', 'role_asset' => 'Oprávnenia majetku', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Tieto oprávnenia regulujú prednastavený prístup k zdroju v systéme. Oprávnenia pre knihy, kapitoly a stránky majú vyššiu prioritu.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'Všetko', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Expiry Date', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Delete Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/sl/common.php b/resources/lang/sl/common.php index 9c1480d05..527ecace5 100644 --- a/resources/lang/sl/common.php +++ b/resources/lang/sl/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopiraj', 'reply' => 'Odgovori', 'delete' => 'Izbriši', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Išči', 'search_clear' => 'Počisti iskanje', 'reset' => 'Ponastavi', diff --git a/resources/lang/sl/components.php b/resources/lang/sl/components.php index 42e87be31..658859e7e 100644 --- a/resources/lang/sl/components.php +++ b/resources/lang/sl/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Naloži več', 'image_image_name' => 'Ime slike', 'image_delete_used' => 'Ta slika je uporabljena na spodnjih straneh.', - 'image_delete_confirm' => 'Ponovno kliknite izbriši, da potrdite izbris te slike.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Izberite sliko', 'image_dropzone' => 'Povlecite slike ali kliknite tukaj za nalaganje', 'images_deleted' => 'Slike so bile izbrisane', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Uredi kodo', 'code_language' => 'Koda jezika', 'code_content' => 'Koda vsebine', + 'code_session_history' => 'Session History', 'code_save' => 'Shrani kodo', ]; diff --git a/resources/lang/sl/entities.php b/resources/lang/sl/entities.php index ff1382159..40d891f87 100644 --- a/resources/lang/sl/entities.php +++ b/resources/lang/sl/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Nobena stran se ne ujema z vašim iskanjem', 'search_for_term' => 'Išči :term', 'search_more' => 'Prikaži več rezultatov', - 'search_filters' => 'Iskalni filtri', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Vrsta vsebine', 'search_exact_matches' => 'Natančno ujemanje', 'search_tags' => 'Iskanje oznak', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Naloži datoteko', 'attachments_link' => 'Pripni povezavo', 'attachments_set_link' => 'Nastavi povezavo', - 'attachments_delete_confirm' => 'Ponovno kliknite izbriši, da potrdite izbris te priloge.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Spustite datoteke ali kliknite tukaj, če želite priložiti datoteko', 'attachments_no_files' => 'Nobena datoteka ni bila naložena', 'attachments_explain_link' => 'Lahko pripnete povezavo, če ne želite naložiti datoteke. Lahko je povezava na drugo stran ali povezava do dateteke v oblaku.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Povezava do datoteke', 'attachments_link_url_hint' => 'Url mesta ali datoteke', 'attach' => 'Pripni', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Uredi datoteko', 'attachments_edit_file_name' => 'Ime datoteke', 'attachments_edit_drop_upload' => 'Spustite datoteke ali kliknite tukaj, če želite naložiti in prepisati', diff --git a/resources/lang/sl/errors.php b/resources/lang/sl/errors.php index bf1564eef..e8ea99ab7 100644 --- a/resources/lang/sl/errors.php +++ b/resources/lang/sl/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Čas nalaganjanja datoteke je potekel.', // Attachments - 'attachment_page_mismatch' => 'Neskladje strani med posodobitvijo priloge', 'attachment_not_found' => 'Priloga ni najdena', // Pages diff --git a/resources/lang/sl/settings.php b/resources/lang/sl/settings.php index 24cd9229a..5d0c0ba74 100644 --- a/resources/lang/sl/settings.php +++ b/resources/lang/sl/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Zdi se, da dostava e-pošte deluje!', 'maint_send_test_email_mail_text' => 'Čestitke! Če ste prejeli e.poštno obvestilo so bile vaše e-poštne nastavitve pravilno konfigurirane.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Vloge', 'role_user_roles' => 'Pravilo uporabnika', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Nastavitve za upravljanje', 'role_asset' => 'Sistemska dovoljenja', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'Vse', @@ -168,7 +183,7 @@ V tej vlogi trenutno ni dodeljen noben uporabnik', 'user_api_token_expiry' => 'Datum poteka', 'user_api_token_expiry_desc' => 'Določi datum izteka uporabnosti žetona. Po tem datumu, zahteve poslane s tem žetonom, ne bodo več delovale. Če pustite to polje prazno, bo iztek uporabnosti 100.let .', - 'user_api_token_create_secret_message' => 'Takoj po ustvarjanju tega žetona se ustvari in prikaže "Token ID" "in" Token Secret ". Skrivnost bo prikazana samo enkrat, zato se pred nadaljevanjem prepričajte o varnosti kopirnega mesta.', + 'user_api_token_create_secret_message' => 'Takoj po ustvarjanju tega žetona se ustvari in prikaže "Token ID" "in" Token Secret ". Skrivnost bo prikazana samo enkrat, zato se pred nadaljevanjem prepričajte o varnosti kopirnega mesta.', 'user_api_token_create_success' => 'API žeton uspešno ustvarjen', 'user_api_token_update_success' => 'API žeton uspešno posodobljen', 'user_api_token' => 'API žeton', @@ -189,6 +204,7 @@ V tej vlogi trenutno ni dodeljen noben uporabnik', 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'danščina', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/sv/common.php b/resources/lang/sv/common.php index 9b91e2b5a..f6acd332f 100644 --- a/resources/lang/sv/common.php +++ b/resources/lang/sv/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopiera', 'reply' => 'Svara', 'delete' => 'Ta bort', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Sök', 'search_clear' => 'Rensa sökning', 'reset' => 'Återställ', diff --git a/resources/lang/sv/components.php b/resources/lang/sv/components.php index 5e4085dec..aef0400d2 100644 --- a/resources/lang/sv/components.php +++ b/resources/lang/sv/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Ladda fler', 'image_image_name' => 'Bildnamn', 'image_delete_used' => 'Den här bilden används på nedanstående sidor.', - 'image_delete_confirm' => 'Klicka på "ta bort" en gång till för att bekräfta att du vill ta bort bilden.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Välj bild', 'image_dropzone' => 'Släpp bilder här eller klicka för att ladda upp', 'images_deleted' => 'Bilder borttagna', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Redigera kod', 'code_language' => 'Språk', 'code_content' => 'Kod', + 'code_session_history' => 'Session History', 'code_save' => 'Spara', ]; diff --git a/resources/lang/sv/entities.php b/resources/lang/sv/entities.php index e4938fbfd..b71a27ccf 100644 --- a/resources/lang/sv/entities.php +++ b/resources/lang/sv/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Inga sidor matchade sökningen', 'search_for_term' => 'Sök efter :term', 'search_more' => 'Fler resultat', - 'search_filters' => 'Sökfilter', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Innehållstyp', 'search_exact_matches' => 'Exakta matchningar', 'search_tags' => 'Taggar', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Ladda upp fil', 'attachments_link' => 'Bifoga länk', 'attachments_set_link' => 'Ange länk', - 'attachments_delete_confirm' => 'Klicka på "ta bort" igen för att bekräfta att du vill ta bort bilagan.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Släpp filer här eller klicka för att ladda upp', 'attachments_no_files' => 'Inga filer har laddats upp', 'attachments_explain_link' => 'Du kan bifoga en länk om du inte vill ladda upp en fil. Detta kan vara en länk till en annan sida eller till en fil i molnet.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Länk till fil', 'attachments_link_url_hint' => 'URL till sida eller fil', 'attach' => 'Bifoga', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Redigera fil', 'attachments_edit_file_name' => 'Filnamn', 'attachments_edit_drop_upload' => 'Släpp filer här eller klicka för att ladda upp och skriva över', diff --git a/resources/lang/sv/errors.php b/resources/lang/sv/errors.php index adf22af1d..dbc3f37f2 100644 --- a/resources/lang/sv/errors.php +++ b/resources/lang/sv/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Filuppladdningen har tagits ut.', // Attachments - 'attachment_page_mismatch' => 'Fel i sidmatchning vid uppdatering av bilaga', 'attachment_not_found' => 'Bilagan hittades ej', // Pages diff --git a/resources/lang/sv/settings.php b/resources/lang/sv/settings.php index 488f52cc3..1b2f33bde 100644 --- a/resources/lang/sv/settings.php +++ b/resources/lang/sv/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'E-postleverans verkar fungera!', 'maint_send_test_email_mail_text' => 'Grattis! Eftersom du fick detta e-postmeddelande verkar dina e-postinställningar vara korrekt konfigurerade.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roller', 'role_user_roles' => 'Användarroller', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Åtkomst till systemets API', 'role_manage_settings' => 'Hantera appinställningar', 'role_asset' => 'Tillgång till innehåll', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Det här är standardinställningarna för allt innehåll i systemet. Eventuella anpassade rättigheter på böcker, kapitel och sidor skriver över dessa inställningar.', 'role_asset_admins' => 'Administratörer har automatisk tillgång till allt innehåll men dessa alternativ kan visa och dölja vissa gränssnittselement', 'role_all' => 'Alla', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Danska', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/th/common.php b/resources/lang/th/common.php index 68c58b92b..e87bd11a5 100644 --- a/resources/lang/th/common.php +++ b/resources/lang/th/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Copy', 'reply' => 'Reply', 'delete' => 'Delete', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Search', 'search_clear' => 'Clear Search', 'reset' => 'Reset', diff --git a/resources/lang/th/components.php b/resources/lang/th/components.php index d8e8981fb..48a0a32fa 100644 --- a/resources/lang/th/components.php +++ b/resources/lang/th/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Load More', 'image_image_name' => 'Image Name', 'image_delete_used' => 'This image is used in the pages below.', - 'image_delete_confirm' => 'Click delete again to confirm you want to delete this image.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Select Image', 'image_dropzone' => 'Drop images or click here to upload', 'images_deleted' => 'Images Deleted', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Edit Code', 'code_language' => 'Code Language', 'code_content' => 'Code Content', + 'code_session_history' => 'Session History', 'code_save' => 'Save Code', ]; diff --git a/resources/lang/th/entities.php b/resources/lang/th/entities.php index 6bbc723b0..f64867a56 100644 --- a/resources/lang/th/entities.php +++ b/resources/lang/th/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'No pages matched this search', 'search_for_term' => 'Search for :term', 'search_more' => 'More Results', - 'search_filters' => 'Search Filters', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Content Type', 'search_exact_matches' => 'Exact Matches', 'search_tags' => 'Tag Searches', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Upload File', 'attachments_link' => 'Attach Link', 'attachments_set_link' => 'Set Link', - 'attachments_delete_confirm' => 'Click delete again to confirm you want to delete this attachment.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Drop files or click here to attach a file', 'attachments_no_files' => 'No files have been uploaded', 'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Link to file', 'attachments_link_url_hint' => 'Url of site or file', 'attach' => 'Attach', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Edit File', 'attachments_edit_file_name' => 'File Name', 'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite', diff --git a/resources/lang/th/errors.php b/resources/lang/th/errors.php index 06a5285f5..79024e482 100644 --- a/resources/lang/th/errors.php +++ b/resources/lang/th/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'The file upload has timed out.', // Attachments - 'attachment_page_mismatch' => 'Page mismatch during attachment update', 'attachment_not_found' => 'Attachment not found', // Pages diff --git a/resources/lang/th/settings.php b/resources/lang/th/settings.php index f1345c743..2bd314cf0 100644 --- a/resources/lang/th/settings.php +++ b/resources/lang/th/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!', 'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roles', 'role_user_roles' => 'User Roles', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Manage app settings', 'role_asset' => 'Asset Permissions', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.', 'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.', 'role_all' => 'All', diff --git a/resources/lang/tr/common.php b/resources/lang/tr/common.php index 587640672..a252ac770 100644 --- a/resources/lang/tr/common.php +++ b/resources/lang/tr/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Kopyala', 'reply' => 'Yanıtla', 'delete' => 'Sil', + 'delete_confirm' => 'Silmeyi Onayla', 'search' => 'Ara', 'search_clear' => 'Aramayı Temizle', 'reset' => 'Sıfırla', diff --git a/resources/lang/tr/components.php b/resources/lang/tr/components.php index 4f1573541..009c48f23 100644 --- a/resources/lang/tr/components.php +++ b/resources/lang/tr/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Devamını Göster', 'image_image_name' => 'Görsel Adı', 'image_delete_used' => 'Bu görsel aşağıda bulunan sayfalarda kullanılmış.', - 'image_delete_confirm' => 'Bu görseli silmek istediğinize emin misiniz?', + 'image_delete_confirm_text' => 'Bu resmi silmek istediğinizden emin misiniz?', 'image_select_image' => 'Görsel Seç', 'image_dropzone' => 'Görselleri sürükleyin ya da seçin', 'images_deleted' => 'Görseller Silindi', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Kodu Düzenle', 'code_language' => 'Kod Dili', 'code_content' => 'Kod İçeriği', + 'code_session_history' => 'Oturum Geçmişi', 'code_save' => 'Kodu Kaydet', ]; diff --git a/resources/lang/tr/entities.php b/resources/lang/tr/entities.php index df0dadb89..cf2612640 100644 --- a/resources/lang/tr/entities.php +++ b/resources/lang/tr/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Bu aramayla ilgili herhangi bir sayfa bulunamadı', 'search_for_term' => ':term için Ara', 'search_more' => 'Daha Fazla Sonuç', - 'search_filters' => 'Arama Filtreleri', + 'search_advanced' => 'Gelişmiş Arama', + 'search_terms' => 'Terimleri Ara', 'search_content_type' => 'İçerik Türü', 'search_exact_matches' => 'Tam Eşleşmeler', 'search_tags' => 'Etiket Aramaları', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Dosya Yükle', 'attachments_link' => 'Link Ekle', 'attachments_set_link' => 'Bağlantıyı Ata', - 'attachments_delete_confirm' => 'Eki silmek istediğinize emin misiniz?', + 'attachments_delete' => 'Bu eki silmek istediğinize emin misiniz?', 'attachments_dropzone' => 'Dosyaları sürükleyin veya seçin', 'attachments_no_files' => 'Hiçbir dosya yüklenmedi', 'attachments_explain_link' => 'Eğer dosya yüklememeyi tercih ederseniz bağlantı ekleyebilirsiniz. Bu bağlantı başka bir sayfanın veya bulut depolamadaki bir dosyanın bağlantısı olabilir.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Dosya bağlantısı', 'attachments_link_url_hint' => 'Dosyanın veya sitenin url adresi', 'attach' => 'Ekle', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Dosyayı Düzenle', 'attachments_edit_file_name' => 'Dosya Adı', 'attachments_edit_drop_upload' => 'Üzerine yazılacak dosyaları sürükleyin veya seçin', diff --git a/resources/lang/tr/errors.php b/resources/lang/tr/errors.php index af2a47623..d3a24622c 100644 --- a/resources/lang/tr/errors.php +++ b/resources/lang/tr/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Dosya yüklemesi zaman aşımına uğradı', // Attachments - 'attachment_page_mismatch' => 'Ek güncellemesi sırasında sayfa uyuşmazlığı yaşandı', 'attachment_not_found' => 'Ek bulunamadı', // Pages diff --git a/resources/lang/tr/settings.php b/resources/lang/tr/settings.php index 545c91fe0..14da79438 100755 --- a/resources/lang/tr/settings.php +++ b/resources/lang/tr/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'E-posta iletimi çalışıyor gibi görünüyor!', 'maint_send_test_email_mail_text' => 'Tebrikler! Eğer bu e-posta bildirimini alıyorsanız, e-posta ayarlarınız doğru bir şekilde ayarlanmış demektir.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Roller', 'role_user_roles' => 'Kullanıcı Rolleri', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Sistem programlama arayüzüne (API) eriş', 'role_manage_settings' => 'Uygulama ayarlarını yönet', 'role_asset' => 'Varlık Yetkileri', + 'roles_system_warning' => 'Yukarıdaki üç izinden herhangi birine erişimin, kullanıcının kendi ayrıcalıklarını veya sistemdeki diğerlerinin ayrıcalıklarını değiştirmesine izin verebileceğini unutmayın. Yalnızca bu izinlere sahip rolleri güvenilir kullanıcılara atayın.', 'role_asset_desc' => 'Bu izinler, sistem içindeki varlıklara varsayılan erişim izinlerini ayarlar. Kitaplar, bölümler ve sayfalar üzerindeki izinler, buradaki izinleri geçersiz kılar.', 'role_asset_admins' => 'Yöneticilere otomatik olarak bütün içeriğe erişim yetkisi verilir ancak bu seçenekler, kullanıcı arayüzündeki bazı seçeneklerin gösterilmesine veya gizlenmesine neden olabilir.', 'role_all' => 'Hepsi', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Danca', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/uk/auth.php b/resources/lang/uk/auth.php index 3b6e354c4..e11848a20 100644 --- a/resources/lang/uk/auth.php +++ b/resources/lang/uk/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => 'Скинути пароль', 'reset_password_send_instructions' => 'Введіть адресу електронної пошти нижче, і вам буде надіслано електронне повідомлення з посиланням на зміну пароля.', 'reset_password_send_button' => 'Надіслати посилання для скидання пароля', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => 'Посилання для скидання пароля буде надіслано на :email, якщо ця електронна адреса вказана в системі.', 'reset_password_success' => 'Ваш пароль успішно скинуто.', 'email_reset_subject' => 'Скинути ваш пароль :appName', 'email_reset_text' => 'Ви отримали цей електронний лист, оскільки до нас надійшов запит на скидання пароля для вашого облікового запису.', diff --git a/resources/lang/uk/common.php b/resources/lang/uk/common.php index 225429ffa..1af8502cd 100644 --- a/resources/lang/uk/common.php +++ b/resources/lang/uk/common.php @@ -33,12 +33,13 @@ return [ 'copy' => 'Копіювати', 'reply' => 'Відповісти', 'delete' => 'Видалити', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Шукати', 'search_clear' => 'Очистити пошук', 'reset' => 'Скинути', 'remove' => 'Видалити', 'add' => 'Додати', - 'fullscreen' => 'Fullscreen', + 'fullscreen' => 'На весь екран', // Sort Options 'sort_options' => 'Параметри сортування', @@ -66,8 +67,8 @@ return [ 'profile_menu' => 'Меню профілю', 'view_profile' => 'Переглянути профіль', 'edit_profile' => 'Редагувати профіль', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => 'Темний режим', + 'light_mode' => 'Світлий режим', // Layout tabs 'tab_info' => 'Інфо', diff --git a/resources/lang/uk/components.php b/resources/lang/uk/components.php index 0cd7e8804..bf4622c2b 100644 --- a/resources/lang/uk/components.php +++ b/resources/lang/uk/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Завантажити ще', 'image_image_name' => 'Назва зображення', 'image_delete_used' => 'Це зображення використовується на наступних сторінках.', - 'image_delete_confirm' => 'Натисніть кнопку Видалити ще раз, щоб підтвердити, що хочете видалити це зображення.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Вибрати зображення', 'image_dropzone' => 'Перетягніть зображення, або натисніть тут для завантаження', 'images_deleted' => 'Зображень видалено', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Редагувати код', 'code_language' => 'Мова коду', 'code_content' => 'Вміст коду', + 'code_session_history' => 'Session History', 'code_save' => 'Зберегти Код', ]; diff --git a/resources/lang/uk/entities.php b/resources/lang/uk/entities.php index 7f9417189..45da0e21c 100644 --- a/resources/lang/uk/entities.php +++ b/resources/lang/uk/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Немає сторінок, які відповідають цьому пошуку', 'search_for_term' => 'Шукати :term', 'search_more' => 'Більше результатів', - 'search_filters' => 'Фільтри пошуку', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Тип вмісту', 'search_exact_matches' => 'Точна відповідність', 'search_tags' => 'Пошукові теги', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Завантажити файл', 'attachments_link' => 'Приєднати посилання', 'attachments_set_link' => 'Встановити посилання', - 'attachments_delete_confirm' => 'Натисніть кнопку Видалити ще раз, щоб підтвердити, що ви хочете видалити це вкладення.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Перетягніть файли, або натисніть тут щоб прикріпити файл', 'attachments_no_files' => 'Файли не завантажені', 'attachments_explain_link' => 'Ви можете приєднати посилання, якщо не бажаєте завантажувати файл. Це може бути посилання на іншу сторінку або посилання на файл у хмарі.', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Посилання на файл', 'attachments_link_url_hint' => 'URL-адреса сайту або файлу', 'attach' => 'Приєднати', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Редагувати файл', 'attachments_edit_file_name' => 'Назва файлу', 'attachments_edit_drop_upload' => 'Перетягніть файли, або натисніть тут щоб завантажити та перезаписати', diff --git a/resources/lang/uk/errors.php b/resources/lang/uk/errors.php index f3aa299ed..bf9a46ecb 100644 --- a/resources/lang/uk/errors.php +++ b/resources/lang/uk/errors.php @@ -13,7 +13,7 @@ return [ 'email_already_confirmed' => 'Електронна пошта вже підтверджена, спробуйте увійти.', 'email_confirmation_invalid' => 'Цей токен підтвердження недійсний або вже був використаний, будь ласка, спробуйте знову зареєструватися.', 'email_confirmation_expired' => 'Термін дії токена підтвердження минув, новий електронний лист підтвердження був відправлений.', - 'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed', + 'email_confirmation_awaiting' => 'Потрібно підтвердити адресу електронної пошти для облікового запису, який використовується', 'ldap_fail_anonymous' => 'LDAP-доступ невдалий, з використання анонімного зв\'язку', 'ldap_fail_authed' => 'LDAP-доступ невдалий, використовуючи задані параметри dn та password', 'ldap_extension_not_installed' => 'Розширення PHP LDAP не встановлено', @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Тайм-аут при завантаженні файлу', // Attachments - 'attachment_page_mismatch' => 'Невідповідність сторінки при оновленні вкладень', 'attachment_not_found' => 'Вкладення не знайдено', // Pages @@ -83,21 +82,21 @@ return [ // Error pages '404_page_not_found' => 'Сторінку не знайдено', 'sorry_page_not_found' => 'Вибачте, сторінку, яку ви шукали, не знайдено.', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => 'Якщо ви очікували що ця сторінки існує – можливо у вас немає дозволу на її перегляд.', 'return_home' => 'Повернутися на головну', 'error_occurred' => 'Виникла помилка', 'app_down' => ':appName зараз недоступний', 'back_soon' => 'Він повернеться найближчим часом.', // API errors - 'api_no_authorization_found' => 'No authorization token found on the request', - 'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect', - 'api_user_token_not_found' => 'No matching API token was found for the provided authorization token', + 'api_no_authorization_found' => 'У запиті не знайдено токен авторизації', + 'api_bad_authorization_format' => 'У запиті знайдено токен авторизації, але формат недійсний', + 'api_user_token_not_found' => 'Не знайдено відповідного API-токена для наданого токена авторизації', 'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect', 'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls', - 'api_user_token_expired' => 'The authorization token used has expired', + 'api_user_token_expired' => 'Термін дії токена авторизації закінчився', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => 'Помилка під час надсилання тестового електронного листа:', ]; diff --git a/resources/lang/uk/passwords.php b/resources/lang/uk/passwords.php index 250bec3fb..90c31777c 100644 --- a/resources/lang/uk/passwords.php +++ b/resources/lang/uk/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => 'Пароль повинен містити не менше восьми символів і збігатись з підтвердженням.', 'user' => "Ми не можемо знайти користувача з цією адресою електронної пошти.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'Токен скидання пароля недійсний для цієї адреси електронної пошти.', 'sent' => 'Ми надіслали Вам електронний лист із посиланням для скидання пароля!', 'reset' => 'Ваш пароль скинуто!', diff --git a/resources/lang/uk/settings.php b/resources/lang/uk/settings.php index d7dd8397b..1caf94701 100644 --- a/resources/lang/uk/settings.php +++ b/resources/lang/uk/settings.php @@ -43,10 +43,10 @@ return [ // Color settings '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.', + 'content_colors_desc' => 'Встановлює кольори для всіх елементів в ієрархії організації сторінок. Рекомендуємо вибирати кольори із яскравістю, схожою на кольори за замовчуванням, для кращої читабельності.', 'bookshelf_color' => 'Колір полиці', 'book_color' => 'Колір книги', - 'chapter_color' => 'Chapter Color', + 'chapter_color' => 'Колір глави', 'page_color' => 'Колір сторінки', 'page_draft_color' => 'Колір чернетки', @@ -56,7 +56,7 @@ return [ 'reg_enable_toggle' => 'Дозволити реєстрацію', 'reg_enable_desc' => 'При включенні реєстрації відвідувач зможе зареєструватися як користувач програми. Після реєстрації їм надається єдина роль користувача за замовчуванням.', 'reg_default_role' => 'Роль користувача за умовчанням після реєстрації', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', + 'reg_enable_external_warning' => 'Цей параметр ігнорується, якщо активна зовнішня автентифікація LDAP або SAML. Облікові записи користувачів для неіснуючих учасників будуть створені автоматично, якщо аутентифікація у зовнішній системі буде успішною.', 'reg_email_confirmation' => 'Підтвердження електронною поштою', 'reg_email_confirmation_toggle' => 'Необхідне підтвердження електронною поштою', 'reg_confirm_email_desc' => 'Якщо використовується обмеження домену, то підтвердження електронною поштою буде потрібно, а нижче значення буде проігноровано.', @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Доставляння електронної пошти працює!', 'maint_send_test_email_mail_text' => 'Вітаємо! Оскільки ви отримали цього листа, поштова скринька налаштована правильно.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Ролі', 'role_user_roles' => 'Ролі користувача', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Access system API', 'role_manage_settings' => 'Керування налаштуваннями програми', 'role_asset' => 'Дозволи', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Ці дозволи контролюють стандартні доступи всередині системи. Права на книги, розділи та сторінки перевизначать ці дозволи.', 'role_asset_admins' => 'Адміністратори автоматично отримують доступ до всього вмісту, але ці параметри можуть відображати або приховувати параметри інтерфейсу користувача.', 'role_all' => 'Все', @@ -164,7 +179,7 @@ return [ 'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.', 'user_api_token_expiry' => 'Expiry Date', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', - 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', + 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', 'user_api_token_create_success' => 'API token successfully created', 'user_api_token_update_success' => 'API token successfully updated', 'user_api_token' => 'API Token', @@ -172,8 +187,8 @@ return [ 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', 'user_api_token_secret' => 'Token Secret', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', - 'user_api_token_created' => 'Token Created :timeAgo', - 'user_api_token_updated' => 'Token Updated :timeAgo', + 'user_api_token_created' => 'Token created :timeAgo', + 'user_api_token_updated' => 'Token updated :timeAgo', 'user_api_token_delete' => 'Delete Token', 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', 'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Dansk', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/vi/common.php b/resources/lang/vi/common.php index 2b56b4639..5106e2769 100644 --- a/resources/lang/vi/common.php +++ b/resources/lang/vi/common.php @@ -33,6 +33,7 @@ return [ 'copy' => 'Sao chép', 'reply' => 'Trả lời', 'delete' => 'Xóa', + 'delete_confirm' => 'Confirm Deletion', 'search' => 'Tìm kiếm', 'search_clear' => 'Xoá tìm kiếm', 'reset' => 'Thiết lập lại', diff --git a/resources/lang/vi/components.php b/resources/lang/vi/components.php index c1a9b343d..cdcce776d 100644 --- a/resources/lang/vi/components.php +++ b/resources/lang/vi/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Hiện thêm', 'image_image_name' => 'Tên Ảnh', 'image_delete_used' => 'Ảnh này được sử dụng trong các trang dưới đây.', - 'image_delete_confirm' => 'Bấm nút xóa lần nữa để xác nhận bạn muốn xóa ảnh này.', + 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', 'image_select_image' => 'Chọn Ảnh', 'image_dropzone' => 'Thả các ảnh hoặc bấm vào đây để tải lên', 'images_deleted' => 'Các ảnh đã được xóa', @@ -29,5 +29,6 @@ return [ 'code_editor' => 'Sửa Mã', 'code_language' => 'Ngôn ngữ Mã', 'code_content' => 'Nội dung Mã', + 'code_session_history' => 'Session History', 'code_save' => 'Lưu Mã', ]; diff --git a/resources/lang/vi/entities.php b/resources/lang/vi/entities.php index 31fbaaf7f..be16dd72b 100644 --- a/resources/lang/vi/entities.php +++ b/resources/lang/vi/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => 'Không trang nào khớp với tìm kiếm này', 'search_for_term' => 'Tìm kiếm cho :term', 'search_more' => 'Thêm kết quả', - 'search_filters' => 'Bộ lọc Tìm kiếm', + 'search_advanced' => 'Advanced Search', + 'search_terms' => 'Search Terms', 'search_content_type' => 'Kiểu Nội dung', 'search_exact_matches' => 'Hoàn toàn trùng khớp', 'search_tags' => 'Tìm kiếm Tag', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => 'Tải lên Tập tin', 'attachments_link' => 'Đính kèm Liên kết', 'attachments_set_link' => 'Đặt Liên kết', - 'attachments_delete_confirm' => 'Bấm xóa lần nữa để xác nhận bạn muốn xóa đính kèm này.', + 'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_dropzone' => 'Thả các tập tin hoặc bấm vào đây để đính kèm một tập tin', 'attachments_no_files' => 'Không có tập tin nào được tải lên', 'attachments_explain_link' => 'Bạn có thể đính kèm một liên kết nếu bạn lựa chọn không tải lên tập tin. Liên kết này có thể trỏ đến một trang khác hoặc một tập tin ở trên mạng (đám mây).', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => 'Liên kết đến tập tin', 'attachments_link_url_hint' => 'URL của trang hoặc tập tin', 'attach' => 'Đính kèm', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => 'Sửa tập tin', 'attachments_edit_file_name' => 'Tên tệp tin', 'attachments_edit_drop_upload' => 'Thả tập tin hoặc bấm vào đây để tải lên và ghi đè', diff --git a/resources/lang/vi/errors.php b/resources/lang/vi/errors.php index e93f74e64..6caf0e990 100644 --- a/resources/lang/vi/errors.php +++ b/resources/lang/vi/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => 'Đã quá thời gian tải lên tệp tin.', // Attachments - 'attachment_page_mismatch' => 'Trang không trùng khớp khi cập nhật đính kèm', 'attachment_not_found' => 'Không tìm thấy đính kèm', // Pages diff --git a/resources/lang/vi/settings.php b/resources/lang/vi/settings.php index 4f7469228..5d35ff439 100644 --- a/resources/lang/vi/settings.php +++ b/resources/lang/vi/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => 'Chức năng gửi email có vẻ đã hoạt động!', 'maint_send_test_email_mail_text' => 'Chúc mừng! Khi bạn nhận được email thông báo này, cài đặt email của bạn có vẻ đã được cấu hình đúng.', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => 'Quyền', 'role_user_roles' => 'Quyền người dùng', @@ -106,6 +120,7 @@ return [ 'role_access_api' => 'Truy cập đến API hệ thống', 'role_manage_settings' => 'Quản lý cài đặt của ứng dụng', 'role_asset' => 'Quyền tài sản (asset)', + 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', 'role_asset_desc' => 'Các quyền này điều khiển truy cập mặc định tới tài sản (asset) nằm trong hệ thống. Quyền tại Sách, Chường và Trang se ghi đè các quyền này.', 'role_asset_admins' => 'Quản trị viên được tự động cấp quyền truy cập đến toàn bộ nội dung, tuy nhiên các tùy chọn đó có thể hiện hoặc ẩn tùy chọn giao diện.', 'role_all' => 'Tất cả', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => 'Đan Mạch', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/zh_CN/auth.php b/resources/lang/zh_CN/auth.php index e1d25078d..a7f8017cb 100644 --- a/resources/lang/zh_CN/auth.php +++ b/resources/lang/zh_CN/auth.php @@ -43,7 +43,7 @@ return [ 'reset_password' => '重置密码', 'reset_password_send_instructions' => '在下面输入您的Email地址,您将收到一封带有密码重置链接的邮件。', 'reset_password_send_button' => '发送重置链接', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => '重置密码的链接将通过您的电子邮箱发送:email。', 'reset_password_success' => '您的密码已成功重置。', 'email_reset_subject' => '重置您的:appName密码', 'email_reset_text' => '您收到此电子邮件是因为我们收到了您的帐户的密码重置请求。', diff --git a/resources/lang/zh_CN/common.php b/resources/lang/zh_CN/common.php index bc9e94d18..e96edaf1e 100644 --- a/resources/lang/zh_CN/common.php +++ b/resources/lang/zh_CN/common.php @@ -33,6 +33,7 @@ return [ 'copy' => '复制', 'reply' => '回复', 'delete' => '删除', + 'delete_confirm' => '确认删除', 'search' => '搜索', 'search_clear' => '清除搜索', 'reset' => '重置', @@ -66,8 +67,8 @@ return [ 'profile_menu' => '个人资料', 'view_profile' => '查看资料', 'edit_profile' => '编辑资料', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => '夜间模式', + 'light_mode' => '日间模式', // Layout tabs 'tab_info' => '信息', diff --git a/resources/lang/zh_CN/components.php b/resources/lang/zh_CN/components.php index 54d0fb085..ab0b7cb46 100644 --- a/resources/lang/zh_CN/components.php +++ b/resources/lang/zh_CN/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => '显示更多', 'image_image_name' => '图片名称', 'image_delete_used' => '该图像用于以下页面。', - 'image_delete_confirm' => '如果你想删除它,请再次按下按钮。', + 'image_delete_confirm_text' => '您确认要删除此图片吗?', 'image_select_image' => '选择图片', 'image_dropzone' => '拖放图片或点击此处上传', 'images_deleted' => '图片已删除', @@ -29,5 +29,6 @@ return [ 'code_editor' => '编辑代码', 'code_language' => '编程语言', 'code_content' => '代码内容', + 'code_session_history' => '会话历史', 'code_save' => '保存代码', ]; diff --git a/resources/lang/zh_CN/entities.php b/resources/lang/zh_CN/entities.php index 5c614b079..babb9f282 100644 --- a/resources/lang/zh_CN/entities.php +++ b/resources/lang/zh_CN/entities.php @@ -47,7 +47,8 @@ return [ 'search_no_pages' => '没有找到相匹配的页面', 'search_for_term' => '“:term”的搜索结果', 'search_more' => '更多结果', - 'search_filters' => '过滤搜索结果', + 'search_advanced' => '高级搜索', + 'search_terms' => '搜索关键词', 'search_content_type' => '种类', 'search_exact_matches' => '精确匹配', 'search_tags' => '标签搜索', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => '上传文件', 'attachments_link' => '附加链接', 'attachments_set_link' => '设置链接', - 'attachments_delete_confirm' => '确认您想要删除此附件后,请点击删除。', + 'attachments_delete' => '您确定要删除此附件吗?', 'attachments_dropzone' => '删除文件或点击此处添加文件', 'attachments_no_files' => '尚未上传文件', 'attachments_explain_link' => '如果您不想上传文件,则可以附加链接,这可以是指向其他页面的链接,也可以是指向云端文件的链接。', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => '链接到文件', 'attachments_link_url_hint' => '网站或文件的网址', 'attach' => '附加', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => '编辑文件', 'attachments_edit_file_name' => '文件名', 'attachments_edit_drop_upload' => '删除文件或点击这里上传并覆盖', diff --git a/resources/lang/zh_CN/errors.php b/resources/lang/zh_CN/errors.php index 21034f399..b41e21ac3 100644 --- a/resources/lang/zh_CN/errors.php +++ b/resources/lang/zh_CN/errors.php @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => '文件上传已超时。', // Attachments - 'attachment_page_mismatch' => '附件更新期间的页面不匹配', 'attachment_not_found' => '找不到附件', // Pages @@ -83,7 +82,7 @@ return [ // Error pages '404_page_not_found' => '无法找到页面', 'sorry_page_not_found' => '对不起,无法找到您想访问的页面。', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => '您可能没有查看权限。', 'return_home' => '返回主页', 'error_occurred' => '出现错误', 'app_down' => ':appName现在正在关闭', diff --git a/resources/lang/zh_CN/passwords.php b/resources/lang/zh_CN/passwords.php index ac3f5e2ae..8d8272ee0 100644 --- a/resources/lang/zh_CN/passwords.php +++ b/resources/lang/zh_CN/passwords.php @@ -8,7 +8,7 @@ return [ 'password' => '密码必须至少包含六个字符并与确认相符。', 'user' => "使用该Email地址的用户不存在。", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => '重置密码链接无法发送至此邮件地址。', 'sent' => '我们已经通过Email发送您的密码重置链接!', 'reset' => '您的密码已被重置!', diff --git a/resources/lang/zh_CN/settings.php b/resources/lang/zh_CN/settings.php index c2f015533..534b5ffa9 100755 --- a/resources/lang/zh_CN/settings.php +++ b/resources/lang/zh_CN/settings.php @@ -81,6 +81,20 @@ return [ 'maint_send_test_email_mail_greeting' => '邮件发送功能看起来工作正常!', 'maint_send_test_email_mail_text' => '恭喜!您收到了此邮件通知,你的电子邮件设置看起来配置正确。', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => '角色', 'role_user_roles' => '用户角色', @@ -106,6 +120,7 @@ return [ 'role_access_api' => '访问系统 API', 'role_manage_settings' => '管理App设置', 'role_asset' => '资源许可', + 'roles_system_warning' => '请注意,具有上述三个权限中的任何一个都可以允许用户更改自己的特权或系统中其他人的特权。 只将具有这些权限的角色分配给受信任的用户。', 'role_asset_desc' => '对系统内资源的默认访问许可将由这些权限控制。单独设置在书籍,章节和页面上的权限将覆盖这里的权限设定。', 'role_asset_admins' => '管理员可自动获得对所有内容的访问权限,但这些选项可能会显示或隐藏UI选项。', 'role_all' => '全部的', @@ -131,7 +146,7 @@ return [ 'users_send_invite_text' => '您可以向该用户发送邀请电子邮件,允许他们设置自己的密码,否则,您可以自己设置他们的密码。', 'users_send_invite_option' => '发送邀请用户电子邮件', 'users_external_auth_id' => '外部身份认证ID', - 'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.', + 'users_external_auth_id_desc' => '这是用于与您的外部身份验证系统通信时匹配此用户的ID。', 'users_password_warning' => '如果您想更改密码,请填写以下内容:', 'users_system_public' => '此用户代表访问您的App的任何访客。它不能用于登录,而是自动分配。', 'users_delete' => '删除用户', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => '丹麦', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/zh_TW/activities.php b/resources/lang/zh_TW/activities.php index 5cf2bd3cf..fab4dd20e 100644 --- a/resources/lang/zh_TW/activities.php +++ b/resources/lang/zh_TW/activities.php @@ -6,41 +6,41 @@ return [ // Pages - 'page_create' => '建立了頁面', + 'page_create' => '已建立頁面', 'page_create_notification' => '頁面已建立成功', - 'page_update' => '更新了頁面', + 'page_update' => '已更新頁面', 'page_update_notification' => '頁面已更新成功', - 'page_delete' => '刪除了頁面', + 'page_delete' => '已刪除頁面', 'page_delete_notification' => '頁面已刪除成功', - 'page_restore' => '恢複了頁面', - 'page_restore_notification' => '頁面已恢複成功', + 'page_restore' => '已還原頁面', + 'page_restore_notification' => '頁面已還原成功', 'page_move' => '移動了頁面', // Chapters - 'chapter_create' => '建立了章節', + 'chapter_create' => '已建立章節', 'chapter_create_notification' => '章節已建立成功', - 'chapter_update' => '更新了章節', + 'chapter_update' => '已更新章節', 'chapter_update_notification' => '章節已建立成功', - 'chapter_delete' => '刪除了章節', + 'chapter_delete' => '已刪除章節', 'chapter_delete_notification' => '章節已刪除成功', - 'chapter_move' => '移動了章節', + 'chapter_move' => '已移動章節', // Books - 'book_create' => '建立了圖書', - 'book_create_notification' => '圖書已建立成功', + 'book_create' => '已建立書本', + 'book_create_notification' => '書本已建立成功', 'book_update' => '更新了圖書', - 'book_update_notification' => '圖書已更新成功', - 'book_delete' => '刪除了圖書', - 'book_delete_notification' => '圖書已刪除成功', - 'book_sort' => '排序了圖書', - 'book_sort_notification' => '圖書已重新排序成功', + 'book_update_notification' => '書本已更新成功', + 'book_delete' => '已刪除書本', + 'book_delete_notification' => '書本已刪除成功', + 'book_sort' => '已排序書本', + 'book_sort_notification' => '書本已重新排序成功', // Bookshelves - 'bookshelf_create' => '建立了書架', + 'bookshelf_create' => '已建立書架', 'bookshelf_create_notification' => '書架已建立成功', - 'bookshelf_update' => '更新了書架', + 'bookshelf_update' => '已更新書架', 'bookshelf_update_notification' => '書架已更新成功', - 'bookshelf_delete' => '刪除了書架', + 'bookshelf_delete' => '已刪除書架', 'bookshelf_delete_notification' => '書架已刪除成功', // Other diff --git a/resources/lang/zh_TW/auth.php b/resources/lang/zh_TW/auth.php index c72e5d206..2ad648589 100644 --- a/resources/lang/zh_TW/auth.php +++ b/resources/lang/zh_TW/auth.php @@ -7,7 +7,7 @@ return [ 'failed' => '使用者名稱或密碼錯誤。', - 'throttle' => '您的登入次數過多,請在:秒後重試。', + 'throttle' => '您的登入次數過多,請在:seconds秒後重試。', // Login & Register 'sign_up' => '註冊', @@ -18,32 +18,32 @@ return [ 'name' => '名稱', 'username' => '使用者名稱', - 'email' => 'Email位址', + 'email' => '電子郵件', 'password' => '密碼', 'password_confirm' => '確認密碼', - 'password_hint' => '必須超過7個字元', + 'password_hint' => '必須超過 7 個字元', 'forgot_password' => '忘記密碼?', - 'remember_me' => '記住該賬戶密碼', - 'ldap_email_hint' => '請輸入用於此帳號的電子郵件。', - 'create_account' => '建立帳號', - 'already_have_account' => '已經擁有賬戶?', - 'dont_have_account' => '沒有賬戶?', - 'social_login' => 'SNS登入', - 'social_registration' => 'SNS註冊', - 'social_registration_text' => '其他服務註冊/登入.', + 'remember_me' => '記住我', + 'ldap_email_hint' => '請輸入此帳號使用的電子郵件。', + 'create_account' => '建立帳戶', + 'already_have_account' => '已經擁有帳戶?', + 'dont_have_account' => '沒有帳戶?', + 'social_login' => '社群網站登入', + 'social_registration' => '社群網站帳戶註冊', + 'social_registration_text' => '使用其他服務註冊及登入。', - 'register_thanks' => '註冊完成!', - 'register_confirm' => '請點選查收您的Email,並點選確認。', - 'registrations_disabled' => '註冊目前被禁用', - 'registration_email_domain_invalid' => '此Email域名沒有權限進入本系統', + 'register_thanks' => '感謝您的註冊!', + 'register_confirm' => '請檢查您的電子郵件,並按下確認按鈕以使用 :appName 。', + 'registrations_disabled' => '目前已停用註冊', + 'registration_email_domain_invalid' => '這個電子郵件網域沒有權限使用', 'register_success' => '感謝您註冊:appName,您現在已經登入。', // Password Reset 'reset_password' => '重置密碼', - 'reset_password_send_instructions' => '在下方輸入您的Email位址,您將收到一封帶有密碼重置連結的郵件。', + 'reset_password_send_instructions' => '在下方輸入您的電子郵件,您將收到一封帶有密碼重置連結的郵件。', 'reset_password_send_button' => '發送重置連結', - 'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.', + 'reset_password_sent' => '重置密碼的連結會發送至電子郵件地址:email(如果系統記錄中存在此電子郵件地址)', 'reset_password_success' => '您的密碼已成功重置。', 'email_reset_subject' => '重置您的:appName密碼', 'email_reset_text' => '您收到此電子郵件是因為我們收到了您的帳號的密碼重置請求。', @@ -51,7 +51,7 @@ return [ // Email Confirmation - 'email_confirm_subject' => '確認您在:appName的Email位址', + 'email_confirm_subject' => '確認您在:appName的電子郵件', 'email_confirm_greeting' => '感謝您加入:appName!', 'email_confirm_text' => '請點選下面的按鈕確認您的Email位址:', 'email_confirm_action' => '確認Email', @@ -66,12 +66,12 @@ return [ 'email_not_confirmed_resend_button' => '重新發送確認Email', // User Invite - 'user_invite_email_subject' => '您被邀請加入:bookstack!', - 'user_invite_email_greeting' => '我們為您在bookstack上創建了一個新賬戶。', + 'user_invite_email_subject' => '您受邀請加入:appName!', + 'user_invite_email_greeting' => '我們為您在:appName上創建了一個新賬戶。', 'user_invite_email_text' => '請點擊下面的按鈕設置賬戶密碼并獲取訪問權限:', 'user_invite_email_action' => '請設置賬戶密碼', - 'user_invite_page_welcome' => '歡迎使用:bookstack', - 'user_invite_page_text' => '要完善您的賬戶并獲取訪問權限,您需要設置一個密碼,該密碼將在以後訪問時用於登陸:bookstack', + 'user_invite_page_welcome' => '歡迎使用:appName', + 'user_invite_page_text' => '要完成設置您的賬戶並獲取訪問權限,您需要設置一個密碼。該密碼將在以後訪問時用於登陸:appName', 'user_invite_page_confirm_button' => '請確定密碼', - 'user_invite_success' => '密碼已設置,您現在可以進入:bookstack了啦' + 'user_invite_success' => '密碼已設置,您現在可以進入:appName了啦!' ]; \ No newline at end of file diff --git a/resources/lang/zh_TW/common.php b/resources/lang/zh_TW/common.php index c86b0940c..1d26ded29 100644 --- a/resources/lang/zh_TW/common.php +++ b/resources/lang/zh_TW/common.php @@ -33,6 +33,7 @@ return [ 'copy' => '複製', 'reply' => '回覆', 'delete' => '刪除', + 'delete_confirm' => '確認刪除', 'search' => '搜尋', 'search_clear' => '清除搜尋', 'reset' => '重置', @@ -66,8 +67,8 @@ return [ 'profile_menu' => '個人資料菜單', 'view_profile' => '檢視資料', 'edit_profile' => '編輯資料', - 'dark_mode' => 'Dark Mode', - 'light_mode' => 'Light Mode', + 'dark_mode' => '深色模式', + 'light_mode' => '明亮模式', // Layout tabs 'tab_info' => '訊息', diff --git a/resources/lang/zh_TW/components.php b/resources/lang/zh_TW/components.php index bcadecbb6..b200fa794 100644 --- a/resources/lang/zh_TW/components.php +++ b/resources/lang/zh_TW/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => '載入更多', 'image_image_name' => '圖片名稱', 'image_delete_used' => '所使用圖片目前用於以下頁面。', - 'image_delete_confirm' => '如果你想刪除它,請再次按下按鈕。', + 'image_delete_confirm_text' => '您確認想要刪除這個圖片?', 'image_select_image' => '選擇圖片', 'image_dropzone' => '拖曳圖片或點選這裡上傳', 'images_deleted' => '圖片已刪除', @@ -29,5 +29,6 @@ return [ 'code_editor' => '編輯程式碼', 'code_language' => '程式語言', 'code_content' => '程式碼內容', + 'code_session_history' => 'Session 歷程', 'code_save' => '儲存程式碼', ]; diff --git a/resources/lang/zh_TW/entities.php b/resources/lang/zh_TW/entities.php index d3280217c..bc08ee32a 100644 --- a/resources/lang/zh_TW/entities.php +++ b/resources/lang/zh_TW/entities.php @@ -42,12 +42,13 @@ return [ // Search 'search_results' => '搜尋結果', - 'search_total_results_found' => '共找到了:count個結果', + 'search_total_results_found' => '共找到了:count個結果|共找到了:count個結果', 'search_clear' => '清除搜尋', 'search_no_pages' => '沒有找到符合的頁面', 'search_for_term' => '“:term”的搜尋結果', 'search_more' => '更多結果', - 'search_filters' => '過濾搜尋結果', + 'search_advanced' => '進階搜尋', + 'search_terms' => '搜尋字串', 'search_content_type' => '種類', 'search_exact_matches' => '精確符合', 'search_tags' => '標籤搜尋', @@ -68,7 +69,7 @@ return [ // Shelves 'shelf' => '書架', 'shelves' => '書架', - 'x_shelves' => ':架|:章節', + 'x_shelves' => ':count 書架|:count 章節', 'shelves_long' => '書架', 'shelves_empty' => '不存在已建立的書架', 'shelves_create' => '建立書架', @@ -100,7 +101,7 @@ return [ // Books 'book' => '書本', 'books' => '書本', - 'x_books' => ':count本書', + 'x_books' => ':count本書|:count本書', 'books_empty' => '不存在已建立的書', 'books_popular' => '熱門書本', 'books_recent' => '最近的書', @@ -139,7 +140,7 @@ return [ // Chapters 'chapter' => '章節', 'chapters' => '章節', - 'x_chapters' => ':count個章節', + 'x_chapters' => ':count個章節|:count個章節', 'chapters_popular' => '熱門章節', 'chapters_new' => '新章節', 'chapters_create' => '建立章節', @@ -162,7 +163,7 @@ return [ // Pages 'page' => '頁面', 'pages' => '頁面', - 'x_pages' => ':count個頁面', + 'x_pages' => ':count個頁面|:count個頁面', 'pages_popular' => '熱門頁面', 'pages_new' => '新頁面', 'pages_attachments' => '附件', @@ -255,7 +256,7 @@ return [ 'attachments_upload' => '上傳檔案', 'attachments_link' => '附加連結', 'attachments_set_link' => '設定連結', - 'attachments_delete_confirm' => '確認您想要刪除此附件後,請點選刪除。', + 'attachments_delete' => '確定要刪除此附件嗎?', 'attachments_dropzone' => '刪除檔案或點選此處加入檔案', 'attachments_no_files' => '尚未上傳檔案', 'attachments_explain_link' => '如果您不想上傳檔案,則可以附加連結,這可以是指向其他頁面的連結,也可以是指向雲端檔案的連結。', @@ -264,6 +265,7 @@ return [ 'attachments_link_url' => '連結到檔案', 'attachments_link_url_hint' => '網站或檔案的網址', 'attach' => '附加', + 'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_edit_file' => '編輯檔案', 'attachments_edit_file_name' => '檔案名稱', 'attachments_edit_drop_upload' => '刪除檔案或點選這裡上傳並覆蓋', @@ -286,20 +288,20 @@ return [ 'profile_not_created_pages' => ':userName尚未建立任何頁面', 'profile_not_created_chapters' => ':userName尚未建立任何章節', 'profile_not_created_books' => ':userName尚未建立任何書本', - 'profile_not_created_shelves' => ':用戶名 沒有創建任何書架', + 'profile_not_created_shelves' => ':userName 沒有創建任何書架', // Comments 'comment' => '評論', 'comments' => '評論', 'comment_add' => '新增評論', 'comment_placeholder' => '在這裡評論', - 'comment_count' => '{0} 無評論|[1,*] :count條評論', + 'comment_count' => '{0} 無評論|{1} :count條評論|[2,*] :count條評論', 'comment_save' => '儲存評論', 'comment_saving' => '正在儲存評論...', 'comment_deleting' => '正在刪除評論...', 'comment_new' => '新評論', 'comment_created' => '評論於 :createDiff', - 'comment_updated' => '更新於 :updateDiff (:username)', + 'comment_updated' => '由 :username 於 :updateDiff 更新', 'comment_deleted_success' => '評論已刪除', 'comment_created_success' => '評論已加入', 'comment_updated_success' => '評論已更新', diff --git a/resources/lang/zh_TW/errors.php b/resources/lang/zh_TW/errors.php index f44f7eb8b..8604cc6c2 100644 --- a/resources/lang/zh_TW/errors.php +++ b/resources/lang/zh_TW/errors.php @@ -22,14 +22,14 @@ return [ 'saml_user_not_registered' => '用戶:name未註冊,自動註冊不可用', 'saml_no_email_address' => '在外部認證系統提供的數據中找不到該用戶的電子郵件地址', 'saml_invalid_response_id' => '該應用程序啟動的進程無法識別來自外部身份驗證系統的請求。 登錄後返回可能會導致此問題。', - 'saml_fail_authed' => '使用:system登錄失敗,系統未提供成功的授權', + 'saml_fail_authed' => '使用 :system 登錄失敗,系統未提供成功的授權', 'social_no_action_defined' => '沒有定義行為', 'social_login_bad_response' => "在 :socialAccount 登錄時遇到錯誤:\n:error", 'social_account_in_use' => ':socialAccount 帳號已被使用,請嘗試透過 :socialAccount 選項登錄。', 'social_account_email_in_use' => 'Email :email 已經被使用。如果您已有帳號,則可以在個人資料設定中綁定您的 :socialAccount。', 'social_account_existing' => ':socialAccount已經被綁定到您的帳號。', 'social_account_already_used_existing' => ':socialAccount帳號已經被其他使用者使用。', - 'social_account_not_used' => ':socialAccount帳號沒有綁定到任何使用者,請在您的個人資料設定中綁定。', + 'social_account_not_used' => ':socialAccount帳號沒有綁定到任何使用者,請在您的個人資料設定中綁定。 ', 'social_account_register_instructions' => '如果您還沒有帳號,您可以使用 :socialAccount 選項註冊帳號。', 'social_driver_not_found' => '未找到社交驅動程式', 'social_driver_not_configured' => '您的:socialAccount社交設定不正確。', @@ -46,7 +46,6 @@ return [ 'file_upload_timeout' => '文件上傳已超時。', // Attachments - 'attachment_page_mismatch' => '附件更新期間的頁面不符合', 'attachment_not_found' => '沒有找到附件', // Pages @@ -83,7 +82,7 @@ return [ // Error pages '404_page_not_found' => '無法找到頁面', 'sorry_page_not_found' => '對不起,無法找到您想進入的頁面。', - 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'sorry_page_not_found_permission_warning' => '如果您確認這個頁面存在,則代表可能沒有查看它的權限。', 'return_home' => '返回首頁', 'error_occurred' => '發生錯誤', 'app_down' => ':appName現在正在關閉', @@ -98,6 +97,6 @@ return [ 'api_user_token_expired' => '授權令牌已過期', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => '寄送測試電子郵件時發生錯誤:', ]; diff --git a/resources/lang/zh_TW/passwords.php b/resources/lang/zh_TW/passwords.php index 7d93b302b..7040cd890 100644 --- a/resources/lang/zh_TW/passwords.php +++ b/resources/lang/zh_TW/passwords.php @@ -7,9 +7,9 @@ return [ 'password' => '密碼必須至少包含六個字元並與確認相符。', - 'user' => "使用該Email位址的使用者不存在。", - 'token' => 'The password reset token is invalid for this email address.', - 'sent' => '我們已經透過Email發送您的密碼重置連結。', + 'user' => "沒有使用這個電子郵件位址的使用者。", + 'token' => '這個電子郵件位址的密碼重置權仗無效。', + 'sent' => '我們已經透過電子郵件發送您的密碼重置連結。', 'reset' => '您的密碼已被重置。', ]; diff --git a/resources/lang/zh_TW/settings.php b/resources/lang/zh_TW/settings.php index f43e4204f..b135cb086 100644 --- a/resources/lang/zh_TW/settings.php +++ b/resources/lang/zh_TW/settings.php @@ -44,22 +44,22 @@ return [ // Color settings 'content_colors' => '內容顏色', 'content_colors_desc' => '為頁面組織層次結構中的所有元素設置顏色。 為了提高可讀性,建議選擇亮度與默認顏色相似的顏色。', - 'bookshelf_color' => '书架顏色', - 'book_color' => '书本颜色', - 'chapter_color' => '章节颜色', - 'page_color' => '页面颜色', + 'bookshelf_color' => '書架顔色', + 'book_color' => '書本顔色', + 'chapter_color' => '章節顔色', + 'page_color' => '頁面顔色', 'page_draft_color' => '頁面草稿顏色', // Registration Settings 'reg_settings' => '註冊設定', 'reg_enable' => '啟用註冊', 'reg_enable_toggle' => '啟用註冊', - 'reg_enable_desc' => '啟用註冊後,用戶將可以自己註冊為應用程序用戶,註冊後,他們將獲得一個默認的單一用戶角色。', + 'reg_enable_desc' => '啟用註冊後,用戶將可以自己註冊為應用程序用戶。註冊後,他們將獲得一個默認的單一用戶角色。', 'reg_default_role' => '註冊後的預設使用者角色', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', - 'reg_email_confirmation' => '电子邮箱认证', - 'reg_email_confirmation_toggle' => '需要電子郵件確認', - 'reg_confirm_email_desc' => '如果使用網域名稱限制,則需要Email驗證,並且本設定將被忽略。', + 'reg_enable_external_warning' => '當外部 LDAP 或 SAML 身份驗證啟用時,將會忽略上述選項。如果外部身份驗證成功,將會自動在本系統建立使用者帳戶。', + 'reg_email_confirmation' => '電子郵件驗證', + 'reg_email_confirmation_toggle' => '需要電子郵件驗證', + 'reg_confirm_email_desc' => '如果使用網域名稱限制,則需要電子郵件驗證,並且本設定將被忽略。', 'reg_confirm_restrict_domain' => '網域名稱限制', 'reg_confirm_restrict_domain_desc' => '輸入您想要限制註冊的Email域域名稱列表,用逗號隔開。在被允許與本系統連結之前,使用者會收到一封Email來確認他們的位址。
    注意,使用者在註冊成功後可以修改他們的Email位址。', 'reg_confirm_restrict_domain_placeholder' => '尚未設定限制的網域', @@ -70,17 +70,31 @@ return [ 'maint_image_cleanup_desc' => "掃描頁面和修訂內容以檢查哪些圖像是正在使用的以及哪些圖像是多余的。確保在運行前創建完整的數據庫和映像備份。", 'maint_image_cleanup_ignore_revisions' => '忽略修訂記錄中的圖像', 'maint_image_cleanup_run' => '運行清理', - 'maint_image_cleanup_warning' => '發現了 :count 張可能未使用的圖像。您確定要刪除這些圖像嗎?', - 'maint_image_cleanup_success' => '找到並刪除了 :count 張可能未使用的圖像!', - 'maint_image_cleanup_nothing_found' => '找不到未使用的圖像,沒有刪除!', + 'maint_image_cleanup_warning' => '發現了:count 張可能未使用的圖像。您確定要刪除這些圖像嗎?', + 'maint_image_cleanup_success' => '找到並刪除了:count 張可能未使用的圖像!', + 'maint_image_cleanup_nothing_found' => '找不到未使用的圖像,未刪除任何檔案!', 'maint_send_test_email' => '發送測試電子郵件', 'maint_send_test_email_desc' => '這會將測試電子郵件發送到您的個人資料中指定的電子郵件地址。', 'maint_send_test_email_run' => '發送測試郵件', - 'maint_send_test_email_success' => '郵件發送到:地址', + 'maint_send_test_email_success' => '郵件發送到 :address', 'maint_send_test_email_mail_subject' => '測試郵件', 'maint_send_test_email_mail_greeting' => '電子郵件傳遞似乎有效!', 'maint_send_test_email_mail_text' => '恭喜你! 收到此電子郵件通知時,您的電子郵件設置已經認證成功。', + // Audit Log + 'audit' => 'Audit Log', + 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_event_filter' => 'Event Filter', + 'audit_event_filter_no_filter' => 'No Filter', + 'audit_deleted_item' => 'Deleted Item', + 'audit_deleted_item_name' => 'Name: :name', + 'audit_table_user' => 'User', + 'audit_table_event' => 'Event', + 'audit_table_item' => 'Related Item', + 'audit_table_date' => 'Activity Date', + 'audit_date_from' => 'Date Range From', + 'audit_date_to' => 'Date Range To', + // Role Settings 'roles' => '角色', 'role_user_roles' => '使用者角色', @@ -106,6 +120,7 @@ return [ 'role_access_api' => '存取系統API', 'role_manage_settings' => '管理App設定', 'role_asset' => '資源項目', + 'roles_system_warning' => '請注意,具有上述三項權限任何一項的用戶能更改自己或系統中其他人的權限。應只將具這些權限的角色分配予受信任的用戶。', 'role_asset_desc' => '對系統內資源的預設權限將由這裡的權限控制。若有單獨設定在書本、章節和頁面上的權限,將會覆蓋這裡的權限設定。', 'role_asset_admins' => '管理員會自動獲得對所有內容的存取權限,但這些選項可能會顯示或隱藏UI的選項。', 'role_all' => '全部', @@ -131,7 +146,7 @@ return [ 'users_send_invite_text' => '您可以選擇向該用戶發送邀請電子郵件,允許他們設置自己的密碼,或者您可以自己設置他們的密碼。', 'users_send_invite_option' => '向用戶發送邀請電子郵件', 'users_external_auth_id' => '外部身份驗證ID', - 'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.', + 'users_external_auth_id_desc' => '這個 ID 將於外部身份驗證系統時,用於比對使用者。', 'users_password_warning' => '如果您想更改密碼,請填寫以下內容:', 'users_system_public' => '此使用者代表進入您的App的任何訪客。它不能用於登入,而是自動分配。', 'users_delete' => '刪除使用者', @@ -172,10 +187,10 @@ return [ 'user_api_token_id_desc' => '這是此令牌的不可編輯的系統生成的標識符,需要在API請求中提供。', 'user_api_token_secret' => '令牌密鑰', 'user_api_token_secret_desc' => '這是此令牌的系統生成的密鑰,需要在API請求中提供。 這只會顯示一次,因此請將其複製到安全的地方。', - 'user_api_token_created' => '令牌已創建:time Ago', + 'user_api_token_created' => '令牌已創建於 :timeAgo', 'user_api_token_updated' => '令牌已更新:timeAgo', 'user_api_token_delete' => '刪除令牌', - 'user_api_token_delete_warning' => '這將從系統中完全刪除名稱為\':tokenName\'的API令牌。', + 'user_api_token_delete_warning' => '這將從系統中完全刪除名稱為 ":tokenName" 的API令牌。', 'user_api_token_delete_confirm' => '您確定要刪除這個API令牌嗎?', 'user_api_token_delete_success' => 'API令牌成功刪除', @@ -185,6 +200,7 @@ return [ 'language_select' => [ 'en' => 'English', 'ar' => 'العربية', + 'bg' => 'Bǎlgarski', 'cs' => 'Česky', 'da' => '丹麥', 'de' => 'Deutsch (Sie)', @@ -192,7 +208,7 @@ return [ 'es' => 'Español', 'es_AR' => 'Español Argentina', 'fr' => 'Français', - 'he' => 'עברית', + 'he' => '希伯來語', 'hu' => 'Magyar', 'it' => 'Italian', 'ja' => '日本語', diff --git a/resources/lang/zh_TW/validation.php b/resources/lang/zh_TW/validation.php index 046e24451..82d74e525 100644 --- a/resources/lang/zh_TW/validation.php +++ b/resources/lang/zh_TW/validation.php @@ -30,19 +30,19 @@ return [ 'digits' => ':attribute 必須為:digits位數。', 'digits_between' => ':attribute 必須為:min到:max位數。', 'email' => ':attribute 必須是有效的電子郵件位址。', - 'ends_with' => ':attribute必須以下列之一結尾::values', + 'ends_with' => ':attribute必須以下列之一結尾::values', 'filled' => ':attribute 字段是必需的。', 'gt' => [ - 'numeric' => ':attribute必須大於:value。', + 'numeric' => ':attribute必須大於:value。', 'file' => ':attribute必須大於:value千字節。', - 'string' => ':attribute必須大於:value字符。', - 'array' => ':attribute必須包含比:value多的項目。', + 'string' => ':attribute必須多於:value個字符。', + 'array' => ':attribute必須包含比:value多的項目。', ], 'gte' => [ - 'numeric' => 'The :attribute必須大於或等於:value.', + 'numeric' => 'The :attribute必須大於或等於:value。', 'file' => 'The :attribute必須大於或等於:value千字節。', - 'string' => 'The :attribute必須大於或等於:value字符。', - 'array' => 'The :attribute必須具有:value項或更多。', + 'string' => 'The :attribute必須多於或等於:value個字符。', + 'array' => ':attribute必須具有:value或更多項。', ], 'exists' => '選中的 :attribute 無效。', 'image' => ':attribute 必須是一個圖片。', @@ -54,16 +54,16 @@ return [ 'ipv6' => 'The :attribute必須是有效的IPv6地址。', 'json' => 'The :attribute必須是有效的JSON字符串。', 'lt' => [ - 'numeric' => 'The :attribute必須小於:value。', + 'numeric' => ':attribute必須小於:value。', 'file' => 'The :attribute必須小於:value千字節。', - 'string' => 'The :attribute必須小於:value字符。', - 'array' => 'The :attribute必須少於:value個項目。', + 'string' => ':attribute必須少於:value個字符。', + 'array' => ':attribute必須少於:value個項目。', ], 'lte' => [ - 'numeric' => 'The :attribute必須小於或等於:value。', - 'file' => 'The :attribute必須小於或等於:value千字節。', - 'string' => 'The :attribute必須小於或等於:value字符。', - 'array' => 'The :attribute不得超過:value個項目。', + 'numeric' => ':attribute必須小於或等於:value。', + 'file' => ':attribute必須小於或等於:value KB。', + 'string' => ':attribute必須少於或等於:value個字符。', + 'array' => ':attribute不得多過:value個項目。', ], 'max' => [ 'numeric' => ':attribute 不能超過:max。', @@ -74,7 +74,7 @@ return [ 'mimes' => ':attribute 必須是 :values 類型的檔案。', 'min' => [ 'numeric' => ':attribute 至少為:min。', - 'file' => ':attribute 至少為:min KB。', + 'file' => ':attribute 必須至少為:min KB。', 'string' => ':attribute 至少為:min個字元。', 'array' => ':attribute 至少有:min項。', ], diff --git a/resources/sass/_blocks.scss b/resources/sass/_blocks.scss index b6f35376d..697286a78 100644 --- a/resources/sass/_blocks.scss +++ b/resources/sass/_blocks.scss @@ -115,10 +115,13 @@ margin-inline-end: 0px; } } - > div .outline input { + .outline input { margin: $-s 0; width: 100%; } + .outline { + position: relative; + } .handle { @include lightDark(background-color, #eee, #2d2d2d); left: 0; diff --git a/resources/sass/_colors.scss b/resources/sass/_colors.scss index 683694d96..e01ecebc9 100644 --- a/resources/sass/_colors.scss +++ b/resources/sass/_colors.scss @@ -51,6 +51,11 @@ fill: currentColor !important; } +.text-white { + color: #fff; + fill: currentColor !important; +} + /* * Entity text colors */ @@ -90,9 +95,3 @@ .bg-shelf { background-color: var(--color-bookshelf); } - -.bg-shelf, .bg-book { - @include whenDark { - filter: brightness(67%) saturate(80%); - } -} diff --git a/resources/sass/_components.scss b/resources/sass/_components.scss index 13e16e42f..eb40741d1 100644 --- a/resources/sass/_components.scss +++ b/resources/sass/_components.scss @@ -81,7 +81,7 @@ } } -[overlay] { +[overlay], .popup-background { @include lightDark(background-color, rgba(0, 0, 0, 0.333), rgba(0, 0, 0, 0.6)); position: fixed; z-index: 95536; @@ -197,11 +197,8 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { transition: all cubic-bezier(.4, 0, 1, 1) 160ms; overflow: hidden; &.selected { - //transform: scale3d(0.92, 0.92, 0.92); - border: 4px solid #FFF; - overflow: hidden; - border-radius: 8px; - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2); + transform: scale3d(0.92, 0.92, 0.92); + outline: currentColor 2px solid; } img { width: 100%; @@ -231,7 +228,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { } } -#image-manager .load-more { +.image-manager .load-more { display: block; text-align: center; @include lightDark(background-color, #EEE, #444); @@ -243,6 +240,10 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { font-style: italic; } +.image-manager .loading-container { + text-align: center; +} + .image-manager-sidebar { width: 300px; overflow-y: auto; @@ -250,6 +251,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { border-inline-start: 1px solid #DDD; @include lightDark(border-color, #ddd, #000); .inner { + min-height: auto; padding: $-m; } img { @@ -291,6 +293,12 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { } } +.image-manager .corner-button { + margin: 0; + border-radius: 0; + padding: $-m; +} + // Dropzone /* * The MIT License @@ -298,7 +306,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { */ .dz-message { font-size: 1em; - line-height: 2.35; + line-height: 2.85; font-style: italic; color: #888; text-align: center; @@ -601,9 +609,14 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { 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; + } } } @@ -611,11 +624,11 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { display: none; } -#code-editor .CodeMirror { +.code-editor .CodeMirror { height: 400px; } -#code-editor .lang-options { +.code-editor .lang-options { max-width: 480px; margin-bottom: $-s; a { @@ -625,10 +638,10 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { } @include smaller-than($m) { - #code-editor .lang-options { + .code-editor .lang-options { max-width: 100%; } - #code-editor .CodeMirror { + .code-editor .CodeMirror { height: 200px; } } diff --git a/resources/sass/_header.scss b/resources/sass/_header.scss index 4c3f6c619..e19bb4f61 100644 --- a/resources/sass/_header.scss +++ b/resources/sass/_header.scss @@ -24,7 +24,7 @@ header { padding: $-xxs 0; @include lightDark(border-bottom-color, #DDD, #000); @include whenDark { - filter: saturate(0.6) brightness(0.8); + filter: saturate(0.8) brightness(0.8); } .links { display: inline-block; diff --git a/resources/sass/_layout.scss b/resources/sass/_layout.scss index 595713feb..cf2a1630e 100644 --- a/resources/sass/_layout.scss +++ b/resources/sass/_layout.scss @@ -49,6 +49,9 @@ &.v-center { align-items: center; } + &.v-end { + align-items: end; + } &.no-gap { grid-row-gap: 0; grid-column-gap: 0; @@ -118,11 +121,25 @@ body.flexbox { position: relative; } +.flex-container-row { + display: flex; + flex-direction: row; +} + +.flex-container-column { + display: flex; + flex-direction: column; +} + .flex { min-height: 0; flex: 1; } +.justify-flex-end { + justify-content: flex-end; +} + /** * Display and float utilities @@ -141,7 +158,7 @@ body.flexbox { } .hidden { - display: none; + display: none !important; } .float { diff --git a/resources/sass/_lists.scss b/resources/sass/_lists.scss index 77727060e..a3a58e6c6 100644 --- a/resources/sass/_lists.scss +++ b/resources/sass/_lists.scss @@ -357,13 +357,15 @@ ul.pagination { border: 1px solid #CCC; margin-inline-start: -1px; user-select: none; - &.disabled { - cursor: not-allowed; - } + @include lightDark(color, #555, #eee); + @include lightDark(border-color, #ccc, #666); + } + li.disabled { + cursor: not-allowed; } li.active span { - @include lightDark(color, #444, #eee); - @include lightDark(background-color, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.5)); + @include lightDark(color, #111, #eee); + @include lightDark(background-color, rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.5)); } } @@ -560,15 +562,15 @@ ul.pagination { right: 0; margin: $-m 0; @include lightDark(background-color, #fff, #333); - box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.18); border-radius: 1px; - border: 1px solid #EEE; - @include lightDark(border-color, #eee, #000); min-width: 180px; padding: $-xs 0; @include lightDark(color, #555, #eee); fill: currentColor; text-align: start !important; + max-height: 500px; + overflow-y: auto; &.wide { min-width: 220px; } diff --git a/resources/sass/_pages.scss b/resources/sass/_pages.scss index 1ed02d2e7..4f249244b 100755 --- a/resources/sass/_pages.scss +++ b/resources/sass/_pages.scss @@ -327,25 +327,17 @@ body.mce-fullscreen, body.markdown-fullscreen { } .suggestion-box { - position: absolute; - background-color: #FFF; - border: 1px solid #BBB; - box-shadow: $bs-light; - list-style: none; - z-index: 100; + top: auto; + margin: -4px 0 0; + right: auto; + left: 0; padding: 0; - margin: 0; - border-radius: 3px; li { display: block; - padding: $-xs $-s; border-bottom: 1px solid #DDD; &:last-child { border-bottom: 0; } - &.active { - background-color: #EEE; - } } } diff --git a/resources/sass/_spacing.scss b/resources/sass/_spacing.scss index 57b229ab8..40217de9b 100644 --- a/resources/sass/_spacing.scss +++ b/resources/sass/_spacing.scss @@ -28,5 +28,5 @@ } } } -@include spacing('margin', 'm') -@include spacing('padding', 'p') \ No newline at end of file +@include spacing('margin', 'm'); +@include spacing('padding', 'p'); \ No newline at end of file diff --git a/resources/sass/_text.scss b/resources/sass/_text.scss index 116504199..4ada34725 100644 --- a/resources/sass/_text.scss +++ b/resources/sass/_text.scss @@ -96,9 +96,6 @@ a { text-decoration: none; transition: filter ease-in-out 80ms; line-height: 1.6; - @include whenDark { - filter: brightness(1.3) saturate(0.7); - } &:hover { text-decoration: underline; } @@ -133,7 +130,7 @@ p, ul, ol, pre, table, blockquote { hr { border: 0; height: 1px; - @include lightDark(background, #eaeaea, #222); + @include lightDark(background, #eaeaea, #555); margin-bottom: $-l; &.faded { background-image: linear-gradient(to right, #FFF, #e3e0e0 20%, #e3e0e0 80%, #FFF); diff --git a/resources/sass/_tinymce.scss b/resources/sass/_tinymce.scss index 9dbecda95..dfaf6683e 100644 --- a/resources/sass/_tinymce.scss +++ b/resources/sass/_tinymce.scss @@ -51,6 +51,9 @@ overflow:auto; iframe { flex: 1; + // Force TinyMCE iframe to render on its own layer + // for much greater performance in Safari + will-change: transform; } } } diff --git a/resources/sass/styles.scss b/resources/sass/styles.scss index 8af363469..376541b5d 100644 --- a/resources/sass/styles.scss +++ b/resources/sass/styles.scss @@ -18,11 +18,6 @@ @import "lists"; @import "pages"; -[v-cloak] { - display: none; opacity: 0; - animation-name: none !important; -} - // Jquery Sortable Styles .dragged { position: absolute; @@ -140,8 +135,10 @@ $btt-size: 40px; .contained-search-box { display: flex; + height: 38px; input, button { border-radius: 0; + border: 1px solid #ddd; @include lightDark(border-color, #ddd, #000); margin-inline-start: -1px; } @@ -162,6 +159,9 @@ $btt-size: 40px; background-color: $negative; color: #EEE; } + svg { + margin: 0; + } } .entity-selector { @@ -288,4 +288,15 @@ $btt-size: 40px; transform: rotate(180deg); } } +} + +table a.audit-log-user { + display: grid; + grid-template-columns: 42px 1fr; + align-items: center; +} +table a.icon-list-item { + display: grid; + grid-template-columns: 36px 1fr; + align-items: center; } \ No newline at end of file diff --git a/resources/views/api-docs/index.blade.php b/resources/views/api-docs/index.blade.php index e92b505cf..d9c3d6595 100644 --- a/resources/views/api-docs/index.blade.php +++ b/resources/views/api-docs/index.blade.php @@ -189,7 +189,11 @@
    {{ $endpoint['controller_method_kebab'] }}
    {{ $endpoint['method'] }} - {{ url($endpoint['uri']) }} + @if($endpoint['controller_method_kebab'] === 'list') + {{ url($endpoint['uri']) }} + @else + {{ url($endpoint['uri']) }} + @endif

    {{ $endpoint['description'] ?? '' }}

    @if($endpoint['body_params'] ?? false) diff --git a/resources/views/attachments/list.blade.php b/resources/views/attachments/list.blade.php new file mode 100644 index 000000000..8c9be8290 --- /dev/null +++ b/resources/views/attachments/list.blade.php @@ -0,0 +1,8 @@ +@foreach($attachments as $attachment) + +@endforeach \ No newline at end of file diff --git a/resources/views/attachments/manager-edit-form.blade.php b/resources/views/attachments/manager-edit-form.blade.php new file mode 100644 index 000000000..f3f11a0fc --- /dev/null +++ b/resources/views/attachments/manager-edit-form.blade.php @@ -0,0 +1,47 @@ +
    +
    {{ trans('entities.attachments_edit_file') }}
    + +
    + + + @if($errors->has('attachment_edit_name')) +
    {{ $errors->first('attachment_edit_name') }}
    + @endif +
    + +
    + +
    + @include('components.dropzone', [ + 'placeholder' => trans('entities.attachments_edit_drop_upload'), + 'url' => url('/attachments/upload/' . $attachment->id), + 'successMessage' => trans('entities.attachments_file_updated'), + ]) +
    +
    +
    + + + @if($errors->has('attachment_edit_url')) +
    {{ $errors->first('attachment_edit_url') }}
    + @endif +
    +
    +
    + + + +
    \ No newline at end of file diff --git a/resources/views/attachments/manager-link-form.blade.php b/resources/views/attachments/manager-link-form.blade.php new file mode 100644 index 000000000..6f22abb32 --- /dev/null +++ b/resources/views/attachments/manager-link-form.blade.php @@ -0,0 +1,27 @@ +{{-- +@pageId +--}} +
    + +

    {{ trans('entities.attachments_explain_link') }}

    +
    + + + @if($errors->has('attachment_link_name')) +
    {{ $errors->first('attachment_link_name') }}
    + @endif +
    +
    + + + @if($errors->has('attachment_link_url')) +
    {{ $errors->first('attachment_link_url') }}
    + @endif +
    + +
    \ No newline at end of file diff --git a/resources/views/attachments/manager-list.blade.php b/resources/views/attachments/manager-list.blade.php new file mode 100644 index 000000000..313faa575 --- /dev/null +++ b/resources/views/attachments/manager-list.blade.php @@ -0,0 +1,42 @@ +
    + @foreach($attachments as $attachment) +
    +
    @icon('grip')
    + +
    + + +
    + + +
    +
    +
    + @endforeach + @if (count($attachments) === 0) +

    + {{ trans('entities.attachments_no_files') }} +

    + @endif +
    \ No newline at end of file diff --git a/resources/views/attachments/manager.blade.php b/resources/views/attachments/manager.blade.php new file mode 100644 index 000000000..4bfa97608 --- /dev/null +++ b/resources/views/attachments/manager.blade.php @@ -0,0 +1,39 @@ +
    + +

    {{ trans('entities.attachments') }}

    +
    + +
    +

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

    + +
    + +
    + @include('attachments.manager-list', ['attachments' => $page->attachments->all()]) +
    + + +
    + +
    + + + +
    +
    \ No newline at end of file diff --git a/resources/views/books/form.blade.php b/resources/views/books/form.blade.php index a3235036e..840d0604c 100644 --- a/resources/views/books/form.blade.php +++ b/resources/views/books/form.blade.php @@ -31,7 +31,7 @@
    - @include('components.tag-manager', ['entity' => $book ?? null, 'entityType' => 'chapter']) + @include('components.tag-manager', ['entity' => $book ?? null])
    diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php index e3a536fc9..def198bdd 100644 --- a/resources/views/books/show.blade.php +++ b/resources/views/books/show.blade.php @@ -1,9 +1,9 @@ @extends('tri-layout') @section('container-attrs') - id="entity-dashboard" - entity-id="{{ $book->id }}" - entity-type="book" + component="entity-search" + option:entity-search:entity-id="{{ $book->id }}" + option:entity-search:entity-type="book" @stop @section('body') @@ -15,11 +15,11 @@
    -

    {{$book->name}}

    -
    -

    {!! nl2br(e($book->description)) !!}

    +

    {{$book->name}}

    +
    +

    {!! nl2br(e($book->description)) !!}

    @if(count($bookChildren) > 0) -
    +
    @foreach($bookChildren as $childElement) @if($childElement->isA('chapter')) @include('chapters.list-item', ['chapter' => $childElement]) @@ -29,7 +29,7 @@ @endforeach
    @else -
    +

    {{ trans('entities.books_empty_contents') }}

    @@ -52,7 +52,7 @@ @endif
    - @include('partials.entity-dashboard-search-results') + @include('partials.entity-search-results')
    @stop @@ -126,7 +126,7 @@ @section('left') - @include('partials.entity-dashboard-search-box') + @include('partials.entity-search-form', ['label' => trans('entities.books_search_this')]) @if($book->tags->count() > 0)
    diff --git a/resources/views/chapters/form.blade.php b/resources/views/chapters/form.blade.php index cd240e685..60cfe6674 100644 --- a/resources/views/chapters/form.blade.php +++ b/resources/views/chapters/form.blade.php @@ -16,7 +16,7 @@
    - @include('components.tag-manager', ['entity' => isset($chapter)?$chapter:null, 'entityType' => 'chapter']) + @include('components.tag-manager', ['entity' => $chapter ?? null])
    diff --git a/resources/views/chapters/show.blade.php b/resources/views/chapters/show.blade.php index 105cda760..db02ebcc4 100644 --- a/resources/views/chapters/show.blade.php +++ b/resources/views/chapters/show.blade.php @@ -1,9 +1,9 @@ @extends('tri-layout') @section('container-attrs') - id="entity-dashboard" - entity-id="{{ $chapter->id }}" - entity-type="chapter" + component="entity-search" + option:entity-search:entity-id="{{ $chapter->id }}" + option:entity-search:entity-type="chapter" @stop @section('body') @@ -16,17 +16,17 @@
    -

    {{ $chapter->name }}

    -
    -

    {!! nl2br(e($chapter->description)) !!}

    +

    {{ $chapter->name }}

    +
    +

    {!! nl2br(e($chapter->description)) !!}

    @if(count($pages) > 0) -
    +
    @foreach($pages as $page) @include('pages.list-item', ['page' => $page]) @endforeach
    @else -
    +

    {{ trans('entities.chapters_empty') }}

    @@ -49,7 +49,7 @@ @endif
    - @include('partials.entity-dashboard-search-results') + @include('partials.entity-search-results')
    @stop @@ -130,7 +130,7 @@ @section('left') - @include('partials.entity-dashboard-search-box') + @include('partials.entity-search-form', ['label' => trans('entities.chapters_search_this')]) @if($chapter->tags->count() > 0)
    diff --git a/resources/views/comments/comment.blade.php b/resources/views/comments/comment.blade.php index ea96a9250..322477ebd 100644 --- a/resources/views/comments/comment.blade.php +++ b/resources/views/comments/comment.blade.php @@ -27,9 +27,9 @@ @endif @if(userCan('comment-delete', $comment)) -