Merge branch 'master' into release

This commit is contained in:
Dan Brown 2021-12-15 14:08:17 +00:00
commit ba9cb591c8
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
30 changed files with 933 additions and 706 deletions

View File

@ -134,7 +134,7 @@ STORAGE_S3_ENDPOINT=https://my-custom-s3-compatible.service.com:8001
STORAGE_URL=false STORAGE_URL=false
# Authentication method to use # Authentication method to use
# Can be 'standard', 'ldap' or 'saml2' # Can be 'standard', 'ldap', 'saml2' or 'oidc'
AUTH_METHOD=standard AUTH_METHOD=standard
# Social authentication configuration # Social authentication configuration
@ -242,6 +242,7 @@ SAML2_GROUP_ATTRIBUTE=group
SAML2_REMOVE_FROM_GROUPS=false SAML2_REMOVE_FROM_GROUPS=false
# OpenID Connect authentication configuration # OpenID Connect authentication configuration
# Refer to https://www.bookstackapp.com/docs/admin/oidc-auth/
OIDC_NAME=SSO OIDC_NAME=SSO
OIDC_DISPLAY_NAME_CLAIMS=name OIDC_DISPLAY_NAME_CLAIMS=name
OIDC_CLIENT_ID=null OIDC_CLIENT_ID=null

View File

@ -200,3 +200,9 @@ sulfo :: Danish
Raukze :: German Raukze :: German
zygimantus :: Lithuanian zygimantus :: Lithuanian
marinkaberg :: Russian marinkaberg :: Russian
Vitaliy (gviabcua) :: Ukrainian
mannycarreiro :: Portuguese
Thiago Rafael Pereira de Carvalho (thiago.rafael) :: Portuguese, Brazilian
Ken Roger Bolgnes (kenbo124) :: Norwegian Bokmal
Nguyen Hung Phuong (hnwolf) :: Vietnamese
Umut ERGENE (umutergene67) :: Turkish

View File

@ -36,7 +36,7 @@ jobs:
- name: Start Database - name: Start Database
run: | run: |
sudo /etc/init.d/mysql start sudo systemctl start mysql
- name: Setup Database - name: Setup Database
run: | run: |

View File

@ -36,7 +36,7 @@ jobs:
- name: Start MySQL - name: Start MySQL
run: | run: |
sudo /etc/init.d/mysql start sudo systemctl start mysql
- name: Create database & user - name: Create database & user
run: | run: |

View File

