Compare commits

...

22 Commits

Author SHA1 Message Date
Dan Brown
6107161275 URLs: Fixed issue in comparisons when elements missing 2026-07-02 10:21:01 +01:00
Dan Brown
ad283ef0ed Updated packages, translators and licensing pre v26.05.2 2026-07-02 09:41:17 +01:00
Dan Brown
b87789dde6 Merge branch 'sec_jun26' into development 2026-07-02 09:38:17 +01:00
Dan Brown
a213175004 Merge pull request 'Updated translations with latest crowdin changes' (#6166) from l10n_development into development
Reviewed-on: https://codeberg.org/bookstack/bookstack/pulls/6166
2026-07-02 10:36:35 +02:00
Crowdin Bot
b6e3d304fe New Crowdin translations by GitHub Action 2026-07-02 08:34:05 +00:00
Dan Brown
6bba39196c Merge pull request 'Added Serbian language to language_select array' (#6153) from PolarniMeda/bookstack:development into development
Reviewed-on: https://codeberg.org/bookstack/bookstack/pulls/6153
2026-07-02 10:32:48 +02:00
Dan Brown
caeea658d1 Access: Hardened usage of referring URLs via login
Adds a more substantial URL check, via a new class which is shared and
used in other parts of the app for consistency.

Thanks to mfk25 for reporting.
2026-07-01 10:45:59 +01:00
Dan Brown
fe39b69c1f Comments: Added visibility check to comment delete
Aligns it with other actions/endpoints, and ensures an extra layer of
control against malicious use.

Thanks to mfk25 for reporting.
2026-07-01 10:20:32 +01:00
Dan Brown
01dc1e71c5 Attachments: Added more extensive URL filtering
Added a central URLFilter class to check & clean URLs used for
attachments, which is also used for validation, and by the purifier to
standardise protocols (and to make protocol config easier in future).

Thanks to mfk25 for reporting.
2026-07-01 00:41:19 +01:00
Dan Brown
59bbf504cf Content filtering: Added srcset protocol filter
Upstream libraries used did not specifically treat values in srcset as
URIs like other attributes, so this adds a simple filter for possible
bad values.
Updated tests to cover.

Thanks for Gurmandeep Deol for reporting.
2026-06-30 18:35:34 +01:00
Dan Brown
f7df78b91b CI: Attempted to fix snyk workflow 2026-06-24 13:58:20 +01:00
Dan Brown
c511f7d935 CI: Added workflow to sync with snyk 2026-06-24 13:48:20 +01:00
Dan Brown
79a2e017bb Maintenance: Fixed type and CI issues
- Fixed issues picked up by PHPStan updates.
  - Not sure why it was flagging the BookSorter issue, but swapping if
    statements made it go away.
- Updated BookSortMapItem with modern syntax.
- Attempted to fix CI issues by adding DOM extension.
- Attempted to make migration CI more efficient via tmpfs
2026-06-11 14:24:09 +01:00
PolarniMeda
dad83d473d Added Serbian language to language_select array 2026-06-11 10:32:03 +02:00
Dan Brown
c74df7e06b Updated translator & dependency attribution before release v26.05.1 2026-06-09 12:50:16 +01:00
Dan Brown
6b545d600c Merge branch 'v26051_sec' into development 2026-06-09 12:48:39 +01:00
Dan Brown
cc0b059fa4 Deps: Updated PHP package versions 2026-06-09 12:47:28 +01:00
Crowdin Bot
9fc46f76f6 New Crowdin translations by GitHub Action 2026-06-08 04:30:58 +00:00
Dan Brown
84a23fb23f Logs: Prevented NotifyExceptions for reporting to error logs
This is to reduce the amount of content which will be logged, since
these messages don't really indicate an actual system error but advise
the user of something which went wrong with their request.
2026-06-07 11:25:51 +01:00
Dan Brown
b7325fdf0e Attachments: Moved perm checks before validation
Avoids providing responses with potential sensitive attachment info
before permission checks.
Added tests to cover.

Thanks to Rafael Castilho for reporting.
2026-06-07 10:35:14 +01:00
Dan Brown
81f77a95de Content Filtering: Limited file protocol to just anchor hrefs
Updated allow list/purifier system to only allow file protocol use on
anchor hrefs to avoid potential security concerns with, after export,
content being auto loaded via interactive elements like
embeds/objects/videos etc...

Updated tests to cover.
Thanks to Gurmandeep Deol at Seneca Polytechnic for reporting.
2026-06-06 15:30:57 +01:00
Dan Brown
37f2d05118 Search: Prevented tag search using unusable numbers
These would trigger an error on use, and could be abused to fill logs.
Added test to cover.

Thanks to Stephen O. / Sakusen for reporting.
2026-06-06 10:37:06 +01:00
134 changed files with 1982 additions and 1448 deletions

View File

@@ -22,7 +22,7 @@ jobs:
uses: https://github.com/shivammathur/setup-php@v2 uses: https://github.com/shivammathur/setup-php@v2
with: with:
php-version: 8.5 php-version: 8.5
extensions: gd, mbstring, json, curl, xml, mysql, ldap extensions: gd, mbstring, json, curl, xml, dom, mysql, ldap
- name: Get Composer Cache Directory - name: Get Composer Cache Directory
id: composer-cache id: composer-cache

View File

@@ -23,6 +23,14 @@ jobs:
services: services:
mysql: mysql:
image: docker.io/library/mariadb:12.2.2-noble image: docker.io/library/mariadb:12.2.2-noble
options: --tmpfs /var/lib/mysql:rw
cmd:
- --innodb-flush-log-at-trx-commit=0
- --innodb-flush-method=O_DIRECT
- --innodb-doublewrite=0
- --innodb-buffer-pool-size=256M
- --skip-log-bin
- --sync-binlog=0
env: env:
MARIADB_USER: bookstack-test MARIADB_USER: bookstack-test
MARIADB_PASSWORD: bookstack-test MARIADB_PASSWORD: bookstack-test
@@ -35,7 +43,7 @@ jobs:
uses: https://github.com/shivammathur/setup-php@v2 uses: https://github.com/shivammathur/setup-php@v2
with: with:
php-version: ${{ matrix.php }} php-version: ${{ matrix.php }}
extensions: gd, mbstring, json, curl, xml, mysql, ldap extensions: gd, mbstring, json, curl, xml, dom, mysql, ldap
- name: Get Composer Cache Directory - name: Get Composer Cache Directory
id: composer-cache id: composer-cache

View File

@@ -21,7 +21,7 @@ jobs:
matrix: matrix:
php: ['8.2', '8.3', '8.4', '8.5'] php: ['8.2', '8.3', '8.4', '8.5']
env: env:
phpextensions: gd, mbstring, json, curl, xml, mysql, ldap, gmp phpextensions: gd, mbstring, json, curl, xml, dom, mysql, ldap, gmp
phpextensioncachekey: cache-v1 phpextensioncachekey: cache-v1
steps: steps:
- uses: https://code.forgejo.org/actions/checkout@v6 - uses: https://code.forgejo.org/actions/checkout@v6

View File

@@ -0,0 +1,33 @@
name: update-snyk
on:
workflow_dispatch:
push:
paths:
- 'composer*'
- 'package*'
branches:
- 'development'
- 'release'
jobs:
update:
runs-on: docker
container:
image: docker.io/library/node:24-trixie
steps:
- uses: https://code.forgejo.org/actions/checkout@v6
- name: Update Snyk for monitoring - Composer
uses: https://github.com/snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: snyk monitor --file=composer.lock --project-name=bookstack-${{forgejo.ref_name}}-composer
- name: Update Snyk for monitoring - NPM
uses: https://github.com/snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: snyk monitor --file=package-lock.json --project-name=bookstack-${{forgejo.ref_name}}-npm

View File

@@ -544,3 +544,7 @@ FelixFrizzy :: German
Pedro de Mattia (pdmtt) :: Portuguese, Brazilian Pedro de Mattia (pdmtt) :: Portuguese, Brazilian
lonestan :: Russian lonestan :: Russian
Paul Kernstock (kernstock) :: German Paul Kernstock (kernstock) :: German
brtbr :: German; German Informal
Ricardo Covelo (covelo12) :: Portuguese
Bojan Maksimovic (PolarniMeda) :: Serbian (Cyrillic)
Dian Prawira (wiradian84) :: Indonesian

View File

@@ -8,6 +8,7 @@ use BookStack\Exceptions\LoginAttemptEmailNeededException;
use BookStack\Exceptions\LoginAttemptException; use BookStack\Exceptions\LoginAttemptException;
use BookStack\Facades\Activity; use BookStack\Facades\Activity;
use BookStack\Http\Controller; use BookStack\Http\Controller;
use BookStack\Util\UrlComparison;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
@@ -186,7 +187,8 @@ class LoginController extends Controller
{ {
// Store the previous location for redirect after login // Store the previous location for redirect after login
$previous = url()->previous(''); $previous = url()->previous('');
$isPreviousFromInstance = str_starts_with($previous, url('/')); $comparison = new UrlComparison($previous, url('/'));
$isPreviousFromInstance = $comparison->originsMatch() && $comparison->pathsOverlap();
if (!$previous || !setting('app-public') || !$isPreviousFromInstance) { if (!$previous || !setting('app-public') || !$isPreviousFromInstance) {
return; return;
} }

View File

@@ -59,8 +59,7 @@ class CommentController extends Controller
'html' => ['required', 'string'], 'html' => ['required', 'string'],
]); ]);
$comment = $this->commentRepo->getById($commentId); $comment = $this->commentRepo->getVisibleById($commentId);
$this->checkOwnablePermission(Permission::PageView, $comment->entity);
$this->checkOwnablePermission(Permission::CommentUpdate, $comment); $this->checkOwnablePermission(Permission::CommentUpdate, $comment);
$comment = $this->commentRepo->update($comment, $input['html']); $comment = $this->commentRepo->update($comment, $input['html']);
@@ -76,8 +75,7 @@ class CommentController extends Controller
*/ */
public function archive(int $id) public function archive(int $id)
{ {
$comment = $this->commentRepo->getById($id); $comment = $this->commentRepo->getVisibleById($id);
$this->checkOwnablePermission(Permission::PageView, $comment->entity);
if (!userCan(Permission::CommentUpdate, $comment) && !userCan(Permission::CommentDelete, $comment)) { if (!userCan(Permission::CommentUpdate, $comment) && !userCan(Permission::CommentDelete, $comment)) {
$this->showPermissionError(); $this->showPermissionError();
} }
@@ -96,8 +94,7 @@ class CommentController extends Controller
*/ */
public function unarchive(int $id) public function unarchive(int $id)
{ {
$comment = $this->commentRepo->getById($id); $comment = $this->commentRepo->getVisibleById($id);
$this->checkOwnablePermission(Permission::PageView, $comment->entity);
if (!userCan(Permission::CommentUpdate, $comment) && !userCan(Permission::CommentDelete, $comment)) { if (!userCan(Permission::CommentUpdate, $comment) && !userCan(Permission::CommentDelete, $comment)) {
$this->showPermissionError(); $this->showPermissionError();
} }
@@ -116,7 +113,7 @@ class CommentController extends Controller
*/ */
public function destroy(int $id) public function destroy(int $id)
{ {
$comment = $this->commentRepo->getById($id); $comment = $this->commentRepo->getVisibleById($id);
$this->checkOwnablePermission(Permission::CommentDelete, $comment); $this->checkOwnablePermission(Permission::CommentDelete, $comment);
$this->commentRepo->delete($comment); $this->commentRepo->delete($comment);

View File

@@ -3,6 +3,7 @@
namespace BookStack\App\Providers; namespace BookStack\App\Providers;
use BookStack\Uploads\ImageService; use BookStack\Uploads\ImageService;
use BookStack\Util\UrlFilter;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@@ -21,10 +22,8 @@ class ValidationRuleServiceProvider extends ServiceProvider
Validator::extend('safe_url', function ($attribute, $value, $parameters, $validator) { Validator::extend('safe_url', function ($attribute, $value, $parameters, $validator) {
$cleanLinkName = strtolower(trim($value)); $cleanLinkName = strtolower(trim($value));
$isJs = str_starts_with($cleanLinkName, 'javascript:'); $filter = new UrlFilter($cleanLinkName);
$isData = str_starts_with($cleanLinkName, 'data:'); return $filter->isAllowed();
return !$isJs && !$isData;
}); });
} }
} }

View File

@@ -7,6 +7,7 @@ use BookStack\Theming\ThemeModule;
use BookStack\Theming\ThemeModuleException; use BookStack\Theming\ThemeModuleException;
use BookStack\Theming\ThemeModuleManager; use BookStack\Theming\ThemeModuleManager;
use BookStack\Theming\ThemeModuleZip; use BookStack\Theming\ThemeModuleZip;
use BookStack\Util\UrlComparison;
use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Request;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@@ -199,7 +200,6 @@ class InstallModuleCommand extends Command
{ {
$httpRequests = app()->make(HttpRequestService::class); $httpRequests = app()->make(HttpRequestService::class);
$client = $httpRequests->buildClient(30, ['stream' => true]); $client = $httpRequests->buildClient(30, ['stream' => true]);
$originalUrl = parse_url($location);
$currentLocation = $location; $currentLocation = $location;
$maxRedirects = 3; $maxRedirects = 3;
$redirectCount = 0; $redirectCount = 0;
@@ -212,12 +212,11 @@ class InstallModuleCommand extends Command
if ($statusCode >= 300 && $statusCode < 400 && $redirectCount < $maxRedirects) { if ($statusCode >= 300 && $statusCode < 400 && $redirectCount < $maxRedirects) {
$redirectLocation = $resp->getHeaderLine('Location'); $redirectLocation = $resp->getHeaderLine('Location');
if ($redirectLocation) { if ($redirectLocation) {
$redirectUrl = parse_url($redirectLocation); $comparison = new UrlComparison($location, $redirectLocation);
$redirectOriginMatches = ($originalUrl['host'] ?? '') === ($redirectUrl['host'] ?? '') $redirectOriginMatches = $comparison->originsMatch();
&& ($originalUrl['scheme'] ?? '') === ($redirectUrl['scheme'] ?? '')
&& ($originalUrl['port'] ?? '') === ($redirectUrl['port'] ?? '');
if (!$redirectOriginMatches) { if (!$redirectOriginMatches) {
$redirectUrl = parse_url($redirectLocation);
$redirectOrigin = ($redirectUrl['scheme'] ?? '') . '://' . ($redirectUrl['host'] ?? '') . (isset($redirectUrl['port']) ? ':' . $redirectUrl['port'] : ''); $redirectOrigin = ($redirectUrl['scheme'] ?? '') . '://' . ($redirectUrl['host'] ?? '') . (isset($redirectUrl['port']) ? ':' . $redirectUrl['port'] : '');
$this->info("The download URL is redirecting to a different site: {$redirectOrigin}"); $this->info("The download URL is redirecting to a different site: {$redirectOrigin}");
$shouldContinue = $this->confirm("Do you trust downloading the module from this site?"); $shouldContinue = $this->confirm("Do you trust downloading the module from this site?");

View File

@@ -25,6 +25,7 @@ class Handler extends ExceptionHandler
protected $dontReport = [ protected $dontReport = [
NotFoundException::class, NotFoundException::class,
StoppedAuthenticationException::class, StoppedAuthenticationException::class,
NotifyException::class,
]; ];
/** /**

View File

@@ -6,18 +6,22 @@ use Exception;
use Illuminate\Contracts\Support\Responsable; use Illuminate\Contracts\Support\Responsable;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
/**
* An exception that is thrown to notify the user of something which went wrong.
* Typically these should be translated messages since they will be shown to the end user
* via a pop up notification error message in the UI.
*
* This exception is not intended to be used for internal system/application errors,
* and therefore will not be logged by the exception handler.
*/
class NotifyException extends Exception implements Responsable, HttpExceptionInterface class NotifyException extends Exception implements Responsable, HttpExceptionInterface
{ {
public $message; public function __construct(
public string $redirectLocation; string $message,
protected int $status; public string $redirectLocation = '/',
protected int $status = 500
public function __construct(string $message, string $redirectLocation = '/', int $status = 500) ) {
{
$this->message = $message; $this->message = $message;
$this->redirectLocation = $redirectLocation;
$this->status = $status;
parent::__construct(); parent::__construct();
} }

View File

@@ -290,7 +290,7 @@ class SearchRunner
$query->where('name', '=', $tagParts['name']); $query->where('name', '=', $tagParts['name']);
} }
if (is_numeric($tagParts['value']) && $tagParts['operator'] !== 'like') { if (is_numeric($tagParts['value']) && is_finite($tagParts['value']) && $tagParts['operator'] !== 'like') {
// We have to do a raw sql query for this since otherwise PDO will quote the value and MySQL will // We have to do a raw sql query for this since otherwise PDO will quote the value and MySQL will
// search the value as a string which prevents being able to do number-based operations // search the value as a string which prevents being able to do number-based operations
// on the tag values. We ensure it has a numeric value and then cast it just to be sure. // on the tag values. We ensure it has a numeric value and then cast it just to be sure.

View File

@@ -4,37 +4,12 @@ namespace BookStack\Sorting;
class BookSortMapItem class BookSortMapItem
{ {
/** public function __construct(
* @var int public int $id,
*/ public int $sort,
public $id; public int|null $parentChapterId,
public string $type,
/** public int $parentBookId,
* @var int ) {
*/
public $sort;
/**
* @var ?int
*/
public $parentChapterId;
/**
* @var string
*/
public $type;
/**
* @var int
*/
public $parentBookId;
public function __construct(int $id, int $sort, ?int $parentChapterId, string $type, int $parentBookId)
{
$this->id = $id;
$this->sort = $sort;
$this->parentChapterId = $parentChapterId;
$this->type = $type;
$this->parentBookId = $parentBookId;
} }
} }

View File

@@ -168,7 +168,7 @@ class BookSorter
$model->priority = $sortMapItem->sort; $model->priority = $sortMapItem->sort;
} }
if ($chapterChanged || $priorityChanged) { if ($priorityChanged || $chapterChanged) {
$model::withoutTimestamps(fn () => $model->save()); $model::withoutTimestamps(fn () => $model->save());
} }
} }

View File

@@ -10,6 +10,7 @@ use BookStack\Permissions\PermissionApplicator;
use BookStack\Users\Models\HasCreatorAndUpdater; use BookStack\Users\Models\HasCreatorAndUpdater;
use BookStack\Users\Models\OwnableInterface; use BookStack\Users\Models\OwnableInterface;
use BookStack\Users\Models\User; use BookStack\Users\Models\User;
use BookStack\Util\UrlFilter;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -71,7 +72,7 @@ class Attachment extends Model implements OwnableInterface
public function getUrl($openInline = false): string public function getUrl($openInline = false): string
{ {
if ($this->external && !str_starts_with($this->path, 'http')) { if ($this->external && !str_starts_with($this->path, 'http')) {
return $this->path; return (new UrlFilter($this->path))->clean();
} }
return url('/attachments/' . $this->id . ($openInline ? '?open=true' : '')); return url('/attachments/' . $this->id . ($openInline ? '?open=true' : ''));

View File

@@ -11,6 +11,7 @@ use BookStack\Http\Controller;
use BookStack\Permissions\Permission; use BookStack\Permissions\Permission;
use BookStack\Uploads\Attachment; use BookStack\Uploads\Attachment;
use BookStack\Uploads\AttachmentService; use BookStack\Uploads\AttachmentService;
use BookStack\Util\UrlFilter;
use Exception; use Exception;
use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -107,6 +108,9 @@ class AttachmentController extends Controller
{ {
/** @var Attachment $attachment */ /** @var Attachment $attachment */
$attachment = Attachment::query()->findOrFail($attachmentId); $attachment = Attachment::query()->findOrFail($attachmentId);
$this->checkOwnablePermission(Permission::PageView, $attachment->page);
$this->checkOwnablePermission(Permission::PageUpdate, $attachment->page);
$this->checkOwnablePermission(Permission::AttachmentUpdate, $attachment);
try { try {
$this->validate($request, [ $this->validate($request, [
@@ -120,10 +124,6 @@ class AttachmentController extends Controller
]), 422); ]), 422);
} }
$this->checkOwnablePermission(Permission::PageView, $attachment->page);
$this->checkOwnablePermission(Permission::PageUpdate, $attachment->page);
$this->checkOwnablePermission(Permission::AttachmentUpdate, $attachment);
$attachment = $this->attachmentService->updateFile($attachment, [ $attachment = $this->attachmentService->updateFile($attachment, [
'name' => $request->input('attachment_edit_name'), 'name' => $request->input('attachment_edit_name'),
'link' => $request->input('attachment_edit_url'), 'link' => $request->input('attachment_edit_url'),
@@ -142,6 +142,10 @@ class AttachmentController extends Controller
public function attachLink(Request $request) public function attachLink(Request $request)
{ {
$pageId = $request->input('attachment_link_uploaded_to'); $pageId = $request->input('attachment_link_uploaded_to');
$page = $this->pageQueries->findVisibleByIdOrFail($pageId);
$this->checkPermission(Permission::AttachmentCreateAll);
$this->checkOwnablePermission(Permission::PageUpdate, $page);
try { try {
$this->validate($request, [ $this->validate($request, [
@@ -156,11 +160,6 @@ class AttachmentController extends Controller
]), 422); ]), 422);
} }
$page = $this->pageQueries->findVisibleByIdOrFail($pageId);
$this->checkPermission(Permission::AttachmentCreateAll);
$this->checkOwnablePermission(Permission::PageUpdate, $page);
$attachmentName = $request->input('attachment_link_name'); $attachmentName = $request->input('attachment_link_name');
$link = $request->input('attachment_link_url'); $link = $request->input('attachment_link_url');
$this->attachmentService->saveNewFromLink($attachmentName, $link, intval($pageId)); $this->attachmentService->saveNewFromLink($attachmentName, $link, intval($pageId));
@@ -223,7 +222,8 @@ class AttachmentController extends Controller
} }
if ($attachment->external) { if ($attachment->external) {
return redirect($attachment->path); $url = (new UrlFilter($attachment->path))->clean();
return redirect($url);
} }
$fileName = $attachment->getFileName(); $fileName = $attachment->getFileName();

View File

@@ -2,6 +2,7 @@
namespace BookStack\Util; namespace BookStack\Util;
use BookStack\Util\HtmlPurifier\ConfiguredHtmlPurifier;
use DOMAttr; use DOMAttr;
use DOMElement; use DOMElement;
use DOMNodeList; use DOMNodeList;

View File

@@ -1,13 +1,16 @@
<?php <?php
namespace BookStack\Util; namespace BookStack\Util\HtmlPurifier;
use BookStack\App\AppVersion; use BookStack\App\AppVersion;
use BookStack\Util\HtmlPurifier\Filters\UriLimitFileProtocolToAnchors;
use BookStack\Util\UrlFilter;
use HTMLPurifier; use HTMLPurifier;
use HTMLPurifier_Config; use HTMLPurifier_Config;
use HTMLPurifier_DefinitionCache_Serializer; use HTMLPurifier_DefinitionCache_Serializer;
use HTMLPurifier_HTML5Config; use HTMLPurifier_HTML5Config;
use HTMLPurifier_HTMLDefinition; use HTMLPurifier_HTMLDefinition;
use HTMLPurifier_URIDefinition;
/** /**
* Provides a configured HTML Purifier instance. * Provides a configured HTML Purifier instance.
@@ -33,7 +36,12 @@ class ConfiguredHtmlPurifier
$htmlDef = $config->getDefinition('HTML', true, true); $htmlDef = $config->getDefinition('HTML', true, true);
if ($htmlDef instanceof HTMLPurifier_HTMLDefinition) { if ($htmlDef instanceof HTMLPurifier_HTMLDefinition) {
$this->configureDefinition($htmlDef); $this->configureHtmlDefinition($htmlDef);
}
$uriDef = $config->getDefinition('URI', true, true);
if ($uriDef instanceof HTMLPurifier_URIDefinition) {
$this->configureUriDefinition($uriDef);
} }
$this->purifier = new HTMLPurifier($config); $this->purifier = new HTMLPurifier($config);
@@ -77,21 +85,18 @@ class ConfiguredHtmlPurifier
$config->set('Attr.ID.HTML5', true); $config->set('Attr.ID.HTML5', true);
$config->set('Output.FixInnerHTML', false); $config->set('Output.FixInnerHTML', false);
$config->set('URI.SafeIframeRegexp', '%^(http://|https://|//)%'); $config->set('URI.SafeIframeRegexp', '%^(http://|https://|//)%');
$config->set('URI.AllowedSchemes', [
'http' => true, $allowedSchemes = UrlFilter::getAllowedSchemes();
'https' => true, $allowedSchemesSetting = [];
'mailto' => true, foreach ($allowedSchemes as $scheme) {
'ftp' => true, $allowedSchemesSetting[$scheme] = true;
'nntp' => true, }
'news' => true, $config->set('URI.AllowedSchemes', $allowedSchemesSetting);
'tel' => true,
'file' => true,
]);
// $config->set('Cache.DefinitionImpl', null); // Disable cache during testing // $config->set('Cache.DefinitionImpl', null); // Disable cache during testing
} }
public function configureDefinition(HTMLPurifier_HTMLDefinition $definition): void protected function configureHtmlDefinition(HTMLPurifier_HTMLDefinition $definition): void
{ {
// Allow the object element // Allow the object element
$definition->addElement( $definition->addElement(
@@ -149,6 +154,15 @@ class ConfiguredHtmlPurifier
// Allow mention-ids on links // Allow mention-ids on links
$definition->addAttribute('a', 'data-mention-user-id', 'Number'); $definition->addAttribute('a', 'data-mention-user-id', 'Number');
// Set up custom handler for srcset to limit accepted types
$definition->addAttribute('img', 'srcset', new SrcsetAttrDef());
$definition->addAttribute('source', 'srcset', new SrcsetAttrDef());
}
protected function configureUriDefinition(HTMLPurifier_URIDefinition $definition): void
{
$definition->registerFilter(new UriLimitFileProtocolToAnchors());
} }
public function purify(string $html): string public function purify(string $html): string

View File

@@ -0,0 +1,53 @@
<?php
namespace BookStack\Util\HtmlPurifier\Filters;
use HTMLPurifier_Config;
use HTMLPurifier_Context;
use HTMLPurifier_URI;
use HTMLPurifier_URIFilter;
/**
* Limits file:// URIs to only be used on anchor tags href attributes.
* This prevents use on iframes/embeds/images where they can be used to load external
* content on the network, triggering calls which may include NTLM auth hashes when in
* certain windows based environments.
*/
class UriLimitFileProtocolToAnchors extends HTMLPurifier_URIFilter
{
/**
* @type string
*/
public $name = 'LimitFileProtocolToAnchors';
/**
* @type bool
*/
public $always_load = true;
/**
* @param HTMLPurifier_URI $uri
* @param HTMLPurifier_Config $config
* @param HTMLPurifier_Context $context
* @return bool
*/
public function filter(&$uri, $config, $context)
{
// Ensure we're only filtering file:// URIs'
if ($uri->scheme !== 'file') {
return true;
}
$token = $context->get('CurrentToken', true);
$attr = $context->get('CurrentAttr', true);
// Only allow if used on hrefs on anchor tags
$isAnchor = $token && $token->name === 'a';
$isHref = $attr === 'href';
if ($isAnchor && $isHref) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace BookStack\Util\HtmlPurifier;
use HTMLPurifier_AttrDef;
/**
* Custom attribute definition to filter out potentially dangerous
* values from the srcset attribute.
*/
class SrcsetAttrDef extends HTMLPurifier_AttrDef
{
public function validate($string, $config, $context)
{
$lower = strtolower($string);
$nonAllowed = ['javascript:', 'vbscript:', 'data:', 'file:'];
foreach ($nonAllowed as $nonAllowedString) {
if (str_contains($lower, $nonAllowedString)) {
return false;
}
}
return $string;
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace BookStack\Util;
class UrlComparison
{
public function __construct(
protected readonly string $a,
protected readonly string $b,
) {
}
/**
* Check if the two URLs have the same origin.
*/
public function originsMatch(): bool
{
$aParts = parse_url($this->a);
$bParts = parse_url($this->b);
return ($aParts['host'] ?? '') === ($bParts['host'] ?? '')
&& ($aParts['scheme'] ?? '') === ($bParts['scheme'] ?? '')
&& ($aParts['port'] ?? '') === ($bParts['port'] ?? '');
}
/**
* Check if there's some overlap between the two URLs' paths.
*/
public function pathsOverlap(): bool
{
$aPath = parse_url($this->a, PHP_URL_PATH) ?? '';
$bPath = parse_url($this->b, PHP_URL_PATH) ?? '';
return str_starts_with($aPath, $bPath) || str_starts_with($bPath, $aPath);
}
}

103
app/Util/UrlFilter.php Normal file
View File

@@ -0,0 +1,103 @@
<?php
declare(strict_types=1);
namespace BookStack\Util;
/**
* Helps filter URLs to prevent use of undesired schemes.
* Also parses and rebuilds the URL to ensure it's valid.
*/
class UrlFilter
{
protected static array $allowedSchemes = ['http', 'https', 'mailto', 'tel', 'file', 'ftp', 'nntp', 'news'];
protected string $url;
public function __construct(string $url)
{
$this->url = trim($url);
}
/**
* Check if the URL is allowed to be generally used as a link
* in the application. This does not assure the original URL string
* provided is safe as-is. Ensure you use the clean method to produce
* a URL that is considered safe to use.
*/
public function isAllowed(): bool
{
$urlParts = parse_url($this->url);
if (!$urlParts) {
return false;
}
// Extra check to help avoid scenarios where non-standard characters are used in the scheme
// to work around parse_url handling with URLs which may be interpreted by the browser differently.
if (str_contains($this->url, ':') && !preg_match('/^[a-z]+:/i', $this->url)) {
return false;
}
if (isset($urlParts['scheme'])) {
return in_array(strtolower($urlParts['scheme']), self::$allowedSchemes);
}
return true;
}
/**
* Clean the URL to ensure it's valid and only uses the allowed schemes.
* If the URL is not allowed, return a placeholder.
*/
public function clean(): string
{
if (!$this->isAllowed()) {
return '#badlink';
}
$urlParts = parse_url($this->url);
if (!$urlParts) {
return '#badlink';
}
$url = '';
if (isset($urlParts['scheme']) || isset($urlParts['host'])) {
$scheme = strtolower($urlParts['scheme'] ?? 'https');
$url = $scheme . ':' . (isset($urlParts['host']) ? '//' : '');
}
if (isset($urlParts['user']) || isset($urlParts['pass'])) {
$url .= $urlParts['user'] ?? '';
if (isset($urlParts['pass'])) {
$url .= ':' . $urlParts['pass'];
}
$url .= '@';
}
if (isset($urlParts['host'])) {
$url .= $urlParts['host'];
}
if (isset($urlParts['port'])) {
$url .= ':' . $urlParts['port'];
}
if (isset($urlParts['path'])) {
$url .= $urlParts['path'];
}
if (isset($urlParts['query'])) {
$url .= '?' . $urlParts['query'];
}
if (isset($urlParts['fragment'])) {
$url .= '#' . $urlParts['fragment'];
}
return $url;
}
/**
* Get schemes that are allowed to be used in content links.
*/
public static function getAllowedSchemes(): array
{
return self::$allowedSchemes;
}
}

458
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -482,8 +482,8 @@ electron-to-chromium
License: ISC License: ISC
License File: node_modules/electron-to-chromium/LICENSE License File: node_modules/electron-to-chromium/LICENSE
Copyright: Copyright 2018 Kilian Valkhof Copyright: Copyright 2018 Kilian Valkhof
Source: git+https://github.com/kilian/electron-to-chromium.git Source: git+https://github.com/Kilian/electron-to-chromium.git
Link: git+https://github.com/kilian/electron-to-chromium.git Link: git+https://github.com/Kilian/electron-to-chromium.git
----------- -----------
emittery emittery
License: MIT License: MIT
@@ -860,7 +860,7 @@ License: MIT
License File: node_modules/handlebars/LICENSE License File: node_modules/handlebars/LICENSE
Copyright: Copyright (C) 2011-2019 by Yehuda Katz Copyright: Copyright (C) 2011-2019 by Yehuda Katz
Source: https://github.com/handlebars-lang/handlebars.js.git Source: https://github.com/handlebars-lang/handlebars.js.git
Link: https://www.handlebarsjs.com/ Link: https://handlebarsjs.com/
----------- -----------
has-bigints has-bigints
License: MIT License: MIT
@@ -1663,13 +1663,6 @@ Copyright: Copyright (c) Stephen Sugden <**@*************.***> (stephensugden.co
Source: grncdr/merge-stream Source: grncdr/merge-stream
Link: grncdr/merge-stream Link: grncdr/merge-stream
----------- -----------
micromatch
License: MIT
License File: node_modules/micromatch/LICENSE
Copyright: Copyright (c) 2014-present, Jon Schlinkert.
Source: micromatch/micromatch
Link: https://github.com/micromatch/micromatch
-----------
mimic-fn mimic-fn
License: MIT License: MIT
License File: node_modules/mimic-fn/license License File: node_modules/mimic-fn/license
@@ -3574,13 +3567,6 @@ Copyright: Copyright (c) 2017-present Devon Govett
Source: https://github.com/parcel-bundler/watcher.git Source: https://github.com/parcel-bundler/watcher.git
Link: https://github.com/parcel-bundler/watcher.git Link: https://github.com/parcel-bundler/watcher.git
----------- -----------
@parcel/watcher-linux-x64-musl
License: MIT
License File: node_modules/@parcel/watcher-linux-x64-musl/LICENSE
Copyright: Copyright (c) 2017-present Devon Govett
Source: https://github.com/parcel-bundler/watcher.git
Link: https://github.com/parcel-bundler/watcher.git
-----------
@parcel/watcher @parcel/watcher
License: MIT License: MIT
License File: node_modules/@parcel/watcher/LICENSE License File: node_modules/@parcel/watcher/LICENSE
@@ -3603,8 +3589,8 @@ Link: https://github.com/un-ts/pkgr/blob/master/packages/core
License: MIT License: MIT
License File: node_modules/@sinclair/typebox/license License File: node_modules/@sinclair/typebox/license
Copyright: Copyright (c) 2017-2026 Haydn Paterson Copyright: Copyright (c) 2017-2026 Haydn Paterson
Source: https://github.com/sinclairzx81/typebox-legacy Source: https://github.com/sinclairzx81/sinclair-typebox
Link: https://github.com/sinclairzx81/typebox-legacy Link: https://github.com/sinclairzx81/sinclair-typebox
----------- -----------
@sinonjs/commons @sinonjs/commons
License: BSD-3-Clause License: BSD-3-Clause
@@ -3817,8 +3803,3 @@ Link: https://github.com/ungap/structured-clone#readme
License: MIT License: MIT
Source: git+https://github.com/unrs/unrs-resolver.git Source: git+https://github.com/unrs/unrs-resolver.git
Link: https://github.com/unrs/unrs-resolver#readme Link: https://github.com/unrs/unrs-resolver#readme
-----------
@unrs/resolver-binding-linux-x64-musl
License: MIT
Source: git+https://github.com/unrs/unrs-resolver.git
Link: https://github.com/unrs/unrs-resolver#readme

View File

@@ -110,7 +110,7 @@ License: BSD-3-Clause
License File: vendor/firebase/php-jwt/LICENSE License File: vendor/firebase/php-jwt/LICENSE
Copyright: Copyright (c) 2011, Neuman Vong Copyright: Copyright (c) 2011, Neuman Vong
Source: https://github.com/googleapis/php-jwt.git Source: https://github.com/googleapis/php-jwt.git
Link: https://github.com/firebase/php-jwt Link: https://github.com/googleapis/php-jwt
----------- -----------
fruitcake/php-cors fruitcake/php-cors
License: MIT License: MIT

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -99,8 +99,8 @@ return [
'user_update_notification' => 'Uživatel byl úspěšně aktualizován', 'user_update_notification' => 'Uživatel byl úspěšně aktualizován',
'user_delete' => 'odstranil uživatele', 'user_delete' => 'odstranil uživatele',
'user_delete_notification' => 'Uživatel byl úspěšně odstraněn', 'user_delete_notification' => 'Uživatel byl úspěšně odstraněn',
'user_mfa_reset' => 'reset MFA for user', 'user_mfa_reset' => 'obnovit vícefaktorové ověření pro uživatele',
'user_mfa_reset_notification' => 'Multi-factor authentication methods reset', 'user_mfa_reset_notification' => 'Obnovení metod vícefaktorového ověřování',
// API Tokens // API Tokens
'api_token_create' => 'API token byl vytvořen', 'api_token_create' => 'API token byl vytvořen',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'Neplatné přihlašovací údaje.', 'failed' => 'Neplatné přihlašovací údaje.',
'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.', 'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => '{0}Příliš mnoho pokusů o vícefázové ověření. Zkuste to prosím znovu za :seconds sekund.|{1}Příliš mnoho pokusů o vícefázové ověření. Zkuste to prosím znovu za :seconds sekundu.|[2,4]Příliš mnoho pokusů o vícefázové ověření. Zkuste to prosím znovu za :seconds sekundy.|[5,*]Příliš mnoho pokusů o vícefázové ověření. Zkuste to prosím znovu za :seconds sekund.',
// Login & Register // Login & Register
'sign_up' => 'Registrace', 'sign_up' => 'Registrace',

View File

@@ -173,7 +173,7 @@ return [
'books_sort_desc' => 'Pro přeuspořádání obsahu přesuňte kapitoly a stránky v knize. Mohou být přidány další knihy, které umožní snadný přesun kapitol a stránek mezi knihami. Volitelně lze nastavit pravidlo automatického řazení, aby se při změnách automaticky seřadil obsah této knihy.', 'books_sort_desc' => 'Pro přeuspořádání obsahu přesuňte kapitoly a stránky v knize. Mohou být přidány další knihy, které umožní snadný přesun kapitol a stránek mezi knihami. Volitelně lze nastavit pravidlo automatického řazení, aby se při změnách automaticky seřadil obsah této knihy.',
'books_sort_auto_sort' => 'Možnost automatického řazení', 'books_sort_auto_sort' => 'Možnost automatického řazení',
'books_sort_auto_sort_active' => 'Aktivní automatické řazení: :sortName', 'books_sort_auto_sort_active' => 'Aktivní automatické řazení: :sortName',
'books_sort_auto_sort_creation_hint' => 'Auto sort option rules can be created in the "Lists & Sorting" settings area by a user with the relevant permissions.', 'books_sort_auto_sort_creation_hint' => 'Pravidla řazení mohou být vytvořena v nastavení "Seznamy a řazení" uživatelem s příslušnými oprávněními.',
'books_sort_named' => 'Seřadit knihu :bookName', 'books_sort_named' => 'Seřadit knihu :bookName',
'books_sort_name' => 'Seřadit podle názvu', 'books_sort_name' => 'Seřadit podle názvu',
'books_sort_created' => 'Seřadit podle data vytvoření', 'books_sort_created' => 'Seřadit podle data vytvoření',
@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Skrýt/Zobrazit postranní panel', 'toggle_sidebar' => 'Skrýt/Zobrazit postranní panel',
'page_contents' => 'Page Contents', 'page_contents' => 'Obsah stránky',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Na stránce nejsou žádné nadpisy.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'Obsah se generuje ze všech použitých nadpisů na stránce.',
'page_tags' => 'Štítky stránky', 'page_tags' => 'Štítky stránky',
'chapter_tags' => 'Štítky kapitoly', 'chapter_tags' => 'Štítky kapitoly',
'book_tags' => 'Štítky knihy', 'book_tags' => 'Štítky knihy',

View File

@@ -207,7 +207,7 @@ return [
'role_all' => 'Vše', 'role_all' => 'Vše',
'role_own' => 'Vlastní', 'role_own' => 'Vlastní',
'role_controlled_by_asset' => 'Řídí se obsahem, do kterého jsou nahrávány', 'role_controlled_by_asset' => 'Řídí se obsahem, do kterého jsou nahrávány',
'role_controlled_by_page_delete' => 'Controlled by page delete permissions', 'role_controlled_by_page_delete' => 'Řídí se právem k odstranění stránky',
'role_save' => 'Uložit roli', 'role_save' => 'Uložit roli',
'role_users' => 'Uživatelé mající tuto roli', 'role_users' => 'Uživatelé mající tuto roli',
'role_users_none' => 'Žádný uživatel nemá tuto roli', 'role_users_none' => 'Žádný uživatel nemá tuto roli',
@@ -260,13 +260,13 @@ return [
'users_api_tokens_create' => 'Vytvořit Token', 'users_api_tokens_create' => 'Vytvořit Token',
'users_api_tokens_expires' => 'Vyprší', 'users_api_tokens_expires' => 'Vyprší',
'users_api_tokens_docs' => 'Dokumentace API', 'users_api_tokens_docs' => 'Dokumentace API',
'users_mfa' => 'Vícefázové ověření', 'users_mfa' => 'Vícefaktorové ověření',
'users_mfa_desc' => 'Nastavit vícefaktorové ověřování jako další vrstvu zabezpečení vašeho uživatelského účtu.', 'users_mfa_desc' => 'Nastavit vícefaktorové ověřování jako další vrstvu zabezpečení vašeho uživatelského účtu.',
'users_mfa_x_methods' => ':count nastavená metoda|:count nastavených metod', 'users_mfa_x_methods' => ':count nastavená metoda|:count nastavených metod',
'users_mfa_configure' => 'Konfigurovat metody', 'users_mfa_configure' => 'Konfigurovat metody',
'users_mfa_reset' => 'Reset Multi-Factor Authentication Methods', 'users_mfa_reset' => 'Obnova metod vícefaktorového ověření',
'users_mfa_reset_desc' => 'This will reset and clear all configured multi-factor authentication methods for this user. If multi-factor authentication is required by any of their roles, they\'ll be prompted to configure new methods on their next login.', 'users_mfa_reset_desc' => 'Tímto se obnoví a vymažou všechny nakonfigurované metody vícefaktorového ověřování pro tohoto uživatele. Pokud některá z jeho rolí vyžaduje vícefaktorové ověřování, bude při příštím přihlášení vyzván k nastavení nových metod.',
'users_mfa_reset_confirm' => 'Are you sure you want to reset multi-factor authentication for this user?', 'users_mfa_reset_confirm' => 'Opravdu chcete obnovit vícefaktorové ověřování pro tohoto uživatele?',
// API Tokens // API Tokens
'user_api_token_create' => 'Vytvořit API Token', 'user_api_token_create' => 'Vytvořit API Token',
@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'De indtastede brugeroplysninger stemmer ikke overens med vores registreringer.', 'failed' => 'De indtastede brugeroplysninger stemmer ikke overens med vores registreringer.',
'throttle' => 'For mange mislykkede loginforsøg. Prøv igen om :seconds sekunder.', 'throttle' => 'For mange mislykkede loginforsøg. Prøv igen om :seconds sekunder.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'For mange mislykkede loginforsøg. Prøv igen om :seconds sekunder.',
// Login & Register // Login & Register
'sign_up' => 'Registrer', 'sign_up' => 'Registrer',

View File

@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Sidebjælke til/fra', 'toggle_sidebar' => 'Sidebjælke til/fra',
'page_contents' => 'Page Contents', 'page_contents' => 'Sideindhold',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Ingen overskrifter blev fundet i sidens indhold.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'Indholdsmenuen er genereret fra alle kursformater, der bruges på siden.',
'page_tags' => 'Sidetags', 'page_tags' => 'Sidetags',
'chapter_tags' => 'Kapiteltags', 'chapter_tags' => 'Kapiteltags',
'book_tags' => 'Bogtags', 'book_tags' => 'Bogtags',

View File

@@ -366,8 +366,9 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'Thailandsk',
'tr' => 'Türkçe', 'tr' => 'Türkçe',
'uk' => 'Українська', 'uk' => 'Українська',
'uz' => 'Ozbekcha', 'uz' => 'Ozbekcha',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'Diese Anmeldedaten stimmen nicht mit unseren Aufzeichnungen überein.', 'failed' => 'Diese Anmeldedaten stimmen nicht mit unseren Aufzeichnungen überein.',
'throttle' => 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in :seconds Sekunden erneut.', 'throttle' => 'Zu viele Anmeldeversuche. Bitte versuchen Sie es in :seconds Sekunden erneut.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'Zu viele Multi-Faktor-Verifizierungsversuche. Bitte versuchen Sie es in :seconds Sekunden erneut.',
// Login & Register // Login & Register
'sign_up' => 'Registrieren', 'sign_up' => 'Registrieren',

View File

@@ -173,7 +173,7 @@ return [
'books_sort_desc' => 'Verschieben Sie Kapitel und Seiten innerhalb eines Buches, um dessen Inhalt neu zu ordnen. Es können weitere Bücher hinzugefügt werden, wodurch Kapitel und Seiten problemlos zwischen den Büchern verschoben werden können. Optional kann eine automatische Sortierregel festgelegt werden, um den Inhalt dieses Buches bei Änderungen automatisch zu sortieren.', 'books_sort_desc' => 'Verschieben Sie Kapitel und Seiten innerhalb eines Buches, um dessen Inhalt neu zu ordnen. Es können weitere Bücher hinzugefügt werden, wodurch Kapitel und Seiten problemlos zwischen den Büchern verschoben werden können. Optional kann eine automatische Sortierregel festgelegt werden, um den Inhalt dieses Buches bei Änderungen automatisch zu sortieren.',
'books_sort_auto_sort' => 'Automatische Sortierfunktionsoption', 'books_sort_auto_sort' => 'Automatische Sortierfunktionsoption',
'books_sort_auto_sort_active' => 'Automatische Sortierung aktiv: :sortName', 'books_sort_auto_sort_active' => 'Automatische Sortierung aktiv: :sortName',
'books_sort_auto_sort_creation_hint' => 'Auto sort option rules can be created in the "Lists & Sorting" settings area by a user with the relevant permissions.', 'books_sort_auto_sort_creation_hint' => 'Regeln für die automatische Sortierung können von einem Benutzer mit den entsprechenden Berechtigungen im Einstellungsbereich "Listen & Sortieren" erstellt werden.',
'books_sort_named' => 'Buch ":bookName" sortieren', 'books_sort_named' => 'Buch ":bookName" sortieren',
'books_sort_name' => 'Sortieren nach Namen', 'books_sort_name' => 'Sortieren nach Namen',
'books_sort_created' => 'Sortieren nach Erstellungsdatum', 'books_sort_created' => 'Sortieren nach Erstellungsdatum',
@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Seitenleiste umschalten', 'toggle_sidebar' => 'Seitenleiste umschalten',
'page_contents' => 'Page Contents', 'page_contents' => 'Seiteninhalt',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Es wurden keine Überschriften im Seiteninhalt gefunden.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'Das Inhaltsmenü wird aus allen auf der Seite verwendeten Überschriften generiert.',
'page_tags' => 'Seiten-Schlagwörter', 'page_tags' => 'Seiten-Schlagwörter',
'chapter_tags' => 'Kapitel-Schlagwörter', 'chapter_tags' => 'Kapitel-Schlagwörter',
'book_tags' => 'Buch-Schlagwörter', 'book_tags' => 'Buch-Schlagwörter',

View File

@@ -207,7 +207,7 @@ return [
'role_all' => 'Alle', 'role_all' => 'Alle',
'role_own' => 'Eigene', 'role_own' => 'Eigene',
'role_controlled_by_asset' => 'Abhängig von dem Asset, in das sie hochgeladen werden', 'role_controlled_by_asset' => 'Abhängig von dem Asset, in das sie hochgeladen werden',
'role_controlled_by_page_delete' => 'Controlled by page delete permissions', 'role_controlled_by_page_delete' => 'Kontrolliert durch die Berechtigung zum Löschen einer Seite',
'role_save' => 'Rolle speichern', 'role_save' => 'Rolle speichern',
'role_users' => 'Dieser Rolle zugeordnete Benutzer', 'role_users' => 'Dieser Rolle zugeordnete Benutzer',
'role_users_none' => 'Derzeit sind diesem Rollentyp keine Benutzer zugewiesen', 'role_users_none' => 'Derzeit sind diesem Rollentyp keine Benutzer zugewiesen',
@@ -265,7 +265,7 @@ return [
'users_mfa_x_methods' => ':count Methode konfiguriert|:count Methoden konfiguriert', 'users_mfa_x_methods' => ':count Methode konfiguriert|:count Methoden konfiguriert',
'users_mfa_configure' => 'Methoden konfigurieren', 'users_mfa_configure' => 'Methoden konfigurieren',
'users_mfa_reset' => 'Setze Multifaktor-Authentifizierung zurück', 'users_mfa_reset' => 'Setze Multifaktor-Authentifizierung zurück',
'users_mfa_reset_desc' => 'Dies wird alle konfigurierten Multifaktor-Authentifizierungsmethoden für diesen Nutzer zurücksetzen. Falls Multifaktor-Authentifizierung für eine seiner Rollen erforderlich ist, werden sie aufgefordert, neue Methoden beim nächsten Login zu konfigurieren.', 'users_mfa_reset_desc' => 'Dies wird alle konfigurierten Multifaktor-Authentifizierungsmethoden für diesen Nutzer zurücksetzen. Falls Multifaktor-Authentifizierung für eine seiner Rollen erforderlich ist, wird der Nutzer aufgefordert, neue Methoden beim nächsten Login zu konfigurieren.',
'users_mfa_reset_confirm' => 'Sind Sie sicher, dass Sie diese Multi-Faktor-Authentifizierungsmethode für diesen Nutzer zurücksetzen möchten?', 'users_mfa_reset_confirm' => 'Sind Sie sicher, dass Sie diese Multi-Faktor-Authentifizierungsmethode für diesen Nutzer zurücksetzen möchten?',
// API Tokens // API Tokens
@@ -366,6 +366,7 @@ return [
'ru' => 'Russisch', 'ru' => 'Russisch',
'sk' => 'Slowenisch', 'sk' => 'Slowenisch',
'sl' => 'Slowenisch', 'sl' => 'Slowenisch',
'sr' => 'Српски',
'sv' => 'Schwedisch', 'sv' => 'Schwedisch',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkisch', 'tr' => 'Türkisch',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'Die eingegebenen Anmeldedaten sind ungültig.', 'failed' => 'Die eingegebenen Anmeldedaten sind ungültig.',
'throttle' => 'Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.', 'throttle' => 'Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'Zu viele Multi-Faktor-Verifizierungsversuche. Bitte versuche es in :seconds Sekunden erneut.',
// Login & Register // Login & Register
'sign_up' => 'Registrieren', 'sign_up' => 'Registrieren',

View File

@@ -173,7 +173,7 @@ return [
'books_sort_desc' => 'Kapitel und Seiten innerhalb eines Buches verschieben, um dessen Inhalt zu reorganisieren. Andere Bücher können hinzugefügt werden, was das Verschieben von Kapiteln und Seiten zwischen Büchern erleichtert. Optional kann eine automatische Sortierregel erstellt werden, um den Inhalt dieses Buches nach Änderungen automatisch zu sortieren.', 'books_sort_desc' => 'Kapitel und Seiten innerhalb eines Buches verschieben, um dessen Inhalt zu reorganisieren. Andere Bücher können hinzugefügt werden, was das Verschieben von Kapiteln und Seiten zwischen Büchern erleichtert. Optional kann eine automatische Sortierregel erstellt werden, um den Inhalt dieses Buches nach Änderungen automatisch zu sortieren.',
'books_sort_auto_sort' => 'Auto-Sortieroption', 'books_sort_auto_sort' => 'Auto-Sortieroption',
'books_sort_auto_sort_active' => 'Automatische Sortierung aktiv: :sortName', 'books_sort_auto_sort_active' => 'Automatische Sortierung aktiv: :sortName',
'books_sort_auto_sort_creation_hint' => 'Auto sort option rules can be created in the "Lists & Sorting" settings area by a user with the relevant permissions.', 'books_sort_auto_sort_creation_hint' => 'Regeln für die automatische Sortierung können von einem Benutzer mit den entsprechenden Berechtigungen im Einstellungsbereich "Listen & Sortieren" erstellt werden.',
'books_sort_named' => 'Buch ":bookName" sortieren', 'books_sort_named' => 'Buch ":bookName" sortieren',
'books_sort_name' => 'Sortieren nach Namen', 'books_sort_name' => 'Sortieren nach Namen',
'books_sort_created' => 'Sortieren nach Erstellungsdatum', 'books_sort_created' => 'Sortieren nach Erstellungsdatum',
@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Seitenleiste umschalten', 'toggle_sidebar' => 'Seitenleiste umschalten',
'page_contents' => 'Page Contents', 'page_contents' => 'Seiteninhalt',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Es wurden keine Überschriften im Seiteninhalt gefunden.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'Das Inhaltsmenü wird aus allen auf der Seite verwendeten Überschriften generiert.',
'page_tags' => 'Seiten-Schlagwörter', 'page_tags' => 'Seiten-Schlagwörter',
'chapter_tags' => 'Kapitel-Schlagwörter', 'chapter_tags' => 'Kapitel-Schlagwörter',
'book_tags' => 'Buch-Schlagwörter', 'book_tags' => 'Buch-Schlagwörter',

View File

@@ -208,7 +208,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'role_all' => 'Alle', 'role_all' => 'Alle',
'role_own' => 'Eigene', 'role_own' => 'Eigene',
'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt', 'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt',
'role_controlled_by_page_delete' => 'Controlled by page delete permissions', 'role_controlled_by_page_delete' => 'Kontrolliert durch die Berechtigung zum Löschen einer Seite',
'role_save' => 'Rolle speichern', 'role_save' => 'Rolle speichern',
'role_users' => 'Dieser Rolle zugeordnete Benutzer', 'role_users' => 'Dieser Rolle zugeordnete Benutzer',
'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet', 'role_users_none' => 'Bisher sind dieser Rolle keine Benutzer zugeordnet',
@@ -266,8 +266,8 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'users_mfa_x_methods' => ':count Methode konfiguriert|:count Methoden konfiguriert', 'users_mfa_x_methods' => ':count Methode konfiguriert|:count Methoden konfiguriert',
'users_mfa_configure' => 'Methoden konfigurieren', 'users_mfa_configure' => 'Methoden konfigurieren',
'users_mfa_reset' => 'Setze Multifaktor-Authentifizierung zurück', 'users_mfa_reset' => 'Setze Multifaktor-Authentifizierung zurück',
'users_mfa_reset_desc' => 'Dies wird alle konfigurierten Multifaktor-Authentifizierungsmethoden für diesen Nutzer zurücksetzen. Falls Multifaktor-Authentifizierung für eine seiner Rollen erforderlich ist, werden sie aufgefordert, neue Methoden beim nächsten Login zu konfigurieren.', 'users_mfa_reset_desc' => 'Dies wird alle konfigurierten Multifaktor-Authentifizierungsmethoden für diesen Nutzer zurücksetzen. Falls Multifaktor-Authentifizierung für eine seiner Rollen erforderlich ist, wird der Nutzer aufgefordert, neue Methoden beim nächsten Login zu konfigurieren.',
'users_mfa_reset_confirm' => 'Sind Sie sicher, dass Sie diese Multi-Faktor-Authentifizierungsmethode für diesen Nutzer zurücksetzen möchten?', 'users_mfa_reset_confirm' => 'Bist du sicher, dass du diese Multi-Faktor-Authentifizierungsmethode für diesen Nutzer zurücksetzen möchtest?',
// API Tokens // API Tokens
'user_api_token_create' => 'Neuen API-Token erstellen', 'user_api_token_create' => 'Neuen API-Token erstellen',
@@ -367,6 +367,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung
'ru' => 'Russisch', 'ru' => 'Russisch',
'sk' => 'Slowenisch', 'sk' => 'Slowenisch',
'sl' => 'Slowenisch', 'sl' => 'Slowenisch',
'sr' => 'Српски',
'sv' => 'Schwedisch', 'sv' => 'Schwedisch',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkisch', 'tr' => 'Türkisch',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Ruso', 'ru' => 'Ruso',
'sk' => 'Eslovaco', 'sk' => 'Eslovaco',
'sl' => 'Esloveno', 'sl' => 'Esloveno',
'sr' => 'Српски',
'sv' => 'Sueco', 'sv' => 'Sueco',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Turco', 'tr' => 'Turco',

View File

@@ -367,6 +367,7 @@ return [
'ru' => 'Ruso', 'ru' => 'Ruso',
'sk' => 'Eslovaco', 'sk' => 'Eslovaco',
'sl' => 'Esloveno', 'sl' => 'Esloveno',
'sr' => 'Српски',
'sv' => 'Sueco', 'sv' => 'Sueco',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Turco', 'tr' => 'Turco',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский (vene keel)', 'ru' => 'Русский (vene keel)',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Sloveenia', 'sl' => 'Sloveenia',
'sr' => 'Српски',
'sv' => 'Rootsi', 'sv' => 'Rootsi',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türgi', 'tr' => 'Türgi',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Russe', 'ru' => 'Russe',
'sk' => 'Slovaque', 'sk' => 'Slovaque',
'sl' => 'Slovène', 'sl' => 'Slovène',
'sr' => 'Српски',
'sv' => 'Suédois', 'sv' => 'Suédois',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Turc', 'tr' => 'Turc',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,8 +366,9 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'Thai',
'tr' => 'Türkçe', 'tr' => 'Türkçe',
'uk' => 'Українська', 'uk' => 'Українська',
'uz' => 'Ozbekcha', 'uz' => 'Ozbekcha',

View File

@@ -99,7 +99,7 @@ return [
'user_update_notification' => 'Pengguna berhasil diperbarui', 'user_update_notification' => 'Pengguna berhasil diperbarui',
'user_delete' => 'pengguna yang dihapus', 'user_delete' => 'pengguna yang dihapus',
'user_delete_notification' => 'Pengguna berhasil dihapus', 'user_delete_notification' => 'Pengguna berhasil dihapus',
'user_mfa_reset' => 'reset MFA for user', 'user_mfa_reset' => 'atur ulang MFA untuk pengguna',
'user_mfa_reset_notification' => 'Multi-factor authentication methods reset', 'user_mfa_reset_notification' => 'Multi-factor authentication methods reset',
// API Tokens // API Tokens

View File

@@ -8,8 +8,8 @@
return [ return [
// General editor terms // General editor terms
'general' => 'Umum', 'general' => 'Umum',
'advanced' => 'Lanjutan', 'advanced' => 'Tingkat lanjut',
'none' => 'Tidak Ada', 'none' => 'Tidak Satupun',
'cancel' => 'Batal', 'cancel' => 'Batal',
'save' => 'Simpan', 'save' => 'Simpan',
'close' => 'Tutup', 'close' => 'Tutup',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,8 +366,9 @@ return [
'ru' => 'Russo', 'ru' => 'Russo',
'sk' => 'Sloveno', 'sk' => 'Sloveno',
'sl' => 'Sloveno', 'sl' => 'Sloveno',
'sr' => 'Српски',
'sv' => 'Svedese', 'sv' => 'Svedese',
'th' => 'ภาษาไทย', 'th' => 'Thailandese',
'tr' => 'Turco', 'tr' => 'Turco',
'uk' => 'Ucraino', 'uk' => 'Ucraino',
'uz' => 'Ozbekcha', 'uz' => 'Ozbekcha',

View File

@@ -173,7 +173,7 @@ return [
'books_sort_desc' => 'ブック内のチャプタおよびページを移動して内容を再編成できます。他のブックを並べて、ブック間でチャプタやページを簡単に移動することもできます。オプションで自動ソートルールを設定すると、変更時にブックの内容を自動的にソートすることができます。', 'books_sort_desc' => 'ブック内のチャプタおよびページを移動して内容を再編成できます。他のブックを並べて、ブック間でチャプタやページを簡単に移動することもできます。オプションで自動ソートルールを設定すると、変更時にブックの内容を自動的にソートすることができます。',
'books_sort_auto_sort' => '自動ソートオプション', 'books_sort_auto_sort' => '自動ソートオプション',
'books_sort_auto_sort_active' => '自動ソート有効: :sortName', 'books_sort_auto_sort_active' => '自動ソート有効: :sortName',
'books_sort_auto_sort_creation_hint' => 'Auto sort option rules can be created in the "Lists & Sorting" settings area by a user with the relevant permissions.', 'books_sort_auto_sort_creation_hint' => '自動ソートオプションのルールは、関連する権限を持ったユーザーによって設定の「一覧とソート」エリアで作成できます。',
'books_sort_named' => 'ブック「:bookName」を並べ替え', 'books_sort_named' => 'ブック「:bookName」を並べ替え',
'books_sort_name' => '名前で並べ替え', 'books_sort_name' => '名前で並べ替え',
'books_sort_created' => '作成日で並べ替え', 'books_sort_created' => '作成日で並べ替え',

View File

@@ -207,7 +207,7 @@ return [
'role_all' => '全て', 'role_all' => '全て',
'role_own' => '自身', 'role_own' => '自身',
'role_controlled_by_asset' => 'このアセットに対し、右記の操作を許可:', 'role_controlled_by_asset' => 'このアセットに対し、右記の操作を許可:',
'role_controlled_by_page_delete' => 'Controlled by page delete permissions', 'role_controlled_by_page_delete' => 'ページ削除権限を適用',
'role_save' => '役割を保存', 'role_save' => '役割を保存',
'role_users' => 'この役割を持つユーザー', 'role_users' => 'この役割を持つユーザー',
'role_users_none' => 'この役割が付与されたユーザーはいません', 'role_users_none' => 'この役割が付与されたユーザーはいません',
@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -331,7 +331,7 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Zijbalk Tonen/Verbergen', 'toggle_sidebar' => 'Zijbalk Tonen/Verbergen',
'page_contents' => 'Page Contents', 'page_contents' => 'Pagina Inhoud',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'No headings were found in the page content.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.',
'page_tags' => 'Pagina Labels', 'page_tags' => 'Pagina Labels',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский (Russisch)', 'ru' => 'Русский (Russisch)',
'sk' => 'Slovensky (Slowaaks)', 'sk' => 'Slovensky (Slowaaks)',
'sl' => 'Slovenščina (Sloveens)', 'sl' => 'Slovenščina (Sloveens)',
'sr' => 'Српски',
'sv' => 'Svenska (Zweeds)', 'sv' => 'Svenska (Zweeds)',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe (Turks)', 'tr' => 'Türkçe (Turks)',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -99,8 +99,8 @@ return [
'user_update_notification' => 'Użytkownik zaktualizowany pomyślnie', 'user_update_notification' => 'Użytkownik zaktualizowany pomyślnie',
'user_delete' => 'usunięto użytkownika', 'user_delete' => 'usunięto użytkownika',
'user_delete_notification' => 'Użytkownik pomyślnie usunięty', 'user_delete_notification' => 'Użytkownik pomyślnie usunięty',
'user_mfa_reset' => 'reset MFA for user', 'user_mfa_reset' => 'zresetuj MFA dla użytkownika',
'user_mfa_reset_notification' => 'Multi-factor authentication methods reset', 'user_mfa_reset_notification' => 'Przywracanie metod uwierzytelniania wieloskładnikowego',
// API Tokens // API Tokens
'api_token_create' => 'utworzono token API', 'api_token_create' => 'utworzono token API',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'Wprowadzone poświadczenia są nieprawidłowe.', 'failed' => 'Wprowadzone poświadczenia są nieprawidłowe.',
'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds s.', 'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds s.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'Zbyt wiele prób weryfikacji wieloskładnikowej. Spróbuj ponownie za :seconds sekund.',
// Login & Register // Login & Register
'sign_up' => 'Zarejestruj się', 'sign_up' => 'Zarejestruj się',

View File

@@ -170,10 +170,10 @@ return [
'books_search_this' => 'Wyszukaj w tej książce', 'books_search_this' => 'Wyszukaj w tej książce',
'books_navigation' => 'Nawigacja po książce', 'books_navigation' => 'Nawigacja po książce',
'books_sort' => 'Sortuj zawartość książki', 'books_sort' => 'Sortuj zawartość książki',
'books_sort_desc' => 'Move chapters and pages within a book to reorganise its contents. Other books can be added which allows easy moving of chapters and pages between books. Optionally an auto sort rule can be set to automatically sort this book\'s contents upon changes.', 'books_sort_desc' => 'Przenieś rozdziały i strony w książce w celu reorganizacji jej treści. Można dodać inne książki, które umożliwiają łatwe przenoszenie rozdziałów i stron między książkami. Opcjonalnie reguła automatycznego sortowania może być ustawiona, aby automatycznie sortować zawartość tej książki po jej zmianach.',
'books_sort_auto_sort' => 'Opcja automatycznego sortowania', 'books_sort_auto_sort' => 'Opcja automatycznego sortowania',
'books_sort_auto_sort_active' => 'Automatyczne sortowanie aktywne: :sortName', 'books_sort_auto_sort_active' => 'Automatyczne sortowanie aktywne: :sortName',
'books_sort_auto_sort_creation_hint' => 'Auto sort option rules can be created in the "Lists & Sorting" settings area by a user with the relevant permissions.', 'books_sort_auto_sort_creation_hint' => 'Reguły opcji automatycznego sortowania mogą być tworzone w obszarze ustawień "Listy i sortowanie" przez użytkownika z odpowiednimi uprawnieniami.',
'books_sort_named' => 'Sortuj książkę :bookName', 'books_sort_named' => 'Sortuj książkę :bookName',
'books_sort_name' => 'Sortuj według nazwy', 'books_sort_name' => 'Sortuj według nazwy',
'books_sort_created' => 'Sortuj według daty utworzenia', 'books_sort_created' => 'Sortuj według daty utworzenia',
@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Przełącz pasek boczny', 'toggle_sidebar' => 'Przełącz pasek boczny',
'page_contents' => 'Page Contents', 'page_contents' => 'Zawartość strony',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Nie znaleziono nagłówków w treści strony.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'Menu zawartości jest generowane z dowolnych formatów nagłówków używanych na stronie.',
'page_tags' => 'Tagi strony', 'page_tags' => 'Tagi strony',
'chapter_tags' => 'Tagi rozdziału', 'chapter_tags' => 'Tagi rozdziału',
'book_tags' => 'Tagi książki', 'book_tags' => 'Tagi książki',

View File

@@ -125,7 +125,7 @@ return [
'api_incorrect_token_secret' => 'Podany sekret dla tego API jest nieprawidłowy', 'api_incorrect_token_secret' => 'Podany sekret dla tego API jest nieprawidłowy',
'api_user_no_api_permission' => 'Właściciel używanego tokenu API nie ma uprawnień do wykonywania zapytań do API', 'api_user_no_api_permission' => 'Właściciel używanego tokenu API nie ma uprawnień do wykonywania zapytań do API',
'api_user_token_expired' => 'Token uwierzytelniania wygasł', 'api_user_token_expired' => 'Token uwierzytelniania wygasł',
'api_cookie_auth_only_get' => 'Only GET requests are allowed when using the API with cookie-based authentication', 'api_cookie_auth_only_get' => 'Tylko żądania GET są dozwolone podczas korzystania z API z uwierzytelniania opartego na plikach cookie',
// Settings & Maintenance // Settings & Maintenance
'maintenance_test_email_failure' => 'Błąd podczas wysyłania testowej wiadomości e-mail:', 'maintenance_test_email_failure' => 'Błąd podczas wysyłania testowej wiadomości e-mail:',

View File

@@ -104,7 +104,7 @@ return [
'sort_rule_op_chapters_first' => 'Rozdziały na początku', 'sort_rule_op_chapters_first' => 'Rozdziały na początku',
'sort_rule_op_chapters_last' => 'Rozdziały na końcu', 'sort_rule_op_chapters_last' => 'Rozdziały na końcu',
'sorting_page_limits' => 'Limity wyświetlania per strona', 'sorting_page_limits' => 'Limity wyświetlania per strona',
'sorting_page_limits_desc' => 'Set how many items to show per-page in various lists within the system. Typically a lower amount will be more performant, while a higher amount avoids the need to click through multiple pages. Using a multiple of 6 is recommended.', 'sorting_page_limits_desc' => 'Ustaw ile elementów pokazywać na stronie w różnych listach w systemie. Zazwyczaj mniejsza ilość będzie bardziej wydajna, podczas gdy większa ilość unika konieczności kliknięcia na wiele stron. Zaleca się stosowanie wielokrotności 6 razy.',
// Maintenance settings // Maintenance settings
'maint' => 'Konserwacja', 'maint' => 'Konserwacja',
@@ -207,7 +207,7 @@ return [
'role_all' => 'Wszyscy', 'role_all' => 'Wszyscy',
'role_own' => 'Własne', 'role_own' => 'Własne',
'role_controlled_by_asset' => 'Kontrolowane przez zasób, do którego zostały udostępnione', 'role_controlled_by_asset' => 'Kontrolowane przez zasób, do którego zostały udostępnione',
'role_controlled_by_page_delete' => 'Controlled by page delete permissions', 'role_controlled_by_page_delete' => 'Kontrolowane przez uprawnienia do usuwania stron',
'role_save' => 'Zapisz rolę', 'role_save' => 'Zapisz rolę',
'role_users' => 'Użytkownicy w tej roli', 'role_users' => 'Użytkownicy w tej roli',
'role_users_none' => 'Brak użytkowników zapisanych do tej roli', 'role_users_none' => 'Brak użytkowników zapisanych do tej roli',
@@ -264,9 +264,9 @@ return [
'users_mfa_desc' => 'Skonfiguruj uwierzytelnianie wieloskładnikowe jako dodatkową warstwę bezpieczeństwa dla swojego konta użytkownika.', 'users_mfa_desc' => 'Skonfiguruj uwierzytelnianie wieloskładnikowe jako dodatkową warstwę bezpieczeństwa dla swojego konta użytkownika.',
'users_mfa_x_methods' => ':count metoda skonfigurowana|:count metody skonfigurowane', 'users_mfa_x_methods' => ':count metoda skonfigurowana|:count metody skonfigurowane',
'users_mfa_configure' => 'Konfiguruj metody', 'users_mfa_configure' => 'Konfiguruj metody',
'users_mfa_reset' => 'Reset Multi-Factor Authentication Methods', 'users_mfa_reset' => 'Resetuj metody uwierzytelniania wieloetapowego',
'users_mfa_reset_desc' => 'This will reset and clear all configured multi-factor authentication methods for this user. If multi-factor authentication is required by any of their roles, they\'ll be prompted to configure new methods on their next login.', 'users_mfa_reset_desc' => 'Spowoduje to zresetowanie i wyczyszczenie wszystkich skonfigurowanych metod uwierzytelniania wieloetapowego dla tego użytkownika. Jeśli uwierzytelnianie wieloetapowe jest wymagane przez dowolną z ich ról, zostaną poproszone o skonfigurowanie nowych metod przy następnym logowaniu.',
'users_mfa_reset_confirm' => 'Are you sure you want to reset multi-factor authentication for this user?', 'users_mfa_reset_confirm' => 'Czy na pewno chcesz zresetować uwierzytelnianie wieloskładnikowe dla tego użytkownika?',
// API Tokens // API Tokens
'user_api_token_create' => 'Utwórz klucz API', 'user_api_token_create' => 'Utwórz klucz API',
@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -99,8 +99,8 @@ return [
'user_update_notification' => 'Utilizador atualizado com sucesso', 'user_update_notification' => 'Utilizador atualizado com sucesso',
'user_delete' => 'utilizador eliminado', 'user_delete' => 'utilizador eliminado',
'user_delete_notification' => 'Utilizador removido com sucesso', 'user_delete_notification' => 'Utilizador removido com sucesso',
'user_mfa_reset' => 'reset MFA for user', 'user_mfa_reset' => 'reiniciar a MFA para o utilizador',
'user_mfa_reset_notification' => 'Multi-factor authentication methods reset', 'user_mfa_reset_notification' => 'Reinicialização dos métodos de autenticação multifatorial',
// API Tokens // API Tokens
'api_token_create' => 'token API criado', 'api_token_create' => 'token API criado',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'Estas credenciais não coincidem com os nossos registos.', 'failed' => 'Estas credenciais não coincidem com os nossos registos.',
'throttle' => 'Demasiadas tentativas de acesso. Tente novamente em :seconds segundos.', 'throttle' => 'Demasiadas tentativas de acesso. Tente novamente em :seconds segundos.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'Foram efetuadas demasiadas tentativas de verificação multifatorial. Por favor, tente novamente daqui a :seconds segundos.',
// Login & Register // Login & Register
'sign_up' => 'Registar', 'sign_up' => 'Registar',

View File

@@ -48,7 +48,7 @@ return [
'superscript' => 'Superior à linha', 'superscript' => 'Superior à linha',
'subscript' => 'Inferior à linha', 'subscript' => 'Inferior à linha',
'text_color' => 'Cor do texto', 'text_color' => 'Cor do texto',
'highlight_color' => 'Highlight color', 'highlight_color' => 'Cor de destaque',
'custom_color' => 'Cor personalizada', 'custom_color' => 'Cor personalizada',
'remove_color' => 'Remover cor', 'remove_color' => 'Remover cor',
'background_color' => 'Cor de fundo', 'background_color' => 'Cor de fundo',
@@ -83,9 +83,9 @@ return [
'table_properties' => 'Propriedades da tabela', 'table_properties' => 'Propriedades da tabela',
'table_properties_title' => 'Propriedades da Tabela', 'table_properties_title' => 'Propriedades da Tabela',
'delete_table' => 'Eliminar tabela', 'delete_table' => 'Eliminar tabela',
'table_clear_formatting' => 'Clear table formatting', 'table_clear_formatting' => 'Limpar formatação de tabela',
'resize_to_contents' => 'Resize to contents', 'resize_to_contents' => 'Redimensionar para o conteúdo',
'row_header' => 'Row header', 'row_header' => 'Cabeçalho da linha',
'insert_row_before' => 'Inserir linha antes', 'insert_row_before' => 'Inserir linha antes',
'insert_row_after' => 'Inserir linha depois', 'insert_row_after' => 'Inserir linha depois',
'delete_row' => 'Eliminar linha', 'delete_row' => 'Eliminar linha',
@@ -149,7 +149,7 @@ return [
'url' => 'URL', 'url' => 'URL',
'text_to_display' => 'Texto a ser exibido', 'text_to_display' => 'Texto a ser exibido',
'title' => 'Título', 'title' => 'Título',
'browse_links' => 'Browse links', 'browse_links' => 'Procurar ligações',
'open_link' => 'Abrir ligação', 'open_link' => 'Abrir ligação',
'open_link_in' => 'Abrir ligação em...', 'open_link_in' => 'Abrir ligação em...',
'open_link_current' => 'Janela atual', 'open_link_current' => 'Janela atual',
@@ -167,7 +167,7 @@ return [
'about_title' => 'Sobre o Editor WYSIWYG', 'about_title' => 'Sobre o Editor WYSIWYG',
'editor_license' => 'Editor da licença de direitos autorais', 'editor_license' => 'Editor da licença de direitos autorais',
'editor_lexical_license' => 'Este editor é criado como um fork do :lexicaLink que é distribuído sob a licença MIT.', 'editor_lexical_license' => 'Este editor é criado como um fork do :lexicaLink que é distribuído sob a licença MIT.',
'editor_lexical_license_link' => 'Full license details can be found here.', 'editor_lexical_license_link' => 'Detalhes da licença completa podem ser encontrados aqui.',
'editor_tiny_license' => 'Este editor foi criado com :tinyLink que é fornecido sob a licença MIT.', 'editor_tiny_license' => 'Este editor foi criado com :tinyLink que é fornecido sob a licença MIT.',
'editor_tiny_license_link' => 'Os dados relativos aos direitos de autor e à licença do TinyMCE podem ser encontrados aqui.', 'editor_tiny_license_link' => 'Os dados relativos aos direitos de autor e à licença do TinyMCE podem ser encontrados aqui.',
'save_continue' => 'Salvar página e continuar', 'save_continue' => 'Salvar página e continuar',

View File

@@ -46,27 +46,27 @@ return [
'import' => 'Importar', 'import' => 'Importar',
'import_validate' => 'Validar Importação', 'import_validate' => 'Validar Importação',
'import_desc' => 'Importar livros, capítulos e páginas usando uma exportação ZIP portátil da mesma ou uma instância diferente. Selecione um arquivo ZIP para prosseguir. Após o carregamento e validação do arquivo, conseguirá configurar e confirmar a importação na próxima visualização.', 'import_desc' => 'Importar livros, capítulos e páginas usando uma exportação ZIP portátil da mesma ou uma instância diferente. Selecione um arquivo ZIP para prosseguir. Após o carregamento e validação do arquivo, conseguirá configurar e confirmar a importação na próxima visualização.',
'import_zip_select' => 'Select ZIP file to upload', 'import_zip_select' => 'Selecione o ficheiro ZIP para enviar',
'import_zip_validation_errors' => 'Errors were detected while validating the provided ZIP file:', 'import_zip_validation_errors' => 'Foram detetados erros ao validar o ficheiro ZIP fornecido:',
'import_pending' => 'Pending Imports', 'import_pending' => 'Aguardando importação',
'import_pending_none' => 'No imports have been started.', 'import_pending_none' => 'Nenhuma importação foi iniciada.',
'import_continue' => 'Continue Import', 'import_continue' => 'Continuar importação',
'import_continue_desc' => 'Review the content due to be imported from the uploaded ZIP file. When ready, run the import to add its contents to this system. The uploaded ZIP import file will be automatically removed on successful import.', 'import_continue_desc' => 'Verifique o conteúdo a importar a partir do ficheiro ZIP carregado. Quando estiver pronto, execute a importação para adicionar o seu conteúdo a este sistema. O ficheiro ZIP de importação carregado será automaticamente removido após a importação bem-sucedida.',
'import_details' => 'Import Details', 'import_details' => 'Detalhes da importação',
'import_run' => 'Run Import', 'import_run' => 'Executar Importação',
'import_size' => ':size Import ZIP Size', 'import_size' => ':size Tamanho do ZIP importado',
'import_uploaded_at' => 'Uploaded :relativeTime', 'import_uploaded_at' => 'Carregado :relativeTime',
'import_uploaded_by' => 'Uploaded by', 'import_uploaded_by' => 'Carregado por',
'import_location' => 'Import Location', 'import_location' => 'Local de Importação',
'import_location_desc' => 'Select a target location for your imported content. You\'ll need the relevant permissions to create within the location you choose.', 'import_location_desc' => 'Selecione um local de destino para o seu conteúdo importado. Terá de dispor das permissões necessárias para criar conteúdo no local que escolher.',
'import_delete_confirm' => 'Are you sure you want to delete this import?', 'import_delete_confirm' => 'Tem a certeza que pretende eliminar a importação?',
'import_delete_desc' => 'Isto irá eliminar o arquivo ZIP de importação enviado e não pode ser desfeito.', 'import_delete_desc' => 'Isto irá eliminar o arquivo ZIP de importação enviado e não pode ser desfeito.',
'import_errors' => 'Import Errors', 'import_errors' => 'Erros de Importação',
'import_errors_desc' => 'The follow errors occurred during the import attempt:', 'import_errors_desc' => 'Ocorreram os seguintes erros durante a tentativa de importação:',
'breadcrumb_siblings_for_page' => 'Navigate siblings for page', 'breadcrumb_siblings_for_page' => 'Navegar itens do mesmo nível por página',
'breadcrumb_siblings_for_chapter' => 'Navigate siblings for chapter', 'breadcrumb_siblings_for_chapter' => 'Navegar itens do mesmo nível por capítulo',
'breadcrumb_siblings_for_book' => 'Navigate siblings for book', 'breadcrumb_siblings_for_book' => 'Navegar itens do mesmo nível por livro',
'breadcrumb_siblings_for_bookshelf' => 'Navigate siblings for shelf', 'breadcrumb_siblings_for_bookshelf' => 'Navegar itens do mesmo nível por estante',
// Permissions and restrictions // Permissions and restrictions
'permissions' => 'Permissões', 'permissions' => 'Permissões',
@@ -172,8 +172,8 @@ return [
'books_sort' => 'Ordenar Conteúdos do Livro', 'books_sort' => 'Ordenar Conteúdos do Livro',
'books_sort_desc' => 'Mova capítulos e páginas de um livro para reorganizar o seu conteúdo. É possível acrescentar outros livros, o que permite uma movimentação fácil de capítulos e páginas entre livros. Opcionalmente, uma regra de organização automática pode ser definida para classificar automaticamente o conteúdo deste livro após alterações.', 'books_sort_desc' => 'Mova capítulos e páginas de um livro para reorganizar o seu conteúdo. É possível acrescentar outros livros, o que permite uma movimentação fácil de capítulos e páginas entre livros. Opcionalmente, uma regra de organização automática pode ser definida para classificar automaticamente o conteúdo deste livro após alterações.',
'books_sort_auto_sort' => '', 'books_sort_auto_sort' => '',
'books_sort_auto_sort_active' => 'Auto Sort Active: :sortName', 'books_sort_auto_sort_active' => 'Ordenação automática ativada: :sortName',
'books_sort_auto_sort_creation_hint' => 'Auto sort option rules can be created in the "Lists & Sorting" settings area by a user with the relevant permissions.', 'books_sort_auto_sort_creation_hint' => 'As regras da opção de ordenação automática podem ser criadas na área de configurações "Listas e Ordenação" por um utilizador com as permissões necessárias.',
'books_sort_named' => 'Ordenar Livro :bookName', 'books_sort_named' => 'Ordenar Livro :bookName',
'books_sort_name' => 'Ordenar por Nome', 'books_sort_name' => 'Ordenar por Nome',
'books_sort_created' => 'Ordenar por Data de Criação', 'books_sort_created' => 'Ordenar por Data de Criação',
@@ -235,7 +235,7 @@ return [
'pages_delete_draft' => 'Eliminar Rascunho de Página', 'pages_delete_draft' => 'Eliminar Rascunho de Página',
'pages_delete_success' => 'Página eliminada', 'pages_delete_success' => 'Página eliminada',
'pages_delete_draft_success' => 'Rascunho de página eliminado', 'pages_delete_draft_success' => 'Rascunho de página eliminado',
'pages_delete_warning_template' => 'This page is in active use as a book or chapter default page template. These books or chapters will no longer have a default page template assigned after this page is deleted.', 'pages_delete_warning_template' => 'Esta página é atualmente utilizada como modelo de página predefinido para livros ou capítulos. Após a eliminação desta página, estes livros ou capítulos deixarão de ter um modelo de página predefinido atribuído.',
'pages_delete_confirm' => 'Tem certeza que deseja eliminar a página?', 'pages_delete_confirm' => 'Tem certeza que deseja eliminar a página?',
'pages_delete_draft_confirm' => 'Tem certeza que deseja eliminar o rascunho de página?', 'pages_delete_draft_confirm' => 'Tem certeza que deseja eliminar o rascunho de página?',
'pages_editing_named' => 'A Editar a Página :pageName', 'pages_editing_named' => 'A Editar a Página :pageName',
@@ -252,8 +252,8 @@ return [
'pages_edit_switch_to_markdown_clean' => '(Conteúdo Limitado)', 'pages_edit_switch_to_markdown_clean' => '(Conteúdo Limitado)',
'pages_edit_switch_to_markdown_stable' => '(Conteúdo Estável)', 'pages_edit_switch_to_markdown_stable' => '(Conteúdo Estável)',
'pages_edit_switch_to_wysiwyg' => 'Alternar para o editor WYSIWYG', 'pages_edit_switch_to_wysiwyg' => 'Alternar para o editor WYSIWYG',
'pages_edit_switch_to_new_wysiwyg' => 'Switch to new WYSIWYG', 'pages_edit_switch_to_new_wysiwyg' => 'Mudar para o novo WYSIWYG',
'pages_edit_switch_to_new_wysiwyg_desc' => '(In Beta Testing)', 'pages_edit_switch_to_new_wysiwyg_desc' => '(Em fase de testes beta)',
'pages_edit_set_changelog' => 'Relatar Alterações', 'pages_edit_set_changelog' => 'Relatar Alterações',
'pages_edit_enter_changelog_desc' => 'Digite uma breve descrição das alterações efetuadas por si', 'pages_edit_enter_changelog_desc' => 'Digite uma breve descrição das alterações efetuadas por si',
'pages_edit_enter_changelog' => 'Inserir Alterações', 'pages_edit_enter_changelog' => 'Inserir Alterações',
@@ -273,7 +273,7 @@ return [
'pages_md_insert_drawing' => 'Inserir Desenho', 'pages_md_insert_drawing' => 'Inserir Desenho',
'pages_md_show_preview' => 'Mostrar pré-visualização', 'pages_md_show_preview' => 'Mostrar pré-visualização',
'pages_md_sync_scroll' => 'Sincronizar pré-visualização', 'pages_md_sync_scroll' => 'Sincronizar pré-visualização',
'pages_md_plain_editor' => 'Plaintext editor', 'pages_md_plain_editor' => 'Editor de texto simples',
'pages_drawing_unsaved' => 'Encontrado um rascunho não guardado', 'pages_drawing_unsaved' => 'Encontrado um rascunho não guardado',
'pages_drawing_unsaved_confirm' => 'Dados de um rascunho não guardado foi encontrado de um tentativa anteriormente falhada. Deseja restaurar e continuar a edição desse rascunho?', 'pages_drawing_unsaved_confirm' => 'Dados de um rascunho não guardado foi encontrado de um tentativa anteriormente falhada. Deseja restaurar e continuar a edição desse rascunho?',
'pages_not_in_chapter' => 'A página não está dentro de um capítulo', 'pages_not_in_chapter' => 'A página não está dentro de um capítulo',
@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => 'Alternar barra lateral', 'toggle_sidebar' => 'Alternar barra lateral',
'page_contents' => 'Page Contents', 'page_contents' => 'Conteúdo da Página',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Não foram encontrados títulos no conteúdo da página.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'O índice é gerado a partir dos formatos de título utilizados na página.',
'page_tags' => 'Etiquetas de Página', 'page_tags' => 'Etiquetas de Página',
'chapter_tags' => 'Etiquetas do Capítulo', 'chapter_tags' => 'Etiquetas do Capítulo',
'book_tags' => 'Etiquetas do Livro', 'book_tags' => 'Etiquetas do Livro',
@@ -401,11 +401,11 @@ return [
'comment' => 'Comentário', 'comment' => 'Comentário',
'comments' => 'Comentários', 'comments' => 'Comentários',
'comment_add' => 'Adicionar Comentário', 'comment_add' => 'Adicionar Comentário',
'comment_none' => 'No comments to display', 'comment_none' => 'Não há comentários para apresentar',
'comment_placeholder' => 'Digite aqui os seus comentários', 'comment_placeholder' => 'Digite aqui os seus comentários',
'comment_thread_count' => ':count Comment Thread|:count Comment Threads', 'comment_thread_count' => ':count Tópico de comentários|:count Tópicos de comentários',
'comment_archived_count' => ':count Archived', 'comment_archived_count' => ':count Arquivado',
'comment_archived_threads' => 'Archived Threads', 'comment_archived_threads' => 'Tópicos Arquivados',
'comment_save' => 'Guardar comentário', 'comment_save' => 'Guardar comentário',
'comment_new' => 'Comentário Novo', 'comment_new' => 'Comentário Novo',
'comment_created' => 'comentado :createDiff', 'comment_created' => 'comentado :createDiff',
@@ -414,14 +414,14 @@ return [
'comment_deleted_success' => 'Comentário removido', 'comment_deleted_success' => 'Comentário removido',
'comment_created_success' => 'Comentário adicionado', 'comment_created_success' => 'Comentário adicionado',
'comment_updated_success' => 'Comentário editado', 'comment_updated_success' => 'Comentário editado',
'comment_archive_success' => 'Comment archived', 'comment_archive_success' => 'Comentário arquivado',
'comment_unarchive_success' => 'Comment un-archived', 'comment_unarchive_success' => 'Comentário não arquivado',
'comment_view' => 'View comment', 'comment_view' => 'Ver comentário',
'comment_jump_to_thread' => 'Jump to thread', 'comment_jump_to_thread' => 'Ir para o tópico',
'comment_delete_confirm' => 'Tem a certeza de que deseja eliminar este comentário?', 'comment_delete_confirm' => 'Tem a certeza de que deseja eliminar este comentário?',
'comment_in_reply_to' => 'Em resposta à :commentId', 'comment_in_reply_to' => 'Em resposta à :commentId',
'comment_reference' => 'Reference', 'comment_reference' => 'Referência',
'comment_reference_outdated' => '(Outdated)', 'comment_reference_outdated' => '(Desatualizado)',
'comment_editor_explain' => 'Aqui estão os comentários que foram deixados nesta página. Comentários podem ser adicionados e geridos ao visualizar a página guardada.', 'comment_editor_explain' => 'Aqui estão os comentários que foram deixados nesta página. Comentários podem ser adicionados e geridos ao visualizar a página guardada.',
// Revision // Revision
@@ -452,7 +452,7 @@ return [
// References // References
'references' => 'Referências', 'references' => 'Referências',
'references_none' => 'Não há referências registadas para este item.', 'references_none' => 'Não há referências registadas para este item.',
'references_to_desc' => 'Listed below is all the known content in the system that links to this item.', 'references_to_desc' => 'A seguir, encontra-se uma lista de todo o conteúdo conhecido no sistema associado a este item.',
// Watch Options // Watch Options
'watch' => 'Ver', 'watch' => 'Ver',
@@ -470,11 +470,11 @@ return [
'watch_desc_comments_page' => 'Notificar sobre alterações na página e novos comentários.', 'watch_desc_comments_page' => 'Notificar sobre alterações na página e novos comentários.',
'watch_change_default' => 'Alterar preferências padrão de notificação', 'watch_change_default' => 'Alterar preferências padrão de notificação',
'watch_detail_ignore' => 'Ignorar notificações', 'watch_detail_ignore' => 'Ignorar notificações',
'watch_detail_new' => 'Watching for new pages', 'watch_detail_new' => 'A observar novas páginas',
'watch_detail_updates' => 'Watching new pages and updates', 'watch_detail_updates' => 'A observar novas páginas e atualizações',
'watch_detail_comments' => 'Watching new pages, updates & comments', 'watch_detail_comments' => 'A observar novas páginas, atualizações e comentários',
'watch_detail_parent_book' => 'Watching via parent book', 'watch_detail_parent_book' => 'A observar via livro pai',
'watch_detail_parent_book_ignore' => 'A ignorar através do livro pai', 'watch_detail_parent_book_ignore' => 'A ignorar através do livro pai',
'watch_detail_parent_chapter' => 'Watching via parent chapter', 'watch_detail_parent_chapter' => 'A observar via capítulo pai',
'watch_detail_parent_chapter_ignore' => 'Ignoring via parent chapter', 'watch_detail_parent_chapter_ignore' => 'A ignorar via capítulo pai',
]; ];

View File

@@ -10,7 +10,7 @@ return [
// Auth // Auth
'error_user_exists_different_creds' => 'Um utilizador com o endereço de e-mail :email já existe mas com credenciais diferentes.', 'error_user_exists_different_creds' => 'Um utilizador com o endereço de e-mail :email já existe mas com credenciais diferentes.',
'auth_pre_register_theme_prevention' => 'User account could not be registered for the provided details', 'auth_pre_register_theme_prevention' => 'Não foi possível registar a conta de utilizador com os detalhes fornecidos',
'email_already_confirmed' => 'E-mail já foi confirmado. Tente iniciar sessão.', 'email_already_confirmed' => 'E-mail já foi confirmado. Tente iniciar sessão.',
'email_confirmation_invalid' => 'Este token de confirmação não é válido ou já foi utilizado. Por favor, tente registar-se novamente.', 'email_confirmation_invalid' => 'Este token de confirmação não é válido ou já foi utilizado. Por favor, tente registar-se novamente.',
'email_confirmation_expired' => 'O token de confirmação já expirou. Um novo e-mail foi enviado.', 'email_confirmation_expired' => 'O token de confirmação já expirou. Um novo e-mail foi enviado.',
@@ -37,7 +37,7 @@ return [
'social_driver_not_found' => 'Social driver não encontrado', 'social_driver_not_found' => 'Social driver não encontrado',
'social_driver_not_configured' => 'Os seus parâmetros sociais de :socialAccount não estão corretamente configurados.', 'social_driver_not_configured' => 'Os seus parâmetros sociais de :socialAccount não estão corretamente configurados.',
'invite_token_expired' => 'Este link de convite expirou. Alternativamente, pode tentar redefinir a senha da sua conta.', 'invite_token_expired' => 'Este link de convite expirou. Alternativamente, pode tentar redefinir a senha da sua conta.',
'login_user_not_found' => 'A user for this action could not be found.', 'login_user_not_found' => 'Não foi possível encontrar um utilizador para esta ação.',
// System // System
'path_not_writable' => 'O caminho do arquivo :filePath não pôde ser carregado. Certifique-se de que tem permissões de escrita no servidor.', 'path_not_writable' => 'O caminho do arquivo :filePath não pôde ser carregado. Certifique-se de que tem permissões de escrita no servidor.',
@@ -51,9 +51,9 @@ return [
'image_upload_error' => 'Ocorreu um erro no carregamento da imagem', 'image_upload_error' => 'Ocorreu um erro no carregamento da imagem',
'image_upload_type_error' => 'O tipo de imagem enviada é inválida', 'image_upload_type_error' => 'O tipo de imagem enviada é inválida',
'image_upload_replace_type' => 'A imagem de substituição deverá ser do mesmo tipo que a anterior', 'image_upload_replace_type' => 'A imagem de substituição deverá ser do mesmo tipo que a anterior',
'image_upload_memory_limit' => 'Failed to handle image upload and/or create thumbnails due to system resource limits.', 'image_upload_memory_limit' => 'Não foi possível processar o carregamento da imagem e/ou criar miniaturas devido a limites de recursos do sistema.',
'image_thumbnail_memory_limit' => 'Failed to create image size variations due to system resource limits.', 'image_thumbnail_memory_limit' => 'Não foi possível criar variações de tamanho de imagem devido a limites de recursos do sistema.',
'image_gallery_thumbnail_memory_limit' => 'Failed to create gallery thumbnails due to system resource limits.', 'image_gallery_thumbnail_memory_limit' => 'Não foi possível criar miniaturas da galeria devido a limites de recursos do sistema.',
'drawing_data_not_found' => 'Dados de desenho não puderam ser carregados. Talvez o arquivo de desenho não exista mais ou não tenha permissão para aceder-lhe.', 'drawing_data_not_found' => 'Dados de desenho não puderam ser carregados. Talvez o arquivo de desenho não exista mais ou não tenha permissão para aceder-lhe.',
// Attachments // Attachments
@@ -78,7 +78,7 @@ return [
// Users // Users
'users_cannot_delete_only_admin' => 'Não pode excluir o único administrador', 'users_cannot_delete_only_admin' => 'Não pode excluir o único administrador',
'users_cannot_delete_guest' => 'Não pode excluir o usuário convidado', 'users_cannot_delete_guest' => 'Não pode excluir o usuário convidado',
'users_could_not_send_invite' => 'Could not create user since invite email failed to send', 'users_could_not_send_invite' => 'Não foi possível criar o utilizador, pois o envio do endereço eletrónico de convite falhou',
// Roles // Roles
'role_cannot_be_edited' => 'Este cargo não pode ser editado', 'role_cannot_be_edited' => 'Este cargo não pode ser editado',
@@ -106,17 +106,17 @@ return [
'back_soon' => 'Voltaremos em breve.', 'back_soon' => 'Voltaremos em breve.',
// Import // Import
'import_zip_cant_read' => 'Could not read ZIP file.', 'import_zip_cant_read' => 'Não foi possível ler o ficheiro ZIP.',
'import_zip_cant_decode_data' => 'Could not find and decode ZIP data.json content.', 'import_zip_cant_decode_data' => 'Não foi possível encontrar nem descodificar o conteúdo do ficheiro ZIP data.json.',
'import_zip_no_data' => 'ZIP file data has no expected book, chapter or page content.', 'import_zip_no_data' => 'Os dados do ficheiro ZIP não contêm o conteúdo esperado de livro, capítulo ou página.',
'import_zip_data_too_large' => 'ZIP data.json content exceeds the configured application maximum upload size.', 'import_zip_data_too_large' => 'O conteúdo do ficheiro ZIP data.json excede o tamanho máximo de upload definido para a aplicação.',
'import_validation_failed' => 'Import ZIP failed to validate with errors:', 'import_validation_failed' => 'A importação do ficheiro ZIP não foi validada devido a erros:',
'import_zip_failed_notification' => 'Failed to import ZIP file.', 'import_zip_failed_notification' => 'Não foi possível importar o ficheiro ZIP.',
'import_perms_books' => 'You are lacking the required permissions to create books.', 'import_perms_books' => 'Não dispõe das permissões necessárias para criar livros.',
'import_perms_chapters' => 'You are lacking the required permissions to create chapters.', 'import_perms_chapters' => 'Não dispõe das permissões necessárias para criar capítulos.',
'import_perms_pages' => 'You are lacking the required permissions to create pages.', 'import_perms_pages' => 'Não dispõe das permissões necessárias para criar páginas.',
'import_perms_images' => 'You are lacking the required permissions to create images.', 'import_perms_images' => 'Não dispõe das permissões necessárias para criar imagens.',
'import_perms_attachments' => 'You are lacking the required permission to create attachments.', 'import_perms_attachments' => 'Não dispõe das permissões necessárias para criar anexos.',
// API errors // API errors
'api_no_authorization_found' => 'Nenhum token de autorização encontrado na requisição', 'api_no_authorization_found' => 'Nenhum token de autorização encontrado na requisição',
@@ -125,11 +125,11 @@ return [
'api_incorrect_token_secret' => 'O segredo fornecido para o token de API usado está incorreto', 'api_incorrect_token_secret' => 'O segredo fornecido para o token de API usado está incorreto',
'api_user_no_api_permission' => 'O proprietário do token de API utilizado não tem permissão para fazer requisições de API', 'api_user_no_api_permission' => 'O proprietário do token de API utilizado não tem permissão para fazer requisições de API',
'api_user_token_expired' => 'O token de autenticação expirou', 'api_user_token_expired' => 'O token de autenticação expirou',
'api_cookie_auth_only_get' => 'Only GET requests are allowed when using the API with cookie-based authentication', 'api_cookie_auth_only_get' => 'Ao utilizar a API com autenticação baseada em “cookies”, apenas são permitidos pedidos GET',
// Settings & Maintenance // Settings & Maintenance
'maintenance_test_email_failure' => 'Erro lançado ao enviar um e-mail de teste:', 'maintenance_test_email_failure' => 'Erro lançado ao enviar um e-mail de teste:',
// HTTP errors // HTTP errors
'http_ssr_url_no_match' => 'The URL does not match the configured allowed SSR hosts', 'http_ssr_url_no_match' => 'O URL não corresponde aos "hosts" SSR permitidos configurados',
]; ];

View File

@@ -11,11 +11,11 @@ return [
'updated_page_subject' => 'Página atualizada: :pageName', 'updated_page_subject' => 'Página atualizada: :pageName',
'updated_page_intro' => 'Uma página foi atualizada em :appName:', 'updated_page_intro' => 'Uma página foi atualizada em :appName:',
'updated_page_debounce' => 'Para evitar um grande volume de notificações, durante algum tempo não serão enviadas notificações de edições futuras para esta página através do mesmo editor.', 'updated_page_debounce' => 'Para evitar um grande volume de notificações, durante algum tempo não serão enviadas notificações de edições futuras para esta página através do mesmo editor.',
'comment_mention_subject' => 'You have been mentioned in a comment on page: :pageName', 'comment_mention_subject' => 'Foi mencionado num comentário na página: :pageName',
'comment_mention_intro' => 'You were mentioned in a comment on :appName:', 'comment_mention_intro' => 'Foi mencionado num comentário no :appName:',
'detail_page_name' => 'Nome da Página:', 'detail_page_name' => 'Nome da Página:',
'detail_page_path' => 'Page Path:', 'detail_page_path' => 'Caminho da página:',
'detail_commenter' => 'Comentador:', 'detail_commenter' => 'Comentador:',
'detail_comment' => 'Comentário:', 'detail_comment' => 'Comentário:',
'detail_created_by' => 'Criado Por:', 'detail_created_by' => 'Criado Por:',

View File

@@ -23,7 +23,7 @@ return [
'notifications_desc' => 'Controlar as notificações via correio eletrónico quando certas atividades são executadas pelo sistema.', 'notifications_desc' => 'Controlar as notificações via correio eletrónico quando certas atividades são executadas pelo sistema.',
'notifications_opt_own_page_changes' => 'Notificar quando páginas que possuo sofrem alterações', 'notifications_opt_own_page_changes' => 'Notificar quando páginas que possuo sofrem alterações',
'notifications_opt_own_page_comments' => 'Notificar quando comentam páginas que possuo', 'notifications_opt_own_page_comments' => 'Notificar quando comentam páginas que possuo',
'notifications_opt_comment_mentions' => 'Notify when I\'m mentioned in a comment', 'notifications_opt_comment_mentions' => 'Notificar-me quando for mencionado num comentário',
'notifications_opt_comment_replies' => 'Notificar respostas aos meus comentários', 'notifications_opt_comment_replies' => 'Notificar respostas aos meus comentários',
'notifications_save' => 'Guardar preferências', 'notifications_save' => 'Guardar preferências',
'notifications_update_success' => 'Preferências de notificação foram atualizadas!', 'notifications_update_success' => 'Preferências de notificação foram atualizadas!',
@@ -43,7 +43,7 @@ return [
'profile_email_no_permission' => 'Infelizmente você não tem permissão para alterar seu correio eletrônico. Se você quiser mudar isso, você precisa pedir a um administrador para alterar por você.', 'profile_email_no_permission' => 'Infelizmente você não tem permissão para alterar seu correio eletrônico. Se você quiser mudar isso, você precisa pedir a um administrador para alterar por você.',
'profile_avatar_desc' => 'Selecione uma imagem que será usada para lhe representar aos outros usuários do sistema. Idealmente, esta imagem deve ser quadrada e sobre 256px em largura e altura.', 'profile_avatar_desc' => 'Selecione uma imagem que será usada para lhe representar aos outros usuários do sistema. Idealmente, esta imagem deve ser quadrada e sobre 256px em largura e altura.',
'profile_admin_options' => 'Opções de administrador', 'profile_admin_options' => 'Opções de administrador',
'profile_admin_options_desc' => 'Additional administrator-level options, like those to manage role assignments, can be found for your user account in the "Settings > Users" area of the application.', 'profile_admin_options_desc' => 'Poderá encontrar opções adicionais de nível de administrador, como as destinadas a gerir a atribuição de funções, na sua conta de utilizador, na secção "Definições > Utilizadores" da aplicação.',
'delete_account' => 'Excluir Conta', 'delete_account' => 'Excluir Conta',
'delete_my_account' => 'Excluir a Minha Conta', 'delete_my_account' => 'Excluir a Minha Conta',

View File

@@ -75,36 +75,36 @@ return [
'reg_confirm_restrict_domain_placeholder' => 'Nenhuma restrição definida', 'reg_confirm_restrict_domain_placeholder' => 'Nenhuma restrição definida',
// Sorting Settings // Sorting Settings
'sorting' => 'Lists & Sorting', 'sorting' => 'Listas e ordenação',
'sorting_book_default' => 'Default Book Sort Rule', 'sorting_book_default' => 'Regra de ordenação padrão dos livros',
'sorting_book_default_desc' => 'Select the default sort rule to apply to new books. This won\'t affect existing books, and can be overridden per-book.', 'sorting_book_default_desc' => 'Selecione a regra de ordenação predefinida a aplicar aos novos livros. Isto não afetará os livros existentes e pode ser substituído individualmente para cada livro.',
'sorting_rules' => 'Sort Rules', 'sorting_rules' => 'Regras de Ordenação',
'sorting_rules_desc' => 'These are predefined sorting operations which can be applied to content in the system.', 'sorting_rules_desc' => 'Trata-se de operações de ordenação predefinidas que podem ser aplicadas ao conteúdo do sistema.',
'sort_rule_assigned_to_x_books' => 'Assigned to :count Book|Assigned to :count Books', 'sort_rule_assigned_to_x_books' => 'Atribuído a: :count Livro|Atribuído a: :count Livros',
'sort_rule_create' => 'Create Sort Rule', 'sort_rule_create' => 'Criar Regra de Ordenação',
'sort_rule_edit' => 'Edit Sort Rule', 'sort_rule_edit' => 'Editar Regra de Ordenação',
'sort_rule_delete' => 'Delete Sort Rule', 'sort_rule_delete' => 'Eliminar Regra de Ordenação',
'sort_rule_delete_desc' => 'Remove this sort rule from the system. Books using this sort will revert to manual sorting.', 'sort_rule_delete_desc' => 'Remova esta regra de ordenação do sistema. Os livros que utilizam esta ordenação voltarão a ser ordenados manualmente.',
'sort_rule_delete_warn_books' => 'This sort rule is currently used on :count book(s). Are you sure you want to delete this?', 'sort_rule_delete_warn_books' => 'Esta regra de ordenação é atualmente utilizada em :count livro(s). Tem a certeza de que deseja eliminar isto?',
'sort_rule_delete_warn_default' => 'This sort rule is currently used as the default for books. Are you sure you want to delete this?', 'sort_rule_delete_warn_default' => 'Esta regra de ordenação é atualmente utilizada em livros. Tem a certeza de que deseja eliminar isto?',
'sort_rule_details' => 'Sort Rule Details', 'sort_rule_details' => 'Detalhes de Regras de Ordenação',
'sort_rule_details_desc' => 'Set a name for this sort rule, which will appear in lists when users are selecting a sort.', 'sort_rule_details_desc' => 'Defina um nome para esta regra de ordenação, que aparecerá nas listas quando os utilizadores selecionarem uma opção de ordenação.',
'sort_rule_operations' => 'Sort Operations', 'sort_rule_operations' => 'Operações de Ordenação',
'sort_rule_operations_desc' => 'Configure the sort actions to be performed by moving them from the list of available operations. Upon use, the operations will be applied in order, from top to bottom. Any changes made here will be applied to all assigned books upon save.', 'sort_rule_operations_desc' => 'Configure as ações de ordenação a executar, selecionando-as na lista de operações disponíveis. Quando utilizadas, as operações serão aplicadas por ordem, de cima para baixo. Quaisquer alterações efetuadas aqui serão aplicadas a todos os livros atribuídos quando se guardar.',
'sort_rule_available_operations' => 'Available Operations', 'sort_rule_available_operations' => 'Operações Disponíveis',
'sort_rule_available_operations_empty' => 'No operations remaining', 'sort_rule_available_operations_empty' => 'Não há operações pendentes',
'sort_rule_configured_operations' => 'Configured Operations', 'sort_rule_configured_operations' => 'Operações Configuradas',
'sort_rule_configured_operations_empty' => 'Drag/add operations from the "Available Operations" list', 'sort_rule_configured_operations_empty' => 'Operações de arrastar/adicionar a partir da lista "Operações Disponíveis"',
'sort_rule_op_asc' => '(Asc)', 'sort_rule_op_asc' => '(Asc)',
'sort_rule_op_desc' => '(Desc)', 'sort_rule_op_desc' => '(Desc)',
'sort_rule_op_name' => 'Name - Alphabetical', 'sort_rule_op_name' => 'Nome - Alfabético',
'sort_rule_op_name_numeric' => 'Name - Numeric', 'sort_rule_op_name_numeric' => 'Nome - Numérico',
'sort_rule_op_created_date' => 'Created Date', 'sort_rule_op_created_date' => 'Data de criação',
'sort_rule_op_updated_date' => 'Updated Date', 'sort_rule_op_updated_date' => 'Data de atualização',
'sort_rule_op_chapters_first' => 'Chapters First', 'sort_rule_op_chapters_first' => 'Capítulos: Primeiro',
'sort_rule_op_chapters_last' => 'Chapters Last', 'sort_rule_op_chapters_last' => 'Capítulos: Últimos',
'sorting_page_limits' => 'Per-Page Display Limits', 'sorting_page_limits' => 'Limites de Exibição por Página',
'sorting_page_limits_desc' => 'Set how many items to show per-page in various lists within the system. Typically a lower amount will be more performant, while a higher amount avoids the need to click through multiple pages. Using a multiple of 6 is recommended.', 'sorting_page_limits_desc' => 'Defina o número de itens a apresentar por página nas várias listas do sistema. Normalmente, um número mais baixo proporciona melhor desempenho, enquanto um número mais elevado evita a necessidade de percorrer várias páginas. É recomendado utilizar um múltiplo de 6.',
// Maintenance settings // Maintenance settings
'maint' => 'Manutenção', 'maint' => 'Manutenção',
@@ -141,7 +141,7 @@ return [
'recycle_bin_contents_empty' => 'A reciclagem está atualmente vazia', 'recycle_bin_contents_empty' => 'A reciclagem está atualmente vazia',
'recycle_bin_empty' => 'Esvaziar Reciclagem', 'recycle_bin_empty' => 'Esvaziar Reciclagem',
'recycle_bin_empty_confirm' => 'Isto irá destruir permanentemente todos os itens na reciclagem inclusive o conteúdo de cada item. Tem certeza de que a deseja esvaziar?', 'recycle_bin_empty_confirm' => 'Isto irá destruir permanentemente todos os itens na reciclagem inclusive o conteúdo de cada item. Tem certeza de que a deseja esvaziar?',
'recycle_bin_destroy_confirm' => 'This action will permanently delete this item from the system, along with any child elements listed below, and you will not be able to restore this content. Are you sure you want to permanently delete this item?', 'recycle_bin_destroy_confirm' => 'Esta ação irá eliminar definitivamente este item do sistema, com quaisquer elementos secundários listados abaixo, e não será possível recuperar este conteúdo. Tem a certeza de que deseja eliminar definitivamente este item?',
'recycle_bin_destroy_list' => 'Itens a serem Destruídos', 'recycle_bin_destroy_list' => 'Itens a serem Destruídos',
'recycle_bin_restore_list' => 'Itens a serem Restaurados', 'recycle_bin_restore_list' => 'Itens a serem Restaurados',
'recycle_bin_restore_confirm' => 'Esta ação irá restaurar o item excluído, inclusive quaisquer elementos filhos, para o seu local original. Se a localização original tiver, entretanto, sido eliminada e estiver agora na reciclagem, o item pai também precisará de ser restaurado.', 'recycle_bin_restore_confirm' => 'Esta ação irá restaurar o item excluído, inclusive quaisquer elementos filhos, para o seu local original. Se a localização original tiver, entretanto, sido eliminada e estiver agora na reciclagem, o item pai também precisará de ser restaurado.',
@@ -194,20 +194,20 @@ return [
'role_access_api' => 'Aceder à API do sistema', 'role_access_api' => 'Aceder à API do sistema',
'role_manage_settings' => 'Gerir as configurações da aplicação', 'role_manage_settings' => 'Gerir as configurações da aplicação',
'role_export_content' => 'Exportar conteúdo', 'role_export_content' => 'Exportar conteúdo',
'role_import_content' => 'Import content', 'role_import_content' => 'Importar conteúdo',
'role_editor_change' => 'Alterar editor de página', 'role_editor_change' => 'Alterar editor de página',
'role_notifications' => 'Receive & manage notifications', 'role_notifications' => 'Receber e gerir notificações',
'role_permission_note_users_and_roles' => 'These permissions will technically also provide visibility & searching of users & roles in the system.', 'role_permission_note_users_and_roles' => 'Tecnicamente, estas permissões também permitirão visualizar e pesquisar utilizadores e papéis no sistema.',
'role_asset' => 'Permissões de Ativos', 'role_asset' => 'Permissões de Ativos',
'roles_system_warning' => 'Esteja ciente de que o acesso a qualquer uma das três permissões acima pode permitir que um utilizador altere os seus próprios privilégios ou privilégios de outros no sistema. Apenas atribua cargos com essas permissões a utilizadores de confiança.', 'roles_system_warning' => 'Esteja ciente de que o acesso a qualquer uma das três permissões acima pode permitir que um utilizador altere os seus próprios privilégios ou privilégios de outros no sistema. Apenas atribua cargos com essas permissões a utilizadores de confiança.',
'role_asset_desc' => 'Estas permissões controlam o acesso padrão para os ativos dentro do sistema. Permissões em Livros, Capítulos e Páginas serão sobrescritas por estas permissões.', 'role_asset_desc' => 'Estas permissões controlam o acesso padrão para os ativos dentro do sistema. Permissões em Livros, Capítulos e Páginas serão sobrescritas por estas permissões.',
'role_asset_admins' => 'Os administradores recebem automaticamente acesso a todo o conteúdo, mas estas opções podem mostrar ou ocultar as opções da Interface de Usuário.', 'role_asset_admins' => 'Os administradores recebem automaticamente acesso a todo o conteúdo, mas estas opções podem mostrar ou ocultar as opções da Interface de Usuário.',
'role_asset_image_view_note' => 'Isto está relacionado com a visibilidade do gerenciador de imagens. O acesso real dos arquivos de imagem enviados dependerá da opção de armazenamento de imagens do sistema.', 'role_asset_image_view_note' => 'Isto está relacionado com a visibilidade do gerenciador de imagens. O acesso real dos arquivos de imagem enviados dependerá da opção de armazenamento de imagens do sistema.',
'role_asset_users_note' => 'These permissions will technically also provide visibility & searching of users in the system.', 'role_asset_users_note' => 'Tecnicamente, estas permissões também permitirão visualizar e pesquisar utilizadores no sistema.',
'role_all' => 'Todos', 'role_all' => 'Todos',
'role_own' => 'Próprio', 'role_own' => 'Próprio',
'role_controlled_by_asset' => 'Controlado pelo ativo para o qual eles são enviados', 'role_controlled_by_asset' => 'Controlado pelo ativo para o qual eles são enviados',
'role_controlled_by_page_delete' => 'Controlled by page delete permissions', 'role_controlled_by_page_delete' => 'Controlado pelas permissões de eliminação de páginas',
'role_save' => 'Guardar Cargo', 'role_save' => 'Guardar Cargo',
'role_users' => 'Utilizadores com este cargo', 'role_users' => 'Utilizadores com este cargo',
'role_users_none' => 'Nenhum utilizador está atualmente vinculado a este cargo', 'role_users_none' => 'Nenhum utilizador está atualmente vinculado a este cargo',
@@ -229,8 +229,8 @@ return [
'users_send_invite_text' => 'Pode escolher enviar a este utilizador um convite por e-mail que o possibilitará definir a sua própria palavra-passe, ou defina você mesmo uma.', 'users_send_invite_text' => 'Pode escolher enviar a este utilizador um convite por e-mail que o possibilitará definir a sua própria palavra-passe, ou defina você mesmo uma.',
'users_send_invite_option' => 'Enviar convite por e-mail', 'users_send_invite_option' => 'Enviar convite por e-mail',
'users_external_auth_id' => 'ID de Autenticação Externa', 'users_external_auth_id' => 'ID de Autenticação Externa',
'users_external_auth_id_desc' => 'When an external authentication system is in use (such as SAML2, OIDC or LDAP) this is the ID which links this BookStack user to the authentication system account. You can ignore this field if using the default email-based authentication.', 'users_external_auth_id_desc' => 'Quando se utiliza um sistema de autenticação externo (como SAML2, OIDC ou LDAP), este é o ID que associa este utilizador do BookStack à conta do sistema de autenticação. Pode ignorar este campo se estiver a utilizar a autenticação padrão baseada no e-mail.',
'users_password_warning' => 'Only fill the below if you would like to change the password for this user.', 'users_password_warning' => 'Preencha os campos abaixo apenas se pretender alterar a palavra-passe deste utilizador.',
'users_system_public' => 'Este utilizador representa quaisquer convidados que visitam a aplicação. Não pode ser utilizado para efetuar autenticação, mas é automaticamente atribuído.', 'users_system_public' => 'Este utilizador representa quaisquer convidados que visitam a aplicação. Não pode ser utilizado para efetuar autenticação, mas é automaticamente atribuído.',
'users_delete' => 'Eliminar Utilizador', 'users_delete' => 'Eliminar Utilizador',
'users_delete_named' => 'Eliminar :userName', 'users_delete_named' => 'Eliminar :userName',
@@ -246,7 +246,7 @@ return [
'users_preferred_language' => 'Linguagem de Preferência', 'users_preferred_language' => 'Linguagem de Preferência',
'users_preferred_language_desc' => 'Esta opção irá alterar o idioma utilizado para a interface de utilizador da aplicação. Isto não afetará nenhum conteúdo criado por utilizadores.', 'users_preferred_language_desc' => 'Esta opção irá alterar o idioma utilizado para a interface de utilizador da aplicação. Isto não afetará nenhum conteúdo criado por utilizadores.',
'users_social_accounts' => 'Contas Sociais', 'users_social_accounts' => 'Contas Sociais',
'users_social_accounts_desc' => 'View the status of the connected social accounts for this user. Social accounts can be used in addition to the primary authentication system for system access.', 'users_social_accounts_desc' => 'Ver o estado das contas sociais associadas a este utilizador. As contas sociais podem ser utilizadas em complemento ao sistema de autenticação principal para aceder ao sistema.',
'users_social_accounts_info' => 'Aqui pode ligar outras contas para acesso mais rápido. Desligar uma conta não retira a possibilidade de acesso usando-a. Para revogar o acesso ao perfil através da conta social, você deverá fazê-lo na sua conta social.', 'users_social_accounts_info' => 'Aqui pode ligar outras contas para acesso mais rápido. Desligar uma conta não retira a possibilidade de acesso usando-a. Para revogar o acesso ao perfil através da conta social, você deverá fazê-lo na sua conta social.',
'users_social_connect' => 'Contas Associadas', 'users_social_connect' => 'Contas Associadas',
'users_social_disconnect' => 'Dissociar Conta', 'users_social_disconnect' => 'Dissociar Conta',
@@ -255,7 +255,7 @@ return [
'users_social_connected' => 'A conta:socialAccount foi associada com sucesso ao seu perfil.', 'users_social_connected' => 'A conta:socialAccount foi associada com sucesso ao seu perfil.',
'users_social_disconnected' => 'A conta:socialAccount foi dissociada com sucesso de seu perfil.', 'users_social_disconnected' => 'A conta:socialAccount foi dissociada com sucesso de seu perfil.',
'users_api_tokens' => 'Tokens de API', 'users_api_tokens' => 'Tokens de API',
'users_api_tokens_desc' => 'Create and manage the access tokens used to authenticate with the BookStack REST API. Permissions for the API are managed via the user that the token belongs to.', 'users_api_tokens_desc' => 'Crie e faça a gestão dos tokens de acesso utilizados para autenticação na API REST do BookStack. As permissões para a API são geridas através do utilizador a quem o token pertence.',
'users_api_tokens_none' => 'Nenhum token de API foi criado para este utilizador', 'users_api_tokens_none' => 'Nenhum token de API foi criado para este utilizador',
'users_api_tokens_create' => 'Criar Token', 'users_api_tokens_create' => 'Criar Token',
'users_api_tokens_expires' => 'Expira', 'users_api_tokens_expires' => 'Expira',
@@ -264,9 +264,9 @@ return [
'users_mfa_desc' => 'Configure a autenticação multi-fatores como uma camada extra de segurança para sua conta de utilizador.', 'users_mfa_desc' => 'Configure a autenticação multi-fatores como uma camada extra de segurança para sua conta de utilizador.',
'users_mfa_x_methods' => ':count método configurado|:count métodos configurados', 'users_mfa_x_methods' => ':count método configurado|:count métodos configurados',
'users_mfa_configure' => 'Configurar Métodos', 'users_mfa_configure' => 'Configurar Métodos',
'users_mfa_reset' => 'Reset Multi-Factor Authentication Methods', 'users_mfa_reset' => 'Redefinir métodos de autenticação multifator',
'users_mfa_reset_desc' => 'This will reset and clear all configured multi-factor authentication methods for this user. If multi-factor authentication is required by any of their roles, they\'ll be prompted to configure new methods on their next login.', 'users_mfa_reset_desc' => 'Isto irá reiniciar e eliminar todos os métodos de autenticação multifator configurados para este utilizador. Se a autenticação multifator for exigida por alguma das suas funções, ser-lhe-á solicitado que configure novos métodos no seu próximo início de sessão.',
'users_mfa_reset_confirm' => 'Are you sure you want to reset multi-factor authentication for this user?', 'users_mfa_reset_confirm' => 'Tem a certeza de que deseja repor a autenticação multifator para este utilizador?',
// API Tokens // API Tokens
'user_api_token_create' => 'Criar Token de API', 'user_api_token_create' => 'Criar Token de API',
@@ -316,13 +316,13 @@ return [
'webhooks_last_error_message' => 'Última mensagem de erro:', 'webhooks_last_error_message' => 'Última mensagem de erro:',
// Licensing // Licensing
'licenses' => 'Licenses', 'licenses' => 'Licenças',
'licenses_desc' => 'This page details license information for BookStack in addition to the projects & libraries that are used within BookStack. Many projects listed may only be used in a development context.', 'licenses_desc' => 'Esta página apresenta informações sobre as licenças do BookStack, bem como sobre os projetos e bibliotecas utilizados no BookStack. Muitos dos projetos aqui listados só podem ser utilizados num contexto de desenvolvimento.',
'licenses_bookstack' => 'BookStack License', 'licenses_bookstack' => 'Licença de BookStack',
'licenses_php' => 'PHP Library Licenses', 'licenses_php' => 'Licenças de Bibliotecas PHP',
'licenses_js' => 'JavaScript Library Licenses', 'licenses_js' => 'Licenças de Bibliotecas de JavaScript',
'licenses_other' => 'Other Licenses', 'licenses_other' => 'Outras Licenças',
'license_details' => 'License Details', 'license_details' => 'Detalhes de Licença',
//! If editing translations files directly please ignore this in all //! If editing translations files directly please ignore this in all
//! languages apart from en. Content will be auto-copied from en. //! languages apart from en. Content will be auto-copied from en.
@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -105,11 +105,11 @@ return [
'url' => 'O formato da URL :attribute é inválido.', 'url' => 'O formato da URL :attribute é inválido.',
'uploaded' => 'O arquivo não pôde ser carregado. O servidor pode não aceitar arquivos deste tamanho.', 'uploaded' => 'O arquivo não pôde ser carregado. O servidor pode não aceitar arquivos deste tamanho.',
'zip_file' => 'The :attribute needs to reference a file within the ZIP.', 'zip_file' => 'O :attribute deve referenciar um ficheiro dentro do ZIP.',
'zip_file_size' => 'The file :attribute must not exceed :size MB.', 'zip_file_size' => 'O ficheiro :attribute não deve exceder :size MB.',
'zip_file_mime' => 'The :attribute needs to reference a file of type :validTypes, found :foundType.', 'zip_file_mime' => 'O :attribute deve referenciar um ficheiro do tipo :validTypes, encontrado em :foundType.',
'zip_model_expected' => 'Data object expected but ":type" found.', 'zip_model_expected' => 'Era esperado um objeto de dados, mas foi encontrado “:type”.',
'zip_unique' => 'The :attribute must be unique for the object type within the ZIP.', 'zip_unique' => 'O :attribute deve ser único para o tipo de objeto dentro do ficheiro ZIP.',
// Custom validation lines // Custom validation lines
'custom' => [ 'custom' => [

View File

@@ -99,8 +99,8 @@ return [
'user_update_notification' => 'Usuário atualizado com sucesso', 'user_update_notification' => 'Usuário atualizado com sucesso',
'user_delete' => 'usuário excluído', 'user_delete' => 'usuário excluído',
'user_delete_notification' => 'Usuário removido com sucesso', 'user_delete_notification' => 'Usuário removido com sucesso',
'user_mfa_reset' => 'reset MFA for user', 'user_mfa_reset' => 'redefinir MFA para usuário',
'user_mfa_reset_notification' => 'Multi-factor authentication methods reset', 'user_mfa_reset_notification' => 'Redefinir métodos de autenticação de múltiplos fatores',
// API Tokens // API Tokens
'api_token_create' => 'token de API criado', 'api_token_create' => 'token de API criado',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'As credenciais fornecidas não puderam ser validadas em nossos registros.', 'failed' => 'As credenciais fornecidas não puderam ser validadas em nossos registros.',
'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.', 'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'Muitas tentativas de verificação de multifatores. Por favor tente novamente em :seconds segundos.',
// Login & Register // Login & Register
'sign_up' => 'Criar Conta', 'sign_up' => 'Criar Conta',

View File

@@ -219,7 +219,7 @@ return [
'chapters_permissions_active' => 'Permissões de Capítulo Ativas', 'chapters_permissions_active' => 'Permissões de Capítulo Ativas',
'chapters_permissions_success' => 'Permissões de Capítulo Atualizadas', 'chapters_permissions_success' => 'Permissões de Capítulo Atualizadas',
'chapters_search_this' => 'Pesquisar neste Capítulo', 'chapters_search_this' => 'Pesquisar neste Capítulo',
'chapter_sort_book' => 'Classificar livro', 'chapter_sort_book' => 'Ordenar livro',
// Pages // Pages
'page' => 'Página', 'page' => 'Página',
@@ -331,9 +331,9 @@ return [
// Editor Sidebar // Editor Sidebar
'toggle_sidebar' => '', 'toggle_sidebar' => '',
'page_contents' => 'Page Contents', 'page_contents' => 'Conteúdos da página',
'page_contents_none' => 'No headings were found in the page content.', 'page_contents_none' => 'Nenhum título foi encontrado no conteúdo da página.',
'page_contents_info' => 'The contents menu is generated from any heading formats used in the page.', 'page_contents_info' => 'O menu de conteúdo é gerado a partir de qualquer formato de cabeçalho usado na página.',
'page_tags' => 'Marcadores de Página', 'page_tags' => 'Marcadores de Página',
'chapter_tags' => 'Marcadores de Capítulo', 'chapter_tags' => 'Marcadores de Capítulo',
'book_tags' => 'Marcadores de Livro', 'book_tags' => 'Marcadores de Livro',

View File

@@ -183,7 +183,7 @@ return [
'role_details' => 'Detalhes do Perfil', 'role_details' => 'Detalhes do Perfil',
'role_name' => 'Nome do Perfil', 'role_name' => 'Nome do Perfil',
'role_desc' => 'Breve Descrição do Perfil', 'role_desc' => 'Breve Descrição do Perfil',
'role_mfa_enforced' => 'Requer Autenticação Multi-fator', 'role_mfa_enforced' => 'Requer Autenticação Multifator',
'role_external_auth_id' => 'IDs de Autenticação Externa', 'role_external_auth_id' => 'IDs de Autenticação Externa',
'role_system' => 'Permissões do Sistema', 'role_system' => 'Permissões do Sistema',
'role_manage_users' => 'Gerenciar usuários', 'role_manage_users' => 'Gerenciar usuários',
@@ -260,13 +260,13 @@ return [
'users_api_tokens_create' => 'Criar Token', 'users_api_tokens_create' => 'Criar Token',
'users_api_tokens_expires' => 'Expira', 'users_api_tokens_expires' => 'Expira',
'users_api_tokens_docs' => 'Documentação da API', 'users_api_tokens_docs' => 'Documentação da API',
'users_mfa' => 'Autenticação de Múltiplos Fatores', 'users_mfa' => 'Autenticação Multifator',
'users_mfa_desc' => 'A autenticação multi-fator adiciona outra camada de segurança à sua conta.', 'users_mfa_desc' => 'A autenticação multifator adiciona uma camada extra de segurança à sua conta.',
'users_mfa_x_methods' => ':count método configurado|:count métodos configurados', 'users_mfa_x_methods' => ':count método configurado|:count métodos configurados',
'users_mfa_configure' => 'Configurar Métodos', 'users_mfa_configure' => 'Configurar Métodos',
'users_mfa_reset' => 'Reset Multi-Factor Authentication Methods', 'users_mfa_reset' => 'Redefiner Métodos de Autenticação Multifator',
'users_mfa_reset_desc' => 'This will reset and clear all configured multi-factor authentication methods for this user. If multi-factor authentication is required by any of their roles, they\'ll be prompted to configure new methods on their next login.', 'users_mfa_reset_desc' => 'Isto irá redefinir e limpar todos os métodos de autenticação multifator configurados para este usuário. Se a autenticação multifator for exigida por qualquer uma de suas funções, você será solicitado a configurar novos métodos em seu próximo login.',
'users_mfa_reset_confirm' => 'Are you sure you want to reset multi-factor authentication for this user?', 'users_mfa_reset_confirm' => 'Você tem certeza que deseja remover o método de autenticação multifator?',
// API Tokens // API Tokens
'user_api_token_create' => 'Criar Token de API', 'user_api_token_create' => 'Criar Token de API',
@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -367,6 +367,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'slovenščina', 'sl' => 'slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -366,6 +366,7 @@ return [
'ru' => 'Русский', 'ru' => 'Русский',
'sk' => 'Slovensky', 'sk' => 'Slovensky',
'sl' => 'Slovenščina', 'sl' => 'Slovenščina',
'sr' => 'Српски',
'sv' => 'Svenska', 'sv' => 'Svenska',
'th' => 'ภาษาไทย', 'th' => 'ภาษาไทย',
'tr' => 'Türkçe', 'tr' => 'Türkçe',

View File

@@ -77,20 +77,20 @@ return [
'maintenance_action_run' => 'покренуо акцију одржавања', 'maintenance_action_run' => 'покренуо акцију одржавања',
// Webhooks // Webhooks
'webhook_create' => 'креиран вебхоок', 'webhook_create' => 'креирана веб закачка',
'webhook_create_notification' => 'Вебхоок је успешно креиран', 'webhook_create_notification' => 'Веб закачка је успешно креирана',
'webhook_update' => 'ажуриран вебхоок', 'webhook_update' => 'ажурирана веб закачка',
'webhook_update_notification' => 'Вебхоок је успешно ажуриран', 'webhook_update_notification' => 'Веб закачка је успешно ажурирана',
'webhook_delete' => 'обрисан вебхоок', 'webhook_delete' => 'обрисана веб закачка',
'webhook_delete_notification' => 'Вебхоок је успешно обрисан', 'webhook_delete_notification' => 'Веб закачка је успешно обрисана',
// Imports // Imports
'import_create' => 'креиран увоз', 'import_create' => 'креиран увоз',
'import_create_notification' => 'Import successfully uploaded', 'import_create_notification' => 'Увоз је успешно отпремљен',
'import_run' => 'ажуриран увоз', 'import_run' => 'ажуриран увоз',
'import_run_notification' => 'Content successfully imported', 'import_run_notification' => 'Садржај је успешно увезен',
'import_delete' => 'deleted import', 'import_delete' => 'обрисан увоз',
'import_delete_notification' => 'Import successfully deleted', 'import_delete_notification' => 'Увоз је успешно обрисан',
// Users // Users
'user_create' => 'креирао корисника', 'user_create' => 'креирао корисника',
@@ -99,8 +99,8 @@ return [
'user_update_notification' => 'Корисник је успешно ажуриран', 'user_update_notification' => 'Корисник је успешно ажуриран',
'user_delete' => 'избрисан корисника', 'user_delete' => 'избрисан корисника',
'user_delete_notification' => 'Корисник је успешно уклоњен', 'user_delete_notification' => 'Корисник је успешно уклоњен',
'user_mfa_reset' => 'reset MFA for user', 'user_mfa_reset' => 'поништи МФА за корисника',
'user_mfa_reset_notification' => 'Multi-factor authentication methods reset', 'user_mfa_reset_notification' => 'Поништавања начина мултифакторске аутентификације',
// API Tokens // API Tokens
'api_token_create' => 'креирао апи токен', 'api_token_create' => 'креирао апи токен',
@@ -130,12 +130,12 @@ return [
'comment_delete' => 'обрисан коментар', 'comment_delete' => 'обрисан коментар',
// Sort Rules // Sort Rules
'sort_rule_create' => 'created sort rule', 'sort_rule_create' => 'направљено је правило слагања',
'sort_rule_create_notification' => 'Sort rule successfully created', 'sort_rule_create_notification' => 'Правило слагања је успешно направљено',
'sort_rule_update' => 'updated sort rule', 'sort_rule_update' => 'ажурирано је правило слагања',
'sort_rule_update_notification' => 'Sort rule successfully updated', 'sort_rule_update_notification' => 'Правило слагања је успешно ажурирано',
'sort_rule_delete' => 'deleted sort rule', 'sort_rule_delete' => 'избрисано је правило слагања',
'sort_rule_delete_notification' => 'Sort rule successfully deleted', 'sort_rule_delete_notification' => 'Правило слагања је успешно избрисано',
// Other // Other
'permissions_update' => 'ажуриране дозволе', 'permissions_update' => 'ажуриране дозволе',

View File

@@ -8,7 +8,7 @@ return [
'failed' => 'Ови акредитиви се не поклапају са нашом евиденцијом.', 'failed' => 'Ови акредитиви се не поклапају са нашом евиденцијом.',
'throttle' => 'Превише покушаја пријаве. Покушајте поново за :seconds секунди.', 'throttle' => 'Превише покушаја пријаве. Покушајте поново за :seconds секунди.',
'mfa_throttle' => 'Too many multi-factor verification attempts. Please try again in :seconds seconds.', 'mfa_throttle' => 'Превише покушаја потврђивања вишефакторском аутентификацијом. Молим вас покушајте поново за :seconds секунди.',
// Login & Register // Login & Register
'sign_up' => 'Региструј се', 'sign_up' => 'Региструј се',
@@ -89,13 +89,13 @@ return [
'mfa_setup_remove_confirmation' => 'Да ли сте сигурни да желите да уклоните овај метод вишефакторске аутентификације?', 'mfa_setup_remove_confirmation' => 'Да ли сте сигурни да желите да уклоните овај метод вишефакторске аутентификације?',
'mfa_setup_action' => 'Подешавање', 'mfa_setup_action' => 'Подешавање',
'mfa_backup_codes_usage_limit_warning' => 'Преостало вам је мање од 5 резервних кодова. Генеришите и сачувајте нови сет пре него што вам понестане кодова како бисте спречили да останете без налога.', 'mfa_backup_codes_usage_limit_warning' => 'Преостало вам је мање од 5 резервних кодова. Генеришите и сачувајте нови сет пре него што вам понестане кодова како бисте спречили да останете без налога.',
'mfa_option_totp_title' => 'Aplikacije za mobilne uređaje', 'mfa_option_totp_title' => 'Апликација за мобилне уређаје',
'mfa_option_totp_desc' => 'Да бисте користили вишефакторску аутентификацију, биће вам потребна мобилна апликација која подржава ТОТП, као што јеGoogle Authenticator, Authy или Microsoft Authenticator.', 'mfa_option_totp_desc' => 'Да бисте користили вишефакторску аутентификацију, биће вам потребна мобилна апликација која подржава ТОТП, као што јеGoogle Authenticator, Authy или Microsoft Authenticator.',
'mfa_option_backup_codes_title' => 'Резервни кодови', 'mfa_option_backup_codes_title' => 'Резервни кодови',
'mfa_option_backup_codes_desc' => 'Генерише скуп резервних кодова за једнократну употребу које ћете унети приликом пријављивања да бисте потврдили свој идентитет. Обавезно их чувајте на безбедном и безбедном месту.', 'mfa_option_backup_codes_desc' => 'Генерише скуп резервних кодова за једнократну употребу које ћете унети приликом пријављивања да бисте потврдили свој идентитет. Обавезно их чувајте на безбедном и безбедном месту.',
'mfa_gen_confirm_and_enable' => 'Потврдите и омогућите', 'mfa_gen_confirm_and_enable' => 'Потврдите и омогућите',
'mfa_gen_backup_codes_title' => 'Подешавање резервних кодова', 'mfa_gen_backup_codes_title' => 'Подешавање резервних кодова',
'mfa_gen_backup_codes_desc' => 'Чувајте доњу листу кодова на безбедном месту. Када приступате систему, моћи ћете да користите један од кодова као други механизам за аутентификацију.', 'mfa_gen_backup_codes_desc' => 'Сачувајте списак кодова испод на безбедном месту. Када приступате систему, моћи ћете да користите један од кодова као други механизам за аутентификацију.',
'mfa_gen_backup_codes_download' => 'Преузми кодове', 'mfa_gen_backup_codes_download' => 'Преузми кодове',
'mfa_gen_backup_codes_usage_warning' => 'Сваки код се може искористити једном', 'mfa_gen_backup_codes_usage_warning' => 'Сваки код се може искористити једном',
'mfa_gen_totp_title' => 'Подешавање мобилне апликације', 'mfa_gen_totp_title' => 'Подешавање мобилне апликације',

View File

@@ -12,7 +12,7 @@ return [
'save' => 'Сачувај', 'save' => 'Сачувај',
'continue' => 'Настави', 'continue' => 'Настави',
'select' => 'Изабери', 'select' => 'Изабери',
'toggle_all' => 'Сакриј/Прикажи све', 'toggle_all' => 'Укључи све/ништа',
'more' => 'Више', 'more' => 'Више',
// Form Labels // Form Labels
@@ -20,18 +20,18 @@ return [
'description' => 'Опис', 'description' => 'Опис',
'role' => 'Улога', 'role' => 'Улога',
'cover_image' => 'Насловна слика', 'cover_image' => 'Насловна слика',
'cover_image_description' => 'Ова слика би требало да буде приближно 440к250px иако ће бити флексибилно скалирана и исечена како би одговарала корисничком интерфејсу у различитим сценаријима по потреби, тако да ће се стварне димензије приказа разликовати.', 'cover_image_description' => 'Ова слика би требало да буде приближно 440х250px иако ће бити флексибилно скалирана и исечена како би одговарала корисничком интерфејсу у различитим сценаријима по потреби, тако да ће се стварне димензије приказа разликовати.',
// Actions // Actions
'actions' => 'Радње', 'actions' => 'Радње',
'view' => 'Преглед', 'view' => 'Прегледај',
'view_all' => 'Прикажи све', 'view_all' => 'Прикажи све',
'new' => 'Ново', 'new' => 'Ново',
'create' => 'Креирај', 'create' => 'Креирај',
'update' => 'Ажурирање', 'update' => 'Ажурирај',
'edit' => 'Уреди', 'edit' => 'Уреди',
'archive' => 'Архивирај', 'archive' => 'Архивирај',
'unarchive' => 'Un-Archive', 'unarchive' => 'Деархивирај',
'sort' => 'Разврстај', 'sort' => 'Разврстај',
'move' => 'Премести', 'move' => 'Премести',
'copy' => 'Умножи', 'copy' => 'Умножи',
@@ -40,7 +40,7 @@ return [
'delete_confirm' => 'Потврди брисање', 'delete_confirm' => 'Потврди брисање',
'search' => 'Претражи', 'search' => 'Претражи',
'search_clear' => 'Обриши претрагу', 'search_clear' => 'Обриши претрагу',
'reset' => 'Ресетуј', 'reset' => 'Поништи',
'remove' => 'Уклони', 'remove' => 'Уклони',
'add' => 'Додај', 'add' => 'Додај',
'configure' => 'Конфигуриши', 'configure' => 'Конфигуриши',
@@ -81,7 +81,7 @@ return [
'breadcrumb' => 'Навигација', 'breadcrumb' => 'Навигација',
'status' => 'Стање', 'status' => 'Стање',
'status_active' => 'Активан', 'status_active' => 'Активан',
'status_inactive' => 'Неактивно', 'status_inactive' => 'Неактиван',
'never' => 'Никад', 'never' => 'Никад',
'none' => 'Ништа', 'none' => 'Ништа',
@@ -89,7 +89,7 @@ return [
'homepage' => 'Почетна страна', 'homepage' => 'Почетна страна',
'header_menu_expand' => 'Проширите мени заглавља', 'header_menu_expand' => 'Проширите мени заглавља',
'profile_menu' => 'Мени профила', 'profile_menu' => 'Мени профила',
'view_profile' => 'Погледај Профил', 'view_profile' => 'Погледај профил',
'edit_profile' => 'Измени профил', 'edit_profile' => 'Измени профил',
'dark_mode' => 'Тамни режим', 'dark_mode' => 'Тамни режим',
'light_mode' => 'Светли режим', 'light_mode' => 'Светли режим',
@@ -111,5 +111,5 @@ return [
'terms_of_service' => 'Услови коришћења', 'terms_of_service' => 'Услови коришћења',
// OpenSearch // OpenSearch
'opensearch_description' => 'Search :appName', 'opensearch_description' => 'Претражи :appName',
]; ];

View File

@@ -48,8 +48,8 @@ return [
'superscript' => 'Надскрипт', 'superscript' => 'Надскрипт',
'subscript' => 'Субкрипт', 'subscript' => 'Субкрипт',
'text_color' => 'Боја текста', 'text_color' => 'Боја текста',
'highlight_color' => 'Highlight color', 'highlight_color' => 'Боја наглашавања',
'custom_color' => 'Боја текста', 'custom_color' => 'Прилагођена боја',
'remove_color' => 'Уклоните боју', 'remove_color' => 'Уклоните боју',
'background_color' => 'Боја позадине', 'background_color' => 'Боја позадине',
'align_left' => 'Поравнај лево', 'align_left' => 'Поравнај лево',
@@ -61,7 +61,7 @@ return [
'list_task' => 'Листа задатака', 'list_task' => 'Листа задатака',
'indent_increase' => 'Повећај увлачење', 'indent_increase' => 'Повећај увлачење',
'indent_decrease' => 'Умањи увлачење', 'indent_decrease' => 'Умањи увлачење',
'table' => 'Tabela', 'table' => 'Табела',
'insert_image' => 'Уметни слику', 'insert_image' => 'Уметни слику',
'insert_image_title' => 'Убаци/уреди слику', 'insert_image_title' => 'Убаци/уреди слику',
'insert_link' => 'Убаци/измени везу', 'insert_link' => 'Убаци/измени везу',
@@ -149,11 +149,11 @@ return [
'url' => 'УРЛ', 'url' => 'УРЛ',
'text_to_display' => 'Текст за приказ', 'text_to_display' => 'Текст за приказ',
'title' => 'Наслов', 'title' => 'Наслов',
'browse_links' => 'Browse links', 'browse_links' => 'Потражи везе',
'open_link' => 'Отвори везу', 'open_link' => 'Отвори везу',
'open_link_in' => 'Отвори везу у...', 'open_link_in' => 'Отвори везу у...',
'open_link_current' => 'Тренутни прозор', 'open_link_current' => 'Тренутни прозор',
'open_link_new' => 'Нови Прозор', 'open_link_new' => 'Нови прозор',
'remove_link' => 'Уклони везу', 'remove_link' => 'Уклони везу',
'insert_collapsible' => 'Уредите склопиви блок', 'insert_collapsible' => 'Уредите склопиви блок',
'collapsible_unwrap' => 'Одмотати', 'collapsible_unwrap' => 'Одмотати',
@@ -166,8 +166,8 @@ return [
'about' => 'О уређивачу', 'about' => 'О уређивачу',
'about_title' => 'О уређивачу WYSIWYG', 'about_title' => 'О уређивачу WYSIWYG',
'editor_license' => 'Уредничка лиценца и ауторска права', 'editor_license' => 'Уредничка лиценца и ауторска права',
'editor_lexical_license' => 'This editor is built as a fork of :lexicalLink which is distributed under the MIT license.', 'editor_lexical_license' => 'Уређивач је изграђен као копија :lexicalLink који се дистрибуира под MIT лиценцом.',
'editor_lexical_license_link' => 'Full license details can be found here.', 'editor_lexical_license_link' => 'Комплетни детаљи лиценце се могу пронаћи овде.',
'editor_tiny_license' => 'Овај уређивач је направљен помоћу :tinyLink који је обезбеђен под МИТ лиценцом.', 'editor_tiny_license' => 'Овај уређивач је направљен помоћу :tinyLink који је обезбеђен под МИТ лиценцом.',
'editor_tiny_license_link' => 'Детаље о ауторским правима и лиценци за ТиниМЦЕ можете пронаћи овде.', 'editor_tiny_license_link' => 'Детаље о ауторским правима и лиценци за ТиниМЦЕ можете пронаћи овде.',
'save_continue' => 'Сачувај страницу и настави', 'save_continue' => 'Сачувај страницу и настави',

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