Merge branch 'master' into release
This commit is contained in:
		
						commit
						ba9cb591c8
					
				| 
						 | 
				
			
			@ -134,7 +134,7 @@ STORAGE_S3_ENDPOINT=https://my-custom-s3-compatible.service.com:8001
 | 
			
		|||
STORAGE_URL=false
 | 
			
		||||
 | 
			
		||||
# Authentication method to use
 | 
			
		||||
# Can be 'standard', 'ldap' or 'saml2'
 | 
			
		||||
# Can be 'standard', 'ldap', 'saml2' or 'oidc'
 | 
			
		||||
AUTH_METHOD=standard
 | 
			
		||||
 | 
			
		||||
# Social authentication configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -242,6 +242,7 @@ SAML2_GROUP_ATTRIBUTE=group
 | 
			
		|||
SAML2_REMOVE_FROM_GROUPS=false
 | 
			
		||||
 | 
			
		||||
# OpenID Connect authentication configuration
 | 
			
		||||
# Refer to https://www.bookstackapp.com/docs/admin/oidc-auth/
 | 
			
		||||
OIDC_NAME=SSO
 | 
			
		||||
OIDC_DISPLAY_NAME_CLAIMS=name
 | 
			
		||||
OIDC_CLIENT_ID=null
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -200,3 +200,9 @@ sulfo :: Danish
 | 
			
		|||
Raukze :: German
 | 
			
		||||
