Compare commits

...

92 Commits

Author SHA1 Message Date
Dan Brown
a9f5e98ba9 Drawings: Added class to extract drawio data from png files 2025-06-19 17:23:56 +01:00
Dan Brown
c4839c783a Updated translator & dependency attribution before release v25.05.1 2025-06-17 15:29:12 +01:00
Dan Brown
a5751a584c Updated translations with latest Crowdin changes (#5637) 2025-06-17 15:16:25 +01:00
Dan Brown
f518a3be37 Search: Updated indexer to handle non-breaking-spaces
Related to #5640
2025-06-17 14:00:13 +01:00
Dan Brown
0208f066c5 Comments: Fixed update notification text
For #5642
2025-06-17 13:42:25 +01:00
Dan Brown
2d0461b63a Merge pull request #5653 from BookStackApp/v25-05-1-lexical
Lexical Fixes for v25.05.1
2025-06-17 13:36:55 +01:00
Dan Brown
b913ae703d Lexical: Media form improvements
- Allowed re-editing of existing embed HTML code.
- Handled "src" form field when video is using child source tags.
2025-06-15 20:00:28 +01:00
Dan Brown
1611b0399f Lexical: Added a media toolbar, improved toolbars and media selection
- Updated toolbars to auto-refresh ui if it attempts to update targeting
  a DOM element which no longer exists.
- Removed MediaNode dom specific click handling which was causing
  selection issues, and did not seem to be needed now.
2025-06-15 15:22:27 +01:00
Dan Brown
8d4b8ff4f3 Lexical: Fixed media resize handling
- Updating height/width setting to clear any inline CSS width/height
  rules which would override and prevent resizes showing. This was
  common when switching media from old editor.
  Added test to cover.
- Updated resizer to track node so that it is retained & displayed
  across node DOM changes, which was previously causing the
  resizer/focus to disappear.
2025-06-15 13:55:42 +01:00
Dan Brown
77a88618c2 Lexical: Fixed double-bold text, updated tests
Double bold was due to text field exporting wrapping the output in <b>
tags when the main tag would already be strong.
2025-06-14 14:50:10 +01:00
Dan Brown
8b062d4795 Lexical: Fixed strange paragraph formatting behaviour
Formatting was not persisted on empty paragraphs, and was instead based
upon last format encountered in selection.
This was due to overly-hasty removal of other formatting code, which
this got caught it.
Restored required parts from prior codebase.

Also updated inline format button active indicator to reflect formats
using the above, so correct buttons are shown as active even when just
in an empty paragraph.
2025-06-13 19:40:13 +01:00
Dan Brown
717b516341 Lexical: Made table resize handles more efficent & less buggy
Fine mouse movement and handles will now only be active when actually
within a table, otherwise less frequent mouseovers are used to track if
in/out a table.
Hides handles when out of a table, preventing a range of issues with
stray handles floating about.
2025-06-13 16:38:53 +01:00
Dan Brown
fda242d3da Lexical: Fixed tiny image resizer on image insert
Added specific focus on image insert, and updated resize handler to
watch for load events and toggle a resize once loaded.
2025-06-13 15:58:59 +01:00
Dan Brown
aac547934c Deps: Bumped composer php package versions 2025-06-13 15:28:11 +01:00
Dan Brown
5c9b90ea0d Merge branch 'development' of github.com:BookStackApp/BookStack into development 2025-05-31 12:36:21 +01:00
Dan Brown
074f193e2f Updated translation attribution and licenses before release 2025-05-31 12:35:47 +01:00
Dan Brown
7f2604c8e8 Updated translations with latest Crowdin changes (#5622) 2025-05-31 12:15:16 +01:00
Dan Brown
b71b2a4376 Cleanup: Updated deps, fixed test, update issue templates
Also removed some unused imports.
2025-05-31 12:11:00 +01:00
Dan Brown
68df43e5a8 Merge pull request #5627 from BookStackApp/lexical_20250525
Lexical Editor: Further fixes
2025-05-28 22:53:03 +01:00
Dan Brown
c5ca865723 Lexical: Updated WYSIWYG editor status from alpha to beta 2025-05-28 22:52:09 +01:00
Dan Brown
b862f12a50 Lexical: Further improvements to table selection and captions
- Fixed errors with selection and range handling due to captions
  existing.
- Updated TableNode change handling to update existing DOM instead of
  re-creating, which avoids breaking an attached selection helper.
  - To support, Added function to handle node change detection and apply
    relevant dom updates for common properties.
2025-05-28 22:47:39 +01:00
Dan Brown
b0f8b11054 Comments: Fixed tab focus change & button placement on form usage
Fixes issue of tabs jumping back to active comments when stopping a
reply to an archived comment.
Fixes button placement looking odd due to wrong location and differing
styles depending on interaction path.
2025-05-28 22:00:24 +01:00
Dan Brown
7650ebf2f9 Deps: Updated composer/npm packages, fixed test namespace 2025-05-27 15:53:46 +01:00
Dan Brown
d9ea52522e Lexical: Fixed issues with recent changes 2025-05-26 19:06:36 +01:00
Dan Brown
2e718c12e1 Lexical: Changed table esacpe handling
Avoids misuse of selectPrevious/Next as per prior commit which was then
causing problems elsewhere, and is probably best to avoid creation in
those select methods anyway.
2025-05-26 18:47:51 +01:00
Dan Brown
a43a1832f5 Lexical: Added image insert via image link paste
Specifically added to align with existing TinyMCE behaviour which was
used by some users based upon new editor feedback.
2025-05-26 18:02:53 +01:00
Dan Brown
c4f7368c1c Lexical: Fixed table column resizing changes not appearing
Also fixed some resizer zindex issues.
2025-05-26 15:19:11 +01:00
Dan Brown
2a32475541 Lexical: Made a range of selection improvements
Updated up/down handling to create where a selection candidate does not
exist, to apply to a wider scenario via the selectPrevious/Next methods.

Updated DOM selection change handling to identify single selections
within decorated nodes to select them in full, instead of losing
selection due to partial selection of their contents.

Updated table selection handling so that our colgroups are ignored for
internal selection focus handling.
2025-05-26 14:51:03 +01:00
Dan Brown
1243108e0f Lexical: Updated dropdown handling to match tinymce behaviour
Now toolbars stay open on mouse-out, and close on other toolbar open,
outside click or an accepted action.
To support:
- Added new system to track and manage open dropdowns.
- Added way for buttons to optionally emit events upon actions.
- Added way to listen for events.
- Used the above to control when dropdowns should hide on action, since
  some dont (like overflow containers and split dropdown buttons).
2025-05-25 16:28:42 +01:00
Dan Brown
3280919370 Lexical: Improved diagram selection and keyboard usage
Fixes issues where drawings could not be removed via backspace or
delete.
2025-05-25 13:21:13 +01:00
Dan Brown
d149b809b1 Merge pull request #5626 from BookStackApp/rubentalstra-development
Review of #5429, OIDC avatar fetching
2025-05-24 18:14:18 +01:00
Dan Brown
eb47e11916 Avatars: Added redirect handling image fetching
Up to 3 times.
Can be needed based upon testing with Auth0.
Should be fine as long as it's something clearly documented.
Added test to cover.
2025-05-24 18:07:25 +01:00
Dan Brown
9d6bc1ad4d Testing: Updated tests to account for recent page redirect changes 2025-05-24 16:47:01 +01:00
Dan Brown
30bf0ce632 OIDC: Updated avatar fetching to run on each login
But only where the user does not already have an avatar assigned.
This aligns with the LDAP avatar fetching logic.
2025-05-24 16:34:36 +01:00
Dan Brown
b64c9b31d5 OIDC: Added testing coverage for picture fetching 2025-05-24 14:36:36 +01:00
Dan Brown
f9dbbe5d70 OIDC: Updated picture fetch implementation during review
Review of #5429
2025-05-24 14:02:37 +01:00
Dan Brown
05f7f4cb17 Merge branch 'development' of github.com:rubentalstra/BookStack into rubentalstra-development 2025-05-24 13:28:23 +01:00
Dan Brown
454b152b95 Pages: Redirect user to view if they can't edit
For #5568
2025-05-24 12:05:17 +01:00
Dan Brown
b29fe5c46d Merge pull request #5625 from BookStackApp/avif_images
AVIF image support
2025-05-23 17:30:24 +01:00
Dan Brown
131ac29df4 Images: Added testing to cover animated avif handling 2025-05-23 17:19:34 +01:00
Dan Brown
3a9d18a6cd Images: Added base avif support
Includes handling for animated avif images like apng.
2025-05-23 16:12:03 +01:00
Dan Brown
59e2c5e52a Merge pull request #5607 from BookStackApp/system_info_endpoint
API: System info endpoint
2025-05-22 17:31:32 +01:00
Dan Brown
d29b14ebfd Merge pull request #5584 from BookStackApp/content_comments
Content Comments
2025-05-22 16:58:36 +01:00
Dan Brown
cdd446ac73 Updated translations with latest Crowdin changes (#5608) 2025-05-17 12:04:25 +01:00
Dan Brown
1dd1024eba Merge pull request #5609 from BookStackApp/5605-folder-permissions
Images: Updated local disk to have open dir perms
2025-05-17 11:49:44 +01:00
Dan Brown
752cfe2f67 CLI: Updated CLI with fixes
- Updated php packages
- Added escaping for mysql options
2025-05-17 11:47:33 +01:00
Dan Brown
25baaa8189 Deps: Updated composer packages 2025-05-17 11:40:58 +01:00
Dan Brown
d2d0331782 Readme: Replaced discord/mastodon links, reformatted badges 2025-05-14 23:15:46 +01:00
Dan Brown
8121418e18 Readme: Added phamos as sponsor 2025-05-14 22:35:59 +01:00
Dan Brown
5ab31a8191 Images: Updated local disk to have open dir perms
Closes #5605
2025-05-14 18:15:20 +01:00
Dan Brown
0e69ab1938 API: Added test to cover system info endpoint 2025-05-13 20:46:11 +01:00
Dan Brown
058007109e API: Added system read endpoint
Standardised logic for reading app version to its own static class.
2025-05-13 20:38:08 +01:00
Dan Brown
32b29fcdfc Comments: Fixed pointer display, Fixed translation test 2025-05-13 12:03:15 +01:00
Dan Brown
8f92b6f21b Comments: Fixed a range of TS errors + other
- Migrated toolbox component to TS
- Aligned how custom event types are managed
- Fixed PHP use of content_ref where not provided
2025-05-12 15:31:55 +01:00
Dan Brown
62f78f1c6d Comments: Split tests, added extra archive/reference tests 2025-05-12 14:26:09 +01:00
Dan Brown
f8c0aaff03 Comments: Checked content/arhived comment styles in dark mode
Also added default non-clickable styles for scenarios for references
which don't have an active content link.
2025-05-09 14:17:04 +01:00
Dan Brown
a27df485bb Comments: Fixed display, added archive list support for editor toolbox 2025-05-09 12:14:28 +01:00
Dan Brown
3e99ce4098 Deps: Updated PHP packages
Mainly to update termwind which was causing issues for users on Arch
where a more recent libxml version was in use.
2025-05-08 15:53:25 +01:00
Dan Brown
ce1e20501c Updated translator & dependency attribution before release v25.02.3 2025-05-05 18:14:18 +01:00
Dan Brown
295532fa7a Deps: Updated PHP packages 2025-05-05 18:09:49 +01:00
Dan Brown
642ba668b1 Merge pull request #5601 from BookStackApp/file_permissions
Images: Changed how new image permissions are set
2025-05-05 12:54:40 +01:00
Dan Brown
4f36cdd757 Updated translations with latest Crowdin changes (#5566) 2025-05-05 12:24:12 +01:00
Dan Brown
8821844c4a Exports: Fixed CSS file BOM mark breaking CSS variables in exports
Adds a dummy CSS rule to break as the first rule, instead of our
:root variables.
Fixes #5576
2025-05-05 12:21:32 +01:00
Dan Brown
1262083fcf Images: Changed how new image permissions are set
Removed default public visibility for images at the driver level,
leaving only doing this as a specific action in the logic.
Added try/catch around permission setting so that
permission-incompatible environments won't fatally fail, but instead
log a warning.

Tested via a google cloud storage bucket FUSE mount, mounted under another
user but with open 777 permissions.

Related to #5269
2025-05-03 20:30:50 +01:00
Dan Brown
c82fa33210 Comments: Further range of content reference ux improvements
- Added reference indicator to comment create form.
  - Added remove action.
- Extracted reference text to translations.
- Changed reference hash to be text-based instead of HTML based.
- Added reference display for newly added comments.
- Handled reference marker delete on comment delete.
2025-05-01 17:22:12 +01:00
Dan Brown
15c79c38db Comments: Addressed a range of edge cases and ux issues for references
Handles only display and handling references when they're in the active
tab, while handling proper removal when made not visible.
2025-05-01 16:33:42 +01:00
Dan Brown
e7dcc2dcdf Comments: Moved to tab UI, Converted tabs component to ts 2025-04-30 17:42:09 +01:00
Dan Brown
099f6104d0 Comments: Started archive display, created mode for tree node 2025-04-28 20:09:18 +01:00
Dan Brown
8bdf948743 Comments: Added archive endpoints, messages, Js actions and tests 2025-04-28 15:37:09 +01:00
Dan Brown
e8f44186a8 Comments: Split out page comment reference logic to own component
Started support for editor view.
Moved comment elements to be added relative to content area instad of
specific target reference element.
Added relocating on screen size change.
2025-04-27 16:51:24 +01:00
Dan Brown
ecda4e1d6f Comments: Added reference marker to comments 2025-04-26 21:05:54 +01:00
Dan Brown
f656a82fe7 Comments: Styled content comments & improved interaction 2025-04-24 13:21:23 +01:00
Dan Brown
5bfba281fc Comments: Started inline comment display windows 2025-04-21 14:04:41 +01:00
Dan Brown
18ede9bbd3 Comments: Added inline comment marker/highlight logic 2025-04-19 14:07:52 +01:00
Dan Brown
2e7544a865 Comments: Converted comment component to TS 2025-04-19 12:46:47 +01:00
Dan Brown
5e3c3ad634 Comments: Added back-end content reference handling
Also added archived property, to be added.
2025-04-18 21:13:49 +01:00
Dan Brown
add238fe9f Comments & Pointer: Converted components to typescript
Made changes for dom and translation services for easier usage
considering types.
trans_choice updated to allow default count replacement data as per
Laravel's default behaviour.
2025-04-18 20:42:56 +01:00
Dan Brown
8d159f77e4 Comments: Started logic for content references
Adds button for comments to pointer.
Adds logic to generate a content reference point.
2025-04-18 15:01:57 +01:00
Dan Brown
fa566f156a Updated translator & dependency attribution before release v25.02.2 2025-04-02 17:30:43 +01:00
Dan Brown
78a0a2f519 Merge pull request #5558 from BookStackApp/lexical_round3
Lexical Fixes: Round 3
2025-04-02 17:23:38 +01:00
Dan Brown
42cbd6adef Updated translations with latest Crowdin changes (#5537) 2025-04-02 17:19:34 +01:00
Dan Brown
6117349893 Deps: Updated composer packages 2025-04-02 15:30:31 +01:00
Dan Brown
1256320c72 Merge branch 'bernardo-campos/development' into development 2025-04-02 15:18:31 +01:00
Dan Brown
1ba0d26fdd Sort Rules: Updated name comparison to not ignore non-ascii chars
Related to #5550 and #5542
2025-04-02 15:17:17 +01:00
Dan Brown
802f69cf35 Comments: Fixed missing comment timestamps
Due to deleted code during Laravel 11 upgrade.
Added test to cover.
Closes #5555
2025-03-30 17:36:48 +01:00
Dan Brown
bb44334224 Lexical: Added tests to cover recent changes
Also updated list tests to new test process.
2025-03-28 18:29:00 +00:00
Dan Brown
9bfcadd95f Lexical: Improved navigation around images/media
- Added specific handling to move/insert-up/down on arrow press.
- Prevented resize overlay from interrupting image node focus.
2025-03-28 14:30:03 +00:00
Dan Brown
62c8eb3357 Lexical: Made list selections & intendting more reliable
- Added handling to not include parent of top-most list range selection
  so that it's not also changed while not visually part of the
  selection range.
- Fixed issue where list items could be left over after unnesting, due
  to empty checks/removals occuring before all child handling.
- Added node sorting, applied to list items during nest operations so
  that selection range remains reliable.
2025-03-27 17:49:48 +00:00
Dan Brown
c03e44124a Lexical: Fixed task list parsing
Updated list DOM parsing to properly consider task list format set by
other MD/WYSIWYG editors.
2025-03-27 14:56:32 +00:00
Dan Brown
5c6671b3bf Lexical: Fixed issues with content not saving
Found that saving via Ctrl+Enter did not save as logic to load editor
output into form was bypassed, which this fixes by ensuring submit
events are raised during for this shortcut.

Submit handling also gets a timeout added since, at least in FF,
requestSubmit did not re-submit a form while in a submit event.
2025-03-27 14:13:18 +00:00
Bernardo Campos
abe7467ae5 Fix issue BookStackApp#5542 Sorting by name 2025-03-23 12:29:29 -03:00
Talstra Ruben SRSNL
da82e70ca3 Add optional OIDC avatar fetching from the “picture” claim 2025-01-20 17:21:46 +01:00
312 changed files with 6032 additions and 3116 deletions

View File

@@ -42,6 +42,7 @@ body:
label: Log Content
description: If the issue has produced an error, provide any [BookStack or server log](https://www.bookstackapp.com/docs/admin/debugging/) content below.
placeholder: Be sure to remove any confidential details in your logs
render: text
validations:
required: false
- type: textarea

View File

@@ -0,0 +1,9 @@
name: Blank Request (Maintainers Only)
description: For maintainers only - Start a blank request
body:
- type: markdown
attributes:
value: "**This blank request option is only for existing official maintainers of the project!** Please instead use a different request option. If you use this your issue will be closed off."
- type: textarea
attributes:
label: Description

View File

@@ -478,3 +478,14 @@ Alexandar Cavdarovski (ace.200112) :: Swedish
Onur Oskay (o.oskay) :: Turkish
Sébastien Merveille (SebastienMerv) :: French
Maxim Kouznetsov (masya.work) :: Hebrew
neodvisnost :: Slovenian
Soubi Agatsuma (bisouya) :: Hebrew
Ilya Shaulov (ishaulov) :: Russian
Konstantin Bobkov (b.konstantv) :: Russian
Ruben Sutter (rubensutter) :: German
jellium :: French
Qxlkdr :: Swedish
Hari (muhhari) :: Indonesian
仙君御 (xjy) :: Chinese Simplified
TapioM :: Finnish
lingb58 :: Chinese Traditional

View File

@@ -11,6 +11,7 @@ use BookStack\Exceptions\UserRegistrationException;
use BookStack\Facades\Theme;
use BookStack\Http\HttpRequestService;
use BookStack\Theming\ThemeEvents;
use BookStack\Uploads\UserAvatars;
use BookStack\Users\Models\User;
use Illuminate\Support\Facades\Cache;
use League\OAuth2\Client\OptionProvider\HttpBasicAuthOptionProvider;
@@ -26,7 +27,8 @@ class OidcService
protected RegistrationService $registrationService,
protected LoginService $loginService,
protected HttpRequestService $http,
protected GroupSyncService $groupService
protected GroupSyncService $groupService,
protected UserAvatars $userAvatars
) {
}
@@ -220,6 +222,10 @@ class OidcService
throw new OidcException($exception->getMessage());
}
if ($this->config()['fetch_avatar'] && !$user->avatar()->exists() && $userDetails->picture) {
$this->userAvatars->assignToUserFromUrl($user, $userDetails->picture);
}
if ($this->shouldSyncGroups()) {
$detachExisting = $this->config()['remove_from_groups'];
$this->groupService->syncUserWithFoundGroups($user, $userDetails->groups ?? [], $detachExisting);

View File

@@ -11,6 +11,7 @@ class OidcUserDetails
public ?string $email = null,
public ?string $name = null,
public ?array $groups = null,
public ?string $picture = null,
) {
}
@@ -40,15 +41,16 @@ class OidcUserDetails
$this->email = $claims->getClaim('email') ?? $this->email;
$this->name = static::getUserDisplayName($displayNameClaims, $claims) ?? $this->name;
$this->groups = static::getUserGroups($groupsClaim, $claims) ?? $this->groups;
$this->picture = static::getPicture($claims) ?: $this->picture;
}
protected static function getUserDisplayName(string $displayNameClaims, ProvidesClaims $token): string
protected static function getUserDisplayName(string $displayNameClaims, ProvidesClaims $claims): string
{
$displayNameClaimParts = explode('|', $displayNameClaims);
$displayName = [];
foreach ($displayNameClaimParts as $claim) {
$component = $token->getClaim(trim($claim)) ?? '';
$component = $claims->getClaim(trim($claim)) ?? '';
if ($component !== '') {
$displayName[] = $component;
}
@@ -57,13 +59,13 @@ class OidcUserDetails
return implode(' ', $displayName);
}
protected static function getUserGroups(string $groupsClaim, ProvidesClaims $token): ?array
protected static function getUserGroups(string $groupsClaim, ProvidesClaims $claims): ?array
{
if (empty($groupsClaim)) {
return null;
}
$groupsList = Arr::get($token->getAllClaims(), $groupsClaim);
$groupsList = Arr::get($claims->getAllClaims(), $groupsClaim);
if (!is_array($groupsList)) {
return null;
}
@@ -72,4 +74,14 @@ class OidcUserDetails
return is_string($val);
}));
}
protected static function getPicture(ProvidesClaims $claims): ?string
{
$picture = $claims->getClaim('picture');
if (is_string($picture) && str_starts_with($picture, 'http')) {
return $picture;
}
return null;
}
}

View File

@@ -4,6 +4,8 @@ namespace BookStack\Activity;
use BookStack\Activity\Models\Comment;
use BookStack\Entities\Models\Entity;
use BookStack\Exceptions\NotifyException;
use BookStack\Exceptions\PrettyException;
use BookStack\Facades\Activity as ActivityService;
use BookStack\Util\HtmlDescriptionFilter;
@@ -20,7 +22,7 @@ class CommentRepo
/**
* Create a new comment on an entity.
*/
public function create(Entity $entity, string $html, ?int $parent_id): Comment
public function create(Entity $entity, string $html, ?int $parentId, string $contentRef): Comment
{
$userId = user()->id;
$comment = new Comment();
@@ -29,7 +31,8 @@ class CommentRepo
$comment->created_by = $userId;
$comment->updated_by = $userId;
$comment->local_id = $this->getNextLocalId($entity);
$comment->parent_id = $parent_id;
$comment->parent_id = $parentId;
$comment->content_ref = preg_match('/^bkmrk-(.*?):\d+:(\d*-\d*)?$/', $contentRef) === 1 ? $contentRef : '';
$entity->comments()->save($comment);
ActivityService::add(ActivityType::COMMENT_CREATE, $comment);
@@ -52,6 +55,41 @@ class CommentRepo
return $comment;
}
/**
* Archive an existing comment.
*/
public function archive(Comment $comment): Comment
{
if ($comment->parent_id) {
throw new NotifyException('Only top-level comments can be archived.', '/', 400);
}
$comment->archived = true;
$comment->save();
ActivityService::add(ActivityType::COMMENT_UPDATE, $comment);
return $comment;
}
/**
* Un-archive an existing comment.
*/
public function unarchive(Comment $comment): Comment
{
if ($comment->parent_id) {
throw new NotifyException('Only top-level comments can be un-archived.', '/', 400);
}
$comment->archived = false;
$comment->save();
ActivityService::add(ActivityType::COMMENT_UPDATE, $comment);
return $comment;
}
/**
* Delete a comment from the system.
*/

View File

@@ -3,6 +3,8 @@
namespace BookStack\Activity\Controllers;
use BookStack\Activity\CommentRepo;
use BookStack\Activity\Tools\CommentTree;
use BookStack\Activity\Tools\CommentTreeNode;
use BookStack\Entities\Queries\PageQueries;
use BookStack\Http\Controller;
use Illuminate\Http\Request;
@@ -26,6 +28,7 @@ class CommentController extends Controller
$input = $this->validate($request, [
'html' => ['required', 'string'],
'parent_id' => ['nullable', 'integer'],
'content_ref' => ['string'],
]);
$page = $this->pageQueries->findVisibleById($pageId);
@@ -40,14 +43,12 @@ class CommentController extends Controller
// Create a new comment.
$this->checkPermission('comment-create-all');
$comment = $this->commentRepo->create($page, $input['html'], $input['parent_id'] ?? null);
$contentRef = $input['content_ref'] ?? '';
$comment = $this->commentRepo->create($page, $input['html'], $input['parent_id'] ?? null, $contentRef);
return view('comments.comment-branch', [
'readOnly' => false,
'branch' => [
'comment' => $comment,
'children' => [],
]
'branch' => new CommentTreeNode($comment, 0, []),
]);
}
@@ -74,6 +75,46 @@ class CommentController extends Controller
]);
}
/**
* Mark a comment as archived.
*/
public function archive(int $id)
{
$comment = $this->commentRepo->getById($id);
$this->checkOwnablePermission('page-view', $comment->entity);
if (!userCan('comment-update', $comment) && !userCan('comment-delete', $comment)) {
$this->showPermissionError();
}
$this->commentRepo->archive($comment);
$tree = new CommentTree($comment->entity);
return view('comments.comment-branch', [
'readOnly' => false,
'branch' => $tree->getCommentNodeForId($id),
]);
}
/**
* Unmark a comment as archived.
*/
public function unarchive(int $id)
{
$comment = $this->commentRepo->getById($id);
$this->checkOwnablePermission('page-view', $comment->entity);
if (!userCan('comment-update', $comment) && !userCan('comment-delete', $comment)) {
$this->showPermissionError();
}
$this->commentRepo->unarchive($comment);
$tree = new CommentTree($comment->entity);
return view('comments.comment-branch', [
'readOnly' => false,
'branch' => $tree->getCommentNodeForId($id),
]);
}
/**
* Delete a comment from the system.
*/

View File

@@ -19,6 +19,8 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
* @property int $entity_id
* @property int $created_by
* @property int $updated_by
* @property string $content_ref
* @property bool $archived
*/
class Comment extends Model implements Loggable
{

View File

@@ -9,7 +9,7 @@ class CommentTree
{
/**
* The built nested tree structure array.
* @var array{comment: Comment, depth: int, children: array}[]
* @var CommentTreeNode[]
*/
protected array $tree;
protected array $comments;
@@ -28,7 +28,7 @@ class CommentTree
public function empty(): bool
{
return count($this->tree) === 0;
return count($this->getActive()) === 0;
}
public function count(): int
@@ -36,9 +36,35 @@ class CommentTree
return count($this->comments);
}
public function get(): array
public function getActive(): array
{
return $this->tree;
return array_filter($this->tree, fn (CommentTreeNode $node) => !$node->comment->archived);
}
public function activeThreadCount(): int
{
return count($this->getActive());
}
public function getArchived(): array
{
return array_filter($this->tree, fn (CommentTreeNode $node) => $node->comment->archived);
}
public function archivedThreadCount(): int
{
return count($this->getArchived());
}
public function getCommentNodeForId(int $commentId): ?CommentTreeNode
{
foreach ($this->tree as $node) {
if ($node->comment->id === $commentId) {
return $node;
}
}
return null;
}
public function canUpdateAny(): bool
@@ -54,6 +80,7 @@ class CommentTree
/**
* @param Comment[] $comments
* @return CommentTreeNode[]
*/
protected function createTree(array $comments): array
{
@@ -77,26 +104,22 @@ class CommentTree
$tree = [];
foreach ($childMap[0] ?? [] as $childId) {
$tree[] = $this->createTreeForId($childId, 0, $byId, $childMap);
$tree[] = $this->createTreeNodeForId($childId, 0, $byId, $childMap);
}
return $tree;
}
protected function createTreeForId(int $id, int $depth, array &$byId, array &$childMap): array
protected function createTreeNodeForId(int $id, int $depth, array &$byId, array &$childMap): CommentTreeNode
{
$childIds = $childMap[$id] ?? [];
$children = [];
foreach ($childIds as $childId) {
$children[] = $this->createTreeForId($childId, $depth + 1, $byId, $childMap);
$children[] = $this->createTreeNodeForId($childId, $depth + 1, $byId, $childMap);
}
return [
'comment' => $byId[$id],
'depth' => $depth,
'children' => $children,
];
return new CommentTreeNode($byId[$id], $depth, $children);
}
protected function loadComments(): array

View File

@@ -0,0 +1,23 @@
<?php
namespace BookStack\Activity\Tools;
use BookStack\Activity\Models\Comment;
class CommentTreeNode
{
public Comment $comment;
public int $depth;
/**
* @var CommentTreeNode[]
*/
public array $children;
public function __construct(Comment $comment, int $depth, array $children)
{
$this->comment = $comment;
$this->depth = $depth;
$this->children = $children;
}
}

View File

@@ -2,6 +2,7 @@
namespace BookStack\Api;
use BookStack\App\AppVersion;
use BookStack\Http\ApiController;
use Exception;
use Illuminate\Contracts\Container\BindingResolutionException;
@@ -25,7 +26,7 @@ class ApiDocsGenerator
*/
public static function generateConsideringCache(): Collection
{
$appVersion = trim(file_get_contents(base_path('version')));
$appVersion = AppVersion::get();
$cacheKey = 'api-docs::' . $appVersion;
$isProduction = config('app.env') === 'production';
$cacheVal = $isProduction ? Cache::get($cacheKey) : null;

24
app/App/AppVersion.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
namespace BookStack\App;
class AppVersion
{
protected static string $version = '';
/**
* Get the application's version number from its top-level `version` text file.
*/
public static function get(): string
{
if (!empty(static::$version)) {
return static::$version;
}
$versionFile = base_path('version');
$version = trim(file_get_contents($versionFile));
static::$version = $version;
return $version;
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace BookStack\App;
use BookStack\Http\ApiController;
use Illuminate\Http\JsonResponse;
class SystemApiController extends ApiController
{
/**
* Read details regarding the BookStack instance.
* Some details may be null where not set, like the app logo for example.
*/
public function read(): JsonResponse
{
$logoSetting = setting('app-logo', '');
if ($logoSetting === 'none') {
$logo = null;
} else {
$logo = $logoSetting ? url($logoSetting) : url('/logo.png');
}
return response()->json([
'version' => AppVersion::get(),
'instance_id' => setting('instance-id'),
'app_name' => setting('app-name'),
'app_logo' => $logo,
'base_url' => url('/'),
]);
}
}

View File

@@ -1,5 +1,6 @@
<?php
use BookStack\App\AppVersion;
use BookStack\App\Model;
use BookStack\Facades\Theme;
use BookStack\Permissions\PermissionApplicator;
@@ -13,12 +14,7 @@ use BookStack\Users\Models\User;
*/
function versioned_asset(string $file = ''): string
{
static $version = null;
if (is_null($version)) {
$versionFile = base_path('version');
$version = trim(file_get_contents($versionFile));
}
$version = AppVersion::get();
$additional = '';
if (config('app.env') === 'development') {

View File

@@ -32,9 +32,9 @@ return [
'local' => [
'driver' => 'local',
'root' => public_path(),
'visibility' => 'public',
'serve' => false,
'throw' => true,
'directory_visibility' => 'public',
],
'local_secure_attachments' => [
@@ -47,7 +47,6 @@ return [
'local_secure_images' => [
'driver' => 'local',
'root' => storage_path('uploads/images/'),
'visibility' => 'public',
'serve' => false,
'throw' => true,
],

View File

@@ -47,6 +47,12 @@ return [
// Multiple values can be provided comma seperated.
'additional_scopes' => env('OIDC_ADDITIONAL_SCOPES', null),
// Enable fetching of the user's avatar from the 'picture' claim on login.
// Will only be fetched if the user doesn't already have an avatar image assigned.
// This can be a security risk due to performing server-side fetching (with up to 3 redirects) of
// data from external URLs. Only enable if you trust the OIDC auth provider to provide safe URLs for user images.
'fetch_avatar' => env('OIDC_FETCH_AVATAR', false),
// Group sync options
// Enable syncing, upon login, of OIDC groups to BookStack roles
'user_to_groups' => env('OIDC_USER_TO_GROUPS', false),

View File

@@ -17,6 +17,7 @@ use BookStack\Entities\Tools\PageContent;
use BookStack\Entities\Tools\PageEditActivity;
use BookStack\Entities\Tools\PageEditorData;
use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\NotifyException;
use BookStack\Exceptions\PermissionsException;
use BookStack\Http\Controller;
use BookStack\References\ReferenceFetcher;
@@ -196,7 +197,7 @@ class PageController extends Controller
public function edit(Request $request, string $bookSlug, string $pageSlug)
{
$page = $this->queries->findVisibleBySlugsOrFail($bookSlug, $pageSlug);
$this->checkOwnablePermission('page-update', $page);
$this->checkOwnablePermission('page-update', $page, $page->getUrl());
$editorData = new PageEditorData($page, $this->entityQueries, $request->query('editor', ''));
if ($editorData->getWarnings()) {

View File

@@ -2,6 +2,7 @@
namespace BookStack\Exceptions;
use BookStack\App\AppVersion;
use Illuminate\Contracts\Foundation\ExceptionRenderer;
class BookStackExceptionHandlerPage implements ExceptionRenderer
@@ -30,9 +31,7 @@ class BookStackExceptionHandlerPage implements ExceptionRenderer
return [
'PHP Version' => phpversion(),
'BookStack Version' => $this->safeReturn(function () {
$versionFile = base_path('version');
return trim(file_get_contents($versionFile));
return AppVersion::get();
}, 'unknown'),
'Theme Configured' => $this->safeReturn(function () {
return config('view.theme');

View File

@@ -0,0 +1,7 @@
<?php
namespace BookStack\Exceptions;
class DrawioPngReaderException extends \Exception
{
}

View File

@@ -2,6 +2,7 @@
namespace BookStack\Exports\ZipExports;
use BookStack\App\AppVersion;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
@@ -70,7 +71,7 @@ class ZipExportBuilder
$this->data['exported_at'] = date(DATE_ATOM);
$this->data['instance'] = [
'id' => setting('instance-id', ''),
'version' => trim(file_get_contents(base_path('version'))),
'version' => AppVersion::get(),
];
$zipFile = tempnam(sys_get_temp_dir(), 'bszip-');

View File

@@ -49,13 +49,13 @@ abstract class Controller extends BaseController
* On a permission error redirect to home and display.
* the error as a notification.
*
* @return never
* @throws NotifyException
*/
protected function showPermissionError()
protected function showPermissionError(string $redirectLocation = '/'): never
{
$message = request()->wantsJson() ? trans('errors.permissionJson') : trans('errors.permission');
throw new NotifyException($message, '/', 403);
throw new NotifyException($message, $redirectLocation, 403);
}
/**
@@ -81,10 +81,10 @@ abstract class Controller extends BaseController
/**
* Check the current user's permissions against an ownable item otherwise throw an exception.
*/
protected function checkOwnablePermission(string $permission, Model $ownable): void
protected function checkOwnablePermission(string $permission, Model $ownable, string $redirectLocation = '/'): void
{
if (!userCan($permission, $ownable)) {
$this->showPermissionError();
$this->showPermissionError($redirectLocation);
}
}
@@ -163,7 +163,7 @@ abstract class Controller extends BaseController
*/
protected function getImageValidationRules(): array
{
return ['image_extension', 'mimes:jpeg,png,gif,webp', 'max:' . (config('app.upload_limit') * 1000)];
return ['image_extension', 'mimes:jpeg,png,gif,webp,avif', 'max:' . (config('app.upload_limit') * 1000)];
}
/**

View File

@@ -160,7 +160,9 @@ class SearchIndex
/** @var DOMNode $child */
foreach ($doc->getBodyChildren() as $child) {
$nodeName = $child->nodeName;
$termCounts = $this->textToTermCountMap(trim($child->textContent));
$text = trim($child->textContent);
$text = str_replace("\u{00A0}", ' ', $text);
$termCounts = $this->textToTermCountMap($text);
foreach ($termCounts as $term => $count) {
$scoreChange = $count * ($elementScoreAdjustmentMap[$nodeName] ?? 1);
$scoresByTerm[$term] = ($scoresByTerm[$term] ?? 0) + $scoreChange;

View File

@@ -3,6 +3,7 @@
namespace BookStack\Settings;
use BookStack\Activity\ActivityType;
use BookStack\App\AppVersion;
use BookStack\Entities\Tools\TrashCan;
use BookStack\Http\Controller;
use BookStack\References\ReferenceStore;
@@ -19,14 +20,11 @@ class MaintenanceController extends Controller
$this->checkPermission('settings-manage');
$this->setPageTitle(trans('settings.maint'));
// Get application version
$version = trim(file_get_contents(base_path('version')));
// Recycle bin details
$recycleStats = $trashCan->getTrashedCounts();
return view('settings.maintenance', [
'version' => $version,
'version' => AppVersion::get(),
'recycleStats' => $recycleStats,
]);
}

View File

@@ -3,6 +3,7 @@
namespace BookStack\Settings;
use BookStack\Activity\ActivityType;
use BookStack\App\AppVersion;
use BookStack\Http\Controller;
use BookStack\Users\Models\User;
use Illuminate\Http\Request;
@@ -26,12 +27,9 @@ class SettingController extends Controller
$this->checkPermission('settings-manage');
$this->setPageTitle(trans('settings.settings'));
// Get application version
$version = trim(file_get_contents(base_path('version')));
return view('settings.categories.' . $category, [
'category' => $category,
'version' => $version,
'version' => AppVersion::get(),
'guestUser' => User::getGuest(),
]);
}

View File

@@ -2,6 +2,7 @@
namespace BookStack\Sorting;
use voku\helper\ASCII;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Entity;
@@ -13,12 +14,12 @@ class SortSetOperationComparisons
{
public static function nameAsc(Entity $a, Entity $b): int
{
return strtolower($a->name) <=> strtolower($b->name);
return strtolower(ASCII::to_transliterate($a->name, null)) <=> strtolower(ASCII::to_transliterate($b->name, null));
}
public static function nameDesc(Entity $a, Entity $b): int
{
return strtolower($b->name) <=> strtolower($a->name);
return strtolower(ASCII::to_transliterate($b->name, null)) <=> strtolower(ASCII::to_transliterate($a->name, null));
}
public static function nameNumericAsc(Entity $a, Entity $b): int

View File

@@ -0,0 +1,122 @@
<?php
namespace BookStack\Uploads;
use BookStack\Exceptions\DrawioPngReaderException;
/**
* Reads the PNG file format: https://www.w3.org/TR/2003/REC-PNG-20031110/
* So that it can extract embedded drawing data for alternative use.
*/
class DrawioPngReader
{
/**
* @param resource $fileStream
*/
public function __construct(
protected $fileStream
) {
}
/**
* @throws DrawioPngReaderException
*/
public function extractDrawing(): string
{
$signature = fread($this->fileStream, 8);
$pngSignature = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A";
if ($signature !== $pngSignature) {
throw new DrawioPngReaderException('File does not appear to be a valid PNG file');
}
$offset = 8;
$searching = true;
while ($searching) {
fseek($this->fileStream, $offset);
$lengthBytes = $this->readData(4);
$chunkTypeBytes = $this->readData(4);
$length = unpack('Nvalue', $lengthBytes)['value'];
if ($chunkTypeBytes === 'tEXt') {
fseek($this->fileStream, $offset + 8);
$data = $this->readData($length);
$crc = $this->readData(4);
$drawingData = $this->readTextForDrawing($data);
if ($drawingData !== null) {
$crcResult = $this->calculateCrc($chunkTypeBytes . $data);
if ($crc !== $crcResult) {
throw new DrawioPngReaderException('Drawing data withing PNG file appears to be corrupted');
}
return $drawingData;
}
} else if ($chunkTypeBytes === 'IEND') {
$searching = false;
}
$offset += 12 + $length; // 12 = length + type + crc bytes
}
throw new DrawioPngReaderException('Unable to find drawing data within PNG file');
}
protected function readTextForDrawing(string $data): ?string
{
// Check the keyword is mxfile to ensure we're getting the right data
if (!str_starts_with($data, "mxfile\u{0}")) {
return null;
}
// Extract & cleanup the drawing text
$drawingText = substr($data, 7);
return urldecode($drawingText);
}
protected function readData(int $length): string
{
$bytes = fread($this->fileStream, $length);
if ($bytes === false || strlen($bytes) < $length) {
throw new DrawioPngReaderException('Unable to find drawing data within PNG file');
}
return $bytes;
}
protected function getCrcTable(): array
{
$table = [];
for ($n = 0; $n < 256; $n++) {
$c = $n;
for ($k = 0; $k < 8; $k++) {
if ($c & 1) {
$c = 0xedb88320 ^ ($c >> 1);
} else {
$c = $c >> 1;
}
}
$table[$n] = $c;
}
return $table;
}
/**
* Calculate a CRC for the given bytes following:
* https://www.w3.org/TR/2003/REC-PNG-20031110/#D-CRCAppendix
*/
protected function calculateCrc(string $bytes): string
{
$table = $this->getCrcTable();
$length = strlen($bytes);
$c = 0xffffffff;
for ($n = 0; $n < $length; $n++) {
$tableIndex = ($c ^ ord($bytes[$n])) & 0xff;
$c = $table[$tableIndex] ^ ($c >> 8);
}
return pack('N', $c ^ 0xffffffff);
}
}

View File

@@ -6,6 +6,7 @@ use BookStack\Exceptions\ImageUploadException;
use Exception;
use GuzzleHttp\Psr7\Utils;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Intervention\Image\Decoders\BinaryImageDecoder;
use Intervention\Image\Drivers\Gd\Decoders\NativeObjectDecoder;
use Intervention\Image\Drivers\Gd\Driver;
@@ -93,8 +94,8 @@ class ImageResizer
$imageData = $disk->get($imagePath);
// Do not resize apng images where we're not cropping
if ($keepRatio && $this->isApngData($image, $imageData)) {
// Do not resize animated images where we're not cropping
if ($keepRatio && $this->isAnimated($image, $imageData)) {
Cache::put($thumbCacheKey, $image->path, static::THUMBNAIL_CACHE_TIME);
return $this->storage->getPublicUrl($image->path);
@@ -240,15 +241,50 @@ class ImageResizer
/**
* Check if the given image and image data is apng.
*/
protected function isApngData(Image $image, string &$imageData): bool
protected function isApngData(string &$imageData): bool
{
$isPng = strtolower(pathinfo($image->path, PATHINFO_EXTENSION)) === 'png';
if (!$isPng) {
return false;
}
$initialHeader = substr($imageData, 0, strpos($imageData, 'IDAT'));
return str_contains($initialHeader, 'acTL');
}
/**
* Check if the given avif image data represents an animated image.
* This is based up the answer here: https://stackoverflow.com/a/79457313
*/
protected function isAnimatedAvifData(string &$imageData): bool
{
$stszPos = strpos($imageData, 'stsz');
if ($stszPos === false) {
return false;
}
// Look 12 bytes after the start of 'stsz'
$start = $stszPos + 12;
$end = $start + 4;
if ($end > strlen($imageData) - 1) {
return false;
}
$data = substr($imageData, $start, 4);
$count = unpack('Nvalue', $data)['value'];
return $count > 1;
}
/**
* Check if the given image is animated.
*/
protected function isAnimated(Image $image, string &$imageData): bool
{
$extension = strtolower(pathinfo($image->path, PATHINFO_EXTENSION));
if ($extension === 'png') {
return $this->isApngData($imageData);
}
if ($extension === 'avif') {
return $this->isAnimatedAvifData($imageData);
}
return false;
}
}

View File

@@ -13,7 +13,7 @@ use Symfony\Component\HttpFoundation\StreamedResponse;
class ImageService
{
protected static array $supportedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
protected static array $supportedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'avif'];
public function __construct(
protected ImageStorage $storage,

View File

@@ -5,6 +5,9 @@ namespace BookStack\Uploads;
use BookStack\Util\FilePathNormalizer;
use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Log;
use League\Flysystem\UnableToSetVisibility;
use League\Flysystem\Visibility;
use Symfony\Component\HttpFoundation\StreamedResponse;
class ImageStorageDisk
@@ -74,12 +77,19 @@ class ImageStorageDisk
$path = $this->adjustPathForDisk($path);
$this->filesystem->put($path, $data);
// Set visibility when a non-AWS-s3, s3-like storage option is in use.
// Done since this call can break s3-like services but desired for other image stores.
// Attempting to set ACL during above put request requires different permissions
// hence would technically be a breaking change for actual s3 usage.
// Set public visibility to ensure public access on S3, or that the file is accessible
// to other processes (like web-servers) for local file storage options.
// We avoid attempting this for (non-AWS) s3-like systems (even in a try-catch) as
// we've always avoided setting permissions for s3-like due to potential issues,
// with docs advising setting pre-configured permissions instead.
// We also don't do this as the default filesystem/driver level as that can technically
// require different ACLs for S3, and this provides us more logical control.
if ($makePublic && !$this->isS3Like()) {
$this->filesystem->setVisibility($path, 'public');
try {
$this->filesystem->setVisibility($path, Visibility::PUBLIC);
} catch (UnableToSetVisibility $e) {
Log::warning("Unable to set visibility for image upload with relative path: {$path}");
}
}
}

View File

@@ -5,6 +5,7 @@ namespace BookStack\Uploads;
use BookStack\Exceptions\HttpFetchException;
use BookStack\Http\HttpRequestService;
use BookStack\Users\Models\User;
use BookStack\Util\WebSafeMimeSniffer;
use Exception;
use GuzzleHttp\Psr7\Request;
use Illuminate\Support\Facades\Log;
@@ -53,6 +54,33 @@ class UserAvatars
}
}
/**
* Assign a new avatar image to the given user by fetching from a remote URL.
*/
public function assignToUserFromUrl(User $user, string $avatarUrl): void
{
try {
$this->destroyAllForUser($user);
$imageData = $this->getAvatarImageData($avatarUrl);
$mime = (new WebSafeMimeSniffer())->sniff($imageData);
[$format, $type] = explode('/', $mime, 2);
if ($format !== 'image' || !ImageService::isExtensionSupported($type)) {
return;
}
$avatar = $this->createAvatarImageFromData($user, $imageData, $type);
$user->avatar()->associate($avatar);
$user->save();
} catch (Exception $e) {
Log::error('Failed to save user avatar image from URL', [
'exception' => $e->getMessage(),
'url' => $avatarUrl,
'user_id' => $user->id,
]);
}
}
/**
* Destroy all user avatars uploaded to the given user.
*/
@@ -105,7 +133,7 @@ class UserAvatars
}
/**
* Gets an image from url and returns it as a string of image data.
* Get an image from a URL and return it as a string of image data.
*
* @throws HttpFetchException
*/
@@ -113,7 +141,19 @@ class UserAvatars
{
try {
$client = $this->http->buildClient(5);
$response = $client->sendRequest(new Request('GET', $url));
$responseCount = 0;
do {
$response = $client->sendRequest(new Request('GET', $url));
$responseCount++;
$isRedirect = ($response->getStatusCode() === 301 || $response->getStatusCode() === 302);
$url = $response->getHeader('Location')[0] ?? '';
} while ($responseCount < 3 && $isRedirect && is_string($url) && str_starts_with($url, 'http'));
if ($responseCount === 3) {
throw new HttpFetchException("Failed to fetch image, max redirect limit of 3 tries reached. Last fetched URL: {$url}");
}
if ($response->getStatusCode() !== 200) {
throw new HttpFetchException(trans('errors.cannot_get_image_from_url', ['url' => $url]));
}

View File

@@ -45,6 +45,7 @@ use Illuminate\Support\Collection;
* @property string $system_name
* @property Collection $roles
* @property Collection $mfaValues
* @property ?Image $avatar
*/
class User extends Model implements AuthenticatableContract, CanResetPasswordContract, Loggable, Sluggable
{

Binary file not shown.

911
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -27,6 +27,8 @@ class CommentFactory extends Factory
'html' => $html,
'parent_id' => null,
'local_id' => 1,
'content_ref' => '',
'archived' => false,
];
}
}

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->string('content_ref');
$table->boolean('archived')->index();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->dropColumn('content_ref');
$table->dropColumn('archived');
});
}
};

View File

@@ -0,0 +1,7 @@
{
"version": "v25.02.4",
"instance_id": "1234abcd-cc12-7808-af0a-264cb0cbd611",
"app_name": "My BookStack Instance",
"app_logo": "https://docs.example.com/uploads/images/system/2025-05/cat-icon.png",
"base_url": "https://docs.example.com"
}

View File

@@ -1751,13 +1751,6 @@ Copyright: Copyright (c) Isaac Z. Schlueter and Contributors
Source: git://github.com/isaacs/node-lru-cache.git
Link: git://github.com/isaacs/node-lru-cache.git
-----------
magic-string
License: MIT
License File: node_modules/magic-string/LICENSE
Copyright: Copyright 2018 Rich Harris
Source: https://github.com/rich-harris/magic-string
Link: https://github.com/rich-harris/magic-string
-----------
make-dir
License: MIT
License File: node_modules/make-dir/license
@@ -1935,9 +1928,9 @@ Link: sindresorhus/npm-run-path
nwsapi
License: MIT
License File: node_modules/nwsapi/LICENSE
Copyright: Copyright (c) 2007-2024 Diego Perini (http://www.iport.it/)
Copyright: Copyright (c) 2007-2025 Diego Perini (http://www.iport.it/)
Source: git://github.com/dperini/nwsapi.git
Link: http://javascript.nwbox.com/nwsapi/
Link: https://javascript.nwbox.com/nwsapi/
-----------
object-inspect
License: MIT
@@ -2281,18 +2274,6 @@ Copyright: Copyright (c) 2012 James Halliday
Source: git://github.com/browserify/resolve.git
Link: git://github.com/browserify/resolve.git
-----------
rollup-plugin-dts
License: LGPL-3.0
Source: git+https://github.com/Swatinem/rollup-plugin-dts.git
Link: https://github.com/Swatinem/rollup-plugin-dts#readme
-----------
rollup
License: MIT
License File: node_modules/rollup/LICENSE.md
Copyright: Copyright (c) 2017 [these people](https://github.com/rollup/rollup/graphs/contributors)
Source: rollup/rollup
Link: https://rollupjs.org/
-----------
safe-array-concat
License: MIT
License File: node_modules/safe-array-concat/LICENSE
@@ -3057,6 +3038,7 @@ Link: https://github.com/babel/babel.git
License: MIT
License File: node_modules/@babel/helpers/LICENSE
Copyright: Copyright (c) 2014-present Sebastian McKenzie and other contributors
Copyright (c) 2014-present, Facebook, Inc. (ONLY ./src/helpers/regeneratorRuntime.js)
Source: https://github.com/babel/babel.git
Link: https://babel.dev/docs/en/next/babel-helpers
-----------
@@ -3357,6 +3339,12 @@ License File: node_modules/@eslint/config-array/LICENSE
Source: git+https://github.com/eslint/rewrite.git
Link: https://github.com/eslint/rewrite#readme
-----------
@eslint/config-helpers
License: Apache-2.0
License File: node_modules/@eslint/config-helpers/LICENSE
Source: git+https://github.com/eslint/rewrite.git
Link: https://github.com/eslint/rewrite/tree/main/packages/config-helpers#readme
-----------
@eslint/core
License: Apache-2.0
License File: node_modules/@eslint/core/LICENSE
@@ -3635,13 +3623,6 @@ Copyright: Copyright (C) 2018 by Marijn Haverbeke <******@*********.******> and
Source: https://github.com/lezer-parser/xml.git
Link: https://github.com/lezer-parser/xml.git
-----------
@marijn/buildtool
License: MIT
License File: node_modules/@marijn/buildtool/LICENSE
Copyright: Copyright (C) 2022 by Marijn Haverbeke <******@*********.******> and others
Source: https://github.com/marijnh/buildtool.git
Link: https://github.com/marijnh/buildtool.git
-----------
@marijn/find-cluster-break
License: MIT
License File: node_modules/@marijn/find-cluster-break/LICENSE
@@ -3656,6 +3637,13 @@ Copyright: Copyright (c) 2017-present Devon Govett
Source: https://github.com/parcel-bundler/watcher.git
Link: https://github.com/parcel-bundler/watcher.git
-----------
@parcel/watcher-linux-x64-musl
License: MIT
License File: node_modules/@parcel/watcher-linux-x64-musl/LICENSE
Copyright: Copyright (c) 2017-present Devon Govett
Source: https://github.com/parcel-bundler/watcher.git
Link: https://github.com/parcel-bundler/watcher.git
-----------
@parcel/watcher
License: MIT
License File: node_modules/@parcel/watcher/LICENSE
@@ -3825,13 +3813,6 @@ License: MIT
Source: https://www.github.com/DefinitelyTyped/DefinitelyTyped.git
Link: https://www.github.com/DefinitelyTyped/DefinitelyTyped.git
-----------
@types/mocha
License: MIT
License File: node_modules/@types/mocha/LICENSE
Copyright: Copyright (c) Microsoft Corporation.
Source: https://github.com/DefinitelyTyped/DefinitelyTyped.git
Link: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mocha
-----------
@types/node
License: MIT
License File: node_modules/@types/node/LICENSE

View File

@@ -486,7 +486,7 @@ Link: https://github.com/ramsey/collection.git
ramsey/uuid
License: MIT
License File: vendor/ramsey/uuid/LICENSE
Copyright: Copyright (c) 2012-2023 Ben Ramsey <***@*********.***>
Copyright: Copyright (c) 2012-2025 Ben Ramsey <***@*********.***>
Source: https://github.com/ramsey/uuid.git
Link: https://github.com/ramsey/uuid.git
-----------

View File

@@ -64,12 +64,12 @@ return [
// Auth
'auth_login' => 'تم تسجيل الدخول',
'auth_register' => 'سجل كمستخدم جديد',
'auth_password_reset_request' => 'طلب رابط جديد لإعادة تعيين كلمة المرور',
'auth_password_reset_request' => 'طلب رابط جديد لإعادة تعيين كلمة السر',
'auth_password_reset_update' => 'إعادة تعيين كلمة مرور المستخدم',
'mfa_setup_method' => 'طريقة MFA المكونة',
'mfa_setup_method_notification' => 'تم تكوين طريقة متعددة العوامل بنجاح',
'mfa_remove_method' => 'إزالة طريقة MFA',
'mfa_remove_method_notification' => 'تمت إزالة طريقة متعددة العوامل بنجاح',
'mfa_setup_method' => 'طريقة المصادقة متعددة العوامل المُهيأة',
'mfa_setup_method_notification' => 'تم إعداد المصادقة متعددة العوامل بنجاح',
'mfa_remove_method' => 'إزالة طريقة المصادقة متعددة العوامل',
'mfa_remove_method_notification' => 'تمت إزالة المصادقة متعددة العوامل بنجاح',
// Settings
'settings_update' => 'تحديث الإعدادات',
@@ -77,12 +77,12 @@ return [
'maintenance_action_run' => 'إجراء الصيانة',
// Webhooks
'webhook_create' => 'تم إنشاء webhook',
'webhook_create_notification' => 'تم إنشاء Webhook بنجاح',
'webhook_update' => 'تم تحديث webhook',
'webhook_update_notification' => 'تم تحديث Webhook بنجاح',
'webhook_delete' => 'حذف webhook',
'webhook_delete_notification' => 'تم حذف Webhook بنجاح',
'webhook_create' => 'تم إنشاء خطاف ويب',
'webhook_create_notification' => 'تم إنشاء خطاف ويب بنجاح',
'webhook_update' => 'تم تحديث خطاف الويب',
'webhook_update_notification' => 'تم تحديث خطاف الويب بنجاح',
'webhook_delete' => 'حذف خطاف ويب',
'webhook_delete_notification' => 'تم حذف خطاف الويب بنجاح',
// Imports
'import_create' => 'تم إنشاء الاستيراد',
@@ -94,7 +94,7 @@ return [
// Users
'user_create' => 'إنشاء مستخدم',
'user_create_notification' => 'تم انشاء الحساب',
'user_create_notification' => 'تم إنشاء الحساب',
'user_update' => 'المستخدم المحدث',
'user_update_notification' => 'تم تحديث المستخدم بنجاح',
'user_delete' => 'المستخدم المحذوف',
@@ -102,11 +102,11 @@ return [
// API Tokens
'api_token_create' => 'تم إنشاء رمز واجهة برمجة التطبيقات -API-',
'api_token_create_notification' => 'تم إنشاء رمز الـ API بنجاح',
'api_token_create_notification' => 'تم إنشاء واجهة برمجة التطبيقات -API- بنجاح',
'api_token_update' => 'رمز واجهة برمجة التطبيقات المحدث',
'api_token_update_notification' => 'تم تحديث رمز الـ API بنجاح',
'api_token_update_notification' => 'تم تحديث رمز واجهة برمجة التطبيقات -API- بنجاح',
'api_token_delete' => 'رمز واجهة برمجة التطبيقات المحذوف',
'api_token_delete_notification' => 'تم حذف رمز الـ API بنجاح',
'api_token_delete_notification' => 'تم حذف رمز واجهة برمجة التطبيقات -API- بنجاح',
// Roles
'role_create' => 'إنشاء صَلاحِيَة',
@@ -136,5 +136,5 @@ return [
'sort_rule_delete_notification' => 'تم حذف قاعدة الفرز بنجاح',
// Other
'permissions_update' => 'تحديث الأذونات',
'permissions_update' => 'تحديث الصلاحيات',
];

View File

@@ -7,26 +7,26 @@
return [
'failed' => 'البيانات المعطاة لا توافق سجلاتنا.',
'throttle' => 'تجاوزت الحد الأقصى من المحاولات. الرجاء المحاولة مرة أخرى بعد :seconds seconds.',
'throttle' => 'تجاوزت الحد الأقصى من المحاولات. الرجاء المحاولة مرة أخرى بعد :seconds ثانية/ثواني.',
// Login & Register
'sign_up' => 'إنشاء حساب',
'log_in' => 'تسجيل الدخول',
'log_in_with' => 'تسجيل الدخول باستخدام :socialDriver',
'sign_up_with' => 'إنشاء حساب باستخدام :socialDriver',
'logout' => 'تسجيل الخروج',
'logout' => 'الخروج',
'name' => 'الاسم',
'username' => 'اسم المستخدم',
'email' => 'البريد الإلكتروني',
'password' => 'كلمة المرور',
'password_confirm' => 'تأكيد كلمة المرور',
'password_hint' => 'يجب أن تحتوي كلمة المرور على 8 خانات على الأقل',
'forgot_password' => 'نسيت كلمة المرور؟',
'password' => 'كلمة السر',
'password_confirm' => 'تأكيد كلمة السر',
'password_hint' => 'يجب أن تحتوي كلمة السر على 8 خانات على الأقل',
'forgot_password' => 'نسيت كلمة السر؟',
'remember_me' => 'تذكرني',
'ldap_email_hint' => 'الرجاء إدخال عنوان بريد إلكتروني لاستخدامه مع الحساب.',
'create_account' => 'إنشاء حساب',
'already_have_account' => 'لديك حساب بالفعل؟',
'already_have_account' => 'لديك حساب مسبقاً؟',
'dont_have_account' => 'ليس لديك حساب؟',
'social_login' => 'تسجيل الدخول باستخدام حسابات التواصل الاجتماعي',
'social_registration' => 'إنشاء حساب باستخدام حسابات التواصل الاجتماعي',
@@ -44,14 +44,14 @@ return [
'auto_init_start_link' => 'المتابعة مع المصادقة',
// Password Reset
'reset_password' => 'استعادة كلمة المرور',
'reset_password_send_instructions' => 'أدخل بريدك الإلكتروني بالأسفل وسيتم إرسال رسالة برابط لاستعادة كلمة المرور.',
'reset_password' => 'استعادة كلمة السر',
'reset_password_send_instructions' => 'أدخل بريدك الإلكتروني بالأسفل وسيتم إرسال رسالة برابط لاستعادة كلمة السر.',
'reset_password_send_button' => 'أرسل رابط الاستعادة',
'reset_password_sent' => 'سيتم إرسال رابط إعادة تعيين كلمة المرور إلى عنوان البريد الإلكتروني هذا إذا كان موجودًا في النظام.',
'reset_password_success' => 'تمت استعادة كلمة المرور بنجاح.',
'email_reset_subject' => 'استعد كلمة المرور الخاصة بتطبيق :appName',
'email_reset_text' => 'تم إرسال هذه الرسالة بسبب تلقينا لطلب استعادة كلمة المرور الخاصة بحسابكم.',
'email_reset_not_requested' => 'إذا لم يتم طلب استعادة كلمة المرور من قبلكم، فلا حاجة لاتخاذ أية خطوات.',
'reset_password_sent' => 'سيتم إرسال رابط إعادة تعيين كلمة السر إلى عنوان البريد الإلكتروني هذا إذا كان موجودًا في النظام.',
'reset_password_success' => 'تمت استعادة كلمة السر بنجاح.',
'email_reset_subject' => 'استعد كلمة السر الخاصة بتطبيق :appName',
'email_reset_text' => 'تم إرسال هذه الرسالة بسبب تلقينا لطلب استعادة كلمة السر الخاصة بحسابكم.',
'email_reset_not_requested' => 'إذا لم يتم طلب استعادة كلمة السر من قبلكم، فلا حاجة لاتخاذ أية خطوات.',
// Email Confirmation
'email_confirm_subject' => 'تأكيد بريدكم الإلكتروني لتطبيق :appName',
@@ -60,7 +60,7 @@ return [
'email_confirm_action' => 'تأكيد البريد الإلكتروني',
'email_confirm_send_error' => 'تأكيد البريد الإلكتروني مطلوب ولكن النظام لم يستطع إرسال الرسالة. تواصل مع مشرف النظام للتأكد من إعدادات البريد.',
'email_confirm_success' => 'تم تأكيد بريدك الإلكتروني! يمكنك الآن تسجيل الدخول باستخدام عنوان البريد الإلكتروني هذا.',
'email_confirm_resent' => 'تمت إعادة إرسال رسالة التأكيد. الرجاء مراجعة صندوق الوارد',
'email_confirm_resent' => 'تمت إعادة إرسال رسالة التأكيد، الرجاء مراجعة صندوق الوارد.',
'email_confirm_thanks' => 'شكرا للتأكيد!',
'email_confirm_thanks_desc' => 'الرجاء الانتظار لحظة بينما يتم التعامل مع التأكيد الخاص بك. إذا لم يتم إعادة توجيهك بعد 3 ثوان اضغط على الرابط "المتابعة" أدناه للمتابعة.',
@@ -72,24 +72,24 @@ return [
// User Invite
'user_invite_email_subject' => 'تمت دعوتك للانضمام إلى صفحة الحالة الخاصة بـ :app_name!',
'user_invite_email_greeting' => 'تم إنشاء حساب مستخدم لك على %site%.',
'user_invite_email_text' => 'انقر على الزر أدناه لتعيين كلمة مرور الحساب والحصول على الوصول:',
'user_invite_email_greeting' => 'تم إنشاء حساب مستخدم لك على :appName.',
'user_invite_email_text' => 'انقر على الزر أدناه لتعيين كلمة سر الحساب والحصول على الوصول:',
'user_invite_email_action' => 'كلمة سر المستخدم',
'user_invite_page_welcome' => 'مرحبا بكم في :appName!',
'user_invite_page_text' => 'لإكمال حسابك والحصول على حق الوصول تحتاج إلى تعيين كلمة مرور سيتم استخدامها لتسجيل الدخول إلى :appName في الزيارات المستقبلية.',
'user_invite_page_confirm_button' => 'تأكيد كلمة المرور',
'user_invite_success_login' => 'تم تأكيد كلمة المرور. يمكنك الآن تسجيل الدخول باستخدام كلمة المرور المحددة للوصول إلى :appName!',
'user_invite_page_text' => 'لإكمال حسابك والحصول على حق الوصول تحتاج إلى تعيين كلمة السر سيتم استخدامها لتسجيل الدخول إلى :appName في الزيارات المستقبلية.',
'user_invite_page_confirm_button' => 'تأكيد كلمة السر',
'user_invite_success_login' => 'تم تأكيد كلمة السر. يمكنك الآن تسجيل الدخول باستخدام كلمة السر المحددة للوصول إلى :appName !',
// Multi-factor Authentication
'mfa_setup' => 'إعداد المصادقة متعددة العوامل',
'mfa_setup_desc' => 'إعداد المصادقة متعددة العوامل كطبقة إضافية من الأمان لحساب المستخدم الخاص بك.',
'mfa_setup_configured' => 'تم إعداده مسبقاً',
'mfa_setup_reconfigure' => 'إعادة التكوين',
'mfa_setup_remove_confirmation' => 'هل أنت متأكد من أنك تريد إزالة طريقة المصادقة متعددة العناصر هذه؟',
'mfa_setup_action' => 'إعداد (تنصيب)',
'mfa_setup_remove_confirmation' => 'متأكد من أنك تريد إزالة طريقة المصادقة متعددة العوامل هذه؟',
'mfa_setup_action' => 'إعداد',
'mfa_backup_codes_usage_limit_warning' => 'لديك أقل من 5 رموز احتياطية متبقية، الرجاء إنشاء وتخزين مجموعة جديدة قبل نفاد الرموز لتجنب إغلاق حسابك.',
'mfa_option_totp_title' => 'تطبيق الجوال',
'mfa_option_totp_desc' => 'لاستخدام المصادقة المتعددة العوامل، ستحتاج إلى تطبيق محمول يدعم TOTP مثل Google Authenticator أو Authy أو Microsoft Authenticer.',
'mfa_option_totp_desc' => 'لاستخدام المصادقة المتعددة العوامل، ستحتاج إلى تطبيق جوال يدعم كلمة السر المؤقته -TOTP- مثل جوجل أوثنتيكاتور -Google Authenticator- أو أوثي -Authy- أو مايكروسوفت أوثنتيكاتور -Microsoft Authenticator-.',
'mfa_option_backup_codes_title' => 'رموز النسخ الاحتياطي',
'mfa_option_backup_codes_desc' => 'إنشاء مجموعة من رموز النسخ الاحتياطية للاستخدام مرة واحدة و التي سَتُدِخلها عند تسجيل الدخول للتحقق من هويتك. احرص أن تخزينها في مكان آمن.',
'mfa_gen_confirm_and_enable' => 'تأكيد وتمكين',
@@ -98,7 +98,7 @@ return [
'mfa_gen_backup_codes_download' => 'تنزيل الرموز',
'mfa_gen_backup_codes_usage_warning' => 'يمكن استخدام كل رمز مرة واحدة فقط',
'mfa_gen_totp_title' => 'إعداد تطبيق الجوال',
'mfa_gen_totp_desc' => 'لاستخدام المصادقة المتعددة ، ستحتاج إلى تطبيق جوال كلمة المرور المؤقته -TOTP- مثل جوجل أوثنتيكاتور -Google Authenticator- أو أوثي -Authy- أو مايكروسوفت أوثنتيكاتور -Microsoft Authenticator.-',
'mfa_gen_totp_desc' => 'لاستخدام المصادقة المتعددة ، ستحتاج إلى تطبيق جوال كلمة السر المؤقته -TOTP- مثل جوجل أوثنتيكاتور -Google Authenticator- أو أوثي -Authy- أو مايكروسوفت أوثنتيكاتور -Microsoft Authenticator-.',
'mfa_gen_totp_scan' => 'امسح رمز الاستجابة السريعة -QR- أدناه باستخدام تطبيق المصادقة المفضل لديك للبدء.',
'mfa_gen_totp_verify_setup' => 'التحقق من الإعداد',
'mfa_gen_totp_verify_setup_desc' => 'تحقق أن كل شيء يعمل عن طريق إدخال رمز تم إنشاؤه داخل تطبيق المصادقة الخاص بك في مربع الإدخال أدناه:',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'إنشاء',
'update' => 'تحديث',
'edit' => 'تعديل',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'سرد',
'move' => 'نقل',
'copy' => 'نسخ',

View File

@@ -13,7 +13,7 @@ return [
'cancel' => 'إلغاء',
'save' => 'حفظ',
'close' => 'إغلاق',
'apply' => 'Apply',
'apply' => 'تطبيق',
'undo' => 'تراجع',
'redo' => 'إعادة التنفيذ',
'left' => 'يسار',
@@ -25,7 +25,7 @@ return [
'width' => 'العرض',
'height' => 'الارتفاع',
'More' => 'المزيد',
'select' => 'Select...',
'select' => 'إختار...',
// Toolbar
'formats' => 'التنسيقات',
@@ -54,73 +54,73 @@ return [
'align_left' => 'محاذاة لليسار',
'align_center' => 'محاذاة بالمنتصف',
'align_right' => 'مُحاذاة لليمين',
'align_justify' => 'Justify',
'align_justify' => 'المحاذاة',
'list_bullet' => 'قائمة نقاط',
'list_numbered' => 'قائمة مرقمة',
'list_task' => 'Task list',
'list_task' => 'قائمة المهام',
'indent_increase' => 'زيادة البادئة',
'indent_decrease' => 'إنقاص البادئة',
'table' => 'جدول',
'insert_image' => 'ادراج صورة',
'insert_image_title' => 'Insert/Edit Image',
'insert_link' => 'Insert/edit link',
'insert_link_title' => 'Insert/Edit Link',
'insert_horizontal_line' => 'Insert horizontal line',
'insert_code_block' => 'Insert code block',
'edit_code_block' => 'Edit code block',
'insert_drawing' => 'Insert/edit drawing',
'drawing_manager' => 'Drawing manager',
'insert_media' => 'Insert/edit media',
'insert_media_title' => 'Insert/Edit Media',
'clear_formatting' => 'Clear formatting',
'source_code' => 'Source code',
'source_code_title' => 'Source Code',
'fullscreen' => 'Fullscreen',
'image_options' => 'Image options',
'insert_image_title' => 'إضافة/تحرير الصورة',
'insert_link' => 'إضافة/تعديل الرابط',
'insert_link_title' => 'إضافة/تحرير الرابط',
'insert_horizontal_line' => 'إضافة خط أفقي',
'insert_code_block' => 'إضافة مربع رموز برمجية',
'edit_code_block' => 'تعديل مربع الرموز البرمجية',
'insert_drawing' => 'إضافة/تعديل الرسم',
'drawing_manager' => 'إدارة الرسم',
'insert_media' => 'إضافة/تحرير الوسائط',
'insert_media_title' => 'إضافة/تحرير الوسائط',
'clear_formatting' => 'مسح التنسيق',
'source_code' => 'الرمز البرمجي',
'source_code_title' => 'الرمز البرمجي',
'fullscreen' => 'شاشة كاملة',
'image_options' => 'خيارات الصورة',
// Tables
'table_properties' => 'Table properties',
'table_properties_title' => 'Table Properties',
'delete_table' => 'Delete table',
'table_clear_formatting' => 'Clear table formatting',
'resize_to_contents' => 'Resize to contents',
'row_header' => 'Row header',
'insert_row_before' => 'Insert row before',
'insert_row_after' => 'Insert row after',
'delete_row' => 'Delete row',
'insert_column_before' => 'Insert column before',
'insert_column_after' => 'Insert column after',
'delete_column' => 'Delete column',
'table_cell' => 'Cell',
'table_row' => 'Row',
'table_column' => 'Column',
'cell_properties' => 'Cell properties',
'cell_properties_title' => 'Cell Properties',
'cell_type' => 'Cell type',
'cell_type_cell' => 'Cell',
'cell_scope' => 'Scope',
'cell_type_header' => 'Header cell',
'merge_cells' => 'Merge cells',
'split_cell' => 'Split cell',
'table_row_group' => 'Row Group',
'table_column_group' => 'Column Group',
'horizontal_align' => 'Horizontal align',
'vertical_align' => 'Vertical align',
'border_width' => 'Border width',
'border_style' => 'Border style',
'border_color' => 'Border color',
'row_properties' => 'Row properties',
'row_properties_title' => 'Row Properties',
'cut_row' => 'Cut row',
'copy_row' => 'Copy row',
'paste_row_before' => 'Paste row before',
'paste_row_after' => 'Paste row after',
'row_type' => 'Row type',
'row_type_header' => 'Header',
'row_type_body' => 'Body',
'row_type_footer' => 'Footer',
'alignment' => 'Alignment',
'cut_column' => 'Cut column',
'table_properties' => 'خصائص الجدول',
'table_properties_title' => 'خصائص الجدول',
'delete_table' => 'حذف الجدول',
'table_clear_formatting' => 'مسح تنسيق الجدول',
'resize_to_contents' => 'تغيير الحجم إلى المحتوى',
'row_header' => 'رأس الصف',
'insert_row_before' => 'إضافة صف قبل',
'insert_row_after' => 'إضافة صف بعد',
'delete_row' => 'حذف الصف',
'insert_column_before' => 'إدراج عمود قبل',
'insert_column_after' => 'إدراج عمود بعد',
'delete_column' => 'حذف عمود',
'table_cell' => 'خلية',
'table_row' => 'صف',
'table_column' => 'عمود',
'cell_properties' => 'خصائص الخلية',
'cell_properties_title' => 'خصائص الخلية',
'cell_type' => 'نوع الخلية',
'cell_type_cell' => 'الخلية',
'cell_scope' => 'النِطَاق',
'cell_type_header' => 'عنوان الخلية',
'merge_cells' => 'دمج الخلايا',
'split_cell' => 'خلية منقسمة',
'table_row_group' => 'مجموعة الصفوف',
'table_column_group' => 'مجموعة الأعمدة',
'horizontal_align' => 'محاذاة أفقية',
'vertical_align' => 'محاذاة عمودية',
'border_width' => 'عرض الحدود',
'border_style' => 'نمط الحدود',
'border_color' => 'لون الحدود',
'row_properties' => 'خصائص الصف',
'row_properties_title' => 'خصائص الصف',
'cut_row' => 'فص الصف',
'copy_row' => 'نسخ الصف',
'paste_row_before' => 'لصق الصف قبل',
'paste_row_after' => 'لصق الصف بعد',
'row_type' => 'نوع الصف',
'row_type_header' => 'العنوان',
'row_type_body' => 'المحتوى ',
'row_type_footer' => 'تذييل',
'alignment' => 'المحاذاة',
'cut_column' => 'قص العمود',
'copy_column' => 'نسخ العمود',
'paste_column_before' => 'لصق عمود قبل',
'paste_column_after' => 'لصق عمود بعد',
@@ -128,54 +128,54 @@ return [
'cell_spacing' => 'تباعد الخلايا',
'caption' => 'الوصف',
'show_caption' => 'إظهار الوصف',
'constrain' => 'Constrain proportions',
'cell_border_solid' => 'Solid',
'cell_border_dotted' => 'Dotted',
'cell_border_dashed' => 'Dashed',
'cell_border_double' => 'Double',
'cell_border_groove' => 'Groove',
'cell_border_ridge' => 'Ridge',
'cell_border_inset' => 'Inset',
'cell_border_outset' => 'Outset',
'cell_border_none' => 'None',
'cell_border_hidden' => 'Hidden',
'constrain' => 'تقييد النسب',
'cell_border_solid' => 'لون كامل',
'cell_border_dotted' => 'مُنَقط',
'cell_border_dashed' => 'متقطع',
'cell_border_double' => 'مزدوج',
'cell_border_groove' => 'أخدود',
'cell_border_ridge' => 'الحافَة',
'cell_border_inset' => 'الداخلية',
'cell_border_outset' => 'الخارجية',
'cell_border_none' => 'لا شَيْء',
'cell_border_hidden' => 'مخفي',
// Images, links, details/summary & embed
'source' => 'Source',
'alt_desc' => 'Alternative description',
'embed' => 'Embed',
'paste_embed' => 'Paste your embed code below:',
'url' => 'URL',
'text_to_display' => 'Text to display',
'title' => 'Title',
'browse_links' => 'Browse links',
'open_link' => 'Open link',
'open_link_in' => 'Open link in...',
'open_link_current' => 'Current window',
'open_link_new' => 'New window',
'remove_link' => 'Remove link',
'insert_collapsible' => 'Insert collapsible block',
'collapsible_unwrap' => 'Unwrap',
'edit_label' => 'Edit label',
'toggle_open_closed' => 'Toggle open/closed',
'collapsible_edit' => 'Edit collapsible block',
'toggle_label' => 'Toggle label',
'source' => 'المصدر',
'alt_desc' => 'وصف بديل',
'embed' => 'تضمين',
'paste_embed' => 'قم بلصق الرموز المصدرية المضمنة الخاص بك أدناه:',
'url' => 'الرابط',
'text_to_display' => 'النص المراد عرضه',
'title' => 'العنوان',
'browse_links' => 'تصفح الروابط',
'open_link' => 'افتح الرابط',
'open_link_in' => 'افتح الرابط في...',
'open_link_current' => 'النافذة الحالية',
'open_link_new' => 'نافذة جديدة',
'remove_link' => 'إزالة الرابط',
'insert_collapsible' => 'أدخل كتلة قابلة للطي',
'collapsible_unwrap' => 'بسط',
'edit_label' => 'عدل الوصف',
'toggle_open_closed' => 'التبديل بين الفتح والإغلاق',
'collapsible_edit' => 'تحرير الكتلة القابلة للطي',
'toggle_label' => 'تبديل التسمية',
// About view
'about' => 'About the editor',
'about_title' => 'About the WYSIWYG Editor',
'editor_license' => 'Editor License & Copyright',
'editor_lexical_license' => 'This editor is built as a fork of :lexicalLink which is distributed under the MIT license.',
'editor_lexical_license_link' => 'Full license details can be found here.',
'editor_tiny_license' => 'This editor is built using :tinyLink which is provided under the MIT license.',
'editor_tiny_license_link' => 'The copyright and license details of TinyMCE can be found here.',
'save_continue' => 'Save Page & Continue',
'callouts_cycle' => '(Keep pressing to toggle through types)',
'link_selector' => 'Link to content',
'shortcuts' => 'Shortcuts',
'shortcut' => 'Shortcut',
'shortcuts_intro' => 'The following shortcuts are available in the editor:',
'windows_linux' => '(Windows/Linux)',
'mac' => '(Mac)',
'description' => 'Description',
'about' => 'عن المحرر',
'about_title' => 'حول محرر ما تراه هو ما تحصل عليه -WYSIWYG-',
'editor_license' => 'رخصة المحرر وحقوق التأليف والنشر',
'editor_lexical_license' => 'تم إنشاء هذا المحرر باعتباره فرعًا لـ :lexicalLink الذي يتم توزيعه بموجب ترخيص معهد ماساتشوستس للتقانة -MIT-.',
'editor_lexical_license_link' => 'يمكنك العثور على تفاصيل الترخيص الكاملة هنا.',
'editor_tiny_license' => 'تم إنشاء هذا المحرر باستخدام :tinyLink والذي يتم توفيره بموجب ترخيص معهد ماساتشوستس للتقانة -MIT-.',
'editor_tiny_license_link' => 'يمكن الاطلاع هنا على تفاصيل حقوق التأليف والنشر والترخيص الخاصة بتاینی‌ام‌سی‌ای -TinyMCE-.',
'save_continue' => 'حفظ الصفحة ومتابعة',
'callouts_cycle' => '(استمر في الضغط للتبديل بين الأنواع)',
'link_selector' => 'رابط للمحتوى',
'shortcuts' => 'الاختصارات',
'shortcut' => 'الاختصار',
'shortcuts_intro' => 'الاختصارات التالية متاحة في المحرر:',
'windows_linux' => '(ويندوز/لينكس)',
'mac' => '(ماك)',
'description' => 'الوصف',
];

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(محتوى مستقر)',
'pages_edit_switch_to_wysiwyg' => 'التبديل إلى محرر ما تراه هو ما تحصل عليه -WYSIWYG-',
'pages_edit_switch_to_new_wysiwyg' => 'التبديل إلى محرر ما تراه هو ما تحصل عليه الجديد -new WYSIWYG-',
'pages_edit_switch_to_new_wysiwyg_desc' => '(في اختبار ألف)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'تثبيت سجل التعديل',
'pages_edit_enter_changelog_desc' => 'ضع وصف مختصر للتعديلات التي تمت',
'pages_edit_enter_changelog' => 'أدخل سجل التعديل',
@@ -392,8 +392,11 @@ return [
'comment' => 'تعليق',
'comments' => 'تعليقات',
'comment_add' => 'إضافة تعليق',
'comment_none' => 'لا توجد تعليقات لعرضها',
'comment_placeholder' => 'ضع تعليقاً هنا',
'comment_count' => '{0} لا توجد تعليقات|{1} تعليق واحد|{2} تعليقان[3,*] :count تعليقات',
'comment_thread_count' => ':count تعليقات| :count تعليقات',
'comment_archived_count' => ':count مؤرشف',
'comment_archived_threads' => 'المواضيع المؤرشفة',
'comment_save' => 'حفظ التعليق',
'comment_new' => 'تعليق جديد',
'comment_created' => 'تم التعليق :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'تم حذف التعليق',
'comment_created_success' => 'تمت إضافة التعليق',
'comment_updated_success' => 'تم تحديث التعليق',
'comment_archive_success' => 'تم أرشفة التعليق',
'comment_unarchive_success' => 'تعليق غير مؤرشف',
'comment_view' => 'عرض التعليق',
'comment_jump_to_thread' => 'انتقل إلى الموضوع',
'comment_delete_confirm' => 'تأكيد حذف التعليق؟',
'comment_in_reply_to' => 'رداً على :commentId',
'comment_reference' => 'المرجع',
'comment_reference_outdated' => '(قديمة)',
'comment_editor_explain' => 'هذه هي التعليقات المُضافة على هذه الصفحة. يُمكنك إضافة التعليقات وإدارتها عند عرض الصفحة المحفوظة.',
// Revision
@@ -455,8 +464,8 @@ return [
'watch_detail_new' => 'ترقب الصفحات الجديدة',
'watch_detail_updates' => 'مشاهدة الصفحات الجديدة والتحديثات',
'watch_detail_comments' => 'مشاهدة الصفحات الجديدة والتحديثات والتعليقات',
'watch_detail_parent_book' => 'Watching via parent book',
'watch_detail_parent_book_ignore' => 'Ignoring via parent book',
'watch_detail_parent_chapter' => 'Watching via parent chapter',
'watch_detail_parent_chapter_ignore' => 'Ignoring via parent chapter',
'watch_detail_parent_book' => 'المشاهدة عبر الكتاب الرئيس',
'watch_detail_parent_book_ignore' => 'التجاهل عبر الكتاب الرئيس',
'watch_detail_parent_chapter' => 'المشاهدة عبر الفصل الرئيس',
'watch_detail_parent_chapter_ignore' => 'التجاهل عبر الفصل الرئيس',
];

View File

@@ -10,13 +10,13 @@ return [
// Auth
'error_user_exists_different_creds' => 'يوجد مستخدم ببيانات مختلفة مسجل بالنظام للبريد الإلكتروني :email.',
'auth_pre_register_theme_prevention' => 'User account could not be registered for the provided details',
'auth_pre_register_theme_prevention' => 'لم يتمكن حساب المستخدم من التسجيل للحصول على التفاصيل المقدمة',
'email_already_confirmed' => 'تم تأكيد البريد الإلكتروني من قبل, الرجاء محاولة تسجيل الدخول.',
'email_confirmation_invalid' => 'رابط التأكيد غير صحيح أو قد تم استخدامه من قبل, الرجاء محاولة التسجيل من جديد.',
'email_confirmation_expired' => 'صلاحية رابط التأكيد انتهت, تم إرسال رسالة تأكيد جديدة لعنوان البريد الإلكتروني.',
'email_confirmation_awaiting' => 'عنوان البريد الإلكتروني للحساب قيد الاستخدام يحتاج إلى تأكيد',
'ldap_fail_anonymous' => 'فشل الوصول إلى LDAP باستخدام الربط المجهول',
'ldap_fail_authed' => 'فشل الوصول إلى LDAP باستخدام dn و password المعطاة',
'ldap_fail_authed' => 'فشل الوصول إلى LDAP باستخدام dn و كلمة السر المعطاة',
'ldap_extension_not_installed' => 'لم يتم تثبيت إضافة LDAP PHP',
'ldap_cannot_connect' => 'لا يمكن الاتصال بخادم ldap, فشل الاتصال المبدئي',
'saml_already_logged_in' => 'تم تسجيل الدخول بالفعل',
@@ -37,7 +37,7 @@ return [
'social_driver_not_found' => 'لم يتم العثور على السوشيال درايفر "Social driver"',
'social_driver_not_configured' => 'لم يتم تهيئة إعدادات حسابك الاجتماعي بشكل صحيح.',
'invite_token_expired' => 'انتهت صلاحية رابط هذه الدعوة. يمكنك بدلاً من ذلك محاولة إعادة تعيين كلمة مرور حسابك.',
'login_user_not_found' => 'A user for this action could not be found.',
'login_user_not_found' => 'لم يتم العثور على مستخدم لهذا الإجراء.',
// System
'path_not_writable' => 'لا يمكن الرفع إلى مسار :filePath. الرجاء التأكد من قابلية الكتابة إلى الخادم.',
@@ -78,7 +78,7 @@ return [
// Users
'users_cannot_delete_only_admin' => 'لا يمكن حذف المشرف الوحيد',
'users_cannot_delete_guest' => 'لا يمكن حذف المستخدم الضيف',
'users_could_not_send_invite' => 'Could not create user since invite email failed to send',
'users_could_not_send_invite' => 'لم يتم إنشاء المستخدم بسبب فشل إرسال بريد الدعوة',
// Roles
'role_cannot_be_edited' => 'لا يمكن تعديل هذا الدور',
@@ -106,16 +106,16 @@ return [
'back_soon' => 'سيعود للعمل قريباً.',
// Import
'import_zip_cant_read' => 'Could not read ZIP file.',
'import_zip_cant_decode_data' => 'Could not find and decode ZIP data.json content.',
'import_zip_no_data' => 'ZIP file data has no expected book, chapter or page content.',
'import_validation_failed' => 'Import ZIP failed to validate with errors:',
'import_zip_failed_notification' => 'Failed to import ZIP file.',
'import_perms_books' => 'You are lacking the required permissions to create books.',
'import_perms_chapters' => 'You are lacking the required permissions to create chapters.',
'import_perms_pages' => 'You are lacking the required permissions to create pages.',
'import_perms_images' => 'You are lacking the required permissions to create images.',
'import_perms_attachments' => 'You are lacking the required permission to create attachments.',
'import_zip_cant_read' => 'لم أتمكن من قراءة المِلَفّ المضغوط -ZIP-.',
'import_zip_cant_decode_data' => 'لم نتمكن من العثور على محتوى المِلَفّ المضغوط data.json وفك تشفيره.',
'import_zip_no_data' => 'لا تتضمن بيانات المِلَفّ المضغوط أي محتوى متوقع للكتاب أو الفصل أو الصفحة.',
'import_validation_failed' => 'فشل التحقق من صحة استيراد المِلَفّ المضغوط بسبب الأخطاء التالية:',
'import_zip_failed_notification' => 'فشل استيراد المِلَفّ المضغوط.',
'import_perms_books' => 'أنت تفتقر إلى الصلاحيات المطلوبة لإنشاء الكتب.',
'import_perms_chapters' => 'أنت تفتقر إلى الصلاحيات المطلوبة لإنشاء الفصول.',
'import_perms_pages' => 'أنت تفتقر إلى الصلاحيات المطلوبة لإنشاء الصفحات.',
'import_perms_images' => 'أنت تفتقر إلى الصلاحيات المطلوبة لإنشاء الصور.',
'import_perms_attachments' => 'أنت تفتقر إلى الصَّلاحِيَة المطلوب لإنشاء المرفقات.',
// API errors
'api_no_authorization_found' => 'لم يتم العثور على رمز ترخيص مميز في الطلب',

View File

@@ -4,24 +4,24 @@
*/
return [
'new_comment_subject' => 'New comment on page: :pageName',
'new_comment_intro' => 'A user has commented on a page in :appName:',
'new_page_subject' => 'New page: :pageName',
'new_page_intro' => 'A new page has been created in :appName:',
'updated_page_subject' => 'Updated page: :pageName',
'updated_page_intro' => 'A page has been updated in :appName:',
'updated_page_debounce' => 'To prevent a mass of notifications, for a while you won\'t be sent notifications for further edits to this page by the same editor.',
'new_comment_subject' => 'تعليق جديد على الصفحة: :pageName',
'new_comment_intro' => 'قام أحد المستخدمين بالتعليق على صفحة في :appName:',
'new_page_subject' => 'صفحة جديدة: :pageName',
'new_page_intro' => 'تم إنشاء صفحة جديدة في :appName:',
'updated_page_subject' => 'تم تحديث الصفحة: :pageName',
'updated_page_intro' => 'تم تحديث الصفحة في :appName:',
'updated_page_debounce' => 'لمنع تلقي عدد كبير من الإشعارات، لن يتم إرسال إشعارات إليك لفترة من الوقت لإجراء المزيد من التعديلات على هذه الصفحة بواسطة نفس المحرر.',
'detail_page_name' => 'Page Name:',
'detail_page_path' => 'Page Path:',
'detail_commenter' => 'Commenter:',
'detail_comment' => 'Comment:',
'detail_created_by' => 'Created By:',
'detail_updated_by' => 'Updated By:',
'detail_page_name' => 'اسم الصفحة:',
'detail_page_path' => 'مسار الصفحة:',
'detail_commenter' => 'المُعَلِق:',
'detail_comment' => 'التعليق:',
'detail_created_by' => 'أنشئ من طرف:',
'detail_updated_by' => 'تم التحديث بواسطة:',
'action_view_comment' => 'View Comment',
'action_view_page' => 'View Page',
'action_view_comment' => 'عرض التعليق',
'action_view_page' => 'عرض الصفحة',
'footer_reason' => 'This notification was sent to you because :link cover this type of activity for this item.',
'footer_reason_link' => 'your notification preferences',
'footer_reason' => 'لقد تم إرسال هذا الإشعار إليك لأن :link يغطي هذا النوع من النشاط لهذا العنصر.',
'footer_reason_link' => 'إعدادات الإشعارات الخاصة بك',
];

View File

@@ -6,10 +6,10 @@
*/
return [
'password' => 'يجب أن تتكون كلمة المرور من ستة أحرف على الأقل وأن تطابق التأكيد.',
'password' => 'يجب أن تتكون كلمة السر من ستة أحرف على الأقل وأن تطابق التأكيد.',
'user' => "لم يتم العثور على مستخدم بعنوان البريد الإلكتروني المعطى.",
'token' => 'رمز إعادة تعيين كلمة المرور غير صالح لعنوان هذا البريد الإلكتروني.',
'sent' => 'تم إرسال رابط تجديد كلمة المرور إلى بريدكم الإلكتروني!',
'reset' => 'تم تجديد كلمة المرور الخاصة بكم!',
'token' => 'رمز إعادة تعيين كلمة السر غير صالح لعنوان هذا البريد الإلكتروني.',
'sent' => 'تم إرسال رابط تجديد كلمة السر إلى بريدكم الإلكتروني!',
'reset' => 'تم تجديد كلمة السر الخاصة بكم!',
];

View File

@@ -5,47 +5,47 @@
*/
return [
'my_account' => 'My Account',
'my_account' => 'حسابي',
'shortcuts' => 'Shortcuts',
'shortcuts_interface' => 'UI Shortcut Preferences',
'shortcuts_toggle_desc' => 'Here you can enable or disable keyboard system interface shortcuts, used for navigation and actions.',
'shortcuts_customize_desc' => 'You can customize each of the shortcuts below. Just press your desired key combination after selecting the input for a shortcut.',
'shortcuts_toggle_label' => 'Keyboard shortcuts enabled',
'shortcuts_section_navigation' => 'Navigation',
'shortcuts_section_actions' => 'Common Actions',
'shortcuts_save' => 'Save Shortcuts',
'shortcuts_overlay_desc' => 'Note: When shortcuts are enabled a helper overlay is available via pressing "?" which will highlight the available shortcuts for actions currently visible on the screen.',
'shortcuts_update_success' => 'Shortcut preferences have been updated!',
'shortcuts_overview_desc' => 'Manage keyboard shortcuts you can use to navigate the system user interface.',
'shortcuts' => 'الاختصارات',
'shortcuts_interface' => 'خيارات اختصار واجهة المستخدم',
'shortcuts_toggle_desc' => 'هنا يمكنك تمكين أو تعطيل اختصارات واجهة نظام لوحة المفاتيح، المستخدمة للتنقل والإجراءات.',
'shortcuts_customize_desc' => 'يمكنك تخصيص كل اختصار من الاختصارات أدناه. ما عليك سوى الضغط على تركيبة المفاتيح المطلوبة بعد تحديد مدخل الاختصار.',
'shortcuts_toggle_label' => 'تم تمكين اختصارات لوحة المفاتيح',
'shortcuts_section_navigation' => 'التنقل',
'shortcuts_section_actions' => 'الإجراءات المشتركة',
'shortcuts_save' => 'حفظ الاختصارات',
'shortcuts_overlay_desc' => 'ملاحظة: عندما يتم تمكين الاختصارات، تتوفر تراكب المساعد عن طريق الضغط على "؟" الذي سيسلط الضوء على الاختصارات المتاحة للإجراءات المرئية حاليا على الشاشة.',
'shortcuts_update_success' => 'تم تحديث خيارات الاختصار!',
'shortcuts_overview_desc' => 'إدارة اختصارات لوحة المفاتيح التي يمكنك استخدامها للتنقل في واجهة مستخدم النظام.',
'notifications' => 'Notification Preferences',
'notifications_desc' => 'Control the email notifications you receive when certain activity is performed within the system.',
'notifications_opt_own_page_changes' => 'Notify upon changes to pages I own',
'notifications_opt_own_page_comments' => 'Notify upon comments on pages I own',
'notifications_opt_comment_replies' => 'Notify upon replies to my comments',
'notifications_save' => 'Save Preferences',
'notifications_update_success' => 'Notification preferences have been updated!',
'notifications_watched' => 'Watched & Ignored Items',
'notifications_watched_desc' => 'Below are the items that have custom watch preferences applied. To update your preferences for these, view the item then find the watch options in the sidebar.',
'notifications' => 'إعدادات الإشعارات',
'notifications_desc' => 'التحكم في إشعارات البريد الإلكتروني الذي تتلقاها عند إجراء نشاط معين داخل النظام.',
'notifications_opt_own_page_changes' => 'إشعاري عند حدوث تغييرات في الصفحات التي أملكها',
'notifications_opt_own_page_comments' => 'إشعاري بشأن التعليقات على الصفحات التي أملكها',
'notifications_opt_comment_replies' => 'إشعاري عند الردود على تعليقاتي',
'notifications_save' => 'حفظ اﻹعدادات',
'notifications_update_success' => 'تم تحديث إعدادات الإشعارات!',
'notifications_watched' => 'العناصر التي تمت مشاهدتها وتجاهلها',
'notifications_watched_desc' => 'فيما يلي العناصر التي طُبِّقت عليها إعدادات ساعة مخصصة. لتحديث إعداداتك، استعرض العنصر ثم ابحث عن خيارات الساعة في الشريط الجانبي.',
'auth' => 'Access & Security',
'auth_change_password' => 'Change Password',
'auth_change_password_desc' => 'Change the password you use to log-in to the application. This must be at least 8 characters long.',
'auth_change_password_success' => 'Password has been updated!',
'auth' => 'الوصول و الأمان',
'auth_change_password' => 'تغيير كلمة السر',
'auth_change_password_desc' => 'غيّر كلمة السر التي تستخدمها لتسجيل الدخول إلى التطبيق. يجب ألا تقل عن 8 أحرف.',
'auth_change_password_success' => 'تم تحديث كلمة السر!',
'profile' => 'Profile Details',
'profile_desc' => 'Manage the details of your account which represents you to other users, in addition to details that are used for communication and system personalisation.',
'profile_view_public' => 'View Public Profile',
'profile_name_desc' => 'Configure your display name which will be visible to other users in the system through the activity you perform, and content you own.',
'profile_email_desc' => 'This email will be used for notifications and, depending on active system authentication, system access.',
'profile_email_no_permission' => 'Unfortunately you don\'t have permission to change your email address. If you want to change this, you\'d need to ask an administrator to change this for you.',
'profile_avatar_desc' => 'Select an image which will be used to represent yourself to others in the system. Ideally this image should be square and about 256px in width and height.',
'profile_admin_options' => 'Administrator Options',
'profile_admin_options_desc' => 'Additional administrator-level options, like those to manage role assignments, can be found for your user account in the "Settings > Users" area of the application.',
'profile' => 'تفاصيل المِلَفّ الشخصي',
'profile_desc' => 'إدارة تفاصيل حسابك الذي يمثلك أمام المستخدمين الآخرين، بالإضافة إلى التفاصيل المستخدمة للتواصل وتخصيص النظام.',
'profile_view_public' => 'عرض المِلَفّ الشخصي العام',
'profile_name_desc' => 'إعداد اسم العرض الخاص بك الذي سيكون مرئيًا للمستخدمين الآخرين في النظام من خلال النشاط الذي تقوم به والمحتوى الذي تملكه.',
'profile_email_desc' => 'سيتم استخدام هذا البريد الإلكتروني للإشعارات، وبناءً على مصادقة النظام النشط، سيتم استخدام الوصول إلى النظام.',
'profile_email_no_permission' => 'للأسف، ليس لديك إذن لتغيير عنوان بريدك الإلكتروني. إذا كنت ترغب في تغييره، فعليك طلب ذلك من أحد المسؤولين.',
'profile_avatar_desc' => 'اختر صورةً تُمثّلك أمام الآخرين في النظام. يُفضّل أن تكون الصورة مربعةً، وعرضها وارتفاعها حوالي ٢٥٦ بكسل.',
'profile_admin_options' => 'خيارات المسؤول',
'profile_admin_options_desc' => 'يمكنك العثور على خيارات إضافية على مستوى المسؤول، مثل تلك الخاصة بإدارة تعيينات الأدوار، لحساب المستخدم الخاص بك في منطقة "الإعدادات > المستخدمون" في التطبيق.',
'delete_account' => 'Delete Account',
'delete_my_account' => 'Delete My Account',
'delete_my_account_desc' => 'This will fully delete your user account from the system. You will not be able to recover this account or revert this action. Content you\'ve created, such as created pages and uploaded images, will remain.',
'delete_my_account_warning' => 'Are you sure you want to delete your account?',
'delete_account' => 'حذف الحساب',
'delete_my_account' => 'حذف حسابي',
'delete_my_account_desc' => 'سيؤدي هذا إلى حذف حساب المستخدم الخاص بك بالكامل من النظام. لن تتمكن من استعادة هذا الحساب أو التراجع عن هذا الإجراء. سيبقى المحتوى الذي أنشأته، مثل الصفحات التي أنشأتها والصور التي رفعتها، كما هي.',
'delete_my_account_warning' => 'هل أنت متأكد أنك تريد حذف حسابك؟',
];

View File

@@ -48,12 +48,12 @@ return [
'app_disable_comments_desc' => 'تعطيل التعليقات على جميع الصفحات داخل التطبيق. التعليقات الموجودة من الأصل لن تكون ظاهرة.',
// Color settings
'color_scheme' => 'Application Color Scheme',
'color_scheme_desc' => 'Set the colors to use in the application user interface. Colors can be configured separately for dark and light modes to best fit the theme and ensure legibility.',
'ui_colors_desc' => 'Set the application primary color and default link color. The primary color is mainly used for the header banner, buttons and interface decorations. The default link color is used for text-based links and actions, both within written content and in the application interface.',
'app_color' => 'Primary Color',
'link_color' => 'Default Link Color',
'content_colors_desc' => 'Set colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
'color_scheme' => 'مخطط ألوان التطبيق',
'color_scheme_desc' => 'حدّد الألوان المستخدمة في واجهة مستخدم التطبيق. يمكن ضبط الألوان بشكل منفصل للوضعين الداكن والفاتح لتناسب المظهر بشكل أفضل ولضمان وضوح النص.',
'ui_colors_desc' => 'عيّن اللون الأساسي للتطبيق ولون الرابط الافتراضي. يُستخدم اللون الأساسي بشكل رئيس في شعار الصفحة الرئيسة والأزرار وزخارف الواجهة. أما اللون الافتراضي للرابط، فيُستخدم للروابط والإجراءات النصية، سواءً داخل المحتوى المكتوب أو في واجهة التطبيق.',
'app_color' => 'اللون الأساسي',
'link_color' => 'لون الرابط الافتراضي',
'content_colors_desc' => 'حدّد ألوان جميع عناصر هيكل تنظيم الصفحة. يُنصح باختيار ألوان بنفس سطوع الألوان الافتراضية لسهولة القراءة.',
'bookshelf_color' => 'لون الرف',
'book_color' => 'لون الكتاب',
'chapter_color' => 'لون الفصل',
@@ -75,40 +75,40 @@ return [
'reg_confirm_restrict_domain_placeholder' => 'لم يتم اختيار أي قيود',
// Sorting Settings
'sorting' => 'Sorting',
'sorting_book_default' => 'Default Book Sort',
'sorting_book_default_desc' => 'Select the default sort rule to apply to new books. This won\'t affect existing books, and can be overridden per-book.',
'sorting_rules' => 'Sort Rules',
'sorting_rules_desc' => 'These are predefined sorting operations which can be applied to content in the system.',
'sort_rule_assigned_to_x_books' => 'Assigned to :count Book|Assigned to :count Books',
'sort_rule_create' => 'Create Sort Rule',
'sort_rule_edit' => 'Edit Sort Rule',
'sort_rule_delete' => 'Delete Sort Rule',
'sort_rule_delete_desc' => 'Remove this sort rule from the system. Books using this sort will revert to manual sorting.',
'sort_rule_delete_warn_books' => 'This sort rule is currently used on :count book(s). Are you sure you want to delete this?',
'sort_rule_delete_warn_default' => 'This sort rule is currently used as the default for books. Are you sure you want to delete this?',
'sort_rule_details' => 'Sort Rule Details',
'sort_rule_details_desc' => 'Set a name for this sort rule, which will appear in lists when users are selecting a sort.',
'sort_rule_operations' => 'Sort Operations',
'sort_rule_operations_desc' => 'Configure the sort actions to be performed by moving them from the list of available operations. Upon use, the operations will be applied in order, from top to bottom. Any changes made here will be applied to all assigned books upon save.',
'sort_rule_available_operations' => 'Available Operations',
'sort_rule_available_operations_empty' => 'No operations remaining',
'sort_rule_configured_operations' => 'Configured Operations',
'sort_rule_configured_operations_empty' => 'Drag/add operations from the "Available Operations" list',
'sort_rule_op_asc' => '(Asc)',
'sort_rule_op_desc' => '(Desc)',
'sort_rule_op_name' => 'Name - Alphabetical',
'sort_rule_op_name_numeric' => 'Name - Numeric',
'sort_rule_op_created_date' => 'Created Date',
'sort_rule_op_updated_date' => 'Updated Date',
'sort_rule_op_chapters_first' => 'Chapters First',
'sort_rule_op_chapters_last' => 'Chapters Last',
'sorting' => 'طريقة الترتيب',
'sorting_book_default' => 'ترتيب الكتاب الافتراضي',
'sorting_book_default_desc' => 'حدد قاعدة الترتيب الافتراضية لتطبيقها على الكتب الجديدة. لن يؤثر هذا على الكتب الحالية، ويمكن تجاوزه لكل كتاب على حدة.',
'sorting_rules' => 'قواعد الترتيب',
'sorting_rules_desc' => 'هذه هي عمليات الترتيب المحددة مسبقًا الذي يمكن تطبيقها على المحتوى الموجود في النظام.',
'sort_rule_assigned_to_x_books' => 'مُعيَّن إلى :count كتاب|مُعيَّن إلى :count كتاب',
'sort_rule_create' => 'إنشاء قاعدة الترتيب',
'sort_rule_edit' => 'تعديل قاعدة الترتيب',
'sort_rule_delete' => 'حذف قاعدة الترتيب',
'sort_rule_delete_desc' => 'أزل قاعدة الترتيب هذه من النظام. الكتب التي تستخدم هذا الفرز ستعود إلى الفرز اليدوي.',
'sort_rule_delete_warn_books' => 'تُستخدم قاعدة الترتيب هذه حاليًا على :count كتاب/كتب. متيقن من رغبتك في حذف هذا؟',
'sort_rule_delete_warn_default' => 'تُستخدم قاعدة الترتيب هذه حاليًا كإعداد افتراضي للكتب. متيقن من رغبتك في حذفها؟',
'sort_rule_details' => 'تفاصيل قاعدة الترتيب',
'sort_rule_details_desc' => 'تعيين اسم لقاعدة الترتيب هذه، التي ستظهر في القوائم عندما يقوم المستخدمون باختيار نوع ما.',
'sort_rule_operations' => 'عمليات الترتيب',
'sort_rule_operations_desc' => 'جهّز إجراءات الترتيب المطلوب تنفيذها بنقلها من قائمة العمليات المتاحة. عند الاستخدام، سيتم تطبيق العمليات بالترتيب من الأعلى إلى الأسفل. أي تغييرات تُجرى هنا ستُطبّق على جميع الكتب المُخصّصة عند الحفظ.',
'sort_rule_available_operations' => 'العمليات المتاحة',
'sort_rule_available_operations_empty' => 'لا توجد عمليات متبقية',
'sort_rule_configured_operations' => 'العمليات المُهيأة',
'sort_rule_configured_operations_empty' => 'اسحب/أضف العمليات من قائمة "العمليات المتاحة"',
'sort_rule_op_asc' => '(تصاعدي)',
'sort_rule_op_desc' => '(تنازلي)',
'sort_rule_op_name' => 'الاسم - أبجديًا',
'sort_rule_op_name_numeric' => 'الاسم - رقمي',
'sort_rule_op_created_date' => 'تاريخ الإنشاء',
'sort_rule_op_updated_date' => 'تاريخ التحديث',
'sort_rule_op_chapters_first' => 'الفصول الأولى',
'sort_rule_op_chapters_last' => 'الفصول الأخيرة',
// 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 من الصور المحتمل عدم استخدامها!',
@@ -122,16 +122,16 @@ return [
'maint_send_test_email_mail_text' => 'تهانينا! كما تلقيت إشعار هذا البريد الإلكتروني، يبدو أن إعدادات البريد الإلكتروني الخاص بك قد تم تكوينها بشكل صحيح.',
'maint_recycle_bin_desc' => 'تُرسل الأرفف والكتب والفصول والصفحات المحذوفة إلى سلة المحذوفات حتى يمكن استعادتها أو حذفها نهائيًا. قد يتم إزالة العناصر الأقدم في سلة المحذوفات تلقائيًا بعد فترة اعتمادًا على تكوين النظام.',
'maint_recycle_bin_open' => 'افتح سلة المحذوفات',
'maint_regen_references' => 'Regenerate References',
'maint_regen_references_desc' => 'This action will rebuild the cross-item reference index within the database. This is usually handled automatically but this action can be useful to index old content or content added via unofficial methods.',
'maint_regen_references_success' => 'Reference index has been regenerated!',
'maint_timeout_command_note' => 'Note: This action can take time to run, which can lead to timeout issues in some web environments. As an alternative, this action be performed using a terminal command.',
'maint_regen_references' => 'إعادة إنشاء المراجع',
'maint_regen_references_desc' => 'سيعيد هذا الإجراء بناء فِهْرِس المراجع بين العناصر داخل قاعدة البيانات. عادةً ما يتم ذلك تلقائيًا، ولكنه قد يكون مفيدًا لفهرسة المحتوى القديم أو المحتوى المُضاف بطرق غير رسمية.',
'maint_regen_references_success' => 'لقد تم تجديد فِهْرِس المرجع!',
'maint_timeout_command_note' => 'ملاحظة: قد يستغرق تنفيذ هذا الإجراء بعض الوقت، مما قد يؤدي إلى مشاكل في مهلة التنفيذ في بعض بيئات الويب. كبديل، يمكن تنفيذ هذا الإجراء باستخدام سطر الأوامر.',
// Recycle Bin
'recycle_bin' => 'سلة المحذوفات',
'recycle_bin_desc' => 'هنا يمكنك استعادة العناصر التي تم حذفها أو اختيار إزالتها نهائيا من النظام. هذه القائمة غير مصفاة خلافاً لقوائم الأنشطة المماثلة في النظام حيث يتم تطبيق عوامل تصفية الأذونات.',
'recycle_bin_deleted_item' => 'عنصر محذوف',
'recycle_bin_deleted_parent' => 'Parent',
'recycle_bin_deleted_parent' => 'اﻷب',
'recycle_bin_deleted_by' => 'حُذف بواسطة',
'recycle_bin_deleted_at' => 'وقت الحذف',
'recycle_bin_permanently_delete' => 'حُذف نهائيًا',
@@ -139,12 +139,12 @@ return [
'recycle_bin_contents_empty' => 'سلة المحذوفات فارغة حاليًا',
'recycle_bin_empty' => 'إفراغ سلة المحذوفات',
'recycle_bin_empty_confirm' => 'سيؤدي هذا إلى إتلاف جميع العناصر الموجودة في سلة المحذوفات بشكل دائم بما في ذلك المحتوى الموجود داخل كل عنصر. هل أنت متأكد من أنك تريد إفراغ سلة المحذوفات؟',
'recycle_bin_destroy_confirm' => 'This action will permanently delete this item from the system, along with any child elements listed below, and you will not be able to restore this content. Are you sure you want to permanently delete this item?',
'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' => 'Restore Parent',
'recycle_bin_restore_parent' => 'استعادة اﻷب',
'recycle_bin_destroy_notification' => 'المحذوف: قُم بعد إجمالي العناصر من سلة المحذوفات.',
'recycle_bin_restore_notification' => 'المرتجع: قُم بعد إجمالي العناصر من سلة المحذوفات.',
@@ -158,7 +158,7 @@ return [
'audit_table_user' => 'المستخدم',
'audit_table_event' => 'الحدث',
'audit_table_related' => 'العنصر أو التفاصيل ذات الصلة',
'audit_table_ip' => 'IP Address',
'audit_table_ip' => 'عنوان عُرف اﻹنترنت -IP-',
'audit_table_date' => 'تاريخ النشاط',
'audit_date_from' => 'نطاق التاريخ من',
'audit_date_to' => 'نطاق التاريخ إلى',
@@ -166,11 +166,11 @@ return [
// Role Settings
'roles' => 'الأدوار',
'role_user_roles' => 'أدوار المستخدمين',
'roles_index_desc' => 'Roles are used to group users & provide system permission to their members. When a user is a member of multiple roles the privileges granted will stack and the user will inherit all abilities.',
'roles_x_users_assigned' => ':count user assigned|:count users assigned',
'roles_x_permissions_provided' => ':count permission|:count permissions',
'roles_assigned_users' => 'Assigned Users',
'roles_permissions_provided' => 'Provided Permissions',
'roles_index_desc' => 'تُستخدم الأدوار لتجميع المستخدمين ومنح أذونات النظام لأعضائها. عندما يكون المستخدم عضوًا في أدوار متعددة، تتراكم الصلاحيات الممنوحة، ويرث المستخدم جميع القدرات.',
'roles_x_users_assigned' => ':count مستخدم معين|:count مستخدمين معينين',
'roles_x_permissions_provided' => ':count إذن |:count إذونات',
'roles_assigned_users' => 'المستخدمون المعينون',
'roles_permissions_provided' => 'الصلاحيات المقدمة',
'role_create' => 'إنشاء دور جديد',
'role_delete' => 'حذف الدور',
'role_delete_confirm' => 'سيتم حذف الدور المسمى \':roleName\'.',
@@ -181,7 +181,7 @@ return [
'role_details' => 'تفاصيل الدور',
'role_name' => 'اسم الدور',
'role_desc' => 'وصف مختصر للدور',
'role_mfa_enforced' => 'Requires Multi-Factor Authentication',
'role_mfa_enforced' => 'يتطلب مصادقة متعددة العوامل',
'role_external_auth_id' => 'ربط الحساب بمواقع التواصل',
'role_system' => 'أذونات النظام',
'role_manage_users' => 'إدارة المستخدمين',
@@ -191,15 +191,15 @@ return [
'role_manage_page_templates' => 'إدارة قوالب الصفحة',
'role_access_api' => 'الوصول إلى واجهة برمجة تطبيقات النظام API',
'role_manage_settings' => 'إدارة إعدادات التطبيق',
'role_export_content' => 'Export content',
'role_import_content' => 'Import content',
'role_editor_change' => 'Change page editor',
'role_notifications' => 'Receive & manage notifications',
'role_export_content' => 'تصدير المحتوى',
'role_import_content' => 'استيراد المحتوى',
'role_editor_change' => 'تغيير محرر الصفحة',
'role_notifications' => 'تلقي الإشعارات وإدارتها',
'role_asset' => 'أذونات الأصول',
'roles_system_warning' => 'اعلم أن الوصول إلى أي من الأذونات الثلاثة المذكورة أعلاه يمكن أن يسمح للمستخدم بتغيير امتيازاته الخاصة أو امتيازات الآخرين في النظام. قم بتعيين الأدوار مع هذه الأذونات فقط للمستخدمين الموثوق بهم.',
'role_asset_desc' => 'تتحكم هذه الأذونات في الوصول الافتراضي إلى الأصول داخل النظام. ستتجاوز الأذونات الخاصة بالكتب والفصول والصفحات هذه الأذونات.',
'role_asset_admins' => 'يُمنح المسؤولين حق الوصول تلقائيًا إلى جميع المحتويات ولكن هذه الخيارات قد تعرض خيارات واجهة المستخدم أو تخفيها.',
'role_asset_image_view_note' => 'This relates to visibility within the image manager. Actual access of uploaded image files will be dependant upon system image storage option.',
'role_asset_image_view_note' => 'يتعلق هذا بالرؤية داخل مدير الصور. يعتمد الوصول الفعلي لملفات الصور المُحمّلة على خِيار تخزين الصور في النظام.',
'role_all' => 'الكل',
'role_own' => 'ما يخص',
'role_controlled_by_asset' => 'يتحكم فيها الأصول التي يتم رفعها إلى',
@@ -209,7 +209,7 @@ return [
// Users
'users' => 'المستخدمون',
'users_index_desc' => 'Create & manage individual user accounts within the system. User accounts are used for login and attribution of content & activity. Access permissions are primarily role-based but user content ownership, among other factors, may also affect permissions & access.',
'users_index_desc' => 'إنشاء وإدارة حسابات المستخدمين الفردية داخل النظام. يتم استخدام حسابات المستخدم لتسجيل الدخول وإسناد المحتوى والنشاط. صلاحيات الوصول هي أساسا قائمة على الأدوار ولكن ملكية محتوى المستخدم، من بين عوامل أخرى، قد تؤثر أيضا على صلاحيات والوصول إليها.',
'user_profile' => 'ملف المستخدم',
'users_add_new' => 'إضافة مستخدم جديد',
'users_search' => 'بحث عن مستخدم',
@@ -220,20 +220,20 @@ return [
'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_desc' => 'عيّن كلمة سر لتسجيل الدخول إلى التطبيق. يجب ألا تقل عن 8 أحرف.',
'users_send_invite_text' => 'يمكنك اختيار إرسال دعوة بالبريد الإلكتروني إلى هذا المستخدم مما يسمح له بتعيين كلمة السر الخاصة به أو يمكنك تعيين كلمة المرور الخاصة به بنفسك.',
'users_send_invite_option' => 'أرسل بريدًا إلكترونيًا لدعوة المستخدم',
'users_external_auth_id' => 'ربط الحساب بمواقع التواصل',
'users_external_auth_id_desc' => 'When an external authentication system is in use (such as SAML2, OIDC or LDAP) this is the ID which links this BookStack user to the authentication system account. You can ignore this field if using the default email-based authentication.',
'users_password_warning' => 'Only fill the below if you would like to change the password for this user.',
'users_external_auth_id_desc' => 'عند استخدام نظام مصادقة خارجي (مثل SAML2 أو OIDC أو LDAP)، يكون هذا هو المعرف الذي يربط مستخدم بوكستاك -BookStack- بحساب نظام المصادقة. يمكنك تجاهل هذا الحقل عند استخدام المصادقة الافتراضية عبر البريد الإلكتروني.',
'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_migrate_ownership' => 'نقل الملكية',
'users_migrate_ownership_desc' => 'حدد مستخدم هنا إذا كنت تريد أن يصبح مستخدم آخر مالك جميع العناصر التي يمتلكها هذا المستخدم حاليا.',
'users_none_selected' => 'لم يتم تحديد مستخدم',
'users_edit' => 'تعديل المستخدم',
'users_edit_profile' => 'تعديل الملف',
'users_avatar' => 'صورة المستخدم',
@@ -241,24 +241,24 @@ return [
'users_preferred_language' => 'اللغة المفضلة',
'users_preferred_language_desc' => 'سيؤدي هذا الخيار إلى تغيير اللغة المستخدمة لواجهة المستخدم الخاصة بالتطبيق. لن يؤثر هذا على أي محتوى قد أنشائه المستخدم.',
'users_social_accounts' => 'الحسابات الاجتماعية',
'users_social_accounts_desc' => 'View the status of the connected social accounts for this user. Social accounts can be used in addition to the primary authentication system for system access.',
'users_social_accounts_desc' => 'عرض حالة الحسابات الاجتماعية المرتبطة لهذا المستخدم. ويمكن استخدام الحسابات الاجتماعية بالإضافة إلى نظام التوثيق الرئيس للوصول إلى النظام.',
'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not previously authorized access. Revoke access from your profile settings on the connected social account.',
'users_social_connect' => 'ربط الحساب',
'users_social_disconnect' => 'فصل الحساب',
'users_social_status_connected' => 'Connected',
'users_social_status_disconnected' => 'Disconnected',
'users_social_status_connected' => 'متصل',
'users_social_status_disconnected' => 'غير متصل',
'users_social_connected' => 'تم ربط حساب :socialAccount بملفك بنجاح.',
'users_social_disconnected' => 'تم فصل حساب :socialAccount من ملفك بنجاح.',
'users_api_tokens' => 'رموز الـ API',
'users_api_tokens_desc' => 'Create and manage the access tokens used to authenticate with the BookStack REST API. Permissions for the API are managed via the user that the token belongs to.',
'users_api_tokens_desc' => 'أنشئ وأدر رموز الوصول المستخدمة للمصادقة باستخدام واجهة برمجة تطبيقات بوكستاك رِست -BookStack REST API-. تتم إدارة صلاحيات واجهة برمجة التطبيقات بواسطة المستخدم الذي ينتمي إليه الرمز.',
'users_api_tokens_none' => 'لم يتم إنشاء رموز API لهذا المستخدم',
'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',
@@ -279,42 +279,42 @@ return [
'user_api_token_delete_confirm' => 'هل أنت متأكد من أنك تريد حذف رمز API؟',
// Webhooks
'webhooks' => 'Webhooks',
'webhooks_index_desc' => 'Webhooks are a way to send data to external URLs when certain actions and events occur within the system which allows event-based integration with external platforms such as messaging or notification systems.',
'webhooks_x_trigger_events' => ':count trigger event|:count trigger events',
'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-',
'webhooks_index_desc' => 'خطافات الويب هي طريقة لإرسال البيانات إلى الروابط الخارجية عندما تحدث بعض الإجراءات والأحداث داخل النظام الذي يسمح بالتكامل القائم على الأحداث مع المنصات الخارجية مثل نظم المراسلة أو الإشعار.',
'webhooks_x_trigger_events' => ':count حدث تشغيل |:count أحداث تشغيل',
'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' => 'يتم إرسال بيانات خطاف الويب كطلب بوست -POST- إلى نقطة النهاية المكونة كجيسون -JSON- باتباع التنسيق أدناه. خصائص "ذات صلة" و "روابط" اختيارية و ستعتمد على نوع الحدث الذي تم تشغيله.',
'webhooks_status' => 'حالة خطاف الويب',
'webhooks_last_called' => 'آخر اتصال:',
'webhooks_last_errored' => 'أخر خطأ:',
'webhooks_last_error_message' => 'رسالة الخطأ الأخيرة:',
// Licensing
'licenses' => 'Licenses',
'licenses_desc' => 'This page details license information for BookStack in addition to the projects & libraries that are used within BookStack. Many projects listed may only be used in a development context.',
'licenses_bookstack' => 'BookStack License',
'licenses_php' => 'PHP Library Licenses',
'licenses_js' => 'JavaScript Library Licenses',
'licenses_other' => 'Other Licenses',
'license_details' => 'License Details',
'licenses' => 'الرخص',
'licenses_desc' => 'هذه الصفحة تفصل معلومات الرخص لبوكستاك -BookStack- بالإضافة إلى المشاريع والمكتبات المستخدمة في بوكستاك. ولا يمكن استخدام العديد من المشاريع المدرجة إلا في سياق إنمائي.',
'licenses_bookstack' => 'رخص بوكستاك',
'licenses_php' => 'رخص مكتبات بي إتش بي -PHP-',
'licenses_js' => 'رخص مكتبة جافا سكريبت -JavaScript-',
'licenses_other' => 'رخص أخرى',
'license_details' => 'تفاصيل الرخصة',
//! If editing translations files directly please ignore this in all
//! languages apart from en. Content will be auto-copied from en.

View File

@@ -105,15 +105,15 @@ return [
'url' => 'صيغة :attribute غير صالحة.',
'uploaded' => 'تعذر تحميل الملف. قد لا يقبل الخادم ملفات بهذا الحجم.',
'zip_file' => 'The :attribute needs to reference a file within the ZIP.',
'zip_file_mime' => 'The :attribute needs to reference a file of type :validTypes, found :foundType.',
'zip_model_expected' => 'Data object expected but ":type" found.',
'zip_unique' => 'The :attribute must be unique for the object type within the ZIP.',
'zip_file' => ':attribute بحاجة إلى الرجوع إلى مِلَفّ داخل المِلَفّ المضغوط.',
'zip_file_mime' => ':attribute بحاجة إلى الإشارة إلى مِلَفّ من نوع :validTypes، وجدت :foundType.',
'zip_model_expected' => 'عنصر البيانات المتوقع ولكن ":type" تم العثور عليه.',
'zip_unique' => 'يجب أن يكون :attribute فريداً لنوع الكائن داخل المِلَفّ المضغوط.',
// Custom validation lines
'custom' => [
'password-confirm' => [
'required_with' => 'يجب تأكيد كلمة المرور',
'required_with' => 'يجب تأكيد كلمة السر',
],
],

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Създаване',
'update' => 'Обновяване',
'edit' => 'Редактиране',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Сортиране',
'move' => 'Преместване',
'copy' => 'Копиране',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Задайте регистър на промените',
'pages_edit_enter_changelog_desc' => 'Въведете кратко резюме на промените, които сте създали',
'pages_edit_enter_changelog' => 'Въведи регистър на промените',
@@ -392,8 +392,11 @@ return [
'comment' => 'Коментирай',
'comments' => 'Коментари',
'comment_add' => 'Добавяне на коментар',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Напишете коментар',
'comment_count' => '{0} Няма коментари|{1} 1 коментар|[2,*] :count коментара',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Запази коментар',
'comment_new' => 'Нов коментар',
'comment_created' => 'коментирано :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Коментарът е изтрит',
'comment_created_success' => 'Коментарът е добавен',
'comment_updated_success' => 'Коментарът е обновен',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Наистина ли искате да изтриете този коментар?',
'comment_in_reply_to' => 'В отговор на :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Here are the comments that have been left on this page. Comments can be added & managed when viewing the saved page.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'তৈরী করুন',
'update' => 'হালনাগাদ করুন',
'edit' => 'সম্পাদন করুন',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'ক্রমান্বয় করুন',
'move' => 'স্থানান্তর করুন',
'copy' => 'অনুলিপি করুন',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Set Changelog',
'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
'pages_edit_enter_changelog' => 'Enter Changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Comment',
'comments' => 'Comments',
'comment_add' => 'Add Comment',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Leave a comment here',
'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Save Comment',
'comment_new' => 'New Comment',
'comment_created' => 'commented :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Comment deleted',
'comment_created_success' => 'Comment added',
'comment_updated_success' => 'Comment updated',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
'comment_in_reply_to' => 'In reply to :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Here are the comments that have been left on this page. Comments can be added & managed when viewing the saved page.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Kreiraj',
'update' => 'Ažuriraj',
'edit' => 'Uredi',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Sortiraj',
'move' => 'Pomjeri',
'copy' => 'Kopiraj',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Set Changelog',
'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
'pages_edit_enter_changelog' => 'Enter Changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Comment',
'comments' => 'Comments',
'comment_add' => 'Add Comment',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Leave a comment here',
'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Save Comment',
'comment_new' => 'New Comment',
'comment_created' => 'commented :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Comment deleted',
'comment_created_success' => 'Comment added',
'comment_updated_success' => 'Comment updated',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
'comment_in_reply_to' => 'In reply to :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Here are the comments that have been left on this page. Comments can be added & managed when viewing the saved page.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Crea',
'update' => 'Actualitza',
'edit' => 'Edita',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Ordena',
'move' => 'Mou',
'copy' => 'Copia',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Contingut estable)',
'pages_edit_switch_to_wysiwyg' => 'Canvia a leditor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Registre de canvis',
'pages_edit_enter_changelog_desc' => 'Introduïu una descripció breu dels canvis que heu fet',
'pages_edit_enter_changelog' => 'Registra un canvi',
@@ -392,8 +392,11 @@ return [
'comment' => 'Comentari',
'comments' => 'Comentaris',
'comment_add' => 'Afegeix un comentari',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Deixa un comentari aquí',
'comment_count' => '{0} No hi ha cap comentari|{1} Hi ha 1 comentari|[2,*] Hi ha :count comentaris',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Desa el comentari',
'comment_new' => 'Crea un comentari',
'comment_created' => 'ha comentat :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Sha suprimit el comentari',
'comment_created_success' => 'Sha afegit un comentari',
'comment_updated_success' => 'Sha actualitzat un comentari',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Esteu segur que voleu suprimir aquest comentari?',
'comment_in_reply_to' => 'En resposta a :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Vet aquí els comentaris que shan fet en aquesta pàgina. Els comentaris es poden fer i gestionar quan es visualitza la pàgina desada.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Vytvořit',
'update' => 'Aktualizovat',
'edit' => 'Upravit',
'archive' => 'Archivovat',
'unarchive' => 'Od-Archivovat',
'sort' => 'Seřadit',
'move' => 'Přesunout',
'copy' => 'Kopírovat',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stabilní obsah)',
'pages_edit_switch_to_wysiwyg' => 'Přepnout na WYSIWYG Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Přepnout na nový WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(V alfa testování)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(V beta testování)',
'pages_edit_set_changelog' => 'Nastavit protokol změn',
'pages_edit_enter_changelog_desc' => 'Zadejte stručný popis změn, které jste provedli',
'pages_edit_enter_changelog' => 'Zadejte protokol změn',
@@ -392,8 +392,11 @@ return [
'comment' => 'Komentář',
'comments' => 'Komentáře',
'comment_add' => 'Přidat komentář',
'comment_none' => 'Žádné komentáře k zobrazení',
'comment_placeholder' => 'Zde zadejte komentář',
'comment_count' => '{0} Bez komentářů|{1} 1 komentář|[2,4] :count komentáře|[5,*] :count komentářů',
'comment_thread_count' => ':count vlákno komentáře|:count vláken komentářů',
'comment_archived_count' => ':count archivováno',
'comment_archived_threads' => 'Archivovaná vlákna',
'comment_save' => 'Uložit komentář',
'comment_new' => 'Nový komentář',
'comment_created' => 'komentováno :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Komentář odstraněn',
'comment_created_success' => 'Komentář přidán',
'comment_updated_success' => 'Komentář aktualizován',
'comment_archive_success' => 'Komentář archivován',
'comment_unarchive_success' => 'Komentář od-archivován',
'comment_view' => 'Zobrazit komentář',
'comment_jump_to_thread' => 'Přejít na vlákno',
'comment_delete_confirm' => 'Opravdu chcete odstranit tento komentář?',
'comment_in_reply_to' => 'Odpověď na :commentId',
'comment_reference' => 'Odkaz',
'comment_reference_outdated' => '(Zastaralý)',
'comment_editor_explain' => 'Zde jsou komentáře, které zůstaly na této stránce. Komentáře lze přidat a spravovat při prohlížení uložené stránky.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Creu',
'update' => 'Diweddaru',
'edit' => 'Golygu',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Trefnu',
'move' => 'Symud',
'copy' => 'Copïo',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Cynnwys Glân)',
'pages_edit_switch_to_wysiwyg' => 'Newid i Olygydd WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Newid i WYSIWYG newydd',
'pages_edit_switch_to_new_wysiwyg_desc' => '(Mewn Profi Alpha)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Gosod Changelog',
'pages_edit_enter_changelog_desc' => 'Rhowch ddisgrifiad byr o\'r newidiadau rydych wedi\'u gwneud',
'pages_edit_enter_changelog' => 'Cofnodwch Changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Sylw',
'comments' => 'Sylwadau',
'comment_add' => 'Ychwanegu Sylw',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Gadewch sylw yma',
'comment_count' => '{0} Dim sylwadau|{1} 1 Sylw| [2,*] :count Sylwadau',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Cadw Sylw',
'comment_new' => 'Sylw Newydd',
'comment_created' => 'sylwodd :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Dilëwyd sylw',
'comment_created_success' => 'Ychwanegwyd sylw',
'comment_updated_success' => 'Diweddarwyd sylw',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Ydych chi\'n siwr eich bod eisiau dileu\'r sylw hwn?',
'comment_in_reply_to' => 'Mewn ymateb i :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Dyma\'r sylwadau sydd wedi eu gadael ar y dudalen hon. Gellir ychwanegu a rheoli sylwadau wrth edrych ar y dudalen a gadwyd.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Opret',
'update' => 'Opdater',
'edit' => 'Rediger',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Sorter',
'move' => 'Flyt',
'copy' => 'Kopier',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stabilt indhold)',
'pages_edit_switch_to_wysiwyg' => 'Skift til WYSIWYG redigering',
'pages_edit_switch_to_new_wysiwyg' => 'Skift til ny WYSIWYG (Hvad man ser, er hvad man får)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(I alfa-testning)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Sæt ændringsoversigt',
'pages_edit_enter_changelog_desc' => 'Indtast en kort beskrivelse af ændringer du har lavet',
'pages_edit_enter_changelog' => 'Indtast ændringsoversigt',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentar',
'comments' => 'Kommentarer',
'comment_add' => 'Tilføj kommentar',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Skriv en kommentar her',
'comment_count' => '{0} Ingen kommentarer|{1} 1 Kommentar|[2,*] :count kommentarer',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Gem kommentar',
'comment_new' => 'Ny kommentar',
'comment_created' => 'kommenteret :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Kommentar slettet',
'comment_created_success' => 'Kommentaren er tilføjet',
'comment_updated_success' => 'Kommentaren er opdateret',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Er du sikker på, at du vil slette denne kommentar?',
'comment_in_reply_to' => 'Som svar til :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Her er de kommentarer, der er blevet efterladt på denne side. Kommentarer kan tilføjes og administreres, når du ser den gemte side.',
// Revision

View File

@@ -50,7 +50,7 @@ return [
'bookshelf_delete_notification' => 'Regal erfolgreich gelöscht',
// Revisions
'revision_restore' => 'widerherstellte Revision',
'revision_restore' => 'stellte Revision wieder her:',
'revision_delete' => 'löschte Revision',
'revision_delete_notification' => 'Revision erfolgreich gelöscht',
@@ -128,12 +128,12 @@ return [
'comment_delete' => 'Kommentar gelöscht',
// Sort Rules
'sort_rule_create' => 'created sort rule',
'sort_rule_create_notification' => 'Sort rule successfully created',
'sort_rule_update' => 'updated sort rule',
'sort_rule_update_notification' => 'Sort rule successfully updated',
'sort_rule_delete' => 'deleted sort rule',
'sort_rule_delete_notification' => 'Sort rule successfully deleted',
'sort_rule_create' => 'hat eine Sortierregel erstellt',
'sort_rule_create_notification' => 'Sortierregel erfolgreich angelegt',
'sort_rule_update' => 'hat eine Sortierregel aktualisiert',
'sort_rule_update_notification' => 'Sortierregel erfolgreich aktualisiert',
'sort_rule_delete' => 'hat eine Sortierregel gelöscht',
'sort_rule_delete_notification' => 'Sortierregel erfolgreich gelöscht',
// Other
'permissions_update' => 'hat die Berechtigungen aktualisiert',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Erstellen',
'update' => 'Aktualisieren',
'edit' => 'Bearbeiten',
'archive' => 'Archivieren',
'unarchive' => 'Nicht mehr archivieren',
'sort' => 'Sortieren',
'move' => 'Verschieben',
'copy' => 'Kopieren',

View File

@@ -13,7 +13,7 @@ return [
'cancel' => 'Abbrechen',
'save' => 'Speichern',
'close' => 'Schließen',
'apply' => 'Apply',
'apply' => 'Übernehmen',
'undo' => 'Rückgängig',
'redo' => 'Wiederholen',
'left' => 'Links',
@@ -148,7 +148,7 @@ return [
'url' => 'URL',
'text_to_display' => 'Anzuzeigender Text',
'title' => 'Titel',
'browse_links' => 'Browse links',
'browse_links' => 'Links durchsuchen',
'open_link' => 'Link öffnen',
'open_link_in' => 'Link öffnen in...',
'open_link_current' => 'Aktuelles Fenster',

View File

@@ -40,8 +40,8 @@ return [
'export_text' => 'Textdatei',
'export_md' => 'Markdown-Datei',
'export_zip' => 'Portable ZIP',
'default_template' => 'Standard Seitenvorlage',
'default_template_explain' => 'Zuweisen einer Seitenvorlage, die als Standardinhalt für alle Seiten verwendet wird, die innerhalb dieses Elements erstellt wurden. Beachten Sie, dass dies nur dann verwendet wird, wenn der Ersteller der Seite Zugriff auf die ausgewählte Vorlagen-Seite hat.',
'default_template' => 'Standard-Seitenvorlage',
'default_template_explain' => 'Bestimmen Sie eine Seitenvorlage, die als Standardinhalt für alle Seiten verwendet wird, die innerhalb dieses Elements erstellt werden. Beachten Sie, dass dies nur dann verwendet wird, wenn der Ersteller der Seite Lesezugriff auf die ausgewählte Vorlagen-Seite hat.',
'default_template_select' => 'Wählen Sie eine Seitenvorlage',
'import' => 'Import',
'import_validate' => 'Import validieren',
@@ -87,7 +87,7 @@ return [
'search_terms' => 'Suchbegriffe',
'search_content_type' => 'Inhaltstyp',
'search_exact_matches' => 'Exakte Treffer',
'search_tags' => 'Nach Schlagwort suchen',
'search_tags' => 'Schlagwort-Suchen',
'search_options' => 'Optionen',
'search_viewed_by_me' => 'Schon von mir angesehen',
'search_not_viewed_by_me' => 'Noch nicht von mir angesehen',
@@ -166,9 +166,9 @@ return [
'books_search_this' => 'Dieses Buch durchsuchen',
'books_navigation' => 'Buchnavigation',
'books_sort' => 'Buchinhalte sortieren',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books. Optionally an auto sort rule can be set to automatically sort this book\'s contents upon changes.',
'books_sort_auto_sort' => 'Auto Sort Option',
'books_sort_auto_sort_active' => 'Auto Sort Active: :sortName',
'books_sort_desc' => 'Kapitel und Seiten innerhalb eines Buches verschieben, um dessen Inhalt zu reorganisieren. Andere Bücher können hinzugefügt werden, was das Verschieben von Kapiteln und Seiten zwischen Büchern erleichtert. Optional kann eine automatische Sortierregel erstellt werden, um den Inhalt dieses Buches nach Änderungen automatisch zu sortieren.',
'books_sort_auto_sort' => 'Auto-Sortieroption',
'books_sort_auto_sort_active' => 'Automatische Sortierung aktiv: :sortName',
'books_sort_named' => 'Buch ":bookName" sortieren',
'books_sort_name' => 'Sortieren nach Namen',
'books_sort_created' => 'Sortieren nach Erstellungsdatum',
@@ -243,12 +243,12 @@ return [
'pages_edit_delete_draft' => 'Entwurf löschen',
'pages_edit_delete_draft_confirm' => 'Sind Sie sicher, dass Sie Ihren Entwurf löschen möchten? Alle Ihre Änderungen seit dem letzten vollständigen Speichern gehen verloren und der Editor wird mit dem letzten Speicherzustand aktualisiert, der kein Entwurf ist.',
'pages_edit_discard_draft' => 'Entwurf verwerfen',
'pages_edit_switch_to_markdown' => 'Zum Markdown Editor wechseln',
'pages_edit_switch_to_markdown_clean' => '(gesäuberter Output)',
'pages_edit_switch_to_markdown_stable' => '(html beibehalten)',
'pages_edit_switch_to_wysiwyg' => 'Wechseln Sie zum WYSIWYG-Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Zu neuem WYSIWYG wechseln',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_markdown' => 'Zum Markdown-Editor wechseln',
'pages_edit_switch_to_markdown_clean' => '(Gesäuberter Inhalt)',
'pages_edit_switch_to_markdown_stable' => '(Stabiler Inhalt)',
'pages_edit_switch_to_wysiwyg' => 'Zum WYSIWYG-Editor wechseln',
'pages_edit_switch_to_new_wysiwyg' => 'Zum neuen WYSIWYG wechseln',
'pages_edit_switch_to_new_wysiwyg_desc' => '(Im Beta-Test)',
'pages_edit_set_changelog' => 'Änderungsprotokoll hinzufügen',
'pages_edit_enter_changelog_desc' => 'Bitte geben Sie eine kurze Zusammenfassung Ihrer Änderungen ein',
'pages_edit_enter_changelog' => 'Änderungsprotokoll eingeben',
@@ -332,7 +332,7 @@ return [
'tag' => 'Schlagwort',
'tags' => 'Schlagwörter',
'tags_index_desc' => 'Tags können auf Inhalte im System angewendet werden, um eine flexible Form der Kategorisierung anzuwenden. Tags können sowohl einen Schlüssel als auch einen Wert haben, wobei der Wert optional ist. Einmal angewendet, können Inhalte unter Verwendung des Tag-Namens und Wertes abgefragt werden.',
'tag_name' => 'Schlagwort Name',
'tag_name' => 'Schlagwortname',
'tag_value' => 'Inhalt (Optional)',
'tags_explain' => "Fügen Sie Schlagwörter hinzu, um Ihren Inhalt zu kategorisieren.\nSie können einen erklärenden Inhalt hinzufügen, um eine genauere Unterteilung vorzunehmen.",
'tags_add' => 'Weiteres Schlagwort hinzufügen',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentar',
'comments' => 'Kommentare',
'comment_add' => 'Kommentieren',
'comment_placeholder' => 'Geben Sie hier Ihre Kommentare ein (Markdown unterstützt)',
'comment_count' => '{0} Keine Kommentare|{1} 1 Kommentar|[2,*] :count Kommentare',
'comment_none' => 'Keine Kommentare vorhanden',
'comment_placeholder' => 'Geben Sie hier Ihre Kommentare ein',
'comment_thread_count' => ':count Thema|:count Themen',
'comment_archived_count' => ':count archiviert',
'comment_archived_threads' => 'Archivierte Themen',
'comment_save' => 'Kommentar speichern',
'comment_new' => 'Neuer Kommentar',
'comment_created' => ':createDiff kommentiert',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Kommentar gelöscht',
'comment_created_success' => 'Kommentar hinzugefügt',
'comment_updated_success' => 'Kommentar aktualisiert',
'comment_archive_success' => 'Kommentar archiviert',
'comment_unarchive_success' => 'Kommentar nicht mehr archiviert',
'comment_view' => 'Kommentar ansehen',
'comment_jump_to_thread' => 'Zum Thema springen',
'comment_delete_confirm' => 'Möchten Sie diesen Kommentar wirklich löschen?',
'comment_in_reply_to' => 'Antwort auf :commentId',
'comment_reference' => 'Referenz',
'comment_reference_outdated' => '(Veraltet)',
'comment_editor_explain' => 'Hier sind die Kommentare, die auf dieser Seite hinterlassen wurden. Kommentare können hinzugefügt und verwaltet werden, wenn die gespeicherte Seite angezeigt wird.',
// Revision

View File

@@ -8,7 +8,7 @@ return [
'password' => 'Passwörter müssen aus mindestens acht Zeichen bestehen und mit der eingegebenen Wiederholung übereinstimmen.',
'user' => "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.",
'token' => 'Der Link zum Zurücksetzen Ihres Passworts ist entweder ungültig oder abgelaufen.',
'token' => 'Der Token zum Zurücksetzen des Passworts ist für diese E-Mail-Adresse ungültig.',
'sent' => 'Der Link zum Zurücksetzen Ihres Passwortes wurde Ihnen per E-Mail zugesendet.',
'reset' => 'Ihr Passwort wurde zurückgesetzt!',

View File

@@ -35,12 +35,12 @@ return [
'auth_change_password_success' => 'Das Passwort wurde aktualisiert!',
'profile' => 'Profildetails',
'profile_desc' => 'Verwalten Sie die Details Ihres Kontos welche Sie gegenüber anderen Benutzern repräsentiert, zusätzlich zu den Details die für die Kommunikation und Personalisierung des Systems genutzt werden.',
'profile_view_public' => 'Öffentliches Profil zeigen',
'profile_name_desc' => 'Konfigurieren Sie Ihren Anzeigenamen, der durch die Aktivität, die Sie ausführen, für andere Benutzer und Ihre eigenen Inhalte im System sichtbar ist.',
'profile_desc' => 'Verwalten Sie die Details Ihres Kontos, welches Sie gegenüber anderen Benutzern repräsentiert, zusätzlich zu den Details, die für die Kommunikation und Personalisierung des Systems genutzt werden.',
'profile_view_public' => 'Öffentliches Profil anzeigen',
'profile_name_desc' => 'Konfigurieren Sie Ihren Anzeigenamen, der durch die Aktivität, die Sie ausführen, und die Ihnen gehörenden Inhalte für andere Benutzer sichtbar ist.',
'profile_email_desc' => 'Diese E-Mail wird für Benachrichtigungen und, je nach aktiver Systemauthentifizierung, den Systemzugriff verwendet.',
'profile_email_no_permission' => 'Leider haben Sie nicht die Berechtigung, Ihre E-Mail-Adresse zu ändern. Wenn Sie diese ändern möchten, wenden Sie sich bitte an Ihren Administrator.',
'profile_avatar_desc' => 'Wählen Sie ein Bild, dass anderen im System angezeigt wird, um Sie zu repräsentieren. Idealerweise sollte dieses Bild quadratisch und etwa 256px breit und hoch sein.',
'profile_avatar_desc' => 'Wählen Sie ein Bild aus, das anderen im System angezeigt wird, um Sie zu repräsentieren. Idealerweise sollte dieses Bild quadratisch und etwa 256px breit und hoch sein.',
'profile_admin_options' => 'Administratoroptionen',
'profile_admin_options_desc' => 'Weitere Administrator-Optionen wie zum Beispiel die Verwaltung von Rollenzuweisungen für Ihr Benutzerkonto finden Sie im Bereich "Einstellungen > Benutzer" der Anwendung.',

View File

@@ -19,17 +19,17 @@ return [
'app_name_desc' => 'Dieser Name wird im Header und in E-Mails angezeigt.',
'app_name_header' => 'Anwendungsname im Header anzeigen?',
'app_public_access' => 'Öffentlicher Zugriff',
'app_public_access_desc' => 'Wenn Sie diese Option aktivieren können Besucher, die nicht angemeldet sind, auf Inhalte in Ihrer BookStack-Instanz zugreifen.',
'app_public_access_desc' => 'Wenn Sie diese Option aktivieren, können Besucher, die nicht angemeldet sind, auf Inhalte in Ihrer BookStack-Instanz zugreifen.',
'app_public_access_desc_guest' => 'Der Zugang für öffentliche Besucher kann über den Benutzer "Guest" gesteuert werden.',
'app_public_access_toggle' => 'Öffentlichen Zugriff erlauben',
'app_public_viewing' => 'Öffentliche Ansicht erlauben?',
'app_secure_images' => 'Erhöhte Sicherheit für hochgeladene Bilder aktivieren?',
'app_secure_images_toggle' => 'Aktiviere höhere Sicherheit für Bild-Uploads',
'app_secure_images_toggle' => 'Höhere Sicherheit für Bild-Uploads aktivieren',
'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu erratende, Zeichenketten zu Bild-URLs hinzu. Stellen Sie sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.',
'app_default_editor' => 'Standard-Seiten-Editor',
'app_default_editor_desc' => 'Wählen Sie aus, welcher Editor standardmäßig beim Bearbeiten neuer Seiten verwendet wird. Dies kann auf einer Seitenebene überschrieben werden, wenn es die Berechtigungen erlauben.',
'app_custom_html' => 'Benutzerdefinierter HTML <head> Inhalt',
'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der <head> Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS Styles anzupassen oder Analytics-Code hinzuzufügen.',
'app_custom_html' => 'Benutzerdefinierter HTML-Head-Inhalt',
'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der <head>-Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS-Styles anzupassen oder Analytics-Code hinzuzufügen.',
'app_custom_html_disabled_notice' => 'Benutzerdefinierte HTML-Kopfzeileninhalte sind auf dieser Einstellungsseite deaktiviert, um sicherzustellen, dass alle Änderungen rückgängig gemacht werden können.',
'app_logo' => 'Anwendungslogo',
'app_logo_desc' => 'Dies wird unter anderem in der Kopfzeile der Anwendung verwendet. Dieses Bild sollte 86px hoch sein. Große Bilder werden herunterskaliert.',
@@ -76,34 +76,34 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
'reg_confirm_restrict_domain_placeholder' => 'Keine Einschränkung gesetzt',
// Sorting Settings
'sorting' => 'Sorting',
'sorting_book_default' => 'Default Book Sort',
'sorting_book_default_desc' => 'Select the default sort rule to apply to new books. This won\'t affect existing books, and can be overridden per-book.',
'sorting_rules' => 'Sort Rules',
'sorting_rules_desc' => 'These are predefined sorting operations which can be applied to content in the system.',
'sort_rule_assigned_to_x_books' => 'Assigned to :count Book|Assigned to :count Books',
'sort_rule_create' => 'Create Sort Rule',
'sort_rule_edit' => 'Edit Sort Rule',
'sort_rule_delete' => 'Delete Sort Rule',
'sort_rule_delete_desc' => 'Remove this sort rule from the system. Books using this sort will revert to manual sorting.',
'sort_rule_delete_warn_books' => 'This sort rule is currently used on :count book(s). Are you sure you want to delete this?',
'sort_rule_delete_warn_default' => 'This sort rule is currently used as the default for books. Are you sure you want to delete this?',
'sort_rule_details' => 'Sort Rule Details',
'sort_rule_details_desc' => 'Set a name for this sort rule, which will appear in lists when users are selecting a sort.',
'sort_rule_operations' => 'Sort Operations',
'sort_rule_operations_desc' => 'Configure the sort actions to be performed by moving them from the list of available operations. Upon use, the operations will be applied in order, from top to bottom. Any changes made here will be applied to all assigned books upon save.',
'sort_rule_available_operations' => 'Available Operations',
'sort_rule_available_operations_empty' => 'No operations remaining',
'sort_rule_configured_operations' => 'Configured Operations',
'sort_rule_configured_operations_empty' => 'Drag/add operations from the "Available Operations" list',
'sort_rule_op_asc' => '(Asc)',
'sort_rule_op_desc' => '(Desc)',
'sort_rule_op_name' => 'Name - Alphabetical',
'sort_rule_op_name_numeric' => 'Name - Numeric',
'sort_rule_op_created_date' => 'Created Date',
'sort_rule_op_updated_date' => 'Updated Date',
'sort_rule_op_chapters_first' => 'Chapters First',
'sort_rule_op_chapters_last' => 'Chapters Last',
'sorting' => 'Sortierung',
'sorting_book_default' => 'Standard-Buchsortierung',
'sorting_book_default_desc' => 'Wählen Sie die Standard-Sortierregel aus, die auf neue Bücher angewendet werden soll. Dies wirkt sich nicht auf bestehende Bücher aus und kann pro Buch überschrieben werden.',
'sorting_rules' => 'Sortierregeln',
'sorting_rules_desc' => 'Dies sind vordefinierte Sortieraktionen, die auf Inhalte im System angewendet werden können.',
'sort_rule_assigned_to_x_books' => ':count Buch zugewiesen|:count Büchern zugewiesen',
'sort_rule_create' => 'Sortierregel erstellen',
'sort_rule_edit' => 'Sortierregel bearbeiten',
'sort_rule_delete' => 'Sortierregel löschen',
'sort_rule_delete_desc' => 'Diese Sortierregel aus dem System entfernen. Bücher mit dieser Sortierung werden auf manuelle Sortierung zurückgesetzt.',
'sort_rule_delete_warn_books' => 'Diese Sortierregel wird derzeit in :count Bücher(n) verwendet. Sind Sie sicher, dass Sie dies löschen möchten?',
'sort_rule_delete_warn_default' => 'Diese Sortierregel wird derzeit als Standard für Bücher verwendet. Sind Sie sicher, dass Sie dies löschen möchten?',
'sort_rule_details' => 'Sortierregel-Details',
'sort_rule_details_desc' => 'Legen Sie einen Namen für diese Sortierregel fest, der in Listen erscheint, wenn Benutzer eine Sortierung auswählen.',
'sort_rule_operations' => 'Sortierungs-Aktionen',
'sort_rule_operations_desc' => 'Konfigurieren Sie die durchzuführenden Sortieraktionen durch Verschieben von der Liste der verfügbaren Aktionen. Bei der Verwendung werden die Aktionen von oben nach unten angewendet. Alle hier vorgenommenen Änderungen werden beim Speichern auf alle zugewiesenen Bücher angewendet.',
'sort_rule_available_operations' => 'Verfügbare Aktionen',
'sort_rule_available_operations_empty' => 'Keine verbleibenden Aktionen',
'sort_rule_configured_operations' => 'Konfigurierte Aktionen',
'sort_rule_configured_operations_empty' => 'Aktionen aus der Liste "Verfügbare Operationen" ziehen/hinzufügen',
'sort_rule_op_asc' => '(Aufst.)',
'sort_rule_op_desc' => '(Abst.)',
'sort_rule_op_name' => 'Name - Alphabetisch',
'sort_rule_op_name_numeric' => 'Name - Numerisch',
'sort_rule_op_created_date' => 'Erstellungsdatum',
'sort_rule_op_updated_date' => 'Aktualisierungsdatum',
'sort_rule_op_chapters_first' => 'Kapitel zuerst',
'sort_rule_op_chapters_last' => 'Kapitel zuletzt',
// Maintenance settings
'maint' => 'Wartung',
@@ -114,11 +114,11 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
'maint_image_cleanup_warning' => ':count eventuell unbenutze Bilder wurden gefunden. Möchten Sie diese Bilder löschen?',
'maint_image_cleanup_success' => ':count eventuell unbenutze Bilder wurden gefunden und gelöscht.',
'maint_image_cleanup_nothing_found' => 'Keine unbenutzen Bilder gefunden. Nichts zu löschen!',
'maint_send_test_email' => 'Test Email versenden',
'maint_send_test_email_desc' => 'Dies sendet eine Test E-Mail an Ihre in Ihrem Profil angegebene E-Mail-Adresse.',
'maint_send_test_email_run' => 'Sende eine Test E-Mail',
'maint_send_test_email' => 'Eine Test-E-Mail versenden',
'maint_send_test_email_desc' => 'Dies sendet eine Test-E-Mail an Ihre in Ihrem Profil angegebene E-Mail-Adresse.',
'maint_send_test_email_run' => 'Test-E-Mail senden',
'maint_send_test_email_success' => 'E-Mail wurde an :address gesendet',
'maint_send_test_email_mail_subject' => 'Test E-Mail',
'maint_send_test_email_mail_subject' => 'Test-E-Mail',
'maint_send_test_email_mail_greeting' => 'E-Mail-Versand scheint zu funktionieren!',
'maint_send_test_email_mail_text' => 'Glückwunsch! Da Sie diese E-Mail Benachrichtigung erhalten haben, scheinen Ihre E-Mail-Einstellungen korrekt konfiguriert zu sein.',
'maint_recycle_bin_desc' => 'Gelöschte Regale, Bücher, Kapitel & Seiten werden in den Papierkorb verschoben, so dass sie wiederhergestellt oder dauerhaft gelöscht werden können. Ältere Gegenstände im Papierkorb können, in Abhängigkeit von der Systemkonfiguration, nach einer Weile automatisch entfernt werden.',
@@ -159,7 +159,7 @@ Hinweis: Benutzer können ihre E-Mail-Adresse nach erfolgreicher Registrierung
'audit_table_user' => 'Benutzer',
'audit_table_event' => 'Ereignis',
'audit_table_related' => 'Verknüpftes Element oder Detail',
'audit_table_ip' => 'IP Adresse',
'audit_table_ip' => 'IP-Adresse',
'audit_table_date' => 'Aktivitätsdatum',
'audit_date_from' => 'Zeitraum von',
'audit_date_to' => 'Zeitraum bis',

View File

@@ -9,7 +9,7 @@ return [
// Standard laravel validation lines
'accepted' => ':attribute muss akzeptiert werden.',
'active_url' => ':attribute ist keine valide URL.',
'active_url' => ':attribute ist keine gültige URL.',
'after' => ':attribute muss ein Datum nach :date sein.',
'alpha' => ':attribute kann nur Buchstaben enthalten.',
'alpha_dash' => ':attribute kann nur Buchstaben, Zahlen und Bindestriche enthalten.',
@@ -25,12 +25,12 @@ return [
],
'boolean' => ':attribute Feld muss wahr oder falsch sein.',
'confirmed' => ':attribute stimmt nicht überein.',
'date' => ':attribute ist kein valides Datum.',
'date' => ':attribute ist kein gültiges Datum.',
'date_format' => ':attribute entspricht nicht dem Format :format.',
'different' => ':attribute und :other müssen unterschiedlich sein.',
'digits' => ':attribute muss :digits Stellen haben.',
'digits_between' => ':attribute muss zwischen :min und :max Stellen haben.',
'email' => ':attribute muss eine valide E-Mail-Adresse sein.',
'email' => ':attribute muss eine gültige E-Mail-Adresse sein.',
'ends_with' => ':attribute muss mit einem der folgenden Werte: :values enden',
'file' => ':attribute muss als gültige Datei angegeben werden.',
'filled' => ':attribute ist erforderlich.',
@@ -51,8 +51,8 @@ return [
'image_extension' => ':attribute muss eine gültige und unterstützte Bild-Dateiendung haben.',
'in' => ':attribute ist ungültig.',
'integer' => ':attribute muss eine Zahl sein.',
'ip' => ':attribute muss eine valide IP-Adresse sein.',
'ipv4' => ':attribute muss eine gültige IPv4 Adresse sein.',
'ip' => ':attribute muss eine gültige IP-Adresse sein.',
'ipv4' => ':attribute muss eine gültige IPv4-Adresse sein.',
'ipv6' => ':attribute muss eine gültige IPv6-Adresse sein.',
'json' => 'Das Attribut muss eine gültige JSON-Zeichenfolge sein.',
'lt' => [
@@ -80,8 +80,8 @@ return [
'string' => ':attribute muss mindestens :min Zeichen lang sein.',
'array' => ':attribute muss mindesten :min Elemente enthalten.',
],
'not_in' => ':attribute ist ungültig.',
'not_regex' => ':attribute ist kein valides Format.',
'not_in' => 'Das ausgewählte :attribute ist ungültig.',
'not_regex' => ':attribute ist kein gültiges Format.',
'numeric' => ':attribute muss eine Zahl sein.',
'regex' => ':attribute ist in einem ungültigen Format.',
'required' => ':attribute ist erforderlich.',
@@ -99,10 +99,10 @@ return [
'array' => ':attribute muss :size Elemente enthalten.',
],
'string' => ':attribute muss eine Zeichenkette sein.',
'timezone' => ':attribute muss eine valide zeitzone sein.',
'timezone' => ':attribute muss eine gültige Zeitzone sein.',
'totp' => 'Der angegebene Code ist ungültig oder abgelaufen.',
'unique' => ':attribute wird bereits verwendet.',
'url' => ':attribute ist kein valides Format.',
'url' => ':attribute ist kein gültiges Format.',
'uploaded' => 'Die Datei konnte nicht hochgeladen werden. Der Server akzeptiert möglicherweise keine Dateien dieser Größe.',
'zip_file' => ':attribute muss eine Datei innerhalb des ZIP referenzieren.',

View File

@@ -6,51 +6,51 @@
return [
// Pages
'page_create' => 'erstellt Seite',
'page_create' => 'erstellte Seite',
'page_create_notification' => 'Seite erfolgreich erstellt',
'page_update' => 'Seite aktualisiert',
'page_update' => 'aktualisierte Seite',
'page_update_notification' => 'Seite erfolgreich aktualisiert',
'page_delete' => 'Seite gelöscht',
'page_delete' => 'löschte Seite',
'page_delete_notification' => 'Seite erfolgreich gelöscht',
'page_restore' => 'Seite wiederhergestellt',
'page_restore' => 'stellte Seite wieder her',
'page_restore_notification' => 'Seite erfolgreich wiederhergestellt',
'page_move' => 'Seite verschoben',
'page_move' => 'verschob Seite',
'page_move_notification' => 'Seite erfolgreich verschoben',
// Chapters
'chapter_create' => 'Kapitel erstellt',
'chapter_create' => 'erstellte Kapitel',
'chapter_create_notification' => 'Kapitel erfolgreich erstellt',
'chapter_update' => 'Kapitel aktualisiert',
'chapter_update' => 'aktualisierte Kapitel',
'chapter_update_notification' => 'Kapitel erfolgreich aktualisiert',
'chapter_delete' => 'Kapitel gelöscht',
'chapter_delete' => 'löschte Kapitel',
'chapter_delete_notification' => 'Kapitel erfolgreich gelöscht',
'chapter_move' => 'Kapitel verschoben',
'chapter_move' => 'verschob Kapitel',
'chapter_move_notification' => 'Kapitel erfolgreich verschoben',
// Books
'book_create' => 'Buch erstellt',
'book_create' => 'erstellte Buch',
'book_create_notification' => 'Buch erfolgreich erstellt',
'book_create_from_chapter' => 'Kapitel zu Buch umgewandelt',
'book_create_from_chapter' => 'wandelte Kapitel zu Buch um',
'book_create_from_chapter_notification' => 'Kapitel erfolgreich in ein Buch umgewandelt',
'book_update' => 'Buch aktualisiert',
'book_update' => 'aktualisierte Buch',
'book_update_notification' => 'Buch erfolgreich aktualisiert',
'book_delete' => 'Buch gelöscht',
'book_delete' => 'löschte Buch',
'book_delete_notification' => 'Buch erfolgreich gelöscht',
'book_sort' => 'Buch sortiert',
'book_sort' => 'sortierte Buch',
'book_sort_notification' => 'Buch erfolgreich umsortiert',
// Bookshelves
'bookshelf_create' => 'Regal erstellt',
'bookshelf_create' => 'erstellte Regal',
'bookshelf_create_notification' => 'Regal erfolgreich erstellt',
'bookshelf_create_from_book' => 'Buch zu Regal umgewandelt',
'bookshelf_create_from_book' => 'wandelte Buch zu Regal um',
'bookshelf_create_from_book_notification' => 'Buch erfolgreich zu einem Regal umgewandelt',
'bookshelf_update' => 'Regal aktualisiert',
'bookshelf_update' => 'aktualisierte Regal',
'bookshelf_update_notification' => 'Regal erfolgreich aktualisiert',
'bookshelf_delete' => 'Regal gelöscht',
'bookshelf_delete' => 'löschte Regal',
'bookshelf_delete_notification' => 'Regal erfolgreich gelöscht',
// Revisions
'revision_restore' => 'Revision wiederhergestellt',
'revision_restore' => 'stellte Revision wieder her',
'revision_delete' => 'Revision gelöscht',
'revision_delete_notification' => 'Revision erfolgreich gelöscht',
@@ -128,12 +128,12 @@ return [
'comment_delete' => 'Kommentar gelöscht',
// Sort Rules
'sort_rule_create' => 'created sort rule',
'sort_rule_create_notification' => 'Sort rule successfully created',
'sort_rule_update' => 'updated sort rule',
'sort_rule_update_notification' => 'Sort rule successfully updated',
'sort_rule_delete' => 'deleted sort rule',
'sort_rule_delete_notification' => 'Sort rule successfully deleted',
'sort_rule_create' => 'hat eine Sortierregel erstellt',
'sort_rule_create_notification' => 'Sortierregel erfolgreich angelegt',
'sort_rule_update' => 'hat eine Sortierregel aktualisiert',
'sort_rule_update_notification' => 'Sortierregel erfolgreich aktualisiert',
'sort_rule_delete' => 'hat eine Sortierregel gelöscht',
'sort_rule_delete_notification' => 'Sortierregel erfolgreich gelöscht',
// Other
'permissions_update' => 'aktualisierte Berechtigungen',

View File

@@ -33,7 +33,7 @@ return [
'social_registration_text' => 'Mit einem dieser Dienste registrieren oder anmelden',
'register_thanks' => 'Vielen Dank für deine Registrierung!',
'register_confirm' => 'Bitte prüfe deinen Posteingang und bestätige die Registrierung.',
'register_confirm' => 'Bitte prüfe deinen Posteingang und bestätige die Registrierung, um :appName nutzen zu können.',
'registrations_disabled' => 'Eine Registrierung ist momentan nicht möglich',
'registration_email_domain_invalid' => 'Du kannst dich mit dieser E-Mail nicht registrieren.',
'register_success' => 'Vielen Dank für deine Registrierung! Du bist jetzt registriert und eingeloggt.',
@@ -82,7 +82,7 @@ return [
// Multi-factor Authentication
'mfa_setup' => 'Multi-Faktor-Authentifizierung einrichten',
'mfa_setup_desc' => 'Richte eine Multi-Faktor-Authentifizierung als zusätzliche Sicherheitsstufe für dein Benutzerkonto ein.',
'mfa_setup_desc' => 'Richte Multi-Faktor-Authentifizierung als zusätzliche Sicherheitsstufe für dein Benutzerkonto ein.',
'mfa_setup_configured' => 'Bereits konfiguriert',
'mfa_setup_reconfigure' => 'Umkonfigurieren',
'mfa_setup_remove_confirmation' => 'Bist du sicher, dass du diese Multi-Faktor-Authentifizierungsmethode entfernen möchtest?',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Anlegen',
'update' => 'Aktualisieren',
'edit' => 'Bearbeiten',
'archive' => 'Archivieren',
'unarchive' => 'Nicht mehr archivieren',
'sort' => 'Sortieren',
'move' => 'Verschieben',
'copy' => 'Kopieren',

View File

@@ -13,7 +13,7 @@ return [
'cancel' => 'Abbrechen',
'save' => 'Speichern',
'close' => 'Schließen',
'apply' => 'Apply',
'apply' => 'Übernehmen',
'undo' => 'Rückgängig machen',
'redo' => 'Wiederholen',
'left' => 'Links',
@@ -148,7 +148,7 @@ return [
'url' => 'URL',
'text_to_display' => 'Anzuzeigender Text',
'title' => 'Titel',
'browse_links' => 'Browse links',
'browse_links' => 'Links durchsuchen',
'open_link' => 'Link öffnen',
'open_link_in' => 'Link öffnen in...',
'open_link_current' => 'Aktuellem Fenster',
@@ -163,7 +163,7 @@ return [
// About view
'about' => 'Über den Editor',
'about_title' => 'Über den WYSIWYG Editor',
'about_title' => 'Über den WYSIWYG-Editor',
'editor_license' => 'Editorlizenz & Copyright',
'editor_lexical_license' => 'Dieser Editor wurde mithilfe von :lexicalLink erstellt, der unter der MIT-Lizenz bereitgestellt wird.',
'editor_lexical_license_link' => 'Vollständige Lizenzdetails findest du hier.',

View File

@@ -40,8 +40,8 @@ return [
'export_text' => 'Textdatei',
'export_md' => 'Markdown-Datei',
'export_zip' => 'Portable ZIP',
'default_template' => 'Standard Seitenvorlage',
'default_template_explain' => 'Zuweisen einer Seitenvorlage, die als Standardinhalt für alle Seiten verwendet wird, die innerhalb dieses Elements erstellt wurden. Beachten Sie, dass dies nur dann verwendet wird, wenn der Ersteller der Seite Zugriff auf die ausgewählte Vorlagen-Seite hat.',
'default_template' => 'Standard-Seitenvorlage',
'default_template_explain' => 'Bestimme eine Seitenvorlage, die als Standardinhalt für alle Seiten verwendet wird, die innerhalb dieses Elements erstellt werden. Beachte, dass dies nur dann verwendet wird, wenn der Ersteller der Seite Lesezugriff auf die ausgewählte Vorlagen-Seite hat.',
'default_template_select' => 'Wähle eine Seitenvorlage',
'import' => 'Importieren',
'import_validate' => 'Import validieren',
@@ -87,7 +87,7 @@ return [
'search_terms' => 'Suchbegriffe',
'search_content_type' => 'Inhaltstyp',
'search_exact_matches' => 'Exakte Treffer',
'search_tags' => 'Nach Schlagwort suchen',
'search_tags' => 'Schlagwort-Suchen',
'search_options' => 'Optionen',
'search_viewed_by_me' => 'Schon von mir angesehen',
'search_not_viewed_by_me' => 'Noch nicht von mir angesehen',
@@ -166,9 +166,9 @@ return [
'books_search_this' => 'Dieses Buch durchsuchen',
'books_navigation' => 'Buchnavigation',
'books_sort' => 'Buchinhalte sortieren',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books. Optionally an auto sort rule can be set to automatically sort this book\'s contents upon changes.',
'books_sort_auto_sort' => 'Auto Sort Option',
'books_sort_auto_sort_active' => 'Auto Sort Active: :sortName',
'books_sort_desc' => 'Kapitel und Seiten innerhalb eines Buches verschieben, um dessen Inhalt zu reorganisieren. Andere Bücher können hinzugefügt werden, was das Verschieben von Kapiteln und Seiten zwischen Büchern erleichtert. Optional kann eine automatische Sortierregel erstellt werden, um den Inhalt dieses Buches nach Änderungen automatisch zu sortieren.',
'books_sort_auto_sort' => 'Auto-Sortieroption',
'books_sort_auto_sort_active' => 'Automatische Sortierung aktiv: :sortName',
'books_sort_named' => 'Buch ":bookName" sortieren',
'books_sort_name' => 'Sortieren nach Namen',
'books_sort_created' => 'Sortieren nach Erstellungsdatum',
@@ -243,12 +243,12 @@ return [
'pages_edit_delete_draft' => 'Entwurf löschen',
'pages_edit_delete_draft_confirm' => 'Bist du sicher, dass du deinen Entwurf löschen möchtest? Alle deine Änderungen seit dem letzten vollständigen Speichern gehen verloren und der Editor wird mit dem letzten Speicherzustand aktualisiert, der kein Entwurf ist.',
'pages_edit_discard_draft' => 'Entwurf verwerfen',
'pages_edit_switch_to_markdown' => 'Zum Markdown Editor wechseln',
'pages_edit_switch_to_markdown_clean' => '(Sauberer Inhalt)',
'pages_edit_switch_to_markdown' => 'Zum Markdown-Editor wechseln',
'pages_edit_switch_to_markdown_clean' => '(Gesäuberter Inhalt)',
'pages_edit_switch_to_markdown_stable' => '(Stabiler Inhalt)',
'pages_edit_switch_to_wysiwyg' => 'Zum WYSIWYG Editor wechseln',
'pages_edit_switch_to_new_wysiwyg' => 'Wechsel zum neuen WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testphase)',
'pages_edit_switch_to_wysiwyg' => 'Zum WYSIWYG-Editor wechseln',
'pages_edit_switch_to_new_wysiwyg' => 'Zum neuen WYSIWYG wechseln',
'pages_edit_switch_to_new_wysiwyg_desc' => '(Im Beta-Test)',
'pages_edit_set_changelog' => 'Änderungsprotokoll hinzufügen',
'pages_edit_enter_changelog_desc' => 'Bitte gib eine kurze Zusammenfassung deiner Änderungen ein',
'pages_edit_enter_changelog' => 'Änderungsprotokoll eingeben',
@@ -332,7 +332,7 @@ return [
'tag' => 'Schlagwort',
'tags' => 'Schlagwörter',
'tags_index_desc' => 'Tags können auf Inhalte im System angewendet werden, um eine flexible Form der Kategorisierung anzuwenden. Tags können sowohl einen Schlüssel als auch einen Wert haben, wobei der Wert optional ist. Einmal angewendet, können Inhalte unter Verwendung des Tag-Namens und Wertes abgefragt werden.',
'tag_name' => 'Schlagwort Name',
'tag_name' => 'Schlagwortname',
'tag_value' => 'Inhalt (Optional)',
'tags_explain' => "Füge Schlagwörter hinzu, um ihren Inhalt zu kategorisieren.\nDu kannst einen erklärenden Inhalt hinzufügen, um eine genauere Unterteilung vorzunehmen.",
'tags_add' => 'Weiteres Schlagwort hinzufügen',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentar',
'comments' => 'Kommentare',
'comment_add' => 'Kommentieren',
'comment_placeholder' => 'Gib hier deine Kommentare ein (Markdown unterstützt)',
'comment_count' => '{0} Keine Kommentare|{1} 1 Kommentar|[2,*] :count Kommentare',
'comment_none' => 'Keine Kommentare vorhanden',
'comment_placeholder' => 'Gib hier deine Kommentare ein',
'comment_thread_count' => ':count Thema|:count Themen',
'comment_archived_count' => ':count archiviert',
'comment_archived_threads' => 'Archivierte Themen',
'comment_save' => 'Kommentar speichern',
'comment_new' => 'Neuer Kommentar',
'comment_created' => ':createDiff kommentiert',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Kommentar gelöscht',
'comment_created_success' => 'Kommentar hinzugefügt',
'comment_updated_success' => 'Kommentar aktualisiert',
'comment_archive_success' => 'Kommentar archiviert',
'comment_unarchive_success' => 'Kommentar nicht mehr archiviert',
'comment_view' => 'Kommentar ansehen',
'comment_jump_to_thread' => 'Zum Thema springen',
'comment_delete_confirm' => 'Möchtst du diesen Kommentar wirklich löschen?',
'comment_in_reply_to' => 'Antwort auf :commentId',
'comment_reference' => 'Referenz',
'comment_reference_outdated' => '(Veraltet)',
'comment_editor_explain' => 'Hier sind die Kommentare, die auf dieser Seite hinterlassen wurden. Kommentare können hinzugefügt und verwaltet werden, wenn die gespeicherte Seite angezeigt wird.',
// Revision

View File

@@ -8,7 +8,7 @@ return [
'password' => 'Passwörter müssen aus mindestens acht Zeichen bestehen und mit der eingegebenen Wiederholung übereinstimmen.',
'user' => "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.",
'token' => 'Der Token zum Zurücksetzen des Passworts für diese E-Mail-Adresse ist ungültig.',
'token' => 'Der Token zum Zurücksetzen des Passworts ist für diese E-Mail-Adresse ungültig.',
'sent' => 'Wir haben dir einen Link zum Zurücksetzen des Passwortes per E-Mail geschickt!',
'reset' => 'Dein Passwort wurde zurückgesetzt!',

View File

@@ -35,12 +35,12 @@ return [
'auth_change_password_success' => 'Das Passwort wurde aktualisiert!',
'profile' => 'Profildetails',
'profile_desc' => 'Verwalte die Details für dein Konto, welche dich gegenüber anderen Benutzern repräsentieren, zusätzlich zu den Details, die für die Kommunikation und die Personalisierung des Systems verwendet werden.',
'profile_desc' => 'Verwalte die Details deines Kontos, welches dich gegenüber anderen Benutzern repräsentiert, zusätzlich zu den Details, die für die Kommunikation und die Personalisierung des Systems genutzt werden.',
'profile_view_public' => 'Öffentliches Profil anzeigen',
'profile_name_desc' => 'Konfiguriere deinen Anzeigenamen, der durch die Aktivität, die du durchführst, für andere Benutzer und deine eigenen Inhalte im System sichtbar ist.',
'profile_name_desc' => 'Konfiguriere deinen Anzeigenamen, der durch die Aktivität, die du ausführst, und die dir gehörenden Inhalte für andere Benutzer sichtbar ist.',
'profile_email_desc' => 'Diese E-Mail wird für Benachrichtigungen und, je nach aktiver Systemauthentifizierung, den Systemzugriff verwendet.',
'profile_email_no_permission' => 'Leider hast du nicht die Berechtigung, deine E-Mail-Adresse zu ändern. Wenn du diese ändern möchtest, wende dich bitte an deinen Administrator.',
'profile_avatar_desc' => 'Wähle ein Bild aus, dass anderen im System angezeigt wird, um dich zu repräsentieren. Idealerweise sollte dieses Bild quadratisch und etwa 256px breit und hoch sein.',
'profile_avatar_desc' => 'Wähle ein Bild aus, das anderen im System angezeigt wird, um dich zu repräsentieren. Idealerweise sollte dieses Bild quadratisch und etwa 256px breit und hoch sein.',
'profile_admin_options' => 'Administratoroptionen',
'profile_admin_options_desc' => 'Weitere Administrator-Optionen, wie zum Beispiel die Verwaltung von Rollenzuweisungen, findest du in deinem Benutzerkonto im Bereich "Einstellungen > Benutzer" der Anwendung.',

View File

@@ -24,12 +24,12 @@ return [
'app_public_access_toggle' => 'Öffentlichen Zugriff erlauben',
'app_public_viewing' => 'Öffentliche Ansicht erlauben?',
'app_secure_images' => 'Erhöhte Sicherheit für hochgeladene Bilder aktivieren?',
'app_secure_images_toggle' => 'Aktiviere Bild-Upload mit höherer Sicherheit',
'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu erratene, Zeichenketten zu Bild-URLs hinzu. Stelle sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.',
'app_secure_images_toggle' => 'Höhere Sicherheit für Bild-Uploads aktivieren',
'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu erratende, Zeichenketten zu Bild-URLs hinzu. Stelle sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.',
'app_default_editor' => 'Standard Seiteneditor',
'app_default_editor_desc' => 'Wähle aus, welcher Editor bei der Bearbeitung neuer Seiten standardmäßig verwendet werden soll. Dies kann auf Seitenebene außer Kraft gesetzt werden, sofern die Berechtigungen dies zulassen.',
'app_custom_html' => 'Benutzerdefinierter HTML <head> Inhalt',
'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der <head> Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS Styles anzupassen oder Analytics-Code hinzuzufügen.',
'app_custom_html' => 'Benutzerdefinierter HTML-Head-Inhalt',
'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der <head>-Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS-Styles anzupassen oder Analytics-Code hinzuzufügen.',
'app_custom_html_disabled_notice' => 'Benutzerdefinierte HTML-Kopfzeileninhalte sind auf dieser Einstellungsseite deaktiviert, um sicherzustellen, dass alle Änderungen rückgängig gemacht werden können.',
'app_logo' => 'Anwendungslogo',
'app_logo_desc' => 'Dies wird unter anderem in der Kopfzeile der Anwendung verwendet. Dieses Bild sollte 86px hoch sein. Große Bilder werden herunterskaliert.',
@@ -76,34 +76,34 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'reg_confirm_restrict_domain_placeholder' => 'Keine Einschränkung gesetzt',
// Sorting Settings
'sorting' => 'Sorting',
'sorting_book_default' => 'Default Book Sort',
'sorting_book_default_desc' => 'Select the default sort rule to apply to new books. This won\'t affect existing books, and can be overridden per-book.',
'sorting_rules' => 'Sort Rules',
'sorting_rules_desc' => 'These are predefined sorting operations which can be applied to content in the system.',
'sort_rule_assigned_to_x_books' => 'Assigned to :count Book|Assigned to :count Books',
'sort_rule_create' => 'Create Sort Rule',
'sort_rule_edit' => 'Edit Sort Rule',
'sort_rule_delete' => 'Delete Sort Rule',
'sort_rule_delete_desc' => 'Remove this sort rule from the system. Books using this sort will revert to manual sorting.',
'sort_rule_delete_warn_books' => 'This sort rule is currently used on :count book(s). Are you sure you want to delete this?',
'sort_rule_delete_warn_default' => 'This sort rule is currently used as the default for books. Are you sure you want to delete this?',
'sort_rule_details' => 'Sort Rule Details',
'sort_rule_details_desc' => 'Set a name for this sort rule, which will appear in lists when users are selecting a sort.',
'sort_rule_operations' => 'Sort Operations',
'sort_rule_operations_desc' => 'Configure the sort actions to be performed by moving them from the list of available operations. Upon use, the operations will be applied in order, from top to bottom. Any changes made here will be applied to all assigned books upon save.',
'sort_rule_available_operations' => 'Available Operations',
'sort_rule_available_operations_empty' => 'No operations remaining',
'sort_rule_configured_operations' => 'Configured Operations',
'sort_rule_configured_operations_empty' => 'Drag/add operations from the "Available Operations" list',
'sort_rule_op_asc' => '(Asc)',
'sort_rule_op_desc' => '(Desc)',
'sort_rule_op_name' => 'Name - Alphabetical',
'sort_rule_op_name_numeric' => 'Name - Numeric',
'sort_rule_op_created_date' => 'Created Date',
'sort_rule_op_updated_date' => 'Updated Date',
'sort_rule_op_chapters_first' => 'Chapters First',
'sort_rule_op_chapters_last' => 'Chapters Last',
'sorting' => 'Sortierung',
'sorting_book_default' => 'Standard-Buchsortierung',
'sorting_book_default_desc' => 'Wähle die Standard-Sortierregel aus, die auf neue Bücher angewendet werden soll. Dies wirkt sich nicht auf bestehende Bücher aus und kann pro Buch überschrieben werden.',
'sorting_rules' => 'Sortierregeln',
'sorting_rules_desc' => 'Dies sind vordefinierte Sortieraktionen, die auf Inhalte im System angewendet werden können.',
'sort_rule_assigned_to_x_books' => ':count Buch zugewiesen|:count Büchern zugewiesen',
'sort_rule_create' => 'Sortierregel erstellen',
'sort_rule_edit' => 'Sortierregel bearbeiten',
'sort_rule_delete' => 'Sortierregel löschen',
'sort_rule_delete_desc' => 'Diese Sortierregel aus dem System entfernen. Bücher mit dieser Sortierung werden auf manuelle Sortierung zurückgesetzt.',
'sort_rule_delete_warn_books' => 'Diese Sortierregel wird derzeit in :count Bücher(n) verwendet. Bist du sicher, dass du dies löschen möchtest?',
'sort_rule_delete_warn_default' => 'Diese Sortierregel wird derzeit als Standard für Bücher verwendet. Bist du sicher, dass du dies löschen möchtest?',
'sort_rule_details' => 'Sortierregel-Details',
'sort_rule_details_desc' => 'Lege einen Namen für diese Sortierregel fest, der in Listen erscheint, wenn Benutzer eine Sortierung auswählen.',
'sort_rule_operations' => 'Sortierungs-Aktionen',
'sort_rule_operations_desc' => 'Konfiguriere die durchzuführenden Sortieraktionen durch Verschieben von der Liste der verfügbaren Aktionen. Bei der Verwendung werden die Aktionen von oben nach unten angewendet. Alle hier vorgenommenen Änderungen werden beim Speichern auf alle zugewiesenen Bücher angewendet.',
'sort_rule_available_operations' => 'Verfügbare Aktionen',
'sort_rule_available_operations_empty' => 'Keine verbleibenden Aktionen',
'sort_rule_configured_operations' => 'Konfigurierte Aktionen',
'sort_rule_configured_operations_empty' => 'Aktionen aus der Liste "Verfügbare Operationen" ziehen/hinzufügen',
'sort_rule_op_asc' => '(Aufst.)',
'sort_rule_op_desc' => '(Abst.)',
'sort_rule_op_name' => 'Name - Alphabetisch',
'sort_rule_op_name_numeric' => 'Name - Numerisch',
'sort_rule_op_created_date' => 'Erstellungsdatum',
'sort_rule_op_updated_date' => 'Aktualisierungsdatum',
'sort_rule_op_chapters_first' => 'Kapitel zuerst',
'sort_rule_op_chapters_last' => 'Kapitel zuletzt',
// Maintenance settings
'maint' => 'Wartung',
@@ -114,11 +114,11 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'maint_image_cleanup_warning' => ':count eventuell unbenutze Bilder wurden gefunden. Möchtest du diese Bilder löschen?',
'maint_image_cleanup_success' => ':count eventuell unbenutze Bilder wurden gefunden und gelöscht.',
'maint_image_cleanup_nothing_found' => 'Keine unbenutzen Bilder gefunden. Nichts zu löschen!',
'maint_send_test_email' => 'Test E-Mail versenden',
'maint_send_test_email_desc' => 'Dies sendet eine Test E-Mail an die in deinem Profil angegebene E-Mail-Adresse.',
'maint_send_test_email_run' => 'Sende eine Test E-Mail',
'maint_send_test_email' => 'Eine Test-E-Mail versenden',
'maint_send_test_email_desc' => 'Dies sendet eine Test-E-Mail an die in deinem Profil angegebene E-Mail-Adresse.',
'maint_send_test_email_run' => 'Test-E-Mail senden',
'maint_send_test_email_success' => 'E-Mail wurde an :address gesendet',
'maint_send_test_email_mail_subject' => 'Test E-Mail',
'maint_send_test_email_mail_subject' => 'Test-E-Mail',
'maint_send_test_email_mail_greeting' => 'E-Mail-Versand scheint zu funktionieren!',
'maint_send_test_email_mail_text' => 'Glückwunsch! Da du diese E-Mail Benachrichtigung erhalten hast, scheinen deine E-Mail-Einstellungen korrekt konfiguriert zu sein.',
'maint_recycle_bin_desc' => 'Gelöschte Regale, Bücher, Kapitel & Seiten werden in den Papierkorb verschoben, so dass sie wiederhergestellt oder dauerhaft gelöscht werden können. Ältere Einträge im Papierkorb können, in Abhängigkeit von der Systemkonfiguration, nach einer Weile automatisch entfernt werden.',
@@ -159,7 +159,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'audit_table_user' => 'Benutzer',
'audit_table_event' => 'Ereignis',
'audit_table_related' => 'Verknüpfter Eintrag oder Detail',
'audit_table_ip' => 'IP Adresse',
'audit_table_ip' => 'IP-Adresse',
'audit_table_date' => 'Aktivitätsdatum',
'audit_date_from' => 'Zeitraum von',
'audit_date_to' => 'Zeitraum bis',
@@ -257,7 +257,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'users_api_tokens_expires' => 'Endet',
'users_api_tokens_docs' => 'API Dokumentation',
'users_mfa' => 'Multi-Faktor-Authentifizierung',
'users_mfa_desc' => 'Richte die Multi-Faktor-Authentifizierung als zusätzliche Sicherheitsstufe für dein Benutzerkonto ein.',
'users_mfa_desc' => 'Richte Multi-Faktor-Authentifizierung als zusätzliche Sicherheitsstufe für dein Benutzerkonto ein.',
'users_mfa_x_methods' => ':count Methode konfiguriert|:count Methoden konfiguriert',
'users_mfa_configure' => 'Methoden konfigurieren',

View File

@@ -9,7 +9,7 @@ return [
// Standard laravel validation lines
'accepted' => ':attribute muss akzeptiert werden.',
'active_url' => ':attribute ist keine valide URL.',
'active_url' => ':attribute ist keine gültige URL.',
'after' => ':attribute muss ein Datum nach :date sein.',
'alpha' => ':attribute kann nur Buchstaben enthalten.',
'alpha_dash' => ':attribute kann nur Buchstaben, Zahlen und Bindestriche enthalten.',
@@ -25,12 +25,12 @@ return [
],
'boolean' => ':attribute Feld muss wahr oder falsch sein.',
'confirmed' => ':attribute stimmt nicht überein.',
'date' => ':attribute ist kein valides Datum.',
'date' => ':attribute ist kein gültiges Datum.',
'date_format' => ':attribute entspricht nicht dem Format :format.',
'different' => ':attribute und :other müssen unterschiedlich sein.',
'digits' => ':attribute muss :digits Stellen haben.',
'digits_between' => ':attribute muss zwischen :min und :max Stellen haben.',
'email' => ':attribute muss eine valide E-Mail-Adresse sein.',
'email' => ':attribute muss eine gültige E-Mail-Adresse sein.',
'ends_with' => ':attribute muss mit einem der folgenden Werte: :values enden',
'file' => ':attribute muss als gültige Datei angegeben werden.',
'filled' => ':attribute ist erforderlich.',
@@ -51,8 +51,8 @@ return [
'image_extension' => ':attribute muss eine gültige und unterstützte Bild-Dateiendung haben.',
'in' => ':attribute ist ungültig.',
'integer' => ':attribute muss eine Zahl sein.',
'ip' => ':attribute muss eine valide IP-Adresse sein.',
'ipv4' => ':attribute muss eine gültige IPv4 Adresse sein.',
'ip' => ':attribute muss eine gültige IP-Adresse sein.',
'ipv4' => ':attribute muss eine gültige IPv4-Adresse sein.',
'ipv6' => ':attribute muss eine gültige IPv6-Adresse sein.',
'json' => ':attribute muss ein gültiger JSON-String sein.',
'lt' => [
@@ -80,7 +80,7 @@ return [
'string' => ':attribute muss mindestens :min Zeichen lang sein.',
'array' => ':attribute muss mindesten :min Elemente enthalten.',
],
'not_in' => ':attribute ist ungültig.',
'not_in' => 'Das ausgewählte :attribute ist ungültig.',
'not_regex' => ':attribute ist kein gültiges Format.',
'numeric' => ':attribute muss eine Zahl sein.',
'regex' => ':attribute ist in einem ungültigen Format.',
@@ -99,14 +99,14 @@ return [
'array' => ':attribute muss :size Elemente enthalten.',
],
'string' => ':attribute muss eine Zeichenkette sein.',
'timezone' => ':attribute muss eine valide zeitzone sein.',
'timezone' => ':attribute muss eine gültige Zeitzone sein.',
'totp' => 'Der angegebene Code ist ungültig oder abgelaufen.',
'unique' => ':attribute wird bereits verwendet.',
'url' => ':attribute ist kein valides Format.',
'uploaded' => 'Die Datei konnte nicht hochgeladen werden. Der Server akzeptiert möglicherweise keine Dateien dieser Größe.',
'zip_file' => ':attribute muss auf eine Datei innerhalb des ZIP verweisen.',
'zip_file_mime' => ':attribute muss auf eine Datei des Typs :validType verweisen, gefunden :foundType.',
'zip_file_mime' => ':attribute muss eine Datei des Typs :validType referenzieren, gefunden :foundType.',
'zip_model_expected' => 'Datenobjekt erwartet, aber ":type" gefunden.',
'zip_unique' => ':attribute muss für den Objekttyp innerhalb des ZIP eindeutig sein.',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Δημιουργία',
'update' => 'Ενημέρωση',
'edit' => 'Επεξεργασία',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Ταξινόμηση',
'move' => 'Μετακίνηση',
'copy' => 'Αντιγραφή',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Σταθερό Περιεχόμενο)',
'pages_edit_switch_to_wysiwyg' => 'Εναλλαγή στον επεξεργαστή WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Ορισμός καταγραφής αλλαγών',
'pages_edit_enter_changelog_desc' => 'Εισάγετε μια σύντομη περιγραφή των αλλαγών που κάνατε',
'pages_edit_enter_changelog' => 'Εισαγωγή Αρχείου Καταγραφής Αλλαγών',
@@ -392,8 +392,11 @@ return [
'comment' => 'Σχόλιο',
'comments' => 'Σχόλια',
'comment_add' => 'Προσθήκη Σχολίου',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Αφήστε ένα σχόλιο εδώ',
'comment_count' => '{0} Κανένα Σχόλιο |{1} 1 Σχόλιο |[2,*] :count Σχόλια',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Αποθήκευση Σχολίου',
'comment_new' => 'Νέο Σχόλιο',
'comment_created' => 'σχολίασε :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Σχόλιο διαγράφηκε',
'comment_created_success' => 'Το σχόλιο προστέθηκε',
'comment_updated_success' => 'Το σχόλιο ενημερώθηκε',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το σχόλιο;',
'comment_in_reply_to' => 'Σε απάντηση στο :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Here are the comments that have been left on this page. Comments can be added & managed when viewing the saved page.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Create',
'update' => 'Update',
'edit' => 'Edit',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Sort',
'move' => 'Move',
'copy' => 'Copy',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Set Changelog',
'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
'pages_edit_enter_changelog' => 'Enter Changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Comment',
'comments' => 'Comments',
'comment_add' => 'Add Comment',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Leave a comment here',
'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Save Comment',
'comment_new' => 'New Comment',
'comment_created' => 'commented :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Comment deleted',
'comment_created_success' => 'Comment added',
'comment_updated_success' => 'Comment updated',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
'comment_in_reply_to' => 'In reply to :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Here are the comments that have been left on this page. Comments can be added & managed when viewing the saved page.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Crear',
'update' => 'Actualizar',
'edit' => 'Editar',
'archive' => 'Archivar',
'unarchive' => 'Desarchivar',
'sort' => 'Ordenar',
'move' => 'Mover',
'copy' => 'Copiar',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Contenido Estable)',
'pages_edit_switch_to_wysiwyg' => 'Cambiar a Editor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Cambiar a nuevo editor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(En alfa)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(En prueba beta)',
'pages_edit_set_changelog' => 'Ajustar Log de cambios',
'pages_edit_enter_changelog_desc' => 'Introduzca una breve descripción de los cambios que ha realizado',
'pages_edit_enter_changelog' => 'Entrar al Log de cambios',
@@ -392,8 +392,11 @@ return [
'comment' => 'Comentario',
'comments' => 'Comentarios',
'comment_add' => 'Añadir Comentario',
'comment_none' => 'No hay comentarios para mostrar',
'comment_placeholder' => 'Introduzca su comentario aquí',
'comment_count' => '{0} Sin Comentarios|{1} 1 Comentario|[2,*] :count Comentarios',
'comment_thread_count' => ':count hilo de comentarios|:count hilos de comentarios',
'comment_archived_count' => ':count Archivados',
'comment_archived_threads' => 'Hilos archivados',
'comment_save' => 'Guardar comentario',
'comment_new' => 'Nuevo Comentario',
'comment_created' => 'comentado :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Comentario borrado',
'comment_created_success' => 'Comentario añadido',
'comment_updated_success' => 'Comentario actualizado',
'comment_archive_success' => 'Comentario archivado',
'comment_unarchive_success' => 'Comentario desarchivado',
'comment_view' => 'Ver comentario',
'comment_jump_to_thread' => 'Ir al hilo',
'comment_delete_confirm' => '¿Está seguro de que quiere borrar este comentario?',
'comment_in_reply_to' => 'En respuesta a :commentId',
'comment_reference' => 'Referencia',
'comment_reference_outdated' => '(obsoleto)',
'comment_editor_explain' => 'Estos son los comentarios que se han escrito en esta página. Los comentarios se pueden añadir y administrar cuando se ve la página guardada.',
// Revision

View File

@@ -10,7 +10,7 @@ return [
'page_create_notification' => 'Página creada correctamente',
'page_update' => 'página actualizada',
'page_update_notification' => 'Página actualizada correctamente',
'page_delete' => 'página borrada',
'page_delete' => 'borró la página',
'page_delete_notification' => 'Página eliminada correctamente',
'page_restore' => 'página restaurada',
'page_restore_notification' => 'Página restaurada correctamente',
@@ -96,7 +96,7 @@ return [
'user_create' => 'usuario creado',
'user_create_notification' => 'Usuario creado correctamente',
'user_update' => 'usuario actualizado',
'user_update_notification' => 'Usuario actualizado correctamente',
'user_update_notification' => 'Usuario actualizado con éxito',
'user_delete' => 'usuario eliminado',
'user_delete_notification' => 'El usuario fue eliminado correctamente',
@@ -129,11 +129,11 @@ return [
// Sort Rules
'sort_rule_create' => 'regla de ordenación creada',
'sort_rule_create_notification' => 'Rol de ordenación creada con éxito',
'sort_rule_create_notification' => 'Regla de ordenación creada correctamente',
'sort_rule_update' => 'regla de ordenación actualizada',
'sort_rule_update_notification' => 'Regla de ordenación actualizada correctamente',
'sort_rule_delete' => 'regla de ordenación eliminada',
'sort_rule_delete_notification' => 'Rol de ordenación borrada con éxito',
'sort_rule_delete_notification' => 'Regla de ordenación eliminada correctamente',
// Other
'permissions_update' => 'permisos actualizados',

View File

@@ -6,12 +6,12 @@
*/
return [
'failed' => 'Las credenciales no concuerdan con nuestros registros.',
'throttle' => 'Demasiados intentos fallidos de conexión. Por favor intente nuevamente en :seconds segundos.',
'failed' => 'Estas credenciales no concuerdan con nuestros registros.',
'throttle' => 'Demasiados intentos fallidos de inicio de sesión. Por favor intente nuevamente en :seconds segundos.',
// Login & Register
'sign_up' => 'Registrarse',
'log_in' => 'Acceder',
'log_in' => 'Iniciar sesión',
'log_in_with' => 'Acceder con :socialDriver',
'sign_up_with' => 'Registrarse con :socialDriver',
'logout' => 'Salir',
@@ -91,7 +91,7 @@ return [
'mfa_option_totp_title' => 'Aplicación móvil',
'mfa_option_totp_desc' => 'Para utilizar la autenticación en dos pasos necesitará una aplicación móvil que soporte TOTP como Google Authenticator, Authy o Microsoft Authenticator.',
'mfa_option_backup_codes_title' => 'Códigos de Respaldo',
'mfa_option_backup_codes_desc' => 'Genera un conjunto de códigos de seguridad de un solo uso que ingresará al iniciar sesión para verificar su identidad. Asegúrese de guardarlos en un lugar seguro.',
'mfa_option_backup_codes_desc' => 'Genera un conjunto de códigos de respaldo de un único uso que ingresará al iniciar sesión para verificar su identidad. Asegúrese de guardarlos en un lugar seguro.',
'mfa_gen_confirm_and_enable' => 'Confirmar y Activar',
'mfa_gen_backup_codes_title' => 'Configuración de Códigos de Respaldo',
'mfa_gen_backup_codes_desc' => 'Guarde la siguiente lista de códigos en un lugar seguro. Al acceder al sistema podrá usar uno de los códigos como un segundo mecanismo de autenticación.',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Crear',
'update' => 'Actualizar',
'edit' => 'Editar',
'archive' => 'Archivar',
'unarchive' => 'Desarchivar',
'sort' => 'Ordenar',
'move' => 'Mover',
'copy' => 'Copiar',

View File

@@ -148,7 +148,7 @@ return [
'url' => 'URL',
'text_to_display' => 'Texto a mostrar',
'title' => 'Título',
'browse_links' => 'Ver enlaces',
'browse_links' => 'Explorar enlaces',
'open_link' => 'Abrir enlace',
'open_link_in' => 'Abrir enlace en...',
'open_link_current' => 'Ventana actual',

View File

@@ -23,7 +23,7 @@ return [
'meta_updated' => 'Actualizado el :timeLength',
'meta_updated_name' => 'Actualizado el :timeLength por :user',
'meta_owned_name' => 'Propiedad de :user',
'meta_reference_count' => 'Referido en :count página | Referido en :count paginas',
'meta_reference_count' => 'Referido en :count página | Referido en :count páginas',
'entity_select' => 'Seleccione entidad',
'entity_select_lack_permission' => 'No tiene los permisos necesarios para seleccionar este elemento',
'images' => 'Imágenes',
@@ -40,21 +40,21 @@ return [
'export_text' => 'Archivo de texto plano',
'export_md' => 'Archivo Markdown',
'export_zip' => 'ZIP portable',
'default_template' => 'Plantilla de página por defecto',
'default_template_explain' => 'Asigne una plantilla de página que se utilizará como contenido predeterminado para todas las páginas creadas en este elemento. Tenga en cuenta que esto sólo se utilizará si el creador de páginas tiene acceso a la plantilla de página elegida.',
'default_template' => 'Plantilla de página predeterminada',
'default_template_explain' => 'Asigne una plantilla de página que se utilizará como contenido predeterminado para todas las páginas creadas en este elemento. Tenga en cuenta que esto sólo se utilizará si el creador de las páginas tiene acceso a la plantilla de página elegida.',
'default_template_select' => 'Seleccione una página de plantilla',
'import' => 'Importar',
'import_validate' => 'Validar importación',
'import_desc' => 'Importar libros, capítulos y páginas usando una exportación zip portable de la misma o distinta instancia. Seleccione un archivo ZIP para continuar. Después de que el archivo haya sido subido y validado, podrá configurar y confirmar la importación en la siguiente vista.',
'import_desc' => 'Importar libros, capítulos y páginas usando una exportación zip portable de la misma instancia u otra distinta. Seleccione un archivo ZIP para continuar. Después de que el archivo haya sido subido y validado, podrá configurar y confirmar la importación en la siguiente vista.',
'import_zip_select' => 'Seleccione archivo ZIP a subir',
'import_zip_validation_errors' => 'Se detectaron errores al validar el archivo ZIP proporcionado:',
'import_pending' => 'Importaciones pendientes',
'import_pending_none' => 'No se han iniciado importaciones.',
'import_continue' => 'Continuar importación',
'import_pending_none' => 'No se iniciaron importaciones.',
'import_continue' => 'Continuar la importación',
'import_continue_desc' => 'Revise el contenido que debe importarse del archivo ZIP subido. Cuando esté listo, ejecute la importación para añadir su contenido a este sistema. El archivo de importación ZIP subido se eliminará automáticamente al terminar la importación correctamente.',
'import_details' => 'Detalles de la Importación',
'import_run' => 'Ejecutar Importación',
'import_size' => ':size tamaño archivo ZIP',
'import_run' => 'Ejecutar la importación',
'import_size' => ':size tamaño del archivo ZIP',
'import_uploaded_at' => 'Subido :relativeTime',
'import_uploaded_by' => 'Subido por',
'import_location' => 'Ubicación de Importación',
@@ -62,11 +62,11 @@ return [
'import_delete_confirm' => '¿Está seguro de que desea eliminar esta importación?',
'import_delete_desc' => 'Esto eliminará el archivo ZIP de importación subido y no se puede deshacer.',
'import_errors' => 'Errores de Importación',
'import_errors_desc' => 'Se han producido los siguientes errores durante el intento de importación:',
'import_errors_desc' => 'Se produjeron los siguientes errores durante el intento de importación:',
// Permissions and restrictions
'permissions' => 'Permisos',
'permissions_desc' => 'Establezca los permisos aquí para reemplazar los permisos por defecto proporcionados por los roles de usuario.',
'permissions_desc' => 'Establezca los permisos aquí para reemplazar los permisos predeterminados proporcionados por los roles de usuario.',
'permissions_book_cascade' => 'Los permisos establecidos en los libros se aplicarán a los capítulos contenidos y las páginas contenidas, a menos que tengan sus propios permisos definidos.',
'permissions_chapter_cascade' => 'Los permisos establecidos en los capítulos se aplicarán a las páginas contenidas, a menos que tengan sus propios permisos definidos.',
'permissions_save' => 'Guardar permisos',
@@ -74,7 +74,7 @@ return [
'permissions_role_everyone_else' => 'Todos los demás',
'permissions_role_everyone_else_desc' => 'Establecer permisos para todos los roles no específicamente reemplazados.',
'permissions_role_override' => 'Reemplazar permisos para el rol',
'permissions_inherit_defaults' => 'Heredar valores por defecto',
'permissions_inherit_defaults' => 'Heredar valores predeterminados',
// Search
'search_results' => 'Buscar resultados',
@@ -166,7 +166,7 @@ return [
'books_search_this' => 'Buscar en este libro',
'books_navigation' => 'Navegación de libro',
'books_sort' => 'Organizar contenido de libro',
'books_sort_desc' => 'Mueve capítulos y páginas dentro de un libro para reorganizar su contenido. Se pueden añadir otros libros que permiten mover fácilmente capítulos y páginas entre libros. Opcionalmente, se puede establecer una regla de ordenación automática para ordenar automáticamente el contenido de este libro cuando haya cambios.',
'books_sort_desc' => 'Mueve capítulos y páginas dentro de un libro para reorganizar su contenido. Se pueden añadir otros libros que permiten mover fácilmente capítulos y páginas entre libros. Opcionalmente, se puede establecer una regla de ordenación automática para el contenido de este libro cuando haya cambios.',
'books_sort_auto_sort' => 'Opción de ordenación automática',
'books_sort_auto_sort_active' => 'Opción de ordenación activa: sortName',
'books_sort_named' => 'Organizar libro :bookName',
@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Contenido Estable)',
'pages_edit_switch_to_wysiwyg' => 'Cambiar a Editor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Cambiar a nuevo editor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(En alfa)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(En prueba beta)',
'pages_edit_set_changelog' => 'Establecer cambios de registro',
'pages_edit_enter_changelog_desc' => 'Introduzca una breve descripción de los cambios que ha realizado',
'pages_edit_enter_changelog' => 'Entrar en cambio de registro',
@@ -269,7 +269,7 @@ return [
'pages_md_show_preview' => 'Mostrar vista previa',
'pages_md_sync_scroll' => 'Sincronizar desplazamiento de vista previa',
'pages_drawing_unsaved' => 'Encontrado dibujo sin guardar',
'pages_drawing_unsaved_confirm' => 'Se encontraron datos no guardados del dibujo de un intento de guardado fallido. ¿Desea restaurar y continuar editando el dibujo no guardado?',
'pages_drawing_unsaved_confirm' => 'Se encontraron datos del dibujo no guardados durante un intento de guardado fallido anterior. ¿Desea restaurar y continuar editando el dibujo no guardado?',
'pages_not_in_chapter' => 'La página no esá en el capítulo',
'pages_move' => 'Mover página',
'pages_copy' => 'Copiar página',
@@ -392,8 +392,11 @@ return [
'comment' => 'Comentario',
'comments' => 'Comentarios',
'comment_add' => 'Agregar comentario',
'comment_none' => 'No hay comentarios para mostrar',
'comment_placeholder' => 'DEjar un comentario aquí',
'comment_count' => '{0} Sin Comentarios|{1} 1 Comentario|[2,*] :count Comentarios',
'comment_thread_count' => ':count Hilo de Comentarios|:count Hilos de Comentarios',
'comment_archived_count' => ':count Archivados',
'comment_archived_threads' => 'Hilos Archivados',
'comment_save' => 'Guardar comentario',
'comment_new' => 'Nuevo comentario',
'comment_created' => 'comentado :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Comentario borrado',
'comment_created_success' => 'Comentario agregado',
'comment_updated_success' => 'Comentario actualizado',
'comment_archive_success' => 'Comentario archivado',
'comment_unarchive_success' => 'Comentario no archivado',
'comment_view' => 'Ver comentario',
'comment_jump_to_thread' => 'Ir al hilo',
'comment_delete_confirm' => '¿Está seguro que quiere borrar este comentario?',
'comment_in_reply_to' => 'En respuesta a :commentId',
'comment_reference' => 'Referencia',
'comment_reference_outdated' => '(Obsoleto)',
'comment_editor_explain' => 'Estos son los comentarios que se escribieron en esta página. Los comentarios se pueden añadir y administrar cuando se visualiza la página guardada.',
// Revision
@@ -434,29 +443,29 @@ return [
// References
'references' => 'Referencias',
'references_none' => 'No hay referencias a este elemento.',
'references_to_desc' => 'A continuación se muestran todas las páginas en el sistema que enlazan a este elemento.',
'references_to_desc' => 'A continuación se muestra todo el contenido conocido en el sistema que enlaza a este elemento.',
// Watch Options
'watch' => 'Suscribirme',
'watch_title_default' => 'Preferencias por defecto',
'watch_desc_default' => 'Revertir suscripciones a tus preferencias de notificación por defecto.',
'watch_title_default' => 'Preferencias Predeterminadas',
'watch_desc_default' => 'Revertir las suscripciones a solo tus preferencias de notificación predeterminadas.',
'watch_title_ignore' => 'Ignorar',
'watch_desc_ignore' => 'Ignorar todas las notificaciones, incluyendo las de las preferencias a nivel de usuario.',
'watch_title_new' => 'Nuevas páginas',
'watch_desc_ignore' => 'Ignorar todas las notificaciones, incluyendo las de preferencias a nivel de usuario.',
'watch_title_new' => 'Páginas Nuevas',
'watch_desc_new' => 'Notificar cuando se crea una nueva página dentro de este elemento.',
'watch_title_updates' => 'Todas las actualizaciones de páginas',
'watch_desc_updates' => 'Notificar todos los cambios de páginas y páginas nuevas.',
'watch_desc_updates_page' => 'Notificar todos los cambios en la página.',
'watch_title_comments' => 'Todas las actualizaciones de páginas y comentarios',
'watch_desc_comments' => 'Notificar sobre todas las páginas nuevas, cambios de página y nuevos comentarios.',
'watch_title_updates' => 'Todas las actualizaciones de página',
'watch_desc_updates' => 'Notificar todas las páginas nuevas y todos los cambios de página.',
'watch_desc_updates_page' => 'Notificar todos los cambios de página.',
'watch_title_comments' => 'Todas las actualizaciones y comentarios de página',
'watch_desc_comments' => 'Notificar todas las páginas nuevas, todos los cambios de página y todos los nuevos comentarios.',
'watch_desc_comments_page' => 'Notificar los cambios en las páginas y los nuevos comentarios.',
'watch_change_default' => 'Cambiar preferencias de notificación por defecto',
'watch_detail_ignore' => 'Ignorar notificaciones',
'watch_change_default' => 'Cambiar preferencias de notificación predeterminadas',
'watch_detail_ignore' => 'Ignorando notificaciones',
'watch_detail_new' => 'Suscripciones de nuevas páginas',
'watch_detail_updates' => 'Suscripciones de nuevas páginas y actualizaciones de páginas',
'watch_detail_comments' => 'Suscripciones de nuevas páginas, actualizaciones de páginas y comentarios',
'watch_detail_parent_book' => 'Subscripciones por libro contenedor',
'watch_detail_parent_book_ignore' => 'Ignorando a través del libro contenedor',
'watch_detail_parent_chapter' => 'Subscripciones por capítulo superior',
'watch_detail_parent_chapter_ignore' => 'Ignorar por capítulo superior',
'watch_detail_parent_chapter' => 'Subscripciones por capítulo contenedor',
'watch_detail_parent_chapter_ignore' => 'Ignorar por capítulo contenedor',
];

View File

@@ -78,7 +78,7 @@ return [
// Users
'users_cannot_delete_only_admin' => 'No se puede borrar el único administrador',
'users_cannot_delete_guest' => 'No se puede borrar el usuario invitado',
'users_could_not_send_invite' => 'No se pudo crear el usuario porque no se pudo enviar el correo de invitación',
'users_could_not_send_invite' => 'No se creó el usuario porque no se pudo enviar el correo de invitación',
// Roles
'role_cannot_be_edited' => 'Este rol no puede ser editado',
@@ -107,9 +107,9 @@ return [
// Import
'import_zip_cant_read' => 'No se pudo leer el archivo ZIP.',
'import_zip_cant_decode_data' => 'No se pudo encontrar y decodificar el archivo data.json. en el archivo ZIP.',
'import_zip_no_data' => 'Los datos del archivo ZIP no contienen ningún libro, capítulo o contenido de página.',
'import_validation_failed' => 'Error al validar la importación del ZIP con errores:',
'import_zip_cant_decode_data' => 'No se pudo encontrar ni decodificar el contenido del archivo ZIP data.json.',
'import_zip_no_data' => 'Los datos del archivo ZIP no tienen un libro, un capítulo o contenido de página en su contenido.',
'import_validation_failed' => 'Error al validar la importación del ZIP con los errores:',
'import_zip_failed_notification' => 'Error al importar archivo ZIP.',
'import_perms_books' => 'Le faltan los permisos necesarios para crear libros.',
'import_perms_chapters' => 'Le faltan los permisos necesarios para crear capítulos.',
@@ -129,5 +129,5 @@ return [
'maintenance_test_email_failure' => 'Error al enviar un email de prueba:',
// HTTP errors
'http_ssr_url_no_match' => 'La URL no coincide con los hosts SSR permitidos',
'http_ssr_url_no_match' => 'La URL no coincide con los hosts SSR configurados como permitidos',
];

View File

@@ -5,11 +5,11 @@
return [
'new_comment_subject' => 'Nuevo comentario en la página: :pageName',
'new_comment_intro' => 'Un usuario ha comentado en una página de :appName:',
'new_page_subject' => 'Nueva página: :pageName',
'new_page_intro' => 'Una nueva página ha sido creada en :appName:',
'new_comment_intro' => 'Un usuario comentó en una página de :appName:',
'new_page_subject' => 'Página nueva: :pageName',
'new_page_intro' => 'Se creó una nueva página en :appName:',
'updated_page_subject' => 'Página actualizada: :pageName',
'updated_page_intro' => 'Una página ha sido actualizada en :appName:',
'updated_page_intro' => 'Se actualizó una página en :appName:',
'updated_page_debounce' => 'Para evitar una avalancha de notificaciones, durante un tiempo no se enviarán notificaciones sobre más ediciones de esta página por el mismo editor.',
'detail_page_name' => 'Nombre de la página:',

View File

@@ -8,7 +8,7 @@ return [
'my_account' => 'Mi cuenta',
'shortcuts' => 'Atajos',
'shortcuts_interface' => 'Preferencias de acceso directo en la interfaz',
'shortcuts_interface' => 'Preferencias de atajos en la interfaz',
'shortcuts_toggle_desc' => 'Aquí puede activar o desactivar los accesos rápidos de la interfaz, utilizados para la navegación y las acciones.',
'shortcuts_customize_desc' => 'Puede personalizar cada uno de los atajos a continuación. Simplemente pulse la combinación de teclas deseada después de seleccionar la entrada para un atajo.',
'shortcuts_toggle_label' => 'Atajos de teclado habilitados',
@@ -21,31 +21,31 @@ return [
'notifications' => 'Preferencias de notificaciones',
'notifications_desc' => 'Controle las notificaciones por correo electrónico que recibe cuando se realiza cierta actividad dentro del sistema.',
'notifications_opt_own_page_changes' => 'Notificar sobre los cambios en las páginas en las que soy propietario',
'notifications_opt_own_page_comments' => 'Notificar sobre comentarios en las páginas en las que soy propietario',
'notifications_opt_own_page_changes' => 'Notificar sobre los cambios en las páginas de las que soy propietario',
'notifications_opt_own_page_comments' => 'Notificar sobre comentarios en las páginas de las que soy propietario',
'notifications_opt_comment_replies' => 'Notificar sobre respuestas a mis comentarios',
'notifications_save' => 'Guardar preferencias',
'notifications_update_success' => '¡Se han actualizado las preferencias de notificaciones!',
'notifications_watched' => 'Elementos vistos e ignorados',
'notifications_update_success' => '¡Se actualizaron las preferencias de notificaciones!',
'notifications_watched' => 'Elementos vigilados e ignorados',
'notifications_watched_desc' => 'A continuación se muestran los elementos que tienen preferencias personalizadas de monitorización. Para actualizar sus preferencias, vea el artículo y las opciones se mostrarán en la barra lateral.',
'auth' => 'Acceso y seguridad',
'auth_change_password' => 'Cambiar contraseña',
'auth_change_password_desc' => 'Cambie la contraseña que utiliza para iniciar sesión en la aplicación. Debe tener al menos 8 caracteres.',
'auth_change_password_success' => La contraseña ha sido actualizada!',
'auth_change_password_success' => Se actualizó la contraseña!',
'profile' => 'Detalles del perfil',
'profile_desc' => 'Administre los detalles de su cuenta que le representa a otros usuarios, además de los detalles que se utilizan para la comunicación y la personalización del sistema.',
'profile_view_public' => 'Ver perfil público',
'profile_desc' => 'Administre los detalles de su cuenta que lo representan ante otros usuarios, además de los detalles que se utilizan para la comunicación y la personalización del sistema.',
'profile_view_public' => 'Ver Perfil Público',
'profile_name_desc' => 'Configure el nombre que será visible para otros usuarios del sistema a través de la actividad que realiza, y el contenido que posee.',
'profile_email_desc' => 'Este correo electrónico se utilizará para las notificaciones y, dependiendo de la autenticación activa del sistema, el acceso del sistema.',
'profile_email_desc' => 'Este correo electrónico se utilizará para las notificaciones y, dependiendo de la autenticación activa del sistema, para el acceso al sistema.',
'profile_email_no_permission' => 'Lamentablemente no tiene permiso para cambiar su dirección de correo electrónico. Si desea cambiar esto, necesitará pedir a un administrador que lo cambie por usted.',
'profile_avatar_desc' => 'Seleccione una imagen pública que verán los demás en el sistema. Idealmente esta imagen debe ser cuadrada y alrededor de 256px de anchura y altura.',
'profile_admin_options' => 'Opciones de administrador',
'profile_admin_options_desc' => 'Opciones adicionales de administrador, como por ejemplo administrar asignaciones de rol, se pueden encontrar para su cuenta de usuario en el área de "Ajustes > Usuarios" de la aplicación.',
'profile_avatar_desc' => 'Seleccione una imagen que se utilizará para representarlo ante los demás en el sistema. Idealmente esta imagen debe ser cuadrada y alrededor de 256px de ancho y alto.',
'profile_admin_options' => 'Opciones de Administrador',
'profile_admin_options_desc' => 'Opciones adicionales de nivel de administrador, como aquellas para administrar asignaciones de rol, se pueden encontrar para su cuenta de usuario en el área de "Ajustes > Usuarios" de la aplicación.',
'delete_account' => 'Eliminar cuenta',
'delete_my_account' => 'Eliminar mi cuenta',
'delete_account' => 'Eliminar Cuenta',
'delete_my_account' => 'Eliminar Mi Cuenta',
'delete_my_account_desc' => 'Esto eliminará completamente su cuenta de usuario del sistema. No podrá recuperar esta cuenta o revertir esta acción. El contenido que ha creado, como páginas creadas e imágenes subidas, permanecerá.',
'delete_my_account_warning' => '¿Está seguro de que desea eliminar su cuenta?',
];

View File

@@ -75,10 +75,10 @@ return [
'reg_confirm_restrict_domain_placeholder' => 'Ninguna restricción establecida',
// Sorting Settings
'sorting' => 'Ordenación',
'sorting_book_default' => 'Orden por defecto del libro',
'sorting' => 'Ordenando',
'sorting_book_default' => 'Orden predeterminado del libro',
'sorting_book_default_desc' => 'Seleccione la regla de ordenación predeterminada para aplicar a nuevos libros. Esto no afectará a los libros existentes, y puede ser anulado por libro.',
'sorting_rules' => 'Reglas de ordenación',
'sorting_rules' => 'Reglas de Ordenación',
'sorting_rules_desc' => 'Son operaciones de ordenación predefinidas que se pueden aplicar al contenido en el sistema.',
'sort_rule_assigned_to_x_books' => 'Asignado a :count libro | Asignado a :count libros',
'sort_rule_create' => 'Crear regla de ordenación',
@@ -86,13 +86,13 @@ return [
'sort_rule_delete' => 'Eliminar regla de ordenación',
'sort_rule_delete_desc' => 'Eliminar esta regla de ordenación del sistema. Los Libros que utilicen este tipo se revertirán a la ordenación manual.',
'sort_rule_delete_warn_books' => 'Esta regla de ordenación se utiliza actualmente en :count libro(s). ¿Está seguro que desea eliminarla?',
'sort_rule_delete_warn_default' => 'Esta regla de ordenación se utiliza actualmente como predeterminado para los libros. ¿Está seguro de que desea eliminarla?',
'sort_rule_delete_warn_default' => 'Esta regla de ordenación se utiliza actualmente como predeterminada para los libros. ¿Está seguro de que desea eliminarla?',
'sort_rule_details' => 'Detalles de la regla de ordenación',
'sort_rule_details_desc' => 'Establezca un nombre para esta regla de ordenación, que aparecerá en las listas cuando los usuarios estén seleccionando un orden.',
'sort_rule_operations' => 'Operaciones de ordenación',
'sort_rule_operations_desc' => 'Configure las acciones de ordenación a realizar moviéndolas de la lista de operaciones disponibles. Al usarse, las operaciones se aplicarán en orden, de arriba a abajo. Cualquier cambio realizado aquí se aplicará a todos los libros asignados al guardar.',
'sort_rule_available_operations' => 'Operaciones disponibles',
'sort_rule_available_operations_empty' => 'No hay operaciones restantes',
'sort_rule_available_operations_empty' => 'No hay operaciones pendientes',
'sort_rule_configured_operations' => 'Operaciones configuradas',
'sort_rule_configured_operations_empty' => 'Arrastrar/añadir operaciones desde la lista de "Operaciones disponibles"',
'sort_rule_op_asc' => '(Asc)',
@@ -225,7 +225,7 @@ return [
'users_send_invite_text' => 'Puede optar por enviar a este usuario un correo electrónico de invitación que les permita establecer su propia contraseña; de lo contrario, puede establecerla contraseña usted mismo.',
'users_send_invite_option' => 'Enviar correo electrónico de invitación al usuario.',
'users_external_auth_id' => 'ID externo de autenticación',
'users_external_auth_id_desc' => 'Cuando un sistema de autenticación externa está en uso (como SAML2, OIDC o LDAP) este es el ID que vincula este usuario de BookStack a la cuenta del sistema de autenticación. Puede ignorar este campo si utiliza la autenticación por defecto basada en correo electrónico.',
'users_external_auth_id_desc' => 'Cuando se usa un sistema de autenticación externa (como SAML2, OIDC o LDAP) este es el ID que vincula este usuario de BookStack a la cuenta del sistema de autenticación. Puede ignorar este campo si utiliza la autenticación por defecto basada en correo electrónico.',
'users_password_warning' => 'Solo complete lo siguiente si desea cambiar la contraseña para este usuario.',
'users_system_public' => 'Este usuario representa cualquier usuario invitado que visita la aplicación. No puede utilizarse para hacer login sino que es asignado automáticamente.',
'users_delete' => 'Borrar usuario',
@@ -312,10 +312,10 @@ return [
'licenses' => 'Licencias',
'licenses_desc' => 'Esta página detalla información sobre la licencia de BookStack además de los proyectos y bibliotecas que se utilizan en BookStack. Muchos proyectos enumerados aquí pueden ser utilizados solo en un contexto de desarrollo.',
'licenses_bookstack' => 'Licencia BookStack',
'licenses_php' => 'Licencias de la biblioteca PHP',
'licenses_js' => 'Licencias de la biblioteca JavaScript',
'licenses_php' => 'Licencias de Bibliotecas PHP',
'licenses_js' => 'Licencias de Bibliotecas JavaScript',
'licenses_other' => 'Otras Licencias',
'license_details' => 'Datos de la licencia',
'license_details' => 'Detalles de la licencia',
//! If editing translations files directly please ignore this in all
//! languages apart from en. Content will be auto-copied from en.

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Lisa',
'update' => 'Uuenda',
'edit' => 'Muuda',
'archive' => 'Arhiveeri',
'unarchive' => 'Taasta arhiivist',
'sort' => 'Sorteeri',
'move' => 'Liiguta',
'copy' => 'Kopeeri',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stabiilne sisu)',
'pages_edit_switch_to_wysiwyg' => 'Kasuta WYSIWYG redaktorit',
'pages_edit_switch_to_new_wysiwyg' => 'Kasuta uut tekstiredaktorit',
'pages_edit_switch_to_new_wysiwyg_desc' => '(Alfa-testimisel)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(beetatestimisel)',
'pages_edit_set_changelog' => 'Muudatuste logi',
'pages_edit_enter_changelog_desc' => 'Sisesta tehtud muudatuste lühikirjeldus',
'pages_edit_enter_changelog' => 'Salvesta muudatuste logi',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentaar',
'comments' => 'Kommentaarid',
'comment_add' => 'Lisa kommentaar',
'comment_none' => 'Pole kommentaare, mida kuvada',
'comment_placeholder' => 'Jäta siia kommentaar',
'comment_count' => '{0} Kommentaare pole|{1} 1 kommentaar|[2,*] :count kommentaari',
'comment_thread_count' => ':count kommentaarilõim|:count kommentaarilõime',
'comment_archived_count' => ':count arhiveeritud',
'comment_archived_threads' => 'Arhiveeritud lõimed',
'comment_save' => 'Salvesta kommentaar',
'comment_new' => 'Uus kommentaar',
'comment_created' => 'kommenteeris :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Kommentaar kustutatud',
'comment_created_success' => 'Kommentaar lisatud',
'comment_updated_success' => 'Kommentaar muudetud',
'comment_archive_success' => 'Kommentaar arhiveeritud',
'comment_unarchive_success' => 'Kommentaar arhiivist taastatud',
'comment_view' => 'Vaata kommentaari',
'comment_jump_to_thread' => 'Hüppa lõime juurde',
'comment_delete_confirm' => 'Kas oled kindel, et soovid selle kommentaari kustutada?',
'comment_in_reply_to' => 'Vastus kommentaarile :commentId',
'comment_reference' => 'Viide',
'comment_reference_outdated' => '(Aegunud)',
'comment_editor_explain' => 'Siin on lehele jäetud kommentaarid. Kommentaare saab lisada ja hallata salvestatud lehte vaadates.',
// Revision

View File

@@ -10,7 +10,7 @@ return [
// Auth
'error_user_exists_different_creds' => 'See e-posti aadress on juba seotud teise kasutajaga.',
'auth_pre_register_theme_prevention' => 'Etteantud detailidega kasutajakontot ei saadud registreerida',
'auth_pre_register_theme_prevention' => 'Etteantud detailidega kasutajakontot ei õnnestunud registreerida',
'email_already_confirmed' => 'E-posti aadress on juba kinnitatud. Proovi sisse logida.',
'email_confirmation_invalid' => 'Kinnituslink ei ole kehtiv või on seda juba kasutatud. Proovi uuesti registreeruda.',
'email_confirmation_expired' => 'Kinnituslink on aegunud. Sulle saadeti aadressi kinnitamiseks uus e-kiri.',
@@ -78,7 +78,7 @@ return [
// Users
'users_cannot_delete_only_admin' => 'Ainsat administraatorit ei saa kustutada',
'users_cannot_delete_guest' => 'Külaliskasutajat ei saa kustutada',
'users_could_not_send_invite' => 'Kasutajat ei saadud luua, kuna kutse e-kirja saatmine ebaõnnestus',
'users_could_not_send_invite' => 'Kasutajat ei õnnestunud luua, kuna kutse e-kirja saatmine ebaõnnestus',
// Roles
'role_cannot_be_edited' => 'Seda rolli ei saa muuta',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Sortu',
'update' => 'Eguneratu',
'edit' => 'Editatu',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Ordenatu',
'move' => 'Mugitu',
'copy' => 'Kopiatu',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Alpha Testing)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Set Changelog',
'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
'pages_edit_enter_changelog' => 'Enter Changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Iruzkina',
'comments' => 'Iruzkinak',
'comment_add' => 'Iruzkina gehitu',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Utzi iruzkin bat hemen',
'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Iruzkina gorde',
'comment_new' => 'Iruzkin berria',
'comment_created' => 'commented :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Comment deleted',
'comment_created_success' => 'Iruzkina gehituta',
'comment_updated_success' => 'Iruzkina gehituta',
'comment_archive_success' => 'Comment archived',
'comment_unarchive_success' => 'Comment un-archived',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Ziur zaude iruzkin hau ezabatu nahi duzula?',
'comment_in_reply_to' => 'In reply to :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Here are the comments that have been left on this page. Comments can be added & managed when viewing the saved page.',
// Revision

Some files were not shown because too many files have changed in this diff Show More