]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'tinymce' into development
authorDan Brown <redacted>
Tue, 8 Feb 2022 15:28:56 +0000 (15:28 +0000)
committerDan Brown <redacted>
Tue, 8 Feb 2022 15:28:56 +0000 (15:28 +0000)
164 files changed:
.github/workflows/phpstan.yml
.github/workflows/phpunit.yml
.github/workflows/test-migrations.yml
app/Api/ApiDocsGenerator.php
app/Api/ListingResponseBuilder.php
app/Auth/Access/Guards/LdapSessionGuard.php
app/Auth/Access/RegistrationService.php
app/Auth/Role.php
app/Auth/User.php
app/Auth/UserRepo.php
app/Console/Commands/CreateAdmin.php
app/Console/Commands/DeleteUsers.php
app/Entities/Tools/PageContent.php
app/Exceptions/Handler.php
app/Exceptions/NotifyException.php
app/Http/Controllers/Api/ApiController.php
app/Http/Controllers/Api/UserApiController.php [new file with mode: 0644]
app/Http/Controllers/Controller.php
app/Http/Controllers/UserController.php
app/Providers/AuthServiceProvider.php
composer.json
composer.lock
dev/api/requests/users-create.json [new file with mode: 0644]
dev/api/requests/users-delete.json [new file with mode: 0644]
dev/api/requests/users-update.json [new file with mode: 0644]
dev/api/responses/users-create.json [new file with mode: 0644]
dev/api/responses/users-list.json [new file with mode: 0644]
dev/api/responses/users-read.json [new file with mode: 0644]
dev/api/responses/users-update.json [new file with mode: 0644]
dev/docker/Dockerfile
resources/js/wysiwyg/plugin-codeeditor.js
resources/lang/ar/activities.php
resources/lang/ar/settings.php
resources/lang/ar/validation.php
resources/lang/bg/activities.php
resources/lang/bg/settings.php
resources/lang/bg/validation.php
resources/lang/bs/activities.php
resources/lang/bs/settings.php
resources/lang/bs/validation.php
resources/lang/ca/activities.php
resources/lang/ca/settings.php
resources/lang/ca/validation.php
resources/lang/cs/activities.php
resources/lang/cs/settings.php
resources/lang/cs/validation.php
resources/lang/da/activities.php
resources/lang/da/settings.php
resources/lang/da/validation.php
resources/lang/de/activities.php
resources/lang/de/settings.php
resources/lang/de/validation.php
resources/lang/de_informal/activities.php
resources/lang/de_informal/settings.php
resources/lang/de_informal/validation.php
resources/lang/en/activities.php
resources/lang/en/settings.php
resources/lang/en/validation.php
resources/lang/es/activities.php
resources/lang/es/settings.php
resources/lang/es/validation.php
resources/lang/es_AR/activities.php
resources/lang/es_AR/settings.php
resources/lang/es_AR/validation.php
resources/lang/et/activities.php
resources/lang/et/settings.php
resources/lang/et/validation.php
resources/lang/fa/activities.php
resources/lang/fa/settings.php
resources/lang/fa/validation.php
resources/lang/fr/activities.php
resources/lang/fr/common.php
resources/lang/fr/settings.php
resources/lang/fr/validation.php
resources/lang/he/activities.php
resources/lang/he/auth.php
resources/lang/he/common.php
resources/lang/he/entities.php
resources/lang/he/errors.php
resources/lang/he/settings.php
resources/lang/he/validation.php
resources/lang/hr/activities.php
resources/lang/hr/settings.php
resources/lang/hr/validation.php
resources/lang/hu/activities.php
resources/lang/hu/settings.php
resources/lang/hu/validation.php
resources/lang/id/activities.php
resources/lang/id/settings.php
resources/lang/id/validation.php
resources/lang/it/activities.php
resources/lang/it/settings.php
resources/lang/it/validation.php
resources/lang/ja/activities.php
resources/lang/ja/settings.php
resources/lang/ja/validation.php
resources/lang/ko/activities.php
resources/lang/ko/auth.php
resources/lang/ko/common.php
resources/lang/ko/components.php
resources/lang/ko/entities.php
resources/lang/ko/errors.php
resources/lang/ko/passwords.php
resources/lang/ko/settings.php
resources/lang/ko/validation.php
resources/lang/lt/activities.php
resources/lang/lt/settings.php
resources/lang/lt/validation.php
resources/lang/lv/activities.php
resources/lang/lv/common.php
resources/lang/lv/settings.php
resources/lang/lv/validation.php
resources/lang/nb/activities.php
resources/lang/nb/settings.php
resources/lang/nb/validation.php
resources/lang/nl/activities.php
resources/lang/nl/settings.php
resources/lang/nl/validation.php
resources/lang/pl/activities.php
resources/lang/pl/settings.php
resources/lang/pl/validation.php
resources/lang/pt/activities.php
resources/lang/pt/settings.php
resources/lang/pt/validation.php
resources/lang/pt_BR/activities.php
resources/lang/pt_BR/settings.php
resources/lang/pt_BR/validation.php
resources/lang/ru/activities.php
resources/lang/ru/settings.php
resources/lang/ru/validation.php
resources/lang/sk/activities.php
resources/lang/sk/settings.php
resources/lang/sk/validation.php
resources/lang/sl/activities.php
resources/lang/sl/settings.php
resources/lang/sl/validation.php
resources/lang/sv/activities.php
resources/lang/sv/settings.php
resources/lang/sv/validation.php
resources/lang/tr/activities.php
resources/lang/tr/settings.php
resources/lang/tr/validation.php
resources/lang/uk/activities.php
resources/lang/uk/settings.php
resources/lang/uk/validation.php
resources/lang/vi/activities.php
resources/lang/vi/settings.php
resources/lang/vi/validation.php
resources/lang/zh_CN/activities.php
resources/lang/zh_CN/common.php
resources/lang/zh_CN/entities.php
resources/lang/zh_CN/settings.php
resources/lang/zh_CN/validation.php
resources/lang/zh_TW/activities.php
resources/lang/zh_TW/settings.php
resources/lang/zh_TW/validation.php
resources/views/users/parts/language-option-row.blade.php
routes/api.php
tests/Api/AttachmentsApiTest.php
tests/Api/TestsApi.php
tests/Api/UsersApiTest.php [new file with mode: 0644]
tests/Auth/UserInviteTest.php
tests/Entity/PageContentTest.php
tests/User/UserManagementTest.php

index c3a24fda9a9a566e9d8ac28af205f352fd72eadc..d9d84430f628c1b7924cfff33a60b2f8c802e485 100644 (file)
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-20.04
     strategy:
       matrix:
-        php: ['7.3']
+        php: ['7.4']
     steps:
     - uses: actions/checkout@v1
 
index ea72811983c3a8166b9781ebfb02f7016837fee3..5f4ca4ec502cdc41b6406ef4f36c5df780adb16b 100644 (file)
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-20.04
     strategy:
       matrix:
-        php: ['7.3', '7.4', '8.0', '8.1']
+        php: ['7.4', '8.0', '8.1']
     steps:
     - uses: actions/checkout@v1
 
index 7195f75cee63640c39d6269ca67eb54171e77992..864b2837e29bc97aff2909950e007aec2b8cbb89 100644 (file)
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-20.04
     strategy:
       matrix:
-        php: ['7.3', '7.4', '8.0', '8.1']
+        php: ['7.4', '8.0', '8.1']
     steps:
       - uses: actions/checkout@v1
 
index 4cba7900b7942adca030e193647b99f0622dc6c5..76157c9a5c8ad60924fc8907d598526bb05c6f95 100644 (file)
@@ -3,11 +3,13 @@
 namespace BookStack\Api;
 
 use BookStack\Http\Controllers\Api\ApiController;
+use Exception;
 use Illuminate\Contracts\Container\BindingResolutionException;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Route;
 use Illuminate\Support\Str;
+use Illuminate\Validation\Rules\Password;
 use ReflectionClass;
 use ReflectionException;
 use ReflectionMethod;
@@ -100,11 +102,36 @@ class ApiDocsGenerator
             $this->controllerClasses[$className] = $class;
         }
 
-        $rules = $class->getValdationRules()[$methodName] ?? [];
+        $rules = collect($class->getValidationRules()[$methodName] ?? [])->map(function($validations) {
+            return array_map(function($validation) {
+                return $this->getValidationAsString($validation);
+            }, $validations);
+        })->toArray();
 
         return empty($rules) ? null : $rules;
     }
 
+    /**
+     * Convert the given validation message to a readable string.
+     */
+    protected function getValidationAsString($validation): string
+    {
+        if (is_string($validation)) {
+            return $validation;
+        }
+
+        if (is_object($validation) && method_exists($validation, '__toString')) {
+            return strval($validation);
+        }
+
+        if ($validation instanceof Password) {
+            return 'min:8';
+        }
+
+        $class = get_class($validation);
+        throw new Exception("Cannot provide string representation of rule for class: {$class}");
+    }
+
     /**
      * Parse out the description text from a class method comment.
      */
index 02b3f680cf0a3bc1f362313468dfad88ff7401a0..6da92040b4cc4a40679fa46abe2a842b087397eb 100644 (file)
@@ -2,8 +2,10 @@
 
 namespace BookStack\Api;
 
+use BookStack\Model;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 
 class ListingResponseBuilder
@@ -12,6 +14,11 @@ class ListingResponseBuilder
     protected $request;
     protected $fields;
 