zygimantus :: Lithuanian
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ jobs:
 | 
			
		|||
 | 
			
		||||
    - name: Start Database
 | 
			
		||||
      run: |
 | 
			
		||||
        sudo /etc/init.d/mysql start
 | 
			
		||||
        sudo systemctl start mysql
 | 
			
		||||
 | 
			
		||||
    - name: Setup Database
 | 
			
		||||
      run: |
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - name: Start MySQL
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo /etc/init.d/mysql start
 | 
			
		||||
          sudo systemctl start mysql
 | 
			
		||||
 | 
			
		||||
      - name: Create database & user
 | 
			
		||||
        run: |
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,13 +63,16 @@ class UserRepo
 | 
			
		|||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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
 | 
			
		||||
    {
 | 
			
		||||
        $sort = $sortData['sort'];
 | 
			
		||||
 | 
			
		||||
        $query = User::query()->select(['*'])
 | 
			
		||||
            ->withLastActivityAt()
 | 
			
		||||
            ->scopes(['withLastActivityAt'])
 | 
			
		||||
            ->with(['roles', 'avatar'])
 | 
			
		||||
            ->withCount('mfaValues')
 | 
			
		||||
            ->orderBy($sort, $sortData['order']);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,12 +4,14 @@ namespace BookStack\Http\Controllers\Api;
 | 
			
		|||
 | 
			
		||||
use BookStack\Entities\Models\Entity;
 | 
			
		||||
use BookStack\Entities\Tools\SearchOptions;
 | 
			
		||||
use BookStack\Entities\Tools\SearchResultsFormatter;
 | 
			
		||||
use BookStack\Entities\Tools\SearchRunner;
 | 
			
		||||
use Illuminate\Http\Request;
 | 
			
		||||
 | 
			
		||||
class SearchApiController extends ApiController
 | 
			
		||||
{
 | 
			
		||||
    protected $searchRunner;
 | 
			
		||||
    protected $resultsFormatter;
 | 
			
		||||
 | 
			
		||||
    protected $rules = [
 | 
			
		||||
        '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->resultsFormatter = $resultsFormatter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +48,7 @@ class SearchApiController extends ApiController
 | 
			
		|||
        $count = min(intval($request->get('count', '0')) ?: 20, 100);
 | 
			
		||||
 | 
			
		||||
        $results = $this->searchRunner->searchEntities($options, 'all', $page, $count);
 | 
			
		||||
        $this->resultsFormatter->format($results['results']->all(), $options);
 | 
			
		||||
 | 
			
		||||
        /** @var Entity $result */
 | 
			
		||||
        foreach ($results['results'] as $result) {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +56,14 @@ class SearchApiController extends ApiController
 | 
			
		|||
                'id', 'name', 'slug', 'book_id',
 | 
			
		||||
                'chapter_id', 'draft', 'template',
 | 
			
		||||
                'created_at', 'updated_at',
 | 
			
		||||
                'tags', 'type',
 | 
			
		||||
                'tags', 'type', 'preview_html', 'url',
 | 
			
		||||
            ]);
 | 
			
		||||
            $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([
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@
 | 
			
		|||
namespace BookStack\Http\Controllers;
 | 
			
		||||
 | 
			
		||||
use BookStack\Auth\User;
 | 
			
		||||
use Illuminate\Database\Eloquent\Builder;
 | 
			
		||||
use Illuminate\Http\Request;
 | 
			
		||||
 | 
			
		||||
class UserSearchController extends Controller
 | 
			
		||||
| 
						 | 
				
			
			@ -14,19 +13,27 @@ class UserSearchController extends Controller
 | 
			
		|||
     */
 | 
			
		||||
    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', '');
 | 
			
		||||
        $query = User::query()->orderBy('name', 'desc')
 | 
			
		||||
        $query = User::query()
 | 
			
		||||
            ->orderBy('name', 'asc')
 | 
			
		||||
            ->take(20);
 | 
			
		||||
 | 
			
		||||
        if (!empty($search)) {
 | 
			
		||||
            $query->where(function (Builder $query) use ($search) {
 | 
			
		||||
                $query->where('email', 'like', '%' . $search . '%')
 | 
			
		||||
                    ->orWhere('name', 'like', '%' . $search . '%');
 | 
			
		||||
            });
 | 
			
		||||
            $query->where('name', 'like', '%' . $search . '%');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $users = $query->get();
 | 
			
		||||
 | 
			
		||||
        return view('form.user-select-list', compact('users'));
 | 
			
		||||
        return view('form.user-select-list', [
 | 
			
		||||
            'users' => $query->get(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -8,6 +8,11 @@
 | 
			
		|||
      "created_at": "2021-11-14T15:57:35.000000Z",
 | 
			
		||||
      "updated_at": "2021-11-14T15:57:35.000000Z",
 | 
			
		||||
      "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": []
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +26,11 @@
 | 
			
		|||
      "created_at": "2021-05-15T16:28:10.000000Z",
 | 
			
		||||
      "updated_at": "2021-11-14T15:56:49.000000Z",
 | 
			
		||||
      "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": [
 | 
			
		||||
        {
 | 
			
		||||
          "name": "Animal",
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +55,11 @@
 | 
			
		|||
      "created_at": "2020-11-29T21:55:07.000000Z",
 | 
			
		||||
      "updated_at": "2021-11-14T16:02:39.000000Z",
 | 
			
		||||
      "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": []
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_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_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_not_confirmed' => 'Dirección de correo electrónico no confirmada',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -260,7 +260,7 @@ return [
 | 
			
		|||
    'tags_remove' => 'Eliminar esta etiqueta',
 | 
			
		||||
    'tags_usages' => 'Uso total de etiquetas',
 | 
			
		||||
    '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_shelves' => 'Asignadas a estantes',
 | 
			
		||||
    'tags_x_unique_values' => ':count valores únicos',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_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',
 | 
			
		||||
    '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_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',
 | 
			
		||||
    'social_no_action_defined' => 'Acción no definida',
 | 
			
		||||
    'social_login_bad_response' => "SE recibió un Error durante el acceso con :socialAccount : \n:error",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,8 +45,8 @@ return [
 | 
			
		|||
    'unfavourite' => 'お気に入りから削除',
 | 
			
		||||
    'next' => '次へ',
 | 
			
		||||
    'previous' => '前へ',
 | 
			
		||||
    'filter_active' => 'Active Filter:',
 | 
			
		||||
    'filter_clear' => 'Clear Filter',
 | 
			
		||||
    'filter_active' => '有効なフィルター:',
 | 
			
		||||
    'filter_clear' => 'フィルターを解除',
 | 
			
		||||
 | 
			
		||||
    // Sort Options
 | 
			
		||||
    'sort_options' => '並べ替えオプション',
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ return [
 | 
			
		|||
    'no_activity' => '表示するアクティビティがありません',
 | 
			
		||||
    'no_items' => 'アイテムはありません',
 | 
			
		||||
    'back_to_top' => '上に戻る',
 | 
			
		||||
    'skip_to_main_content' => 'Skip to main content',
 | 
			
		||||
    'skip_to_main_content' => 'メインコンテンツへスキップ',
 | 
			
		||||
    'toggle_details' => '概要の表示切替',
 | 
			
		||||
    'toggle_thumbnails' => 'Toggle Thumbnails',
 | 
			
		||||
    'details' => '詳細',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,35 +75,35 @@ return [
 | 
			
		|||
    // Shelves
 | 
			
		||||
    'shelf' => '本棚',
 | 
			
		||||
    'shelves' => '本棚',
 | 
			
		||||
    'x_shelves' => ':count Shelf|:count Shelves',
 | 
			
		||||
    'x_shelves' => ':count 本棚|:count 本棚',
 | 
			
		||||
    'shelves_long' => '本棚',
 | 
			
		||||
    'shelves_empty' => 'No shelves have been created',
 | 
			
		||||
    'shelves_empty' => '本棚が作成されていません',
 | 
			
		||||
    'shelves_create' => '新しい本棚を作成',
 | 
			
		||||
    'shelves_popular' => '人気の本棚',
 | 
			
		||||
    'shelves_new' => '新しい本棚',
 | 
			
		||||
    'shelves_new_action' => '新しい本棚',
 | 
			
		||||
    'shelves_popular_empty' => 'The most popular shelves will appear here.',
 | 
			
		||||
    'shelves_new_empty' => 'The most recently created shelves will appear here.',
 | 
			
		||||
    'shelves_popular_empty' => 'ここに人気の本棚が表示されます。',
 | 
			
		||||
    'shelves_new_empty' => '最近作成された本棚がここに表示されます。',
 | 
			
		||||
    'shelves_save' => '本棚を保存',
 | 
			
		||||
    'shelves_books' => 'この本棚のブック',
 | 
			
		||||
    'shelves_add_books' => 'この本棚にブックを追加',
 | 
			
		||||
    'shelves_drag_books' => 'ブックをここにドラッグすると本棚に追加されます',
 | 
			
		||||
    'shelves_empty_contents' => 'This shelf has no books assigned to it',
 | 
			
		||||
    'shelves_edit_and_assign' => 'Edit shelf to assign books',
 | 
			
		||||
    'shelves_empty_contents' => 'この本棚にはブックが割り当てられていません。',
 | 
			
		||||
    'shelves_edit_and_assign' => '本棚を編集してブックを割り当てる',
 | 
			
		||||
    'shelves_edit_named' => '本棚「:name」を編集',
 | 
			
		||||
    'shelves_edit' => '本棚を編集',
 | 
			
		||||
    'shelves_delete' => '本棚を削除',
 | 
			
		||||
    'shelves_delete_named' => '本棚「:name」を削除',
 | 
			
		||||
    'shelves_delete_explain' => "これにより、この本棚「:name」が削除されます。含まれているブックは削除されません。",
 | 
			
		||||
    'shelves_delete_confirmation' => '本当にこの本棚を削除してよろしいですか?',
 | 
			
		||||
    'shelves_permissions' => 'Bookshelf Permissions',
 | 
			
		||||
    'shelves_permissions_updated' => 'Bookshelf Permissions Updated',
 | 
			
		||||
    'shelves_permissions_active' => 'Bookshelf 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_copy_permissions_to_books' => 'Copy Permissions to Books',
 | 
			
		||||
    'shelves_copy_permissions' => '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_permission_success' => 'Bookshelf permissions copied to :count books',
 | 
			
		||||
    'shelves_permissions' => '本棚の権限',
 | 
			
		||||
    'shelves_permissions_updated' => '本棚の権限を更新しました',
 | 
			
		||||
    'shelves_permissions_active' => '本棚の権限は有効です',
 | 
			
		||||
    'shelves_permissions_cascade_warning' => '本棚の権限は含まれる本には自動的に継承されません。これは、1つのブックが複数の本棚に存在する可能性があるためです。ただし、以下のオプションを使用すると権限を子ブックにコピーできます。',
 | 
			
		||||
    'shelves_copy_permissions_to_books' => 'ブックに権限をコピー',
 | 
			
		||||
    'shelves_copy_permissions' => '権限をコピー',
 | 
			
		||||
    'shelves_copy_permissions_explain' => 'これにより、この本棚の現在の権限設定を本棚に含まれるすべてのブックに適用します。有効にする前に、この本棚の権限への変更が保存されていることを確認してください。',
 | 
			
		||||
    'shelves_copy_permission_success' => '本棚の権限が:count個のブックにコピーされました',
 | 
			
		||||
 | 
			
		||||
    // Books
 | 
			
		||||
    'book' => 'ブック',
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +115,7 @@ return [
 | 
			
		|||
    'books_new' => '新しいブック',
 | 
			
		||||
    'books_new_action' => '新しいブック',
 | 
			
		||||
    'books_popular_empty' => 'ここに人気のブックが表示されます。',
 | 
			
		||||
    'books_new_empty' => 'The most recently created books will appear here.',
 | 
			
		||||
    'books_new_empty' => '最近作成されたブックがここに表示されます。',
 | 
			
		||||
    'books_create' => '新しいブックを作成',
 | 
			
		||||
    'books_delete' => 'ブックを削除',
 | 
			
		||||
    'books_delete_named' => 'ブック「:bookName」を削除',
 | 
			
		||||
| 
						 | 
				
			
			@ -153,7 +153,7 @@ return [
 | 
			
		|||
    'chapters_create' => 'チャプターを作成',
 | 
			
		||||
    'chapters_delete' => 'チャプターを削除',
 | 
			
		||||
    'chapters_delete_named' => 'チャプター「:chapterName」を削除',
 | 
			
		||||
    'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.',
 | 
			
		||||
    'chapters_delete_explain' => 'これにより、チャプター「:chapterName」が削除されます。このチャプターに存在するページもすべて削除されます。',
 | 
			
		||||
    'chapters_delete_confirm' => 'チャプターを削除してよろしいですか?',
 | 
			
		||||
    'chapters_edit' => 'チャプターを編集',
 | 
			
		||||
    'chapters_edit_named' => 'チャプター「:chapterName」を編集',
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ return [
 | 
			
		|||
    'pages_initial_name' => '新規ページ',
 | 
			
		||||
    'pages_editing_draft_notification' => ':timeDiffに保存された下書きを編集しています。',
 | 
			
		||||
    'pages_draft_edited_notification' => 'このページは更新されています。下書きを破棄することを推奨します。',
 | 
			
		||||
    'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.',
 | 
			
		||||
    'pages_draft_page_changed_since_creation' => 'この下書きが作成されてから、このページが更新されました。この下書きを破棄するか、ページの変更を上書きしないように注意することを推奨します。',
 | 
			
		||||
    'pages_draft_edit_active' => [
 | 
			
		||||
        'start_a' => ':count人のユーザがページの編集を開始しました',
 | 
			
		||||
        'start_b' => ':userNameがページの編集を開始しました',
 | 
			
		||||
| 
						 | 
				
			
			@ -244,7 +244,7 @@ return [
 | 
			
		|||
    ],
 | 
			
		||||
    'pages_draft_discarded' => '下書きが破棄されました。エディタは現在の内容へ復元されています。',
 | 
			
		||||
    'pages_specific' => '特定のページ',
 | 
			
		||||
    'pages_is_template' => 'Page Template',
 | 
			
		||||
    'pages_is_template' => 'ページテンプレート',
 | 
			
		||||
 | 
			
		||||
    // Editor Sidebar
 | 
			
		||||
    'page_tags' => 'タグ',
 | 
			
		||||
| 
						 | 
				
			
			@ -258,16 +258,16 @@ return [
 | 
			
		|||
    'tags_explain' => "タグを設定すると、コンテンツの管理が容易になります。\nより高度な管理をしたい場合、タグに内容を設定できます。",
 | 
			
		||||
    'tags_add' => 'タグを追加',
 | 
			
		||||
    'tags_remove' => 'このタグを削除',
 | 
			
		||||
    'tags_usages' => 'Total tag usages',
 | 
			
		||||
    'tags_assigned_pages' => 'Assigned to Pages',
 | 
			
		||||
    'tags_assigned_chapters' => 'Assigned to Chapters',
 | 
			
		||||
    'tags_assigned_books' => 'Assigned to Books',
 | 
			
		||||
    'tags_assigned_shelves' => 'Assigned to Shelves',
 | 
			
		||||
    'tags_x_unique_values' => ':count unique values',
 | 
			
		||||
    'tags_all_values' => 'All values',
 | 
			
		||||
    'tags_view_tags' => 'View Tags',
 | 
			
		||||
    'tags_view_existing_tags' => 'View existing tags',
 | 
			
		||||
    'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
 | 
			
		||||
    'tags_usages' => 'タグの総使用回数',
 | 
			
		||||
    'tags_assigned_pages' => '割り当てられているページの数',
 | 
			
		||||
    'tags_assigned_chapters' => '割り当てられているチャプターの数',
 | 
			
		||||
    'tags_assigned_books' => '割り当てられているブックの数',
 | 
			
		||||
    'tags_assigned_shelves' => '割り当てられている本棚の数',
 | 
			
		||||
    'tags_x_unique_values' => ':count個のユニークな値',
 | 
			
		||||
    'tags_all_values' => '全ての値',
 | 
			
		||||
    'tags_view_tags' => 'タグを表示',
 | 
			
		||||
    'tags_view_existing_tags' => '既存のタグを表示',
 | 
			
		||||
    'tags_list_empty_hint' => 'タグはページエディタのサイドバーまたはブック、チャプター、本棚の詳細を編集しているときに割り当てることができます。',
 | 
			
		||||
    'attachments' => '添付ファイル',
 | 
			
		||||
    'attachments_explain' => 'ファイルをアップロードまたはリンクを添付することができます。これらはサイドバーで確認できます。',
 | 
			
		||||
    'attachments_explain_instant_save' => 'この変更は即座に保存されます。',
 | 
			
		||||
| 
						 | 
				
			
			@ -275,7 +275,7 @@ return [
 | 
			
		|||
    'attachments_upload' => 'アップロード',
 | 
			
		||||
    'attachments_link' => 'リンクを添付',
 | 
			
		||||
    'attachments_set_link' => 'リンクを設定',
 | 
			
		||||
    'attachments_delete' => 'Are you sure you want to delete this attachment?',
 | 
			
		||||
    'attachments_delete' => 'この添付ファイルを削除してよろしいですか?',
 | 
			
		||||
    'attachments_dropzone' => 'ファイルをドロップするか、クリックして選択',
 | 
			
		||||
    'attachments_no_files' => 'ファイルはアップロードされていません',
 | 
			
		||||
    'attachments_explain_link' => 'ファイルをアップロードしたくない場合、他のページやクラウド上のファイルへのリンクを添付できます。',
 | 
			
		||||
| 
						 | 
				
			
			@ -284,7 +284,7 @@ return [
 | 
			
		|||
    'attachments_link_url' => 'ファイルURL',
 | 
			
		||||
    'attachments_link_url_hint' => 'WebサイトまたはファイルへのURL',
 | 
			
		||||
    'attach' => '添付',
 | 
			
		||||
    'attachments_insert_link' => 'Add Attachment Link to Page',
 | 
			
		||||
    'attachments_insert_link' => '添付ファイルへのリンクをページに追加',
 | 
			
		||||
    'attachments_edit_file' => 'ファイルを編集',
 | 
			
		||||
    'attachments_edit_file_name' => 'ファイル名',
 | 
			
		||||
    'attachments_edit_drop_upload' => 'ファイルをドロップするか、クリックしてアップロード',
 | 
			
		||||
| 
						 | 
				
			
			@ -294,12 +294,12 @@ return [
 | 
			
		|||
    'attachments_file_uploaded' => 'ファイルがアップロードされました',
 | 
			
		||||
    'attachments_file_updated' => 'ファイルが更新されました',
 | 
			
		||||
    'attachments_link_attached' => 'リンクがページへ添付されました',
 | 
			
		||||
    'templates' => 'Templates',
 | 
			
		||||
    'templates_set_as_template' => 'Page is a template',
 | 
			
		||||
    'templates_explain_set_as_template' => 'You can set this page as a template so its contents be utilized when creating other pages. Other users will be able to use this template if they have view permissions for this page.',
 | 
			
		||||
    'templates_replace_content' => 'Replace page content',
 | 
			
		||||
    'templates_append_content' => 'Append to page content',
 | 
			
		||||
    'templates_prepend_content' => 'Prepend to page content',
 | 
			
		||||
    'templates' => 'テンプレート',
 | 
			
		||||
    'templates_set_as_template' => 'テンプレートに設定',
 | 
			
		||||
    'templates_explain_set_as_template' => 'このページをテンプレートとして設定すると、他のページを作成する際にこの内容を利用することができます。他のユーザーは、このページの表示権限を持っていればこのテンプレートを使用できます。',
 | 
			
		||||
    'templates_replace_content' => 'ページの内容を置換',
 | 
			
		||||
    'templates_append_content' => 'ページの末尾に追加',
 | 
			
		||||
    'templates_prepend_content' => 'ページの先頭に追加',
 | 
			
		||||
 | 
			
		||||
    // Profile View
 | 
			
		||||
    'profile_user_for_x' => ':time前に作成',
 | 
			
		||||
| 
						 | 
				
			
			@ -307,7 +307,7 @@ return [
 | 
			
		|||
    'profile_not_created_pages' => ':userNameはページを作成していません',
 | 
			
		||||
    'profile_not_created_chapters' => ':userNameはチャプターを作成していません',
 | 
			
		||||
    'profile_not_created_books' => ':userNameはブックを作成していません',
 | 
			
		||||
    'profile_not_created_shelves' => ':userName has not created any shelves',
 | 
			
		||||
    'profile_not_created_shelves' => ':userNameは本棚を作成していません',
 | 
			
		||||
 | 
			
		||||
    // Comments
 | 
			
		||||
    'comment' => 'コメント',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ return [
 | 
			
		|||
    'name' => 'Navn',
 | 
			
		||||
    'description' => 'Beskrivelse',
 | 
			
		||||
    'role' => 'Rolle',
 | 
			
		||||
    'cover_image' => 'Bokomslag',
 | 
			
		||||
    'cover_image' => 'Forside',
 | 
			
		||||
    'cover_image_description' => 'Bildet bør være ca. 440x250px.',
 | 
			
		||||
 | 
			
		||||
    // Actions
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ return [
 | 
			
		|||
    'images' => 'Bilder',
 | 
			
		||||
    'my_recent_drafts' => 'Mine nylige utkast',
 | 
			
		||||
    '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',
 | 
			
		||||
    'no_pages_viewed' => 'Du har ikke sett på noen sider',
 | 
			
		||||
    'no_pages_recently_created' => 'Ingen sider har nylig blitt opprettet',
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +99,7 @@ return [
 | 
			
		|||
    'shelves_permissions' => 'Tilganger til hylla',
 | 
			
		||||
    'shelves_permissions_updated' => 'Hyllas tilganger er oppdatert',
 | 
			
		||||
    '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' => '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.',
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ return [
 | 
			
		|||
    'pages_initial_name' => 'Ny side',
 | 
			
		||||
    '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_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' => [
 | 
			
		||||
        'start_a' => ':count forfattere har begynt å endre denne siden.',
 | 
			
		||||
        'start_b' => ':userName skriver på siden for øyeblikket',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,11 +6,11 @@
 | 
			
		|||
 */
 | 
			
		||||
return [
 | 
			
		||||
 | 
			
		||||
    'failed' => 'As credenciais fornecidas não correspondem aos nossos registos.',
 | 
			
		||||
    'throttle' => 'Demasiadas tentativas de início de sessão. Por favor, tente novamente em :seconds segundos.',
 | 
			
		||||
    'failed' => 'Estas credenciais não coincidem com os nossos registos.',
 | 
			
		||||
    'throttle' => 'Demasiadas tentativas de acesso. Tente novamente em :seconds segundos.',
 | 
			
		||||
 | 
			
		||||
    // Login & Register
 | 
			
		||||
    'sign_up' => 'Criar conta',
 | 
			
		||||
    'sign_up' => 'Registar',
 | 
			
		||||
    'log_in' => 'Iniciar sessão',
 | 
			
		||||
    'log_in_with' => 'Iniciar sessão 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_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_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_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_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_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
 | 
			
		||||
    'mfa_setup' => 'Configurar autenticação de múltiplos fatores',
 | 
			
		||||
| 
						 | 
				
			
			@ -80,31 +80,31 @@ return [
 | 
			
		|||
    '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_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_option_totp_title' => 'Mobile App',
 | 
			
		||||
    'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
 | 
			
		||||
    'mfa_option_backup_codes_title' => 'Backup Codes',
 | 
			
		||||
    'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
 | 
			
		||||
    'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
 | 
			
		||||
    'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
 | 
			
		||||
    'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.',
 | 
			
		||||
    'mfa_gen_backup_codes_download' => 'Download Codes',
 | 
			
		||||
    'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once',
 | 
			
		||||
    'mfa_gen_totp_title' => 'Mobile App Setup',
 | 
			
		||||
    'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
 | 
			
		||||
    'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.',
 | 
			
		||||
    'mfa_gen_totp_verify_setup' => 'Verify Setup',
 | 
			
		||||
    'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:',
 | 
			
		||||
    'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here',
 | 
			
		||||
    'mfa_verify_access' => 'Verify Access',
 | 
			
		||||
    'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
 | 
			
		||||
    'mfa_verify_no_methods' => 'No Methods Configured',
 | 
			
		||||
    'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
 | 
			
		||||
    'mfa_verify_use_totp' => 'Verify using a mobile app',
 | 
			
		||||
    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
 | 
			
		||||
    'mfa_verify_backup_code' => 'Backup Code',
 | 
			
		||||
    'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
 | 
			
		||||
    'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
 | 
			
		||||
    'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
 | 
			
		||||
    'mfa_setup_login_notification' => 'Multi-factor method configured, Please now login again using the configured method.',
 | 
			
		||||
    'mfa_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' => 'Aplicação móvel',
 | 
			
		||||
    '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' => 'Códigos de Backup',
 | 
			
		||||
    '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' => 'Confirmar e ativar',
 | 
			
		||||
    'mfa_gen_backup_codes_title' => 'Configuração dos Códigos de Backup',
 | 
			
		||||
    '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' => 'Transferir códigos',
 | 
			
		||||
    'mfa_gen_backup_codes_usage_warning' => 'Cada código só pode ser usado uma vez',
 | 
			
		||||
    'mfa_gen_totp_title' => 'Configuração de aplicativo móvel',
 | 
			
		||||
    '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' => 'Leia o código QR abaixo usando seu aplicativo de autenticação preferido para começar.',
 | 
			
		||||
    'mfa_gen_totp_verify_setup' => 'Verificar configuração',
 | 
			
		||||
    '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' => 'Forneça o código gerado pelo aplicativo aqui',
 | 
			
		||||
    'mfa_verify_access' => 'Verificar Acesso',
 | 
			
		||||
    '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' => 'Nenhum método configurado',
 | 
			
		||||
    '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' => 'Verificar usando um aplicativo móvel',
 | 
			
		||||
    'mfa_verify_use_backup_codes' => 'Verificar usando código de backup',
 | 
			
		||||
    'mfa_verify_backup_code' => 'Código de backup',
 | 
			
		||||
    'mfa_verify_backup_code_desc' => 'Insira um dos seus códigos de backup restantes abaixo:',
 | 
			
		||||
    'mfa_verify_backup_code_enter_here' => 'Insira o código de backup aqui',
 | 
			
		||||
    'mfa_verify_totp_desc' => 'Digite o código, gerado através do seu aplicativo móvel, abaixo:',
 | 
			
		||||
    'mfa_setup_login_notification' => 'Método de multi-fatores configurado, por favor faça login novamente usando o método configurado.',
 | 
			
		||||
];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,8 +45,8 @@ return [
 | 
			
		|||
    'unfavourite' => 'Retirar Favorito',
 | 
			
		||||
    'next' => 'Próximo',
 | 
			
		||||
    'previous' => 'Anterior',
 | 
			
		||||
    'filter_active' => 'Active Filter:',
 | 
			
		||||
    'filter_clear' => 'Clear Filter',
 | 
			
		||||
    'filter_active' => 'Filtro Ativo:',
 | 
			
		||||
    'filter_clear' => 'Limpar Filtro',
 | 
			
		||||
 | 
			
		||||
    // Sort Options
 | 
			
		||||
    'sort_options' => 'Opções de Ordenação',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_add' => 'Adicionar outra etiqueta',
 | 
			
		||||
    'tags_remove' => 'Remover esta etiqueta',
 | 
			
		||||
    'tags_usages' => 'Total tag usages',
 | 
			
		||||
    'tags_assigned_pages' => 'Assigned to Pages',
 | 
			
		||||
    'tags_assigned_chapters' => 'Assigned to Chapters',
 | 
			
		||||
    'tags_assigned_books' => 'Assigned to Books',
 | 
			
		||||
    'tags_assigned_shelves' => 'Assigned to Shelves',
 | 
			
		||||
    'tags_x_unique_values' => ':count unique values',
 | 
			
		||||
    'tags_all_values' => 'All values',
 | 
			
		||||
    'tags_view_tags' => 'View Tags',
 | 
			
		||||
    'tags_view_existing_tags' => 'View existing tags',
 | 
			
		||||
    'tags_usages' => 'Total de marcadores usados',
 | 
			
		||||
    'tags_assigned_pages' => 'Atribuído às páginas',
 | 
			
		||||
    'tags_assigned_chapters' => 'Atribuído aos Capítulos',
 | 
			
		||||
    'tags_assigned_books' => 'Atribuído a Livros',
 | 
			
		||||
    'tags_assigned_shelves' => 'Atribuído a Prateleiras',
 | 
			
		||||
    'tags_x_unique_values' => ':count valores únicos',
 | 
			
		||||
    'tags_all_values' => 'Todos os valores',
 | 
			
		||||
    'tags_view_tags' => 'Ver Marcadores',
 | 
			
		||||
    '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.',
 | 
			
		||||
    '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.',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ return [
 | 
			
		|||
    'email_confirm_text' => 'Будь ласка, підтвердьте свою адресу електронної пошти, натиснувши кнопку нижче:',
 | 
			
		||||
    'email_confirm_action' => 'Підтвердити Email',
 | 
			
		||||
    'email_confirm_send_error' => 'Необхідно підтвердження електронною поштою, але система не змогла надіслати електронний лист. Зверніться до адміністратора, щоб правильно налаштувати електронну пошту.',
 | 
			
		||||
    'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.',
 | 
			
		||||
    'email_confirm_success' => 'Ваша адреса електронної пошти була підтверджена! Тепер ви можете увійти в систему, використовуючи цю адресу електронної пошти.',
 | 
			
		||||
    'email_confirm_resent' => 'Лист з підтвердженням надіслано, перевірте свою пошту.',
 | 
			
		||||
 | 
			
		||||
    'email_not_confirmed' => 'Адресу електронної скриньки не підтверджено',
 | 
			
		||||
| 
						 | 
				
			
			@ -71,40 +71,40 @@ return [
 | 
			
		|||
    'user_invite_page_welcome' => 'Ласкаво просимо до :appName!',
 | 
			
		||||
    'user_invite_page_text' => 'Для завершення процесу створення облікового запису та отримання доступу вам потрібно задати пароль, який буде використовуватися для входу в :appName в майбутньому.',
 | 
			
		||||
    'user_invite_page_confirm_button' => 'Підтвердити пароль',
 | 
			
		||||
    'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!',
 | 
			
		||||
    'user_invite_success_login' => 'Пароль встановлено, ви повинні увійти в систему, використовуючи свій встановлений пароль для доступу :appNam!',
 | 
			
		||||
 | 
			
		||||
    // Multi-factor Authentication
 | 
			
		||||
    'mfa_setup' => 'Setup Multi-Factor Authentication',
 | 
			
		||||
    'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
 | 
			
		||||
    'mfa_setup_configured' => 'Already configured',
 | 
			
		||||
    'mfa_setup_reconfigure' => 'Reconfigure',
 | 
			
		||||
    'mfa_setup_remove_confirmation' => 'Are you sure you want to remove this multi-factor authentication method?',
 | 
			
		||||
    'mfa_setup_action' => 'Setup',
 | 
			
		||||
    'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.',
 | 
			
		||||
    'mfa_option_totp_title' => 'Mobile App',
 | 
			
		||||
    'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
 | 
			
		||||
    'mfa_option_backup_codes_title' => 'Backup Codes',
 | 
			
		||||
    'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
 | 
			
		||||
    'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
 | 
			
		||||
    'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
 | 
			
		||||
    'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.',
 | 
			
		||||
    'mfa_gen_backup_codes_download' => 'Download Codes',
 | 
			
		||||
    'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once',
 | 
			
		||||
    'mfa_gen_totp_title' => 'Mobile App Setup',
 | 
			
		||||
    'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
 | 
			
		||||
    'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.',
 | 
			
		||||
    'mfa_gen_totp_verify_setup' => 'Verify Setup',
 | 
			
		||||
    'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:',
 | 
			
		||||
    'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here',
 | 
			
		||||
    'mfa_verify_access' => 'Verify Access',
 | 
			
		||||
    'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
 | 
			
		||||
    'mfa_verify_no_methods' => 'No Methods Configured',
 | 
			
		||||
    'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
 | 
			
		||||
    'mfa_verify_use_totp' => 'Verify using a mobile app',
 | 
			
		||||
    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
 | 
			
		||||
    'mfa_verify_backup_code' => 'Backup Code',
 | 
			
		||||
    'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
 | 
			
		||||
    'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
 | 
			
		||||
    'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
 | 
			
		||||
    'mfa_setup_login_notification' => 'Multi-factor method configured, Please now login again using the configured method.',
 | 
			
		||||
    'mfa_setup' => 'Налаштувати двофакторну автентифікацію',
 | 
			
		||||
    'mfa_setup_desc' => 'Двофакторна аутентифікація додає ще один рівень безпеки для вашого облікового запису.',
 | 
			
		||||
    'mfa_setup_configured' => 'Вже налаштовано',
 | 
			
		||||
    'mfa_setup_reconfigure' => 'Переналаштувати',
 | 
			
		||||
    'mfa_setup_remove_confirmation' => 'Ви впевнені, що хочете видалити цей метод багатофакторної автентифікації?',
 | 
			
		||||
    'mfa_setup_action' => 'Встановлення',
 | 
			
		||||
    'mfa_backup_codes_usage_limit_warning' => 'Залишилося менше 5 резервних кодів, Будь ласка, створіть та збережіть новий набір до того, як у вас не вистачає кодів, щоб запобігти блокуванню вашої обліковки.',
 | 
			
		||||
    'mfa_option_totp_title' => 'Мобільний додаток',
 | 
			
		||||
    'mfa_option_totp_desc' => 'Для використання багатофакторної автентифікації вам потрібен мобільний додаток, який підтримує TOTP такі як Google Authenticator, Authy або Microsoft Authenticator.',
 | 
			
		||||
    'mfa_option_backup_codes_title' => 'Резервні коди',
 | 
			
		||||
    'mfa_option_backup_codes_desc' => 'Безпечно зберігайте набір резервних кодів з використанням одноразового використання, які можна увійти, щоб підтвердити свою особу.',
 | 
			
		||||
    'mfa_gen_confirm_and_enable' => 'Підтвердити та увімкнути',
 | 
			
		||||
    'mfa_gen_backup_codes_title' => 'Налаштування резервних кодів',
 | 
			
		||||
    'mfa_gen_backup_codes_desc' => 'Зберігайте список кодів в безпечному місці. Для доступу до системи ви зможете використовувати один з кодів як другий механізм аутентифікації.',
 | 
			
		||||
    'mfa_gen_backup_codes_download' => 'Завантажити коди',
 | 
			
		||||
    'mfa_gen_backup_codes_usage_warning' => 'Кожний код можна використати лише один раз',
 | 
			
		||||
    'mfa_gen_totp_title' => 'Налаштування мобільного додатка',
 | 
			
		||||
    'mfa_gen_totp_desc' => 'Для використання багатофакторної автентифікації вам потрібен мобільний додаток, який підтримує TOTP такі як Google Authenticator, Authy або Microsoft Authenticator.',
 | 
			
		||||
    'mfa_gen_totp_scan' => 'Проскануйте QR-код внизу за допомогою бажаного додатку для аутентифікації, щоб розпочати.',
 | 
			
		||||
    'mfa_gen_totp_verify_setup' => 'Перевірка налаштувань',
 | 
			
		||||
    'mfa_gen_totp_verify_setup_desc' => 'Переконайтеся, що все працює, ввівши код, згенерований у вашому додатку аутентифікації, в полі вводу нижче:',
 | 
			
		||||
    'mfa_gen_totp_provide_code_here' => 'Вкажіть код вашої програми тут',
 | 
			
		||||
    'mfa_verify_access' => 'Підтвердити доступ',
 | 
			
		||||
    'mfa_verify_access_desc' => 'Ваш обліковий запис користувача вимагає підтвердження за допомогою додаткового рівня перевірки, перш ніж отримати доступ. Перевірте, використовуючи один з ваших налаштованих способів для продовження.',
 | 
			
		||||
    'mfa_verify_no_methods' => 'Немає налаштованих методів',
 | 
			
		||||
    'mfa_verify_no_methods_desc' => 'Для вашого облікового запису не знайдено жодних методів багатофакторної аутентифікації. Вам потрібно буде налаштувати хоча б один спосіб перш ніж отримати доступ.',
 | 
			
		||||
    'mfa_verify_use_totp' => 'Перевірити за допомогою мобільного додатку',
 | 
			
		||||
    'mfa_verify_use_backup_codes' => 'Перевірка використовуючи резервний код',
 | 
			
		||||
    'mfa_verify_backup_code' => 'Резервний код',
 | 
			
		||||
    'mfa_verify_backup_code_desc' => 'Введіть один з резервних кодів нижче:',
 | 
			
		||||
    'mfa_verify_backup_code_enter_here' => 'Введіть резервний код тут',
 | 
			
		||||
    'mfa_verify_totp_desc' => 'Введіть код, згенерований за допомогою мобільного додатку:',
 | 
			
		||||
    'mfa_setup_login_notification' => 'Налаштовано багатофакторний метод аутентифікації. Будь ласка, зараз увійдіть в систему знову, використовуючи налаштований метод.',
 | 
			
		||||
];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,14 +39,14 @@ return [
 | 
			
		|||
    'reset' => 'Скинути',
 | 
			
		||||
    'remove' => 'Видалити',
 | 
			
		||||
    'add' => 'Додати',
 | 
			
		||||
    'configure' => 'Configure',
 | 
			
		||||
    'configure' => 'Налаштувати',
 | 
			
		||||
    'fullscreen' => 'На весь екран',
 | 
			
		||||
    'favourite' => 'Favourite',
 | 
			
		||||
    'unfavourite' => 'Unfavourite',
 | 
			
		||||
    'next' => 'Next',
 | 
			
		||||
    'previous' => 'Previous',
 | 
			
		||||
    'filter_active' => 'Active Filter:',
 | 
			
		||||
    'filter_clear' => 'Clear Filter',
 | 
			
		||||
    'favourite' => 'Улюблене',
 | 
			
		||||
    'unfavourite' => 'Прибрати з обраного',
 | 
			
		||||
    'next' => 'Уперед',
 | 
			
		||||
    'previous' => 'Назад',
 | 
			
		||||
    'filter_active' => 'Активний фільтр:',
 | 
			
		||||
    'filter_clear' => 'Очистити фільтр',
 | 
			
		||||
 | 
			
		||||
    // Sort Options
 | 
			
		||||
    'sort_options' => 'Параметри сортування',
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ return [
 | 
			
		|||
    'no_activity' => 'Немає активності для показу',
 | 
			
		||||
    'no_items' => 'Немає доступних елементів',
 | 
			
		||||
    'back_to_top' => 'Повернутися до початку',
 | 
			
		||||
    'skip_to_main_content' => 'Skip to main content',
 | 
			
		||||
    'skip_to_main_content' => 'Перейти до змісту',
 | 
			
		||||
    'toggle_details' => 'Подробиці',
 | 
			
		||||
    'toggle_thumbnails' => 'Мініатюри',
 | 
			
		||||
    'details' => 'Деталі',
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +73,7 @@ return [
 | 
			
		|||
    'breadcrumb' => 'Навігація',
 | 
			
		||||
 | 
			
		||||
    // Header
 | 
			
		||||
    'header_menu_expand' => 'Expand Header Menu',
 | 
			
		||||
    'header_menu_expand' => 'Розгорнути меню заголовка',
 | 
			
		||||
    'profile_menu' => 'Меню профілю',
 | 
			
		||||
    'view_profile' => 'Переглянути профіль',
 | 
			
		||||
    'edit_profile' => 'Редагувати профіль',
 | 
			
		||||
| 
						 | 
				
			
			@ -82,9 +82,9 @@ return [
 | 
			
		|||
 | 
			
		||||
    // Layout tabs
 | 
			
		||||
    'tab_info' => 'Інфо',
 | 
			
		||||
    'tab_info_label' => 'Tab: Show Secondary Information',
 | 
			
		||||
    'tab_info_label' => 'Вкладка: показувати додаткову інформацію',
 | 
			
		||||
    'tab_content' => 'Вміст',
 | 
			
		||||
    'tab_content_label' => 'Tab: Show Primary Content',
 | 
			
		||||
    'tab_content_label' => 'Вкладка: Показати основний вміст',
 | 
			
		||||
 | 
			
		||||
    // Email Content
 | 
			
		||||
    'email_action_help' => 'Якщо у вас виникають проблеми при натисканні кнопки ":actionText", скопіюйте та вставте URL у свій веб-браузер:',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ return [
 | 
			
		|||
    'images' => 'Зображення',
 | 
			
		||||
    'my_recent_drafts' => 'Мої останні чернетки',
 | 
			
		||||
    'my_recently_viewed' => 'Мої недавні перегляди',
 | 
			
		||||
    'my_most_viewed_favourites' => 'My Most Viewed Favourites',
 | 
			
		||||
    'my_favourites' => 'My Favourites',
 | 
			
		||||
    'my_most_viewed_favourites' => 'Мої найпопулярніші улюблені',
 | 
			
		||||
    'my_favourites' => 'Моє обране',
 | 
			
		||||
    'no_pages_viewed' => 'Ви не переглядали жодної сторінки',
 | 
			
		||||
    'no_pages_recently_created' => 'Не було створено жодної сторінки',
 | 
			
		||||
    'no_pages_recently_updated' => 'Немає недавно оновлених сторінок',
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ return [
 | 
			
		|||
    'export_html' => 'Вбудований веб-файл',
 | 
			
		||||
    'export_pdf' => 'PDF файл',
 | 
			
		||||
    'export_text' => 'Текстовий файл',
 | 
			
		||||
    'export_md' => 'Markdown File',
 | 
			
		||||
    'export_md' => 'Файл розмітки',
 | 
			
		||||
 | 
			
		||||
    // Permissions and restrictions
 | 
			
		||||
    'permissions' => 'Дозволи',
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +99,7 @@ return [
 | 
			
		|||
    'shelves_permissions' => 'Дозволи на книжкову полицю',
 | 
			
		||||
    'shelves_permissions_updated' => 'Дозволи на книжкову полицю оновлено',
 | 
			
		||||
    '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' => 'Копіювати дозволи',
 | 
			
		||||
    'shelves_copy_permissions_explain' => 'Це застосовує поточні налаштування дозволів цієї книжкової полиці до всіх книг, що містяться всередині. Перш ніж активувати, переконайтесь що будь-які зміни дозволів цієї книжкової полиці були збережені.',
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ return [
 | 
			
		|||
    'pages_initial_name' => 'Нова сторінка',
 | 
			
		||||
    'pages_editing_draft_notification' => 'Ви наразі редагуєте чернетку, що була збережена останньою :timeDiff.',
 | 
			
		||||
    'pages_draft_edited_notification' => 'З того часу ця сторінка була оновлена. Рекомендуємо відмовитися від цього проекту.',
 | 
			
		||||
    'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.',
 | 
			
		||||
    'pages_draft_page_changed_since_creation' => 'Ця сторінка була оновлена, оскільки була створена ця чернетка. Рекомендується відхилити цей проект або перейматися тим, що ви не перезапишете будь-які зміни в сторінках.',
 | 
			
		||||
    'pages_draft_edit_active' => [
 | 
			
		||||
        'start_a' => ':count користувачі(в) почали редагувати цю сторінку',
 | 
			
		||||
        'start_b' => ':userName розпочав редагування цієї сторінки',
 | 
			
		||||
| 
						 | 
				
			
			@ -258,16 +258,16 @@ return [
 | 
			
		|||
    'tags_explain' => "Додайте кілька тегів, щоб краще класифікувати ваш вміст. \n Ви можете присвоїти значення тегу для більш глибокої організації.",
 | 
			
		||||
    'tags_add' => 'Додати ще один тег',
 | 
			
		||||
    'tags_remove' => 'Видалити цей тег',
 | 
			
		||||
    'tags_usages' => 'Total tag usages',
 | 
			
		||||
    'tags_assigned_pages' => 'Assigned to Pages',
 | 
			
		||||
    'tags_assigned_chapters' => 'Assigned to Chapters',
 | 
			
		||||
    'tags_assigned_books' => 'Assigned to Books',
 | 
			
		||||
    'tags_assigned_shelves' => 'Assigned to Shelves',
 | 
			
		||||
    'tags_x_unique_values' => ':count unique values',
 | 
			
		||||
    'tags_all_values' => 'All values',
 | 
			
		||||
    'tags_view_tags' => 'View Tags',
 | 
			
		||||
    'tags_view_existing_tags' => 'View existing tags',
 | 
			
		||||
    'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
 | 
			
		||||
    'tags_usages' => 'Усього тегів використано',
 | 
			
		||||
    'tags_assigned_pages' => 'Призначено до сторінок',
 | 
			
		||||
    'tags_assigned_chapters' => 'Призначені до груп',
 | 
			
		||||
    'tags_assigned_books' => 'Призначено до книг',
 | 
			
		||||
    'tags_assigned_shelves' => 'Призначені до полиць',
 | 
			
		||||
    'tags_x_unique_values' => ':count унікальних значень',
 | 
			
		||||
    'tags_all_values' => 'Всі значення',
 | 
			
		||||
    'tags_view_tags' => 'Перегляд міток',
 | 
			
		||||
    'tags_view_existing_tags' => 'Перегляд існуючих тегів',
 | 
			
		||||
    'tags_list_empty_hint' => 'Теги можуть бути призначені через бічну панель редактора сторінки, або під час редагування деталей книги, глави чи полиці.',
 | 
			
		||||
    'attachments' => 'Вкладення',
 | 
			
		||||
    'attachments_explain' => 'Завантажте файли, або додайте посилання, які відображатимуться на вашій сторінці. Їх буде видно на бічній панелі сторінки.',
 | 
			
		||||
    'attachments_explain_instant_save' => 'Зміни тут зберігаються миттєво.',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,10 +23,10 @@ return [
 | 
			
		|||
    'saml_no_email_address' => 'Не вдалося знайти електронну адресу для цього користувача у даних, наданих зовнішньою системою аутентифікації',
 | 
			
		||||
    'saml_invalid_response_id' => 'Запит із зовнішньої системи аутентифікації не розпізнається процесом, розпочатим цим додатком. Повернення назад після входу могла спричинити цю проблему.',
 | 
			
		||||
    'saml_fail_authed' => 'Вхід із використанням «:system» не вдався, система не здійснила успішну авторизацію',
 | 
			
		||||
    'oidc_already_logged_in' => 'Already logged in',
 | 
			
		||||
    'oidc_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
 | 
			
		||||
    'oidc_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
 | 
			
		||||
    'oidc_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
 | 
			
		||||
    'oidc_already_logged_in' => 'Вже ввійшли в систему',
 | 
			
		||||
    'oidc_user_not_registered' => 'Користувач :name не зареєстровано і автоматична реєстрація відключена',
 | 
			
		||||
    'oidc_no_email_address' => 'Не вдалося знайти адресу електронної пошти для цього користувача у даних, наданих зовнішньою системою автентифікації',
 | 
			
		||||
    'oidc_fail_authed' => 'Увійти за допомогою :system не вдалося, система не надала успішної авторизації',
 | 
			
		||||
    'social_no_action_defined' => 'Жодних дій не визначено',
 | 
			
		||||
    'social_login_bad_response' => "Помилка, отримана під час входу з :socialAccount помилка : \n:error",
 | 
			
		||||
    'social_account_in_use' => 'Цей :socialAccount обліковий запис вже використовується, спробуйте ввійти з параметрами :socialAccount.',
 | 
			
		||||
| 
						 | 
				
			
			@ -87,9 +87,9 @@ return [
 | 
			
		|||
    '404_page_not_found' => 'Сторінку не знайдено',
 | 
			
		||||
    'sorry_page_not_found' => 'Вибачте, сторінку, яку ви шукали, не знайдено.',
 | 
			
		||||
    'sorry_page_not_found_permission_warning' => 'Якщо ви очікували що ця сторінки існує – можливо у вас немає дозволу на її перегляд.',
 | 
			
		||||
    'image_not_found' => 'Image Not Found',
 | 
			
		||||
    'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.',
 | 
			
		||||
    'image_not_found_details' => 'If you expected this image to exist it might have been deleted.',
 | 
			
		||||
    'image_not_found' => 'Зображення не знайдено',
 | 
			
		||||
    'image_not_found_subtitle' => 'Вибачте, файл зображення, що ви шукали, не знайдено.',
 | 
			
		||||
    'image_not_found_details' => 'Якщо ви очікували існування цього зображення, його, можливо, було видалено.',
 | 
			
		||||
    'return_home' => 'Повернутися на головну',
 | 
			
		||||
    'error_occurred' => 'Виникла помилка',
 | 
			
		||||
    'app_down' => ':appName зараз недоступний',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ return [
 | 
			
		|||
    'app_name' => 'Назва програми',
 | 
			
		||||
    'app_name_desc' => 'Ця назва показується у заголовку та в усіх листах.',
 | 
			
		||||
    'app_name_header' => 'Показати назву програми в заголовку',
 | 
			
		||||
    'app_public_access' => 'Публічнй доступ',
 | 
			
		||||
    'app_public_access' => 'Публічний доступ',
 | 
			
		||||
    'app_public_access_desc' => 'Увімкнення цієї опції дозволить відвідувачам, які не увійшли в систему, отримати доступ до вмісту у вашому екземплярі BookStack.',
 | 
			
		||||
    'app_public_access_desc_guest' => 'Доступ для публічних відвідувачів можна контролювати через користувача "Гість".',
 | 
			
		||||
    'app_public_access_toggle' => 'Дозволити публічний доступ',
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ return [
 | 
			
		|||
    'recycle_bin' => 'Кошик',
 | 
			
		||||
    'recycle_bin_desc' => 'Тут ви можете відновити видалені елементи, або назавжди видалити їх із системи. Цей список нефільтрований, на відміну від подібних списків активності в системі, де застосовуються фільтри дозволів.',
 | 
			
		||||
    'recycle_bin_deleted_item' => 'Виадлений елемент',
 | 
			
		||||
    'recycle_bin_deleted_parent' => 'Parent',
 | 
			
		||||
    'recycle_bin_deleted_parent' => 'Батьківський',
 | 
			
		||||
    'recycle_bin_deleted_by' => 'Ким видалено',
 | 
			
		||||
    'recycle_bin_deleted_at' => 'Час видалення',
 | 
			
		||||
    'recycle_bin_permanently_delete' => 'Видалити остаточно',
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ return [
 | 
			
		|||
    'recycle_bin_restore_list' => 'Елементи для відновлення',
 | 
			
		||||
    'recycle_bin_restore_confirm' => 'Ця дія відновить видалений елемент у початкове місце, включаючи всі дочірні елементи. Якщо вихідне розташування відтоді було видалено, і знаходиться у кошику, батьківський елемент також потрібно буде відновити.',
 | 
			
		||||
    'recycle_bin_restore_deleted_parent' => 'Батьківський елемент цього об\'єкта також був видалений. Вони залишатимуться видаленими, доки батьківський елемент також не буде відновлений.',
 | 
			
		||||
    'recycle_bin_restore_parent' => 'Restore Parent',
 | 
			
		||||
    'recycle_bin_restore_parent' => 'Відновити батьківську',
 | 
			
		||||
    'recycle_bin_destroy_notification' => 'Видалено :count елементів із кошика.',
 | 
			
		||||
    'recycle_bin_restore_notification' => 'Відновлено :count елементів із кошика.',
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +119,7 @@ return [
 | 
			
		|||
    'audit_table_user' => 'Користувач',
 | 
			
		||||
    'audit_table_event' => 'Подія',
 | 
			
		||||
    'audit_table_related' => 'Пов’язаний елемент',
 | 
			
		||||
    'audit_table_ip' => 'IP Address',
 | 
			
		||||
    'audit_table_ip' => 'IP-адреса',
 | 
			
		||||
    'audit_table_date' => 'Дата активності',
 | 
			
		||||
    'audit_date_from' => 'Діапазон дат від',
 | 
			
		||||
    'audit_date_to' => 'Діапазон дат до',
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +139,7 @@ return [
 | 
			
		|||
    'role_details' => 'Деталі ролі',
 | 
			
		||||
    'role_name' => 'Назва ролі',
 | 
			
		||||
    'role_desc' => 'Короткий опис ролі',
 | 
			
		||||
    'role_mfa_enforced' => 'Requires Multi-Factor Authentication',
 | 
			
		||||
    'role_mfa_enforced' => 'Потрібна двофактова автентифікація',
 | 
			
		||||
    'role_external_auth_id' => 'Зовнішні ID автентифікації',
 | 
			
		||||
    'role_system' => 'Системні дозволи',
 | 
			
		||||
    'role_manage_users' => 'Керування користувачами',
 | 
			
		||||
| 
						 | 
				
			
			@ -149,7 +149,7 @@ return [
 | 
			
		|||
    'role_manage_page_templates' => 'Управління шаблонами сторінок',
 | 
			
		||||
    'role_access_api' => 'Доступ до системного API',
 | 
			
		||||
    'role_manage_settings' => 'Керування налаштуваннями програми',
 | 
			
		||||
    'role_export_content' => 'Export content',
 | 
			
		||||
    'role_export_content' => 'Вміст експорту',
 | 
			
		||||
    'role_asset' => 'Дозволи',
 | 
			
		||||
    'roles_system_warning' => 'Майте на увазі, що доступ до будь-якого з вищезазначених трьох дозволів може дозволити користувачеві змінювати власні привілеї або привілеї інших в системі. Ролі з цими дозволами призначайте лише довіреним користувачам.',
 | 
			
		||||
    'role_asset_desc' => 'Ці дозволи контролюють стандартні доступи всередині системи. Права на книги, розділи та сторінки перевизначать ці дозволи.',
 | 
			
		||||
| 
						 | 
				
			
			@ -207,10 +207,10 @@ return [
 | 
			
		|||
    'users_api_tokens_create' => 'Створити токен',
 | 
			
		||||
    'users_api_tokens_expires' => 'Закінчується',
 | 
			
		||||
    'users_api_tokens_docs' => 'Документація API',
 | 
			
		||||
    'users_mfa' => 'Multi-Factor Authentication',
 | 
			
		||||
    'users_mfa_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
 | 
			
		||||
    'users_mfa_x_methods' => ':count method configured|:count methods configured',
 | 
			
		||||
    'users_mfa_configure' => 'Configure Methods',
 | 
			
		||||
    'users_mfa' => 'Багатофакторна Автентифікація',
 | 
			
		||||
    'users_mfa_desc' => 'Двофакторна аутентифікація додає ще один рівень безпеки для вашого облікового запису.',
 | 
			
		||||
    'users_mfa_x_methods' => ':count метод налаштовано|:count методів налаштовано',
 | 
			
		||||
    'users_mfa_configure' => 'Налаштувати Методи',
 | 
			
		||||
 | 
			
		||||
    // API Tokens
 | 
			
		||||
    'user_api_token_create' => 'Створити токен API',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ return [
 | 
			
		|||
    'alpha_dash'           => 'Поле :attribute має містити лише літери, цифри, дефіси та підкреслення.',
 | 
			
		||||
    'alpha_num'            => 'Поле :attribute має містити лише літери та цифри.',
 | 
			
		||||
    'array'                => 'Поле :attribute має бути масивом.',
 | 
			
		||||
    'backup_codes'         => 'The provided code is not valid or has already been used.',
 | 
			
		||||
    'backup_codes'         => 'Наданий код є недійсним або вже використаний.',
 | 
			
		||||
    'before'               => 'Поле :attribute має містити дату не пізніше :date.',
 | 
			
		||||
    'between'              => [
 | 
			
		||||
        'numeric' => 'Поле :attribute має бути між :min та :max.',
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +99,7 @@ return [
 | 
			
		|||
    ],
 | 
			
		||||
    'string'               => 'Поле :attribute повинне містити текст.',
 | 
			
		||||
    'timezone'             => 'Поле :attribute повинне містити коректну часову зону.',
 | 
			
		||||
    'totp'                 => 'The provided code is not valid or has expired.',
 | 
			
		||||
    'totp'                 => 'Наданий код не є дійсним або прострочений.',
 | 
			
		||||
    'unique'               => 'Вказане значення поля :attribute вже існує.',
 | 
			
		||||
    'url'                  => 'Формат поля :attribute неправильний.',
 | 
			
		||||
    'uploaded'             => 'Не вдалося завантажити файл. Сервер може не приймати файли такого розміру.',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -96,12 +96,12 @@ return [
 | 
			
		|||
    '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_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_no_methods' => 'No Methods Configured',
 | 
			
		||||
    'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
 | 
			
		||||
    'mfa_verify_use_totp' => 'Verify using a mobile app',
 | 
			
		||||
    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
 | 
			
		||||
    'mfa_verify_no_methods' => 'Không có phương pháp nào được cấu hình',
 | 
			
		||||
    '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' => 'Xác thực sử dụng mã di động',
 | 
			
		||||
    '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_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',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,17 +12,19 @@
 | 
			
		|||
 | 
			
		||||
            <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>
 | 
			
		||||
                    <label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label>
 | 
			
		||||
                    <p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p>
 | 
			
		||||
                <div class="grid half gap-xl v-center">
 | 
			
		||||
                    <div>
 | 
			
		||||
                        <label class="setting-list-label">{{ trans('settings.users_migrate_ownership') }}</label>
 | 
			
		||||
                        <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>
 | 
			
		||||
                    @include('form.user-select', ['name' => 'new_owner_id', 'user' => null, 'compact' => false])
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            @endif
 | 
			
		||||
 | 
			
		||||
            <hr class="my-l">
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,38 @@ class SearchApiTest extends TestCase
 | 
			
		|||
        $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()
 | 
			
		||||
    {
 | 
			
		||||
        $resp = $this->actingAsApiEditor()->get($this->baseEndpoint);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,6 +130,21 @@ class UserManagementTest extends TestCase
 | 
			
		|||
        $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()
 | 
			
		||||
    {
 | 
			
		||||
        $page = Page::query()->first();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue