Compare commits

..

65 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
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
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
Talstra Ruben SRSNL
da82e70ca3 Add optional OIDC avatar fetching from the “picture” claim 2025-01-20 17:21:46 +01:00
245 changed files with 4343 additions and 1796 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

@@ -487,3 +487,5 @@ jellium :: French
Qxlkdr :: Swedish
Hari (muhhari) :: Indonesian
仙君御 (xjy) :: Chinese Simplified
TapioM :: Finnish
lingb58 :: Chinese Traditional

6
.gitignore vendored
View File

@@ -8,10 +8,10 @@ Homestead.yaml
.idea
npm-debug.log
yarn-error.log
/public/dist/*.map
/public/dist
/public/plugins
/public/css/*.map
/public/js/*.map
/public/css
/public/js
/public/bower
/public/build/
/public/favicon.ico

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

@@ -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

@@ -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,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
{

528
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

@@ -1 +1 @@
14f76e2e52f92d4de8b99aabfc7c0a66e8102395a156fb2dda33ad57293759f5
22e02ee72d21ff719c1073abbec8302f8e2096ba6d072e133051064ed24b45b1

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
@@ -3832,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

@@ -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' => 'التبديل إلى محرر ما تراه هو ما تحصل عليه الجديد -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

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

@@ -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

@@ -248,7 +248,7 @@ return [
'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' => '(In Alpha-Testphase)',
'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',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentar',
'comments' => 'Kommentare',
'comment_add' => 'Kommentieren',
'comment_none' => 'Keine Kommentare vorhanden',
'comment_placeholder' => 'Geben Sie hier Ihre Kommentare ein',
'comment_count' => '{0} Keine Kommentare|{1} 1 Kommentar|[2,*] :count Kommentare',
'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

@@ -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

@@ -248,7 +248,7 @@ return [
'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' => '(In Alpha-Testphase)',
'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',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentar',
'comments' => 'Kommentare',
'comment_add' => 'Kommentieren',
'comment_none' => 'Keine Kommentare vorhanden',
'comment_placeholder' => 'Gib hier deine Kommentare ein',
'comment_count' => '{0} Keine Kommentare|{1} 1 Kommentar|[2,*] :count Kommentare',
'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

@@ -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' => '(alfatestimisel)',
'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

@@ -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

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' => 'در اینجا نظراتی که در این صفحه گذاشته شده است، مشاهده می‌شود. نظرات را می‌توان در هنگام مشاهده صفحه ذخیره شده، اضافه و مدیریت کرد.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Luo',
'update' => 'Päivitä',
'edit' => 'Muokkaa',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Järjestä',
'move' => 'Siirrä',
'copy' => 'Kopioi',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Vakaa sisältö)',
'pages_edit_switch_to_wysiwyg' => 'Vaihda WYSIWYG-editoriin',
'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' => 'Aseta muutosloki',
'pages_edit_enter_changelog_desc' => 'Kirjoita lyhyt kuvaus tekemistäsi muutoksista',
'pages_edit_enter_changelog' => 'Syötä muutosloki',
@@ -392,8 +392,11 @@ return [
'comment' => 'Kommentti',
'comments' => 'Kommentit',
'comment_add' => 'Lisää kommentti',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Jätä kommentti tähän',
'comment_count' => '{0} Ei kommentteja|{1} 1 kommentti|[2,*] :count kommenttia',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Tallenna kommentti',
'comment_new' => 'Uusi kommentti',
'comment_created' => 'kommentoi :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Kommentti poistettu',
'comment_created_success' => 'Kommentti lisätty',
'comment_updated_success' => 'Kommentti päivitetty',
'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' => 'Haluatko varmasti poistaa tämän kommentin?',
'comment_in_reply_to' => 'Vastaus kommenttiin :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Tässä ovat sivulle jätetyt komentit. Kommentteja voi lisätä ja hallita, kun tarkastelet tallennettua sivua.',
// Revision

View File

@@ -10,7 +10,7 @@ return [
// Auth
'error_user_exists_different_creds' => 'Sähköpostiosoite :email on jo käytössä toisessa käyttäjätunnuksessa.',
'auth_pre_register_theme_prevention' => 'User account could not be registered for the provided details',
'auth_pre_register_theme_prevention' => 'Käyttäjätiliä ei voitu rekisteröidä annetuille tiedoille',
'email_already_confirmed' => 'Sähköposti on jo vahvistettu, yritä kirjautua sisään.',
'email_confirmation_invalid' => 'Tämä vahvistuslinkki ei ole voimassa tai sitä on jo käytetty, yritä rekisteröityä uudelleen.',
'email_confirmation_expired' => 'Vahvistuslinkki on vanhentunut, uusi vahvistussähköposti on lähetetty.',
@@ -38,7 +38,7 @@ Sovellus ei tunnista ulkoisen todennuspalvelun pyyntöä. Ongelman voi aiheuttaa
'social_driver_not_found' => 'Sosiaalisen median tilin ajuria ei löytynyt',
'social_driver_not_configured' => ':socialAccount-tilin asetuksia ei ole määritetty oikein.',
'invite_token_expired' => 'Tämä kutsulinkki on vanhentunut. Voit sen sijaan yrittää palauttaa tilisi salasanan.',
'login_user_not_found' => 'A user for this action could not be found.',
'login_user_not_found' => 'Käyttäjää tälle toiminnolle ei löytynyt.',
// System
'path_not_writable' => 'Tiedostopolkuun :filePath ei voitu ladata tiedostoa. Tarkista polun kirjoitusoikeudet.',
@@ -79,7 +79,7 @@ Sovellus ei tunnista ulkoisen todennuspalvelun pyyntöä. Ongelman voi aiheuttaa
// Users
'users_cannot_delete_only_admin' => 'Ainoaa ylläpitäjää ei voi poistaa',
'users_cannot_delete_guest' => 'Vieraskäyttäjää ei voi poistaa',
'users_could_not_send_invite' => 'Could not create user since invite email failed to send',
'users_could_not_send_invite' => 'Käyttäjää ei voitu luoda kutsun lähettämisen jälkeen',
// Roles
'role_cannot_be_edited' => 'Tätä roolia ei voi muokata',
@@ -107,16 +107,16 @@ Sovellus ei tunnista ulkoisen todennuspalvelun pyyntöä. Ongelman voi aiheuttaa
'back_soon' => 'Se palautetaan pian.',
// 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-tiedostoa ei voitu lukea.',
'import_zip_cant_decode_data' => 'ZIP-tiedoston data.json sisältöä ei löydy eikä sitä voitu purkaa.',
'import_zip_no_data' => 'ZIP-tiedostoilla ei ole odotettua kirjaa, lukua tai sivun sisältöä.',
'import_validation_failed' => 'Tuonti ZIP epäonnistui virheiden kanssa:',
'import_zip_failed_notification' => 'ZIP-tiedoston tuominen epäonnistui.',
'import_perms_books' => 'Sinulla ei ole tarvittavia oikeuksia luoda kirjoja.',
'import_perms_chapters' => 'Sinulla ei ole tarvittavia oikeuksia luoda kappaleita.',
'import_perms_pages' => 'Sinulla ei ole tarvittavia oikeuksia luoda sivuja.',
'import_perms_images' => 'Sinulla ei ole tarvittavia oikeuksia luoda kuvia.',
'import_perms_attachments' => 'Sinulla ei ole tarvittavaa lupaa luoda liitteitä.',
// API errors
'api_no_authorization_found' => 'Pyynnöstä ei löytynyt valtuutuskoodia',

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Créer',
'update' => 'Modifier',
'edit' => 'Éditer',
'archive' => 'Archiver',
'unarchive' => 'Désarchiver',
'sort' => 'Trier',
'move' => 'Déplacer',
'copy' => 'Copier',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Contenu stable)',
'pages_edit_switch_to_wysiwyg' => 'Basculer vers l\'éditeur WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Basculer vers le nouveau WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(En test Alpha)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Remplir le journal des changements',
'pages_edit_enter_changelog_desc' => 'Entrez une brève description des changements effectués',
'pages_edit_enter_changelog' => 'Ouvrir le journal des changements',
@@ -392,8 +392,11 @@ return [
'comment' => 'Commentaire',
'comments' => 'Commentaires',
'comment_add' => 'Ajouter un commentaire',
'comment_none' => 'Aucun commentaire à afficher',
'comment_placeholder' => 'Entrez vos commentaires ici',
'comment_count' => '{0} Pas de commentaires|{1} Un commentaire|[2,*] :count commentaires',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archivé',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Enregistrer le commentaire',
'comment_new' => 'Nouveau commentaire',
'comment_created' => 'commenté :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Commentaire supprimé',
'comment_created_success' => 'Commentaire ajouté',
'comment_updated_success' => 'Commentaire mis à jour',
'comment_archive_success' => 'Commentaire archivé',
'comment_unarchive_success' => 'Commentaire désarchiver',
'comment_view' => 'View comment',
'comment_jump_to_thread' => 'Jump to thread',
'comment_delete_confirm' => 'Êtes-vous sûr de vouloir supprimer ce commentaire ?',
'comment_in_reply_to' => 'En réponse à :commentId',
'comment_reference' => 'Référence',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Voici les commentaires qui ont été laissés sur cette page. Les commentaires peuvent être ajoutés et gérés en visualisant la page enregistrée.',
// 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' => 'הגדר יומן שינויים',
'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' => 'Stvori',
'update' => 'Ažuriraj',
'edit' => 'Uredi',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Razvrstaj',
'move' => 'Makni',
'copy' => 'Kopiraj',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stabilan Sadržaj)',
'pages_edit_switch_to_wysiwyg' => 'Prebaci se na WYSIWYG uređivač',
'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' => 'Postavi dnevnik promjena',
'pages_edit_enter_changelog_desc' => 'Ukratko opišite promjene koje ste napravili',
'pages_edit_enter_changelog' => 'Unesi dnevnik promjena',
@@ -392,8 +392,11 @@ return [
'comment' => 'Komentar',
'comments' => 'Komentari',
'comment_add' => 'Dodaj komentar',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Komentar ostavi ovdje',
'comment_count' => '{0} Nema komentara|{1} 1 Komentar|[2,*] :count Komentara',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Spremi komentar',
'comment_new' => 'Novi komentar',
'comment_created' => 'komentirano :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Izbrisani komentar',
'comment_created_success' => 'Dodani komentar',
'comment_updated_success' => 'Ažurirani komentar',
'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' => 'Jeste li sigurni da želite izbrisati ovaj komentar?',
'comment_in_reply_to' => 'Odgovor na :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Evo komentara koji su ostavljeni na ovoj stranici. Komentari se mogu dodavati i upravljati prilikom pregleda spremljene stranice.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Létrehozás',
'update' => 'Frissítés',
'edit' => 'Szerkesztés',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Rendezés',
'move' => 'Áthelyezés',
'copy' => 'Másolás',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stabil tartalom)',
'pages_edit_switch_to_wysiwyg' => 'Váltás a WYSIWYG szerkesztőre',
'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' => 'Változásnapló beállítása',
'pages_edit_enter_changelog_desc' => 'A végrehajtott módosítások rövid leírása',
'pages_edit_enter_changelog' => 'Változásnapló megadása',
@@ -392,8 +392,11 @@ return [
'comment' => 'Megjegyzés',
'comments' => 'Megjegyzések',
'comment_add' => 'Megjegyzés hozzáadása',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Megjegyzés írása',
'comment_count' => '{0} Nincs megjegyzés|{1} 1 megjegyzés|[2,*] :count megjegyzés',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Megjegyzés mentése',
'comment_new' => 'Új megjegyzés',
'comment_created' => 'megjegyzést fűzött hozzá :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Megjegyzés törölve',
'comment_created_success' => 'Megjegyzés hozzáadva',
'comment_updated_success' => 'Megjegyzés frissítve',
'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' => 'Biztosan törölhető ez a megjegyzés?',
'comment_in_reply_to' => 'Válasz erre: :commentId',
'comment_reference' => 'Reference',
'comment_reference_outdated' => '(Outdated)',
'comment_editor_explain' => 'Itt vannak az ezen az oldalon lévő megjegyzések. Megjegyzések hozzáadhatók és kezelhetők a mentett oldal megtekintésekor.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => 'Buat',
'update' => 'Perbarui',
'edit' => 'Sunting',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Sortir',
'move' => 'Pindahkan',
'copy' => 'Salin',

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' => 'Atur Changelog',
'pages_edit_enter_changelog_desc' => 'Masukkan deskripsi singkat tentang perubahan yang Anda buat',
'pages_edit_enter_changelog' => 'Masuk ke Changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Komentar',
'comments' => 'Komentar',
'comment_add' => 'Tambah Komentar',
'comment_none' => 'No comments to display',
'comment_placeholder' => 'Tinggalkan komentar disini',
'comment_count' => '{0} Tidak ada komentar |{1} 1 Komentar |[2,*] :count Komentar',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archived',
'comment_archived_threads' => 'Archived Threads',
'comment_save' => 'Simpan Komentar',
'comment_new' => 'Komentar Baru',
'comment_created' => 'dikomentari oleh :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Komentar telah dihapus',
'comment_created_success' => 'Komentar telah di tambahkan',
'comment_updated_success' => 'Komentar Telah diperbaharui',
'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' => 'Anda yakin ingin menghapus komentar ini?',
'comment_in_reply_to' => 'Sebagai balasan untuk :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' => 'Búa til',
'update' => 'Uppfæra',
'edit' => 'Breyta',
'archive' => 'Archive',
'unarchive' => 'Un-Archive',
'sort' => 'Flokka',
'move' => 'Færa',
'copy' => 'Afrita',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
'pages_edit_switch_to_wysiwyg' => 'Skipta yfir í WYSIWYG ritil',
'pages_edit_switch_to_new_wysiwyg' => 'Skipta yfir í nýja WYSIWYG ritilinn',
'pages_edit_switch_to_new_wysiwyg_desc' => '(Í alfa prófun)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)',
'pages_edit_set_changelog' => 'Stilla breytingarskrá',
'pages_edit_enter_changelog_desc' => 'Skrifaðu stutta lýsingu á breytingunum sem þú gerðir',
'pages_edit_enter_changelog' => 'Færa í breytingaskrá',
@@ -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' => 'Aggiorna',
'edit' => 'Modifica',
'archive' => 'Archivia',
'unarchive' => 'Ripristina',
'sort' => 'Ordina',
'move' => 'Sposta',
'copy' => 'Copia',

View File

@@ -248,7 +248,7 @@ return [
'pages_edit_switch_to_markdown_stable' => '(Contenuto stabile)',
'pages_edit_switch_to_wysiwyg' => 'Passa all\'editor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Passa al nuovo WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In test alpha)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Test)',
'pages_edit_set_changelog' => 'Imposta changelog',
'pages_edit_enter_changelog_desc' => 'Inserisci una breve descrizione dei cambiamenti che hai apportato',
'pages_edit_enter_changelog' => 'Inserisci changelog',
@@ -392,8 +392,11 @@ return [
'comment' => 'Commento',
'comments' => 'Commenti',
'comment_add' => 'Aggiungi commento',
'comment_none' => 'Nessun commento da visualizzare',
'comment_placeholder' => 'Scrivi un commento',
'comment_count' => '{0} Nessun commento|{1} 1 commento|[2,*] :count commenti',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads',
'comment_archived_count' => ':count Archiviato',
'comment_archived_threads' => 'Discussioni Archiviate',
'comment_save' => 'Salva commento',
'comment_new' => 'Nuovo commento',
'comment_created' => 'ha commentato :createDiff',
@@ -402,8 +405,14 @@ return [
'comment_deleted_success' => 'Commento eliminato',
'comment_created_success' => 'Commento aggiunto',
'comment_updated_success' => 'Commento aggiornato',
'comment_archive_success' => 'Commento archiviato',
'comment_unarchive_success' => 'Commento ripristinato',
'comment_view' => 'Visualizza commento',
'comment_jump_to_thread' => 'Vai al thread',
'comment_delete_confirm' => 'Sei sicuro di voler eliminare questo commento?',
'comment_in_reply_to' => 'In risposta a :commentId',
'comment_reference' => 'Riferimento',
'comment_reference_outdated' => '(Obsoleto)',
'comment_editor_explain' => 'Ecco i commenti che sono stati lasciati in questa pagina. I commenti possono essere aggiunti e gestiti quando si visualizza la pagina salvata.',
// Revision

View File

@@ -30,6 +30,8 @@ return [
'create' => '作成',
'update' => '更新',
'edit' => '編集',
'archive' => 'アーカイブ',
'unarchive' => 'アーカイブ解除',
'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' => '新しいWYSIWYGエディタに切り替える',
'pages_edit_switch_to_new_wysiwyg_desc' => '(アルファテスト版)',
'pages_edit_switch_to_new_wysiwyg_desc' => '(ベータテスト版',
'pages_edit_set_changelog' => '編集内容についての説明',
'pages_edit_enter_changelog_desc' => 'どのような変更を行ったのかを記録してください',
'pages_edit_enter_changelog' => '編集内容を入力',
@@ -393,8 +393,11 @@ return [
'comment' => 'コメント',
'comments' => 'コメント',
'comment_add' => 'コメント追加',
'comment_none' => '表示するコメントがありません',
'comment_placeholder' => 'コメントを記入してください',
'comment_count' => '{0} コメントはありません|[1,*] :count のコメント',
'comment_thread_count' => ':count 個のコメントスレッド|:count のコメントスレッド',
'comment_archived_count' => ':count 個のアーカイブ',
'comment_archived_threads' => 'アーカイブされたスレッド',
'comment_save' => 'コメントを保存',
'comment_new' => '新規コメント作成',
'comment_created' => 'コメントを作成しました :createDiff',
@@ -403,8 +406,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

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' => '만들기',
'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' => 'WYSIWYG 편집기로 전환',
'pages_edit_switch_to_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' => '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' => '이 페이지에 남겨진 댓글은 다음과 같습니다. 저장된 페이지를 볼 때 댓글을 추가하고 관리할 수 있습니다.',
// Revision

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