+    /**
+     * @var array<callable>
+     */
+    protected $resultModifiers = [];
+
     protected $filterOperators = [
         'eq'   => '=',
         'ne'   => '!=',
@@ -24,6 +31,7 @@ class ListingResponseBuilder
 
     /**
      * ListingResponseBuilder constructor.
+     * The given fields will be forced visible within the model results.
      */
     public function __construct(Builder $query, Request $request, array $fields)
     {
@@ -35,12 +43,16 @@ class ListingResponseBuilder
     /**
      * Get the response from this builder.
      */
-    public function toResponse()
+    public function toResponse(): JsonResponse
     {
         $filteredQuery = $this->filterQuery($this->query);
 
         $total = $filteredQuery->count();
-        $data = $this->fetchData($filteredQuery);
+        $data = $this->fetchData($filteredQuery)->each(function($model) {
+            foreach ($this->resultModifiers as $modifier) {
+                $modifier($model);
+            }
+        });
 
         return response()->json([
             'data'  => $data,
@@ -49,7 +61,16 @@ class ListingResponseBuilder
     }
 
     /**
-     * Fetch the data to return in the response.
+     * Add a callback to modify each element of the results
+     * @param (callable(Model)) $modifier
+     */
+    public function modifyResults($modifier): void
+    {
+        $this->resultModifiers[] = $modifier;
+    }
+
+    /**
+     * Fetch the data to return within the response.
      */
     protected function fetchData(Builder $query): Collection
     {
index 078487224b20b5fa3b547cf536d8c3fb7aa69c22..5a902af7655aa021b37b9faa1425047f2a258005 100644 (file)
@@ -84,7 +84,7 @@ class LdapSessionGuard extends ExternalBaseSessionGuard
             try {
                 $user = $this->createNewFromLdapAndCreds($userDetails, $credentials);
             } catch (UserRegistrationException $exception) {
-                throw new LoginAttemptException($exception->message);
+                throw new LoginAttemptException($exception->getMessage());
             }
         }
 
index dcdb68bd5cd725530ab31cf69c4a6cc382ea39b6..6fcb404ee83bc5023753c8747b1439a398847b5a 100644 (file)
@@ -96,7 +96,8 @@ class RegistrationService
         }
 
         // Create the user
-        $newUser = $this->userRepo->registerNew($userData, $emailConfirmed);
+        $newUser = $this->userRepo->createWithoutActivity($userData, $emailConfirmed);
+        $newUser->attachDefaultRole();
 
         // Assign social account if given
         if ($socialAccount) {
index 71da88e19b1be5200cb4f41dd6396427efd7c65b..51b2ce301eae721fd1a7beb7e0d871f6c522836e 100644 (file)
@@ -28,6 +28,8 @@ class Role extends Model implements Loggable
 
     protected $fillable = ['display_name', 'description', 'external_auth_id'];
 
+    protected $hidden = ['pivot'];
+
     /**
      * The roles that belong to the role.
      */
index f969b351f4a169bab7144c36a3c05c3a3de6af9b..b7f88b59003ff80457ccca05e2dab53c16c30eea 100644 (file)
@@ -72,7 +72,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
      */
     protected $hidden = [
         'password', 'remember_token', 'system_name', 'email_confirmed', 'external_auth_id', 'email',
-        'created_at', 'updated_at', 'image_id',
+        'created_at', 'updated_at', 'image_id', 'roles', 'avatar', 'user_id',
     ];
 
     /**
index ff2e91ee23a8ad8c7b3dfdee003ff741a04db1a4..f9cfc078ed0b6ed62c5fcedd0e09df0b03d6d220 100644 (file)
@@ -2,30 +2,37 @@
 
 namespace BookStack\Auth;
 
+use BookStack\Actions\ActivityType;
+use BookStack\Auth\Access\UserInviteService;
 use BookStack\Entities\EntityProvider;
 use BookStack\Entities\Models\Book;
 use BookStack\Entities\Models\Bookshelf;
 use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Page;
 use BookStack\Exceptions\NotFoundException;
+use BookStack\Exceptions\NotifyException;
 use BookStack\Exceptions\UserUpdateException;
+use BookStack\Facades\Activity;
 use BookStack\Uploads\UserAvatars;
 use Exception;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Pagination\LengthAwarePaginator;
 use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Str;
 
 class UserRepo
 {
     protected $userAvatar;
+    protected $inviteService;
 
     /**
      * UserRepo constructor.
      */
-    public function __construct(UserAvatars $userAvatar)
+    public function __construct(UserAvatars $userAvatar, UserInviteService $inviteService)
     {
         $this->userAvatar = $userAvatar;
+        $this->inviteService = $inviteService;
     }
 
     /**
@@ -53,11 +60,13 @@ class UserRepo
     }
 
     /**
-     * Get all the users with their permissions.
+     * Get all users as Builder for API
      */
-    public function getAllUsers(): Collection
+    public function getApiUsersBuilder(): Builder
     {
-        return User::query()->with('roles', 'avatar')->orderBy('name', 'asc')->get();
+        return User::query()->select(['*'])
+            ->scopes('withLastActivityAt')
+            ->with(['avatar']);
     }
 
     /**
@@ -87,18 +96,6 @@ class UserRepo
         return $query->paginate($count);
     }
 
-    /**
-     * Creates a new user and attaches a role to them.
-     */
-    public function registerNew(array $data, bool $emailConfirmed = false): User
-    {
-        $user = $this->create($data, $emailConfirmed);
-        $user->attachDefaultRole();
-        $this->downloadAndAssignUserAvatar($user);
-
-        return $user;
-    }
-
     /**
      * Assign a user to a system-level role.
      *
@@ -161,23 +158,85 @@ class UserRepo
     }
 
     /**
-     * Create a new basic instance of user.
+     * Create a new basic instance of user with the given pre-validated data.
+     * @param array{name: string, email: string, password: ?string, external_auth_id: ?string, language: ?string, roles: ?array} $data
      */
-    public function create(array $data, bool $emailConfirmed = false): User
+    public function createWithoutActivity(array $data, bool $emailConfirmed = false): User
     {
-        $details = [
-            'name'             => $data['name'],
-            'email'            => $data['email'],
-            'password'         => bcrypt($data['password']),
-            'email_confirmed'  => $emailConfirmed,
-            'external_auth_id' => $data['external_auth_id'] ?? '',
-        ];
-
         $user = new User();
-        $user->forceFill($details);
+        $user->name = $data['name'];
+        $user->email = $data['email'];
+        $user->password = bcrypt(empty($data['password']) ? Str::random(32) : $data['password']);
+        $user->email_confirmed = $emailConfirmed;
+        $user->external_auth_id = $data['external_auth_id'] ?? '';
+
         $user->refreshSlug();
         $user->save();
 
+        if (!empty($data['language'])) {
+            setting()->putUser($user, 'language', $data['language']);
+        }
+
+        if (isset($data['roles'])) {
+            $this->setUserRoles($user, $data['roles']);
+        }
+
+        $this->downloadAndAssignUserAvatar($user);
+
+        return $user;
+    }
+
+    /**
+     * As per "createWithoutActivity" but records a "create" activity.
+     * @param array{name: string, email: string, password: ?string, external_auth_id: ?string, language: ?string, roles: ?array} $data
+     */
+    public function create(array $data, bool $sendInvite = false): User
+    {
+        $user = $this->createWithoutActivity($data, true);
+
+        if ($sendInvite) {
+            $this->inviteService->sendInvitation($user);
+        }
+
+        Activity::add(ActivityType::USER_CREATE, $user);
+        return $user;
+    }
+
+    /**
+     * Update the given user with the given data.
+     * @param array{name: ?string, email: ?string, external_auth_id: ?string, password: ?string, roles: ?array<int>, language: ?string} $data
+     * @throws UserUpdateException
+     */
+    public function update(User $user, array $data, bool $manageUsersAllowed): User
+    {
+        if (!empty($data['name'])) {
+            $user->name = $data['name'];
+            $user->refreshSlug();
+        }
+
+        if (!empty($data['email']) && $manageUsersAllowed) {
+            $user->email = $data['email'];
+        }
+
+        if (!empty($data['external_auth_id']) && $manageUsersAllowed) {
+            $user->external_auth_id = $data['external_auth_id'];
+        }
+
+        if (isset($data['roles']) && $manageUsersAllowed) {
+            $this->setUserRoles($user, $data['roles']);
+        }
+
+        if (!empty($data['password'])) {
+            $user->password = bcrypt($data['password']);
+        }
+
+        if (!empty($data['language'])) {
+            setting()->putUser($user, 'language', $data['language']);
+        }
+
+        $user->save();
+        Activity::add(ActivityType::USER_UPDATE, $user);
+
         return $user;
     }
 
@@ -188,6 +247,8 @@ class UserRepo
      */
     public function destroy(User $user, ?int $newOwnerId = null)
     {
+        $this->ensureDeletable($user);
+
         $user->socialAccounts()->delete();
         $user->apiTokens()->delete();
         $user->favourites()->delete();
@@ -203,6 +264,22 @@ class UserRepo
                 $this->migrateOwnership($user, $newOwner);
             }
         }
+
+        Activity::add(ActivityType::USER_DELETE, $user);
+    }
+
+    /**
+     * @throws NotifyException
+     */
+    protected function ensureDeletable(User $user): void
+    {
+        if ($this->isOnlyAdmin($user)) {
+            throw new NotifyException(trans('errors.users_cannot_delete_only_admin'), $user->getEditUrl());
+        }
+
+        if ($user->system_name === 'public') {
+            throw new NotifyException(trans('errors.users_cannot_delete_guest'), $user->getEditUrl());
+        }
     }
 
     /**
@@ -230,10 +307,10 @@ class UserRepo
         };
 
         return [
-            'pages'    => $query(Page::visible()->where('draft', '=', false)),
+            'pages' => $query(Page::visible()->where('draft', '=', false)),
             'chapters' => $query(Chapter::visible()),
-            'books'    => $query(Book::visible()),
-            'shelves'  => $query(Bookshelf::visible()),
+            'books' => $query(Book::visible()),
+            'shelves' => $query(Bookshelf::visible()),
         ];
     }
 
@@ -245,10 +322,10 @@ class UserRepo
         $createdBy = ['created_by' => $user->id];
 
         return [
-            'pages'       => Page::visible()->where($createdBy)->count(),
-            'chapters'    => Chapter::visible()->where($createdBy)->count(),
-            'books'       => Book::visible()->where($createdBy)->count(),
-            'shelves'     => Bookshelf::visible()->where($createdBy)->count(),
+            'pages' => Page::visible()->where($createdBy)->count(),
+            'chapters' => Chapter::visible()->where($createdBy)->count(),
+            'books' => Book::visible()->where($createdBy)->count(),
+            'shelves' => Bookshelf::visible()->where($createdBy)->count(),
         ];
     }
 
index c3faef79c306a3ed518e3fadb38cb930d4a9878d..c571d383ea92f1866e4632283718f3b3071a15e3 100644 (file)
@@ -84,9 +84,8 @@ class CreateAdmin extends Command
             return SymfonyCommand::FAILURE;
         }
 
-        $user = $this->userRepo->create($validator->validated());
+        $user = $this->userRepo->createWithoutActivity($validator->validated());
         $this->userRepo->attachSystemRole($user, 'admin');
-        $this->userRepo->downloadAndAssignUserAvatar($user);
         $user->email_confirmed = true;
         $user->save();
 
index 5627dd1f80456a7066110833642ed131db4d2d11..bc7263c774228b13cd7c625c10782baee0ed3df0 100644 (file)
@@ -15,8 +15,6 @@ class DeleteUsers extends Command
      */
     protected $signature = 'bookstack:delete-users';
 
-    protected $user;
-
     protected $userRepo;
 
     /**
@@ -26,9 +24,8 @@ class DeleteUsers extends Command
      */
     protected $description = 'Delete users that are not "admin" or system users';
 
-    public function __construct(User $user, UserRepo $userRepo)
+    public function __construct(UserRepo $userRepo)
     {
-        $this->user = $user;
         $this->userRepo = $userRepo;
         parent::__construct();
     }
@@ -38,8 +35,8 @@ class DeleteUsers extends Command
         $confirm = $this->ask('This will delete all users from the system that are not "admin" or system users. Are you sure you want to continue? (Type "yes" to continue)');
         $numDeleted = 0;
         if (strtolower(trim($confirm)) === 'yes') {
-            $totalUsers = $this->user->count();
-            $users = $this->user->where('system_name', '=', null)->with('roles')->get();
+            $totalUsers = User::query()->count();
+            $users = User::query()->whereNull('system_name')->with('roles')->get();
             foreach ($users as $user) {
                 if ($user->hasSystemRole('admin')) {
                     // don't delete users with "admin" role
index b95131fce2e25561c22131d3d81e3dc4d30a8aac..dbb62021cae18c18e5233bb9a04e27da0874c4e3 100644 (file)
@@ -109,15 +109,35 @@ class PageContent
 
     /**
      * Convert all inline base64 content to uploaded image files.
+     * Regex is used to locate the start of data-uri definitions then
+     * manual looping over content is done to parse the whole data uri.
+     * Attempting to capture the whole data uri using regex can cause PHP
+     * PCRE limits to be hit with larger, multi-MB, files.
      */
     protected function extractBase64ImagesFromMarkdown(string $markdown)
     {
         $matches = [];
-        preg_match_all('/!\[.*?]\(.*?(data:image\/.*?)[)"\s]/', $markdown, $matches);
+        $contentLength = strlen($markdown);
+        $replacements = [];
+        preg_match_all('/!\[.*?]\(.*?(data:image\/.{1,6};base64,)/', $markdown, $matches, PREG_OFFSET_CAPTURE);
+
+        foreach ($matches[1] as $base64MatchPair) {
+            [$dataUri, $index] = $base64MatchPair;
+
+            for ($i = strlen($dataUri) + $index; $i < $contentLength; $i++) {
+                $char = $markdown[$i];
+                if ($char === ')' || $char === ' ' || $char === "\n" || $char === '"') {
+                    break;
+                }
+                $dataUri .= $char;
+            }
+
+            $newUrl = $this->base64ImageUriToUploadedImageUrl($dataUri);
+            $replacements[] = [$dataUri, $newUrl];
+        }
 
-        foreach ($matches[1] as $base64Match) {
-            $newUrl = $this->base64ImageUriToUploadedImageUrl($base64Match);
-            $markdown = str_replace($base64Match, $newUrl, $markdown);
+        foreach ($replacements as [$dataUri, $newUrl]) {
+            $markdown = str_replace($dataUri, $newUrl, $markdown);
         }
 
         return $markdown;
index 7ec502525091f487b3a822df9d983a963bf5fde2..317b011d87de92f3369d7b1b3a993efacdd1c864 100644 (file)
@@ -101,6 +101,10 @@ class Handler extends ExceptionHandler
             $code = $e->status;
         }
 
+        if (method_exists($e, 'getStatus')) {
+            $code = $e->getStatus();
+        }
+
         $responseData['error']['code'] = $code;
 
         return new JsonResponse($responseData, $code, $headers);
index 8e748a21dc77ed17301610d6f6e1f877de4ac53e..ced4780900669897d2a9a8b18b5791968287613f 100644 (file)
@@ -9,17 +9,27 @@ class NotifyException extends Exception implements Responsable
 {
     public $message;
     public $redirectLocation;
+    protected $status;
 
     /**
      * NotifyException constructor.
      */
-    public function __construct(string $message, string $redirectLocation = '/')
+    public function __construct(string $message, string $redirectLocation = '/', int $status = 500)
     {
         $this->message = $message;
         $this->redirectLocation = $redirectLocation;
+        $this->status = $status;
         parent::__construct();
     }
 
+    /**
+     * Get the desired status code for this exception.
+     */
+    public function getStatus(): int
+    {
+        return $this->status;
+    }
+
     /**
      * Send the response for this type of exception.
      *
@@ -29,6 +39,11 @@ class NotifyException extends Exception implements Responsable
     {
         $message = $this->getMessage();
 
+        // Front-end JSON handling. API-side handling managed via handler.
+        if ($request->wantsJson()) {
+            return response()->json(['error' => $message], 403);
+        }
+
         if (!empty($message)) {
             session()->flash('error', $message);
         }
index 3f049a08c8afaba8523448137624b80dc078a0d1..9652654be4d79a364d956149943cc266af7a6a18 100644 (file)
@@ -15,10 +15,14 @@ abstract class ApiController extends Controller
      * Provide a paginated listing JSON response in a standard format
      * taking into account any pagination parameters passed by the user.
      */
-    protected function apiListingResponse(Builder $query, array $fields): JsonResponse
+    protected function apiListingResponse(Builder $query, array $fields, array $modifiers = []): JsonResponse
     {
         $listing = new ListingResponseBuilder($query, request(), $fields);
 
+        foreach ($modifiers as $modifier) {
+            $listing->modifyResults($modifier);
+        }
+
         return $listing->toResponse();
     }
 
@@ -26,7 +30,7 @@ abstract class ApiController extends Controller
      * Get the validation rules for this controller.
      * Defaults to a $rules property but can be a rules() method.
      */
-    public function getValdationRules(): array
+    public function getValidationRules(): array
     {
         if (method_exists($this, 'rules')) {
             return $this->rules();
diff --git a/app/Http/Controllers/Api/UserApiController.php b/app/Http/Controllers/Api/UserApiController.php
new file mode 100644 (file)
index 0000000..aa2a248
--- /dev/null
@@ -0,0 +1,164 @@
+<?php
+
+namespace BookStack\Http\Controllers\Api;
+
+use BookStack\Auth\User;
+use BookStack\Auth\UserRepo;
+use BookStack\Exceptions\UserUpdateException;
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Validation\Rules\Password;
+use Illuminate\Validation\Rules\Unique;
+
+class UserApiController extends ApiController
+{
+    protected $userRepo;
+
+    protected $fieldsToExpose = [
+        'email', 'created_at', 'updated_at', 'last_activity_at', 'external_auth_id'
+    ];
+
+    public function __construct(UserRepo $userRepo)
+    {
+        $this->userRepo = $userRepo;
+
+        // Checks for all endpoints in this controller
+        $this->middleware(function ($request, $next) {
+            $this->checkPermission('users-manage');
+            $this->preventAccessInDemoMode();
+            return $next($request);
+        });
+    }
+
+    protected function rules(int $userId = null): array
+    {
+        return [
+            'create' => [
+                'name' => ['required', 'min:2'],
+                'email' => [
+                    'required', 'min:2', 'email', new Unique('users', 'email')
+                ],
+                'external_auth_id' => ['string'],
+                'language' => ['string'],
+                'password' => [Password::default()],
+                'roles' => ['array'],
+                'roles.*' => ['integer'],
+                'send_invite' => ['boolean'],
+            ],
+            'update' => [
+                'name' => ['min:2'],
+                'email' => [
+                    'min:2',
+                    'email',
+                    (new Unique('users', 'email'))->ignore($userId ?? null)
+                ],
+                'external_auth_id' => ['string'],
+                'language' => ['string'],
+                'password' => [Password::default()],
+                'roles' => ['array'],
+                'roles.*' => ['integer'],
+            ],
+            'delete' => [
+                'migrate_ownership_id' => ['integer', 'exists:users,id'],
+            ],
+        ];
+    }
+
+    /**
+     * Get a listing of users in the system.
+     * Requires permission to manage users.
+     */
+    public function list()
+    {
+        $users = $this->userRepo->getApiUsersBuilder();
+
+        return $this->apiListingResponse($users, [
+            'id', 'name', 'slug', 'email', 'external_auth_id',
+            'created_at', 'updated_at', 'last_activity_at',
+        ], [Closure::fromCallable([$this, 'listFormatter'])]);
+    }
+
+    /**
+     * Create a new user in the system.
+     * Requires permission to manage users.
+     */
+    public function create(Request $request)
+    {
+        $data = $this->validate($request, $this->rules()['create']);
+        $sendInvite = ($data['send_invite'] ?? false) === true;
+
+        $user = null;
+        DB::transaction(function () use ($data, $sendInvite, &$user) {
+            $user = $this->userRepo->create($data, $sendInvite);
+        });
+
+        $this->singleFormatter($user);
+
+        return response()->json($user);
+    }
+
+    /**
+     * View the details of a single user.
+     * Requires permission to manage users.
+     */
+    public function read(string $id)
+    {
+        $user = $this->userRepo->getById($id);
+        $this->singleFormatter($user);
+
+        return response()->json($user);
+    }
+
+    /**
+     * Update an existing user in the system.
+     * Requires permission to manage users.
+     * @throws UserUpdateException
+     */
+    public function update(Request $request, string $id)
+    {
+        $data = $this->validate($request, $this->rules($id)['update']);
+        $user = $this->userRepo->getById($id);
+        $this->userRepo->update($user, $data, userCan('users-manage'));
+        $this->singleFormatter($user);
+
+        return response()->json($user);
+    }
+
+    /**
+     * Delete a user from the system.
+     * Can optionally accept a user id via `migrate_ownership_id` to indicate
+     * who should be the new owner of their related content.
+     * Requires permission to manage users.
+     */
+    public function delete(Request $request, string $id)
+    {
+        $user = $this->userRepo->getById($id);
+        $newOwnerId = $request->get('migrate_ownership_id', null);
+
+        $this->userRepo->destroy($user, $newOwnerId);
+
+        return response('', 204);
+    }
+
+    /**
+     * Format the given user model for single-result display.
+     */
+    protected function singleFormatter(User $user)
+    {
+        $this->listFormatter($user);
+        $user->load('roles:id,display_name');
+        $user->makeVisible(['roles']);
+    }
+
+    /**
+     * Format the given user model for a listing multi-result display.
+     */
+    protected function listFormatter(User $user)
+    {
+        $user->makeVisible($this->fieldsToExpose);
+        $user->setAttribute('profile_url', $user->getProfileUrl());
+        $user->setAttribute('edit_url', $user->getEditUrl());
+        $user->setAttribute('avatar_url', $user->getAvatar());
+    }
+}
index 2c4c2df1e384e2b2b433062d82d82aa959c3e1c8..13a86f6f7c78672ef99cdab9dedb566d1b148cec 100644 (file)
@@ -2,13 +2,13 @@
 
 namespace BookStack\Http\Controllers;
 
+use BookStack\Exceptions\NotifyException;
 use BookStack\Facades\Activity;
 use BookStack\Interfaces\Loggable;
 use BookStack\Model;
 use BookStack\Util\WebSafeMimeSniffer;
 use Illuminate\Foundation\Bus\DispatchesJobs;
 use Illuminate\Foundation\Validation\ValidatesRequests;
-use Illuminate\Http\Exceptions\HttpResponseException;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Response;
 use Illuminate\Routing\Controller as BaseController;
@@ -53,14 +53,8 @@ abstract class Controller extends BaseController
      */
     protected function showPermissionError()
     {
-        if (request()->wantsJson()) {
-            $response = response()->json(['error' => trans('errors.permissionJson')], 403);
-        } else {
-            $response = redirect('/');
-            $this->showErrorNotification(trans('errors.permission'));
-        }
-
-        throw new HttpResponseException($response);
+        $message = request()->wantsJson() ? trans('errors.permissionJson') : trans('errors.permission');
+        throw new NotifyException($message, '/', 403);
     }
 
     /**
index 3903682eb41a2f11179a89b6abcdff9bcfc572a5..3b443aa81e029a3b4a102ca38c9a38336d164a61 100644 (file)
@@ -2,9 +2,7 @@
 
 namespace BookStack\Http\Controllers;
 
-use BookStack\Actions\ActivityType;
 use BookStack\Auth\Access\SocialAuthService;
-use BookStack\Auth\Access\UserInviteService;
 use BookStack\Auth\User;
 use BookStack\Auth\UserRepo;
 use BookStack\Exceptions\ImageUploadException;
@@ -13,25 +11,20 @@ use BookStack\Uploads\ImageRepo;
 use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
-use Illuminate\Support\Str;
 use Illuminate\Validation\Rules\Password;
 use Illuminate\Validation\ValidationException;
 
 class UserController extends Controller
 {
-    protected $user;
     protected $userRepo;
-    protected $inviteService;
     protected $imageRepo;
 
     /**
      * UserController constructor.
      */
-    public function __construct(User $user, UserRepo $userRepo, UserInviteService $inviteService, ImageRepo $imageRepo)
+    public function __construct(UserRepo $userRepo, ImageRepo $imageRepo)
     {
-        $this->user = $user;
         $this->userRepo = $userRepo;
-        $this->inviteService = $inviteService;
         $this->imageRepo = $imageRepo;
     }
 
@@ -68,63 +61,34 @@ class UserController extends Controller
     }
 
     /**
-     * Store a newly created user in storage.
+     * Store a new user in storage.
      *
-     * @throws UserUpdateException
      * @throws ValidationException
      */
     public function store(Request $request)
     {
         $this->checkPermission('users-manage');
-        $validationRules = [
-            'name'    => ['required'],
-            'email'   => ['required', 'email', 'unique:users,email'],
-            'setting' => ['array'],
-        ];
 
         $authMethod = config('auth.method');
         $sendInvite = ($request->get('send_invite', 'false') === 'true');
+        $externalAuth = $authMethod === 'ldap' || $authMethod === 'saml2' || $authMethod === 'oidc';
+        $passwordRequired = ($authMethod === 'standard' && !$sendInvite);
 
-        if ($authMethod === 'standard' && !$sendInvite) {
-            $validationRules['password'] = ['required', Password::default()];
-            $validationRules['password-confirm'] = ['required', 'same:password'];
-        } elseif ($authMethod === 'ldap' || $authMethod === 'saml2' || $authMethod === 'openid') {
-            $validationRules['external_auth_id'] = ['required'];
-        }
-        $this->validate($request, $validationRules);
-
-        $user = $this->user->fill($request->all());
-
-        if ($authMethod === 'standard') {
-            $user->password = bcrypt($request->get('password', Str::random(32)));
-        } elseif ($authMethod === 'ldap' || $authMethod === 'saml2' || $authMethod === 'openid') {
-            $user->external_auth_id = $request->get('external_auth_id');
-        }
-
-        $user->refreshSlug();
-
-        DB::transaction(function () use ($user, $sendInvite, $request) {
-            $user->save();
-
-            // Save user-specific settings
-            if ($request->filled('setting')) {
-                foreach ($request->get('setting') as $key => $value) {
-                    setting()->putUser($user, $key, $value);
-                }
-            }
-
-            if ($sendInvite) {
-                $this->inviteService->sendInvitation($user);
-            }
-
-            if ($request->filled('roles')) {
-                $roles = $request->get('roles');
-                $this->userRepo->setUserRoles($user, $roles);
-            }
+        $validationRules = [
+            'name'    => ['required'],
+            'email'   => ['required', 'email', 'unique:users,email'],
+            'language' => ['string'],
+            'roles'            => ['array'],
+            'roles.*'          => ['integer'],
+            'password' => $passwordRequired ? ['required', Password::default()] : null,
+            'password-confirm' => $passwordRequired ? ['required', 'same:password'] : null,
+            'external_auth_id' => $externalAuth ? ['required'] : null,
+        ];
 
-            $this->userRepo->downloadAndAssignUserAvatar($user);
+        $validated = $this->validate($request, array_filter($validationRules));
 
-            $this->logActivity(ActivityType::USER_CREATE, $user);
+        DB::transaction(function () use ($validated, $sendInvite) {
+            $this->userRepo->create($validated, $sendInvite);
         });
 
         return redirect('/settings/users');
@@ -138,7 +102,7 @@ class UserController extends Controller
         $this->checkPermissionOrCurrentUser('users-manage', $id);
 
         /** @var User $user */
-        $user = $this->user->newQuery()->with(['apiTokens', 'mfaValues'])->findOrFail($id);
+        $user = User::query()->with(['apiTokens', 'mfaValues'])->findOrFail($id);
 
         $authMethod = ($user->system_name) ? 'system' : config('auth.method');
 
@@ -168,51 +132,20 @@ class UserController extends Controller
         $this->preventAccessInDemoMode();
         $this->checkPermissionOrCurrentUser('users-manage', $id);
 
-        $this->validate($request, [
+        $validated = $this->validate($request, [
             'name'             => ['min:2'],
             'email'            => ['min:2', 'email', 'unique:users,email,' . $id],
             'password'         => ['required_with:password_confirm', Password::default()],
             'password-confirm' => ['same:password', 'required_with:password'],
-            'setting'          => ['array'],
+            'language'         => ['string'],
+            'roles'            => ['array'],
+            'roles.*'          => ['integer'],
+            'external_auth_id' => ['string'],
             'profile_image'    => array_merge(['nullable'], $this->getImageValidationRules()),
         ]);
 
         $user = $this->userRepo->getById($id);
-        $user->fill($request->except(['email']));
-
-        // Email updates
-        if (userCan('users-manage') && $request->filled('email')) {
-            $user->email = $request->get('email');
-        }
-
-        // Refresh the slug if the user's name has changed
-        if ($user->isDirty('name')) {
-            $user->refreshSlug();
-        }
-
-        // Role updates
-        if (userCan('users-manage') && $request->filled('roles')) {
-            $roles = $request->get('roles');
-            $this->userRepo->setUserRoles($user, $roles);
-        }
-
-        // Password updates
-        if ($request->filled('password')) {
-            $password = $request->get('password');
-            $user->password = bcrypt($password);
-        }
-
-        // External auth id updates
-        if (user()->can('users-manage') && $request->filled('external_auth_id')) {
-            $user->external_auth_id = $request->get('external_auth_id');
-        }
-
-        // Save user-specific settings
-        if ($request->filled('setting')) {
-            foreach ($request->get('setting') as $key => $value) {
-                setting()->putUser($user, $key, $value);
-            }
-        }
+        $this->userRepo->update($user, $validated, userCan('users-manage'));
 
         // Save profile image if in request
         if ($request->hasFile('profile_image')) {
@@ -220,6 +153,7 @@ class UserController extends Controller
             $this->imageRepo->destroyImage($user->avatar);
             $image = $this->imageRepo->saveNew($imageUpload, 'user', $user->id);
             $user->image_id = $image->id;
+            $user->save();
         }
 
         // Delete the profile image if reset option is in request
@@ -227,11 +161,7 @@ class UserController extends Controller
             $this->imageRepo->destroyImage($user->avatar);
         }
 
-        $user->save();
-        $this->showSuccessNotification(trans('settings.users_edit_success'));
-        $this->logActivity(ActivityType::USER_UPDATE, $user);
-
-        $redirectUrl = userCan('users-manage') ? '/settings/users' : ('/settings/users/' . $user->id);
+        $redirectUrl = userCan('users-manage') ? '/settings/users' : "/settings/users/{$user->id}";
 
         return redirect($redirectUrl);
     }
@@ -262,21 +192,7 @@ class UserController extends Controller
         $user = $this->userRepo->getById($id);
         $newOwnerId = $request->get('new_owner_id', null);
 
-        if ($this->userRepo->isOnlyAdmin($user)) {
-            $this->showErrorNotification(trans('errors.users_cannot_delete_only_admin'));
-
-            return redirect($user->getEditUrl());
-        }
-
-        if ($user->system_name === 'public') {
-            $this->showErrorNotification(trans('errors.users_cannot_delete_guest'));
-
-            return redirect($user->getEditUrl());
-        }
-
         $this->userRepo->destroy($user, $newOwnerId);
-        $this->showSuccessNotification(trans('settings.users_delete_success'));
-        $this->logActivity(ActivityType::USER_DELETE, $user);
 
         return redirect('/settings/users');
     }
@@ -361,7 +277,7 @@ class UserController extends Controller
 
         $newState = $request->get('expand', 'false');
 
-        $user = $this->user->findOrFail($id);
+        $user = $this->userRepo->getById($id);
         setting()->putUser($user, 'section_expansion#' . $key, $newState);
 
         return response('', 204);
@@ -384,7 +300,7 @@ class UserController extends Controller
             $order = 'asc';
         }
 
-        $user = $this->user->findOrFail($userId);
+        $user = $this->userRepo->getById($userId);
         $sortKey = $listName . '_sort';
         $orderKey = $listName . '_sort_order';
         setting()->putUser($user, $sortKey, $sort);
index b301604a519e9b95e5bf5881f7a93c0f78cfb88e..a4022cc500968da5fcc4aa5973517a9375749082 100644 (file)
@@ -23,6 +23,7 @@ class AuthServiceProvider extends ServiceProvider
     public function boot()
     {
         // Password Configuration
+        // Changes here must be reflected in ApiDocsGenerate@getValidationAsString.
         Password::defaults(function () {
             return Password::min(8);
         });
index d4bd02d74604799f2472fe17b4a346fdd1dbf9bb..e6d01a4ad3d382064f99d95d48c1a474ea1a795c 100644 (file)
@@ -8,7 +8,7 @@
     "license": "MIT",
     "type": "project",
     "require": {
-        "php": "^7.3|^8.0",
+        "php": "^7.4|^8.0",
         "ext-curl": "*",
         "ext-dom": "*",
         "ext-fileinfo": "*",
@@ -95,7 +95,7 @@
         "preferred-install": "dist",
         "sort-packages": true,
         "platform": {
-            "php": "7.3.0"
+            "php": "7.4.0"
         }
     },
     "extra": {
index 9517c9e2bd2c27aa246acf28243204c3460b02c3..e3949a5f0682f9063e2ad3b060ee55491f57c912 100644 (file)
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "2eead2f6889d5a411e5db8a456c43ddc",
+    "content-hash": "1ee5ee0e7e5c8fbbb16704ba6f003a09",
     "packages": [
         {
             "name": "aws/aws-crt-php",
         },
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.209.11",
+            "version": "3.209.17",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "9f9591bff3dc0b2bc5400eb81e2e22228f2e4c95"
+                "reference": "3ed5a5ff379e518a4e8c089e412207774daa25e7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9f9591bff3dc0b2bc5400eb81e2e22228f2e4c95",
-                "reference": "9f9591bff3dc0b2bc5400eb81e2e22228f2e4c95",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3ed5a5ff379e518a4e8c089e412207774daa25e7",
+                "reference": "3ed5a5ff379e518a4e8c089e412207774daa25e7",
                 "shasum": ""
             },
             "require": {
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "Aws\\": "src/"
-                },
                 "files": [
                     "src/functions.php"
-                ]
+                ],
+                "psr-4": {
+                    "Aws\\": "src/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
             "support": {
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
-                "source": "https://github.com/aws/aws-sdk-php/tree/3.209.11"
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.209.17"
             },
-            "time": "2022-01-24T19:15:49+00:00"
+            "time": "2022-02-03T19:19:22+00:00"
         },
         {
             "name": "bacon/bacon-qr-code",
-            "version": "2.0.4",
+            "version": "2.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Bacon/BaconQrCode.git",
-                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09"
+                "reference": "7190fc6c20370e0e93da6717b182b8249d5b8e71"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
-                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
+                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/7190fc6c20370e0e93da6717b182b8249d5b8e71",
+                "reference": "7190fc6c20370e0e93da6717b182b8249d5b8e71",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.1 || ^8.0"
             },
             "require-dev": {
-                "phly/keep-a-changelog": "^1.4",
+                "phly/keep-a-changelog": "^2.1",
                 "phpunit/phpunit": "^7 | ^8 | ^9",
+                "spatie/phpunit-snapshot-assertions": "^4.2.9",
                 "squizlabs/php_codesniffer": "^3.4"
             },
             "suggest": {
             "homepage": "https://github.com/Bacon/BaconQrCode",
             "support": {
                 "issues": "https://github.com/Bacon/BaconQrCode/issues",
-                "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.4"
+                "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.5"
             },
-            "time": "2021-06-18T13:26:35+00:00"
+            "time": "2022-01-31T00:43:09+00:00"
         },
         {
             "name": "barryvdh/laravel-dompdf",
         },
         {
             "name": "doctrine/dbal",
-            "version": "3.3.0",
+            "version": "3.3.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/dbal.git",
-                "reference": "a4b37db6f186b6843474189b424aed6a7cc5de4b"
+                "reference": "5b6eb6c8ce65ebdc60b0c0960a676cf76758dbf2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/dbal/zipball/a4b37db6f186b6843474189b424aed6a7cc5de4b",
-                "reference": "a4b37db6f186b6843474189b424aed6a7cc5de4b",
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b6eb6c8ce65ebdc60b0c0960a676cf76758dbf2",
+                "reference": "5b6eb6c8ce65ebdc60b0c0960a676cf76758dbf2",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/doctrine/dbal/issues",
-                "source": "https://github.com/doctrine/dbal/tree/3.3.0"
+                "source": "https://github.com/doctrine/dbal/tree/3.3.1"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-18T00:13:52+00:00"
+            "time": "2022-01-30T17:50:59+00:00"
         },
         {
             "name": "doctrine/deprecations",
         },
         {
             "name": "laravel/framework",
-            "version": "v8.80.0",
+            "version": "v8.82.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "8949a2e46b0f274f39c61eee8d5de1dc6a1f686b"
+                "reference": "411d5243c58cbf12b0fc89cab1ceb50088968c27"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/8949a2e46b0f274f39c61eee8d5de1dc6a1f686b",
-                "reference": "8949a2e46b0f274f39c61eee8d5de1dc6a1f686b",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/411d5243c58cbf12b0fc89cab1ceb50088968c27",
+                "reference": "411d5243c58cbf12b0fc89cab1ceb50088968c27",
                 "shasum": ""
             },
             "require": {
                 "symfony/var-dumper": "^5.4",
                 "tijsverkoyen/css-to-inline-styles": "^2.2.2",
                 "vlucas/phpdotenv": "^5.4.1",
-                "voku/portable-ascii": "^1.4.8"
+                "voku/portable-ascii": "^1.6.1"
             },
             "conflict": {
                 "tightenco/collect": "<5.5.33"
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
             },
-            "time": "2022-01-18T15:51:42+00:00"
+            "time": "2022-02-01T16:13:57+00:00"
         },
         {
             "name": "laravel/serializable-closure",
-            "version": "v1.0.5",
+            "version": "v1.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/serializable-closure.git",
-                "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c"
+                "reference": "65c9faf50d567b65d81764a44526545689e3fe63"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/25de3be1bca1b17d52ff0dc02b646c667ac7266c",
-                "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c",
+                "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/65c9faf50d567b65d81764a44526545689e3fe63",
+                "reference": "65c9faf50d567b65d81764a44526545689e3fe63",
                 "shasum": ""
             },
             "require": {
                 "issues": "https://github.com/laravel/serializable-closure/issues",
                 "source": "https://github.com/laravel/serializable-closure"
             },
-            "time": "2021-11-30T15:53:04+00:00"
+            "time": "2022-02-01T16:29:39+00:00"
         },
         {
             "name": "laravel/socialite",
-            "version": "v5.3.0",
+            "version": "v5.5.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/socialite.git",
-                "reference": "4e6f7e40de9a54ad641de5b8e29cdf1e73842e10"
+                "reference": "cb5b5538c207efa19aa5d7f46cd76acb03ec3055"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/socialite/zipball/4e6f7e40de9a54ad641de5b8e29cdf1e73842e10",
-                "reference": "4e6f7e40de9a54ad641de5b8e29cdf1e73842e10",
+                "url": "https://api.github.com/repos/laravel/socialite/zipball/cb5b5538c207efa19aa5d7f46cd76acb03ec3055",
+                "reference": "cb5b5538c207efa19aa5d7f46cd76acb03ec3055",
                 "shasum": ""
             },
             "require": {
                 "issues": "https://github.com/laravel/socialite/issues",
                 "source": "https://github.com/laravel/socialite"
             },
-            "time": "2022-01-12T18:05:39+00:00"
+            "time": "2022-02-01T16:31:36+00:00"
         },
         {
             "name": "laravel/tinker",
         },
         {
             "name": "laravel/ui",
-            "version": "v3.4.1",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/ui.git",
-                "reference": "9a1e52442dd238647905b98d773d59e438eb9f9d"
+                "reference": "e01198123f7f4369d13c1f83a897c3f5e97fc9f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/ui/zipball/9a1e52442dd238647905b98d773d59e438eb9f9d",
-                "reference": "9a1e52442dd238647905b98d773d59e438eb9f9d",
+                "url": "https://api.github.com/repos/laravel/ui/zipball/e01198123f7f4369d13c1f83a897c3f5e97fc9f4",
+                "reference": "e01198123f7f4369d13c1f83a897c3f5e97fc9f4",
                 "shasum": ""
             },
             "require": {
                 "ui"
             ],
             "support": {
-                "source": "https://github.com/laravel/ui/tree/v3.4.1"
+                "source": "https://github.com/laravel/ui/tree/v3.4.2"
             },
-            "time": "2021-12-22T10:40:50+00:00"
+            "time": "2022-01-25T20:15:56+00:00"
         },
         {
             "name": "league/commonmark",
         },
         {
             "name": "opis/closure",
-            "version": "3.6.2",
+            "version": "3.6.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/opis/closure.git",
-                "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6"
+                "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6",
-                "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6",
+                "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad",
+                "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/opis/closure/issues",
-                "source": "https://github.com/opis/closure/tree/3.6.2"
+                "source": "https://github.com/opis/closure/tree/3.6.3"
             },
-            "time": "2021-04-09T13:42:10+00:00"
+            "time": "2022-01-27T09:35:39+00:00"
         },
         {
             "name": "paragonie/constant_time_encoding",
         },
         {
             "name": "phenx/php-svg-lib",
-            "version": "v0.3.3",
+            "version": "0.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PhenX/php-svg-lib.git",
-                "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32"
+                "reference": "f627771eb854aa7f45f80add0f23c6c4d67ea0f2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
-                "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
+                "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/f627771eb854aa7f45f80add0f23c6c4d67ea0f2",
+                "reference": "f627771eb854aa7f45f80add0f23c6c4d67ea0f2",
                 "shasum": ""
             },
             "require": {
+                "php": "^7.4 || ^8.0",
                 "sabberworm/php-css-parser": "^8.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^5.5|^6.5"
+                "phpunit/phpunit": "^9.5"
             },
             "type": "library",
             "autoload": {
             "homepage": "https://github.com/PhenX/php-svg-lib",
             "support": {
                 "issues": "https://github.com/PhenX/php-svg-lib/issues",
-                "source": "https://github.com/PhenX/php-svg-lib/tree/master"
+                "source": "https://github.com/PhenX/php-svg-lib/tree/0.3.4"
             },
-            "time": "2019-09-11T20:02:13+00:00"
+            "time": "2021-10-18T02:13:32+00:00"
         },
         {
             "name": "phpoption/phpoption",
         },
         {
             "name": "phpseclib/phpseclib",
-            "version": "3.0.12",
+            "version": "3.0.13",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpseclib/phpseclib.git",
-                "reference": "89bfb45bd8b1abc3b37e910d57f5dbd3174f40fb"
+                "reference": "1443ab79364eea48665fa8c09ac67f37d1025f7e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/89bfb45bd8b1abc3b37e910d57f5dbd3174f40fb",
-                "reference": "89bfb45bd8b1abc3b37e910d57f5dbd3174f40fb",
+                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/1443ab79364eea48665fa8c09ac67f37d1025f7e",
+                "reference": "1443ab79364eea48665fa8c09ac67f37d1025f7e",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/phpseclib/phpseclib/issues",
-                "source": "https://github.com/phpseclib/phpseclib/tree/3.0.12"
+                "source": "https://github.com/phpseclib/phpseclib/tree/3.0.13"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-11-28T23:46:03+00:00"
+            "time": "2022-01-30T08:50:05+00:00"
         },
         {
             "name": "pragmarx/google2fa",
         },
         {
             "name": "psr/container",
-            "version": "1.1.1",
+            "version": "1.1.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/container.git",
-                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
-                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
                 "shasum": ""
             },
             "require": {
-                "php": ">=7.2.0"
+                "php": ">=7.4.0"
             },
             "type": "library",
             "autoload": {
             ],
             "support": {
                 "issues": "https://github.com/php-fig/container/issues",
-                "source": "https://github.com/php-fig/container/tree/1.1.1"
+                "source": "https://github.com/php-fig/container/tree/1.1.2"
             },
-            "time": "2021-03-05T17:36:06+00:00"
+            "time": "2021-11-05T16:50:12+00:00"
         },
         {
             "name": "psr/event-dispatcher",
         },
         {
             "name": "symfony/console",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "a2c6b7ced2eb7799a35375fb9022519282b5405e"
+                "reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/a2c6b7ced2eb7799a35375fb9022519282b5405e",
-                "reference": "a2c6b7ced2eb7799a35375fb9022519282b5405e",
+                "url": "https://api.github.com/repos/symfony/console/zipball/a2a86ec353d825c75856c6fd14fac416a7bdb6b8",
+                "reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8",
                 "shasum": ""
             },
             "require": {
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v5.4.2"
+                "source": "https://github.com/symfony/console/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-20T16:11:12+00:00"
+            "time": "2022-01-26T16:28:35+00:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "cfcbee910e159df402603502fe387e8b677c22fd"
+                "reference": "b0a190285cd95cb019237851205b8140ef6e368e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/cfcbee910e159df402603502fe387e8b677c22fd",
-                "reference": "cfcbee910e159df402603502fe387e8b677c22fd",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e",
+                "reference": "b0a190285cd95cb019237851205b8140ef6e368e",
                 "shasum": ""
             },
             "require": {
             "description": "Converts CSS selectors to XPath expressions",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/css-selector/tree/v5.4.2"
+                "source": "https://github.com/symfony/css-selector/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-16T21:58:21+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
         },
         {
             "name": "symfony/error-handler",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "e0c0dd0f9d4120a20158fc9aec2367d07d38bc56"
+                "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/e0c0dd0f9d4120a20158fc9aec2367d07d38bc56",
-                "reference": "e0c0dd0f9d4120a20158fc9aec2367d07d38bc56",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5",
+                "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5",
                 "shasum": ""
             },
             "require": {
             "description": "Provides tools to manage errors and ease debugging PHP code",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/error-handler/tree/v5.4.2"
+                "source": "https://github.com/symfony/error-handler/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-19T20:02:00+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v5.4.0",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "27d39ae126352b9fa3be5e196ccf4617897be3eb"
+                "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/27d39ae126352b9fa3be5e196ccf4617897be3eb",
-                "reference": "27d39ae126352b9fa3be5e196ccf4617897be3eb",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d",
+                "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d",
                 "shasum": ""
             },
             "require": {
             "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.0"
+                "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-11-23T10:19:22+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
         },
         {
             "name": "symfony/finder",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "e77046c252be48c48a40816187ed527703c8f76c"
+                "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/e77046c252be48c48a40816187ed527703c8f76c",
-                "reference": "e77046c252be48c48a40816187ed527703c8f76c",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d",
+                "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d",
                 "shasum": ""
             },
             "require": {
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v5.4.2"
+                "source": "https://github.com/symfony/finder/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-15T11:06:13+00:00"
+            "time": "2022-01-26T16:34:36+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "ce952af52877eaf3eab5d0c08cc0ea865ed37313"
+                "reference": "ef409ff341a565a3663157d4324536746d49a0c7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce952af52877eaf3eab5d0c08cc0ea865ed37313",
-                "reference": "ce952af52877eaf3eab5d0c08cc0ea865ed37313",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ef409ff341a565a3663157d4324536746d49a0c7",
+                "reference": "ef409ff341a565a3663157d4324536746d49a0c7",
                 "shasum": ""
             },
             "require": {
             "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-foundation/tree/v5.4.2"
+                "source": "https://github.com/symfony/http-foundation/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-28T17:15:56+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v5.4.2",
+            "version": "v5.4.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "35b7e9868953e0d1df84320bb063543369e43ef5"
+                "reference": "49f40347228c773688a0488feea0175aa7f4d268"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/35b7e9868953e0d1df84320bb063543369e43ef5",
-                "reference": "35b7e9868953e0d1df84320bb063543369e43ef5",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/49f40347228c773688a0488feea0175aa7f4d268",
+                "reference": "49f40347228c773688a0488feea0175aa7f4d268",
                 "shasum": ""
             },
             "require": {
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v5.4.2"
+                "source": "https://github.com/symfony/http-kernel/tree/v5.4.4"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-29T13:20:26+00:00"
+            "time": "2022-01-29T18:08:07+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "1bfd938cf9562822c05c4d00e8f92134d3c8e42d"
+                "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/1bfd938cf9562822c05c4d00e8f92134d3c8e42d",
-                "reference": "1bfd938cf9562822c05c4d00e8f92134d3c8e42d",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/e1503cfb5c9a225350f549d3bb99296f4abfb80f",
+                "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f",
                 "shasum": ""
             },
             "require": {
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v5.4.2"
+                "source": "https://github.com/symfony/mime/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-28T17:15:56+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
         },
         {
             "name": "symfony/process",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "2b3ba8722c4aaf3e88011be5e7f48710088fb5e4"
+                "reference": "553f50487389a977eb31cf6b37faae56da00f753"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/2b3ba8722c4aaf3e88011be5e7f48710088fb5e4",
-                "reference": "2b3ba8722c4aaf3e88011be5e7f48710088fb5e4",
+                "url": "https://api.github.com/repos/symfony/process/zipball/553f50487389a977eb31cf6b37faae56da00f753",
+                "reference": "553f50487389a977eb31cf6b37faae56da00f753",
                 "shasum": ""
             },
             "require": {
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v5.4.2"
+                "source": "https://github.com/symfony/process/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-27T21:01:00+00:00"
+            "time": "2022-01-26T16:28:35+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v5.4.0",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1"
+                "reference": "44b29c7a94e867ccde1da604792f11a469958981"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/9eeae93c32ca86746e5d38f3679e9569981038b1",
-                "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981",
+                "reference": "44b29c7a94e867ccde1da604792f11a469958981",
                 "shasum": ""
             },
             "require": {
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v5.4.0"
+                "source": "https://github.com/symfony/routing/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-11-23T10:19:22+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/service-contracts",
         },
         {
             "name": "symfony/string",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "e6a5d5ecf6589c5247d18e0e74e30b11dfd51a3d"
+                "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/e6a5d5ecf6589c5247d18e0e74e30b11dfd51a3d",
-                "reference": "e6a5d5ecf6589c5247d18e0e74e30b11dfd51a3d",
+                "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10",
+                "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10",
                 "shasum": ""
             },
             "require": {
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v5.4.2"
+                "source": "https://github.com/symfony/string/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-16T21:52:00+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/translation",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "ff8bb2107b6a549dc3c5dd9c498dcc82c9c098ca"
+                "reference": "a9dd7403232c61e87e27fb306bbcd1627f245d70"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/ff8bb2107b6a549dc3c5dd9c498dcc82c9c098ca",
-                "reference": "ff8bb2107b6a549dc3c5dd9c498dcc82c9c098ca",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/a9dd7403232c61e87e27fb306bbcd1627f245d70",
+                "reference": "a9dd7403232c61e87e27fb306bbcd1627f245d70",
                 "shasum": ""
             },
             "require": {
             "description": "Provides tools to internationalize your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/translation/tree/v5.4.2"
+                "source": "https://github.com/symfony/translation/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-25T19:45:36+00:00"
+            "time": "2022-01-07T00:28:17+00:00"
         },
         {
             "name": "symfony/translation-contracts",
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "1b56c32c3679002b3a42384a580e16e2600f41c1"
+                "reference": "970a01f208bf895c5f327ba40b72288da43adec4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1b56c32c3679002b3a42384a580e16e2600f41c1",
-                "reference": "1b56c32c3679002b3a42384a580e16e2600f41c1",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/970a01f208bf895c5f327ba40b72288da43adec4",
+                "reference": "970a01f208bf895c5f327ba40b72288da43adec4",
                 "shasum": ""
             },
             "require": {
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v5.4.2"
+                "source": "https://github.com/symfony/var-dumper/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-29T10:10:35+00:00"
+            "time": "2022-01-17T16:30:37+00:00"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
         },
         {
             "name": "composer/semver",
-            "version": "3.2.7",
+            "version": "3.2.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/semver.git",
-                "reference": "deac27056b57e46faf136fae7b449eeaa71661ee"
+                "reference": "3976a9e563da06e8dd8ca856fa2adcd66cdd98f3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/semver/zipball/deac27056b57e46faf136fae7b449eeaa71661ee",
-                "reference": "deac27056b57e46faf136fae7b449eeaa71661ee",
+                "url": "https://api.github.com/repos/composer/semver/zipball/3976a9e563da06e8dd8ca856fa2adcd66cdd98f3",
+                "reference": "3976a9e563da06e8dd8ca856fa2adcd66cdd98f3",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.3.2 || ^7.0 || ^8.0"
             },
             "require-dev": {
-                "phpstan/phpstan": "^0.12.54",
+                "phpstan/phpstan": "^1.4",
                 "symfony/phpunit-bridge": "^4.2 || ^5"
             },
             "type": "library",
             "support": {
                 "irc": "irc://irc.freenode.org/composer",
                 "issues": "https://github.com/composer/semver/issues",
-                "source": "https://github.com/composer/semver/tree/3.2.7"
+                "source": "https://github.com/composer/semver/tree/3.2.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-04T09:57:54+00:00"
+            "time": "2022-02-04T12:12:24+00:00"
         },
         {
             "name": "composer/spdx-licenses",
         },
         {
             "name": "fakerphp/faker",
-            "version": "v1.18.0",
+            "version": "v1.19.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/FakerPHP/Faker.git",
-                "reference": "2e77a868f6540695cf5ebf21e5ab472c65f47567"
+                "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/2e77a868f6540695cf5ebf21e5ab472c65f47567",
-                "reference": "2e77a868f6540695cf5ebf21e5ab472c65f47567",
+                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/d7f08a622b3346766325488aa32ddc93ccdecc75",
+                "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75",
                 "shasum": ""
             },
             "require": {
             },
             "require-dev": {
                 "bamarni/composer-bin-plugin": "^1.4.1",
+                "doctrine/persistence": "^1.3 || ^2.0",
                 "ext-intl": "*",
                 "symfony/phpunit-bridge": "^4.4 || ^5.2"
             },
             "suggest": {
+                "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
                 "ext-curl": "Required by Faker\\Provider\\Image to download images.",
                 "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
                 "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "v1.18-dev"
+                    "dev-main": "v1.19-dev"
                 }
             },
             "autoload": {
             ],
             "support": {
                 "issues": "https://github.com/FakerPHP/Faker/issues",
-                "source": "https://github.com/FakerPHP/Faker/tree/v1.18.0"
+                "source": "https://github.com/FakerPHP/Faker/tree/v1.19.0"
             },
-            "time": "2022-01-23T17:56:23+00:00"
+            "time": "2022-02-02T17:38:57+00:00"
         },
         {
             "name": "hamcrest/hamcrest-php",
         },
         {
             "name": "itsgoingd/clockwork",
-            "version": "v5.1.3",
+            "version": "v5.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/itsgoingd/clockwork.git",
-                "reference": "e03f8a7f4bcd99ec67e56428e4fc7424de4cefa8"
+                "reference": "7252aa771b77ac8678b44290fd7ec7577435cce6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/e03f8a7f4bcd99ec67e56428e4fc7424de4cefa8",
-                "reference": "e03f8a7f4bcd99ec67e56428e4fc7424de4cefa8",
+                "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/7252aa771b77ac8678b44290fd7ec7577435cce6",
+                "reference": "7252aa771b77ac8678b44290fd7ec7577435cce6",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/itsgoingd/clockwork/issues",
-                "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.3"
+                "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.4"
             },
             "funding": [
                 {
                     "type": "github"
                 }
             ],
-            "time": "2021-12-24T12:24:20+00:00"
+            "time": "2022-01-30T12:36:18+00:00"
         },
         {
             "name": "justinrainbow/json-schema",
             "require": {
                 "php": "^7.1 || ^8.0"
             },
-            "replace": {
-                "myclabs/deep-copy": "self.version"
-            },
             "require-dev": {
                 "doctrine/collections": "^1.0",
                 "doctrine/common": "^2.6",
             },
             "type": "library",
             "autoload": {
-                "psr-4": {
-                    "DeepCopy\\": "src/DeepCopy/"
-                },
                 "files": [
                     "src/DeepCopy/deep_copy.php"
-                ]
+                ],
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
         },
         {
             "name": "phpstan/phpstan",
-            "version": "1.4.2",
+            "version": "1.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpstan/phpstan.git",
-                "reference": "1dd8f3e40bf7aa30031a75c65cece99220a161b8"
+                "reference": "150d1fbd82fb71ff76b3bd7f6ea6006d89c5f0c3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1dd8f3e40bf7aa30031a75c65cece99220a161b8",
-                "reference": "1dd8f3e40bf7aa30031a75c65cece99220a161b8",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/150d1fbd82fb71ff76b3bd7f6ea6006d89c5f0c3",
+                "reference": "150d1fbd82fb71ff76b3bd7f6ea6006d89c5f0c3",
                 "shasum": ""
             },
             "require": {
             "description": "PHPStan - PHP Static Analysis Tool",
             "support": {
                 "issues": "https://github.com/phpstan/phpstan/issues",
-                "source": "https://github.com/phpstan/phpstan/tree/1.4.2"
+                "source": "https://github.com/phpstan/phpstan/tree/1.4.5"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-18T16:09:11+00:00"
+            "time": "2022-02-02T19:35:10+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v5.4.2",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dom-crawler.git",
-                "reference": "bb3bc3699779fc6d9646270789026a7e2cec7ec7"
+                "reference": "2634381fdf27a2a0a8ac8eb404025eb656c65d0c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bb3bc3699779fc6d9646270789026a7e2cec7ec7",
-                "reference": "bb3bc3699779fc6d9646270789026a7e2cec7ec7",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2634381fdf27a2a0a8ac8eb404025eb656c65d0c",
+                "reference": "2634381fdf27a2a0a8ac8eb404025eb656c65d0c",
                 "shasum": ""
             },
             "require": {
             "description": "Eases DOM navigation for HTML and XML documents",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/dom-crawler/tree/v5.4.2"
+                "source": "https://github.com/symfony/dom-crawler/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-28T17:15:56+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v5.4.0",
+            "version": "v5.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "731f917dc31edcffec2c6a777f3698c33bea8f01"
+                "reference": "0f0c4bf1840420f4aef3f32044a9dbb24682731b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/731f917dc31edcffec2c6a777f3698c33bea8f01",
-                "reference": "731f917dc31edcffec2c6a777f3698c33bea8f01",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/0f0c4bf1840420f4aef3f32044a9dbb24682731b",
+                "reference": "0f0c4bf1840420f4aef3f32044a9dbb24682731b",
                 "shasum": ""
             },
             "require": {
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v5.4.0"
+                "source": "https://github.com/symfony/filesystem/tree/v5.4.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-10-28T13:39:27+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "theseer/tokenizer",
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
-        "php": "^7.3|^8.0",
+        "php": "^7.4|^8.0",
         "ext-curl": "*",
         "ext-dom": "*",
         "ext-fileinfo": "*",
     },
     "platform-dev": [],
     "platform-overrides": {
-        "php": "7.3.0"
+        "php": "7.4.0"
     },
-    "plugin-api-version": "2.1.0"
+    "plugin-api-version": "2.2.0"
 }
diff --git a/dev/api/requests/users-create.json b/dev/api/requests/users-create.json
new file mode 100644 (file)
index 0000000..ccc43d9
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "name": "Dan Brown",
+  "email": "dannyb@example.com",
+  "roles": [1],
+  "language": "fr",
+  "send_invite": true
+}
\ No newline at end of file
diff --git a/dev/api/requests/users-delete.json b/dev/api/requests/users-delete.json
new file mode 100644 (file)
index 0000000..8a94934
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "migrate_ownership_id": 5
+}
\ No newline at end of file
diff --git a/dev/api/requests/users-update.json b/dev/api/requests/users-update.json
new file mode 100644 (file)
index 0000000..d7787ed
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "name": "Dan Spaggleforth",
+  "email": "dspaggles@example.com",
+  "roles": [2],
+  "language": "de",
+  "password": "hunter2000"
+}
\ No newline at end of file
diff --git a/dev/api/responses/users-create.json b/dev/api/responses/users-create.json
new file mode 100644 (file)
index 0000000..509d889
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "id": 1,
+  "name": "Dan Brown",
+  "email": "dannyb@example.com",
+  "created_at": "2022-02-03T16:27:55.000000Z",
+  "updated_at": "2022-02-03T16:27:55.000000Z",
+  "external_auth_id": "abc123456",
+  "slug": "dan-brown",
+  "last_activity_at": "2022-02-03T16:27:55.000000Z",
+  "profile_url": "https://docs.example.com/user/dan-brown",
+  "edit_url": "https://docs.example.com/settings/users/1",
+  "avatar_url": "https://docs.example.com/uploads/images/user/2021-10/thumbs-50-50/profile-2021.jpg",
+  "roles": [
+    {
+      "id": 1,
+      "display_name": "Admin"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/dev/api/responses/users-list.json b/dev/api/responses/users-list.json
new file mode 100644 (file)
index 0000000..e070ee6
--- /dev/null
@@ -0,0 +1,33 @@
+{
+  "data": [
+    {
+      "id": 1,
+      "name": "Dan Brown",
+      "email": "dannyb@example.com",
+      "created_at": "2022-02-03T16:27:55.000000Z",
+      "updated_at": "2022-02-03T16:27:55.000000Z",
+      "external_auth_id": "abc123456",
+      "slug": "dan-brown",
+      "user_id": 1,
+      "last_activity_at": "2022-02-03T16:27:55.000000Z",
+      "profile_url": "https://docs.example.com/user/dan-brown",
+      "edit_url": "https://docs.example.com/settings/users/1",
+      "avatar_url": "https://docs.example.com/uploads/images/user/2021-10/thumbs-50-50/profile-2021.jpg"
+    },
+    {
+      "id": 2,
+      "name": "Benny",
+      "email": "benny@example.com",
+      "created_at": "2022-01-31T20:39:24.000000Z",
+      "updated_at": "2021-11-18T17:10:58.000000Z",
+      "external_auth_id": "",
+      "slug": "benny",
+      "user_id": 2,
+      "last_activity_at": "2022-01-31T20:39:24.000000Z",
+      "profile_url": "https://docs.example.com/user/benny",
+      "edit_url": "https://docs.example.com/settings/users/2",
+      "avatar_url": "https://docs.example.com/uploads/images/user/2021-11/thumbs-50-50/guest.jpg"
+    }
+  ],
+  "total": 28
+}
\ No newline at end of file
diff --git a/dev/api/responses/users-read.json b/dev/api/responses/users-read.json
new file mode 100644 (file)
index 0000000..509d889
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "id": 1,
+  "name": "Dan Brown",
+  "email": "dannyb@example.com",
+  "created_at": "2022-02-03T16:27:55.000000Z",
+  "updated_at": "2022-02-03T16:27:55.000000Z",
+  "external_auth_id": "abc123456",
+  "slug": "dan-brown",
+  "last_activity_at": "2022-02-03T16:27:55.000000Z",
+  "profile_url": "https://docs.example.com/user/dan-brown",
+  "edit_url": "https://docs.example.com/settings/users/1",
+  "avatar_url": "https://docs.example.com/uploads/images/user/2021-10/thumbs-50-50/profile-2021.jpg",
+  "roles": [
+    {
+      "id": 1,
+      "display_name": "Admin"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/dev/api/responses/users-update.json b/dev/api/responses/users-update.json
new file mode 100644 (file)
index 0000000..611e4e1
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "id": 1,
+  "name": "Dan Spaggleforth",
+  "email": "dspaggles@example.com",
+  "created_at": "2022-02-03T16:27:55.000000Z",
+  "updated_at": "2022-02-03T16:27:55.000000Z",
+  "external_auth_id": "abc123456",
+  "slug": "dan-spaggleforth",
+  "last_activity_at": "2022-02-03T16:27:55.000000Z",
+  "profile_url": "https://docs.example.com/user/dan-spaggleforth",
+  "edit_url": "https://docs.example.com/settings/users/1",
+  "avatar_url": "https://docs.example.com/uploads/images/user/2021-10/thumbs-50-50/profile-2021.jpg",
+  "roles": [
+    {
+      "id": 2,
+      "display_name": "Editors"
+    }
+  ]
+}
\ No newline at end of file
index b1bf93349e5af64c238dc197be2cf65a96d4b7f9..615eb2b2a863193a26bbdc0cf704a8054a806376 100644 (file)
@@ -1,4 +1,4 @@
-FROM php:7.4-apache
+FROM php:8.1-apache
 
 ENV APACHE_DOCUMENT_ROOT /app/public
 WORKDIR /app
index f0ec78afcc852a8c952fb2f9701ae5e301a7536e..0d591217a430186fe53611c8d09237ff0080ef40 100644 (file)
@@ -6,18 +6,14 @@ function showPopup(editor) {
     const selectedNode = editor.selection.getNode();
 
     if (!elemIsCodeBlock(selectedNode)) {
-        const providedCode = editor.selection.getNode().textContent;
+        const providedCode = editor.selection.getContent({format: 'text'});
         window.components.first('code-editor').open(providedCode, '', (code, lang) => {
             const wrap = document.createElement('div');
             wrap.innerHTML = `<pre><code class="language-${lang}"></code></pre>`;
             wrap.querySelector('code').innerText = code;
 
-            editor.formatter.toggle('pre');
-            const node = editor.selection.getNode();
-            editor.dom.setHTML(node, wrap.querySelector('pre').innerHTML);
-            editor.fire('SetContent');
-
-            editor.focus()
+            editor.insertContent(wrap.innerHTML);
+            editor.focus();
         });
         return;
     }
index 996f5a7257d5d46d8f354e8f7d9d53725fff31cc..55c4713be15b39ea8974fae6ab1a6e4a7128a2bb 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'تم التعليق',
     'permissions_update'          => 'تحديث الأذونات',
index c72222386fe81b28f7e10dc9e5540207bc176643..0f77c52e40beda6629939e28c8460ba906b0fa5d 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrate Ownership',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'No user selected',
-    'users_delete_success' => 'User successfully removed',
     'users_edit' => 'تعديل المستخدم',
     'users_edit_profile' => 'تعديل الملف',
-    'users_edit_success' => 'تم تحديث المستخدم بنجاح',
     'users_avatar' => 'صورة المستخدم',
     'users_avatar_desc' => 'يجب أن تكون الصورة مربعة ومقاربة لحجم 256 بكسل',
     'users_preferred_language' => 'اللغة المفضلة',
index d4d3aaf26b1f2f4a658c10ea1de911c405549dca..94112789deed05130db50f6adcc4179c31d5ff08 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'يجب أن يكون :attribute بعدد خانات بين :min و :max.',
     'email'                => 'يجب أن يكون :attribute عنوان بريد إلكتروني صالح.',
     'ends_with' => 'يجب أن تنتهي السمة بأحد القيم التالية',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'حقل :attribute مطلوب.',
     'gt'                   => [
         'numeric' => 'يجب أن تكون السمة أكبر من: القيمة.',
index 29e8bcafed23a6a522670aa7e599722d2e68cb66..a7db06cb52684719db607b196c559afe48ddbf5c 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'коментирано на',
     'permissions_update'          => 'updated permissions',
index 51c651ae703f09f67c84f2ffb5099e09a6f0d911..0ff5325aa77cc0b2d5da1c956495ea5f03937442 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Мигрирайте собствеността на сайта',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'Няма избрани потребители',
-    'users_delete_success' => 'User 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',
index 0a5b81d92a99deccc961e69658a7b9da10c7dab7..68ce6e7b46260ba4a7ac70b465f6cccf255257c3 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute трябва да бъде с дължина между :min и :max цифри.',
     'email'                => ':attribute трябва да бъде валиден имейл адрес.',
     'ends_with' => ':attribute трябва да свършва с един от следните символи: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Полето :attribute е задължителен.',
     'gt'                   => [
         'numeric' => ':attribute трябва да бъде по-голям от :value.',
index 38a72adf9ce6353f53ff10bb9859ee2ca746c50b..996cd1dfcf5ee665a075a09b92e7c0a291eda47a 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'je komentarisao/la na',
     'permissions_update'          => 'je ažurirao/la dozvole',
index 65e2e5264a93cce73e7a520d14acd3645a9be5bb..bfe99c98f82cb9abb4523d6cebe1ede5082fa003 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrate Ownership',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'No user selected',
-    'users_delete_success' => 'User 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',
index d6887ccc7f93723550fe10dc66863f0963f93e59..b07df9178fc66afbced6e8c34a3f823cf8e84583 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute mora imati između :min i :max brojeva.',
     'email'                => ':attribute mora biti ispravna e-mail adresa.',
     'ends_with' => ':attribute mora završavati sa jednom od sljedećih: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Polje :attribute je obavezno.',
     'gt'                   => [
         'numeric' => ':attribute mora biti veći od :value.',
index 725f890deb7e66458b352d03692edba083ba1934..a2c8eb30c3c1fb6d7f7597398740e10cae3accd7 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'ha comentat a',
     'permissions_update'          => 'ha actualitzat els permisos',
index db20cbdc3cf0d0d77a714810d56149f7479854f9..775254dccdfc0873bd5ba6e9ce0798b1d0fb1664 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migra l\'autoria',
     'users_migrate_ownership_desc' => 'Seleccioneu un usuari si voleu que un altre usuari esdevingui el propietari de tots els elements que ara són propietat d\'aquest usuari.',
     'users_none_selected' => 'No hi ha cap usuari seleccionat',
-    'users_delete_success' => 'Usuari suprimit correctament',
     'users_edit' => 'Edita l\'usuari',
     'users_edit_profile' => 'Edita el perfil',
-    'users_edit_success' => 'Usuari actualitzat correctament',
     'users_avatar' => 'Avatar de l\'usuari',
     'users_avatar_desc' => 'Seleccioneu una imatge que representi aquest usuari. Hauria de ser un quadrat d\'aproximadament 256 px.',
     'users_preferred_language' => 'Llengua preferida',
index 603182c1a2e8c249c5d1ed66dcb4efd8313103ba..bc9be7d05e654ad15c5a6fe99b1acebc5636f906 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'El camp :attribute ha de tenir entre :min i :max dígits.',
     'email'                => 'El camp :attribute ha de ser una adreça electrònica vàlida.',
     'ends_with' => 'El camp :attribute ha d\'acabar amb un dels següents valors: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'El camp :attribute és obligatori.',
     'gt'                   => [
         'numeric' => 'El camp :attribute ha de ser més gran que :value.',
index 408a92773fe200d4a69f3b54bc68e25f54a02978..09241df3e7b094cec71e6adddc96c0b75296389b 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'odstranil/a webhook',
     'webhook_delete_notification' => 'Webhook byl úspěšně odstraněn',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'okomentoval/a',
     'permissions_update'          => 'oprávnění upravena',
index 3d8aa0c6dba518200f43e138ce72f772a20bdffb..5e7728be58c9379f6f57067294fda3de95cfb8b5 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Převést vlastnictví',
     'users_migrate_ownership_desc' => 'Zde zvolte jiného uživatele, pokud chcete, aby se stal vlastníkem všech položek aktuálně vlastněných tímto uživatelem.',
     'users_none_selected' => 'Nebyl zvolen žádný uživatel',
-    'users_delete_success' => 'Uživatel byl odstraněn',
     'users_edit' => 'Upravit uživatele',
     'users_edit_profile' => 'Upravit profil',
-    'users_edit_success' => 'Uživatel byl úspěšně aktualizován',
     'users_avatar' => 'Obrázek uživatele',
     'users_avatar_desc' => 'Zvolte obrázek, který bude reprezentovat tohoto uživatele. Měl by být přibližně 256px velký ve tvaru čtverce.',
     'users_preferred_language' => 'Preferovaný jazyk',
index e4e33bc0c21dabcaa4c562ed2c541efd416b89cc..441fd30c85a7c9fc965758dc8c07c9d1debded01 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute musí být dlouhé nejméně :min a nejvíce :max pozic.',
     'email'                => ':attribute není platný formát.',
     'ends_with' => ':attribute musí končit jednou z následujících hodnot: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute musí být vyplněno.',
     'gt'                   => [
         'numeric' => ':attribute musí být větší než :value.',
index 4d52f15fe9fa63c80af7fa32b915ea96c90fdba0..19693e29a632c6a6cb7efc9bc165871981df871f 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'kommenterede til',
     'permissions_update'          => 'Tilladelser opdateret',
index 78491e621826a5978cc5c99d66ca768bdc16a5ef..5e003948330495064dd2ed86174bcad47255b46c 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Overfør ejerskab',
     'users_migrate_ownership_desc' => 'Vælg en bruger her, hvis du vil have en anden bruger til at blive ejer af alle elementer, der i øjeblikket ejes af denne bruger.',
     'users_none_selected' => 'Ingen bruger valgt',
-    'users_delete_success' => 'Brugeren blev fjernet',
     'users_edit' => 'Rediger bruger',
     'users_edit_profile' => 'Rediger profil',
-    'users_edit_success' => 'Bruger suscesfuldt opdateret',
     'users_avatar' => 'Brugeravatar',
     'users_avatar_desc' => 'Vælg et billede for at repræsentere denne bruger. Dette skal være ca. 256px kvadratisk.',
     'users_preferred_language' => 'Foretrukket sprog',
index c54b07a6eb529ced79a9d26bbde3ffc8efbbe921..649e0df33c63aafb7e007841b94035eb72afcbb6 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute skal være mellem :min og :max cifre.',
     'email'                => ':attribute skal være en gyldig mail-adresse.',
     'ends_with' => ':attribute skal slutte på en af følgende værdier: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute er obligatorisk.',
     'gt'                   => [
         'numeric' => ':attribute skal være større end :value.',
index d9b63efbefdc73d520e8879e51c32dc3b6e965a9..add2e44dd5f0d45f7befd1faca6c27e3af31642d 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'gelöschter Webhook',
     'webhook_delete_notification' => 'Webhook wurde erfolgreich gelöscht',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'hat einen Kommentar hinzugefügt',
     'permissions_update'          => 'hat die Berechtigungen aktualisiert',
index c375e289b736bd242f29243493bec9eda3743784..429f11b5453cb2930067f302348695813e6d5e53 100644 (file)
@@ -191,10 +191,8 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'users_migrate_ownership' => 'Besitz migrieren',
     'users_migrate_ownership_desc' => 'Wählen Sie hier einen Benutzer, wenn Sie möchten, dass ein anderer Benutzer der Besitzer aller Einträge wird, die diesem Benutzer derzeit gehören.',
     'users_none_selected' => 'Kein Benutzer ausgewählt',
-    'users_delete_success' => 'Benutzer erfolgreich entfernt',
     'users_edit' => 'Benutzer bearbeiten',
     'users_edit_profile' => 'Profil bearbeiten',
-    'users_edit_success' => 'Benutzer erfolgreich aktualisisert',
     'users_avatar' => 'Benutzer-Bild',
     'users_avatar_desc' => 'Das Bild sollte eine Auflösung von 256x256px haben.',
     'users_preferred_language' => 'Bevorzugte Sprache',
index 5d08c241a6871e79899916bd2614a5ffe5177806..aa3203132c5a46d77490c545c0732ffd126d856b 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute muss zwischen :min und :max Stellen haben.',
     'email'                => ':attribute muss eine valide E-Mail-Adresse sein.',
     'ends_with' => ':attribute muss mit einem der folgenden Werte: :values enden',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute ist erforderlich.',
     'gt'                   => [
         'numeric' => ':attribute muss größer als :value sein.',
index 02d4ed7ca1b0940e60461aa9c2ad1d3b3c9def01..9f9a0fb840dd8f8243d1f769c651e8a9b6283c78 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'gelöschter Webhook',
     'webhook_delete_notification' => 'Webhook wurde erfolgreich gelöscht',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'kommentiert',
     'permissions_update'          => 'aktualisierte Berechtigungen',
index 190985fea2bcb60797be56e721c663f01327fd16..0fd5606f6c9d4e6e1164d4068def45399a4ed1e0 100644 (file)
@@ -191,10 +191,8 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'users_migrate_ownership' => 'Besitz migrieren',
     'users_migrate_ownership_desc' => 'Wählen Sie hier einen Benutzer, wenn Sie möchten, dass ein anderer Benutzer der Besitzer aller Einträge wird, die diesem Benutzer derzeit gehören.',
     'users_none_selected' => 'Kein Benutzer ausgewählt',
-    'users_delete_success' => 'Benutzer erfolgreich entfernt',
     'users_edit' => 'Benutzer bearbeiten',
     'users_edit_profile' => 'Profil bearbeiten',
-    'users_edit_success' => 'Benutzer erfolgreich aktualisisert',
     'users_avatar' => 'Benutzer-Bild',
     'users_avatar_desc' => 'Das Bild sollte eine Auflösung von 256x256px haben.',
     'users_preferred_language' => 'Bevorzugte Sprache',
index 6603eccc89bd54d7486f108eb73c9c3dccd129d2..ef45d1116adb057952e764f235413476d0ada067 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute muss zwischen :min und :max Stellen haben.',
     'email'                => ':attribute muss eine valide E-Mail-Adresse sein.',
     'ends_with' => ':attribute muss mit einem der folgenden Werte: :values enden',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute ist erforderlich.',
     'gt'                   => [
         'numeric' => ':attribute muss größer als :value sein.',
index 83a374d66a083f3f25fc41523f87c0a58deab214..77c39b50c8c3be5cb6110c074b016ef9aca122e8 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'commented on',
     'permissions_update'          => 'updated permissions',
index 65e2e5264a93cce73e7a520d14acd3645a9be5bb..bfe99c98f82cb9abb4523d6cebe1ede5082fa003 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrate Ownership',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'No user selected',
-    'users_delete_success' => 'User 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',
index 1963b0df2f9a9bb3d2586fc71fbc2ca04e02f97d..2a676c7c4cce0130591a929cefd8a21e7765be1c 100644 (file)
@@ -32,6 +32,7 @@ return [
     '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',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'The :attribute field is required.',
     'gt'                   => [
         'numeric' => 'The :attribute must be greater than :value.',
index f48eab590677ab60d3d04953c7856a53acf09d14..5554d7ae581a720a7cb6799b0698e21999ba0200 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'webhook eliminado',
     'webhook_delete_notification' => 'Webhook eliminado correctamente',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'comentada el',
     'permissions_update'          => 'permisos actualizados',
index 16fc01b8f535823206c78fe777f3099a8018f978..7b70cc5cf3790003b3527999b620c9358524ed0e 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Cambiar Propietario',
     'users_migrate_ownership_desc' => 'Seleccione un usuario aquí si desea que otro usuario se convierta en el dueño de todos los elementos que actualmente son propiedad de este usuario.',
     'users_none_selected' => 'Usuario no seleccionado',
-    'users_delete_success' => 'El usuario se ha eliminado correctamente',
     'users_edit' => 'Editar Usuario',
     'users_edit_profile' => 'Editar perfil',
-    'users_edit_success' => 'Usuario actualizado',
     'users_avatar' => 'Avatar del usuario',
     'users_avatar_desc' => 'Elige una imagen para representar a este usuario. Debe ser aproximadamente de 256px por lado.',
     'users_preferred_language' => 'Idioma preferido',
index 177eb812c47d5cff9eb84e147a3143100f05aad5..bfcb050bea4de6f18b48c3b2a2c7aa7a5fb16fe0 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute debe ser un valor entre :min y :max dígios.',
     'email'                => ':attribute debe ser un correo electrónico válido.',
     'ends_with' => 'El :attribute debe terminar con uno de los siguientes: :values',
+    'file'                 => 'El :attribute debe ser proporcionado como un archivo válido.',
     'filled'               => 'El campo :attribute es requerido.',
     'gt'                   => [
         'numeric' => 'El :attribute debe ser mayor que :value.',
index 0832f8d0ba6e1b8c72fdec70224c64a788cb8ca2..1dd72e3d4362d3ace8b7608382a55899784833da 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'webhook eliminado',
     'webhook_delete_notification' => 'Webhook eliminado correctamente',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'comentado',
     'permissions_update'          => 'permisos actualizados',
index c7bb2ddd6455c1717d4d6b63e4cedc4bc6f00cff..42d616a3cf463f0cb9d0a242994a1758a41fa0bc 100644 (file)
@@ -189,10 +189,8 @@ return [
     'users_migrate_ownership' => 'Cambiar Propietario',
     'users_migrate_ownership_desc' => 'Seleccione un usuario aquí si desea que otro usuario se convierta en el dueño de todos los elementos que actualmente son propiedad de este usuario.',
     'users_none_selected' => 'No hay usuario seleccionado',
-    'users_delete_success' => 'El usuario fue eliminado correctamente',
     'users_edit' => 'Editar Usuario',
     'users_edit_profile' => 'Editar perfil',
-    'users_edit_success' => 'Usuario actualizado',
     'users_avatar' => 'Avatar del usuario',
     'users_avatar_desc' => 'Esta imagen debe ser de aproximadamente 256px por lado.',
     'users_preferred_language' => 'Lenguaje preferido',
index 6b72a65499d03c55c9982efd63fe5b93385422f6..9b2b1b4134ab346ba443ce9e86ba4c24b284dca3 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute debe ser un valor entre :min y :max dígios.',
     'email'                => ':attribute debe ser una dirección álida.',
     'ends_with' => 'El :attribute debe terminar con uno de los siguientes: :values',
+    'file'                 => 'El :attribute debe ser proporcionado como un archivo válido.',
     'filled'               => 'El campo :attribute es requerido.',
     'gt'                   => [
         'numeric' => 'El :attribute debe ser mayor que :value.',
index 26763c11ea4da5966ca6eb2e35df9215dd47be73..ffcf37b2dfd1ffc020534395f29dc97ec56c3756 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'kustutas veebihaagi',
     'webhook_delete_notification' => 'Veebihaak on kustutatud',
 
+    // Users
+    'user_update_notification' => 'Kasutaja on muudetud',
+    'user_delete_notification' => 'Kasutaja on kustutatud',
+
     // Other
     'commented_on'                => 'kommenteeris lehte',
     'permissions_update'          => 'muutis õiguseid',
index 8089efe4277c3feddd439d377f99ae8e0752c928..8fe2135d415218f577250c00af4638f0187f1e4e 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Teisalda omandus',
     'users_migrate_ownership_desc' => 'Vali siin kasutaja, kui soovid talle üle viia kõik selle kasutaja objektid.',
     'users_none_selected' => 'Kasutaja valimata',
-    'users_delete_success' => 'Kasutaja on kustutatud',
     'users_edit' => 'Muuda kasutajat',
     'users_edit_profile' => 'Muuda profiili',
-    'users_edit_success' => 'Kasutaja on muudetud',
     'users_avatar' => 'Kasutaja profiilipilt',
     'users_avatar_desc' => 'Vali sellele kasutajale profiilipilt. See peaks olema umbes 256x256 pikslit.',
     'users_preferred_language' => 'Eelistatud keel',
index ed615e66f4159cace5969f368445923f6776c67a..f241b0958611f31967abcd0f9f7d5d810f6250fb 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute peab olema :min ja :max numbri vahel.',
     'email'                => ':attribute peab olema kehtiv e-posti aadress.',
     'ends_with' => ':attribute lõpus peab olema üks järgmistest väärtustest: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute väli on kohustuslik.',
     'gt'                   => [
         'numeric' => ':attribute peab olema suurem kui :value.',
index 4a4d40768110925fcbe5fdaf3efc38c45a9eca73..dc599fd7ad552a6dcaf2c993e826b232ce278b1e 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'حذف وب هوک',
     'webhook_delete_notification' => 'وب هوک با موفقیت حذف شد',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'ثبت دیدگاه',
     'permissions_update'          => 'به روزرسانی مجوزها',
index c03d064dabac3bdbe318f384252c3a3c4229c050..714e1b5dc20ad5569e92d79b0cb6cbc299497765 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'انتقال مالکیت',
     'users_migrate_ownership_desc' => 'اگر می‌خواهید کاربر دیگری مالک همه مواردی باشد که در حال حاضر متعلق به این کاربر است، کاربری را در اینجا انتخاب کنید.',
     'users_none_selected' => 'هیچ کاربری انتخاب نشد',
-    'users_delete_success' => 'کاربر با موفقیت حذف شد',
     'users_edit' => 'ویرایش کاربر',
     'users_edit_profile' => 'ویرایش پروفایل',
-    'users_edit_success' => 'کاربر با موفقیت به روز شد',
     'users_avatar' => 'آواتار کاربر',
     'users_avatar_desc' => 'تصویری را برای نشان دادن این کاربر انتخاب کنید. این باید تقریباً 256 پیکسل مربع باشد.',
     'users_preferred_language' => 'زبان ترجیحی',
index 665451e8de437fd53a110b819c59e1f2dcd4ad49..4578e1cdd164154da4f32208614b392ac5d61928 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute باید بین :min و :max رقم باشد.',
     'email'                => ':attribute باید یک ایمیل معتبر باشد.',
     'ends_with' => 'فیلد :attribute باید با یکی از مقادیر زیر خاتمه یابد: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'فیلد :attribute باید مقدار داشته باشد.',
     'gt'                   => [
         'numeric' => ':attribute باید بزرگتر از :value باشد.',
index 8f57cd500d11b33b46a020ea778461b4eab19ce4..bcba07f570f2d423435371769552b083face9d77 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'supprimer un Webhook',
     'webhook_delete_notification' => 'Webhook supprimé avec succès',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'a commenté',
     'permissions_update'          => 'a mis à jour les autorisations sur',
index c373f747b11a1980491e4fd22d94278e88a6ec6e..1df172dc3c0c7903c41a6fceb3276de389b55ad2 100644 (file)
@@ -75,7 +75,7 @@ return [
     'status_active' => 'Actif',
     'status_inactive' => 'Inactif',
     'never' => 'Jamais',
-    'none' => 'None',
+    'none' => 'Aucun',
 
     // Header
     'header_menu_expand' => 'Développer le menu',
index a4d23855283d64cfeb0a4e6b2c1b6433b7930d17..cb21bdb778fab9fec7c20b8a6efbdbcfcc20a753 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Transférer la propriété',
     'users_migrate_ownership_desc' => 'Sélectionnez un utilisateur ici si vous voulez qu\'un autre utilisateur devienne le propriétaire de tous les éléments actuellement détenus par cet utilisateur.',
     'users_none_selected' => 'Aucun utilisateur n\'a été sélectionné',
-    'users_delete_success' => 'Utilisateur supprimé avec succès',
     'users_edit' => 'Modifier l\'utilisateur',
     'users_edit_profile' => 'Modifier le profil',
-    'users_edit_success' => 'Utilisateur mis à jour avec succès',
     'users_avatar' => 'Avatar de l\'utilisateur',
     'users_avatar_desc' => 'Cette image doit être un carré d\'environ 256 px.',
     'users_preferred_language' => 'Langue préférée',
index 71a5e8e083d9b6a420833d9472816c2f75c105a7..23bb748001c4c799303829acf06684b557432de8 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute doit avoir une longueur entre :min et :max.',
     'email'                => ':attribute doit être une adresse e-mail valide.',
     'ends_with' => ':attribute doit se terminer par une des valeurs suivantes : :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute est un champ requis.',
     'gt'                   => [
         'numeric' => ':attribute doit être plus grand que :value.',
index 83a374d66a083f3f25fc41523f87c0a58deab214..ede04a86ceb2ce281a7d847757be0c2dd4e5db00 100644 (file)
@@ -6,32 +6,32 @@
 return [
 
     // Pages
-    'page_create'                 => 'created page',
-    'page_create_notification'    => 'Page successfully created',
-    'page_update'                 => 'updated page',
-    'page_update_notification'    => 'Page successfully updated',
-    'page_delete'                 => 'deleted page',
-    'page_delete_notification'    => 'Page successfully deleted',
-    'page_restore'                => 'restored page',
-    'page_restore_notification'   => 'Page successfully restored',
-    'page_move'                   => 'moved page',
+    'page_create'                 => 'דף נוצר',
+    'page_create_notification'    => 'הדף נוצר בהצלחה',
+    'page_update'                 => 'דף עודכן',
+    'page_update_notification'    => 'הדף עודכן בהצלחה',
+    'page_delete'                 => 'דף נמחק',
+    'page_delete_notification'    => 'הדף הוסר בהצלחה',
+    'page_restore'                => 'דף שוחזר',
+    'page_restore_notification'   => 'הדף שוחזר בהצלחה',
+    'page_move'                   => 'דף הועבר',
 
     // Chapters
-    'chapter_create'              => 'created chapter',
-    'chapter_create_notification' => 'Chapter successfully created',
-    'chapter_update'              => 'updated chapter',
-    'chapter_update_notification' => 'Chapter successfully updated',
-    'chapter_delete'              => 'deleted chapter',
-    'chapter_delete_notification' => 'Chapter successfully deleted',
-    'chapter_move'                => 'moved chapter',
+    'chapter_create'              => 'פרק נוצר',
+    'chapter_create_notification' => 'הפרק נוצר בהצלחה',
+    'chapter_update'              => 'פרק עודכן',
+    'chapter_update_notification' => 'הפרק עודכן בהצלחה',
+    'chapter_delete'              => 'פרק נמחק',
+    'chapter_delete_notification' => 'הפרק נמחק בהצלחה',
+    'chapter_move'                => 'פרק הועבר',
 
     // Books
-    'book_create'                 => 'created book',
-    'book_create_notification'    => 'Book successfully created',
-    'book_update'                 => 'updated book',
-    'book_update_notification'    => 'Book successfully updated',
-    'book_delete'                 => 'deleted book',
-    'book_delete_notification'    => 'Book successfully deleted',
+    'book_create'                 => 'ספר נוצר',
+    'book_create_notification'    => 'ספר נוצר בהצלחה',
+    'book_update'                 => 'ספר הועדכן',
+    'book_update_notification'    => 'ספר התעדכן בהצלחה',
+    'book_delete'                 => 'ספר נמחק',
+    'book_delete_notification'    => 'ספר נמחק בהצלחה',
     'book_sort'                   => 'sorted book',
     'book_sort_notification'      => 'Book successfully re-sorted',
 
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'commented on',
     'permissions_update'          => 'updated permissions',
index 85b66c2a5405b13f76174f14b44cbee329e9648e..9d50dead7ab50af050384e0a5821c8849362875c 100644 (file)
@@ -21,7 +21,7 @@ return [
     'email' => 'אי-מייל',
     'password' => 'סיסמא',
     'password_confirm' => 'אימות סיסמא',
-    'password_hint' => 'Must be at least 8 characters',
+    'password_hint' => '‏אורך הסיסמה חייב להיות לפחות 8 תווים',
     'forgot_password' => 'שכחת סיסמא?',
     'remember_me' => 'זכור אותי',
     'ldap_email_hint' => 'אנא ציין כתובת אי-מייל לשימוש בחשבון זה',
@@ -42,7 +42,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' => 'קישור זה נשלח עקב בקשה לאיפוס סיסמא בחשבון שלך',
@@ -64,10 +64,10 @@ return [
     'email_not_confirmed_resend_button' => 'שלח שוב מייל אימות',
 
     // User Invite
-    'user_invite_email_subject' => 'You have been invited to join :appName!',
+    'user_invite_email_subject' => 'הוזמנת להצטרף ל: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_email_action' => 'הגדר סיסמה לחשבון',
     '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',
index 2f1f4ef35b4e1d2aa5d078b7fb51f58907664ffc..865a224de34f156c99fb9ebc9e0799e0cd01c10d 100644 (file)
@@ -33,28 +33,28 @@ return [
     'copy' => 'העתק',
     'reply' => 'השב',
     'delete' => 'מחק',
-    'delete_confirm' => 'Confirm Deletion',
+    'delete_confirm' => 'אשר מחיקה',
     'search' => 'חיפוש',
     'search_clear' => 'נקה חיפוש',
     'reset' => 'איפוס',
     'remove' => 'הסר',
     'add' => 'הוסף',
-    'configure' => 'Configure',
-    'fullscreen' => 'Fullscreen',
-    'favourite' => 'Favourite',
-    'unfavourite' => 'Unfavourite',
-    'next' => 'Next',
-    'previous' => 'Previous',
-    'filter_active' => 'Active Filter:',
-    'filter_clear' => 'Clear Filter',
+    'configure' => 'הגדרות',
+    'fullscreen' => 'מסך מלא',
+    'favourite' => 'מועדף',
+    'unfavourite' => 'בטל מועדף',
+    'next' => 'הבא',
+    'previous' => 'קודם',
+    'filter_active' => 'מסנן פעיל:',
+    'filter_clear' => 'נקה מסננים',
 
     // Sort Options
-    'sort_options' => 'Sort Options',
+    'sort_options' => 'אפשרויות מיון',
     'sort_direction_toggle' => 'Sort Direction Toggle',
-    'sort_ascending' => 'Sort Ascending',
-    'sort_descending' => 'Sort Descending',
+    'sort_ascending' => 'מיין בסדר עולה',
+    'sort_descending' => 'מיין בסדר יורד',
     'sort_name' => 'שם',
-    'sort_default' => 'Default',
+    'sort_default' => 'ברירת מחדל',
     'sort_created_at' => 'תאריך יצירה',
     'sort_updated_at' => 'תאריך עדכון',
 
@@ -63,7 +63,7 @@ return [
     'no_activity' => 'אין פעילות להציג',
     'no_items' => 'אין פריטים זמינים',
     'back_to_top' => 'בחזרה ללמעלה',
-    'skip_to_main_content' => 'Skip to main content',
+    'skip_to_main_content' => 'דלג לתוכן העיקרי',
     'toggle_details' => 'הצג/הסתר פרטים',
     'toggle_thumbnails' => 'הצג/הסתר תמונות',
     'details' => 'פרטים',
@@ -71,19 +71,19 @@ return [
     'list_view' => 'תצוגת רשימה',
     'default' => 'ברירת מחדל',
     'breadcrumb' => 'Breadcrumb',
-    'status' => 'Status',
-    'status_active' => 'Active',
-    'status_inactive' => 'Inactive',
-    'never' => 'Never',
+    'status' => 'סטטוס',
+    'status_active' => 'פעיל',
+    'status_inactive' => 'לא פעיל',
+    'never' => 'אף פעם',
     'none' => 'None',
 
     // Header
-    'header_menu_expand' => 'Expand Header Menu',
+    'header_menu_expand' => 'הרחב תפריט',
     'profile_menu' => 'Profile Menu',
     'view_profile' => 'הצג פרופיל',
     'edit_profile' => 'ערוך פרופיל',
-    'dark_mode' => 'Dark Mode',
-    'light_mode' => 'Light Mode',
+    'dark_mode' => 'מצב לילה',
+    'light_mode' => 'מצב יום',
 
     // Layout tabs
     'tab_info' => 'מידע',
@@ -97,6 +97,6 @@ return [
 
     // Footer Link Options
     // Not directly used but available for convenience to users.
-    'privacy_policy' => 'Privacy Policy',
-    'terms_of_service' => 'Terms of Service',
+    'privacy_policy' => 'מדיניות הפרטיות',
+    'terms_of_service' => 'תנאי שימוש',
 ];
index b5ee70c2bda1de3f7965b37c1653bb4aea42f715..d0add8d2e3bf34f485a2853eae91fdadf3c3794d 100644 (file)
@@ -28,7 +28,7 @@ return [
     'my_recent_drafts' => 'הטיוטות האחרונות שלי',
     'my_recently_viewed' => 'הנצפים לאחרונה שלי',
     'my_most_viewed_favourites' => 'My Most Viewed Favourites',
-    'my_favourites' => 'My Favourites',
+    'my_favourites' => 'המועדפים שלי',
     'no_pages_viewed' => 'לא צפית בדפים כלשהם',
     'no_pages_recently_created' => 'לא נוצרו דפים לאחרונה',
     'no_pages_recently_updated' => 'לא עודכנו דפים לאחרונה',
@@ -36,14 +36,14 @@ return [
     'export_html' => 'דף אינטרנט',
     'export_pdf' => 'קובץ PDF',
     'export_text' => 'טקסט רגיל',
-    'export_md' => 'Markdown File',
+    'export_md' => 'קובץ Markdown',
 
     // Permissions and restrictions
     'permissions' => 'הרשאות',
     'permissions_intro' => 'ברגע שמסומן, הרשאות אלו יגברו על כל הרשאת תפקיד שקיימת',
     'permissions_enable' => 'הפעל הרשאות מותאמות אישית',
     'permissions_save' => 'שמור הרשאות',
-    'permissions_owner' => 'Owner',
+    'permissions_owner' => 'בעלים',
 
     // Search
     'search_results' => 'תוצאות חיפוש',
@@ -52,8 +52,8 @@ return [
     'search_no_pages' => 'לא נמצאו דפים התואמים לחיפוש',
     'search_for_term' => 'חפש את :term',
     'search_more' => 'תוצאות נוספות',
-    'search_advanced' => 'Advanced Search',
-    'search_terms' => 'Search Terms',
+    'search_advanced' => 'חיפוש מתקדם',
+    'search_terms' => 'מילות חיפוש',
     'search_content_type' => 'סוג התוכן',
     'search_exact_matches' => 'התאמות מדויקות',
     'search_tags' => 'חפש בתגים',
@@ -63,7 +63,7 @@ return [
     'search_permissions_set' => 'סט הרשאות',
     'search_created_by_me' => 'שנוצרו על ידי',
     'search_updated_by_me' => 'שעודכנו על ידי',
-    'search_owned_by_me' => 'Owned by me',
+    'search_owned_by_me' => 'בבעלות שלי',
     'search_date_options' => 'אפשרויות תאריך',
     'search_updated_before' => 'שעודכנו לפני',
     'search_updated_after' => 'שעודכנו לאחר',
@@ -143,8 +143,8 @@ return [
     'books_sort_chapters_last' => 'פרקים בסוף',
     'books_sort_show_other' => 'הצג ספרים אחרונים',
     'books_sort_save' => 'שמור את הסדר החדש',
-    'books_copy' => 'Copy Book',
-    'books_copy_success' => 'Book successfully copied',
+    'books_copy' => 'העתק ספר',
+    'books_copy_success' => 'ספר הועתק בהצלחה',
 
     // Chapters
     'chapter' => 'פרק',
@@ -163,8 +163,8 @@ return [
     'chapters_move' => 'העבר פרק',
     'chapters_move_named' => 'העבר פרק :chapterName',
     'chapter_move_success' => 'הפרק הועבר אל :bookName',
-    'chapters_copy' => 'Copy Chapter',
-    'chapters_copy_success' => 'Chapter successfully copied',
+    'chapters_copy' => 'העתק פרק',
+    'chapters_copy_success' => 'פרק הועתק בהצלחה',
     'chapters_permissions' => 'הרשאות פרק',
     'chapters_empty' => 'לא נמצאו דפים בפרק זה.',
     'chapters_permissions_active' => 'הרשאות פרק פעילות',
@@ -188,7 +188,7 @@ return [
     'pages_delete_confirm' => 'האם ברצונך למחוק דף זה?',
     'pages_delete_draft_confirm' => 'האם ברצונך למחוק את טיוטת הדף הזה?',
     'pages_editing_named' => 'עריכת דף :pageName',
-    'pages_edit_draft_options' => 'Draft Options',
+    'pages_edit_draft_options' => 'אפשרויות טיוטה',
     'pages_edit_save_draft' => 'שמור טיוטה',
     'pages_edit_draft' => 'ערוך טיוטת דף',
     'pages_editing_draft' => 'עריכת טיוטה',
@@ -238,7 +238,7 @@ return [
     'pages_initial_name' => 'דף חדש',
     'pages_editing_draft_notification' => 'הינך עורך טיוטה אשר נשמרה לאחרונה ב :timeDiff',
     'pages_draft_edited_notification' => 'דף זה עודכן מאז, מומלץ להתעלם מהטיוטה הזו.',
-    'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.',
+    'pages_draft_page_changed_since_creation' => 'העמוד התעדכן מאז שהטיוטה נוצרה. מומלץ לבטל את הטיוטה או לשים לב לא לדרוס שינויים בעמוד.',
     'pages_draft_edit_active' => [
         'start_a' => ':count משתמשים החלו לערוך דף זה',
         'start_b' => ':userName החל לערוך דף זה',
@@ -248,7 +248,7 @@ return [
     ],
     'pages_draft_discarded' => 'הסקיצה נמחקה, העורך עודכן עם תוכן הדף העכשוי',
     'pages_specific' => 'דף ספציפי',
-    'pages_is_template' => 'Page Template',
+    'pages_is_template' => 'תבנית דף',
 
     // Editor Sidebar
     'page_tags' => 'תגיות דף',
@@ -257,19 +257,19 @@ return [
     'shelf_tags' => 'תגיות מדף',
     'tag' => 'תגית',
     'tags' =>  'תגיות',
-    'tag_name' =>  'Tag Name',
+    'tag_name' =>  'שם התווית',
     'tag_value' => 'ערך התגית (אופציונאלי)',
     'tags_explain' => "הכנס תגיות על מנת לסדר את התוכן שלך. \n  ניתן לציין ערך לתגית על מנת לבצע סידור יסודי יותר",
     'tags_add' => 'הוסף תגית נוספת',
-    'tags_remove' => 'Remove this tag',
+    'tags_remove' => 'מחק תווית',
     'tags_usages' => 'Total tag usages',
     'tags_assigned_pages' => 'Assigned to Pages',
     'tags_assigned_chapters' => 'Assigned to Chapters',
     'tags_assigned_books' => 'Assigned to Books',
     'tags_assigned_shelves' => 'Assigned to Shelves',
     'tags_x_unique_values' => ':count unique values',
-    'tags_all_values' => 'All values',
-    'tags_view_tags' => 'View Tags',
+    'tags_all_values' => 'כל הערכים',
+    'tags_view_tags' => 'הצג תוויות',
     'tags_view_existing_tags' => 'View existing tags',
     'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
     'attachments' => 'קבצים מצורפים',
@@ -298,12 +298,12 @@ 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_append_content' => 'Append to page content',
-    'templates_prepend_content' => 'Prepend to page content',
+    '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',
index f5836082d210f09e7fe062d87bdb460e9d0b7be9..b736c83cd3c5a475b933ede5349ff88e020b3d45 100644 (file)
@@ -18,7 +18,7 @@ return [
     'ldap_fail_authed' => 'LDAP access failed using given dn & password details',
     'ldap_extension_not_installed' => 'LDAP PHP extension not installed',
     'ldap_cannot_connect' => 'Cannot connect to ldap server, Initial connection failed',
-    'saml_already_logged_in' => 'Already logged in',
+    'saml_already_logged_in' => 'כבר מחובר',
     'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
     '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.',
index 294a62bc4cc3c2c0af4d5101ab6978ae5c4bed2f..fd248cb63a81e148628cbb444b034cd505d2ee78 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'העבר בעלות',
     'users_migrate_ownership_desc' => 'בחרו משתמש כאן במידה ואתם מעוניינים שמשתמש אחר יהפוך לבעלים של כל הפריטים שכרגע בבעלות משתמש זה.',
     'users_none_selected' => 'לא נבחר משתמש',
-    'users_delete_success' => 'משתמש נמחק בהצלחה',
     'users_edit' => 'עריכת משתמש',
     'users_edit_profile' => 'עריכת פרופיל',
-    'users_edit_success' => 'המשתמש עודכן בהצלחה',
     'users_avatar' => 'תמונת משתמש',
     'users_avatar_desc' => 'בחר תמונה אשר תייצג את המשתמש. על התמונה להיות ריבוע של 256px',
     'users_preferred_language' => 'שפה מועדפת',
index e52c28b42ec58ca2de43e469397716b27aa56b50..85f6c698eb7613361a46303c784ca4e6bb763a17 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'שדה :attribute חייב להיות בין :min ו-:max ספרות.',
     'email'                => 'שדה :attribute חייב להיות כתובת אימייל תקנית.',
     'ends_with' => 'The :attribute must end with one of the following: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'שדה :attribute הוא חובה.',
     'gt'                   => [
         'numeric' => 'The :attribute must be greater than :value.',
index 58f4dabfac20601be19a185430c4f8605ce4246c..0d467ea8fdf6f4ab21bfc5f5aae7167f510f7d88 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'komentirano',
     'permissions_update'          => 'ažurirana dopuštenja',
index 553c7e53dd9fc3b9597601b1d736e81f4d8233f1..1df8db2cfea12100bf37fcbd9a8a6696e36a98b5 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Premjestite vlasništvo',
     'users_migrate_ownership_desc' => 'Ovdje odaberite korisnika kojem ćete dodijeliti vlasništvo i sve stavke povezane s njim.',
     'users_none_selected' => 'Nije odabran nijedan korisnik',
-    'users_delete_success' => 'Korisnik je uspješno premješten',
     'users_edit' => 'Uredite korisnika',
     'users_edit_profile' => 'Uredite profil',
-    'users_edit_success' => 'Korisnik je uspješno ažuriran',
     'users_avatar' => 'Korisnički avatar',
     'users_avatar_desc' => 'Odaberite sliku koja će predstavljati korisnika. Maksimalno 256px.',
     'users_preferred_language' => 'Prioritetni jezik',
index b88e872f1b8881fa22ecc5eaaaecb07fe1f1d66c..ad2eaa4e4e8340158f1300cf2985689f542112bf 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute mora biti između :min i :max znamenki.',
     'email'                => ':attribute mora biti valjana email adresa.',
     'ends_with' => ':attribute mora završiti s :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute polje je obavezno.',
     'gt'                   => [
         'numeric' => ':attribute mora biti veći od :value.',
index 1a34acbd4b4a743ed311c3fa3e5d3c9f1a83322f..278eb9e18a0dc2058c27043d16be7d46ffb47c5e 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'megjegyzést fűzött hozzá:',
     'permissions_update'          => 'updated permissions',
index 9686252aa89c30ef35283faebbddf726536ab09e..c560ee44c8a602aad3d7463fd7452a7069bb9ec1 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrate Ownership',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'No user selected',
-    'users_delete_success' => 'User successfully removed',
     'users_edit' => 'Felhasználó szerkesztése',
     'users_edit_profile' => 'Profil szerkesztése',
-    'users_edit_success' => 'Felhasználó sikeresen frissítve',
     'users_avatar' => 'Avatar használata',
     'users_avatar_desc' => 'A felhasználót ábrázoló kép kiválasztása. Kb. 256px méretű négyzetes képnek kell lennie.',
     'users_preferred_language' => 'Előnyben részesített nyelv',
index 3d24cec3ca7ac9c625d3072e43646059b1e9051a..db6d24f8a2c212acce5a90b46a07a2bf0611f4fb 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute hosszának :min és :max számjegy között kell lennie.',
     'email'                => ':attribute érvényes email cím kell legyen.',
     'ends_with' => ':attribute attribútumnak a következők egyikével kell végződnie: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute mező kötelező.',
     'gt'                   => [
         'numeric' => ':attribute nagyobb kell, hogy legyen, mint :value.',
index 9871b6e721f39fcb332be83bbcb7bc94883e32a3..2a2d35bd6192ee376e3fb2788d65fb76245ed6c8 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'berkomentar pada',
     'permissions_update'          => 'izin diperbarui',
index df5ccac6437ecab4f81d657b66a74b267a968fcb..ef37c2d912f39ba4b8c80b2fd8ad1fb504ccd213 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrasikan Kepemilikan',
     'users_migrate_ownership_desc' => 'Pilih pengguna di sini jika Anda ingin pengguna lain menjadi pemilik semua item yang saat ini dimiliki oleh pengguna ini.',
     'users_none_selected' => 'Tidak ada pengguna yang dipilih',
-    'users_delete_success' => 'Pengguna berhasil dihapus',
     'users_edit' => 'Edit Pengguna',
     'users_edit_profile' => 'Edit Profil',
-    'users_edit_success' => 'Pengguna berhasil diperbarui',
     'users_avatar' => 'Abatar Pengguna',
     'users_avatar_desc' => 'Pilih gambar untuk mewakili pengguna ini. berukuran 256px.',
     'users_preferred_language' => 'Bahasa Pilihan',
index 992f403299a3ea53884071022e8e6bf8cc6f43bd..36a3397f5ae93bc5267bd8140465b61d8de6d7ec 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute harus diantara :min dan :max digit.',
     'email'                => ':attrtibute Harus alamat e-mail yang valid.',
     'ends_with' => ':attribute harus diakhiri dengan salah satu dari berikut ini: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute bidang diperlukan.',
     'gt'                   => [
         'numeric' => ':attribute harus lebih besar dari :value.',
index 5696662f57d9040dca1d47b1b8a5b5bd884dea9b..e577c4f9ce5fbd1027e4059a5cc282937a0b03fe 100755 (executable)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'webhook eliminato',
     'webhook_delete_notification' => 'Webhook eliminato con successo',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'ha commentato in',
     'permissions_update'          => 'autorizzazioni aggiornate',
index b7c0c0e793184a59ef5311e9a6c8c53d9dd931da..527ff72fb3595d96491e2a64090d48e6fa4c9205 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Cambia Proprietario',
     'users_migrate_ownership_desc' => 'Seleziona qui un utente se vuoi che un altro utente diventi il proprietario di tutti gli elementi attualmente di proprietà di questo utente.',
     'users_none_selected' => 'Nessun utente selezionato',
-    'users_delete_success' => 'Utente rimosso con successo',
     'users_edit' => 'Modifica Utente',
     'users_edit_profile' => 'Modifica Profilo',
-    'users_edit_success' => 'Utente aggiornato correttamente',
     'users_avatar' => 'Avatar Utente',
     'users_avatar_desc' => 'Quest\'immagine dovrebbe essere approssimativamente 256px quadrata.',
     'users_preferred_language' => 'Lingua Preferita',
index 62f0701198d9aebb52ee1687d24ab4b885ec5946..786077da54652a5c86d4ec5af979f11529496f94 100755 (executable)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'Il campo :attribute deve essere tra i numeri :min e :max.',
     'email'                => 'Il campo :attribute deve essere un indirizzo email valido.',
     'ends_with' => ':attribute deve terminare con uno dei seguenti: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Il campo :attribute field is required.',
     'gt'                   => [
         'numeric' => ':attribute deve essere maggiore di :value.',
index 65fef973131c83d1ff980e2b3810a0eb1ed4efa5..b2845b27e953358d81bc942037b32ba36fa54fb4 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'がコメント:',
     'permissions_update'          => 'が権限を更新:',
index 11a052d3922336823512b4ae9e0375d3cd9c1d35..06a3ee287aefbfe4d04cafbdf90f6e33e7f63796 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => '所有権を移行',
     'users_migrate_ownership_desc' => '別のユーザーをこのユーザーが現在所有しているすべてのアイテムの所有者にする場合は、ここでユーザーを選択します。',
     'users_none_selected' => 'ユーザが選択されていません',
-    'users_delete_success' => 'ユーザーを正常に削除しました',
     'users_edit' => 'ユーザー編集',
     'users_edit_profile' => 'プロフィール編集',
-    'users_edit_success' => 'ユーザを更新しました',
     'users_avatar' => 'アバター',
     'users_avatar_desc' => '256pxの正方形である必要があります。',
     'users_preferred_language' => '使用言語',
index f8a7f1326fe6361a6f9b9402091b6db9e3bc439c..4c96087f912c5cc513c50940f3d8aedf200cba08 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attributeは:min〜:maxである必要があります。',
     'email'                => ':attributeは正しいEメールアドレスである必要があります。',
     'ends_with' => ':attributeは:valuesのいずれかで終わる必要があります。',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attributeは必須です。',
     'gt'                   => [
         'numeric' => ':attributeは:valueより大きな値である必要があります。',
index 1a68dd9a69a264c407e8609c53a0ade6443d2ec5..1ea53b80ae5ed31448a2627a420b723ab95a30f3 100644 (file)
@@ -7,59 +7,63 @@ return [
 
     // Pages
     'page_create'                 => '문서 만들기',
-    'page_create_notification'    => 'Page successfully created',
+    'page_create_notification'    => '문서 생성함',
     'page_update'                 => '문서 수정',
-    'page_update_notification'    => 'Page successfully updated',
+    'page_update_notification'    => '문서 수정함',
     'page_delete'                 => '삭제 된 페이지',
-    'page_delete_notification'    => 'Page successfully deleted',
+    'page_delete_notification'    => '문서 삭제함',
     'page_restore'                => '문서 복원',
-    'page_restore_notification'   => 'Page successfully restored',
-    'page_move'                   => '문서 이동',
+    'page_restore_notification'   => '문서 복원함',
+    'page_move'                   => '문서 이동',
 
     // Chapters
     'chapter_create'              => '챕터 만들기',
-    'chapter_create_notification' => 'Chapter successfully created',
-    'chapter_update'              => '챕터 바꾸기',
-    'chapter_update_notification' => 'Chapter successfully updated',
+    'chapter_create_notification' => '챕터 생성함',
+    'chapter_update'              => '챕터 수정',
+    'chapter_update_notification' => '챕터 수정함',
     'chapter_delete'              => '삭제된 챕터',
-    'chapter_delete_notification' => 'Chapter successfully deleted',
+    'chapter_delete_notification' => '챕터 삭제함',
     'chapter_move'                => '챕터 이동된',
 
     // Books
     'book_create'                 => '책자 만들기',
-    'book_create_notification'    => 'Book successfully created',
-    'book_update'                 => '책자 바꾸기',
-    'book_update_notification'    => 'Book successfully updated',
-    'book_delete'                 => 'ì\82­ì \9c ë\90\9c ì±\85ì\9e\90',
-    'book_delete_notification'    => 'Book successfully deleted',
+    'book_create_notification'    => '책 생성함',
+    'book_update'                 => '책 수정',
+    'book_update_notification'    => '책 수정함',
+    'book_delete'                 => 'ì±\85 ì§\80ì\9a°ê¸°',
+    'book_delete_notification'    => '책 삭제함',
     'book_sort'                   => '책자 정렬',
-    'book_sort_notification'      => 'Book successfully re-sorted',
+    'book_sort_notification'      => '책 정렬 바꿈',
 
     // Bookshelves
-    'bookshelf_create'            => 'created bookshelf',
-    'bookshelf_create_notification'    => 'Bookshelf successfully created',
-    'bookshelf_update'                 => 'ì\84\9cê°\80 ë°\94꾸기',
-    'bookshelf_update_notification'    => 'Bookshelf successfully updated',
-    'bookshelf_delete'                 => 'ì\82­ì \9cë\90\9c ì\84\9cê°\80',
-    'bookshelf_delete_notification'    => 'Bookshelf successfully deleted',
+    'bookshelf_create'            => '책꽂이 만들기',
+    'bookshelf_create_notification'    => '책꽂이 생성함',
+    'bookshelf_update'                 => 'ì±\85ê½\82ì\9d´ ì\88\98ì \95',
+    'bookshelf_update_notification'    => '책꽂이 수정함',
+    'bookshelf_delete'                 => 'ì±\85ê½\82ì\9d´ ì§\80ì\9a°ê¸°',
+    'bookshelf_delete_notification'    => '책꽂이 삭제함',
 
     // Favourites
-    'favourite_add_notification' => '":name" has been added to your favourites',
-    'favourite_remove_notification' => '":name" has been removed from your favourites',
+    'favourite_add_notification' => '":name" 북마크에 추가함',
+    'favourite_remove_notification' => '":name" 북마크에서 삭제함',
 
     // MFA
-    'mfa_setup_method_notification' => 'Multi-factor method successfully configured',
-    'mfa_remove_method_notification' => 'Multi-factor method successfully removed',
+    'mfa_setup_method_notification' => '다중 인증 설정함',
+    'mfa_remove_method_notification' => '다중 인증 해제함',
 
     // Webhooks
-    'webhook_create' => 'created webhook',
-    'webhook_create_notification' => 'Webhook successfully created',
-    'webhook_update' => 'updated webhook',
-    'webhook_update_notification' => 'Webhook successfully updated',
-    'webhook_delete' => 'deleted webhook',
-    'webhook_delete_notification' => 'Webhook successfully deleted',
+    'webhook_create' => '웹 훅 만들기',
+    'webhook_create_notification' => '웹 훅 생성함',
+    'webhook_update' => '웹 훅 수정하기',
+    'webhook_update_notification' => '웹 훅 수정함',
+    'webhook_delete' => '웹 훅 지우기',
+    'webhook_delete_notification' => '웹 훅 삭제함',
+
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
 
     // Other
     'commented_on'                => '댓글 쓰기',
-    'permissions_update'          => 'updated permissions',
+    'permissions_update'          => '권한 수정함',
 ];
index 1bb8a8538469f46b54ca5cdf0ce3ffa44eda56f8..284ab3352a687525409acbcb7a770657cd1158b9 100644 (file)
@@ -19,12 +19,12 @@ return [
     'name' => '이름',
     'username' => '사용자 이름',
     'email' => '메일 주소',
-    'password' => '비밀번호',
-    'password_confirm' => '비밀번호 확인',
-    'password_hint' => 'Must be at least 8 characters',
-    'forgot_password' => '비밀번호를 잊었나요?',
+    'password' => '패스워드',
+    'password_confirm' => '패스워드 확인',
+    'password_hint' => '여덟 글자를 넘어야 합니다.',
+    'forgot_password' => '패스워드를 잊었나요?',
     'remember_me' => '로그인 유지',
-    'ldap_email_hint' => '이 계정에 대한 메일 주소를 입력하세요.',
+    'ldap_email_hint' => '계정에 연결한 메일 주소를 입력하세요.',
     'create_account' => '가입',
     'already_have_account' => '계정이 있나요?',
     'dont_have_account' => '계정이 없나요?',
@@ -39,13 +39,13 @@ return [
     'register_success' => '가입했습니다! 이제 로그인할 수 있습니다.',
 
     // Password Reset
-    'reset_password' => '비밀번호 바꾸기',
+    'reset_password' => '패스워드 바꾸기',
     'reset_password_send_instructions' => '메일 주소를 입력하세요. 이 주소로 해당 과정을 위한 링크를 보낼 것입니다.',
     'reset_password_send_button' => '메일 보내기',
-    'reset_password_sent' => '시스템에서 이메일 주소가 발견되면, 암호 재설정 링크가 :email로 전송된다.',
-    'reset_password_success' => '비밀번호를 바꿨습니다.',
-    'email_reset_subject' => ':appName 비밀번호 바꾸기',
-    'email_reset_text' => '비밀번호를 바꿉니다.',
+    'reset_password_sent' => '패스워드를 바꿀 수 있는 링크를 :email로 보낼 것입니다.',
+    'reset_password_success' => '패스워드를 바꿨습니다.',
+    'email_reset_subject' => ':appName 패스워드 바꾸기',
+    'email_reset_text' => '패스워드를 바꿉니다.',
     'email_reset_not_requested' => '원하지 않는다면 이 과정은 필요 없습니다.',
 
     // Email Confirmation
@@ -54,7 +54,7 @@ return [
     'email_confirm_text' => '다음 버튼을 눌러 인증하세요:',
     'email_confirm_action' => '메일 인증',
     'email_confirm_send_error' => '메일을 보낼 수 없었습니다.',
-    'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.',
+    'email_confirm_success' => '메일 인증을 성공했습니다. 이 메일 주소로 로그인할 수 있습니다.',
     'email_confirm_resent' => '다시 보냈습니다. 메일함을 확인하세요.',
 
     'email_not_confirmed' => '인증하지 않았습니다.',
@@ -67,44 +67,44 @@ return [
     'user_invite_email_subject' => ':appName에서 권유를 받았습니다.',
     'user_invite_email_greeting' => ':appName에서 가입한 기록이 있습니다.',
     'user_invite_email_text' => '다음 버튼을 눌러 확인하세요:',
-    'user_invite_email_action' => '비밀번호 설정',
+    'user_invite_email_action' => '패스워드 설정',
     'user_invite_page_welcome' => ':appName에 오신 것을 환영합니다!',
-    'user_invite_page_text' => ':appName에 로그인할 때 입력할 비밀번호를 설정하세요.',
-    'user_invite_page_confirm_button' => '비밀번호 확인',
-    'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!',
+    'user_invite_page_text' => ':appName에 로그인할 때 입력할 패스워드를 설정하세요.',
+    'user_invite_page_confirm_button' => '패스워드 확인',
+    'user_invite_success_login' => '입력한 패스워드로 :appName에 로그인할 수 있습니다.',
 
     // Multi-factor Authentication
-    'mfa_setup' => 'Setup Multi-Factor Authentication',
-    'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
-    'mfa_setup_configured' => 'Already configured',
-    'mfa_setup_reconfigure' => 'Reconfigure',
-    'mfa_setup_remove_confirmation' => 'Are you sure you want to remove this multi-factor authentication method?',
-    'mfa_setup_action' => 'Setup',
-    'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.',
-    'mfa_option_totp_title' => 'Mobile App',
-    'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
-    'mfa_option_backup_codes_title' => 'Backup Codes',
-    'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
-    'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
-    'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
-    'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.',
-    'mfa_gen_backup_codes_download' => 'Download Codes',
-    'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once',
-    'mfa_gen_totp_title' => 'Mobile App Setup',
-    'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
-    'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.',
-    'mfa_gen_totp_verify_setup' => 'Verify Setup',
-    'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:',
-    'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here',
-    'mfa_verify_access' => 'Verify Access',
-    'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
-    'mfa_verify_no_methods' => 'No Methods Configured',
-    'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
-    'mfa_verify_use_totp' => 'Verify using a mobile app',
-    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
-    'mfa_verify_backup_code' => 'Backup Code',
-    'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
-    'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
-    'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
-    'mfa_setup_login_notification' => 'Multi-factor method configured, Please now login again using the configured method.',
+    'mfa_setup' => '다중 인증 설정',
+    'mfa_setup_desc' => '추가 보안 계층으로 다중 인증을 설정합니다.',
+    'mfa_setup_configured' => '설정되어 있습니다.',
+    'mfa_setup_reconfigure' => '다시 설정',
+    'mfa_setup_remove_confirmation' => '다중 인증을 해제할까요?',
+    'mfa_setup_action' => '설정',
+    'mfa_backup_codes_usage_limit_warning' => '남은 백업 코드가 다섯 개 미만입니다. 새 백업 코드 세트를 생성하지 않아 코드가 소진되면 계정이 잠길 수 있습니다.',
+    'mfa_option_totp_title' => '모바일 앱',
+    'mfa_option_totp_desc' => '다중 인증에는 Google Authenticator, Authy나 Microsoft Authenticator와 같은 TOTP 지원 모바일 앱이 필요합니다.',
+    'mfa_option_backup_codes_title' => '백업 코드',
+    'mfa_option_backup_codes_desc' => '일회성 백업 코드를 안전한 장소에 보관하세요.',
+    'mfa_gen_confirm_and_enable' => '활성화',
+    'mfa_gen_backup_codes_title' => '백업 코드 설정',
+    'mfa_gen_backup_codes_desc' => '코드 목록을 안전한 장소에 보관하세요. 코드 중 하나를 2FA에 쓸 수 있습니다.',
+    'mfa_gen_backup_codes_download' => '코드 받기',
+    'mfa_gen_backup_codes_usage_warning' => '각 코드는 한 번씩만 유효합니다.',
+    'mfa_gen_totp_title' => '모바일 앱 설정',
+    'mfa_gen_totp_desc' => '다중 인증에는 Google Authenticator, Authy나 Microsoft Authenticator와 같은 TOTP 지원 모바일 앱이 필요합니다.',
+    'mfa_gen_totp_scan' => '인증 앱으로 QR 코드를 스캔하세요.',
+    'mfa_gen_totp_verify_setup' => '설정 확인',
+    'mfa_gen_totp_verify_setup_desc' => '인증 앱에서 생성한 코드를 입력하세요:',
+    'mfa_gen_totp_provide_code_here' => '백업 코드를 입력하세요.',
+    'mfa_verify_access' => '접근 확인',
+    'mfa_verify_access_desc' => '추가 인증으로 신원을 확인합니다. 설정한 방법 중 하나를 고르세요.',
+    'mfa_verify_no_methods' => '설정한 방법이 없습니다.',
+    'mfa_verify_no_methods_desc' => '다중 인증을 설정하지 않았습니다.',
+    'mfa_verify_use_totp' => '모바일 앱으로 인증하기',
+    'mfa_verify_use_backup_codes' => '백업 코드로 인증하세요.',
+    'mfa_verify_backup_code' => '백업 코드',
+    'mfa_verify_backup_code_desc' => '나머지 백업 코드 중 하나를 입력하세요:',
+    'mfa_verify_backup_code_enter_here' => '백업 코드를 입력하세요.',
+    'mfa_verify_totp_desc' => '모바일 앱에서 생성한 백업 코드를 입력하세요:',
+    'mfa_setup_login_notification' => '다중 인증을 설정했습니다. 설정한 방법으로 다시 로그인하세요.',
 ];
index cc318041f8168923920a18d0ab51321d69092966..81dc71eaa7518c933d5d236b842536300bc556f8 100644 (file)
@@ -39,14 +39,14 @@ return [
     'reset' => '리셋',
     'remove' => '제거',
     'add' => '추가',
-    'configure' => 'Configure',
+    'configure' => '설정',
     'fullscreen' => '전체화면',
-    'favourite' => 'Favourite',
-    'unfavourite' => 'Unfavourite',
-    'next' => 'Next',
-    'previous' => 'Previous',
-    'filter_active' => 'Active Filter:',
-    'filter_clear' => 'Clear Filter',
+    'favourite' => '북마크',
+    'unfavourite' => '좋아하지 않음',
+    'next' => '다음',
+    'previous' => '이전',
+    'filter_active' => '적용 중:',
+    'filter_clear' => '모든 필터 해제',
 
     // Sort Options
     'sort_options' => '정렬 기준',
@@ -54,7 +54,7 @@ return [
     'sort_ascending' => '오름차 순서',
     'sort_descending' => '내림차 순서',
     'sort_name' => '제목',
-    'sort_default' => 'Default',
+    'sort_default' => '기본값',
     'sort_created_at' => '만든 날짜',
     'sort_updated_at' => '수정한 날짜',
 
@@ -63,7 +63,7 @@ return [
     'no_activity' => '활동 없음',
     'no_items' => '항목 없음',
     'back_to_top' => '맨 위로',
-    'skip_to_main_content' => 'Skip to main content',
+    'skip_to_main_content' => '메인 항목으로',
     'toggle_details' => '내용 보기',
     'toggle_thumbnails' => '섬네일 보기',
     'details' => '정보',
@@ -71,32 +71,32 @@ return [
     'list_view' => '목록 보기',
     'default' => '기본 설정',
     'breadcrumb' => '탐색 경로',
-    'status' => 'Status',
-    'status_active' => 'Active',
-    'status_inactive' => 'Inactive',
-    'never' => 'Never',
-    'none' => 'None',
+    'status' => '상태',
+    'status_active' => '활성',
+    'status_inactive' => '비활성',
+    'never' => '안 함',
+    'none' => '없음',
 
     // Header
-    'header_menu_expand' => 'Expand Header Menu',
+    'header_menu_expand' => '헤더 메뉴 펼치기',
     'profile_menu' => '프로필',
     'view_profile' => '프로필 보기',
     'edit_profile' => '프로필 바꾸기',
-    'dark_mode' => '다크 모드',
-    'light_mode' => 'ë\9d¼ì\9d´í\8a¸ ëª¨ë\93\9c',
+    'dark_mode' => '어두운 테마',
+    'light_mode' => 'ë°\9dì\9d\80 í\85\8cë§\88',
 
     // Layout tabs
     'tab_info' => '정보',
-    'tab_info_label' => 'Tab: Show Secondary Information',
+    'tab_info_label' => 'Tab: 보조 정보 보이기',
     'tab_content' => '내용',
-    'tab_content_label' => 'Tab: Show Primary Content',
+    'tab_content_label' => 'Tab: 우선 항목 보이기',
 
     // Email Content
     'email_action_help' => ':actionText를 클릭할 수 없을 때는 웹 브라우저에서 다음 링크로 접속할 수 있습니다.',
-    'email_rights' => '모든 권리 소유',
+    'email_rights' => 'All rights reserved.',
 
     // Footer Link Options
     // Not directly used but available for convenience to users.
-    'privacy_policy' => 'Privacy Policy',
-    'terms_of_service' => 'Terms of Service',
+    'privacy_policy' => '개인 정보 처리 방침',
+    'terms_of_service' => '서비스 이용 약관',
 ];
index 9155b9490ee6f531db61753c5a9d7a8363c80926..a6730fc81b1c427ec001c747f6f379827a7a4087 100644 (file)
@@ -8,14 +8,14 @@ return [
     'image_select' => '이미지 선택',
     'image_all' => '모든 이미지',
     'image_all_title' => '모든 이미지',
-    'image_book_title' => 'ì\9d´ ì±\85ì\9e\90ì\97\90ì\84\9c ì\93°ê³  ì\9e\88ë\8a\94 ì\9d´ë¯¸ì§\80',
+    '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' => 'ì\9d´ ì\9d´ë¯¸ì§\80를 ì \95ë§\90 ì\82­ì \9cí\95\98ì\8b\9cê² ì\8aµë\8b\88ê¹\8c?',
+    'image_delete_confirm_text' => 'ì\9d´ ì\9d´ë¯¸ì§\80를 ì§\80ì\9a¸ ê±´ê°\80ì\9a\94?',
     'image_select_image' => '이미지 선택',
     'image_dropzone' => '여기에 이미지를 드롭하거나 여기를 클릭하세요. 이미지를 올릴 수 있습니다.',
     'images_deleted' => '이미지 삭제함',
index 87ef6e5b73b0de861496c56ef131342deed8e4cd..8f649f19dc1cf1875c90ec92d64c1cc79c2b7270 100644 (file)
@@ -10,8 +10,8 @@ return [
     'recently_created_pages' => '최근에 만든 문서',
     'recently_updated_pages' => '최근에 수정한 문서',
     'recently_created_chapters' => '최근에 만든 챕터',
-    'recently_created_books' => '최근에 만든 책',
-    'recently_created_shelves' => 'ìµ\9cê·¼ì\97\90 ë§\8cë\93  ì\84\9cê°\80',
+    'recently_created_books' => '최근에 만든 책',
+    'recently_created_shelves' => 'ìµ\9cê·¼ì\97\90 ë§\8cë\93  ì±\85ê½\82ì\9d´',
     'recently_update' => '최근에 수정함',
     'recently_viewed' => '최근에 읽음',
     'recent_activity' => '최근에 활동함',
@@ -22,13 +22,13 @@ return [
     'meta_created_name' => '만듦 :timeLength, :user',
     'meta_updated' => '수정함 :timeLength',
     'meta_updated_name' => '수정함 :timeLength, :user',
-    'meta_owned_name' => 'Owned by :user',
+    'meta_owned_name' => '소유함 :user',
     'entity_select' => '항목 선택',
     'images' => '이미지',
     'my_recent_drafts' => '내 최근의 초안 문서',
     'my_recently_viewed' => '내가 읽은 문서',
-    'my_most_viewed_favourites' => 'My Most Viewed Favourites',
-    'my_favourites' => 'My Favourites',
+    'my_most_viewed_favourites' => '많이 본 북마크',
+    'my_favourites' => '북마크',
     'no_pages_viewed' => '문서 없음',
     'no_pages_recently_created' => '문서 없음',
     'no_pages_recently_updated' => '문서 없음',
@@ -36,14 +36,14 @@ return [
     'export_html' => 'Contained Web(.html) 파일',
     'export_pdf' => 'PDF 파일',
     'export_text' => 'Plain Text(.txt) 파일',
-    'export_md' => 'Markdown File',
+    'export_md' => 'Markdown(.md) 파일',
 
     // Permissions and restrictions
     'permissions' => '권한',
     'permissions_intro' => '한번 허용하면 이 설정은 사용자 권한에 우선합니다.',
     'permissions_enable' => '설정 허용',
     'permissions_save' => '권한 저장',
-    'permissions_owner' => 'Owner',
+    'permissions_owner' => '소유자',
 
     // Search
     'search_results' => '검색 결과',
@@ -63,7 +63,7 @@ return [
     'search_permissions_set' => '권한 설정함',
     'search_created_by_me' => '내가 만듦',
     'search_updated_by_me' => '내가 수정함',
-    'search_owned_by_me' => 'Owned by me',
+    'search_owned_by_me' => '내가 소유함',
     'search_date_options' => '날짜',
     'search_updated_before' => '이전에 수정함',
     'search_updated_after' => '이후에 수정함',
@@ -73,78 +73,78 @@ return [
     'search_update' => '검색',
 
     // Shelves
-    'shelf' => 'ì\84\9cê°\80',
-    'shelves' => 'ì\84\9cê°\80',
-    'x_shelves' => 'ì\84\9cê°\80 :count개|총 :count개',
-    'shelves_long' => 'ì\84\9cê°\80',
-    'shelves_empty' => 'ë§\8cë\93  ì\84\9cê°\80가 없습니다.',
-    'shelves_create' => 'ì\84\9cê°\80 만들기',
-    'shelves_popular' => 'ë§\8eì\9d´ ì\9d½ì\9d\80 ì\84\9cê°\80',
-    'shelves_new' => 'ì\83\88ë¡\9cì\9a´ ì\84\9cê°\80',
-    'shelves_new_action' => 'ì\83\88ë¡\9cì\9a´ ì\84\9cê°\80',
-    'shelves_popular_empty' => 'ë§\8eì\9d´ ì\9d½ì\9d\80 ì\84\9cê°\80 목록',
-    'shelves_new_empty' => 'ì\83\88ë¡\9cì\9a´ ì\84\9cê°\80 목록',
+    'shelf' => 'ì±\85ê½\82ì\9d´',
+    'shelves' => 'ì±\85ê½\82ì\9d´',
+    'x_shelves' => 'ì±\85ê½\82ì\9d´ :count개|총 :count개',
+    'shelves_long' => 'ì±\85ê½\82ì\9d´',
+    'shelves_empty' => 'ë§\8cë\93  ì±\85ê½\82ì\9d´가 없습니다.',
+    'shelves_create' => 'ì±\85ê½\82ì\9d´ 만들기',
+    'shelves_popular' => 'ë§\8eì\9d´ ì\9d½ì\9d\80 ì±\85ê½\82ì\9d´',
+    'shelves_new' => 'ì\83\88ë¡\9cì\9a´ ì±\85ê½\82ì\9d´',
+    'shelves_new_action' => 'ì\83\88ë¡\9cì\9a´ ì±\85ê½\82ì\9d´',
+    'shelves_popular_empty' => 'ë§\8eì\9d´ ì\9d½ì\9d\80 ì±\85ê½\82ì\9d´ 목록',
+    'shelves_new_empty' => 'ì\83\88ë¡\9cì\9a´ ì±\85ê½\82ì\9d´ 목록',
     'shelves_save' => '저장',
-    'shelves_books' => 'ì\9d´ ì\84\9cê°\80ì\97\90 ì\9e\88ë\8a\94 ì±\85ì\9e\90들',
-    'shelves_add_books' => 'ì\9d´ ì\84\9cê°\80ì\97\90 ì±\85ì\9e\90 추가',
-    'shelves_drag_books' => 'ì\97¬ê¸°ì\97\90 ì±\85ì\9e\90를 드롭하세요.',
-    'shelves_empty_contents' => 'ì\9d´ ì\84\9cê°\80ì\97\90 ì±\85ì\9e\90ê°\80 없습니다.',
-    'shelves_edit_and_assign' => 'ì\84\9cê°\80 ë°\94꾸기ë¡\9c ì±\85ì\9e\90를 추가하세요.',
+    'shelves_books' => 'ì\9d´ ì±\85ê½\82ì\9d´ì\97\90 ì\9e\88ë\8a\94 ì±\85들',
+    'shelves_add_books' => 'ì\9d´ ì±\85ê½\82ì\9d´ì\97\90 ì±\85 추가',
+    'shelves_drag_books' => 'ì\97¬ê¸°ì\97\90 ì±\85ì\9d\84 드롭하세요.',
+    'shelves_empty_contents' => 'ì\9d´ ì±\85ê½\82ì\9d´ì\97\90 ì±\85ì\9d´ 없습니다.',
+    'shelves_edit_and_assign' => 'ì±\85ê½\82ì\9d´ ë°\94꾸기ë¡\9c ì±\85ì\9d\84 추가하세요.',
     'shelves_edit_named' => ':name 바꾸기',
-    'shelves_edit' => 'ì\84\9cê°\80 바꾸기',
-    'shelves_delete' => 'ì\84\9cê°\80 삭제하기',
+    'shelves_edit' => 'ì±\85ê½\82ì\9d´ 바꾸기',
+    'shelves_delete' => 'ì±\85ê½\82ì\9d´ 삭제하기',
     'shelves_delete_named' => ':name 삭제하기',
-    'shelves_delete_explain' => ":name을 지웁니다. 책는 지우지 않습니다.",
-    'shelves_delete_confirmation' => 'ì\9d´ ì\84\9cê°\80를 지울 건가요?',
-    'shelves_permissions' => 'ì\84\9cê°\80 권한',
-    'shelves_permissions_updated' => 'ì\84\9cê°\80 권한 바꿈',
-    'shelves_permissions_active' => 'ì\84\9cê°\80 권한 허용함',
-    'shelves_permissions_cascade_warning' => 'Permissions on bookshelves do not automatically cascade to contained books. This is because a book can exist on multiple shelves. Permissions can however be copied down to child books using the option found below.',
+    'shelves_delete_explain' => ":name을 지웁니다. 책는 지우지 않습니다.",
+    'shelves_delete_confirmation' => 'ì\9d´ ì±\85ê½\82ì\9d´를 지울 건가요?',
+    'shelves_permissions' => 'ì±\85ê½\82ì\9d´ 권한',
+    'shelves_permissions_updated' => 'ì±\85ê½\82ì\9d´ 권한 바꿈',
+    'shelves_permissions_active' => 'ì±\85ê½\82ì\9d´ 권한 허용함',
+    'shelves_permissions_cascade_warning' => '책을 여러 책꽂이에 들일 수 있고 책 권한과 책꽂이 권한은 별개입니다. 책꽂이 권한을 책 권한에 복사합니다.',
     'shelves_copy_permissions_to_books' => '권한 맞춤',
     'shelves_copy_permissions' => '실행',
-    'shelves_copy_permissions_explain' => 'ì\84\9cê°\80ì\9d\98 ëª¨ë\93  ì±\85ì\9e\90ì\97\90 ì\9d´ ê¶\8cí\95\9cì\9d\84 ì \81ì\9a©í\95©ë\8b\88ë\8b¤. ì\84\9cê°\80의 권한을 저장했는지 확인하세요.',
-    'shelves_copy_permission_success' => '책 :count개 권한 바꿈',
+    'shelves_copy_permissions_explain' => 'ì±\85ê½\82ì\9d´ì\9d\98 ëª¨ë\93  ì±\85ì\97\90 ì\9d´ ê¶\8cí\95\9cì\9d\84 ì \81ì\9a©í\95©ë\8b\88ë\8b¤. ì±\85ê½\82ì\9d´의 권한을 저장했는지 확인하세요.',
+    'shelves_copy_permission_success' => '책 :count개 권한 바꿈',
 
     // Books
-    'book' => 'ì\84\9cê³ ',
-    'books' => 'ì\84\9cê³ ',
-    'x_books' => '책 :count개|총 :count개',
-    'books_empty' => 'ë§\8cë\93  ì±\85ì\9e\90ê°\80 없습니다.',
-    'books_popular' => '많이 읽은 책',
-    'books_recent' => '최근에 읽은 책',
-    'books_new' => '새로운 책',
-    'books_new_action' => '새로운 책',
-    'books_popular_empty' => '많이 읽은 책 목록',
-    'books_new_empty' => '새로운 책 목록',
-    'books_create' => '책 만들기',
-    'books_delete' => '책 삭제하기',
+    'book' => 'ì±\85',
+    'books' => 'ì±\85',
+    'x_books' => '책 :count개|총 :count개',
+    'books_empty' => 'ë§\8cë\93  ì±\85ì\9d´ 없습니다.',
+    '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' => 'ì\9d´ ì±\85ì\9e\90를 지울 건가요?',
-    'books_edit' => '책 바꾸기',
+    'books_delete_confirmation' => 'ì\9d´ ì±\85ì\9d\84 지울 건가요?',
+    'books_edit' => '책 바꾸기',
     'books_edit_named' => ':bookName(을)를 바꿉니다.',
-    'books_form_book_name' => '책 이름',
+    'books_form_book_name' => '책 이름',
     'books_save' => '저장',
-    'books_permissions' => '책 권한',
+    'books_permissions' => '책 권한',
     'books_permissions_updated' => '권한 저장함',
-    'books_empty_contents' => 'ì\9d´ ì±\85ì\9e\90ì\97\90 ì±\95í\84°ë\82\98 ë¬¸ì\84\9cê°\80 ì\97\86ì\8aµë\8b\88ë\8b¤.',
+    'books_empty_contents' => '이 책에 챕터나 문서가 없습니다.',
     'books_empty_create_page' => '문서 만들기',
-    'books_empty_sort_current_book' => '읽고 있는 책 정렬',
+    'books_empty_sort_current_book' => '읽고 있는 책 정렬',
     'books_empty_add_chapter' => '챕터 만들기',
-    'books_permissions_active' => '책 권한 허용함',
-    'books_search_this' => 'ì\9d´ ì±\85ì\9e\90ì\97\90ì\84\9c ê²\80ì\83\89',
+    'books_permissions_active' => '책 권한 허용함',
+    'books_search_this' => '이 책에서 검색',
     'books_navigation' => '목차',
-    'books_sort' => '다른 책들',
+    '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_show_other' => '다른 책들',
     'books_sort_save' => '적용',
-    'books_copy' => 'Copy Book',
-    'books_copy_success' => 'Book successfully copied',
+    'books_copy' => '책 복사하기',
+    'books_copy_success' => '책 복사함',
 
     // Chapters
     'chapter' => '챕터',
@@ -155,7 +155,7 @@ return [
     'chapters_create' => '챕터 만들기',
     'chapters_delete' => '챕터 삭제하기',
     'chapters_delete_named' => ':chapterName(을)를 지웁니다.',
-    'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.',
+    'chapters_delete_explain' => '\':ChapterName\'에 있는 모든 페이지도 지웁니다.',
     'chapters_delete_confirm' => '이 챕터를 지울 건가요?',
     'chapters_edit' => '챕터 바꾸기',
     'chapters_edit_named' => ':chapterName 바꾸기',
@@ -163,8 +163,8 @@ return [
     'chapters_move' => '챕터 이동하기',
     'chapters_move_named' => ':chapterName 이동하기',
     'chapter_move_success' => ':bookName(으)로 옮김',
-    'chapters_copy' => 'Copy Chapter',
-    'chapters_copy_success' => 'Chapter successfully copied',
+    'chapters_copy' => '챕터 복사하기',
+    'chapters_copy_success' => '챕터 복사함',
     'chapters_permissions' => '챕터 권한',
     'chapters_empty' => '이 챕터에 문서가 없습니다.',
     'chapters_permissions_active' => '문서 권한 허용함',
@@ -186,7 +186,7 @@ return [
     'pages_delete_success' => '문서 지움',
     'pages_delete_draft_success' => '초안 문서 지움',
     'pages_delete_confirm' => '이 문서를 지울 건가요?',
-    'pages_delete_draft_confirm' => 'ì´\88ì\95\88 ë¬¸ì\84\9c를 ì\82­ì \9cí\95  건가요?',
+    'pages_delete_draft_confirm' => 'ì\9d´ ì´\88ì\95\88ì\9d\84 ì§\80ì\9a¸ 건가요?',
     'pages_editing_named' => ':pageName 수정',
     'pages_edit_draft_options' => '초안 문서 옵션',
     'pages_edit_save_draft' => '초안으로 저장',
@@ -219,7 +219,7 @@ return [
     'pages_revisions' => '문서 수정본',
     'pages_revisions_named' => ':pageName 수정본',
     'pages_revision_named' => ':pageName 수정본',
-    'pages_revision_restored_from' => 'Restored from #:id; :summary',
+    'pages_revision_restored_from' => '#:id; :summary에서 복구함',
     'pages_revisions_created_by' => '만든 사용자',
     'pages_revisions_date' => '수정한 날짜',
     'pages_revisions_number' => 'No.',
@@ -238,7 +238,7 @@ return [
     'pages_initial_name' => '제목 없음',
     'pages_editing_draft_notification' => ':timeDiff에 초안 문서입니다.',
     'pages_draft_edited_notification' => '최근에 수정한 문서이기 때문에 초안 문서를 폐기하는 편이 좋습니다.',
-    'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.',
+    'pages_draft_page_changed_since_creation' => '최근에 수정한 문서이기 때문에 초안 문서를 폐기하는 편이 좋습니다.',
     'pages_draft_edit_active' => [
         'start_a' => ':count명이 이 문서를 수정하고 있습니다.',
         'start_b' => ':userName이 이 문서를 수정하고 있습니다.',
@@ -253,25 +253,25 @@ return [
     // Editor Sidebar
     'page_tags' => '문서 꼬리표',
     'chapter_tags' => '챕터 꼬리표',
-    'book_tags' => '책 꼬리표',
-    'shelf_tags' => 'ì\84\9cê°\80 꼬리표',
+    'book_tags' => '책 꼬리표',
+    'shelf_tags' => 'ì±\85ê½\82ì\9d´ 꼬리표',
     'tag' => '꼬리표',
     'tags' =>  '꼬리표',
     'tag_name' =>  '꼬리표 이름',
     'tag_value' => '리스트 값 (선택 사항)',
-    'tags_explain' => "태그로 문서를 분류하세요.",
-    'tags_add' => '태그 추가',
-    'tags_remove' => '태그 삭제',
-    'tags_usages' => 'Total tag usages',
-    'tags_assigned_pages' => 'Assigned to Pages',
-    'tags_assigned_chapters' => 'Assigned to Chapters',
-    'tags_assigned_books' => 'Assigned to Books',
-    'tags_assigned_shelves' => 'Assigned to Shelves',
-    'tags_x_unique_values' => ':count unique values',
-    'tags_all_values' => 'All values',
-    'tags_view_tags' => 'View Tags',
-    'tags_view_existing_tags' => 'View existing tags',
-    'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
+    'tags_explain' => "꼬리표로 문서를 분류하세요.",
+    'tags_add' => '꼬리표 추가',
+    'tags_remove' => '꼬리표 삭제',
+    'tags_usages' => '모든 꼬리표',
+    'tags_assigned_pages' => '문서에 꼬리표 지정함',
+    'tags_assigned_chapters' => '챕터에 꼬리표 지정함',
+    'tags_assigned_books' => '책에 꼬리표 지정함',
+    'tags_assigned_shelves' => '책꽂이에 꼬리표 지정함',
+    'tags_x_unique_values' => ':count 중복 없는 값',
+    'tags_all_values' => '모든 값',
+    'tags_view_tags' => '꼬리표 보기',
+    'tags_view_existing_tags' => '사용 중인 꼬리표 보기',
+    'tags_list_empty_hint' => '꼬리표는 에디터 사이드바나 책, 챕터 또는 책꽂이 정보 편집에서 지정할 수 있습니다.',
     'attachments' => '첨부 파일',
     'attachments_explain' => '파일이나 링크를 첨부하세요. 정보 탭에 나타납니다.',
     'attachments_explain_instant_save' => '여기에서 바꾼 내용은 바로 적용합니다.',
@@ -279,7 +279,7 @@ return [
     'attachments_upload' => '파일 올리기',
     'attachments_link' => '링크로 첨부',
     'attachments_set_link' => '링크 설정',
-    'attachments_delete' => '이 첨부파일을 정말 삭제하시겠습니까?',
+    'attachments_delete' => '이 첨부 파일을 지울 건가요?',
     'attachments_dropzone' => '여기에 파일을 드롭하거나 여기를 클릭하세요.',
     'attachments_no_files' => '올린 파일 없음',
     'attachments_explain_link' => '파일을 올리지 않고 링크로 첨부할 수 있습니다.',
@@ -310,8 +310,8 @@ return [
     'profile_created_content' => '활동한 이력',
     'profile_not_created_pages' => ':userName(이)가 만든 문서 없음',
     'profile_not_created_chapters' => ':userName(이)가 만든 챕터 없음',
-    'profile_not_created_books' => ':userName(이)가 만든 책 없음',
-    'profile_not_created_shelves' => ':userName(ì\9d´)ê°\80 ë§\8cë\93  ì\84\9cê°\80 없음',
+    'profile_not_created_books' => ':userName(이)가 만든 책 없음',
+    'profile_not_created_shelves' => ':userName(ì\9d´)ê°\80 ë§\8cë\93  ì±\85ê½\82ì\9d´ 없음',
 
     // Comments
     'comment' => '댓글',
@@ -338,10 +338,10 @@ return [
     'revision_cannot_delete_latest' => '현재 판본은 지울 수 없습니다.',
 
     // Copy view
-    'copy_consider' => 'Please consider the below when copying content.',
-    'copy_consider_permissions' => 'Custom permission settings will not be copied.',
-    'copy_consider_owner' => 'You will become the owner of all copied content.',
-    'copy_consider_images' => 'Page image files will not be duplicated & the original images will retain their relation to the page they were originally uploaded to.',
-    'copy_consider_attachments' => 'Page attachments will not be copied.',
-    'copy_consider_access' => 'A change of location, owner or permissions may result in this content being accessible to those previously without access.',
+    'copy_consider' => '항목을 복사할 때 다음을 고려하세요.',
+    'copy_consider_permissions' => '권한 설정은 복사되지 않습니다.',
+    'copy_consider_owner' => '복사한 항목의 소유자가 됩니다.',
+    'copy_consider_images' => '이미지 파일은 복사되지 않습니다. 올라가 있던 이미지가 사라지지 않습니다.',
+    'copy_consider_attachments' => '첨부 파일은 복사되지 않습니다.',
+    'copy_consider_access' => '경로, 소유자, 권한이 바뀌면 이 문서를 본 적 없는 사용자가 볼 수도 있습니다.',
 ];
index b52ee91bc0e43d847a6ef22390141ab79838a955..81dbeae732ff876c3131dd9155b1503537502e49 100644 (file)
@@ -18,15 +18,15 @@ return [
     'ldap_fail_authed' => '이 정보로 LDAP 서버에 접근할 수 없습니다.',
     'ldap_extension_not_installed' => 'PHP에 LDAP 확장 도구를 설치하세요.',
     'ldap_cannot_connect' => 'LDAP 서버에 연결할 수 없습니다.',
-    'saml_already_logged_in' => '이미 로그인되어있습니다.',
-    'saml_user_not_registered' => '사용자 이름이 등록되지 않았으며 자동 계정 등록이 활성화되지 않았습니다.',
-    'saml_no_email_address' => 'ì\9d´ ì\82¬ì\9a©ì\9e\90ì\97\90 ë\8c\80í\95\98ì\97¬ ì\99¸ë¶\80 ì\9d¸ì¦\9dì\8b\9cì\8a¤í\85\9cì\97\90 ì\9d\98í\95´ ì \9cê³µë\90\9c ë\8d°ì\9d´í\83\80 ì¤\91 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì°¾ì\9d\84 ì\88\98 없습니다.',
-    'saml_invalid_response_id' => 'ì\9d´ ì\9d\91ì\9a©í\94\84ë¡\9cê·¸ë\9e¨ì\97\90 ì\9d\98í\95´ ì\8b\9cì\9e\91ë\90\9c í\94\84ë¡\9cì\84¸ì\8a¤ì\97\90 ì\9d\98í\95\98ë©´ ì\99¸ë¶\80 ì\9d¸ì¦\9dì\8b\9cì\8a¤í\85\9cì\9c¼ë¡\9c ì\98¨ ì\9a\94ì²­ì\9d´ ì\9d¸ì\8b\9dë\90\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤. ì\9d¸ì¦\9d í\9b\84ì\97\90 ë\92¤ë¡\9cê°\80기 ê¸°ë\8a¥ì\9d\84 ì\82¬ì\9a©í\96\88ì\9d\84 ê²½ì\9a° ì\9d´ë\9f° í\98\84ì\83\81ì\9d´ ë°\9cì\83\9dí\95  ì\88\98 ì\9e\88ì\8aµ니다.',
-    'saml_fail_authed' => '시스템 로그인에 실패하였습니다. ( 해당 시스템이 인증성공값을 제공하지 않았습니다. )',
-    'oidc_already_logged_in' => 'Already logged in',
-    'oidc_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
-    'oidc_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
-    'oidc_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'saml_already_logged_in' => '로그인 중입니다.',
+    'saml_user_not_registered' => ':name 사용자가 없습니다. 자동 가입 옵션이 비활성 상태입니다.',
+    'saml_no_email_address' => 'ì\9d¸ì¦\9d ì\8b\9cì\8a¤í\85\9cì\9d´ ì \9cê³µí\95\9c ë©\94ì\9d¼ ì£¼ì\86\8cê°\80 없습니다.',
+    'saml_invalid_response_id' => 'ì\9d¸ì¦\9d ì\8b\9cì\8a¤í\85\9cì\9d´ ì\9a\94ì²­ì\9d\84 ë°\9bì§\80 ëª»í\96\88ì\8aµë\8b\88ë\8b¤. ì\9d¸ì¦\9d í\9b\84 ì\9d´ì \84 í\8e\98ì\9d´ì§\80ë¡\9c ë\8f\8cì\95\84ê°\88 ë\95\8c ë°\9cì\83\9dí\95  ì\88\98 ì\9e\88ë\8a\94 í\98\84ì\83\81ì\9e\85니다.',
+    'saml_fail_authed' => ':system에 로그인할 수 없습니다.',
+    'oidc_already_logged_in' => '로그인 중입니다.',
+    'oidc_user_not_registered' => ':name 사용자가 없습니다. 자동 가입 옵션이 비활성 상태입니다.',
+    'oidc_no_email_address' => '인증 시스템이 제공한 메일 주소가 없습니다.',
+    'oidc_fail_authed' => ':system에 로그인할 수 없습니다.',
     'social_no_action_defined' => '무슨 활동인지 알 수 없습니다.',
     'social_login_bad_response' => ":socialAccount에 로그인할 수 없습니다. : \\n:error",
     'social_account_in_use' => ':socialAccount(을)를 가진 사용자가 있습니다. :socialAccount로 로그인하세요.',
@@ -37,7 +37,7 @@ return [
     'social_account_register_instructions' => '계정이 없어도 :socialAccount로 가입할 수 있습니다.',
     'social_driver_not_found' => '가입할 수 없습니다.',
     'social_driver_not_configured' => ':socialAccount가 유효하지 않습니다.',
-    'invite_token_expired' => '이 링크는 더 이상 유효하지 않습니다. 비밀번호를 바꾸세요.',
+    'invite_token_expired' => '이 링크는 더 이상 유효하지 않습니다. 패스워드를 바꾸세요.',
 
     // System
     'path_not_writable' => ':filePath에 쓰는 것을 서버에서 허용하지 않습니다.',
@@ -58,12 +58,12 @@ return [
 
     // Entities
     'entity_not_found' => '항목이 없습니다.',
-    'bookshelf_not_found' => 'ì\84\9cê°\80가 없습니다.',
-    'book_not_found' => 'ì±\85ì\9e\90ê°\80 없습니다.',
+    'bookshelf_not_found' => 'ì±\85ê½\82ì\9d´가 없습니다.',
+    'book_not_found' => 'ì±\85ì\9d´ 없습니다.',
     'page_not_found' => '문서가 없습니다.',
     'chapter_not_found' => '챕터가 없습니다.',
-    'selected_book_not_found' => '고른 ì±\85ì\9e\90ê°\80 없습니다.',
-    'selected_book_chapter_not_found' => '고른 ì±\85ì\9e\90나 챕터가 없습니다.',
+    'selected_book_not_found' => '고른 ì±\85ì\9d´ 없습니다.',
+    'selected_book_chapter_not_found' => '고른 ì±\85ì\9d´나 챕터가 없습니다.',
     'guests_cannot_save_drafts' => 'Guest는 초안 문서를 보관할 수 없습니다.',
 
     // Users
@@ -86,24 +86,24 @@ return [
     // Error pages
     '404_page_not_found' => '404 Not Found',
     'sorry_page_not_found' => '문서를 못 찾았습니다.',
-    'sorry_page_not_found_permission_warning' => 'ì\9d´ í\8e\98ì\9d´ì§\80ê°\80 ì¡´ì\9e¬í\95\98기를 ê¸°ë\8c\80í\96\88ë\8b¤ë©´, ë³¼ ì\88\98 ì\9e\88ë\8a\94 ê¶\8cí\95\9cì\9d´ ì\97\86ì\9d\84 ì\88\98 ì\9e\88ë\8b¤.',
+    'sorry_page_not_found_permission_warning' => '문ì\84\9c를 ë³¼ ê¶\8cí\95\9cì\9d´ ì\97\86ì\8aµë\8b\88ë\8b¤.',
     'image_not_found' => 'Image Not Found',
-    'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.',
-    'image_not_found_details' => 'If you expected this image to exist it might have been deleted.',
+    'image_not_found_subtitle' => '이미지를 못 찾았습니다.',
+    'image_not_found_details' => '이미지가 지워졌을 수 있습니다.',
     'return_home' => '처음으로 돌아가기',
     'error_occurred' => '문제가 생겼습니다.',
-    'app_down' => ':appNameì\97\90 ë¬¸ì \9cê°\80 ì\9e\88ë\8a\94 ê²\83 ê°\99ì\8aµë\8b\88ë\8b¤',
-    'back_soon' => 'ê³§ ë\90\98ë\8f\8cì\95\84ê°\91ë\8b\88ë\8b¤.',
+    'app_down' => ':appNameì\97\90 ë¬¸ì \9cê°\80 ì\83\9dê²¼ì\8aµë\8b\88ë\8b¤.',
+    'back_soon' => '곧 돌아갑니다.',
 
     // API errors
-    'api_no_authorization_found' => '요청에서 인증 토큰을 찾을 수 없다.',
-    'api_bad_authorization_format' => 'ì\9a\94ì²­ì\97\90ì\84\9c ì\9d¸ì¦\9d í\86 í\81°ì\9d\84 ì°¾ì\95\98ì§\80ë§\8c, í\98\95ì\8b\9dì\9d´ ì\9e\98못ë\90\9c ê²\83 ê°\99다.',
-    'api_user_token_not_found' => 'ì \9cê³µë\90\9c ì\9d¸ì¦\9d í\86 í\81°ê³¼ ì\9d¼ì¹\98í\95\98ë\8a\94 API í\86 í\81°ì\9d\84 ì°¾ì\9d\84 ì\88\98 ì\97\86다.',
-    'api_incorrect_token_secret' => '사용한 API 토큰에 대해 제공한 시크릿이 맞지 않는다.',
-    'api_user_no_api_permission' => '사용한 API 토큰의 소유자가, API 호출을 할 수 있는 권한이 없다.',
-    'api_user_token_expired' => 'ì\82¬ì\9a©ë\90\9c ì\9d¸ì¦\9d í\86 í\81°ì\9d´ ë§\8cë£\8cë\90\98ì\97\88ë\8b¤.',
+    'api_no_authorization_found' => '요청에서 인증 토큰을 찾을 수 없습니다.',
+    'api_bad_authorization_format' => 'ì\9a\94ì²­ì\97\90ì\84\9c ì\9d¸ì¦\9d í\86 í\81°ì\9d\84 ì°¾ì\95\98ì\9c¼ë\82\98 í\98\95ì\8b\9dì\97\90 ë¬¸ì \9cê°\80 ì\9e\88ì\8aµë\8b\88다.',
+    'api_user_token_not_found' => 'ì\9d¸ì¦\9d í\86 í\81°ê³¼ ì\9d¼ì¹\98í\95\98ë\8a\94 API í\86 í\81°ì\9d\84 ì°¾ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88다.',
+    'api_incorrect_token_secret' => 'API 토큰이 제공한 암호에 문제가 있습니다.',
+    'api_user_no_api_permission' => 'API 토큰의 소유자가 API를 호출할 권한이 없습니다.',
+    'api_user_token_expired' => 'ì\9d¸ì¦\9d í\86 í\81°ì\9d´ ë§\8cë£\8cë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.',
 
     // Settings & Maintenance
-    'maintenance_test_email_failure' => '테스트 이메일 발송할 때 발생한 오류:',
+    'maintenance_test_email_failure' => '메일을 발송하는 도중 문제가 생겼습니다:',
 
 ];
index f93902aefd42bb257a14df002c8d989faae5e071..064f4d92576ba81a3a3ff88befa7c355bb377034 100644 (file)
@@ -8,8 +8,8 @@ return [
 
     'password' => '여덟 글자를 넘어야 합니다.',
     'user' => "메일 주소를 가진 사용자가 없습니다.",
-    'token' => '비밀번호 재설정 토큰이 이 이메일 주소에 유효하지 않습니다.',
+    'token' => '유효하지 않거나 만료된 토큰입니다.',
     'sent' => '메일을 보냈습니다.',
-    'reset' => '비밀번호를 바꿨습니다.',
+    'reset' => '패스워드를 바꿨습니다.',
 
 ];
index 11c2da928d9264030171be2952f5e296a4b3bcd4..a7ffc1d525d0f18f661e069aed92e6771f262a99 100755 (executable)
@@ -33,96 +33,96 @@ return [
     'app_logo' => '사이트 로고',
     'app_logo_desc' => '높이를 43px로 구성하세요. 큰 이미지는 축소합니다.',
     'app_primary_color' => '사이트 색채',
-    'app_primary_color_desc' => '16ì§\84ì\88\98ë¡\9c êµ¬ì\84±í\95\98ì\84¸ì\9a\94. ë¹\84ì\9b ì\9d\84 ë\95\8cë\8a\94 ê¸°ë³¸ ì\83\89ì±\84로 설정합니다.',
+    'app_primary_color_desc' => '16ì§\84ì\88\98ë¡\9c êµ¬ì\84±í\95\98ì\84¸ì\9a\94. ë¹\84ì\9b ì\9d\84 ë\95\8cë\8a\94 ê¸°ë³¸ ì\83\89ì\83\81ì\9c¼로 설정합니다.',
     'app_homepage' => '처음 페이지',
     'app_homepage_desc' => '고른 페이지에 설정한 권한은 무시합니다.',
     'app_homepage_select' => '문서 고르기',
-    'app_footer_links' => 'Footer Links',
-    'app_footer_links_desc' => 'Add links to show within the site footer. These will be displayed at the bottom of most pages, including those that do not require login. You can use a label of "trans::<key>" to use system-defined translations. For example: Using "trans::common.privacy_policy" will provide the translated text "Privacy Policy" and "trans::common.terms_of_service" will provide the translated text "Terms of Service".',
-    'app_footer_links_label' => 'Link Label',
-    'app_footer_links_url' => 'Link URL',
-    'app_footer_links_add' => 'Add Footer Link',
+    'app_footer_links' => '바닥글 링크',
+    'app_footer_links_desc' => '바닥글 링크는 로그인하지 않아도 보일 수 있습니다. "trans::<key>" 레이블로 시스템에 있는 번역을 가져옵니다. trans::common.privacy_policy와 trans::common.terms_of_service를 쓸 수 있습니다.',
+    'app_footer_links_label' => '링크 레이블',
+    'app_footer_links_url' => '링크 URL',
+    'app_footer_links_add' => '바닥글 링크 추가',
     'app_disable_comments' => '댓글 사용 안 함',
     'app_disable_comments_toggle' => '댓글 사용 안 함',
     'app_disable_comments_desc' => '모든 페이지에서 댓글을 숨깁니다.',
 
     // Color settings
     'content_colors' => '본문 색상',
-    'content_colors_desc' => 'í\8e\98ì\9d´ì§\80ì\97\90 ì\9e\88ë\8a\94 ëª¨ë\93  ì\9a\94ì\86\8cì\97\90 ë\8c\80í\95\9c ì\83\89ì\83\81 ì§\80ì \95í\95\98ì\84¸ì\9a\94. ê°\80ë\8f\85ì\84±ì\9d\84 ì\9c\84í\95´ ê¸°ë³¸ ì\83\89ì\83\81ê³¼ ì\9c ì\82¬í\95\9c ë°\9d기를 ê°\80ì§\84 ì\83\89ì\83\81ì\9c¼ë¡\9c ì¶\94ì²\9cë\90©ë\8b\88ë\8b¤.',
-    'bookshelf_color' => '책선반 색상',
+    'content_colors_desc' => '기본 ì\83\89ì\83\81ê³¼ ì\9c ì\82¬í\95\9c ë°\9d기를 ê°\80ì§\84 ì\83\89ì\83\81ì\9c¼ë¡\9c ê°\80ë\8f\85ì\84±ì\9d\84 ë\86\92ì\9d´ë\8a\94 ê²\83ì\9d\84 ì¶\94ì²\9cí\95©ë\8b\88ë\8b¤.',
+    'bookshelf_color' => '책꽂이 색상',
     'book_color' => '책 색상',
     'chapter_color' => '챕터 색상',
     'page_color' => '페이지 색상',
-    'page_draft_color' => '초안 페이지 색상',
+    'page_draft_color' => '초안 문서 색상',
 
     // Registration Settings
     'reg_settings' => '가입',
-    'reg_enable' => '사이트 가입 허용',
-    'reg_enable_toggle' => '사이트 가입 허용',
-    'reg_enable_desc' => '가입한 사용자는 단일한 권한을 가집니다.',
-    'reg_default_role' => 'ê°\80ì\9e\85í\95\9c ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¸°ë³¸ ê¶\8cí\95\9c',
-    'reg_enable_external_warning' => '외부 LDAP 또는 SAML 인증이 활성화되어 있는 동안에는 위의 옵션이 무시된다. 사용 중인 외부 시스템에 대해 인증이 성공하면, 존재하지 않는 회원에 대한 사용자 계정이 자동으로 생성된다.',
+    'reg_enable' => '가입 받기',
+    'reg_enable_toggle' => '가입 받기',
+    'reg_enable_desc' => '가입한 사용자는 한 가지 권한을 가집니다.',
+    'reg_default_role' => '기본 권한',
+    'reg_enable_external_warning' => '외부 시스템이 LDAP나 SAML 인증이 활성화되어 있다면 설정과 관계없이 인증을 성공할 때 없는 계정을 만듭니다.',
     'reg_email_confirmation' => '메일 주소 확인',
-    'reg_email_confirmation_toggle' => '주소 확인 요구',
-    'reg_confirm_email_desc' => '도메인 차단을 쓰고 있으면 메일 주소를 확인해야 하고, 이 설정은 무시합니다.',
+    'reg_email_confirmation_toggle' => '메일 주소 확인',
+    'reg_confirm_email_desc' => '도메인 차단을 활성화하면 설정과 관계없이 메일 주소 확인이 필요합니다.',
     'reg_confirm_restrict_domain' => '도메인 차단',
-    'reg_confirm_restrict_domain_desc' => '쉼표로 분리해서 가입을 차단할 메일 주소 도메인을 쓰세요. 이 설정과 관계없이 사용자가 메일을 보내고, 가입한 사용자가 메일 주소를 바꿀 수 있습니다.',
-    'reg_confirm_restrict_domain_placeholder' => '없음',
+    'reg_confirm_restrict_domain_desc' => '가입을 차단할 도메인을 쉼표로 구분하여 입력하세요. 사용자가 메일 주소 확인에 성공하면 메일 주소를 바꿀 수 있습니다.',
+    'reg_confirm_restrict_domain_placeholder' => 'ì°¨ë\8b¨í\95\9c ë\8f\84ë©\94ì\9d¸ ì\97\86ì\9d\8c',
 
     // Maintenance settings
     'maint' => '데이터',
     'maint_image_cleanup' => '이미지 정리',
     'maint_image_cleanup_desc' => '중복한 이미지를 찾습니다. 실행하기 전에 이미지를 백업하세요.',
-    'maint_delete_images_only_in_revisions' => 'Also delete images that only exist in old page revisions',
+    'maint_delete_images_only_in_revisions' => '지난 버전에만 있는 이미지 지우기',
     'maint_image_cleanup_run' => '실행',
     'maint_image_cleanup_warning' => '이미지 :count개를 지울 건가요?',
     'maint_image_cleanup_success' => '이미지 :count개 삭제함',
     'maint_image_cleanup_nothing_found' => '삭제한 것 없음',
     'maint_send_test_email' => '테스트 메일 보내기',
-    'maint_send_test_email_desc' => 'í\94\84ë¡\9cí\95\84ì\97\90 ëª\85ì\8b\9cë\90\9c ì\9d´ë©\94ì\9d¼ì£¼ì\86\8cë¡\9c í\85\8cì\8a¤í\8a¸ ë©\94ì\9d¼ì\9d´ ì \84ì\86¡ë\90©ë\8b\88ë\8b¤.',
+    'maint_send_test_email_desc' => 'ë©\94ì\9d¼ ì£¼ì\86\8cë¡\9c í\85\8cì\8a¤í\8a¸ ë©\94ì\9d¼ì\9d\84 ì \84ì\86¡í\95©ë\8b\88ë\8b¤.',
     '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' => '축하합니다! 이 메일을 받음으로 이메일 설정이 정상적으로 되었음을 확인하였습니다.',
-    'maint_recycle_bin_desc' => 'Deleted shelves, books, chapters & pages are sent to the recycle bin so they can be restored or permanently deleted. Older items in the recycle bin may be automatically removed after a while depending on system configuration.',
-    'maint_recycle_bin_open' => 'Open Recycle Bin',
+    'maint_send_test_email_mail_greeting' => '메일을 수신했습니다.',
+    'maint_send_test_email_mail_text' => '메일을 정상적으로 수신했습니다.',
+    'maint_recycle_bin_desc' => '지워진 콘텐츠는 휴지통에 들어가 복원하거나 영구 삭제할 수 있습니다. 오래된 항목은 자동으로 지워집니다.',
+    'maint_recycle_bin_open' => '휴지통 열기',
 
     // Recycle Bin
-    'recycle_bin' => 'Recycle Bin',
-    'recycle_bin_desc' => 'Here you can restore items that have been deleted or choose to permanently remove them from the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.',
-    'recycle_bin_deleted_item' => 'Deleted Item',
-    'recycle_bin_deleted_parent' => 'Parent',
-    'recycle_bin_deleted_by' => 'Deleted By',
-    'recycle_bin_deleted_at' => 'Deletion Time',
-    'recycle_bin_permanently_delete' => 'Permanently Delete',
-    'recycle_bin_restore' => 'Restore',
-    'recycle_bin_contents_empty' => 'The recycle bin is currently empty',
-    'recycle_bin_empty' => 'Empty Recycle Bin',
-    'recycle_bin_empty_confirm' => 'This will permanently destroy all items in the recycle bin including content contained within each item. Are you sure you want to empty the recycle bin?',
-    'recycle_bin_destroy_confirm' => 'This action will permanently delete this item, along with any child elements listed below, from the system and you will not be able to restore this content. Are you sure you want to permanently delete this item?',
-    'recycle_bin_destroy_list' => 'Items to be Destroyed',
-    'recycle_bin_restore_list' => 'Items to be Restored',
-    'recycle_bin_restore_confirm' => 'This action will restore the deleted item, including any child elements, to their original location. If the original location has since been deleted, and is now in the recycle bin, the parent item will also need to be restored.',
-    'recycle_bin_restore_deleted_parent' => 'The parent of this item has also been deleted. These will remain deleted until that parent is also restored.',
-    'recycle_bin_restore_parent' => 'Restore Parent',
-    'recycle_bin_destroy_notification' => 'Deleted :count total items from the recycle bin.',
-    'recycle_bin_restore_notification' => 'Restored :count total items from the recycle bin.',
+    'recycle_bin' => '휴지통',
+    'recycle_bin_desc' => '항목을 복원하거나 영구 삭제할 수 있습니다. 권한 필터가 작동하지 않습니다.',
+    'recycle_bin_deleted_item' => '삭제한 항목',
+    'recycle_bin_deleted_parent' => '부모 항목',
+    'recycle_bin_deleted_by' => '삭제한 유저',
+    'recycle_bin_deleted_at' => '삭제한 시간',
+    'recycle_bin_permanently_delete' => '영구 삭제',
+    'recycle_bin_restore' => '복원',
+    'recycle_bin_contents_empty' => '휴지통이 비었습니다.',
+    'recycle_bin_empty' => '비우기',
+    'recycle_bin_empty_confirm' => '휴지통을 비울 건가요?',
+    'recycle_bin_destroy_confirm' => '아래 자식 항목들이 함께 영구적으로 삭제됩니다. 영구 삭제할 건가요?',
+    'recycle_bin_destroy_list' => '영구 삭제함',
+    'recycle_bin_restore_list' => '복원함',
+    'recycle_bin_restore_confirm' => '원래 위치로 복원합니다. 원래 위치의 부모 항목이 지워졌을 경우 부모 항목도 복원해야 합니다.',
+    'recycle_bin_restore_deleted_parent' => '이 항목의 부모 항목이 지워졌습니다. 부모 항목을 먼저 복원하세요.',
+    'recycle_bin_restore_parent' => '부모 항목 복원',
+    'recycle_bin_destroy_notification' => ':count항목 삭제함',
+    'recycle_bin_restore_notification' => ':count항목 복원함',
 
     // Audit Log
-    'audit' => '감사 기록',
-    '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' => '추적 기록',
+    'audit_desc' => '시스템에서 추적한 작업입니다. 권한 필터가 작동하지 않습니다.',
     'audit_event_filter' => '이벤트 필터',
     'audit_event_filter_no_filter' => '필터 없음',
-    'audit_deleted_item' => '삭제ë\90\9c í\95­ëª©',
+    'audit_deleted_item' => '삭제í\95\9c í\95­ëª©',
     'audit_deleted_item_name' => '이름: :name',
     'audit_table_user' => '사용자',
     'audit_table_event' => '이벤트',
-    'audit_table_related' => 'Related Item or Detail',
-    'audit_table_ip' => 'IP Address',
-    'audit_table_date' => '활동 날짜',
-    'audit_date_from' => '날짜 범위 시작',
-    'audit_date_to' => '날짜 범위 끝',
+    'audit_table_related' => '관련 항목 또는 세부 사항',
+    'audit_table_ip' => 'IP 주소',
+    'audit_table_date' => '활동 기간',
+    'audit_date_from' => 'From',
+    'audit_date_to' => 'To',
 
     // Role Settings
     'roles' => '권한',
@@ -139,8 +139,8 @@ return [
     'role_details' => '권한 정보',
     'role_name' => '권한 이름',
     'role_desc' => '설명',
-    'role_mfa_enforced' => 'Requires Multi-Factor Authentication',
-    'role_external_auth_id' => 'LDAP 확인',
+    'role_mfa_enforced' => '다중 인증 필요',
+    'role_external_auth_id' => '외부 인증 계정',
     'role_system' => '시스템 권한',
     'role_manage_users' => '사용자 관리',
     'role_manage_roles' => '권한 관리',
@@ -149,10 +149,10 @@ return [
     'role_manage_page_templates' => '템플릿 관리',
     'role_access_api' => '시스템 접근 API',
     'role_manage_settings' => '사이트 설정 관리',
-    'role_export_content' => 'Export content',
+    'role_export_content' => '항목 내보내기',
     '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' => '책, 챕터, 문서별 권한은 이 설정에 우선합니다.',
+    'roles_system_warning' => '위 세 권한은 자신의 권한이나 다른 유저의 권한을 바꿀 수 있습니다.',
+    'role_asset_desc' => '책, 챕터, 문서별 권한은 이 설정에 우선합니다.',
     'role_asset_admins' => 'Admin 권한은 어디든 접근할 수 있지만 이 설정은 사용자 인터페이스에서 해당 활동을 표시할지 결정합니다.',
     'role_all' => '모든 항목',
     'role_own' => '직접 만든 항목',
@@ -167,37 +167,35 @@ return [
     'user_profile' => '사용자 프로필',
     'users_add_new' => '사용자 만들기',
     'users_search' => '사용자 검색',
-    'users_latest_activity' => 'Latest Activity',
+    'users_latest_activity' => '마지막 활동',
     'users_details' => '사용자 정보',
     'users_details_desc' => '메일 주소로 로그인합니다.',
     'users_details_desc_no_email' => '사용자 이름을 바꿉니다.',
     'users_role' => '사용자 권한',
     'users_role_desc' => '고른 권한 모두를 적용합니다.',
-    'users_password' => '사용자 비밀번호',
-    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 8 characters long.',
-    'users_send_invite_text' => '비밀번호 설정을 권유하는 메일을 보내거나 내가 정할 수 있습니다.',
+    'users_password' => '사용자 패스워드',
+    'users_password_desc' => '패스워드는 여덟 글자를 넘어야 합니다.',
+    'users_send_invite_text' => '패스워드 설정을 권유하는 메일을 보내거나 내가 정할 수 있습니다.',
     'users_send_invite_option' => '메일 보내기',
-    'users_external_auth_id' => 'LDAP 확인',
+    'users_external_auth_id' => '외부 인증 계정',
     'users_external_auth_id_desc' => '외부 인증 시스템과 통신할 때 사용자와 연결시키는 데 사용되는 ID 입니다.',
-    'users_password_warning' => '비밀번호를 바꿀 때만 쓰세요.',
+    'users_password_warning' => '패스워드를 바꿀 때만 쓰세요.',
     'users_system_public' => '계정 없는 모든 사용자에 할당한 사용자입니다. 이 사용자로 로그인할 수 없어요.',
     'users_delete' => '사용자 삭제',
     'users_delete_named' => ':userName 삭제',
     'users_delete_warning' => ':userName에 관한 데이터를 지웁니다.',
     'users_delete_confirm' => '이 사용자를 지울 건가요?',
-    'users_migrate_ownership' => 'Migrate Ownership',
-    'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
-    'users_none_selected' => 'No user selected',
-    'users_delete_success' => 'User successfully removed',
+    'users_migrate_ownership' => '소유자 바꾸기',
+    'users_migrate_ownership_desc' => '선택한 사용자가 소유하고 있는 모든 항목을 다른 유저가 소유하게 합니다.',
+    'users_none_selected' => '선택한 유저 없음',
     'users_edit' => '사용자 수정',
     'users_edit_profile' => '프로필 바꾸기',
-    'users_edit_success' => '프로필 바꿈',
     'users_avatar' => '프로필 이미지',
     'users_avatar_desc' => '이미지 규격은 256x256px 내외입니다.',
     'users_preferred_language' => '언어',
     'users_preferred_language_desc' => '문서 내용에는 아무런 영향을 주지 않습니다.',
     'users_social_accounts' => '소셜 계정',
-    'users_social_accounts_info' => 'ë\8b¤ë¥¸ ê³\84ì \95ì\9c¼ë¡\9c ê°\84ë\8b¨í\95\98ê²\8c ë¡\9cê·¸ì\9d¸í\95\98ì\84¸ì\9a\94. ì\97¬ê¸°ì\97\90ì\84\9c ê³\84ì \95 ì\97°ê²°ì\9d\84 ë\81\8aë\8a\94 ê²\83ê³¼ ì\86\8cì\85\9c ê³\84ì \95ì\97\90ì\84\9c ì \91ê·¼ ê¶\8cí\95\9cì\9d\84 ì·¨ì\86\8cí\95\98ë\8a\94 ê²\83ì\9d\80 ë³\84ê°\9cì\9e\85ë\8b\88ë\8b¤.',
+    'users_social_accounts_info' => 'ë\8b¤ë¥¸ ê³\84ì \95ì\9c¼ë¡\9c ê°\84ë\8b¨í\95\98ê²\8c ë¡\9cê·¸ì\9d¸í\95\98ì\84¸ì\9a\94. ì\97¬ê¸°ì\97\90ì\84\9c ê³\84ì \95 ì\97°ê²°ì\9d\84 ë\81\8aë\8a\94 ê²\83ê³¼ ì\86\8cì\85\9c ê³\84ì \95ì\97\90ì\84\9c ì \91ê·¼ ê¶\8cí\95\9cì\9d\84 ì·¨ì\86\8cí\95\98ë\8a\94 ê²\83ì\9d\80 ë\8b¤ë¦\85ë\8b\88ë\8b¤.',
     'users_social_connect' => '계정 연결',
     'users_social_disconnect' => '계정 연결 끊기',
     'users_social_connected' => ':socialAccount(와)과 연결했습니다.',
@@ -207,58 +205,58 @@ return [
     'users_api_tokens_create' => '토큰 만들기',
     'users_api_tokens_expires' => '만료',
     'users_api_tokens_docs' => 'API 설명서',
-    'users_mfa' => 'Multi-Factor Authentication',
-    'users_mfa_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
-    'users_mfa_x_methods' => ':count method configured|:count methods configured',
-    'users_mfa_configure' => 'Configure Methods',
+    'users_mfa' => '다중 인증',
+    'users_mfa_desc' => '추가 보안 계층으로 다중 인증을 설정합니다.',
+    'users_mfa_x_methods' => ':count 설정함|:count 설정함',
+    'users_mfa_configure' => '설정',
 
     // API Tokens
     'user_api_token_create' => 'API 토큰 만들기',
-    'user_api_token_name' => 'ì \9c목',
-    'user_api_token_name_desc' => '토큰이 의도한 목적을 향후에 상기시키기 위해 알아보기 쉬운 이름을 지정한다.',
+    'user_api_token_name' => 'ì\9d´ë¦\84',
+    'user_api_token_name_desc' => '알아볼 수 있는 이름을 줍니다.',
     'user_api_token_expiry' => '만료일',
-    'user_api_token_expiry_desc' => '이 토큰이 만료되는 날짜를 설정한다. 이 날짜가 지나면 이 토큰을 사용하여 만든 요청은 더 이상 작동하지 않는다. 이 칸을 공백으로 두면 100년 뒤가 만기가 된다.',
-    'user_api_token_create_secret_message' => '이 토큰을 만든 직후 "토큰 ID"와 "토큰 시크릿"이 생성되서 표시 된다. 시크릿은 한 번만 표시되므로 계속 진행하기 전에 안전하고 안심할 수 있는 곳에 값을 복사한다.',
-    'user_api_token_create_success' => 'API í\86 í\81°ì\9d´ ì\84±ê³µì \81ì\9c¼ë¡\9c ì\83\9dì\84±ë\90\98ì\97\88ë\8b¤.',
-    'user_api_token_update_success' => 'API í\86 í\81°ì\9d´ ì\84±ê³µì \81ì\9c¼ë¡\9c ê°±ì\8b ë\90\98ì\97\88ë\8b¤.',
+    'user_api_token_expiry_desc' => '이 날짜 이후에 이 토큰이 만든 요청은 작동하지 않습니다. 공백은 만료일을 100년 후로 둡니다.',
+    'user_api_token_create_secret_message' => '토큰을 만든 직후 "Token ID"와 "Token Secret"이 한 번만 표시되므로 안전한 장소에 보관하세요.',
+    'user_api_token_create_success' => 'API í\86 í\81°ì\9d\84 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤.',
+    'user_api_token_update_success' => 'API í\86 í\81°ì\9d\84 ê°±ì\8b í\96\88ì\8aµë\8b\88ë\8b¤.',
     'user_api_token' => 'API 토큰',
     'user_api_token_id' => '토큰 ID',
-    'user_api_token_id_desc' => '이 토큰은 API 요청으로 제공되어야 하는 편집 불가능한 시스템이 생성한 식별자다.',
-    'user_api_token_secret' => 'í\86 í\81° ì\8b\9cí\81¬ë¦¿',
-    'user_api_token_secret_desc' => '이것은 API 요청시 제공되어야 할 이 토큰에 대한 시스템에서 생성된 시크릿이다. 이 값은 한 번만 표시되므로 안전하고 한심할 수 있는 곳에 이 값을 복사한다.',
-    'user_api_token_created' => ':timeAgo 전에 토큰이 생성되었다.',
-    'user_api_token_updated' => ':timeAgo 전에 토큰이 갱신되었다.',
+    'user_api_token_id_desc' => '토큰이 API 요청 시 제공해야 할 식별자입니다. 편집 불가능한 시스템이 생성합니다.',
+    'user_api_token_secret' => 'í\86 í\81° ì\95\94í\98¸',
+    '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' => '이렇게 하면 시스템에서 \':tokenName\'이라는 이름을 가진 이 API 토큰이 완전히 삭제된다.',
-    'user_api_token_delete_confirm' => 'ì\9d´ API í\86 í\81°ì\9d\84 ì\82­ì \9cí\95\98ì\8b\9cê² ì\8aµë\8b\88ê¹\8c?',
-    'user_api_token_delete_success' => 'API 토큰이 성공적으로 삭제되었다.',
+    'user_api_token_delete_warning' => '\':tokenName\'을 시스템에서 삭제합니다.',
+    'user_api_token_delete_confirm' => 'ì\9d´ API í\86 í\81°ì\9d\84 ì§\80ì\9a¸ ê±´ê°\80ì\9a\94?',
+    'user_api_token_delete_success' => '토큰 삭제함',
 
     // Webhooks
-    'webhooks' => 'Webhooks',
-    'webhooks_create' => 'Create New Webhook',
-    'webhooks_none_created' => 'No webhooks have yet been created.',
-    'webhooks_edit' => 'Edit Webhook',
-    'webhooks_save' => 'Save Webhook',
-    'webhooks_details' => 'Webhook Details',
-    'webhooks_details_desc' => 'Provide a user friendly name and a POST endpoint as a location for the webhook data to be sent to.',
-    'webhooks_events' => 'Webhook Events',
-    'webhooks_events_desc' => 'Select all the events that should trigger this webhook to be called.',
-    'webhooks_events_warning' => 'Keep in mind that these events will be triggered for all selected events, even if custom permissions are applied. Ensure that use of this webhook won\'t expose confidential content.',
-    'webhooks_events_all' => 'All system events',
-    'webhooks_name' => 'Webhook Name',
-    'webhooks_timeout' => 'Webhook Request Timeout (Seconds)',
-    'webhooks_endpoint' => 'Webhook Endpoint',
-    'webhooks_active' => 'Webhook Active',
-    'webhook_events_table_header' => 'Events',
-    'webhooks_delete' => 'Delete Webhook',
-    'webhooks_delete_warning' => 'This will fully delete this webhook, with the name \':webhookName\', from the system.',
-    'webhooks_delete_confirm' => 'Are you sure you want to delete this webhook?',
-    'webhooks_format_example' => 'Webhook Format Example',
-    'webhooks_format_example_desc' => 'Webhook data is sent as a POST request to the configured endpoint as JSON following the format below. The "related_item" and "url" properties are optional and will depend on the type of event triggered.',
-    'webhooks_status' => 'Webhook Status',
-    'webhooks_last_called' => 'Last Called:',
-    'webhooks_last_errored' => 'Last Errored:',
-    'webhooks_last_error_message' => 'Last Error Message:',
+    'webhooks' => '웹 훅',
+    'webhooks_create' => '웹 훅 만들기',
+    'webhooks_none_created' => '웹 훅이 없습니다.',
+    'webhooks_edit' => '웹 훅 수정',
+    'webhooks_save' => '웹 훅 저장',
+    'webhooks_details' => '설명',
+    'webhooks_details_desc' => '보낼 웹 훅 데이터에 대한 웹 훅 이름과 POST 엔드포인트 경로를 제공합니다.',
+    'webhooks_events' => '이벤트',
+    'webhooks_events_desc' => '웹 훅 호출을 트리거할 이벤트를 모두 고르세요.',
+    'webhooks_events_warning' => '설정한 권한과 관계없이 모든 선택한 이벤트를 트리거합니다. 보안에 유의하세요.',
+    'webhooks_events_all' => '모든 시스템 이벤트',
+    'webhooks_name' => '웹 훅 이름',
+    'webhooks_timeout' => '요청 시간 제한 (초)',
+    'webhooks_endpoint' => '웹 훅 엔드포인트',
+    'webhooks_active' => '웹 훅 활성',
+    'webhook_events_table_header' => '이벤트',
+    'webhooks_delete' => '웹 훅 삭제',
+    'webhooks_delete_warning' => '\':webhookName\'을 시스템에서 지웁니다.',
+    'webhooks_delete_confirm' => '이 웹 훅을 지울 건가요?',
+    'webhooks_format_example' => '웹 훅 포맷 예시',
+    'webhooks_format_example_desc' => '웹 훅 데이터를 아래 형식에 따라 설정된 엔드포인트에 JSON POST로 전송합니다. 이벤트 유형에 따라 "related_item"과 "url"을 쓸 수 있습니다.',
+    'webhooks_status' => '웹 훅 상태',
+    'webhooks_last_called' => '마지막 호출:',
+    'webhooks_last_errored' => '마지막 에러:',
+    'webhooks_last_error_message' => '마지막 에러 메시지:',
 
 
     //! If editing translations files directly please ignore this in all
index ef8328103fe990081b50eb574f0e7e180c9aa937..1a5de20f4c3c84c8007f5b49c169caab54bed5b8 100644 (file)
@@ -15,7 +15,7 @@ return [
     'alpha_dash'           => ':attribute(을)를 문자, 숫자, -, _로만 구성하세요.',
     'alpha_num'            => ':attribute(을)를 문자, 숫자로만 구성하세요.',
     'array'                => ':attribute(을)를 배열로 구성하세요.',
-    'backup_codes'         => 'The provided code is not valid or has already been used.',
+    'backup_codes'         => '유효하지 않거나 사용 중인 코드입니다.',
     'before'               => ':attribute(을)를 :date 전으로 설정하세요.',
     'between'              => [
         'numeric' => ':attribute(을)를 :min~:max(으)로 구성하세요.',
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute(을)를 :min~:max자리로 구성하세요.',
     'email'                => ':attribute(을)를 유효한 메일 주소로 구성하세요.',
     'ends_with' => ':attribute(을)를 :values(으)로 끝나게 구성하세요.',
+    'file'                 => ':attribute(을)를 유효한 파일로 설정하세요.',
     'filled'               => ':attribute(을)를 구성하세요.',
     'gt'                   => [
         'numeric' => ':attribute(을)를 :value(이)가 넘게 구성하세요.',
@@ -90,7 +91,7 @@ return [
     'required_without'     => ':values(이)가 없을 때 :attribute(을)를 구성해야 합니다.',
     'required_without_all' => ':values(이)가 모두 없을 때 :attribute(을)를 구성해야 합니다.',
     'same'                 => ':attribute(와)과 :other(을)를 똑같이 구성하세요.',
-    'safe_url'             => 'The provided link may not be safe.',
+    'safe_url'             => '안전하지 않은 URL입니다.',
     'size'                 => [
         'numeric' => ':attribute(을)를 :size(으)로 구성하세요.',
         'file'    => ':attribute(을)를 :size킬로바이트로 구성하세요.',
@@ -99,7 +100,7 @@ return [
     ],
     'string'               => ':attribute(을)를 문자로 구성하세요.',
     'timezone'             => ':attribute(을)를 유효한 시간대로 구성하세요.',
-    'totp'                 => 'The provided code is not valid or has expired.',
+    'totp'                 => '유효하지 않거나 만료된 코드입니다.',
     'unique'               => ':attribute(은)는 이미 있습니다.',
     'url'                  => ':attribute(은)는 유효하지 않은 형식입니다.',
     'uploaded'             => '파일 크기가 서버에서 허용하는 수치를 넘습니다.',
@@ -107,7 +108,7 @@ return [
     // Custom validation lines
     'custom' => [
         'password-confirm' => [
-            'required_with' => '같은 비밀번호를 다시 입력하세요.',
+            'required_with' => '같은 패스워드를 다시 입력하세요.',
         ],
     ],
 
index 985dd02dddc8dd44d009de862bcc6def332eb764..b8ac7049fb123e5fa1b629661e07c8025d2ce278 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'pakomentavo',
     'permissions_update'          => 'atnaujinti leidimai',
index 37904a2cbeea53b9e458a3871b032e2c32c6bb97..ec9559c8244b967853de45527a10668527c1f0ee 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Perkelti nuosavybę',
     'users_migrate_ownership_desc' => 'Pasirinkite naudotoją, jeigu norite, kad kitas naudotojas taptų visų elementų, šiuo metu priklausančių šiam naudotojui, savininku.',
     'users_none_selected' => 'Naudotojas nepasirinktas',
-    'users_delete_success' => 'Naudotojas sėkmingai pašalintas',
     'users_edit' => 'Redaguoti naudotoją',
     'users_edit_profile' => 'Redaguoti profilį',
-    'users_edit_success' => 'Naudotojas sėkmingai atnaujintas',
     'users_avatar' => 'Naudotojo pseudoportretas',
     'users_avatar_desc' => 'Pasirinkite nuotrauką, pavaizduojančią šį naudotoją. Nuotrauka turi būti maždaug 256px kvadratas.',
     'users_preferred_language' => 'Norima kalba',
index 8fa9234cc5ea09fc3573fac4e4568878ff7a5778..08470cf2291cc1001d2946a094cb7dd6e6f6ca9d 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute turi būti tarp :min ir :max skaitmenų.',
     'email'                => ':attribute turi būti tinkamas elektroninio pašto adresas.',
     'ends_with' => ':attribute turi pasibaigti vienu iš šių: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute laukas yra privalomas.',
     'gt'                   => [
         'numeric' => ':attribute turi būti didesnis negu :value.',
index 6d152d23fa0f2aac49a0bebdc1d13b20ea223002..7addb08d7210a2074fc49059a4a260b59144379f 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'izdzēsa webhook',
     'webhook_delete_notification' => 'Webhook veiksmīgi izdzēsts',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'komentēts',
     'permissions_update'          => 'atjaunoja atļaujas',
index 3cc648906789f382aaef86ca69f4c70902b35baf..e859027bc094e6a553b71255b8cd6bcfe9a4afed 100644 (file)
@@ -74,8 +74,8 @@ return [
     'status' => 'Statuss',
     'status_active' => 'Aktīvs',
     'status_inactive' => 'Neaktīvs',
-    'never' => 'Never',
-    'none' => 'None',
+    'never' => 'Nekad',
+    'none' => 'Neviens',
 
     // Header
     'header_menu_expand' => 'Izvērst galvenes izvēlni',
index a5d23584bc7459170ba67f2e61ee5fa088b93fc5..4a20089727503434b34a2d795be4a52f6e23632e 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Pārcelt īpašumtiesības',
     'users_migrate_ownership_desc' => 'Izvēlieties lietotāju, ja vēlaties citam lietotājam pārcelt pašlaik šim lietotājam piederošās vienības.',
     'users_none_selected' => 'Nav izvēlēts lietotājs',
-    'users_delete_success' => 'Lietotājs veiksmīgi dzēsts',
     'users_edit' => 'Rediģēt lietotāju',
     'users_edit_profile' => 'Rediģēt profilu',
-    'users_edit_success' => 'Lietotājs veiksmīgi atjaunināts',
     'users_avatar' => 'Lietotāja attēls',
     'users_avatar_desc' => 'Izvēlieties attēlu šim lietotājam. Tam vajadzētu būt apmēram 256px kvadrātam.',
     'users_preferred_language' => 'Vēlamā valoda',
@@ -246,7 +244,7 @@ return [
     'webhooks_events_warning' => 'Ņemiet vērā, ka šie notikumi tiks palaisti visiem izvēlētajiem notikumiem, pat ja norādītas pielāgotas piekļuves tiesības. Pārliecineities, ka webhook lietošana neatklās ierobežotas pieejamības saturu.',
     'webhooks_events_all' => 'Visi sistēmas notikumi',
     'webhooks_name' => 'Webhook nosaukums',
-    'webhooks_timeout' => 'Webhook Request Timeout (Seconds)',
+    'webhooks_timeout' => 'Webhook pieprasījuma laika ierobežojums (sekundēs)',
     'webhooks_endpoint' => 'Webhook adrese (endpoint)',
     'webhooks_active' => 'Webhook aktīvs',
     'webhook_events_table_header' => 'Notikumi',
@@ -255,10 +253,10 @@ return [
     'webhooks_delete_confirm' => 'Vai tiešām vēlaties dzēst šo webhook?',
     'webhooks_format_example' => 'Webhook formāta piemērs',
     'webhooks_format_example_desc' => 'Webhook dati tiek nosūtīti kā POST pieprasījums norādītajai endpoint adresei kā JSON tālāk norādītajā formātā. "related_item" un "url" īpašības nav obligātas un ir atkarīgas no palaistā notikuma veida.',
-    'webhooks_status' => 'Webhook Status',
-    'webhooks_last_called' => 'Last Called:',
-    'webhooks_last_errored' => 'Last Errored:',
-    'webhooks_last_error_message' => 'Last Error Message:',
+    'webhooks_status' => 'Webhook statuss',
+    'webhooks_last_called' => 'Pēdejoreiz izsaukts:',
+    'webhooks_last_errored' => 'Pedējoreiz kļūda:',
+    'webhooks_last_error_message' => 'Pēdējais kļūdas paziņojums:',
 
 
     //! If editing translations files directly please ignore this in all
index 8dd93974615ec6b3c2ad1075af1d9e994d90c86b..c10a23cdd70d832e71cc7212f8374abb9ee7fa97 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute jābūt starp :min un :max cipariem.',
     'email'                => ':attribute jābūt derīgai e-pasta adresei.',
     'ends_with' => ':attribute jābeidzas ar vienu no :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute lauks ir obligāts.',
     'gt'                   => [
         'numeric' => ':attribute jābūt lielākam kā :value.',
index 86efc9376006932b296e7ec5ebfb03b6104e90b3..cbccb356e810426ddc3d234317c6207cb1cb879e 100644 (file)
@@ -60,6 +60,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'kommenterte på',
     'permissions_update'          => 'oppdaterte tilganger',
index e483bf8c12c239e26b1ffa9cf74fbec34e56b302..893a60b721d00d080302c1718eaadece1791eafb 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Overfør eierskap',
     'users_migrate_ownership_desc' => 'Velg en bruker her, som du ønsker skal ta eierskap over alle elementene som er eid av denne brukeren.',
     'users_none_selected' => 'Ingen bruker valgt',
-    'users_delete_success' => 'Konto slettet',
     'users_edit' => 'Rediger konto',
     'users_edit_profile' => 'Rediger profil',
-    'users_edit_success' => 'Kontoen ble oppdatert',
     'users_avatar' => 'Kontobilde',
     'users_avatar_desc' => 'Velg et bilde for å representere denne kontoholderen. Dette skal være omtrent 256px kvadrat.',
     'users_preferred_language' => 'Foretrukket språk',
index 684645729870e35f9175c683e54cbd5f20a4f80a..0e8917f3772dcad691b37549922bc5a97e25e8b3 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute må være mellomg :min og :max tall.',
     'email'                => ':attribute må være en gyldig e-post.',
     'ends_with' => ':attribute må slutte med en av verdiene: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute feltet er påkrevd.',
     'gt'                   => [
         'numeric' => ':attribute må være større enn :value.',
index ad3b3355094de7bc52c890e3b8750c66d09340f9..a20b6d6b55a21b762948758a8558e85628b91c5e 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'reageerde op',
     'permissions_update'          => 'wijzigde permissies',
index 1a77d97e662cf9f69d787527729ce2f755154dfe..ff3d1b4626d6d5c61f1d0bc953afad6428c3fcdb 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Draag eigendom over',
     'users_migrate_ownership_desc' => 'Selecteer een gebruiker hier als u wilt dat een andere gebruiker de eigenaar wordt van alle items die momenteel eigendom zijn van deze gebruiker.',
     'users_none_selected' => 'Geen gebruiker geselecteerd',
-    'users_delete_success' => 'Gebruiker succesvol verwijderd',
     'users_edit' => 'Bewerk Gebruiker',
     'users_edit_profile' => 'Bewerk Profiel',
-    'users_edit_success' => 'Gebruiker succesvol bijgewerkt',
     'users_avatar' => 'Avatar',
     'users_avatar_desc' => 'De afbeelding moet vierkant zijn en ongeveer 256px breed.',
     'users_preferred_language' => 'Voorkeurstaal',
index c572ce85b4a3ce50f4312296cb5abd3c1a08d48b..01183ea7d61744a84726c9db185ab64bbb61b946 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute moet tussen de :min en :max cijfers zijn.',
     'email'                => ':attribute is geen geldig e-mailadres.',
     'ends_with' => ':attribute moet eindigen met een van de volgende: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute is verplicht.',
     'gt'                   => [
         'numeric' => ':attribute moet groter zijn dan :value.',
index ef013c51043d86fe7740ca13290fcf648c550874..c09dc3da8267f311eeb9837ac4203942a41a4fd6 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'skomentował',
     'permissions_update'          => 'zaktualizowane uprawnienia',
index bebccf5f897ccce79ae7e9ab38d8c103451edab1..28d1ff4663532b4e3296381729c0d606b9ebae58 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migracja Własności',
     'users_migrate_ownership_desc' => 'Wybierz użytkownika tutaj, jeśli chcesz, aby inny użytkownik stał się właścicielem wszystkich elementów będących obecnie w posiadaniu tego użytkownika.',
     'users_none_selected' => 'Nie wybrano użytkownika',
-    'users_delete_success' => 'Użytkownik pomyślnie usunięty',
     'users_edit' => 'Edytuj użytkownika',
     'users_edit_profile' => 'Edytuj profil',
-    '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',
index ab4c9da7b9d689f3d3ad09919bbd3db3d7b0d691..ebf4f76e6519a70c73f30b483d33fc173ca0488f 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute musi mieć od :min do :max cyfr.',
     'email'                => ':attribute musi być prawidłowym adresem e-mail.',
     'ends_with' => ':attribute musi kończyć się jedną z poniższych wartości: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute jest wymagany.',
     'gt'                   => [
         'numeric' => ':attribute musi być większy niż :value.',
index 549908f810cc038aa83f78c679f9826ae4b04d1e..c8ffa132281b4166c129663e47c556e9ff5e9c00 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'comentado a',
     'permissions_update'          => 'permissões atualizadas',
index edcd9c8dcc58af8d66bce37912f79d955699f0e6..9ff06af915fb02ac6fa97a5682c5b47ee296ede3 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrar Posse',
     'users_migrate_ownership_desc' => 'Selecione um utilizador aqui se desejar que outro se torne o proprietário de todos os itens atualmente pertencentes a este.',
     'users_none_selected' => 'Nenhum utilizador selecionado',
-    'users_delete_success' => 'Utilizador removido com sucesso',
     'users_edit' => 'Editar Utilizador',
     'users_edit_profile' => 'Editar Perfil',
-    'users_edit_success' => 'Utilizador atualizado com sucesso',
     'users_avatar' => 'Avatar do Utilizador',
     'users_avatar_desc' => 'Defina uma imagem para representar este utilizador. Deve ser um quadrado com aproximadamente 256px de altura e largura.',
     'users_preferred_language' => 'Linguagem de Preferência',
index b5a15ed363016e9212e6d14fa769b075097ffa76..abf2ce4bffe50eef335276205e38e1e908c14390 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'O campo :attribute deve ter entre :min e :max dígitos.',
     'email'                => 'O campo :attribute deve ser um endereço de e-mail válido.',
     'ends_with' => 'O campo :attribute deve terminar com um dos seguintes: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'O campo :attribute é requerido.',
     'gt'                   => [
         'numeric' => 'O campo :attribute deve ser maior que :value.',
index f6fa8e415c1d090318b2d913f01b4ced09e34b31..c91fba8ac201e9e8fb6b7a130333d3228050021e 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'webhook excluído',
     'webhook_delete_notification' => 'Webhook excluido com sucesso',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'comentou em',
     'permissions_update'          => 'atualizou permissões',
index e6c1139ccba9970c3ba916d0924ea3a480f6afcd..c24e0cb3d8ff26b18d26a49dcd2e36835867a1b8 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrate Ownership',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'Nenhum usuário selecionado',
-    'users_delete_success' => 'Usuário removido com sucesso',
     'users_edit' => 'Editar Usuário',
     'users_edit_profile' => 'Editar Perfil',
-    'users_edit_success' => 'Usuário atualizado com sucesso',
     'users_avatar' => 'Imagem de Usuário',
     'users_avatar_desc' => 'Defina uma imagem para representar este usuário. Essa imagem deve ser um quadrado com aproximadamente 256px de altura e largura.',
     'users_preferred_language' => 'Linguagem de Preferência',
index 705534cb6d5d67ce8b63f7d399fc68a5622a3072..9c778f6b983395c179dbf21e4276bf75d0d12f05 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'O campo :attribute deve ter entre :min e :max dígitos.',
     'email'                => 'O campo :attribute deve ser um e-mail válido.',
     'ends_with' => 'O campo :attribute deve terminar com um dos seguintes: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'O campo :attribute é requerido.',
     'gt'                   => [
         'numeric' => 'O campo :attribute deve ser maior que :value.',
index 9970db51f70455720800d13338c8df2cabe51616..47a589f3f7d3dc009c72d6ae66949c3c1f05c8d4 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'удалил вебхук',
     'webhook_delete_notification' => 'Вебхук успешно удален',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'прокомментировал',
     'permissions_update'          => 'обновил разрешения',
index b20db000a147c28100a932ba2e2d79dfd4618c9e..9eff498a8e31346a97296c7f53c20f16643edf17 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Наследник контента',
     'users_migrate_ownership_desc' => 'Выберите пользователя, если вы хотите, чтобы он стал владельцем всех элементов, в настоящее время принадлежащих удаляемому пользователю.',
     'users_none_selected' => 'Пользователь не выбран',
-    'users_delete_success' => 'Пользователь успешно удален',
     'users_edit' => 'Редактировать пользователя',
     'users_edit_profile' => 'Редактировать профиль',
-    'users_edit_success' => 'Пользователь успешно обновлен',
     'users_avatar' => 'Аватар пользователя',
     'users_avatar_desc' => 'Выберите изображение. Изображение должно быть квадратным, размером около 256px.',
     'users_preferred_language' => 'Предпочитаемый язык',
index 45cc96155dbbff435580c6421a3e3509163cd487..a0dec2b56986c0f36284653022ea8aae8bd2b8f3 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute должен иметь от :min до :max цифр.',
     'email'                => ':attribute должен быть корректным email адресом.',
     'ends_with' => ':attribute должен заканчиваться одним из следующих: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute поле необходимо.',
     'gt'                   => [
         'numeric' => 'Значение :attribute должно быть больше чем :value.',
index 75850501d7758fde669a39b2f79512611ec45aab..79f418456d1fcf8dd55e48417cad64cc77bcbc17 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'odstránil(a) si webhook',
     'webhook_delete_notification' => 'Webhook úspešne odstránený',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'komentoval(a)',
     'permissions_update'          => 'aktualizované oprávnenia',
index e94215d9537cbb1c35aa09eb1f961bbae76bf576..ee32a8283802a79058175b9f4099a269c06828c2 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrovať vlastníctvo',
     'users_migrate_ownership_desc' => 'Tu vyberte používateľa, ak chcete, aby sa vlastníkom všetkých položiek aktuálne vlastnených týmto používateľom stal iný používateľ.',
     'users_none_selected' => 'Nie je vybratý žiadny používateľ',
-    'users_delete_success' => 'Používateľ úspešne zmazaný',
     'users_edit' => 'Upraviť používateľa',
     'users_edit_profile' => 'Upraviť profil',
-    'users_edit_success' => 'Používateľ úspešne upravený',
     'users_avatar' => 'Avatar používateľa',
     'users_avatar_desc' => 'Tento obrázok by mal byť štvorec s rozmerom približne 256px.',
     'users_preferred_language' => 'Preferovaný jazyk',
index 416c7e8deba92f38dd34050bbf69e15301b14202..20770e4b6488849c75e058f540c4a2437a3c33b1 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute musí mať medzi :min a :max číslicami.',
     'email'                => ':attribute musí byť platná emailová adresa.',
     'ends_with' => ':attribute musí končiť jednou z nasledujúcich hodnôt :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Políčko :attribute je povinné.',
     'gt'                   => [
         'numeric' => 'Hodnota :attribute musí byť väčšia ako :value.',
index 3c36c308c27590f358597ea778078296f9c38bcb..a27999a787093ffb0729a97f58eacbd324367d23 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'komentar na',
     'permissions_update'          => 'pravice so posodobljene',
index 9173cc50c6ece32e2e5ff87e21c9e5f5998e93f0..334fa7e66262f08bb67716d4856baa03f51c15de 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Prenesi lastništvo',
     'users_migrate_ownership_desc' => 'Izberite uporabnika, če želite nanj prenesti lastništvo vseh vnosov.',
     'users_none_selected' => 'Ni izbranega uporabnika',
-    'users_delete_success' => 'Uporabnik uspešno odstranjen',
     'users_edit' => 'Uredi uporabnika',
     'users_edit_profile' => 'Uredi profil',
-    'users_edit_success' => 'Uporabnik uspešno posodobljen',
     'users_avatar' => 'Uporabnikov avatar',
     'users_avatar_desc' => 'Izberi sliko, ki predstavlja uporabnika. Velikost mora biti približno 256px.',
     'users_preferred_language' => 'Izbrani jezik',
index 5b08463ca9e0667075aa527cbe4f8f73e17906d5..92060dd6d437667921abeedce1ea116f5edc03ee 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute mora biti med :min in :max števkami.',
     'email'                => ':attribute mora biti veljaven e-naslov.',
     'ends_with' => 'The :attribute se mora končati z eno od določenih: :vrednost/values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Polje ne sme biti prazno.',
     'gt'                   => [
         'numeric' => ':attribute mora biti večji kot :vrednost.',
index a292a223afca52d3de07f0c7b28d8e69f101c9db..65b20c1db19846aff508154f4428722e16875c67 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'kommenterade',
     'permissions_update'          => 'uppdaterade behörigheter',
index fa4d26c8cdae9889450724dfb74f35776e5833cb..6345a6cc416a1139c8e939fd9255996f82fa08d0 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Överför ägarskap',
     'users_migrate_ownership_desc' => 'Välj en användare här om du vill att en annan användare ska bli ägare till alla objekt som för närvarande ägs av denna användare.',
     'users_none_selected' => 'Ingen användare vald',
-    'users_delete_success' => 'Användaren har tagits bort',
     'users_edit' => 'Redigera användare',
     'users_edit_profile' => 'Redigera profil',
-    'users_edit_success' => 'Användaren har uppdaterats',
     'users_avatar' => 'Avatar',
     'users_avatar_desc' => 'Bilden bör vara kvadratisk och ca 256px stor.',
     'users_preferred_language' => 'Föredraget språk',
index 0c9cc3164157faed9ed03dea078edf53496c171f..2d7f1da9a800c3844f6650d09f19a4e0331a7c92 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute måste vara mellan :min och :max siffror.',
     'email'                => ':attribute måste vara en giltig e-postadress.',
     'ends_with' => ':attribute måste sluta med något av följande: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute är obligatoriskt.',
     'gt'                   => [
         'numeric' => ':attribute måste vara större än :value.',
index 6d8a5d83845bbdad6b3213c54bb8013ab42e4522..316b8ca179f1a9681202cd526522a34c931f4b42 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'yorum yaptı',
     'permissions_update'          => 'güncellenmiş izinler',
index 962cedb8278b03e1ce8ceeeebe61dda98519a657..f40726b8d7306cd9597d6d602b19611665f6a17b 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Sahipliği Taşıyın',
     'users_migrate_ownership_desc' => 'Başka bir kullanıcının şu anda bu kullanıcıya ait olan tüm öğelerin sahibi olmasını istiyorsanız buradan bir kullanıcı seçin.',
     'users_none_selected' => 'Hiçbir kullanıcı seçilmedi',
-    'users_delete_success' => 'Kullanıcı başarıyla kaldırıldı',
     'users_edit' => 'Kullanıcıyı Düzenle',
     'users_edit_profile' => 'Profili Düzenle',
-    'users_edit_success' => 'Kullanıcı başarıyla güncellendi',
     'users_avatar' => 'Avatar',
     'users_avatar_desc' => 'Bu kullanıcıyı temsil eden bir görsel seçin. Bu görsel yaklaşık 256px boyutunda bir kare olmalıdır.',
     'users_preferred_language' => 'Tercih Edilen Dil',
index 9cd8093d483cf5af980cb9c93093653b5648326d..50a30a5b5292e3f7e32fc0cba7bd1af376eebe26 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute, en az :min ve en fazla :max basamaklı olmalıdır.',
     'email'                => ':attribute, geçerli bir e-posta adresi olmalıdır.',
     'ends_with' => ':attribute, şunlardan birisiyle bitmelidir: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute alanı zorunludur.',
     'gt'                   => [
         'numeric' => ':attribute, :max değerinden büyük olmalıdır.',
index b074cb603d1abc4f5461047ea0c2f7fe28c9896c..2a0e12f651565a0a9d7e1f5fb5000aad019654a8 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'прокоментував',
     'permissions_update'          => 'оновив дозволи',
index 59ea4ea7c7f1c90a8cfb5ca6fd3f1021a61dd07c..278ddd229f3e2acccf0507a7fb05fd1eef3abc15 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Право власності при міграції',
     'users_migrate_ownership_desc' => 'Виберіть тут користувача, якщо ви хочете, щоб інший користувач став власником усіх елементів, які зараз належать цьому користувачеві.',
     'users_none_selected' => 'Не вибрано жодного користувача',
-    'users_delete_success' => 'Користувача успішно видалено',
     'users_edit' => 'Редагувати користувача',
     'users_edit_profile' => 'Редагувати профіль',
-    'users_edit_success' => 'Користувача успішно оновлено',
     'users_avatar' => 'Аватар користувача',
     'users_avatar_desc' => 'Це квадратне зображення має бути приблизно 256px.',
     'users_preferred_language' => 'Бажана мова',
index 25322f2d9c042d85e6c335290e1b91acd001628c..a7fad6bf80c30b84552ceb6b9bbfc253f4c0e8c1 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => 'Довжина цифрового поля :attribute повинна бути від :min до :max.',
     'email'                => 'Поле :attribute повинне містити коректну електронну адресу.',
     'ends_with' => 'Поле :attribute має закінчуватися одним з наступних значень: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Поле :attribute є обов\'язковим для заповнення.',
     'gt'                   => [
         'numeric' => 'Поле :attribute має бути більше ніж :value.',
index 67199462f16f87a9327a78a9d540461af16974da..ffbb33949550154dc5adff951efb1400c4a12357 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => 'đã bình luận về',
     'permissions_update'          => 'các quyền đã được cập nhật',
index b1f9e9c1c7d7006cd160deee9701a1e4a25e16d2..4a5f84f7e5f55ef1f23a1c8914e16aa7314a9665 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => 'Migrate Ownership',
     'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
     'users_none_selected' => 'Chưa chọn người dùng',
-    'users_delete_success' => 'Người dùng đã được xóa thành công',
     'users_edit' => 'Sửa người dùng',
     'users_edit_profile' => 'Sửa Hồ sơ',
-    'users_edit_success' => 'Người dùng được cập nhật thành công',
     'users_avatar' => 'Ảnh đại diện',
     'users_avatar_desc' => 'Chọn ảnh đê đại hiện cho người dùng này. Ảnh nên có kích cỡ hình vuông 256px.',
     'users_preferred_language' => 'Ngôn ngữ ưu tiên',
index 7e237cf9e7c0f6dbcb4b1e0887f8fdb4fbe15be6..274e747f2dd07ce23e91cbd4a1e466f685660ccd 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute phải có từ :min đến :max chữ số.',
     'email'                => ':attribute phải là địa chỉ email hợp lệ.',
     'ends_with' => ':attribute phải kết thúc bằng một trong các ký tự: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => 'Trường :attribute là bắt buộc.',
     'gt'                   => [
         'numeric' => ':attribute phải lớn hơn :value.',
index 834ed13326ae16a2f98a097fad76c0ad98588125..de027e7d191aa14b8ba6f022aa583e9d120c9d57 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => '删除了 webhook',
     'webhook_delete_notification' => 'Webhook 已成功删除',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => '评论',
     'permissions_update'          => '权限已更新',
index 36fc63ca20aa16c4c3ba0336512a6cecdf316c4b..ea62f2b976e503db645de9acfefdf0ac0634cb75 100644 (file)
@@ -75,7 +75,7 @@ return [
     'status_active' => '已激活',
     'status_inactive' => '未激活',
     'never' => '从未',
-    'none' => 'None',
+    'none' => '',
 
     // Header
     'header_menu_expand' => '展开标头菜单',
index e6ff95a67d23620e6750785f28c8ae7687df3b4b..61f45d1bc72f970c9cc9d2231b18cad9b4547d90 100644 (file)
@@ -219,14 +219,14 @@ return [
     'pages_revisions' => '页面修订',
     'pages_revisions_named' => '“:pageName”页面修订',
     'pages_revision_named' => '“:pageName”页面修订',
-    'pages_revision_restored_from' => '从 #:id; :summary 恢复',
+    'pages_revision_restored_from' => '恢复到 #:id,:summary',
     '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_changes' => '查看更改',
     'pages_revisions_current' => '当前版本',
     'pages_revisions_preview' => '预览',
     'pages_revisions_restore' => '恢复',
@@ -333,7 +333,7 @@ return [
 
     // Revision
     'revision_delete_confirm' => '您确定要删除此修订版吗?',
-    'revision_restore_confirm' => 'æ\82¨ç¡®å®\9aè¦\81æ\81¢å¤\8då\88°æ­¤ä¿®è®¢ç\89\88å\90\97ï¼\9fæ\81¢å¤\8då\90\8eå\8e\9fæ\9c\89å\86\85容å°\86ä¼\9a被替换。',
+    'revision_restore_confirm' => 'æ\82¨ç¡®å®\9aè¦\81æ\81¢å¤\8då\88°æ­¤ä¿®è®¢ç\89\88å\90\97ï¼\9fæ\81¢å¤\8då\90\8eå½\93å\89\8d页é\9d¢å\86\85容å°\86被替换。',
     'revision_delete_success' => '修订删除',
     'revision_cannot_delete_latest' => '无法删除最新版本。',
 
index 064b166501131a887629fe4d424df9a40f9da489..cf3bf7df390632d6ac655ed5bfc35f01345b33d4 100755 (executable)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => '迁移拥有权',
     'users_migrate_ownership_desc' => '如果您想要当前用户拥有的全部项目转移到另一个用户(更改拥有者),请在此处选择一个用户。',
     'users_none_selected' => '没有选中用户',
-    'users_delete_success' => '已成功移除用户',
     'users_edit' => '编辑用户',
     'users_edit_profile' => '编辑资料',
-    'users_edit_success' => '用户更新成功',
     'users_avatar' => '用户头像',
     'users_avatar_desc' => '选择一张头像。 这张图片应该是约 256 像素的正方形。',
     'users_preferred_language' => '语言',
index 3398a1142c0a2ea63eb08c174653f2a3b3d30bb8..e38446e9fb18e1f1f28dc8b2ae0f28ecc367fe9f 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute 必须为:min到:max位数。',
     'email'                => ':attribute 必须是有效的电子邮件地址。',
     'ends_with' => ' :attribute 必须以 :values 后缀结尾',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute 字段是必需的。',
     'gt'                   => [
         'numeric' => ':attribute必须大于 :value.',
index 9df1a57661995952e104ae7530bca990f919d57f..9bd15cfa466f93b1bd6c1b03883f6d51aecf59c9 100644 (file)
@@ -59,6 +59,10 @@ return [
     'webhook_delete' => 'deleted webhook',
     'webhook_delete_notification' => 'Webhook successfully deleted',
 
+    // Users
+    'user_update_notification' => 'User successfully updated',
+    'user_delete_notification' => 'User successfully removed',
+
     // Other
     'commented_on'                => '評論',
     'permissions_update'          => '更新權限',
index ad12825566aadd811657859100b13c71b9814357..2d5e9381207ad61df3b9699a0dce72d9f4368624 100644 (file)
@@ -188,10 +188,8 @@ return [
     'users_migrate_ownership' => '轉移所有權',
     'users_migrate_ownership_desc' => '如果您希望其他使用者變成目前此使用者擁有的所有項目的新擁有者,請在此處選取新的使用者。',
     'users_none_selected' => '未選取使用者',
-    'users_delete_success' => '使用者移除成功',
     'users_edit' => '編輯使用者',
     'users_edit_profile' => '編輯個人資料',
-    'users_edit_success' => '使用者更新成功',
     'users_avatar' => '使用者大頭照',
     'users_avatar_desc' => '選取一張代表此使用者的圖片。這應該是大約 256px 的正方形。',
     'users_preferred_language' => '偏好語言',
index e93c182ee4fe600f75b4d57e35401557c157036f..2053674a63af899265d4eb3f1c183dc2393ebd0d 100644 (file)
@@ -32,6 +32,7 @@ return [
     'digits_between'       => ':attribute 必須為 :min 到 :max 位數。',
     'email'                => ':attribute 必須是有效的電子郵件地址。',
     'ends_with' => ':attribute必須以下列之一結尾::values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
     'filled'               => ':attribute 欄位必填。',
     'gt'                   => [
         'numeric' => ':attribute 必須大於 :value。',
index 82907b53dc617f49c9abd6978e38d7cfb5507d48..cbb0b05264474d4a440b179edab2fbed32cfa3ef 100644 (file)
@@ -9,7 +9,7 @@ $value - Currently selected lanuage value
         </p>
     </div>
     <div>
-        <select name="setting[language]" id="user-language">
+        <select name="language" id="user-language">
             @foreach(trans('settings.language_select') as $lang => $label)
                 <option @if($value === $lang) selected @endif value="{{ $lang }}">{{ $label }}</option>
             @endforeach
index 7876ba6d45c0a279a67b5ecbdb1f546a3ef1fef3..c7b8887b650ae761218fe815b74b212b33fedf5b 100644 (file)
@@ -10,6 +10,7 @@ use BookStack\Http\Controllers\Api\ChapterExportApiController;
 use BookStack\Http\Controllers\Api\PageApiController;
 use BookStack\Http\Controllers\Api\PageExportApiController;
 use BookStack\Http\Controllers\Api\SearchApiController;
+use BookStack\Http\Controllers\Api\UserApiController;
 use Illuminate\Support\Facades\Route;
 
 /**
@@ -65,3 +66,9 @@ Route::post('shelves', [BookshelfApiController::class, 'create']);
 Route::get('shelves/{id}', [BookshelfApiController::class, 'read']);
 Route::put('shelves/{id}', [BookshelfApiController::class, 'update']);
 Route::delete('shelves/{id}', [BookshelfApiController::class, 'delete']);
+
+Route::get('users', [UserApiController::class, 'list']);
+Route::post('users', [UserApiController::class, 'create']);
+Route::get('users/{id}', [UserApiController::class, 'read']);
+Route::put('users/{id}', [UserApiController::class, 'update']);
+Route::delete('users/{id}', [UserApiController::class, 'delete']);
\ No newline at end of file
index bfa47343e96884e189b756cf6dbb16fb5ab3739e..d7625c93823b9cc00f35b314ce69a788c022d046 100644 (file)
@@ -102,6 +102,30 @@ class AttachmentsApiTest extends TestCase
         unlink(storage_path($newItem->path));
     }
 
+    public function test_upload_limit_restricts_attachment_uploads()
+    {
+        $this->actingAsApiAdmin();
+        /** @var Page $page */
+        $page = Page::query()->first();
+
+        config()->set('app.upload_limit', 1);
+
+        $file = tmpfile();
+        $filePath = stream_get_meta_data($file)['uri'];
+        fwrite($file, str_repeat('a', 1200000));
+        $file = new UploadedFile($filePath, 'test.txt', 'text/plain', null, true);
+
+        $details = [
+            'name'        => 'My attachment',
+            'uploaded_to' => $page->id,
+        ];
+        $resp = $this->call('POST', $this->baseEndpoint, $details, [], ['file' => $file]);
+        $resp->assertStatus(422);
+        $resp->assertJson($this->validationResponse([
+            'file' => ['The file may not be greater than 1000 kilobytes.'],
+        ]));
+    }
+
     public function test_name_needed_to_create()
     {
         $this->actingAsApiAdmin();
@@ -115,15 +139,7 @@ class AttachmentsApiTest extends TestCase
 
         $resp = $this->postJson($this->baseEndpoint, $details);
         $resp->assertStatus(422);
-        $resp->assertJson([
-            'error' => [
-                'message'    => 'The given data was invalid.',
-                'validation' => [
-                    'name' => ['The name field is required.'],
-                ],
-                'code' => 422,
-            ],
-        ]);
+        $resp->assertJson($this->validationResponse(['name' => ['The name field is required.']]));
     }
 
     public function test_link_or_file_needed_to_create()
@@ -139,16 +155,27 @@ class AttachmentsApiTest extends TestCase
 
         $resp = $this->postJson($this->baseEndpoint, $details);
         $resp->assertStatus(422);
-        $resp->assertJson([
-            'error' => [
-                'message'    => 'The given data was invalid.',
-                'validation' => [
-                    'file' => ['The file field is required when link is not present.'],
-                    'link' => ['The link field is required when file is not present.'],
-                ],
-                'code' => 422,
-            ],
-        ]);
+        $resp->assertJson($this->validationResponse([
+            'file' => ['The file field is required when link is not present.'],
+            'link' => ['The link field is required when file is not present.'],
+        ]));
+    }
+
+    public function test_message_shown_if_file_is_not_a_valid_file()
+    {
+        $this->actingAsApiAdmin();
+        /** @var Page $page */
+        $page = Page::query()->first();
+
+        $details = [
+            'name'        => 'my attachment',
+            'uploaded_to' => $page->id,
+            'file'        => 'cat',
+        ];
+
+        $resp = $this->postJson($this->baseEndpoint, $details);
+        $resp->assertStatus(422);
+        $resp->assertJson($this->validationResponse(['file' => ['The file must be provided as a valid file.']]));
     }
 
     public function test_read_endpoint_for_link_attachment()
index 97ca82ea71c914bf5597408f8dd5fc5aec2087b2..0cdd93741272c608b38233e8f75365ab5bc740cb 100644 (file)
@@ -35,6 +35,14 @@ trait TestsApi
         return ['error' => ['code' => $code, 'message' => $message]];
     }
 
+    /**
+     * Get the structure that matches a permission error response.
+     */
+    protected function permissionErrorResponse(): array
+    {
+        return $this->errorResponse('You do not have permission to perform the requested action.', 403);
+    }
+
     /**
      * Format the given (field_name => ["messages"]) array
      * into a standard validation response format.
diff --git a/tests/Api/UsersApiTest.php b/tests/Api/UsersApiTest.php
new file mode 100644 (file)
index 0000000..e1bcb02
--- /dev/null
@@ -0,0 +1,286 @@
+<?php
+
+namespace Tests\Api;
+
+use BookStack\Actions\ActivityType;
+use BookStack\Auth\Role;
+use BookStack\Auth\User;
+use BookStack\Entities\Models\Entity;
+use BookStack\Notifications\UserInvite;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Notification;
+use Tests\TestCase;
+
+class UsersApiTest extends TestCase
+{
+    use TestsApi;
+
+    protected $baseEndpoint = '/api/users';
+
+    protected $endpointMap = [
+        ['get', '/api/users'],
+        ['post', '/api/users'],
+        ['get', '/api/users/1'],
+        ['put', '/api/users/1'],
+        ['delete', '/api/users/1'],
+    ];
+
+    public function test_users_manage_permission_needed_for_all_endpoints()
+    {
+        $this->actingAsApiEditor();
+        foreach ($this->endpointMap as [$method, $uri]) {
+            $resp = $this->json($method, $uri);
+            $resp->assertStatus(403);
+            $resp->assertJson($this->permissionErrorResponse());
+        }
+    }
+
+    public function test_no_endpoints_accessible_in_demo_mode()
+    {
+        config()->set('app.env', 'demo');
+        $this->actingAsApiAdmin();
+
+        foreach ($this->endpointMap as [$method, $uri]) {
+            $resp = $this->json($method, $uri);
+            $resp->assertStatus(403);
+            $resp->assertJson($this->permissionErrorResponse());
+        }
+    }
+
+    public function test_index_endpoint_returns_expected_shelf()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $firstUser */
+        $firstUser = User::query()->orderBy('id', 'asc')->first();
+
+        $resp = $this->getJson($this->baseEndpoint . '?count=1&sort=+id');
+        $resp->assertJson(['data' => [
+            [
+                'id'   => $firstUser->id,
+                'name' => $firstUser->name,
+                'slug' => $firstUser->slug,
+                'email' => $firstUser->email,
+                'profile_url' => $firstUser->getProfileUrl(),
+                'edit_url' => $firstUser->getEditUrl(),
+                'avatar_url' => $firstUser->getAvatar(),
+            ],
+        ]]);
+    }
+
+    public function test_create_endpoint()
+    {
+        $this->actingAsApiAdmin();
+        /** @var Role $role */
+        $role = Role::query()->first();
+
+        $resp = $this->postJson($this->baseEndpoint, [
+            'name' => 'Benny Boris',
+            'email' => 'bboris@example.com',
+            'password' => 'mysuperpass',
+            'language' => 'it',
+            'roles' => [$role->id],
+            'send_invite' => false,
+        ]);
+
+        $resp->assertStatus(200);
+        $resp->assertJson([
+            'name' => 'Benny Boris',
+            'email' => 'bboris@example.com',
+            'external_auth_id' => '',
+            'roles' => [
+                [
+                    'id' => $role->id,
+                    'display_name' => $role->display_name,
+                ]
+            ],
+        ]);
+        $this->assertDatabaseHas('users', ['email' => 'bboris@example.com']);
+
+        /** @var User $user */
+        $user = User::query()->where('email', '=', 'bboris@example.com')->first();
+        $this->assertActivityExists(ActivityType::USER_CREATE, null, $user->logDescriptor());
+        $this->assertEquals(1, $user->roles()->count());
+        $this->assertEquals('it', setting()->getUser($user, 'language'));
+    }
+
+    public function test_create_with_send_invite()
+    {
+        $this->actingAsApiAdmin();
+        Notification::fake();
+
+        $resp = $this->postJson($this->baseEndpoint, [
+            'name' => 'Benny Boris',
+            'email' => 'bboris@example.com',
+            'send_invite' => true,
+        ]);
+
+        $resp->assertStatus(200);
+        /** @var User $user */
+        $user = User::query()->where('email', '=', 'bboris@example.com')->first();
+        Notification::assertSentTo($user, UserInvite::class);
+    }
+
+    public function test_create_name_and_email_validation()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $existingUser */
+        $existingUser = User::query()->first();
+
+        $resp = $this->postJson($this->baseEndpoint, [
+            'email' => 'bboris@example.com',
+        ]);
+        $resp->assertStatus(422);
+        $resp->assertJson($this->validationResponse(['name' => ['The name field is required.']]));
+
+        $resp = $this->postJson($this->baseEndpoint, [
+            'name' => 'Benny Boris',
+        ]);
+        $resp->assertStatus(422);
+        $resp->assertJson($this->validationResponse(['email' => ['The email field is required.']]));
+
+        $resp = $this->postJson($this->baseEndpoint, [
+            'email' => $existingUser->email,
+            'name' => 'Benny Boris',
+        ]);
+        $resp->assertStatus(422);
+        $resp->assertJson($this->validationResponse(['email' => ['The email has already been taken.']]));
+    }
+
+    public function test_read_endpoint()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $user */
+        $user = User::query()->first();
+        /** @var Role $userRole */
+        $userRole = $user->roles()->first();
+
+        $resp = $this->getJson($this->baseEndpoint . "/{$user->id}");
+
+        $resp->assertStatus(200);
+        $resp->assertJson([
+            'id'         => $user->id,
+            'slug'       => $user->slug,
+            'email'      => $user->email,
+            'external_auth_id' => $user->external_auth_id,
+            'roles' => [
+                [
+                    'id' => $userRole->id,
+                    'display_name' => $userRole->display_name,
+                ]
+            ],
+        ]);
+    }
+
+    public function test_update_endpoint()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $user */
+        $user = $this->getAdmin();
+        $roles = Role::query()->pluck('id');
+        $resp = $this->putJson($this->baseEndpoint . "/{$user->id}", [
+            'name' => 'My updated user',
+            'email' => 'barrytest@example.com',
+            'roles' => $roles,
+            'external_auth_id' => 'btest',
+            'password' => 'barrytester',
+            'language' => 'fr',
+        ]);
+
+        $resp->assertStatus(200);
+        $resp->assertJson([
+            'id' => $user->id,
+            'name' => 'My updated user',
+            'email' => 'barrytest@example.com',
+            'external_auth_id' => 'btest',
+        ]);
+        $user->refresh();
+        $this->assertEquals('fr', setting()->getUser($user, 'language'));
+        $this->assertEquals(count($roles), $user->roles()->count());
+        $this->assertNotEquals('barrytester', $user->password);
+        $this->assertTrue(Hash::check('barrytester', $user->password));
+    }
+
+    public function test_update_endpoint_does_not_remove_info_if_not_provided()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $user */
+        $user = $this->getAdmin();
+        $roleCount = $user->roles()->count();
+        $resp = $this->putJson($this->baseEndpoint . "/{$user->id}", []);
+
+        $resp->assertStatus(200);
+        $this->assertDatabaseHas('users', [
+            'id' => $user->id,
+            'name' => $user->name,
+            'email' => $user->email,
+            'password' => $user->password,
+        ]);
+        $this->assertEquals($roleCount, $user->roles()->count());
+    }
+
+    public function test_delete_endpoint()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $user */
+        $user = User::query()->where('id', '!=', $this->getAdmin()->id)
+            ->whereNull('system_name')
+            ->first();
+
+        $resp = $this->deleteJson($this->baseEndpoint . "/{$user->id}");
+
+        $resp->assertStatus(204);
+        $this->assertActivityExists('user_delete', null, $user->logDescriptor());
+    }
+
+    public function test_delete_endpoint_with_ownership_migration_user()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $user */
+        $user = User::query()->where('id', '!=', $this->getAdmin()->id)
+            ->whereNull('system_name')
+            ->first();
+        $entityChain = $this->createEntityChainBelongingToUser($user);
+        /** @var User $newOwner */
+        $newOwner = User::query()->where('id', '!=', $user->id)->first();
+
+        /** @var Entity $entity */
+        foreach ($entityChain as $entity) {
+            $this->assertEquals($user->id, $entity->owned_by);
+        }
+
+        $resp = $this->deleteJson($this->baseEndpoint . "/{$user->id}", [
+            'migrate_ownership_id' => $newOwner->id,
+        ]);
+
+        $resp->assertStatus(204);
+        /** @var Entity $entity */
+        foreach ($entityChain as $entity) {
+            $this->assertEquals($newOwner->id, $entity->refresh()->owned_by);
+        }
+    }
+
+    public function test_delete_endpoint_fails_deleting_only_admin()
+    {
+        $this->actingAsApiAdmin();
+        $adminRole = Role::getSystemRole('admin');
+        $adminToDelete = $adminRole->users()->first();
+        $adminRole->users()->where('id', '!=', $adminToDelete->id)->delete();
+
+        $resp = $this->deleteJson($this->baseEndpoint . "/{$adminToDelete->id}");
+
+        $resp->assertStatus(500);
+        $resp->assertJson($this->errorResponse('You cannot delete the only admin', 500));
+    }
+
+    public function test_delete_endpoint_fails_deleting_public_user()
+    {
+        $this->actingAsApiAdmin();
+        /** @var User $publicUser */
+        $publicUser = User::query()->where('system_name', '=', 'public')->first();
+
+        $resp = $this->deleteJson($this->baseEndpoint . "/{$publicUser->id}");
+
+        $resp->assertStatus(500);
+        $resp->assertJson($this->errorResponse('You cannot delete the guest user', 500));
+    }
+}
index 922a98ef3d438235bcf8444d23eb6c64a91990e4..38124cc1aef4ca64de5a2878d6dd0935acab9c3c 100644 (file)
@@ -45,9 +45,7 @@ class UserInviteTest extends TestCase
             'name'        => 'Barry',
             'email'       => $email,
             'send_invite' => 'true',
-            'setting'     => [
-                'language' => 'de',
-            ],
+            'language'    => 'de',
         ]);
         $resp->assertRedirect('/settings/users');
 
index 9524186c8f1cdc64f0b9cd43f215515948cf98b1..20cde049a1938d46e4aa55fe48a6da33fd90bb80 100644 (file)
@@ -657,6 +657,39 @@ class PageContentTest extends TestCase
         $this->deleteImage($imagePath);
     }
 
+    public function test_markdown_base64_extract_not_limited_by_pcre_limits()
+    {
+        $pcreBacktrackLimit = ini_get('pcre.backtrack_limit');
+        $pcreRecursionLimit = ini_get('pcre.recursion_limit');
+
+        $this->asEditor();
+        $page = Page::query()->first();
+
+        ini_set('pcre.backtrack_limit', '500');
+        ini_set('pcre.recursion_limit', '500');
+
+        $content = str_repeat('a', 5000);
+        $base64Content = base64_encode($content);
+
+        $this->put($page->getUrl(), [
+            'name'     => $page->name, 'summary' => '',
+            'markdown' => 'test ![test](data:image/jpeg;base64,' . $base64Content . ') ![test](data:image/jpeg;base64,' . $base64Content . ')',
+        ]);
+
+        $page->refresh();
+        $this->assertStringMatchesFormat('<p%A>test <img src="http://localhost/uploads/images/gallery/%A.jpeg" alt="test"> <img src="http://localhost/uploads/images/gallery/%A.jpeg" alt="test">%A</p>%A', $page->html);
+
+        $matches = [];
+        preg_match('/src="http:\/\/localhost(.*?)"/', $page->html, $matches);
+        $imagePath = $matches[1];
+        $imageFile = public_path($imagePath);
+        $this->assertEquals($content, file_get_contents($imageFile));
+
+        $this->deleteImage($imagePath);
+        ini_set('pcre.backtrack_limit', $pcreBacktrackLimit);
+        ini_set('pcre.recursion_limit', $pcreRecursionLimit);
+    }
+
     public function test_base64_images_within_markdown_blanked_if_not_supported_extension_for_extract()
     {
         $this->asEditor();
index 2fbbee7e20725b09a90d011df4c2a616da88ce71..5870b6827c763567fc4096aa151901ca6e442557 100644 (file)
@@ -189,7 +189,7 @@ class UserManagementTest extends TestCase
         foreach ($langs as $lang) {
             config()->set('app.locale', $lang);
             $resp = $this->asAdmin()->get('/settings/users/create');
-            $resp->assertElementExists('select[name="setting[language]"] option[value="' . $lang . '"][selected]');
+            $resp->assertElementExists('select[name="language"] option[value="' . $lang . '"][selected]');
         }
     }