@ -63,13 +63,16 @@ class UserRepo
/** /**
* Get all the users with their permissions in a paginated format. * Get all the users with their permissions in a paginated format.
* Note: Due to the use of email search this should only be used when
* user is assumed to be trusted. (Admin users).
* Email search can be abused to extract email addresses.
*/ */
public function getAllUsersPaginatedAndSorted(int $count, array $sortData): LengthAwarePaginator public function getAllUsersPaginatedAndSorted(int $count, array $sortData): LengthAwarePaginator
{ {
$sort = $sortData['sort']; $sort = $sortData['sort'];
$query = User::query()->select(['*']) $query = User::query()->select(['*'])
->withLastActivityAt() ->scopes(['withLastActivityAt'])
->with(['roles', 'avatar']) ->with(['roles', 'avatar'])
->withCount('mfaValues') ->withCount('mfaValues')
->orderBy($sort, $sortData['order']); ->orderBy($sort, $sortData['order']);

View File

@ -4,12 +4,14 @@ namespace BookStack\Http\Controllers\Api;
use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\Entity;
use BookStack\Entities\Tools\SearchOptions; use BookStack\Entities\Tools\SearchOptions;
use BookStack\Entities\Tools\SearchResultsFormatter;
use BookStack\Entities\Tools\SearchRunner; use BookStack\Entities\Tools\SearchRunner;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class SearchApiController extends ApiController class SearchApiController extends ApiController
{ {
protected $searchRunner; protected $searchRunner;
protected $resultsFormatter;
protected $rules = [ protected $rules = [
'all' => [ 'all' => [
@ -19,9 +21,10 @@ class SearchApiController extends ApiController
], ],
]; ];
public function __construct(SearchRunner $searchRunner) public function __construct(SearchRunner $searchRunner, SearchResultsFormatter $resultsFormatter)
{ {
$this->searchRunner = $searchRunner; $this->searchRunner = $searchRunner;
$this->resultsFormatter = $resultsFormatter;
} }
/** /**
@ -45,6 +48,7 @@ class SearchApiController extends ApiController
$count = min(intval($request->get('count', '0')) ?: 20, 100); $count = min(intval($request->get('count', '0')) ?: 20, 100);
$results = $this->searchRunner->searchEntities($options, 'all', $page, $count); $results = $this->searchRunner->searchEntities($options, 'all', $page, $count);
$this->resultsFormatter->format($results['results']->all(), $options);
/** @var Entity $result */ /** @var Entity $result */
foreach ($results['results'] as $result) { foreach ($results['results'] as $result) {
@ -52,9 +56,14 @@ class SearchApiController extends ApiController
'id', 'name', 'slug', 'book_id', 'id', 'name', 'slug', 'book_id',
'chapter_id', 'draft', 'template', 'chapter_id', 'draft', 'template',
'created_at', 'updated_at', 'created_at', 'updated_at',
'tags', 'type', 'tags', 'type', 'preview_html', 'url',
]); ]);
$result->setAttribute('type', $result->getType()); $result->setAttribute('type', $result->getType());
$result->setAttribute('url', $result->getUrl());
$result->setAttribute('preview_html', [
'name' => (string) $result->getAttribute('preview_name'),
'content' => (string) $result->getAttribute('preview_content'),
]);
} }
return response()->json([ return response()->json([

View File

@ -3,7 +3,6 @@
namespace BookStack\Http\Controllers; namespace BookStack\Http\Controllers;
use BookStack\Auth\User; use BookStack\Auth\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UserSearchController extends Controller class UserSearchController extends Controller
@ -14,19 +13,27 @@ class UserSearchController extends Controller
*/ */
public function forSelect(Request $request) public function forSelect(Request $request)
{ {
$hasPermission = signedInUser() && (
userCan('users-manage')
|| userCan('restrictions-manage-own')
|| userCan('restrictions-manage-all')
);
if (!$hasPermission) {
$this->showPermissionError();
}
$search = $request->get('search', ''); $search = $request->get('search', '');
$query = User::query()->orderBy('name', 'desc') $query = User::query()
->orderBy('name', 'asc')
->take(20); ->take(20);
if (!empty($search)) { if (!empty($search)) {
$query->where(function (Builder $query) use ($search) { $query->where('name', 'like', '%' . $search . '%');
$query->where('email', 'like', '%' . $search . '%')
->orWhere('name', 'like', '%' . $search . '%');
});
} }
$users = $query->get(); return view('form.user-select-list', [
'users' => $query->get(),
return view('form.user-select-list', compact('users')); ]);
} }
} }

1083
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,11 @@
"created_at": "2021-11-14T15:57:35.000000Z", "created_at": "2021-11-14T15:57:35.000000Z",
"updated_at": "2021-11-14T15:57:35.000000Z", "updated_at": "2021-11-14T15:57:35.000000Z",
"type": "chapter", "type": "chapter",
"url": "https://example.com/books/my-book/chapter/a-chapter-for-cats",
"preview_html": {
"name": "A chapter for <strong>cats</strong>",
"content": "...once a bunch of <strong>cats</strong> named tony...behaviour of <strong>cats</strong> is unsuitable"
},
"tags": [] "tags": []
}, },
{ {
@ -21,6 +26,11 @@
"created_at": "2021-05-15T16:28:10.000000Z", "created_at": "2021-05-15T16:28:10.000000Z",
"updated_at": "2021-11-14T15:56:49.000000Z", "updated_at": "2021-11-14T15:56:49.000000Z",
"type": "page", "type": "page",
"url": "https://example.com/books/my-book/page/the-hows-and-whys-of-cats",
"preview_html": {
"name": "The hows and whys of <strong>cats</strong>",
"content": "...people ask why <strong>cats</strong>? but there are...the reason that <strong>cats</strong> are fast are due to..."
},
"tags": [ "tags": [
{ {
"name": "Animal", "name": "Animal",
@ -45,6 +55,11 @@
"created_at": "2020-11-29T21:55:07.000000Z", "created_at": "2020-11-29T21:55:07.000000Z",
"updated_at": "2021-11-14T16:02:39.000000Z", "updated_at": "2021-11-14T16:02:39.000000Z",
"type": "page", "type": "page",
"url": "https://example.com/books/my-book/page/how-advanced-are-cats",
"preview_html": {
"name": "How advanced are <strong>cats</strong>?",
"content": "<strong>cats</strong> are some of the most advanced animals in the world."
},
"tags": [] "tags": []
} }
], ],

View File

@ -54,7 +54,7 @@ return [
'email_confirm_text' => 'Por favor confirme su dirección de correo electrónico presionando en el siguiente botón:', 'email_confirm_text' => 'Por favor confirme su dirección de correo electrónico presionando en el siguiente botón:',
'email_confirm_action' => 'Confirmar correo electrónico', 'email_confirm_action' => 'Confirmar correo electrónico',
'email_confirm_send_error' => 'Se pidió confirmación de correo electrónico pero el sistema no pudo enviar el correo electrónico. Contacte al administrador para asegurarse que el correo electrónico está configurado correctamente.', 'email_confirm_send_error' => 'Se pidió confirmación de correo electrónico pero el sistema no pudo enviar el correo electrónico. Contacte al administrador para asegurarse que el correo electrónico está configurado correctamente.',
'email_confirm_success' => Tu correo electrónico ha sido confirmado! Ahora deberías poder iniciar sesión usando esta dirección de correo electrónico.', 'email_confirm_success' => Su correo electrónico ha sido confirmado! Ahora debería poder iniciar sesión usando esta dirección de correo electrónico.',
'email_confirm_resent' => 'Correo electrónico de confirmación reenviado, Por favor verifique su bandeja de entrada.', 'email_confirm_resent' => 'Correo electrónico de confirmación reenviado, Por favor verifique su bandeja de entrada.',
'email_not_confirmed' => 'Dirección de correo electrónico no confirmada', 'email_not_confirmed' => 'Dirección de correo electrónico no confirmada',

View File

@ -260,7 +260,7 @@ return [
'tags_remove' => 'Eliminar esta etiqueta', 'tags_remove' => 'Eliminar esta etiqueta',
'tags_usages' => 'Uso total de etiquetas', 'tags_usages' => 'Uso total de etiquetas',
'tags_assigned_pages' => 'Asignadas a páginas', 'tags_assigned_pages' => 'Asignadas a páginas',
'tags_assigned_chapters' => 'Asignadas a capitulos', 'tags_assigned_chapters' => 'Asignadas a capítulos',
'tags_assigned_books' => 'Asignadas a libros', 'tags_assigned_books' => 'Asignadas a libros',
'tags_assigned_shelves' => 'Asignadas a estantes', 'tags_assigned_shelves' => 'Asignadas a estantes',
'tags_x_unique_values' => ':count valores únicos', 'tags_x_unique_values' => ':count valores únicos',

View File

@ -23,9 +23,9 @@ return [
'saml_no_email_address' => 'No se pudo encontrar una dirección de correo electrónico, para este usuario, en los datos proporcionados por el sistema de autenticación externo', 'saml_no_email_address' => 'No se pudo encontrar una dirección de correo electrónico, para este usuario, en los datos proporcionados por el sistema de autenticación externo',
'saml_invalid_response_id' => 'La solicitud del sistema de autenticación externo no está reconocida por un proceso iniciado por esta aplicación. Navegar hacia atrás después de un inicio de sesión podría causar este problema.', 'saml_invalid_response_id' => 'La solicitud del sistema de autenticación externo no está reconocida por un proceso iniciado por esta aplicación. Navegar hacia atrás después de un inicio de sesión podría causar este problema.',
'saml_fail_authed' => 'El inicio de sesión con :system falló, el sistema no proporcionó una autorización correcta', 'saml_fail_authed' => 'El inicio de sesión con :system falló, el sistema no proporcionó una autorización correcta',
'oidc_already_logged_in' => 'Ya tenías la sesión iniciada', 'oidc_already_logged_in' => 'Ya está conectado',
'oidc_user_not_registered' => 'El usuario :name no está registrado y el registro automático está deshabilitado', 'oidc_user_not_registered' => 'El usuario :name no está registrado y el registro automático está deshabilitado',
'oidc_no_email_address' => 'No se pudo encontrar una dirección de correo electrónico, para este usuario, en los datos proporcionados por el sistema de autenticación externo', 'oidc_no_email_address' => 'No se pudo encontrar una dirección de correo electrónico para este usuario en los datos proporcionados por el sistema de autenticación externo',
'oidc_fail_authed' => 'El inicio de sesión con :system falló, el sistema no proporcionó una autorización correcta', 'oidc_fail_authed' => 'El inicio de sesión con :system falló, el sistema no proporcionó una autorización correcta',
'social_no_action_defined' => 'Acción no definida', 'social_no_action_defined' => 'Acción no definida',
'social_login_bad_response' => "SE recibió un Error durante el acceso con :socialAccount : \n:error", 'social_login_bad_response' => "SE recibió un Error durante el acceso con :socialAccount : \n:error",

View File

@ -45,8 +45,8 @@ return [
'unfavourite' => 'お気に入りから削除', 'unfavourite' => 'お気に入りから削除',
'next' => '次へ', 'next' => '次へ',
'previous' => '前へ', 'previous' => '前へ',
'filter_active' => 'Active Filter:', 'filter_active' => '有効なフィルター:',
'filter_clear' => 'Clear Filter', 'filter_clear' => 'フィルターを解除',
// Sort Options // Sort Options
'sort_options' => '並べ替えオプション', 'sort_options' => '並べ替えオプション',
@ -63,7 +63,7 @@ return [
'no_activity' => '表示するアクティビティがありません', 'no_activity' => '表示するアクティビティがありません',
'no_items' => 'アイテムはありません', 'no_items' => 'アイテムはありません',
'back_to_top' => '上に戻る', 'back_to_top' => '上に戻る',
'skip_to_main_content' => 'Skip to main content', 'skip_to_main_content' => 'メインコンテンツへスキップ',
'toggle_details' => '概要の表示切替', 'toggle_details' => '概要の表示切替',
'toggle_thumbnails' => 'Toggle Thumbnails', 'toggle_thumbnails' => 'Toggle Thumbnails',
'details' => '詳細', 'details' => '詳細',

View File

@ -75,35 +75,35 @@ return [
// Shelves // Shelves
'shelf' => '本棚', 'shelf' => '本棚',
'shelves' => '本棚', 'shelves' => '本棚',
'x_shelves' => ':count Shelf|:count Shelves', 'x_shelves' => ':count 本棚|:count 本棚',
'shelves_long' => '本棚', 'shelves_long' => '本棚',
'shelves_empty' => 'No shelves have been created', 'shelves_empty' => '本棚が作成されていません',
'shelves_create' => '新しい本棚を作成', 'shelves_create' => '新しい本棚を作成',
'shelves_popular' => '人気の本棚', 'shelves_popular' => '人気の本棚',
'shelves_new' => '新しい本棚', 'shelves_new' => '新しい本棚',
'shelves_new_action' => '新しい本棚', 'shelves_new_action' => '新しい本棚',
'shelves_popular_empty' => 'The most popular shelves will appear here.', 'shelves_popular_empty' => 'ここに人気の本棚が表示されます。',
'shelves_new_empty' => 'The most recently created shelves will appear here.', 'shelves_new_empty' => '最近作成された本棚がここに表示されます。',
'shelves_save' => '本棚を保存', 'shelves_save' => '本棚を保存',
'shelves_books' => 'この本棚のブック', 'shelves_books' => 'この本棚のブック',
'shelves_add_books' => 'この本棚にブックを追加', 'shelves_add_books' => 'この本棚にブックを追加',
'shelves_drag_books' => 'ブックをここにドラッグすると本棚に追加されます', 'shelves_drag_books' => 'ブックをここにドラッグすると本棚に追加されます',
'shelves_empty_contents' => 'This shelf has no books assigned to it', 'shelves_empty_contents' => 'この本棚にはブックが割り当てられていません。',
'shelves_edit_and_assign' => 'Edit shelf to assign books', 'shelves_edit_and_assign' => '本棚を編集してブックを割り当てる',
'shelves_edit_named' => '本棚「:name」を編集', 'shelves_edit_named' => '本棚「:name」を編集',
'shelves_edit' => '本棚を編集', 'shelves_edit' => '本棚を編集',
'shelves_delete' => '本棚を削除', 'shelves_delete' => '本棚を削除',
'shelves_delete_named' => '本棚「:name」を削除', 'shelves_delete_named' => '本棚「:name」を削除',
'shelves_delete_explain' => "これにより、この本棚「:name」が削除されます。含まれているブックは削除されません。", 'shelves_delete_explain' => "これにより、この本棚「:name」が削除されます。含まれているブックは削除されません。",
'shelves_delete_confirmation' => '本当にこの本棚を削除してよろしいですか?', 'shelves_delete_confirmation' => '本当にこの本棚を削除してよろしいですか?',
'shelves_permissions' => 'Bookshelf Permissions', 'shelves_permissions' => '本棚の権限',
'shelves_permissions_updated' => 'Bookshelf Permissions Updated', 'shelves_permissions_updated' => '本棚の権限を更新しました',
'shelves_permissions_active' => 'Bookshelf Permissions Active', 'shelves_permissions_active' => '本棚の権限は有効です',
'shelves_permissions_cascade_warning' => 'Permissions on bookshelves do not automatically cascade to contained books. This is because a book can exist on multiple shelves. Permissions can however be copied down to child books using the option found below.', 'shelves_permissions_cascade_warning' => '本棚の権限は含まれる本には自動的に継承されません。これは、1つのブックが複数の本棚に存在する可能性があるためです。ただし、以下のオプションを使用すると権限を子ブックにコピーできます。',
'shelves_copy_permissions_to_books' => 'Copy Permissions to Books', 'shelves_copy_permissions_to_books' => 'ブックに権限をコピー',
'shelves_copy_permissions' => 'Copy Permissions', 'shelves_copy_permissions' => '権限をコピー',
'shelves_copy_permissions_explain' => 'This will apply the current permission settings of this bookshelf to all books contained within. Before activating, ensure any changes to the permissions of this bookshelf have been saved.', 'shelves_copy_permissions_explain' => 'これにより、この本棚の現在の権限設定を本棚に含まれるすべてのブックに適用します。有効にする前に、この本棚の権限への変更が保存されていることを確認してください。',
'shelves_copy_permission_success' => 'Bookshelf permissions copied to :count books', 'shelves_copy_permission_success' => '本棚の権限が:count個のブックにコピーされました',
// Books // Books
'book' => 'ブック', 'book' => 'ブック',
@ -115,7 +115,7 @@ return [
'books_new' => '新しいブック', 'books_new' => '新しいブック',
'books_new_action' => '新しいブック', 'books_new_action' => '新しいブック',
'books_popular_empty' => 'ここに人気のブックが表示されます。', 'books_popular_empty' => 'ここに人気のブックが表示されます。',
'books_new_empty' => 'The most recently created books will appear here.', 'books_new_empty' => '最近作成されたブックがここに表示されます。',
'books_create' => '新しいブックを作成', 'books_create' => '新しいブックを作成',
'books_delete' => 'ブックを削除', 'books_delete' => 'ブックを削除',
'books_delete_named' => 'ブック「:bookName」を削除', 'books_delete_named' => 'ブック「:bookName」を削除',
@ -153,7 +153,7 @@ return [
'chapters_create' => 'チャプターを作成', 'chapters_create' => 'チャプターを作成',
'chapters_delete' => 'チャプターを削除', 'chapters_delete' => 'チャプターを削除',
'chapters_delete_named' => 'チャプター「:chapterName」を削除', 'chapters_delete_named' => 'チャプター「:chapterName」を削除',
'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.', 'chapters_delete_explain' => 'これにより、チャプター「:chapterName」が削除されます。このチャプターに存在するページもすべて削除されます。',
'chapters_delete_confirm' => 'チャプターを削除してよろしいですか?', 'chapters_delete_confirm' => 'チャプターを削除してよろしいですか?',
'chapters_edit' => 'チャプターを編集', 'chapters_edit' => 'チャプターを編集',
'chapters_edit_named' => 'チャプター「:chapterName」を編集', 'chapters_edit_named' => 'チャプター「:chapterName」を編集',
@ -234,7 +234,7 @@ return [
'pages_initial_name' => '新規ページ', 'pages_initial_name' => '新規ページ',
'pages_editing_draft_notification' => ':timeDiffに保存された下書きを編集しています。', 'pages_editing_draft_notification' => ':timeDiffに保存された下書きを編集しています。',
'pages_draft_edited_notification' => 'このページは更新されています。下書きを破棄することを推奨します。', 'pages_draft_edited_notification' => 'このページは更新されています。下書きを破棄することを推奨します。',
'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.', 'pages_draft_page_changed_since_creation' => 'この下書きが作成されてから、このページが更新されました。この下書きを破棄するか、ページの変更を上書きしないように注意することを推奨します。',
'pages_draft_edit_active' => [ 'pages_draft_edit_active' => [
'start_a' => ':count人のユーザがページの編集を開始しました', 'start_a' => ':count人のユーザがページの編集を開始しました',
'start_b' => ':userNameがページの編集を開始しました', 'start_b' => ':userNameがページの編集を開始しました',
@ -244,7 +244,7 @@ return [
], ],
'pages_draft_discarded' => '下書きが破棄されました。エディタは現在の内容へ復元されています。', 'pages_draft_discarded' => '下書きが破棄されました。エディタは現在の内容へ復元されています。',
'pages_specific' => '特定のページ', 'pages_specific' => '特定のページ',
'pages_is_template' => 'Page Template', 'pages_is_template' => 'ページテンプレート',
// Editor Sidebar // Editor Sidebar
'page_tags' => 'タグ', 'page_tags' => 'タグ',
@ -258,16 +258,16 @@ return [
'tags_explain' => "タグを設定すると、コンテンツの管理が容易になります。\nより高度な管理をしたい場合、タグに内容を設定できます。", 'tags_explain' => "タグを設定すると、コンテンツの管理が容易になります。\nより高度な管理をしたい場合、タグに内容を設定できます。",
'tags_add' => 'タグを追加', 'tags_add' => 'タグを追加',
'tags_remove' => 'このタグを削除', 'tags_remove' => 'このタグを削除',
'tags_usages' => 'Total tag usages', 'tags_usages' => 'タグの総使用回数',
'tags_assigned_pages' => 'Assigned to Pages', 'tags_assigned_pages' => '割り当てられているページの数',
'tags_assigned_chapters' => 'Assigned to Chapters', 'tags_assigned_chapters' => '割り当てられているチャプターの数',
'tags_assigned_books' => 'Assigned to Books', 'tags_assigned_books' => '割り当てられているブックの数',
'tags_assigned_shelves' => 'Assigned to Shelves', 'tags_assigned_shelves' => '割り当てられている本棚の数',
'tags_x_unique_values' => ':count unique values', 'tags_x_unique_values' => ':count個のユニークな値',
'tags_all_values' => 'All values', 'tags_all_values' => '全ての値',
'tags_view_tags' => 'View Tags', 'tags_view_tags' => 'タグを表示',
'tags_view_existing_tags' => 'View existing tags', 'tags_view_existing_tags' => '既存のタグを表示',
'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.', 'tags_list_empty_hint' => 'タグはページエディタのサイドバーまたはブック、チャプター、本棚の詳細を編集しているときに割り当てることができます。',
'attachments' => '添付ファイル', 'attachments' => '添付ファイル',
'attachments_explain' => 'ファイルをアップロードまたはリンクを添付することができます。これらはサイドバーで確認できます。', 'attachments_explain' => 'ファイルをアップロードまたはリンクを添付することができます。これらはサイドバーで確認できます。',
'attachments_explain_instant_save' => 'この変更は即座に保存されます。', 'attachments_explain_instant_save' => 'この変更は即座に保存されます。',
@ -275,7 +275,7 @@ return [
'attachments_upload' => 'アップロード', 'attachments_upload' => 'アップロード',
'attachments_link' => 'リンクを添付', 'attachments_link' => 'リンクを添付',
'attachments_set_link' => 'リンクを設定', 'attachments_set_link' => 'リンクを設定',
'attachments_delete' => 'Are you sure you want to delete this attachment?', 'attachments_delete' => 'この添付ファイルを削除してよろしいですか?',
'attachments_dropzone' => 'ファイルをドロップするか、クリックして選択', 'attachments_dropzone' => 'ファイルをドロップするか、クリックして選択',
'attachments_no_files' => 'ファイルはアップロードされていません', 'attachments_no_files' => 'ファイルはアップロードされていません',
'attachments_explain_link' => 'ファイルをアップロードしたくない場合、他のページやクラウド上のファイルへのリンクを添付できます。', 'attachments_explain_link' => 'ファイルをアップロードしたくない場合、他のページやクラウド上のファイルへのリンクを添付できます。',
@ -284,7 +284,7 @@ return [
'attachments_link_url' => 'ファイルURL', 'attachments_link_url' => 'ファイルURL',
'attachments_link_url_hint' => 'WebサイトまたはファイルへのURL', 'attachments_link_url_hint' => 'WebサイトまたはファイルへのURL',
'attach' => '添付', 'attach' => '添付',
'attachments_insert_link' => 'Add Attachment Link to Page', 'attachments_insert_link' => '添付ファイルへのリンクをページに追加',
'attachments_edit_file' => 'ファイルを編集', 'attachments_edit_file' => 'ファイルを編集',
'attachments_edit_file_name' => 'ファイル名', 'attachments_edit_file_name' => 'ファイル名',
'attachments_edit_drop_upload' => 'ファイルをドロップするか、クリックしてアップロード', 'attachments_edit_drop_upload' => 'ファイルをドロップするか、クリックしてアップロード',
@ -294,12 +294,12 @@ return [
'attachments_file_uploaded' => 'ファイルがアップロードされました', 'attachments_file_uploaded' => 'ファイルがアップロードされました',
'attachments_file_updated' => 'ファイルが更新されました', 'attachments_file_updated' => 'ファイルが更新されました',
'attachments_link_attached' => 'リンクがページへ添付されました', 'attachments_link_attached' => 'リンクがページへ添付されました',
'templates' => 'Templates', 'templates' => 'テンプレート',
'templates_set_as_template' => 'Page is a template', 'templates_set_as_template' => 'テンプレートに設定',
'templates_explain_set_as_template' => 'You can set this page as a template so its contents be utilized when creating other pages. Other users will be able to use this template if they have view permissions for this page.', 'templates_explain_set_as_template' => 'このページをテンプレートとして設定すると、他のページを作成する際にこの内容を利用することができます。他のユーザーは、このページの表示権限を持っていればこのテンプレートを使用できます。',
'templates_replace_content' => 'Replace page content', 'templates_replace_content' => 'ページの内容を置換',
'templates_append_content' => 'Append to page content', 'templates_append_content' => 'ページの末尾に追加',
'templates_prepend_content' => 'Prepend to page content', 'templates_prepend_content' => 'ページの先頭に追加',
// Profile View // Profile View
'profile_user_for_x' => ':time前に作成', 'profile_user_for_x' => ':time前に作成',
@ -307,7 +307,7 @@ return [
'profile_not_created_pages' => ':userNameはページを作成していません', 'profile_not_created_pages' => ':userNameはページを作成していません',
'profile_not_created_chapters' => ':userNameはチャプターを作成していません', 'profile_not_created_chapters' => ':userNameはチャプターを作成していません',
'profile_not_created_books' => ':userNameはブックを作成していません', 'profile_not_created_books' => ':userNameはブックを作成していません',
'profile_not_created_shelves' => ':userName has not created any shelves', 'profile_not_created_shelves' => ':userNameは本棚を作成していません',
// Comments // Comments
'comment' => 'コメント', 'comment' => 'コメント',

View File

@ -18,7 +18,7 @@ return [
'name' => 'Navn', 'name' => 'Navn',
'description' => 'Beskrivelse', 'description' => 'Beskrivelse',
'role' => 'Rolle', 'role' => 'Rolle',
'cover_image' => 'Bokomslag', 'cover_image' => 'Forside',
'cover_image_description' => 'Bildet bør være ca. 440x250px.', 'cover_image_description' => 'Bildet bør være ca. 440x250px.',
// Actions // Actions

View File

@ -27,7 +27,7 @@ return [
'images' => 'Bilder', 'images' => 'Bilder',
'my_recent_drafts' => 'Mine nylige utkast', 'my_recent_drafts' => 'Mine nylige utkast',
'my_recently_viewed' => 'Mine nylige visninger', 'my_recently_viewed' => 'Mine nylige visninger',
'my_most_viewed_favourites' => 'Mine mest viste favoritter', 'my_most_viewed_favourites' => 'Mine mest sette favoritter',
'my_favourites' => 'Mine favoritter', 'my_favourites' => 'Mine favoritter',
'no_pages_viewed' => 'Du har ikke sett på noen sider', 'no_pages_viewed' => 'Du har ikke sett på noen sider',
'no_pages_recently_created' => 'Ingen sider har nylig blitt opprettet', 'no_pages_recently_created' => 'Ingen sider har nylig blitt opprettet',
@ -99,7 +99,7 @@ return [
'shelves_permissions' => 'Tilganger til hylla', 'shelves_permissions' => 'Tilganger til hylla',
'shelves_permissions_updated' => 'Hyllas tilganger er oppdatert', 'shelves_permissions_updated' => 'Hyllas tilganger er oppdatert',
'shelves_permissions_active' => 'Hyllas tilganger er aktive', 'shelves_permissions_active' => 'Hyllas tilganger er aktive',
'shelves_permissions_cascade_warning' => 'Permissions on bookshelves do not automatically cascade to contained books. This is because a book can exist on multiple shelves. Permissions can however be copied down to child books using the option found below.', 'shelves_permissions_cascade_warning' => 'Tillatelser på bokhyller vil ikke automatisk fordeles til bøkene på aktuell bokhylle. Dette da en bok kan tilhøre flere bokhyller. Tillatelser kan imidlertid kopieres til underliggende bøker ved å benytte alternativet nedenfor.',
'shelves_copy_permissions_to_books' => 'Kopier tilganger til bøkene på hylla', 'shelves_copy_permissions_to_books' => 'Kopier tilganger til bøkene på hylla',
'shelves_copy_permissions' => 'Kopier tilganger', 'shelves_copy_permissions' => 'Kopier tilganger',
'shelves_copy_permissions_explain' => 'Dette vil angi gjeldende tillatelsesinnstillinger for denne bokhyllen på alle bøkene som finnes på den. Før du aktiverer, må du forsikre deg om at endringer i tillatelsene til denne bokhyllen er lagret.', 'shelves_copy_permissions_explain' => 'Dette vil angi gjeldende tillatelsesinnstillinger for denne bokhyllen på alle bøkene som finnes på den. Før du aktiverer, må du forsikre deg om at endringer i tillatelsene til denne bokhyllen er lagret.',
@ -234,7 +234,7 @@ return [
'pages_initial_name' => 'Ny side', 'pages_initial_name' => 'Ny side',
'pages_editing_draft_notification' => 'Du skriver på et utkast som sist ble lagret :timeDiff.', 'pages_editing_draft_notification' => 'Du skriver på et utkast som sist ble lagret :timeDiff.',
'pages_draft_edited_notification' => 'Siden har blitt endret siden du startet. Det anbefales at du forkaster dine endringer.', 'pages_draft_edited_notification' => 'Siden har blitt endret siden du startet. Det anbefales at du forkaster dine endringer.',
'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.', 'pages_draft_page_changed_since_creation' => 'Denne siden er blitt oppdatert etter at dette utkastet ble opprettet. Det anbefales at du forkaster dette utkastet, eller er ekstra forsiktig slik at du ikke overskriver noen sideendringer.',
'pages_draft_edit_active' => [ 'pages_draft_edit_active' => [
'start_a' => ':count forfattere har begynt å endre denne siden.', 'start_a' => ':count forfattere har begynt å endre denne siden.',
'start_b' => ':userName skriver på siden for øyeblikket', 'start_b' => ':userName skriver på siden for øyeblikket',

View File

@ -6,11 +6,11 @@
*/ */
return [ return [
'failed' => 'As credenciais fornecidas não correspondem aos nossos registos.', 'failed' => 'Estas credenciais não coincidem com os nossos registos.',
'throttle' => 'Demasiadas tentativas de início de sessão. Por favor, tente novamente em :seconds segundos.', 'throttle' => 'Demasiadas tentativas de acesso. Tente novamente em :seconds segundos.',
// Login & Register // Login & Register
'sign_up' => 'Criar conta', 'sign_up' => 'Registar',
'log_in' => 'Iniciar sessão', 'log_in' => 'Iniciar sessão',
'log_in_with' => 'Iniciar sessão com :socialDriver', 'log_in_with' => 'Iniciar sessão com :socialDriver',
'sign_up_with' => 'Criar conta com :socialDriver', 'sign_up_with' => 'Criar conta com :socialDriver',
@ -54,7 +54,7 @@ return [
'email_confirm_text' => 'Por favor, confirme o seu endereço de e-mail ao carregar no botão abaixo:', 'email_confirm_text' => 'Por favor, confirme o seu endereço de e-mail ao carregar no botão abaixo:',
'email_confirm_action' => 'Confirmar E-mail', 'email_confirm_action' => 'Confirmar E-mail',
'email_confirm_send_error' => 'A confirmação do endereço de e-mail é requerida, mas o sistema não pôde enviar a mensagem. Por favor, entre em contacto com o administrador para se certificar que o serviço de envio de e-mails está corretamente configurado.', 'email_confirm_send_error' => 'A confirmação do endereço de e-mail é requerida, mas o sistema não pôde enviar a mensagem. Por favor, entre em contacto com o administrador para se certificar que o serviço de envio de e-mails está corretamente configurado.',
'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.', 'email_confirm_success' => 'O seu endereço de email foi confirmado! Neste momento já poderá entrar usando este endereço de email.',
'email_confirm_resent' => 'E-mail de confirmação reenviado. Por favor, verifique a sua caixa de entrada.', 'email_confirm_resent' => 'E-mail de confirmação reenviado. Por favor, verifique a sua caixa de entrada.',
'email_not_confirmed' => 'Endereço de E-mail Não Confirmado', 'email_not_confirmed' => 'Endereço de E-mail Não Confirmado',
@ -71,7 +71,7 @@ return [
'user_invite_page_welcome' => 'Bem-vindo(a) a :appName!', 'user_invite_page_welcome' => 'Bem-vindo(a) a :appName!',
'user_invite_page_text' => 'Para finalizar a sua conta e obter acesso, precisa de definir uma senha que será utilizada para efetuar login em :appName em visitas futuras.', 'user_invite_page_text' => 'Para finalizar a sua conta e obter acesso, precisa de definir uma senha que será utilizada para efetuar login em :appName em visitas futuras.',
'user_invite_page_confirm_button' => 'Confirmar Palavra-Passe', 'user_invite_page_confirm_button' => 'Confirmar Palavra-Passe',
'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!', 'user_invite_success_login' => 'Palavra passe definida, agora poderá entrar usado a sua nova palavra passe para acessar :appName!',
// Multi-factor Authentication // Multi-factor Authentication
'mfa_setup' => 'Configurar autenticação de múltiplos fatores', 'mfa_setup' => 'Configurar autenticação de múltiplos fatores',
@ -80,31 +80,31 @@ return [
'mfa_setup_reconfigure' => 'Reconfigurar', 'mfa_setup_reconfigure' => 'Reconfigurar',
'mfa_setup_remove_confirmation' => 'Tem a certeza que deseja remover este método de autenticação de múltiplos fatores?', 'mfa_setup_remove_confirmation' => 'Tem a certeza que deseja remover este método de autenticação de múltiplos fatores?',
'mfa_setup_action' => 'Configuração', 'mfa_setup_action' => 'Configuração',
'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.', 'mfa_backup_codes_usage_limit_warning' => 'Você tem menos de 5 códigos de backup restantes, Por favor, gere e armazene um novo conjunto antes de esgotar os códigos para evitar estar bloqueado para fora da sua conta.',
'mfa_option_totp_title' => 'Mobile App', 'mfa_option_totp_title' => 'Aplicação móvel',
'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.', 'mfa_option_totp_desc' => 'Para usar a autenticação multi-fator, você precisará de um aplicativo móvel que suporte TOTP como o Autenticador do Google, Authy ou o autenticador Microsoft.',
'mfa_option_backup_codes_title' => 'Backup Codes', 'mfa_option_backup_codes_title' => 'Códigos de Backup',
'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.', 'mfa_option_backup_codes_desc' => 'Armazene com segurança um conjunto de códigos de backup únicos que você pode inserir para verificar sua identidade.',
'mfa_gen_confirm_and_enable' => 'Confirm and Enable', 'mfa_gen_confirm_and_enable' => 'Confirmar e ativar',
'mfa_gen_backup_codes_title' => 'Backup Codes Setup', 'mfa_gen_backup_codes_title' => 'Configuração dos Códigos de Backup',
'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.', 'mfa_gen_backup_codes_desc' => 'Armazene a lista de códigos abaixo em um lugar seguro. Ao acessar o sistema você poderá usar um dos códigos como um segundo mecanismo de autenticação.',
'mfa_gen_backup_codes_download' => 'Download Codes', 'mfa_gen_backup_codes_download' => 'Transferir códigos',
'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once', 'mfa_gen_backup_codes_usage_warning' => 'Cada código só pode ser usado uma vez',
'mfa_gen_totp_title' => 'Mobile App Setup', 'mfa_gen_totp_title' => 'Configuração de aplicativo móvel',
'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.', 'mfa_gen_totp_desc' => 'Para usar a autenticação multi-fator, você precisará de um aplicativo móvel que suporte TOTP como o Autenticador do Google, Authy ou o autenticador Microsoft.',
'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.', 'mfa_gen_totp_scan' => 'Leia o código QR abaixo usando seu aplicativo de autenticação preferido para começar.',
'mfa_gen_totp_verify_setup' => 'Verify Setup', 'mfa_gen_totp_verify_setup' => 'Verificar configuração',
'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:', 'mfa_gen_totp_verify_setup_desc' => 'Verifique se tudo está funcionando digitando um código, gerado dentro do seu aplicativo de autenticação, na caixa de entrada abaixo:',
'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here', 'mfa_gen_totp_provide_code_here' => 'Forneça o código gerado pelo aplicativo aqui',
'mfa_verify_access' => 'Verify Access', 'mfa_verify_access' => 'Verificar Acesso',
'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.', 'mfa_verify_access_desc' => 'Sua conta de usuário requer que você confirme sua identidade por meio de um nível adicional de verificação antes de conceder o acesso. Verifique o uso de um dos métodos configurados para continuar.',
'mfa_verify_no_methods' => 'No Methods Configured', 'mfa_verify_no_methods' => 'Nenhum método configurado',
'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.', 'mfa_verify_no_methods_desc' => 'Nenhum método de autenticação de vários fatores foi encontrado para a sua conta. Você precisará configurar pelo menos um método antes de ganhar acesso.',
'mfa_verify_use_totp' => 'Verify using a mobile app', 'mfa_verify_use_totp' => 'Verificar usando um aplicativo móvel',
'mfa_verify_use_backup_codes' => 'Verify using a backup code', 'mfa_verify_use_backup_codes' => 'Verificar usando código de backup',
'mfa_verify_backup_code' => 'Backup Code', 'mfa_verify_backup_code' => 'Código de backup',
'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:', 'mfa_verify_backup_code_desc' => 'Insira um dos seus códigos de backup restantes abaixo:',
'mfa_verify_backup_code_enter_here' => 'Enter backup code here', 'mfa_verify_backup_code_enter_here' => 'Insira o código de backup aqui',
'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:', 'mfa_verify_totp_desc' => 'Digite o código, gerado através do seu aplicativo móvel, abaixo:',
'mfa_setup_login_notification' => 'Multi-factor method configured, Please now login again using the configured method.', 'mfa_setup_login_notification' => 'Método de multi-fatores configurado, por favor faça login novamente usando o método configurado.',
]; ];

View File

@ -45,8 +45,8 @@ return [
'unfavourite' => 'Retirar Favorito', 'unfavourite' => 'Retirar Favorito',
'next' => 'Próximo', 'next' => 'Próximo',
'previous' => 'Anterior', 'previous' => 'Anterior',
'filter_active' => 'Active Filter:', 'filter_active' => 'Filtro Ativo:',
'filter_clear' => 'Clear Filter', 'filter_clear' => 'Limpar Filtro',
// Sort Options // Sort Options
'sort_options' => 'Opções de Ordenação', 'sort_options' => 'Opções de Ordenação',

View File

@ -258,15 +258,15 @@ return [
'tags_explain' => "Adicione algumas etiquetas para melhor categorizar o seu conteúdo. \n Você poderá atribuir valores às etiquetas para uma organização mais complexa.", 'tags_explain' => "Adicione algumas etiquetas para melhor categorizar o seu conteúdo. \n Você poderá atribuir valores às etiquetas para uma organização mais complexa.",
'tags_add' => 'Adicionar outra etiqueta', 'tags_add' => 'Adicionar outra etiqueta',
'tags_remove' => 'Remover esta etiqueta', 'tags_remove' => 'Remover esta etiqueta',
'tags_usages' => 'Total tag usages', 'tags_usages' => 'Total de marcadores usados',
'tags_assigned_pages' => 'Assigned to Pages', 'tags_assigned_pages' => 'Atribuído às páginas',
'tags_assigned_chapters' => 'Assigned to Chapters', 'tags_assigned_chapters' => 'Atribuído aos Capítulos',
'tags_assigned_books' => 'Assigned to Books', 'tags_assigned_books' => 'Atribuído a Livros',
'tags_assigned_shelves' => 'Assigned to Shelves', 'tags_assigned_shelves' => 'Atribuído a Prateleiras',
'tags_x_unique_values' => ':count unique values', 'tags_x_unique_values' => ':count valores únicos',
'tags_all_values' => 'All values', 'tags_all_values' => 'Todos os valores',
'tags_view_tags' => 'View Tags', 'tags_view_tags' => 'Ver Marcadores',
'tags_view_existing_tags' => 'View existing tags', 'tags_view_existing_tags' => 'Ver marcadores existentes',
'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.', 'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
'attachments' => 'Anexos', 'attachments' => 'Anexos',
'attachments_explain' => 'Carregue alguns arquivos ou anexe links para serem exibidos na sua página. Eles estarão visíveis na barra lateral à direita.', 'attachments_explain' => 'Carregue alguns arquivos ou anexe links para serem exibidos na sua página. Eles estarão visíveis na barra lateral à direita.',

View File

@ -54,7 +54,7 @@ return [
'email_confirm_text' => 'Будь ласка, підтвердьте свою адресу електронної пошти, натиснувши кнопку нижче:', 'email_confirm_text' => 'Будь ласка, підтвердьте свою адресу електронної пошти, натиснувши кнопку нижче:',
'email_confirm_action' => 'Підтвердити Email', 'email_confirm_action' => 'Підтвердити Email',
'email_confirm_send_error' => 'Необхідно підтвердження електронною поштою, але система не змогла надіслати електронний лист. Зверніться до адміністратора, щоб правильно налаштувати електронну пошту.', 'email_confirm_send_error' => 'Необхідно підтвердження електронною поштою, але система не змогла надіслати електронний лист. Зверніться до адміністратора, щоб правильно налаштувати електронну пошту.',
'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.', 'email_confirm_success' => 'Ваша адреса електронної пошти була підтверджена! Тепер ви можете увійти в систему, використовуючи цю адресу електронної пошти.',
'email_confirm_resent' => 'Лист з підтвердженням надіслано, перевірте свою пошту.', 'email_confirm_resent' => 'Лист з підтвердженням надіслано, перевірте свою пошту.',
'email_not_confirmed' => 'Адресу електронної скриньки не підтверджено', 'email_not_confirmed' => 'Адресу електронної скриньки не підтверджено',
@ -71,40 +71,40 @@ return [
'user_invite_page_welcome' => 'Ласкаво просимо до :appName!', 'user_invite_page_welcome' => 'Ласкаво просимо до :appName!',
'user_invite_page_text' => 'Для завершення процесу створення облікового запису та отримання доступу вам потрібно задати пароль, який буде використовуватися для входу в :appName в майбутньому.', 'user_invite_page_text' => 'Для завершення процесу створення облікового запису та отримання доступу вам потрібно задати пароль, який буде використовуватися для входу в :appName в майбутньому.',
'user_invite_page_confirm_button' => 'Підтвердити пароль', 'user_invite_page_confirm_button' => 'Підтвердити пароль',
'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!', 'user_invite_success_login' => 'Пароль встановлено, ви повинні увійти в систему, використовуючи свій встановлений пароль для доступу :appNam!',
// Multi-factor Authentication // Multi-factor Authentication
'mfa_setup' => 'Setup Multi-Factor Authentication', 'mfa_setup' => 'Налаштувати двофакторну автентифікацію',
'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.', 'mfa_setup_desc' => 'Двофакторна аутентифікація додає ще один рівень безпеки для вашого облікового запису.',
'mfa_setup_configured' => 'Already configured', 'mfa_setup_configured' => 'Вже налаштовано',
'mfa_setup_reconfigure' => 'Reconfigure', 'mfa_setup_reconfigure' => 'Переналаштувати',
'mfa_setup_remove_confirmation' => 'Are you sure you want to remove this multi-factor authentication method?', 'mfa_setup_remove_confirmation' => 'Ви впевнені, що хочете видалити цей метод багатофакторної автентифікації?',
'mfa_setup_action' => 'Setup', 'mfa_setup_action' => 'Встановлення',
'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.', 'mfa_backup_codes_usage_limit_warning' => 'Залишилося менше 5 резервних кодів, Будь ласка, створіть та збережіть новий набір до того, як у вас не вистачає кодів, щоб запобігти блокуванню вашої обліковки.',
'mfa_option_totp_title' => 'Mobile App', 'mfa_option_totp_title' => 'Мобільний додаток',
'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.', 'mfa_option_totp_desc' => 'Для використання багатофакторної автентифікації вам потрібен мобільний додаток, який підтримує TOTP такі як Google Authenticator, Authy або Microsoft Authenticator.',
'mfa_option_backup_codes_title' => 'Backup Codes', 'mfa_option_backup_codes_title' => 'Резервні коди',
'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.', 'mfa_option_backup_codes_desc' => 'Безпечно зберігайте набір резервних кодів з використанням одноразового використання, які можна увійти, щоб підтвердити свою особу.',
'mfa_gen_confirm_and_enable' => 'Confirm and Enable', 'mfa_gen_confirm_and_enable' => 'Підтвердити та увімкнути',
'mfa_gen_backup_codes_title' => 'Backup Codes Setup', 'mfa_gen_backup_codes_title' => 'Налаштування резервних кодів',
'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.', 'mfa_gen_backup_codes_desc' => 'Зберігайте список кодів в безпечному місці. Для доступу до системи ви зможете використовувати один з кодів як другий механізм аутентифікації.',
'mfa_gen_backup_codes_download' => 'Download Codes', 'mfa_gen_backup_codes_download' => 'Завантажити коди',
'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once', 'mfa_gen_backup_codes_usage_warning' => 'Кожний код можна використати лише один раз',
'mfa_gen_totp_title' => 'Mobile App Setup', 'mfa_gen_totp_title' => 'Налаштування мобільного додатка',
'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.', 'mfa_gen_totp_desc' => 'Для використання багатофакторної автентифікації вам потрібен мобільний додаток, який підтримує TOTP такі як Google Authenticator, Authy або Microsoft Authenticator.',
'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.', 'mfa_gen_totp_scan' => 'Проскануйте QR-код внизу за допомогою бажаного додатку для аутентифікації, щоб розпочати.',
'mfa_gen_totp_verify_setup' => 'Verify Setup', 'mfa_gen_totp_verify_setup' => 'Перевірка налаштувань',
'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:', 'mfa_gen_totp_verify_setup_desc' => 'Переконайтеся, що все працює, ввівши код, згенерований у вашому додатку аутентифікації, в полі вводу нижче:',
'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here', 'mfa_gen_totp_provide_code_here' => 'Вкажіть код вашої програми тут',
'mfa_verify_access' => 'Verify Access', 'mfa_verify_access' => 'Підтвердити доступ',
'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.', 'mfa_verify_access_desc' => 'Ваш обліковий запис користувача вимагає підтвердження за допомогою додаткового рівня перевірки, перш ніж отримати доступ. Перевірте, використовуючи один з ваших налаштованих способів для продовження.',
'mfa_verify_no_methods' => 'No Methods Configured', 'mfa_verify_no_methods' => 'Немає налаштованих методів',
'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.', 'mfa_verify_no_methods_desc' => 'Для вашого облікового запису не знайдено жодних методів багатофакторної аутентифікації. Вам потрібно буде налаштувати хоча б один спосіб перш ніж отримати доступ.',
'mfa_verify_use_totp' => 'Verify using a mobile app', 'mfa_verify_use_totp' => 'Перевірити за допомогою мобільного додатку',
'mfa_verify_use_backup_codes' => 'Verify using a backup code', 'mfa_verify_use_backup_codes' => 'Перевірка використовуючи резервний код',
'mfa_verify_backup_code' => 'Backup Code', 'mfa_verify_backup_code' => 'Резервний код',
'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:', 'mfa_verify_backup_code_desc' => 'Введіть один з резервних кодів нижче:',
'mfa_verify_backup_code_enter_here' => 'Enter backup code here', 'mfa_verify_backup_code_enter_here' => 'Введіть резервний код тут',
'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:', 'mfa_verify_totp_desc' => 'Введіть код, згенерований за допомогою мобільного додатку:',
'mfa_setup_login_notification' => 'Multi-factor method configured, Please now login again using the configured method.', 'mfa_setup_login_notification' => 'Налаштовано багатофакторний метод аутентифікації. Будь ласка, зараз увійдіть в систему знову, використовуючи налаштований метод.',
]; ];

View File

@ -39,14 +39,14 @@ return [
'reset' => 'Скинути', 'reset' => 'Скинути',
'remove' => 'Видалити', 'remove' => 'Видалити',
'add' => 'Додати', 'add' => 'Додати',
'configure' => 'Configure', 'configure' => 'Налаштувати',
'fullscreen' => 'На весь екран', 'fullscreen' => 'На весь екран',
'favourite' => 'Favourite', 'favourite' => 'Улюблене',
'unfavourite' => 'Unfavourite', 'unfavourite' => 'Прибрати з обраного',
'next' => 'Next', 'next' => 'Уперед',
'previous' => 'Previous', 'previous' => 'Назад',
'filter_active' => 'Active Filter:', 'filter_active' => 'Активний фільтр:',
'filter_clear' => 'Clear Filter', 'filter_clear' => 'Очистити фільтр',
// Sort Options // Sort Options
'sort_options' => 'Параметри сортування', 'sort_options' => 'Параметри сортування',
@ -63,7 +63,7 @@ return [
'no_activity' => 'Немає активності для показу', 'no_activity' => 'Немає активності для показу',
'no_items' => 'Немає доступних елементів', 'no_items' => 'Немає доступних елементів',
'back_to_top' => 'Повернутися до початку', 'back_to_top' => 'Повернутися до початку',
'skip_to_main_content' => 'Skip to main content', 'skip_to_main_content' => 'Перейти до змісту',
'toggle_details' => 'Подробиці', 'toggle_details' => 'Подробиці',
'toggle_thumbnails' => 'Мініатюри', 'toggle_thumbnails' => 'Мініатюри',
'details' => 'Деталі', 'details' => 'Деталі',
@ -73,7 +73,7 @@ return [
'breadcrumb' => 'Навігація', 'breadcrumb' => 'Навігація',
// Header // Header
'header_menu_expand' => 'Expand Header Menu', 'header_menu_expand' => 'Розгорнути меню заголовка',
'profile_menu' => 'Меню профілю', 'profile_menu' => 'Меню профілю',
'view_profile' => 'Переглянути профіль', 'view_profile' => 'Переглянути профіль',
'edit_profile' => 'Редагувати профіль', 'edit_profile' => 'Редагувати профіль',
@ -82,9 +82,9 @@ return [
// Layout tabs // Layout tabs
'tab_info' => 'Інфо', 'tab_info' => 'Інфо',
'tab_info_label' => 'Tab: Show Secondary Information', 'tab_info_label' => 'Вкладка: показувати додаткову інформацію',
'tab_content' => 'Вміст', 'tab_content' => 'Вміст',
'tab_content_label' => 'Tab: Show Primary Content', 'tab_content_label' => 'Вкладка: Показати основний вміст',
// Email Content // Email Content
'email_action_help' => 'Якщо у вас виникають проблеми при натисканні кнопки ":actionText", скопіюйте та вставте URL у свій веб-браузер:', 'email_action_help' => 'Якщо у вас виникають проблеми при натисканні кнопки ":actionText", скопіюйте та вставте URL у свій веб-браузер:',

View File

@ -27,8 +27,8 @@ return [
'images' => 'Зображення', 'images' => 'Зображення',
'my_recent_drafts' => 'Мої останні чернетки', 'my_recent_drafts' => 'Мої останні чернетки',
'my_recently_viewed' => 'Мої недавні перегляди', 'my_recently_viewed' => 'Мої недавні перегляди',
'my_most_viewed_favourites' => 'My Most Viewed Favourites', 'my_most_viewed_favourites' => 'Мої найпопулярніші улюблені',
'my_favourites' => 'My Favourites', 'my_favourites' => 'Моє обране',
'no_pages_viewed' => 'Ви не переглядали жодної сторінки', 'no_pages_viewed' => 'Ви не переглядали жодної сторінки',
'no_pages_recently_created' => 'Не було створено жодної сторінки', 'no_pages_recently_created' => 'Не було створено жодної сторінки',
'no_pages_recently_updated' => 'Немає недавно оновлених сторінок', 'no_pages_recently_updated' => 'Немає недавно оновлених сторінок',
@ -36,7 +36,7 @@ return [
'export_html' => 'Вбудований веб-файл', 'export_html' => 'Вбудований веб-файл',
'export_pdf' => 'PDF файл', 'export_pdf' => 'PDF файл',
'export_text' => 'Текстовий файл', 'export_text' => 'Текстовий файл',
'export_md' => 'Markdown File', 'export_md' => 'Файл розмітки',
// Permissions and restrictions // Permissions and restrictions
'permissions' => 'Дозволи', 'permissions' => 'Дозволи',
@ -99,7 +99,7 @@ return [
'shelves_permissions' => 'Дозволи на книжкову полицю', 'shelves_permissions' => 'Дозволи на книжкову полицю',
'shelves_permissions_updated' => 'Дозволи на книжкову полицю оновлено', 'shelves_permissions_updated' => 'Дозволи на книжкову полицю оновлено',
'shelves_permissions_active' => 'Діючі дозволи на книжкову полицю', 'shelves_permissions_active' => 'Діючі дозволи на книжкову полицю',
'shelves_permissions_cascade_warning' => 'Permissions on bookshelves do not automatically cascade to contained books. This is because a book can exist on multiple shelves. Permissions can however be copied down to child books using the option found below.', 'shelves_permissions_cascade_warning' => 'Дозволи на поличках не потрапляють автоматично каскадом до книг. Це тому, що книга може існувати на кілька полиць. Дозволи, однак можна скопіювати до дочірніх книг, використовуючи нижченаведену опцію.',
'shelves_copy_permissions_to_books' => 'Копіювати дозволи на книги', 'shelves_copy_permissions_to_books' => 'Копіювати дозволи на книги',
'shelves_copy_permissions' => 'Копіювати дозволи', 'shelves_copy_permissions' => 'Копіювати дозволи',
'shelves_copy_permissions_explain' => 'Це застосовує поточні налаштування дозволів цієї книжкової полиці до всіх книг, що містяться всередині. Перш ніж активувати, переконайтесь що будь-які зміни дозволів цієї книжкової полиці були збережені.', 'shelves_copy_permissions_explain' => 'Це застосовує поточні налаштування дозволів цієї книжкової полиці до всіх книг, що містяться всередині. Перш ніж активувати, переконайтесь що будь-які зміни дозволів цієї книжкової полиці були збережені.',
@ -234,7 +234,7 @@ return [
'pages_initial_name' => 'Нова сторінка', 'pages_initial_name' => 'Нова сторінка',
'pages_editing_draft_notification' => 'Ви наразі редагуєте чернетку, що була збережена останньою :timeDiff.', 'pages_editing_draft_notification' => 'Ви наразі редагуєте чернетку, що була збережена останньою :timeDiff.',
'pages_draft_edited_notification' => 'З того часу ця сторінка була оновлена. Рекомендуємо відмовитися від цього проекту.', 'pages_draft_edited_notification' => 'З того часу ця сторінка була оновлена. Рекомендуємо відмовитися від цього проекту.',
'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.', 'pages_draft_page_changed_since_creation' => 'Ця сторінка була оновлена, оскільки була створена ця чернетка. Рекомендується відхилити цей проект або перейматися тим, що ви не перезапишете будь-які зміни в сторінках.',
'pages_draft_edit_active' => [ 'pages_draft_edit_active' => [
'start_a' => ':count користувачі(в) почали редагувати цю сторінку', 'start_a' => ':count користувачі(в) почали редагувати цю сторінку',
'start_b' => ':userName розпочав редагування цієї сторінки', 'start_b' => ':userName розпочав редагування цієї сторінки',
@ -258,16 +258,16 @@ return [
'tags_explain' => "Додайте кілька тегів, щоб краще класифікувати ваш вміст. \n Ви можете присвоїти значення тегу для більш глибокої організації.", 'tags_explain' => "Додайте кілька тегів, щоб краще класифікувати ваш вміст. \n Ви можете присвоїти значення тегу для більш глибокої організації.",
'tags_add' => 'Додати ще один тег', 'tags_add' => 'Додати ще один тег',
'tags_remove' => 'Видалити цей тег', 'tags_remove' => 'Видалити цей тег',
'tags_usages' => 'Total tag usages', 'tags_usages' => 'Усього тегів використано',
'tags_assigned_pages' => 'Assigned to Pages', 'tags_assigned_pages' => 'Призначено до сторінок',
'tags_assigned_chapters' => 'Assigned to Chapters', 'tags_assigned_chapters' => 'Призначені до груп',
'tags_assigned_books' => 'Assigned to Books', 'tags_assigned_books' => 'Призначено до книг',
'tags_assigned_shelves' => 'Assigned to Shelves', 'tags_assigned_shelves' => 'Призначені до полиць',
'tags_x_unique_values' => ':count unique values', 'tags_x_unique_values' => ':count унікальних значень',
'tags_all_values' => 'All values', 'tags_all_values' => 'Всі значення',
'tags_view_tags' => 'View Tags', 'tags_view_tags' => 'Перегляд міток',
'tags_view_existing_tags' => 'View existing tags', 'tags_view_existing_tags' => 'Перегляд існуючих тегів',
'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.', 'tags_list_empty_hint' => 'Теги можуть бути призначені через бічну панель редактора сторінки, або під час редагування деталей книги, глави чи полиці.',
'attachments' => 'Вкладення', 'attachments' => 'Вкладення',
'attachments_explain' => 'Завантажте файли, або додайте посилання, які відображатимуться на вашій сторінці. Їх буде видно на бічній панелі сторінки.', 'attachments_explain' => 'Завантажте файли, або додайте посилання, які відображатимуться на вашій сторінці. Їх буде видно на бічній панелі сторінки.',
'attachments_explain_instant_save' => 'Зміни тут зберігаються миттєво.', 'attachments_explain_instant_save' => 'Зміни тут зберігаються миттєво.',

View File

@ -23,10 +23,10 @@ return [
'saml_no_email_address' => 'Не вдалося знайти електронну адресу для цього користувача у даних, наданих зовнішньою системою аутентифікації', 'saml_no_email_address' => 'Не вдалося знайти електронну адресу для цього користувача у даних, наданих зовнішньою системою аутентифікації',
'saml_invalid_response_id' => 'Запит із зовнішньої системи аутентифікації не розпізнається процесом, розпочатим цим додатком. Повернення назад після входу могла спричинити цю проблему.', 'saml_invalid_response_id' => 'Запит із зовнішньої системи аутентифікації не розпізнається процесом, розпочатим цим додатком. Повернення назад після входу могла спричинити цю проблему.',
'saml_fail_authed' => 'Вхід із використанням «:system» не вдався, система не здійснила успішну авторизацію', 'saml_fail_authed' => 'Вхід із використанням «:system» не вдався, система не здійснила успішну авторизацію',
'oidc_already_logged_in' => 'Already logged in', 'oidc_already_logged_in' => 'Вже ввійшли в систему',
'oidc_user_not_registered' => 'The user :name is not registered and automatic registration is disabled', 'oidc_user_not_registered' => 'Користувач :name не зареєстровано і автоматична реєстрація відключена',
'oidc_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system', 'oidc_no_email_address' => 'Не вдалося знайти адресу електронної пошти для цього користувача у даних, наданих зовнішньою системою автентифікації',
'oidc_fail_authed' => 'Login using :system failed, system did not provide successful authorization', 'oidc_fail_authed' => 'Увійти за допомогою :system не вдалося, система не надала успішної авторизації',
'social_no_action_defined' => 'Жодних дій не визначено', 'social_no_action_defined' => 'Жодних дій не визначено',
'social_login_bad_response' => "Помилка, отримана під час входу з :socialAccount помилка : \n:error", 'social_login_bad_response' => "Помилка, отримана під час входу з :socialAccount помилка : \n:error",
'social_account_in_use' => 'Цей :socialAccount обліковий запис вже використовується, спробуйте ввійти з параметрами :socialAccount.', 'social_account_in_use' => 'Цей :socialAccount обліковий запис вже використовується, спробуйте ввійти з параметрами :socialAccount.',
@ -87,9 +87,9 @@ return [
'404_page_not_found' => 'Сторінку не знайдено', '404_page_not_found' => 'Сторінку не знайдено',
'sorry_page_not_found' => 'Вибачте, сторінку, яку ви шукали, не знайдено.', 'sorry_page_not_found' => 'Вибачте, сторінку, яку ви шукали, не знайдено.',
'sorry_page_not_found_permission_warning' => 'Якщо ви очікували що ця сторінки існує можливо у вас немає дозволу на її перегляд.', 'sorry_page_not_found_permission_warning' => 'Якщо ви очікували що ця сторінки існує можливо у вас немає дозволу на її перегляд.',
'image_not_found' => 'Image Not Found', 'image_not_found' => 'Зображення не знайдено',
'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.', 'image_not_found_subtitle' => 'Вибачте, файл зображення, що ви шукали, не знайдено.',
'image_not_found_details' => 'If you expected this image to exist it might have been deleted.', 'image_not_found_details' => 'Якщо ви очікували існування цього зображення, його, можливо, було видалено.',
'return_home' => 'Повернутися на головну', 'return_home' => 'Повернутися на головну',
'error_occurred' => 'Виникла помилка', 'error_occurred' => 'Виникла помилка',
'app_down' => ':appName зараз недоступний', 'app_down' => ':appName зараз недоступний',

View File

@ -17,7 +17,7 @@ return [
'app_name' => 'Назва програми', 'app_name' => 'Назва програми',
'app_name_desc' => 'Ця назва показується у заголовку та в усіх листах.', 'app_name_desc' => 'Ця назва показується у заголовку та в усіх листах.',
'app_name_header' => 'Показати назву програми в заголовку', 'app_name_header' => 'Показати назву програми в заголовку',
'app_public_access' => 'Публічнй доступ', 'app_public_access' => 'Публічний доступ',
'app_public_access_desc' => 'Увімкнення цієї опції дозволить відвідувачам, які не увійшли в систему, отримати доступ до вмісту у вашому екземплярі BookStack.', 'app_public_access_desc' => 'Увімкнення цієї опції дозволить відвідувачам, які не увійшли в систему, отримати доступ до вмісту у вашому екземплярі BookStack.',
'app_public_access_desc_guest' => 'Доступ для публічних відвідувачів можна контролювати через користувача "Гість".', 'app_public_access_desc_guest' => 'Доступ для публічних відвідувачів можна контролювати через користувача "Гість".',
'app_public_access_toggle' => 'Дозволити публічний доступ', 'app_public_access_toggle' => 'Дозволити публічний доступ',
@ -92,7 +92,7 @@ return [
'recycle_bin' => 'Кошик', 'recycle_bin' => 'Кошик',
'recycle_bin_desc' => 'Тут ви можете відновити видалені елементи, або назавжди видалити їх із системи. Цей список нефільтрований, на відміну від подібних списків активності в системі, де застосовуються фільтри дозволів.', 'recycle_bin_desc' => 'Тут ви можете відновити видалені елементи, або назавжди видалити їх із системи. Цей список нефільтрований, на відміну від подібних списків активності в системі, де застосовуються фільтри дозволів.',
'recycle_bin_deleted_item' => 'Виадлений елемент', 'recycle_bin_deleted_item' => 'Виадлений елемент',
'recycle_bin_deleted_parent' => 'Parent', 'recycle_bin_deleted_parent' => 'Батьківський',
'recycle_bin_deleted_by' => 'Ким видалено', 'recycle_bin_deleted_by' => 'Ким видалено',
'recycle_bin_deleted_at' => 'Час видалення', 'recycle_bin_deleted_at' => 'Час видалення',
'recycle_bin_permanently_delete' => 'Видалити остаточно', 'recycle_bin_permanently_delete' => 'Видалити остаточно',
@ -105,7 +105,7 @@ return [
'recycle_bin_restore_list' => 'Елементи для відновлення', 'recycle_bin_restore_list' => 'Елементи для відновлення',
'recycle_bin_restore_confirm' => 'Ця дія відновить видалений елемент у початкове місце, включаючи всі дочірні елементи. Якщо вихідне розташування відтоді було видалено, і знаходиться у кошику, батьківський елемент також потрібно буде відновити.', 'recycle_bin_restore_confirm' => 'Ця дія відновить видалений елемент у початкове місце, включаючи всі дочірні елементи. Якщо вихідне розташування відтоді було видалено, і знаходиться у кошику, батьківський елемент також потрібно буде відновити.',
'recycle_bin_restore_deleted_parent' => 'Батьківський елемент цього об\'єкта також був видалений. Вони залишатимуться видаленими, доки батьківський елемент також не буде відновлений.', 'recycle_bin_restore_deleted_parent' => 'Батьківський елемент цього об\'єкта також був видалений. Вони залишатимуться видаленими, доки батьківський елемент також не буде відновлений.',
'recycle_bin_restore_parent' => 'Restore Parent', 'recycle_bin_restore_parent' => 'Відновити батьківську',
'recycle_bin_destroy_notification' => 'Видалено :count елементів із кошика.', 'recycle_bin_destroy_notification' => 'Видалено :count елементів із кошика.',
'recycle_bin_restore_notification' => 'Відновлено :count елементів із кошика.', 'recycle_bin_restore_notification' => 'Відновлено :count елементів із кошика.',
@ -119,7 +119,7 @@ return [
'audit_table_user' => 'Користувач', 'audit_table_user' => 'Користувач',
'audit_table_event' => 'Подія', 'audit_table_event' => 'Подія',
'audit_table_related' => 'Пов’язаний елемент', 'audit_table_related' => 'Пов’язаний елемент',
'audit_table_ip' => 'IP Address', 'audit_table_ip' => 'IP-адреса',
'audit_table_date' => 'Дата активності', 'audit_table_date' => 'Дата активності',
'audit_date_from' => 'Діапазон дат від', 'audit_date_from' => 'Діапазон дат від',
'audit_date_to' => 'Діапазон дат до', 'audit_date_to' => 'Діапазон дат до',
@ -139,7 +139,7 @@ return [
'role_details' => 'Деталі ролі', 'role_details' => 'Деталі ролі',
'role_name' => 'Назва ролі', 'role_name' => 'Назва ролі',
'role_desc' => 'Короткий опис ролі', 'role_desc' => 'Короткий опис ролі',
'role_mfa_enforced' => 'Requires Multi-Factor Authentication', 'role_mfa_enforced' => 'Потрібна двофактова автентифікація',
'role_external_auth_id' => 'Зовнішні ID автентифікації', 'role_external_auth_id' => 'Зовнішні ID автентифікації',
'role_system' => 'Системні дозволи', 'role_system' => 'Системні дозволи',
'role_manage_users' => 'Керування користувачами', 'role_manage_users' => 'Керування користувачами',
@ -149,7 +149,7 @@ return [
'role_manage_page_templates' => 'Управління шаблонами сторінок', 'role_manage_page_templates' => 'Управління шаблонами сторінок',
'role_access_api' => 'Доступ до системного API', 'role_access_api' => 'Доступ до системного API',
'role_manage_settings' => 'Керування налаштуваннями програми', 'role_manage_settings' => 'Керування налаштуваннями програми',
'role_export_content' => 'Export content', 'role_export_content' => 'Вміст експорту',
'role_asset' => 'Дозволи', 'role_asset' => 'Дозволи',
'roles_system_warning' => 'Майте на увазі, що доступ до будь-якого з вищезазначених трьох дозволів може дозволити користувачеві змінювати власні привілеї або привілеї інших в системі. Ролі з цими дозволами призначайте лише довіреним користувачам.', 'roles_system_warning' => 'Майте на увазі, що доступ до будь-якого з вищезазначених трьох дозволів може дозволити користувачеві змінювати власні привілеї або привілеї інших в системі. Ролі з цими дозволами призначайте лише довіреним користувачам.',
'role_asset_desc' => 'Ці дозволи контролюють стандартні доступи всередині системи. Права на книги, розділи та сторінки перевизначать ці дозволи.', 'role_asset_desc' => 'Ці дозволи контролюють стандартні доступи всередині системи. Права на книги, розділи та сторінки перевизначать ці дозволи.',
@ -207,10 +207,10 @@ return [
'users_api_tokens_create' => 'Створити токен', 'users_api_tokens_create' => 'Створити токен',
'users_api_tokens_expires' => 'Закінчується', 'users_api_tokens_expires' => 'Закінчується',
'users_api_tokens_docs' => 'Документація API', 'users_api_tokens_docs' => 'Документація API',
'users_mfa' => 'Multi-Factor Authentication', 'users_mfa' => 'Багатофакторна Автентифікація',
'users_mfa_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.', 'users_mfa_desc' => 'Двофакторна аутентифікація додає ще один рівень безпеки для вашого облікового запису.',
'users_mfa_x_methods' => ':count method configured|:count methods configured', 'users_mfa_x_methods' => ':count метод налаштовано|:count методів налаштовано',
'users_mfa_configure' => 'Configure Methods', 'users_mfa_configure' => 'Налаштувати Методи',
// API Tokens // API Tokens
'user_api_token_create' => 'Створити токен API', 'user_api_token_create' => 'Створити токен API',

View File

@ -15,7 +15,7 @@ return [
'alpha_dash' => 'Поле :attribute має містити лише літери, цифри, дефіси та підкреслення.', 'alpha_dash' => 'Поле :attribute має містити лише літери, цифри, дефіси та підкреслення.',
'alpha_num' => 'Поле :attribute має містити лише літери та цифри.', 'alpha_num' => 'Поле :attribute має містити лише літери та цифри.',
'array' => 'Поле :attribute має бути масивом.', 'array' => 'Поле :attribute має бути масивом.',
'backup_codes' => 'The provided code is not valid or has already been used.', 'backup_codes' => 'Наданий код є недійсним або вже використаний.',
'before' => 'Поле :attribute має містити дату не пізніше :date.', 'before' => 'Поле :attribute має містити дату не пізніше :date.',
'between' => [ 'between' => [
'numeric' => 'Поле :attribute має бути між :min та :max.', 'numeric' => 'Поле :attribute має бути між :min та :max.',
@ -99,7 +99,7 @@ return [
], ],
'string' => 'Поле :attribute повинне містити текст.', 'string' => 'Поле :attribute повинне містити текст.',
'timezone' => 'Поле :attribute повинне містити коректну часову зону.', 'timezone' => 'Поле :attribute повинне містити коректну часову зону.',
'totp' => 'The provided code is not valid or has expired.', 'totp' => 'Наданий код не є дійсним або прострочений.',
'unique' => 'Вказане значення поля :attribute вже існує.', 'unique' => 'Вказане значення поля :attribute вже існує.',
'url' => 'Формат поля :attribute неправильний.', 'url' => 'Формат поля :attribute неправильний.',
'uploaded' => 'Не вдалося завантажити файл. Сервер може не приймати файли такого розміру.', 'uploaded' => 'Не вдалося завантажити файл. Сервер може не приймати файли такого розміру.',

View File

@ -96,12 +96,12 @@ return [
'mfa_gen_totp_verify_setup' => 'Xác nhận cài đặt', 'mfa_gen_totp_verify_setup' => 'Xác nhận cài đặt',
'mfa_gen_totp_verify_setup_desc' => 'Xác nhận rằng tất cả hoạt động bằng cách nhập vào một mã, được tạo ra bởi ứng dụng xác thực của bạn vào ô dưới đây:', 'mfa_gen_totp_verify_setup_desc' => 'Xác nhận rằng tất cả hoạt động bằng cách nhập vào một mã, được tạo ra bởi ứng dụng xác thực của bạn vào ô dưới đây:',
'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here', 'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here',
'mfa_verify_access' => 'Verify Access', 'mfa_verify_access' => 'Xác thực truy cập',
'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.', 'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
'mfa_verify_no_methods' => 'No Methods Configured', 'mfa_verify_no_methods' => 'Không có phương pháp nào được cấu hình',
'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.', 'mfa_verify_no_methods_desc' => 'Tài khoản của bạn chưa đăng ký xác thực nhiều lớp. Bạn cần thiết lập ít nhất một phương pháp trước khi yêu cầu truy cập.',
'mfa_verify_use_totp' => 'Verify using a mobile app', 'mfa_verify_use_totp' => 'Xác thực sử dụng mã di động',
'mfa_verify_use_backup_codes' => 'Verify using a backup code', 'mfa_verify_use_backup_codes' => 'Xác thực sử dụng mã backup',
'mfa_verify_backup_code' => 'Mã dự phòng', 'mfa_verify_backup_code' => 'Mã dự phòng',
'mfa_verify_backup_code_desc' => 'Nhập một trong các mã dự phòng còn lại của bạn vào ô phía dưới:', 'mfa_verify_backup_code_desc' => 'Nhập một trong các mã dự phòng còn lại của bạn vào ô phía dưới:',
'mfa_verify_backup_code_enter_here' => 'Nhập mã xác thực của bạn tại đây', 'mfa_verify_backup_code_enter_here' => 'Nhập mã xác thực của bạn tại đây',

View File

@ -12,17 +12,19 @@
<p>{{ trans('settings.users_delete_warning', ['userName' => $user->name]) }}</p> <p>{{ trans('settings.users_delete_warning', ['userName' => $user->name]) }}</p>
<hr class="my-l"> @if(userCan('users-manage'))
<hr class="my-l">
<div class="grid half gap-xl v-center"> <div class="grid half gap-xl v-center">
<div> <div>
<label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label> <label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label>
<p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p> <p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p>
</div>
<div>
@include('form.user-select', ['name' => 'new_owner_id', 'user' => null, 'compact' => false])
</div>
</div> </div>
<div> @endif
@include('form.user-select', ['name' => 'new_owner_id', 'user' => null, 'compact' => false])
</div>
</div>
<hr class="my-l"> <hr class="my-l">

View File

@ -36,6 +36,38 @@ class SearchApiTest extends TestCase
$resp->assertJsonFragment(['name' => $uniqueTerm, 'type' => 'bookshelf']); $resp->assertJsonFragment(['name' => $uniqueTerm, 'type' => 'bookshelf']);
} }
public function test_all_endpoint_returns_entity_url()
{
/** @var Page $page */
$page = Page::query()->first();
$page->update(['name' => 'name with superuniquevalue within']);
$page->indexForSearch();
$resp = $this->actingAsApiAdmin()->getJson($this->baseEndpoint . '?query=superuniquevalue');
$resp->assertJsonFragment([
'type' => 'page',
'url' => $page->getUrl(),
]);
}
public function test_all_endpoint_returns_items_with_preview_html()
{
/** @var Book $book */
$book = Book::query()->first();
$book->update(['name' => 'name with superuniquevalue within', 'description' => 'Description with superuniquevalue within']);
$book->indexForSearch();
$resp = $this->actingAsApiAdmin()->getJson($this->baseEndpoint . '?query=superuniquevalue');
$resp->assertJsonFragment([
'type' => 'book',
'url' => $book->getUrl(),
'preview_html' => [
'name' => 'name with <strong>superuniquevalue</strong> within',
'content' => 'Description with <strong>superuniquevalue</strong> within',
],
]);
}
public function test_all_endpoint_requires_query_parameter() public function test_all_endpoint_requires_query_parameter()
{ {
$resp = $this->actingAsApiEditor()->get($this->baseEndpoint); $resp = $this->actingAsApiEditor()->get($this->baseEndpoint);

View File

@ -130,6 +130,21 @@ class UserManagementTest extends TestCase
$resp->assertSee('new_owner_id'); $resp->assertSee('new_owner_id');
} }
public function test_migrate_option_hidden_if_user_cannot_manage_users()
{
$editor = $this->getEditor();
$resp = $this->asEditor()->get("settings/users/{$editor->id}/delete");
$resp->assertDontSee('Migrate Ownership');
$resp->assertDontSee('new_owner_id');
$this->giveUserPermissions($editor, ['users-manage']);
$resp = $this->asEditor()->get("settings/users/{$editor->id}/delete");
$resp->assertSee('Migrate Ownership');
$resp->assertSee('new_owner_id');
}
public function test_delete_with_new_owner_id_changes_ownership() public function test_delete_with_new_owner_id_changes_ownership()
{ {
$page = Page::query()->first(); $page = Page::query()->first();

View File

@ -0,0 +1,66 @@
<?php
namespace Tests\User;
use BookStack\Auth\User;
use Tests\TestCase;
class UserSearchTest extends TestCase
{
public function test_select_search_matches_by_name()
{
$viewer = $this->getViewer();
$admin = $this->getAdmin();
$resp = $this->actingAs($admin)->get('/search/users/select?search=' . urlencode($viewer->name));
$resp->assertOk();
$resp->assertSee($viewer->name);
$resp->assertDontSee($admin->name);
}
public function test_select_search_shows_first_by_name_without_search()
{
/** @var User $firstUser */
$firstUser = User::query()->orderBy('name', 'desc')->first();
$resp = $this->asAdmin()->get('/search/users/select');
$resp->assertOk();
$resp->assertSee($firstUser->name);
}
public function test_select_search_does_not_match_by_email()
{
$viewer = $this->getViewer();
$editor = $this->getEditor();
$resp = $this->actingAs($editor)->get('/search/users/select?search=' . urlencode($viewer->email));
$resp->assertDontSee($viewer->name);
}
public function test_select_requires_right_permission()
{
$permissions = ['users-manage', 'restrictions-manage-own', 'restrictions-manage-all'];
$user = $this->getViewer();
foreach ($permissions as $permission) {
$resp = $this->actingAs($user)->get('/search/users/select?search=a');
$this->assertPermissionError($resp);
$this->giveUserPermissions($user, [$permission]);
$resp = $this->actingAs($user)->get('/search/users/select?search=a');
$resp->assertOk();
$user->roles()->delete();
$user->clearPermissionCache();
}
}
public function test_select_requires_logged_in_user()
{
$this->setSettings(['app-public' => true]);
$defaultUser = User::getDefault();
$this->giveUserPermissions($defaultUser, ['users-manage']);
$resp = $this->get('/search/users/select?search=a');
$this->assertPermissionError($resp);
}
}