runs-on: ubuntu-20.04
strategy:
matrix:
- php: ['7.3']
+ php: ['7.4']
steps:
- uses: actions/checkout@v1
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
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
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;
$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.
*/
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
protected $request;
protected $fields;
+ /**
+ * @var array<callable>
+ */
+ protected $resultModifiers = [];
+
protected $filterOperators = [
'eq' => '=',
'ne' => '!=',
/**
* ListingResponseBuilder constructor.
+ * The given fields will be forced visible within the model results.
*/
public function __construct(Builder $query, Request $request, array $fields)
{
/**
* 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,
}
/**
- * 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
{
try {
$user = $this->createNewFromLdapAndCreds($userDetails, $credentials);
} catch (UserRegistrationException $exception) {
- throw new LoginAttemptException($exception->message);
+ throw new LoginAttemptException($exception->getMessage());
}
}
}
// Create the user
- $newUser = $this->userRepo->registerNew($userData, $emailConfirmed);
+ $newUser = $this->userRepo->createWithoutActivity($userData, $emailConfirmed);
+ $newUser->attachDefaultRole();
// Assign social account if given
if ($socialAccount) {
protected $fillable = ['display_name', 'description', 'external_auth_id'];
+ protected $hidden = ['pivot'];
+
/**
* The roles that belong to the role.
*/
*/
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',
];
/**
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;
}
/**
}
/**
- * 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']);
}
/**
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.
*
}
/**
- * 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;
}
*/
public function destroy(User $user, ?int $newOwnerId = null)
{
+ $this->ensureDeletable($user);
+
$user->socialAccounts()->delete();
$user->apiTokens()->delete();
$user->favourites()->delete();
$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());
+ }
}
/**
};
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()),
];
}
$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(),
];
}
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();
*/
protected $signature = 'bookstack:delete-users';
- protected $user;
-
protected $userRepo;
/**
*/
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();
}
$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
/**
* 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;
$code = $e->status;
}
+ if (method_exists($e, 'getStatus')) {
+ $code = $e->getStatus();
+ }
+
$responseData['error']['code'] = $code;
return new JsonResponse($responseData, $code, $headers);
{
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.
*
{
$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);
}
* 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();
}
* 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();
--- /dev/null
+<?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());
+ }
+}
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;
*/
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);
}
/**
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;
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;
}
}
/**
- * 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');
$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');
$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')) {
$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
$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);
}
$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');
}
$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);
$order = 'asc';
}
- $user = $this->user->findOrFail($userId);
+ $user = $this->userRepo->getById($userId);
$sortKey = $listName . '_sort';
$orderKey = $listName . '_sort_order';
setting()->putUser($user, $sortKey, $sort);
public function boot()
{
// Password Configuration
+ // Changes here must be reflected in ApiDocsGenerate@getValidationAsString.
Password::defaults(function () {
return Password::min(8);
});
"license": "MIT",
"type": "project",
"require": {
- "php": "^7.3|^8.0",
+ "php": "^7.4|^8.0",
"ext-curl": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"preferred-install": "dist",
"sort-packages": true,
"platform": {
- "php": "7.3.0"
+ "php": "7.4.0"
}
},
"extra": {
"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"
}
--- /dev/null
+{
+ "name": "Dan Brown",
+ "email": "dannyb@example.com",
+ "roles": [1],
+ "language": "fr",
+ "send_invite": true
+}
\ No newline at end of file
--- /dev/null
+{
+ "migrate_ownership_id": 5
+}
\ No newline at end of file
--- /dev/null
+{
+ "name": "Dan Spaggleforth",
+ "email": "dspaggles@example.com",
+ "roles": [2],
+ "language": "de",
+ "password": "hunter2000"
+}
\ No newline at end of file
--- /dev/null
+{
+ "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
--- /dev/null
+{
+ "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
--- /dev/null
+{
+ "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
--- /dev/null
+{
+ "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
-FROM php:7.4-apache
+FROM php:8.1-apache
ENV APACHE_DOCUMENT_ROOT /app/public
WORKDIR /app
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;
}
'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' => 'تحديث الأذونات',
'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' => 'اللغة المفضلة',
'digits_between' => 'يجب أن يكون :attribute بعدد خانات بين :min و :max.',
'email' => 'يجب أن يكون :attribute عنوان بريد إلكتروني صالح.',
'ends_with' => 'يجب أن تنتهي السمة بأحد القيم التالية',
+ 'file' => 'The :attribute must be provided as a valid file.',
'filled' => 'حقل :attribute مطلوب.',
'gt' => [
'numeric' => 'يجب أن تكون السمة أكبر من: القيمة.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'webhook_delete' => 'حذف وب هوک',
'webhook_delete_notification' => 'وب هوک با موفقیت حذف شد',
+ // Users
+ 'user_update_notification' => 'User successfully updated',
+ 'user_delete_notification' => 'User successfully removed',
+
// Other
'commented_on' => 'ثبت دیدگاه',
'permissions_update' => 'به روزرسانی مجوزها',
'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' => 'زبان ترجیحی',
'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 باشد.',
'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',
'status_active' => 'Actif',
'status_inactive' => 'Inactif',
'never' => 'Jamais',
- 'none' => 'None',
+ 'none' => 'Aucun',
// Header
'header_menu_expand' => 'Développer le menu',
'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',
'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.',
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',
'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',
'email' => 'אי-מייל',
'password' => 'סיסמא',
'password_confirm' => 'אימות סיסמא',
- 'password_hint' => 'Must be at least 8 characters',
+ 'password_hint' => 'אורך הסיסמה חייב להיות לפחות 8 תווים',
'forgot_password' => 'שכחת סיסמא?',
'remember_me' => 'זכור אותי',
'ldap_email_hint' => 'אנא ציין כתובת אי-מייל לשימוש בחשבון זה',
'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' => 'קישור זה נשלח עקב בקשה לאיפוס סיסמא בחשבון שלך',
'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',
'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' => 'תאריך עדכון',
'no_activity' => 'אין פעילות להציג',
'no_items' => 'אין פריטים זמינים',
'back_to_top' => 'בחזרה ללמעלה',
- 'skip_to_main_content' => 'Skip to main content',
+ 'skip_to_main_content' => 'דלג לתוכן העיקרי',
'toggle_details' => 'הצג/הסתר פרטים',
'toggle_thumbnails' => 'הצג/הסתר תמונות',
'details' => 'פרטים',
'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' => 'מידע',
// 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' => 'תנאי שימוש',
];
'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' => 'לא עודכנו דפים לאחרונה',
'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' => 'תוצאות חיפוש',
'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' => 'חפש בתגים',
'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' => 'שעודכנו לאחר',
'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' => 'פרק',
'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' => 'הרשאות פרק פעילות',
'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' => 'עריכת טיוטה',
'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 החל לערוך דף זה',
],
'pages_draft_discarded' => 'הסקיצה נמחקה, העורך עודכן עם תוכן הדף העכשוי',
'pages_specific' => 'דף ספציפי',
- 'pages_is_template' => 'Page Template',
+ 'pages_is_template' => 'תבנית דף',
// Editor Sidebar
'page_tags' => 'תגיות דף',
'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' => 'קבצים מצורפים',
'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',
'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.',
'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' => 'שפה מועדפת',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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' => 'が権限を更新:',
'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' => '使用言語',
'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より大きな値である必要があります。',
// 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' => '권한 수정함',
];
'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' => '계정이 없나요?',
'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
'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' => '인증하지 않았습니다.',
'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' => '다중 인증을 설정했습니다. 설정한 방법으로 다시 로그인하세요.',
];
'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' => '정렬 기준',
'sort_ascending' => '오름차 순서',
'sort_descending' => '내림차 순서',
'sort_name' => '제목',
- 'sort_default' => 'Default',
+ 'sort_default' => '기본값',
'sort_created_at' => '만든 날짜',
'sort_updated_at' => '수정한 날짜',
'no_activity' => '활동 없음',
'no_items' => '항목 없음',
'back_to_top' => '맨 위로',
- 'skip_to_main_content' => 'Skip to main content',
+ 'skip_to_main_content' => '메인 항목으로',
'toggle_details' => '내용 보기',
'toggle_thumbnails' => '섬네일 보기',
'details' => '정보',
'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' => '서비스 이용 약관',
];
'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' => '이미지 삭제함',
'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' => '최근에 활동함',
'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' => '문서 없음',
'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' => '검색 결과',
'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' => '이후에 수정함',
'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' => '챕터',
'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 바꾸기',
'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' => '문서 권한 허용함',
'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' => '초안으로 저장',
'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.',
'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이 이 문서를 수정하고 있습니다.',
// 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' => '여기에서 바꾼 내용은 바로 적용합니다.',
'attachments_upload' => '파일 올리기',
'attachments_link' => '링크로 첨부',
'attachments_set_link' => '링크 설정',
- 'attachments_delete' => '이 첨부파일을 정말 삭제하시겠습니까?',
+ 'attachments_delete' => '이 첨부 파일을 지울 건가요?',
'attachments_dropzone' => '여기에 파일을 드롭하거나 여기를 클릭하세요.',
'attachments_no_files' => '올린 파일 없음',
'attachments_explain_link' => '파일을 올리지 않고 링크로 첨부할 수 있습니다.',
'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' => '댓글',
'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' => '경로, 소유자, 권한이 바뀌면 이 문서를 본 적 없는 사용자가 볼 수도 있습니다.',
];
'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로 로그인하세요.',
'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에 쓰는 것을 서버에서 허용하지 않습니다.',
// 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
// 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' => '메일을 발송하는 도중 문제가 생겼습니다:',
];
'password' => '여덟 글자를 넘어야 합니다.',
'user' => "메일 주소를 가진 사용자가 없습니다.",
- 'token' => '비밀번호 재설정 토큰이 이 이메일 주소에 유효하지 않습니다.',
+ 'token' => '유효하지 않거나 만료된 토큰입니다.',
'sent' => '메일을 보냈습니다.',
- 'reset' => '비밀번호를 바꿨습니다.',
+ 'reset' => '패스워드를 바꿨습니다.',
];
'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' => '권한',
'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' => '권한 관리',
'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' => '직접 만든 항목',
'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(와)과 연결했습니다.',
'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
'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(으)로 구성하세요.',
'digits_between' => ':attribute(을)를 :min~:max자리로 구성하세요.',
'email' => ':attribute(을)를 유효한 메일 주소로 구성하세요.',
'ends_with' => ':attribute(을)를 :values(으)로 끝나게 구성하세요.',
+ 'file' => ':attribute(을)를 유효한 파일로 설정하세요.',
'filled' => ':attribute(을)를 구성하세요.',
'gt' => [
'numeric' => ':attribute(을)를 :value(이)가 넘게 구성하세요.',
'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킬로바이트로 구성하세요.',
],
'string' => ':attribute(을)를 문자로 구성하세요.',
'timezone' => ':attribute(을)를 유효한 시간대로 구성하세요.',
- 'totp' => 'The provided code is not valid or has expired.',
+ 'totp' => '유효하지 않거나 만료된 코드입니다.',
'unique' => ':attribute(은)는 이미 있습니다.',
'url' => ':attribute(은)는 유효하지 않은 형식입니다.',
'uploaded' => '파일 크기가 서버에서 허용하는 수치를 넘습니다.',
// Custom validation lines
'custom' => [
'password-confirm' => [
- 'required_with' => '같은 비밀번호를 다시 입력하세요.',
+ 'required_with' => '같은 패스워드를 다시 입력하세요.',
],
],
'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',
'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',
'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.',
'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',
'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',
'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',
'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',
'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
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'webhook_delete' => 'удалил вебхук',
'webhook_delete_notification' => 'Вебхук успешно удален',
+ // Users
+ 'user_update_notification' => 'User successfully updated',
+ 'user_delete_notification' => 'User successfully removed',
+
// Other
'commented_on' => 'прокомментировал',
'permissions_update' => 'обновил разрешения',
'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' => 'Предпочитаемый язык',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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',
'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',
'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.',
'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' => 'оновив дозволи',
'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' => 'Бажана мова',
'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.',
'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',
'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',
'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.',
'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' => '权限已更新',
'status_active' => '已激活',
'status_inactive' => '未激活',
'never' => '从未',
- 'none' => 'None',
+ 'none' => '无',
// Header
'header_menu_expand' => '展开标头菜单',
'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' => '恢复',
// 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' => '无法删除最新版本。',
'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' => '语言',
'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.',
'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' => '更新權限',
'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' => '偏好語言',
'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。',
</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
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;
/**
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
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();
$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()
$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()
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.
--- /dev/null
+<?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));
+ }
+}
'name' => 'Barry',
'email' => $email,
'send_invite' => 'true',
- 'setting' => [
- 'language' => 'de',
- ],
+ 'language' => 'de',
]);
$resp->assertRedirect('/settings/users');
$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  ',
+ ]);
+
+ $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();
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]');
}
}