]> BookStack Code Mirror - bookstack/commitdiff
Merge pull request #2 from BookStackApp/master
authorjzoy <redacted>
Sat, 11 Apr 2020 13:18:17 +0000 (21:18 +0800)
committerGitHub <redacted>
Sat, 11 Apr 2020 13:18:17 +0000 (21:18 +0800)
fetch upstream

251 files changed:
.env.example
.env.example.complete
.github/translators.txt
.github/workflows/phpunit.yml
app/Actions/Activity.php
app/Actions/ActivityService.php
app/Api/ApiDocsGenerator.php
app/Auth/Access/SocialAuthService.php
app/Auth/User.php
app/Config/app.php
app/Console/Commands/ClearViews.php
app/Console/Commands/CopyShelfPermissions.php
app/Console/Commands/DeleteUsers.php
app/Console/Commands/RegenerateSearch.php
app/Console/Commands/UpdateUrl.php [new file with mode: 0644]
app/Entities/Book.php
app/Entities/Bookshelf.php
app/Entities/Repos/BookshelfRepo.php
app/Http/Controllers/Api/BooksExportApiController.php [new file with mode: 0644]
app/Http/Controllers/Api/BookshelfApiController.php [new file with mode: 0644]
app/Http/Controllers/Auth/ForgotPasswordController.php
app/Http/Controllers/Auth/LoginController.php
app/Http/Controllers/Auth/ResetPasswordController.php
app/Http/Controllers/Auth/SocialController.php
app/Http/Controllers/BookController.php
app/Http/Controllers/BookshelfController.php
app/Http/Controllers/Controller.php
app/Http/Controllers/Images/DrawioImageController.php
app/Http/Controllers/Images/GalleryImageController.php
app/Http/Controllers/SettingController.php
app/Http/Controllers/UserController.php
app/Http/Middleware/Localization.php
app/Providers/AppServiceProvider.php
app/Uploads/ImageRepo.php
composer.json
composer.lock
dev/api/requests/shelves-create.json [new file with mode: 0644]
dev/api/requests/shelves-update.json [new file with mode: 0644]
dev/api/responses/books-read.json
dev/api/responses/shelves-create.json [new file with mode: 0644]
dev/api/responses/shelves-list.json [new file with mode: 0644]
dev/api/responses/shelves-read.json [new file with mode: 0644]
dev/api/responses/shelves-update.json [new file with mode: 0644]
package-lock.json
package.json
public/.htaccess
readme.md
resources/js/components/dropdown.js
resources/js/components/markdown-editor.js
resources/js/components/notification.js
resources/js/components/template-manager.js
resources/js/components/wysiwyg-editor.js
resources/js/services/code.js
resources/js/services/drawio.js
resources/js/vues/code-editor.js
resources/lang/ar/errors.php
resources/lang/ar/settings.php
resources/lang/cs/auth.php
resources/lang/cs/common.php
resources/lang/cs/errors.php
resources/lang/cs/settings.php
resources/lang/da/auth.php
resources/lang/da/common.php
resources/lang/da/components.php [new file with mode: 0644]
resources/lang/da/entities.php [new file with mode: 0644]
resources/lang/da/errors.php
resources/lang/da/pagination.php [new file with mode: 0644]
resources/lang/da/settings.php
resources/lang/da/validation.php [new file with mode: 0644]
resources/lang/de/errors.php
resources/lang/de/settings.php
resources/lang/de_informal/auth.php
resources/lang/de_informal/entities.php
resources/lang/de_informal/errors.php
resources/lang/de_informal/settings.php
resources/lang/de_informal/validation.php
resources/lang/en/auth.php
resources/lang/en/errors.php
resources/lang/en/passwords.php
resources/lang/en/settings.php
resources/lang/es/activities.php
resources/lang/es/auth.php
resources/lang/es/errors.php
resources/lang/es/settings.php
resources/lang/es_AR/errors.php
resources/lang/es_AR/settings.php
resources/lang/fa/activities.php [new file with mode: 0644]
resources/lang/fa/auth.php [new file with mode: 0644]
resources/lang/fa/common.php [new file with mode: 0644]
resources/lang/fa/components.php [new file with mode: 0644]
resources/lang/fa/entities.php [new file with mode: 0644]
resources/lang/fa/errors.php [new file with mode: 0644]
resources/lang/fa/pagination.php [new file with mode: 0644]
resources/lang/fa/passwords.php [new file with mode: 0644]
resources/lang/fa/settings.php [new file with mode: 0644]
resources/lang/fa/validation.php [new file with mode: 0644]
resources/lang/fr/common.php
resources/lang/fr/errors.php
resources/lang/fr/settings.php
resources/lang/he/activities.php [new file with mode: 0644]
resources/lang/he/auth.php [new file with mode: 0644]
resources/lang/he/common.php [new file with mode: 0644]
resources/lang/he/components.php [new file with mode: 0644]
resources/lang/he/entities.php [new file with mode: 0644]
resources/lang/he/errors.php [new file with mode: 0644]
resources/lang/he/pagination.php [new file with mode: 0644]
resources/lang/he/passwords.php [new file with mode: 0644]
resources/lang/he/settings.php [new file with mode: 0755]
resources/lang/he/validation.php [new file with mode: 0644]
resources/lang/hu/errors.php
resources/lang/hu/settings.php
resources/lang/it/errors.php
resources/lang/it/settings.php
resources/lang/ja/components.php
resources/lang/ja/errors.php
resources/lang/ja/settings.php
resources/lang/ko/errors.php
resources/lang/ko/settings.php
resources/lang/nl/errors.php
resources/lang/nl/settings.php
resources/lang/pl/errors.php
resources/lang/pl/settings.php
resources/lang/pt/activities.php [new file with mode: 0644]
resources/lang/pt/auth.php [new file with mode: 0644]
resources/lang/pt/common.php [new file with mode: 0644]
resources/lang/pt/components.php [new file with mode: 0644]
resources/lang/pt/entities.php [new file with mode: 0644]
resources/lang/pt/errors.php [new file with mode: 0644]
resources/lang/pt/pagination.php [new file with mode: 0644]
resources/lang/pt/passwords.php [new file with mode: 0644]
resources/lang/pt/settings.php [new file with mode: 0644]
resources/lang/pt/validation.php [new file with mode: 0644]
resources/lang/pt_BR/errors.php
resources/lang/pt_BR/settings.php
resources/lang/ru/activities.php
resources/lang/ru/auth.php
resources/lang/ru/common.php
resources/lang/ru/components.php
resources/lang/ru/entities.php
resources/lang/ru/errors.php
resources/lang/ru/passwords.php
resources/lang/ru/settings.php
resources/lang/ru/validation.php
resources/lang/sk/errors.php
resources/lang/sk/settings.php
resources/lang/sl/activities.php [new file with mode: 0644]
resources/lang/sl/auth.php [new file with mode: 0644]
resources/lang/sl/common.php [new file with mode: 0644]
resources/lang/sl/components.php [new file with mode: 0644]
resources/lang/sl/entities.php [new file with mode: 0644]
resources/lang/sl/errors.php [new file with mode: 0644]
resources/lang/sl/pagination.php [new file with mode: 0644]
resources/lang/sl/passwords.php [new file with mode: 0644]
resources/lang/sl/settings.php [new file with mode: 0644]
resources/lang/sl/validation.php [new file with mode: 0644]
resources/lang/sv/auth.php
resources/lang/sv/common.php
resources/lang/sv/entities.php
resources/lang/sv/errors.php
resources/lang/sv/settings.php
resources/lang/sv/validation.php
resources/lang/tr/errors.php
resources/lang/tr/settings.php
resources/lang/uk/errors.php
resources/lang/uk/settings.php
resources/lang/vi/activities.php [new file with mode: 0644]
resources/lang/vi/auth.php [new file with mode: 0644]
resources/lang/vi/common.php [new file with mode: 0644]
resources/lang/vi/components.php [new file with mode: 0644]
resources/lang/vi/entities.php [new file with mode: 0644]
resources/lang/vi/errors.php [new file with mode: 0644]
resources/lang/vi/pagination.php [new file with mode: 0644]
resources/lang/vi/passwords.php [new file with mode: 0644]
resources/lang/vi/settings.php [new file with mode: 0644]
resources/lang/vi/validation.php [new file with mode: 0644]
resources/lang/zh_CN/errors.php
resources/lang/zh_CN/settings.php
resources/lang/zh_TW/errors.php
resources/lang/zh_TW/settings.php
resources/sass/_blocks.scss
resources/sass/_buttons.scss
resources/sass/_components.scss
resources/sass/_forms.scss
resources/sass/_header.scss
resources/sass/_layout.scss
resources/sass/_lists.scss
resources/sass/_mixins.scss
resources/sass/_pages.scss
resources/sass/_spacing.scss
resources/sass/_tables.scss
resources/sass/_text.scss
resources/sass/print-styles.scss
resources/sass/styles.scss
resources/views/api-docs/index.blade.php
resources/views/auth/forms/login/saml2.blade.php
resources/views/auth/login.blade.php
resources/views/auth/register.blade.php
resources/views/base.blade.php
resources/views/books/index.blade.php
resources/views/books/show.blade.php
resources/views/common/header.blade.php
resources/views/common/home-book.blade.php
resources/views/common/home-shelves.blade.php
resources/views/components/code-editor.blade.php
resources/views/components/setting-entity-color-picker.blade.php
resources/views/errors/404.blade.php
resources/views/pages/form.blade.php
resources/views/settings/index.blade.php
resources/views/shelves/index.blade.php
resources/views/shelves/show.blade.php
routes/api.php
routes/web.php
tests/Api/ApiAuthTest.php
tests/Api/ApiConfigTest.php
tests/Api/ApiDocsTest.php
tests/Api/ApiListingTest.php
tests/Api/BooksApiTest.php
tests/Api/ShelvesApiTest.php [new file with mode: 0644]
tests/Api/TestsApi.php [moved from tests/TestsApi.php with 96% similarity]
tests/Auth/AuthTest.php
tests/Auth/LdapTest.php
tests/Auth/Saml2Test.php
tests/Auth/SocialAuthTest.php
tests/Auth/UserInviteTest.php
tests/CommandsTest.php
tests/Entity/BookShelfTest.php
tests/Entity/CommentSettingTest.php
tests/Entity/CommentTest.php
tests/Entity/EntitySearchTest.php
tests/Entity/EntityTest.php
tests/Entity/ExportTest.php
tests/Entity/MarkdownTest.php
tests/Entity/PageContentTest.php
tests/Entity/PageDraftTest.php
tests/Entity/PageRevisionTest.php
tests/Entity/PageTemplateTest.php
tests/Entity/SortTest.php
tests/Entity/TagTest.php
tests/LanguageTest.php
tests/Permissions/RestrictionsTest.php
tests/Permissions/RolesTest.php
tests/PublicActionTest.php
tests/Unit/ConfigTest.php
tests/Unit/UrlTest.php
tests/Uploads/AttachmentTest.php
tests/Uploads/DrawioTest.php [new file with mode: 0644]
tests/Uploads/ImageTest.php
tests/Uploads/UsesImages.php
tests/User/UserApiTokenTest.php
tests/User/UserPreferencesTest.php
tests/User/UserProfileTest.php

index 9e64828b5de45065f0e21d766ef3d44fb594b700..f5e81277cedbdc90bb6a896b4c1476f16154c95a 100644 (file)
@@ -17,9 +17,13 @@ DB_USERNAME=database_username
 DB_PASSWORD=database_user_password
 
 # Mail system to use
-# Can be 'smtp', 'mail' or 'sendmail'
+# Can be 'smtp' or 'sendmail'
 MAIL_DRIVER=smtp
 
+# Mail sender options
+MAIL_FROM_NAME=BookStack
+
 # SMTP mail options
 MAIL_HOST=localhost
 MAIL_PORT=1025
index 86a7351c215a675685eebeea1714982eaff5e6bb..472ca051b336388715aab7781c8ec7ab5658978c 100644 (file)
@@ -238,7 +238,10 @@ DISABLE_EXTERNAL_SERVICES=false
 # Example: AVATAR_URL=https://seccdn.libravatar.org/avatar/${hash}?s=${size}&d=identicon
 AVATAR_URL=
 
-# Enable Draw.io integration
+# Enable draw.io integration
+# Can simply be true/false to enable/disable the integration.
+# Alternatively, It can be URL to the draw.io instance you want to use.
+# For URLs, The following URL parameters should be included: embed=1&proto=json&spin=1
 DRAWIO=true
 
 # Default item listing view
index c8d505e824b2fd7d0b5350d3c077c7d0fc20f969..23807a00bd17372284903c31af4ec78d37067dcd 100644 (file)
@@ -69,5 +69,21 @@ dbguichu :: Chinese Simplified
 Randy Kim (hyunjun) :: Korean
 Francesco M. Taurino (ftaurino) :: Italian
 DanielFrederiksen :: Danish
-Finn Wessel (19finnwessel6) :: German
+Finn Wessel (19finnwessel6) :: German Informal; German
 Gustav Kånåhols (Kurbitz) :: Swedish
+Vuong Trung Hieu (fpooon) :: Vietnamese
+Emil Petersen (emoyly) :: Danish
+mrjaboozy :: Slovenian
+Statium :: Russian
+Mikkel Struntze (MStruntze) :: Danish
+kostefun :: Russian
+Tuyen.NG (tuyendev) :: Vietnamese
+Ghost_chu (dbguichu) :: Chinese Simplified
+Ziipen :: Danish
+Samuel Schwarz (Guiph7quan) :: Czech
+Aleph (toishoki) :: Turkish
+Julio Alberto García (Yllelder) :: Spanish
+Rafael (raribeir) :: Portuguese, Brazilian
+Hiroyuki Odake (dakesan) :: Japanese
+Alex Lee (qianmengnet) :: Chinese Simplified
+swinn37 :: French
index f6c002c05098d1c1a9148e6bb54ddde46ef1fd2b..fa2437f378a74c378b575fd4ef49bef7031aafa7 100644 (file)
@@ -31,6 +31,10 @@ jobs:
         path: ${{ steps.composer-cache.outputs.dir }}
         key: ${{ runner.os }}-composer-${{ matrix.php }}
 
+    - name: Start Database
+      run: |
+        sudo /etc/init.d/mysql start
+
     - name: Setup Database
       run: |
         mysql -uroot -proot -e 'CREATE DATABASE IF NOT EXISTS `bookstack-test`;'
index 05f0129ddff7c322f8f900a3f5bdf4e6dba65fda..035a9cc750ef16618ee81b8f48e0981c2442f8da 100644 (file)
@@ -50,10 +50,8 @@ class Activity extends Model
 
     /**
      * Checks if another Activity matches the general information of another.
-     * @param $activityB
-     * @return bool
      */
-    public function isSimilarTo($activityB)
+    public function isSimilarTo(Activity $activityB): bool
     {
         return [$this->key, $this->entity_type, $this->entity_id] === [$activityB->key, $activityB->entity_type, $activityB->entity_id];
     }
index f56f1ca57e03c304c4f4fdcd7201293afe45f8ba..9b69cbb1747662240d4c4055f8647f58a17bdb9b 100644 (file)
@@ -1,8 +1,9 @@
 <?php namespace BookStack\Actions;
 
 use BookStack\Auth\Permissions\PermissionService;
-use BookStack\Entities\Book;
+use BookStack\Auth\User;
 use BookStack\Entities\Entity;
+use Illuminate\Support\Collection;
 
 class ActivityService
 {
@@ -12,8 +13,6 @@ class ActivityService
 
     /**
      * ActivityService constructor.
-     * @param Activity $activity
-     * @param PermissionService $permissionService
      */
     public function __construct(Activity $activity, PermissionService $permissionService)
     {
@@ -24,11 +23,8 @@ class ActivityService
 
     /**
      * Add activity data to database.
-     * @param \BookStack\Entities\Entity $entity
-     * @param string $activityKey
-     * @param int $bookId
      */
-    public function add(Entity $entity, string $activityKey, int $bookId = null)
+    public function add(Entity $entity, string $activityKey, ?int $bookId = null)
     {
         $activity = $this->newActivityForUser($activityKey, $bookId);
         $entity->activity()->save($activity);
@@ -37,11 +33,8 @@ class ActivityService
 
     /**
      * Adds a activity history with a message, without binding to a entity.
-     * @param string $activityKey
-     * @param string $message
-     * @param int $bookId
      */
-    public function addMessage(string $activityKey, string $message, int $bookId = null)
+    public function addMessage(string $activityKey, string $message, ?int $bookId = null)
     {
         $this->newActivityForUser($activityKey, $bookId)->forceFill([
             'extra' => $message
@@ -52,11 +45,8 @@ class ActivityService
 
     /**
      * Get a new activity instance for the current user.
-     * @param string $key
-     * @param int|null $bookId
-     * @return Activity
      */
-    protected function newActivityForUser(string $key, int $bookId = null)
+    protected function newActivityForUser(string $key, ?int $bookId = null): Activity
     {
         return $this->activity->newInstance()->forceFill([
             'key' => strtolower($key),
@@ -69,34 +59,27 @@ class ActivityService
      * Removes the entity attachment from each of its activities
      * and instead uses the 'extra' field with the entities name.
      * Used when an entity is deleted.
-     * @param \BookStack\Entities\Entity $entity
-     * @return mixed
      */
-    public function removeEntity(Entity $entity)
+    public function removeEntity(Entity $entity): Collection
     {
-        // TODO - Rewrite to db query.
-        $activities = $entity->activity;
-        foreach ($activities as $activity) {
-            $activity->extra = $entity->name;
-            $activity->entity_id = 0;
-            $activity->entity_type = null;
-            $activity->save();
-        }
+        $activities = $entity->activity()->get();
+        $entity->activity()->update([
+            'extra' => $entity->name,
+            'entity_id' => 0,
+            'entity_type' => '',
+        ]);
         return $activities;
     }
 
     /**
      * Gets the latest activity.
-     * @param int $count
-     * @param int $page
-     * @return array
      */
-    public function latest($count = 20, $page = 0)
+    public function latest(int $count = 20, int $page = 0): array
     {
         $activityList = $this->permissionService
             ->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
             ->orderBy('created_at', 'desc')
-            ->with('user', 'entity')
+            ->with(['user', 'entity'])
             ->skip($count * $page)
             ->take($count)
             ->get();
@@ -107,17 +90,13 @@ class ActivityService
     /**
      * Gets the latest activity for an entity, Filtering out similar
      * items to prevent a message activity list.
-     * @param \BookStack\Entities\Entity $entity
-     * @param int $count
-     * @param int $page
-     * @return array
      */
-    public function entityActivity($entity, $count = 20, $page = 1)
+    public function entityActivity(Entity $entity, int $count = 20, int $page = 1): array
     {
         if ($entity->isA('book')) {
-            $query = $this->activity->where('book_id', '=', $entity->id);
+            $query = $this->activity->newQuery()->where('book_id', '=', $entity->id);
         } else {
-            $query = $this->activity->where('entity_type', '=', $entity->getMorphClass())
+            $query = $this->activity->newQuery()->where('entity_type', '=', $entity->getMorphClass())
                 ->where('entity_id', '=', $entity->id);
         }
         
@@ -133,18 +112,18 @@ class ActivityService
     }
 
     /**
-     * Get latest activity for a user, Filtering out similar
-     * items.
-     * @param $user
-     * @param int $count
-     * @param int $page
-     * @return array
+     * Get latest activity for a user, Filtering out similar items.
      */
-    public function userActivity($user, $count = 20, $page = 0)
+    public function userActivity(User $user, int $count = 20, int $page = 0): array
     {
         $activityList = $this->permissionService
             ->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
-            ->orderBy('created_at', 'desc')->where('user_id', '=', $user->id)->skip($count * $page)->take($count)->get();
+            ->orderBy('created_at', 'desc')
+            ->where('user_id', '=', $user->id)
+            ->skip($count * $page)
+            ->take($count)
+            ->get();
+
         return $this->filterSimilar($activityList);
     }
 
@@ -153,29 +132,26 @@ class ActivityService
      * @param Activity[] $activities
      * @return array
      */
-    protected function filterSimilar($activities)
+    protected function filterSimilar(iterable $activities): array
     {
         $newActivity = [];
-        $previousItem = false;
+        $previousItem = null;
+
         foreach ($activities as $activityItem) {
-            if ($previousItem === false) {
-                $previousItem = $activityItem;
-                $newActivity[] = $activityItem;
-                continue;
-            }
-            if (!$activityItem->isSimilarTo($previousItem)) {
+            if (!$previousItem || !$activityItem->isSimilarTo($previousItem)) {
                 $newActivity[] = $activityItem;
             }
+
             $previousItem = $activityItem;
         }
+
         return $newActivity;
     }
 
     /**
      * Flashes a notification message to the session if an appropriate message is available.
-     * @param $activityKey
      */
-    protected function setNotification($activityKey)
+    protected function setNotification(string $activityKey)
     {
         $notificationTextKey = 'activities.' . $activityKey . '_notification';
         if (trans()->has($notificationTextKey)) {
index a0c45608aede96881f7005ee4b1abdf9a292b0a2..ddba24bdb65d6ec8dc1474e3d50996c546623228 100644 (file)
@@ -3,6 +3,7 @@
 use BookStack\Http\Controllers\Api\ApiController;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Route;
+use Illuminate\Support\Str;
 use ReflectionClass;
 use ReflectionException;
 use ReflectionMethod;
@@ -117,6 +118,7 @@ class ApiDocsGenerator
                 'method' => $route->methods[0],
                 'controller' => $controller,
                 'controller_method' => $controllerMethod,
+                'controller_method_kebab' => Str::kebab($controllerMethod),
                 'base_model' => $baseModelName,
             ];
         });
index 16815a8e1b72d9f021e573975a473c94ab9d9f47..657aae3f327d530557b37c4ff2ce0f6f7126114a 100644 (file)
@@ -233,6 +233,9 @@ class SocialAuthService
         if ($driverName === 'google' && config('services.google.select_account')) {
             $driver->with(['prompt' => 'select_account']);
         }
+        if ($driverName === 'azure') {
+            $driver->with(['resource' => 'https://graph.windows.net']);
+        }
 
         return $driver;
     }
index 28fb9c7fc2e17482518b8eee7886f151a5342be5..a581d999340b1d76294a0c2dbb0a55c4501f6190 100644 (file)
@@ -47,7 +47,10 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
      * The attributes excluded from the model's JSON form.
      * @var array
      */
-    protected $hidden = ['password', 'remember_token', 'system_name', 'email_confirmed', 'external_auth_id', 'email'];
+    protected $hidden = [
+        'password', 'remember_token', 'system_name', 'email_confirmed', 'external_auth_id', 'email',
+        'created_at', 'updated_at',
+    ];
 
     /**
      * This holds the user's permissions when loaded.
index 3b7216b3d57976933c81adcae9021819801f995a..cf34fd6943b47ff704ca2c839ed24b6856bedefc 100755 (executable)
@@ -52,7 +52,7 @@ return [
     'locale' => env('APP_LANG', 'en'),
 
     // Locales available
-    'locales' => ['en', 'ar', 'da', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'hu', 'nl', 'pt_BR', 'sk', 'cs', 'sv', 'ko', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW', 'tr'],
+    'locales' => ['en', 'ar', 'cs', 'da', 'de', 'de_informal', 'es', 'es_AR', 'fa', 'fr', 'he', 'hu', 'it', 'ja', 'ko', 'nl', 'pt', 'pt_BR', 'sk', 'sl', 'sv', 'pl',  'ru', 'tr', 'uk', 'vi', 'zh_CN', 'zh_TW',],
 
     //  Application Fallback Locale
     'fallback_locale' => 'en',
index 678c64d330179893880f707db7cd0f8a705bf297..35356210b66809c62687e8fbb1eaa437bc447106 100644 (file)
@@ -18,7 +18,7 @@ class ClearViews extends Command
      *
      * @var string
      */
-    protected $description = 'Clear all view-counts for all entities.';
+    protected $description = 'Clear all view-counts for all entities';
 
     /**
      * Create a new command instance.
index d9a1c1d7282ed051b44f5f77d2c16525416d356e..6b5d35a476798a67d2bf16a42d2225b67363d632 100644 (file)
@@ -23,7 +23,7 @@ class CopyShelfPermissions extends Command
      *
      * @var string
      */
-    protected $description = 'Copy shelf permissions to all child books.';
+    protected $description = 'Copy shelf permissions to all child books';
 
     /**
      * @var BookshelfRepo
index 68c5bb738178f6b6fdfdbfeb0dec2d64dc5371f7..c73c883de2d2bd75535f817e5c10e03eff3e9ff4 100644 (file)
@@ -25,7 +25,7 @@ class DeleteUsers extends Command
      *
      * @var string
      */
-    protected $description = 'Delete users that are not "admin" or system users.';
+    protected $description = 'Delete users that are not "admin" or system users';
 
     public function __construct(User $user, UserRepo $userRepo)
     {
index d27d73edc01dcbf55443f9bbf8f916539d0c5295..dc57f2cea764b3a8517de9453ae4ee05fd86d9a6 100644 (file)
@@ -3,6 +3,7 @@
 namespace BookStack\Console\Commands;
 
 use BookStack\Entities\SearchService;
+use DB;
 use Illuminate\Console\Command;
 
 class RegenerateSearch extends Command
@@ -26,7 +27,7 @@ class RegenerateSearch extends Command
     /**
      * Create a new command instance.
      *
-     * @param \BookStack\Entities\SearchService $searchService
+     * @param SearchService $searchService
      */
     public function __construct(SearchService $searchService)
     {
@@ -41,14 +42,14 @@ class RegenerateSearch extends Command
      */
     public function handle()
     {
-        $connection = \DB::getDefaultConnection();
+        $connection = DB::getDefaultConnection();
         if ($this->option('database') !== null) {
-            \DB::setDefaultConnection($this->option('database'));
-            $this->searchService->setConnection(\DB::connection($this->option('database')));
+            DB::setDefaultConnection($this->option('database'));
+            $this->searchService->setConnection(DB::connection($this->option('database')));
         }
 
         $this->searchService->indexAllEntities();
-        \DB::setDefaultConnection($connection);
+        DB::setDefaultConnection($connection);
         $this->comment('Search index regenerated');
     }
 }
diff --git a/app/Console/Commands/UpdateUrl.php b/app/Console/Commands/UpdateUrl.php
new file mode 100644 (file)
index 0000000..b95e277
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+namespace BookStack\Console\Commands;
+
+use Illuminate\Console\Command;
+use Illuminate\Database\Connection;
+
+class UpdateUrl extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'bookstack:update-url
+                            {oldUrl : URL to replace}
+                            {newUrl : URL to use as the replacement}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Find and replace the given URLs in your BookStack database';
+
+    protected $db;
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(Connection $db)
+    {
+        $this->db = $db;
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $oldUrl = str_replace("'", '', $this->argument('oldUrl'));
+        $newUrl = str_replace("'", '', $this->argument('newUrl'));
+
+        $urlPattern = '/https?:\/\/(.+)/';
+        if (!preg_match($urlPattern, $oldUrl) || !preg_match($urlPattern, $newUrl)) {
+            $this->error("The given urls are expected to be full urls starting with http:// or https://");
+            return 1;
+        }
+
+        if (!$this->checkUserOkayToProceed($oldUrl, $newUrl)) {
+            return 1;
+        }
+
+        $columnsToUpdateByTable = [
+            "attachments" => ["path"],
+            "pages" => ["html", "text", "markdown"],
+            "images" => ["url"],
+            "comments" => ["html", "text"],
+        ];
+
+        foreach ($columnsToUpdateByTable as $table => $columns) {
+            foreach ($columns as $column) {
+                $changeCount = $this->db->table($table)->update([
+                    $column => $this->db->raw("REPLACE({$column}, '{$oldUrl}', '{$newUrl}')")
+                ]);
+                $this->info("Updated {$changeCount} rows in {$table}->{$column}");
+            }
+        }
+
+        $this->info("URL update procedure complete.");
+        return 0;
+    }
+
+    /**
+     * Warn the user of the dangers of this operation.
+     * Returns a boolean indicating if they've accepted the warnings.
+     */
+    protected function checkUserOkayToProceed(string $oldUrl, string $newUrl): bool
+    {
+        $dangerWarning = "This will search for \"{$oldUrl}\" in your database and replace it with  \"{$newUrl}\".\n";
+        $dangerWarning .= "Are you sure you want to proceed?";
+        $backupConfirmation = "This operation could cause issues if used incorrectly. Have you made a backup of your existing database?";
+
+        return $this->confirm($dangerWarning) && $this->confirm($backupConfirmation);
+    }
+}
index df0d992284795232a7af98e6410a7c4797d43e17..38b7d4a8c29d3361652192d703a8362029bd62e4 100644 (file)
@@ -19,7 +19,7 @@ class Book extends Entity implements HasCoverImage
     public $searchFactor = 2;
 
     protected $fillable = ['name', 'description'];
-    protected $hidden = ['restricted'];
+    protected $hidden = ['restricted', 'pivot'];
 
     /**
      * Get the url for this book.
index 62c7e2fe4f56c3e0a78f91105d6ba3c0da6dfad9..c7ba840e0ce0803f5e2da79ddf177bc1bb0dc563 100644 (file)
@@ -12,6 +12,8 @@ class Bookshelf extends Entity implements HasCoverImage
 
     protected $fillable = ['name', 'description', 'image_id'];
 
+    protected $hidden = ['restricted'];
+
     /**
      * Get the books in this shelf.
      * Should not be used directly since does not take into account permissions.
index 25fa97dae00d22ac283b3ddb1a31de467ab7ae53..876f56e1036aa144ee211a4930448db4c62a570c 100644 (file)
@@ -91,10 +91,14 @@ class BookshelfRepo
     /**
      * Create a new shelf in the system.
      */
-    public function update(Bookshelf $shelf, array $input, array $bookIds): Bookshelf
+    public function update(Bookshelf $shelf, array $input, ?array $bookIds): Bookshelf
     {
         $this->baseRepo->update($shelf, $input);
-        $this->updateBooks($shelf, $bookIds);
+
+        if (!is_null($bookIds)) {
+            $this->updateBooks($shelf, $bookIds);
+        }
+
         return $shelf;
     }
 
diff --git a/app/Http/Controllers/Api/BooksExportApiController.php b/app/Http/Controllers/Api/BooksExportApiController.php
new file mode 100644 (file)
index 0000000..605f8f4
--- /dev/null
@@ -0,0 +1,55 @@
+<?php namespace BookStack\Http\Controllers\Api;
+
+use BookStack\Entities\Book;
+use BookStack\Entities\ExportService;
+use BookStack\Entities\Repos\BookRepo;
+use Throwable;
+
+class BooksExportApiController extends ApiController
+{
+
+    protected $bookRepo;
+    protected $exportService;
+
+    /**
+     * BookExportController constructor.
+     */
+    public function __construct(BookRepo $bookRepo, ExportService $exportService)
+    {
+        $this->bookRepo = $bookRepo;
+        $this->exportService = $exportService;
+        parent::__construct();
+    }
+
+    /**
+     * Export a book as a PDF file.
+     * @throws Throwable
+     */
+    public function exportPdf(int $id)
+    {
+        $book = Book::visible()->findOrFail($id);
+        $pdfContent = $this->exportService->bookToPdf($book);
+        return $this->downloadResponse($pdfContent, $book->slug . '.pdf');
+    }
+
+    /**
+     * Export a book as a contained HTML file.
+     * @throws Throwable
+     */
+    public function exportHtml(int $id)
+    {
+        $book = Book::visible()->findOrFail($id);
+        $htmlContent = $this->exportService->bookToContainedHtml($book);
+        return $this->downloadResponse($htmlContent, $book->slug . '.html');
+    }
+
+    /**
+     * Export a book as a plain text file.
+     */
+    public function exportPlainText(int $id)
+    {
+        $book = Book::visible()->findOrFail($id);
+        $textContent = $this->exportService->bookToPlainText($book);
+        return $this->downloadResponse($textContent, $book->slug . '.txt');
+    }
+}
diff --git a/app/Http/Controllers/Api/BookshelfApiController.php b/app/Http/Controllers/Api/BookshelfApiController.php
new file mode 100644 (file)
index 0000000..14b5e05
--- /dev/null
@@ -0,0 +1,122 @@
+<?php namespace BookStack\Http\Controllers\Api;
+
+use BookStack\Facades\Activity;
+use BookStack\Entities\Repos\BookshelfRepo;
+use BookStack\Entities\Bookshelf;
+use Exception;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Http\Request;
+use Illuminate\Validation\ValidationException;
+
+class BookshelfApiController extends ApiController
+{
+
+    /**
+     * @var BookshelfRepo
+     */
+    protected $bookshelfRepo;
+
+    protected $rules = [
+        'create' => [
+            'name' => 'required|string|max:255',
+            'description' => 'string|max:1000',
+            'books' => 'array',
+        ],
+        'update' => [
+            'name' => 'string|min:1|max:255',
+            'description' => 'string|max:1000',
+            'books' => 'array',
+        ],
+    ];
+
+    /**
+     * BookshelfApiController constructor.
+     * @param BookshelfRepo $bookshelfRepo
+     */
+    public function __construct(BookshelfRepo $bookshelfRepo)
+    {
+        $this->bookshelfRepo = $bookshelfRepo;
+    }
+
+    /**
+     * Get a listing of shelves visible to the user.
+     */
+    public function list()
+    {
+        $shelves = Bookshelf::visible();
+        return $this->apiListingResponse($shelves, [
+            'id', 'name', 'slug', 'description', 'created_at', 'updated_at', 'created_by', 'updated_by', 'image_id',
+        ]);
+    }
+
+    /**
+     * Create a new shelf in the system.
+     * An array of books IDs can be provided in the request. These
+     * will be added to the shelf in the same order as provided.
+     * @throws ValidationException
+     */
+    public function create(Request $request)
+    {
+        $this->checkPermission('bookshelf-create-all');
+        $requestData = $this->validate($request, $this->rules['create']);
+
+        $bookIds = $request->get('books', []);
+        $shelf = $this->bookshelfRepo->create($requestData, $bookIds);
+
+        Activity::add($shelf, 'bookshelf_create', $shelf->id);
+        return response()->json($shelf);
+    }
+
+    /**
+     * View the details of a single shelf.
+     */
+    public function read(string $id)
+    {
+        $shelf = Bookshelf::visible()->with([
+            'tags', 'cover', 'createdBy', 'updatedBy',
+            'books' => function (BelongsToMany $query) {
+                $query->visible()->get(['id', 'name', 'slug']);
+            }
+        ])->findOrFail($id);
+        return response()->json($shelf);
+    }
+
+    /**
+     * Update the details of a single shelf.
+     * An array of books IDs can be provided in the request. These
+     * will be added to the shelf in the same order as provided and overwrite
+     * any existing book assignments.
+     * @throws ValidationException
+     */
+    public function update(Request $request, string $id)
+    {
+        $shelf = Bookshelf::visible()->findOrFail($id);
+        $this->checkOwnablePermission('bookshelf-update', $shelf);
+
+        $requestData = $this->validate($request, $this->rules['update']);
+
+        $bookIds = $request->get('books', null);
+
+        $shelf = $this->bookshelfRepo->update($shelf, $requestData, $bookIds);
+        Activity::add($shelf, 'bookshelf_update', $shelf->id);
+
+        return response()->json($shelf);
+    }
+
+
+
+    /**
+     * Delete a single shelf from the system.
+     * @throws Exception
+     */
+    public function delete(string $id)
+    {
+        $shelf = Bookshelf::visible()->findOrFail($id);
+        $this->checkOwnablePermission('bookshelf-delete', $shelf);
+
+        $this->bookshelfRepo->destroy($shelf);
+        Activity::addMessage('bookshelf_delete', $shelf->name);
+
+        return response('', 204);
+    }
+}
\ No newline at end of file
index a60fcc1c9a6142d450d318375a930e0fce294994..fadac641ecdb810b916560611029a1b517d3d6fe 100644 (file)
@@ -5,7 +5,7 @@ namespace BookStack\Http\Controllers\Auth;
 use BookStack\Http\Controllers\Controller;
 use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
 use Illuminate\Http\Request;
-use Password;
+use Illuminate\Support\Facades\Password;
 
 class ForgotPasswordController extends Controller
 {
@@ -52,8 +52,8 @@ class ForgotPasswordController extends Controller
             $request->only('email')
         );
 
-        if ($response === Password::RESET_LINK_SENT) {
-            $message = trans('auth.reset_password_sent_success', ['email' => $request->get('email')]);
+        if ($response === Password::RESET_LINK_SENT || $response === Password::INVALID_USER) {
+            $message = trans('auth.reset_password_sent', ['email' => $request->get('email')]);
             $this->showSuccessNotification($message);
             return back()->with('status', trans($response));
         }
index ea584a3b6f0427f92c271fa8924bff4a5796edb9..4660c16d5e9b47899595d47cf35b48cc51cabc47 100644 (file)
@@ -76,6 +76,11 @@ class LoginController extends Controller
             ]);
         }
 
+        $previous = url()->previous('');
+        if (setting('app-public') && $previous && $previous !== url('/login')) {
+            redirect()->setIntendedUrl($previous);
+        }
+
         return view('auth.login', [
           'socialDrivers' => $socialDrivers,
           'authMethod' => $authMethod,
index 214647cd5746a0eff3798a1a9deb1d8803183787..efdf0015924f6d831a0233a737e7209ff246b7e0 100644 (file)
@@ -5,6 +5,7 @@ namespace BookStack\Http\Controllers\Auth;
 use BookStack\Http\Controllers\Controller;
 use Illuminate\Foundation\Auth\ResetsPasswords;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Password;
 
 class ResetPasswordController extends Controller
 {
@@ -49,4 +50,24 @@ class ResetPasswordController extends Controller
         return redirect($this->redirectPath())
             ->with('status', trans($response));
     }
+
+    /**
+     * Get the response for a failed password reset.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  string  $response
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
+     */
+    protected function sendResetFailedResponse(Request $request, $response)
+    {
+        // We show invalid users as invalid tokens as to not leak what
+        // users may exist in the system.
+        if ($response === Password::INVALID_USER) {
+            $response = Password::INVALID_TOKEN;
+        }
+
+        return redirect()->back()
+            ->withInput($request->only('email'))
+            ->withErrors(['email' => trans($response)]);
+    }
 }
index ae7a1bc069cc3a504404cf06d36a1a7da478036f..0c53c92330b2504cece585772131c3147fa9e566 100644 (file)
@@ -123,6 +123,11 @@ class SocialController extends Controller
             'password' => Str::random(32)
         ];
 
+        // Take name from email address if empty
+        if (!$userData['name']) {
+            $userData['name'] = explode('@', $userData['email'])[0];
+        }
+
         $user = $this->registrationService->registerUser($userData, $socialAccount, $emailVerified);
         auth()->login($user);
 
index e7d788d91dde01b78fdd158035fe07fd6cd5f54e..1643c62f980cd151dabd3fedf0031084bd336c78 100644 (file)
@@ -86,7 +86,7 @@ class BookController extends Controller
         $this->validate($request, [
             'name' => 'required|string|max:255',
             'description' => 'string|max:1000',
-            'image' => $this->getImageValidationRules(),
+            'image' => 'nullable|' . $this->getImageValidationRules(),
         ]);
 
         $bookshelf = null;
@@ -114,6 +114,7 @@ class BookController extends Controller
     {
         $book = $this->bookRepo->getBySlug($slug);
         $bookChildren = (new BookContents($book))->getTree(true);
+        $bookParentShelves = $book->shelves()->visible()->get();
 
         Views::add($book);
         if ($request->has('shelf')) {
@@ -125,6 +126,7 @@ class BookController extends Controller
             'book' => $book,
             'current' => $book,
             'bookChildren' => $bookChildren,
+            'bookParentShelves' => $bookParentShelves,
             'activity' => Activity::entityActivity($book, 20, 1)
         ]);
     }
@@ -153,7 +155,7 @@ class BookController extends Controller
         $this->validate($request, [
             'name' => 'required|string|max:255',
             'description' => 'string|max:1000',
-            'image' => $this->getImageValidationRules(),
+            'image' => 'nullable|' . $this->getImageValidationRules(),
         ]);
 
         $book = $this->bookRepo->update($book, $request->all());
index c882ca7c32cf0521053d0afd84d48ab02b1ff7cf..f2cc11c7ba16126eb6f7fef610c8662525d190bf 100644 (file)
@@ -85,7 +85,7 @@ class BookshelfController extends Controller
         $this->validate($request, [
             'name' => 'required|string|max:255',
             'description' => 'string|max:1000',
-            'image' => $this->getImageValidationRules(),
+            'image' => 'nullable|' . $this->getImageValidationRules(),
         ]);
 
         $bookIds = explode(',', $request->get('books', ''));
@@ -107,10 +107,12 @@ class BookshelfController extends Controller
 
         Views::add($shelf);
         $this->entityContextManager->setShelfContext($shelf->id);
+        $view = setting()->getForCurrentUser('bookshelf_view_type', config('app.views.books'));
 
         $this->setPageTitle($shelf->getShortName());
         return view('shelves.show', [
             'shelf' => $shelf,
+            'view' => $view,
             'activity' => Activity::entityActivity($shelf, 20, 1)
         ]);
     }
@@ -146,7 +148,7 @@ class BookshelfController extends Controller
         $this->validate($request, [
             'name' => 'required|string|max:255',
             'description' => 'string|max:1000',
-            'image' => $this->imageRepo->getImageValidationRules(),
+            'image' => 'nullable|' . $this->getImageValidationRules(),
         ]);
 
 
index b9576f2febd7923293b8eacb105bab6130f118c1..2e8e8ed2ee12b005d58f9aab0492ef99dae0a56f 100644 (file)
@@ -195,6 +195,6 @@ abstract class Controller extends BaseController
      */
     protected function getImageValidationRules(): string
     {
-        return 'image_extension|no_double_extension|mimes:jpeg,png,gif,bmp,webp,tiff';
+        return 'image_extension|no_double_extension|mimes:jpeg,png,gif,webp';
     }
 }
index 3595790f71d5e557760601205ba683468c04d531..106dfd63089a6111f042bfc76a32fd4c6ebdde2f 100644 (file)
@@ -4,6 +4,7 @@ namespace BookStack\Http\Controllers\Images;
 
 use BookStack\Exceptions\ImageUploadException;
 use BookStack\Uploads\ImageRepo;
+use Exception;
 use Illuminate\Http\Request;
 use BookStack\Http\Controllers\Controller;
 
@@ -11,10 +12,6 @@ class DrawioImageController extends Controller
 {
     protected $imageRepo;
 
-    /**
-     * DrawioImageController constructor.
-     * @param ImageRepo $imageRepo
-     */
     public function __construct(ImageRepo $imageRepo)
     {
         $this->imageRepo = $imageRepo;
@@ -24,8 +21,6 @@ class DrawioImageController extends Controller
     /**
      * Get a list of gallery images, in a list.
      * Can be paged and filtered by entity.
-     * @param Request $request
-     * @return \Illuminate\Http\JsonResponse
      */
     public function list(Request $request)
     {
@@ -40,9 +35,7 @@ class DrawioImageController extends Controller
 
     /**
      * Store a new gallery image in the system.
-     * @param Request $request
-     * @return Illuminate\Http\JsonResponse
-     * @throws \Exception
+     * @throws Exception
      */
     public function create(Request $request)
     {
@@ -66,8 +59,6 @@ class DrawioImageController extends Controller
 
     /**
      * Get the content of an image based64 encoded.
-     * @param $id
-     * @return \Illuminate\Http\JsonResponse|mixed
      */
     public function getAsBase64($id)
     {
index fd52ffd3fb6eaa30466345b2a08e60c0227ba009..e506215ca43b919a9d79d4b6ba743f33c39e13ca 100644 (file)
@@ -48,7 +48,7 @@ class GalleryImageController extends Controller
     {
         $this->checkPermission('image-create-all');
         $this->validate($request, [
-            'file' => $this->imageRepo->getImageValidationRules()
+            'file' => $this->getImageValidationRules()
         ]);
 
         try {
index 00dd60ac759b5a005522c2e7b2b504a36bfa9107..feb6521f3a69a68bedbe4573d1edfac098da01aa 100644 (file)
@@ -44,7 +44,7 @@ class SettingController extends Controller
         $this->preventAccessInDemoMode();
         $this->checkPermission('settings-manage');
         $this->validate($request, [
-            'app_logo' => $this->imageRepo->getImageValidationRules(),
+            'app_logo' => 'nullable|' . $this->getImageValidationRules(),
         ]);
 
         // Cycles through posted settings and update them
@@ -57,7 +57,7 @@ class SettingController extends Controller
         }
 
         // Update logo image if set
-        if ($request->has('app_logo')) {
+        if ($request->hasFile('app_logo')) {
             $logoFile = $request->file('app_logo');
             $this->imageRepo->destroyByType('system');
             $image = $this->imageRepo->saveNew($logoFile, 'system', 0, null, 86);
index 207466f388fa5e8faaecdca2838f7186d7ca7cf4..43cbad1fb6414baa33c83c1b02a60e2ac75e6ce7 100644 (file)
@@ -7,7 +7,6 @@ use BookStack\Auth\UserRepo;
 use BookStack\Exceptions\UserUpdateException;
 use BookStack\Uploads\ImageRepo;
 use Illuminate\Http\Request;
-use Illuminate\Http\Response;
 use Illuminate\Support\Str;
 
 class UserController extends Controller
@@ -20,10 +19,6 @@ class UserController extends Controller
 
     /**
      * UserController constructor.
-     * @param User $user
-     * @param UserRepo $userRepo
-     * @param UserInviteService $inviteService
-     * @param ImageRepo $imageRepo
      */
     public function __construct(User $user, UserRepo $userRepo, UserInviteService $inviteService, ImageRepo $imageRepo)
     {
@@ -36,8 +31,6 @@ class UserController extends Controller
 
     /**
      * Display a listing of the users.
-     * @param Request $request
-     * @return Response
      */
     public function index(Request $request)
     {
@@ -55,7 +48,6 @@ class UserController extends Controller
 
     /**
      * Show the form for creating a new user.
-     * @return Response
      */
     public function create()
     {
@@ -67,9 +59,8 @@ class UserController extends Controller
 
     /**
      * Store a newly created user in storage.
-     * @param  Request $request
-     * @return Response
      * @throws UserUpdateException
+     * @throws \Illuminate\Validation\ValidationException
      */
     public function store(Request $request)
     {
@@ -138,13 +129,11 @@ class UserController extends Controller
 
     /**
      * Update the specified user in storage.
-     * @param Request $request
-     * @param int $id
-     * @return Response
      * @throws UserUpdateException
      * @throws \BookStack\Exceptions\ImageUploadException
+     * @throws \Illuminate\Validation\ValidationException
      */
-    public function update(Request $request, $id)
+    public function update(Request $request, int $id)
     {
         $this->preventAccessInDemoMode();
         $this->checkPermissionOrCurrentUser('users-manage', $id);
@@ -155,7 +144,7 @@ class UserController extends Controller
             'password'         => 'min:6|required_with:password_confirm',
             'password-confirm' => 'same:password|required_with:password',
             'setting'          => 'array',
-            'profile_image'    => $this->imageRepo->getImageValidationRules(),
+            'profile_image'    => 'nullable|' . $this->getImageValidationRules(),
         ]);
 
         $user = $this->userRepo->getById($id);
@@ -191,7 +180,7 @@ class UserController extends Controller
         }
 
         // Save profile image if in request
-        if ($request->has('profile_image')) {
+        if ($request->hasFile('profile_image')) {
             $imageUpload = $request->file('profile_image');
             $this->imageRepo->destroyImage($user->avatar);
             $image = $this->imageRepo->saveNew($imageUpload, 'user', $user->id);
@@ -212,10 +201,8 @@ class UserController extends Controller
 
     /**
      * Show the user delete page.
-     * @param int $id
-     * @return \Illuminate\View\View
      */
-    public function delete($id)
+    public function delete(int $id)
     {
         $this->checkPermissionOrCurrentUser('users-manage', $id);
 
@@ -226,11 +213,9 @@ class UserController extends Controller
 
     /**
      * Remove the specified user from storage.
-     * @param  int $id
-     * @return Response
      * @throws \Exception
      */
-    public function destroy($id)
+    public function destroy(int $id)
     {
         $this->preventAccessInDemoMode();
         $this->checkPermissionOrCurrentUser('users-manage', $id);
@@ -255,8 +240,6 @@ class UserController extends Controller
 
     /**
      * Show the user profile page
-     * @param $id
-     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
      */
     public function showProfilePage($id)
     {
@@ -276,34 +259,32 @@ class UserController extends Controller
 
     /**
      * Update the user's preferred book-list display setting.
-     * @param Request $request
-     * @param $id
-     * @return \Illuminate\Http\RedirectResponse
      */
-    public function switchBookView(Request $request, $id)
+    public function switchBooksView(Request $request, int $id)
     {
         return $this->switchViewType($id, $request, 'books');
     }
 
     /**
      * Update the user's preferred shelf-list display setting.
-     * @param Request $request
-     * @param $id
-     * @return \Illuminate\Http\RedirectResponse
      */
-    public function switchShelfView(Request $request, $id)
+    public function switchShelvesView(Request $request, int $id)
     {
         return $this->switchViewType($id, $request, 'bookshelves');
     }
 
+    /**
+     * Update the user's preferred shelf-view book list display setting.
+     */
+    public function switchShelfView(Request $request, int $id)
+    {
+        return $this->switchViewType($id, $request, 'bookshelf');
+    }
+
     /**
      * For a type of list, switch with stored view type for a user.
-     * @param integer $userId
-     * @param Request $request
-     * @param string $listName
-     * @return \Illuminate\Http\RedirectResponse
      */
-    protected function switchViewType($userId, Request $request, string $listName)
+    protected function switchViewType(int $userId, Request $request, string $listName)
     {
         $this->checkPermissionOrCurrentUser('users-manage', $userId);
 
@@ -321,10 +302,6 @@ class UserController extends Controller
 
     /**
      * Change the stored sort type for a particular view.
-     * @param Request $request
-     * @param string $id
-     * @param string $type
-     * @return \Illuminate\Http\RedirectResponse
      */
     public function changeSort(Request $request, string $id, string $type)
     {
@@ -337,10 +314,6 @@ class UserController extends Controller
 
     /**
      * Update the stored section expansion preference for the given user.
-     * @param Request $request
-     * @param string $id
-     * @param string $key
-     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
      */
     public function updateExpansionPreference(Request $request, string $id, string $key)
     {
@@ -359,10 +332,6 @@ class UserController extends Controller
 
     /**
      * Changed the stored preference for a list sort order.
-     * @param int $userId
-     * @param Request $request
-     * @param string $listName
-     * @return \Illuminate\Http\RedirectResponse
      */
     protected function changeListSort(int $userId, Request $request, string $listName)
     {
index f36d727253395ff306ed5acf1508b279cd1accb7..d24e8a9b5b88c8f8cb0b08f60a05506942561021 100644 (file)
@@ -11,7 +11,7 @@ class Localization
      * Array of right-to-left locales
      * @var array
      */
-    protected $rtlLocales = ['ar'];
+    protected $rtlLocales = ['ar', 'he'];
 
     /**
      * Map of BookStack locale names to best-estimate system locale names.
@@ -26,16 +26,20 @@ class Localization
         'es' => 'es_ES',
         'es_AR' => 'es_AR',
         'fr' => 'fr_FR',
+        'he' => 'he_IL',
         'it' => 'it_IT',
         'ja' => 'ja',
         'ko' => 'ko_KR',
         'nl' => 'nl_NL',
         'pl' => 'pl_PL',
+        'pt' => 'pl_PT',
         'pt_BR' => 'pt_BR',
         'ru' => 'ru',
         'sk' => 'sk_SK',
+        'sl' => 'sl_SI',
         'sv' => 'sv_SE',
         'uk' => 'uk_UA',
+        'vi' => 'vi_VN',
         'zh_CN' => 'zh_CN',
         'zh_TW' => 'zh_TW',
         'tr' => 'tr_TR',
index 3a1b4f42ee63e02118a72d798d8e837f12499018..1cc3e09c22dc6677a517af03ddbbd0efeb3eac3b 100644 (file)
@@ -34,7 +34,7 @@ class AppServiceProvider extends ServiceProvider
 
         // Custom validation methods
         Validator::extend('image_extension', function ($attribute, $value, $parameters, $validator) {
-            $validImageExtensions = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'tiff', 'webp'];
+            $validImageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'webp'];
             return in_array(strtolower($value->getClientOriginalExtension()), $validImageExtensions);
         });
 
index 01b65f882698933b54f66ba51dcee3f885aaf5cc..b7a21809f18ab7347e44945b8f0933815bf57b7e 100644 (file)
@@ -138,7 +138,7 @@ class ImageRepo
      */
     public function saveDrawing(string $base64Uri, int $uploadedTo): Image
     {
-        $name = 'Drawing-' . user()->getShortName(40) . '-' . strval(time()) . '.png';
+        $name = 'Drawing-' . strval(user()->id) . '-' . strval(time()) . '.png';
         return $this->imageService->saveNewFromBase64Uri($base64Uri, $name, 'drawio', $uploadedTo);
     }
 
@@ -219,12 +219,4 @@ class ImageRepo
             return null;
         }
     }
-
-    /**
-     * Get the validation rules for image files.
-     */
-    public function getImageValidationRules(): string
-    {
-        return 'image_extension|no_double_extension|mimes:jpeg,png,gif,bmp,webp,tiff';
-    }
 }
index 0edf7bae80f854685c3488dce6ced25d60dc5edf..6da651898e3dc56e74f49221c0626f307d47ccea 100644 (file)
@@ -20,7 +20,7 @@
         "gathercontent/htmldiff": "^0.2.1",
         "intervention/image": "^2.5",
         "laravel/framework": "^6.12",
-        "laravel/socialite": "^4.2",
+        "laravel/socialite": "^4.3.2",
         "league/flysystem-aws-s3-v3": "^1.0",
         "onelogin/php-saml": "^3.3",
         "predis/predis": "^1.1",
index c35b3f962e5add9b5f90ede434c13482c6077bb3..fd444ffa83ee07f2ac82bd421ef6c48a243d89a5 100644 (file)
@@ -4,20 +4,20 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "309610dc13c0d46ca7553ee264a88d29",
+    "content-hash": "7836017e48e93254d6ff924b07f84597",
     "packages": [
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.133.6",
+            "version": "3.134.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "cd7bd2fdd159146ef6c7eeb90b73fae4fd11da57"
+                "reference": "3de2711a47e7c3f5e93a5c83f019188fd23f852f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cd7bd2fdd159146ef6c7eeb90b73fae4fd11da57",
-                "reference": "cd7bd2fdd159146ef6c7eeb90b73fae4fd11da57",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3de2711a47e7c3f5e93a5c83f019188fd23f852f",
+                "reference": "3de2711a47e7c3f5e93a5c83f019188fd23f852f",
                 "shasum": ""
             },
             "require": {
                 "s3",
                 "sdk"
             ],
-            "time": "2020-01-24T19:11:35+00:00"
+            "time": "2020-04-03T18:11:51+00:00"
         },
         {
             "name": "barryvdh/laravel-dompdf",
-            "version": "v0.8.5",
+            "version": "v0.8.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-dompdf.git",
-                "reference": "7393732b2f3a3ee357974cbb0c46c9b65b84dad1"
+                "reference": "d7108f78cf5254a2d8c224542967f133e5a6d4e8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/7393732b2f3a3ee357974cbb0c46c9b65b84dad1",
-                "reference": "7393732b2f3a3ee357974cbb0c46c9b65b84dad1",
+                "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/d7108f78cf5254a2d8c224542967f133e5a6d4e8",
+                "reference": "d7108f78cf5254a2d8c224542967f133e5a6d4e8",
                 "shasum": ""
             },
             "require": {
                 "dompdf/dompdf": "^0.8",
-                "illuminate/support": "^5.5|^6",
+                "illuminate/support": "^5.5|^6|^7",
                 "php": ">=7"
             },
             "type": "library",
                 "laravel",
                 "pdf"
             ],
-            "time": "2019-08-23T14:30:33+00:00"
+            "time": "2020-02-25T20:44:34+00:00"
         },
         {
             "name": "barryvdh/laravel-snappy",
-            "version": "v0.4.6",
+            "version": "v0.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-snappy.git",
-                "reference": "94d53c88fa58baa4573c5854663ebc9955f21265"
+                "reference": "c412d0c8f40b1326ba0fb16e94957fd1e68374f0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/94d53c88fa58baa4573c5854663ebc9955f21265",
-                "reference": "94d53c88fa58baa4573c5854663ebc9955f21265",
+                "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/c412d0c8f40b1326ba0fb16e94957fd1e68374f0",
+                "reference": "c412d0c8f40b1326ba0fb16e94957fd1e68374f0",
                 "shasum": ""
             },
             "require": {
-                "illuminate/filesystem": "5.5.x|5.6.x|5.7.x|5.8.x|6.*",
-                "illuminate/support": "5.5.x|5.6.x|5.7.x|5.8.x|6.*",
+                "illuminate/filesystem": "^5.5|^6|^7",
+                "illuminate/support": "^5.5|^6|^7",
                 "knplabs/knp-snappy": "^1",
                 "php": ">=7"
             },
                 "wkhtmltoimage",
                 "wkhtmltopdf"
             ],
-            "time": "2019-10-02T23:27:09+00:00"
+            "time": "2020-02-25T20:52:15+00:00"
         },
         {
             "name": "cogpowered/finediff",
         },
         {
             "name": "dompdf/dompdf",
-            "version": "v0.8.4",
+            "version": "v0.8.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dompdf/dompdf.git",
-                "reference": "8f49b3b01693f51037dd50da81090beba1b5c005"
+                "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8f49b3b01693f51037dd50da81090beba1b5c005",
-                "reference": "8f49b3b01693f51037dd50da81090beba1b5c005",
+                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/6782abfc090b132134cd6cea0ec6d76f0fce2c56",
+                "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
             "homepage": "https://github.com/dompdf/dompdf",
-            "time": "2020-01-20T17:00:46+00:00"
+            "time": "2020-02-20T03:52:51+00:00"
         },
         {
             "name": "dragonmantank/cron-expression",
         },
         {
             "name": "egulias/email-validator",
-            "version": "2.1.15",
+            "version": "2.1.17",
             "source": {
                 "type": "git",
                 "url": "https://github.com/egulias/EmailValidator.git",
-                "reference": "e834eea5306d85d67de5a05db5882911d5b29357"
+                "reference": "ade6887fd9bd74177769645ab5c474824f8a418a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e834eea5306d85d67de5a05db5882911d5b29357",
-                "reference": "e834eea5306d85d67de5a05db5882911d5b29357",
+                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a",
+                "reference": "ade6887fd9bd74177769645ab5c474824f8a418a",
                 "shasum": ""
             },
             "require": {
                 "validation",
                 "validator"
             ],
-            "time": "2020-01-20T21:40:59+00:00"
+            "time": "2020-02-13T22:36:52+00:00"
         },
         {
             "name": "facade/flare-client-php",
-            "version": "1.3.1",
+            "version": "1.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/facade/flare-client-php.git",
-                "reference": "24444ea0e1556f0a4b5fc8e61802caf72ae9a408"
+                "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/facade/flare-client-php/zipball/24444ea0e1556f0a4b5fc8e61802caf72ae9a408",
-                "reference": "24444ea0e1556f0a4b5fc8e61802caf72ae9a408",
+                "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004",
+                "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004",
                 "shasum": ""
             },
             "require": {
                 "facade/ignition-contracts": "~1.0",
-                "illuminate/pipeline": "~5.5|~5.6|~5.7|~5.8|^6.0",
+                "illuminate/pipeline": "^5.5|^6.0|^7.0",
                 "php": "^7.1",
-                "symfony/http-foundation": "~3.3|~4.1",
+                "symfony/http-foundation": "^3.3|^4.1|^5.0",
                 "symfony/var-dumper": "^3.4|^4.0|^5.0"
             },
             "require-dev": {
                 "flare",
                 "reporting"
             ],
-            "time": "2019-12-15T18:28:38+00:00"
+            "time": "2020-03-02T15:52:04+00:00"
         },
         {
             "name": "facade/ignition",
-            "version": "1.16.0",
+            "version": "1.16.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/facade/ignition.git",
-                "reference": "37f094775814b68d0c6cc8b8ff3c3be243f20725"
+                "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/facade/ignition/zipball/37f094775814b68d0c6cc8b8ff3c3be243f20725",
-                "reference": "37f094775814b68d0c6cc8b8ff3c3be243f20725",
+                "url": "https://api.github.com/repos/facade/ignition/zipball/af05ac5ee8587395d7474ec0681c08776a2cb09d",
+                "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "v2.x-dev"
+                    "dev-master": "1.x-dev"
                 },
                 "laravel": {
                     "providers": [
                 "laravel",
                 "page"
             ],
-            "time": "2020-01-21T17:46:02+00:00"
+            "time": "2020-03-05T12:39:07+00:00"
         },
         {
             "name": "facade/ignition-contracts",
         },
         {
             "name": "fideloper/proxy",
-            "version": "4.2.2",
+            "version": "4.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/fideloper/TrustedProxy.git",
-                "reference": "790194d5d3da89a713478875d2e2d05855a90a81"
+                "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/790194d5d3da89a713478875d2e2d05855a90a81",
-                "reference": "790194d5d3da89a713478875d2e2d05855a90a81",
+                "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a",
+                "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a",
                 "shasum": ""
             },
             "require": {
-                "illuminate/contracts": "^5.0|^6.0|^7.0",
+                "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0",
                 "php": ">=5.4.0"
             },
             "require-dev": {
-                "illuminate/http": "^5.0|^6.0|^7.0",
+                "illuminate/http": "^5.0|^6.0|^7.0|^8.0",
                 "mockery/mockery": "^1.0",
                 "phpunit/phpunit": "^6.0"
             },
                 "proxy",
                 "trusted proxy"
             ],
-            "time": "2019-12-20T13:11:11+00:00"
+            "time": "2020-02-22T01:51:47+00:00"
         },
         {
             "name": "filp/whoops",
                     "email": "[email protected]"
                 }
             ],
+            "abandoned": "php-parallel-lint/php-console-color",
             "time": "2018-09-29T17:23:10+00:00"
         },
         {
                 }
             ],
             "description": "Highlight PHP code in terminal",
+            "abandoned": "php-parallel-lint/php-console-highlighter",
             "time": "2018-09-29T18:48:56+00:00"
         },
         {
         },
         {
             "name": "laravel/framework",
-            "version": "v6.12.0",
+            "version": "v6.18.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "8e189a8dee7ff76bf50acb7e80aa1a36afaf54d4"
+                "reference": "4e48acfaba87f08320a2764d36c3b6a4a4112ccf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/8e189a8dee7ff76bf50acb7e80aa1a36afaf54d4",
-                "reference": "8e189a8dee7ff76bf50acb7e80aa1a36afaf54d4",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/4e48acfaba87f08320a2764d36c3b6a4a4112ccf",
+                "reference": "4e48acfaba87f08320a2764d36c3b6a4a4112ccf",
                 "shasum": ""
             },
             "require": {
                 "ext-json": "*",
                 "ext-mbstring": "*",
                 "ext-openssl": "*",
-                "league/commonmark": "^1.1",
-                "league/commonmark-ext-table": "^2.1",
+                "league/commonmark": "^1.3",
                 "league/flysystem": "^1.0.8",
                 "monolog/monolog": "^1.12|^2.0",
                 "nesbot/carbon": "^2.0",
                 "aws/aws-sdk-php": "^3.0",
                 "doctrine/dbal": "^2.6",
                 "filp/whoops": "^2.4",
-                "guzzlehttp/guzzle": "^6.3",
+                "guzzlehttp/guzzle": "^6.3|^7.0",
                 "league/flysystem-cached-adapter": "^1.0",
                 "mockery/mockery": "^1.3.1",
                 "moontoast/math": "^1.1",
                 "ext-memcached": "Required to use the memcache cache driver.",
                 "ext-pcntl": "Required to use all features of the queue worker.",
                 "ext-posix": "Required to use all features of the queue worker.",
-                "ext-redis": "Required to use the Redis cache and queue drivers.",
+                "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
                 "filp/whoops": "Required for friendly error pages in development (^2.4).",
-                "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).",
-                "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0).",
-                "laravel/tinker": "Required to use the tinker console command (^1.0).",
+                "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).",
+                "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0|^7.0).",
+                "laravel/tinker": "Required to use the tinker console command (^2.0).",
                 "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
                 "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
                 "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
                 "framework",
                 "laravel"
             ],
-            "time": "2020-01-21T15:10:03+00:00"
+            "time": "2020-03-24T16:37:50+00:00"
         },
         {
             "name": "laravel/socialite",
-            "version": "v4.3.1",
+            "version": "v4.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/socialite.git",
-                "reference": "2d670d5b100ef2dc72dc578126b2b97985791f52"
+                "reference": "4bd66ee416fea04398dee5b8c32d65719a075db4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/socialite/zipball/2d670d5b100ef2dc72dc578126b2b97985791f52",
-                "reference": "2d670d5b100ef2dc72dc578126b2b97985791f52",
+                "url": "https://api.github.com/repos/laravel/socialite/zipball/4bd66ee416fea04398dee5b8c32d65719a075db4",
+                "reference": "4bd66ee416fea04398dee5b8c32d65719a075db4",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.0-dev"
+                    "dev-master": "4.x-dev"
                 },
                 "laravel": {
                     "providers": [
                 "laravel",
                 "oauth"
             ],
-            "time": "2019-11-26T17:39:15+00:00"
+            "time": "2020-02-04T15:30:01+00:00"
         },
         {
             "name": "league/commonmark",
-            "version": "1.2.2",
+            "version": "1.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/commonmark.git",
-                "reference": "34cf4ddb3892c715ae785c880e6691d839cff88d"
+                "reference": "75542a366ccbe1896ed79fcf3e8e68206d6c4257"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/34cf4ddb3892c715ae785c880e6691d839cff88d",
-                "reference": "34cf4ddb3892c715ae785c880e6691d839cff88d",
+                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/75542a366ccbe1896ed79fcf3e8e68206d6c4257",
+                "reference": "75542a366ccbe1896ed79fcf3e8e68206d6c4257",
                 "shasum": ""
             },
             "require": {
                 "ext-mbstring": "*",
                 "php": "^7.1"
             },
-            "replace": {
-                "colinodell/commonmark-php": "*"
+            "conflict": {
+                "scrutinizer/ocular": "1.7.*"
             },
             "require-dev": {
                 "cebe/markdown": "~1.0",
                 "commonmark/commonmark.js": "0.29.1",
                 "erusev/parsedown": "~1.0",
                 "ext-json": "*",
+                "github/gfm": "0.29.0",
                 "michelf/php-markdown": "~1.4",
                 "mikehaertl/php-shellcommand": "^1.4",
                 "phpstan/phpstan-shim": "^0.11.5",
                 "scrutinizer/ocular": "^1.5",
                 "symfony/finder": "^4.2"
             },
-            "suggest": {
-                "league/commonmark-extras": "Library of useful extensions including smart punctuation"
-            },
             "bin": [
                 "bin/commonmark"
             ],
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3-dev"
+                    "dev-master": "1.4-dev"
                 }
             },
             "autoload": {
                     "role": "Lead Developer"
                 }
             ],
-            "description": "PHP Markdown parser based on the CommonMark spec",
+            "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)",
             "homepage": "https://commonmark.thephpleague.com",
             "keywords": [
                 "commonmark",
+                "flavored",
+                "gfm",
+                "github",
+                "github-flavored",
                 "markdown",
+                "md",
                 "parser"
             ],
-            "time": "2020-01-16T01:18:13+00:00"
-        },
-        {
-            "name": "league/commonmark-ext-table",
-            "version": "v2.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/thephpleague/commonmark-ext-table.git",
-                "reference": "3228888ea69636e855efcf6636ff8e6316933fe7"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/commonmark-ext-table/zipball/3228888ea69636e855efcf6636ff8e6316933fe7",
-                "reference": "3228888ea69636e855efcf6636ff8e6316933fe7",
-                "shasum": ""
-            },
-            "require": {
-                "league/commonmark": "~0.19.3|^1.0",
-                "php": "^7.1"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "^2.14",
-                "phpstan/phpstan": "~0.11",
-                "phpunit/phpunit": "^7.0|^8.0",
-                "symfony/var-dumper": "^4.0",
-                "vimeo/psalm": "^3.0"
-            },
-            "type": "commonmark-extension",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.2-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "League\\CommonMark\\Ext\\Table\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Martin Hasoň",
-                    "email": "[email protected]"
-                },
-                {
-                    "name": "Webuni s.r.o.",
-                    "homepage": "https://www.webuni.cz"
-                },
-                {
-                    "name": "Colin O'Dell",
-                    "email": "[email protected]",
-                    "homepage": "https://www.colinodell.com"
-                }
-            ],
-            "description": "Table extension for league/commonmark",
-            "homepage": "https://github.com/thephpleague/commonmark-ext-table",
-            "keywords": [
-                "commonmark",
-                "extension",
-                "markdown",
-                "table"
-            ],
-            "time": "2019-09-26T13:28:33+00:00"
+            "time": "2020-03-25T19:55:28+00:00"
         },
         {
             "name": "league/flysystem",
-            "version": "1.0.63",
+            "version": "1.0.66",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/flysystem.git",
-                "reference": "8132daec326565036bc8e8d1876f77ec183a7bd6"
+                "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8132daec326565036bc8e8d1876f77ec183a7bd6",
-                "reference": "8132daec326565036bc8e8d1876f77ec183a7bd6",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/021569195e15f8209b1c4bebb78bd66aa4f08c21",
+                "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21",
                 "shasum": ""
             },
             "require": {
             },
             "require-dev": {
                 "phpspec/phpspec": "^3.4",
-                "phpunit/phpunit": "^5.7.10"
+                "phpunit/phpunit": "^5.7.26"
             },
             "suggest": {
                 "ext-fileinfo": "Required for MimeType",
                 "sftp",
                 "storage"
             ],
-            "time": "2020-01-04T16:30:31+00:00"
+            "time": "2020-03-17T18:58:12+00:00"
         },
         {
             "name": "league/flysystem-aws-s3-v3",
-            "version": "1.0.23",
+            "version": "1.0.24",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
-                "reference": "15b0cdeab7240bf8e8bffa85ae5275bbc3692bf4"
+                "reference": "4382036bde5dc926f9b8b337e5bdb15e5ec7b570"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/15b0cdeab7240bf8e8bffa85ae5275bbc3692bf4",
-                "reference": "15b0cdeab7240bf8e8bffa85ae5275bbc3692bf4",
+                "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4382036bde5dc926f9b8b337e5bdb15e5ec7b570",
+                "reference": "4382036bde5dc926f9b8b337e5bdb15e5ec7b570",
                 "shasum": ""
             },
             "require": {
                 }
             ],
             "description": "Flysystem adapter for the AWS S3 SDK v3.x",
-            "time": "2019-06-05T17:18:29+00:00"
+            "time": "2020-02-23T13:31:58+00:00"
         },
         {
             "name": "league/oauth1-client",
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.29.1",
+            "version": "2.32.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "e509be5bf2d703390e69e14496d9a1168452b0a2"
+                "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e509be5bf2d703390e69e14496d9a1168452b0a2",
-                "reference": "e509be5bf2d703390e69e14496d9a1168452b0a2",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
+                "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
                 "shasum": ""
             },
             "require": {
                 "symfony/translation": "^3.4 || ^4.0 || ^5.0"
             },
             "require-dev": {
+                "doctrine/orm": "^2.7",
                 "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
                 "kylekatarnls/multi-tester": "^1.1",
                 "phpmd/phpmd": "^2.8",
                 "datetime",
                 "time"
             ],
-            "time": "2020-01-21T09:36:43+00:00"
+            "time": "2020-03-31T13:43:19+00:00"
         },
         {
             "name": "nunomaduro/collision",
         },
         {
             "name": "phpoption/phpoption",
-            "version": "1.7.2",
+            "version": "1.7.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/schmittjoh/php-option.git",
-                "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959"
+                "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959",
-                "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959",
+                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae",
+                "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9 || ^7.0"
+                "php": "^5.5.9 || ^7.0 || ^8.0"
             },
             "require-dev": {
                 "bamarni/composer-bin-plugin": "^1.3",
                 "php",
                 "type"
             ],
-            "time": "2019-12-15T19:35:24+00:00"
+            "time": "2020-03-21T18:07:53+00:00"
         },
         {
             "name": "predis/predis",
         },
         {
             "name": "psr/log",
-            "version": "1.1.2",
+            "version": "1.1.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/log.git",
-                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
-                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
                 "shasum": ""
             },
             "require": {
                 "psr",
                 "psr-3"
             ],
-            "time": "2019-11-01T11:05:21+00:00"
+            "time": "2020-03-23T09:12:05+00:00"
         },
         {
             "name": "psr/simple-cache",
         },
         {
             "name": "ramsey/uuid",
-            "version": "3.9.2",
+            "version": "3.9.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ramsey/uuid.git",
-                "reference": "7779489a47d443f845271badbdcedfe4df8e06fb"
+                "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ramsey/uuid/zipball/7779489a47d443f845271badbdcedfe4df8e06fb",
-                "reference": "7779489a47d443f845271badbdcedfe4df8e06fb",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92",
+                "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92",
                 "shasum": ""
             },
             "require": {
                 "identifier",
                 "uuid"
             ],
-            "time": "2019-12-17T08:18:51+00:00"
+            "time": "2020-02-21T04:36:14+00:00"
         },
         {
             "name": "robrichards/xmlseclibs",
         },
         {
             "name": "scrivo/highlight.php",
-            "version": "v9.17.1.0",
+            "version": "v9.18.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/scrivo/highlight.php.git",
-                "reference": "5451a9ad6d638559cf2a092880f935c39776134e"
+                "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/5451a9ad6d638559cf2a092880f935c39776134e",
-                "reference": "5451a9ad6d638559cf2a092880f935c39776134e",
+                "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558",
+                "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558",
                 "shasum": ""
             },
             "require": {
             },
             "require-dev": {
                 "phpunit/phpunit": "^4.8|^5.7",
-                "symfony/finder": "^3.4",
-                "symfony/var-dumper": "^3.4"
+                "sabberworm/php-css-parser": "^8.3",
+                "symfony/finder": "^2.8|^3.4",
+                "symfony/var-dumper": "^2.8|^3.4"
             },
             "suggest": {
                 "ext-dom": "Needed to make use of the features in the utilities namespace"
                 "highlight.php",
                 "syntax"
             ],
-            "time": "2019-12-13T21:54:06+00:00"
+            "time": "2020-03-02T05:59:21+00:00"
         },
         {
             "name": "socialiteproviders/discord",
         },
         {
             "name": "socialiteproviders/manager",
-            "version": "v3.4.3",
+            "version": "v3.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/SocialiteProviders/Manager.git",
-                "reference": "09903d33429f9f6c0da32c545c036a3e18964bbf"
+                "reference": "7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/09903d33429f9f6c0da32c545c036a3e18964bbf",
-                "reference": "09903d33429f9f6c0da32c545c036a3e18964bbf",
+                "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570",
+                "reference": "7a5872d9e4b22bb26ecd0c69ea9ddbaad8c0f570",
                 "shasum": ""
             },
             "require": {
-                "illuminate/support": "~5.4|~5.7.0|~5.8.0|^6.0",
+                "illuminate/support": "~5.4|~5.7.0|~5.8.0|^6.0|^7.0",
                 "laravel/socialite": "~3.0|~4.0",
                 "php": "^5.6 || ^7.0"
             },
                 }
             ],
             "description": "Easily add new or override built-in providers in Laravel Socialite.",
-            "time": "2019-09-25T06:06:35+00:00"
+            "time": "2020-03-08T16:54:44+00:00"
         },
         {
             "name": "socialiteproviders/microsoft-azure",
         },
         {
             "name": "symfony/console",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "e9ee09d087e2c88eaf6e5fc0f5c574f64d100e4f"
+                "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/e9ee09d087e2c88eaf6e5fc0f5c574f64d100e4f",
-                "reference": "e9ee09d087e2c88eaf6e5fc0f5c574f64d100e4f",
+                "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
+                "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-10T21:54:01+00:00"
+            "time": "2020-03-30T11:41:10+00:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "a167b1860995b926d279f9bb538f873e3bfa3465"
+                "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/a167b1860995b926d279f9bb538f873e3bfa3465",
-                "reference": "a167b1860995b926d279f9bb538f873e3bfa3465",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/afc26133a6fbdd4f8842e38893e0ee4685c7c94b",
+                "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony CssSelector Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/debug",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/debug.git",
-                "reference": "89c3fd5c299b940333bc6fe9f1b8db1b0912c759"
+                "reference": "346636d2cae417992ecfd761979b2ab98b339a45"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/debug/zipball/89c3fd5c299b940333bc6fe9f1b8db1b0912c759",
-                "reference": "89c3fd5c299b940333bc6fe9f1b8db1b0912c759",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45",
+                "reference": "346636d2cae417992ecfd761979b2ab98b339a45",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony Debug Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-08T17:29:02+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/error-handler",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "a59789092e40ad08465dc2cdc55651be503d0d5a"
+                "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/a59789092e40ad08465dc2cdc55651be503d0d5a",
-                "reference": "a59789092e40ad08465dc2cdc55651be503d0d5a",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/7e9828fc98aa1cf27b422fe478a84f5b0abb7358",
+                "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.1.3",
                 "psr/log": "~1.0",
-                "symfony/debug": "^4.4",
+                "symfony/debug": "^4.4.5",
                 "symfony/var-dumper": "^4.4|^5.0"
             },
             "require-dev": {
             ],
             "description": "Symfony ErrorHandler Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-08T17:29:02+00:00"
+            "time": "2020-03-30T14:07:33+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b"
+                "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9e3de195e5bc301704dd6915df55892f6dfc208b",
-                "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abc8e3618bfdb55e44c8c6a00abd333f831bbfed",
+                "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-10T21:54:01+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
         },
         {
             "name": "symfony/finder",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "3a50be43515590faf812fbd7708200aabc327ec3"
+                "reference": "5729f943f9854c5781984ed4907bbb817735776b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3",
-                "reference": "3a50be43515590faf812fbd7708200aabc327ec3",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b",
+                "reference": "5729f943f9854c5781984ed4907bbb817735776b",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony Finder Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "c33998709f3fe9b8e27e0277535b07fbf6fde37a"
+                "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c33998709f3fe9b8e27e0277535b07fbf6fde37a",
-                "reference": "c33998709f3fe9b8e27e0277535b07fbf6fde37a",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62f92509c9abfd1f73e17b8cf1b72c0bdac6611b",
+                "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony HttpFoundation Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-03-30T14:07:33+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "16f2aa3c54b08483fba5375938f60b1ff83b6bd2"
+                "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/16f2aa3c54b08483fba5375938f60b1ff83b6bd2",
-                "reference": "16f2aa3c54b08483fba5375938f60b1ff83b6bd2",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f356a489e51856b99908005eb7f2c51a1dfc95dc",
+                "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony HttpKernel Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-21T13:23:17+00:00"
+            "time": "2020-03-30T14:59:15+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "225034620ecd4b34fd826e9983d85e2b7a359094"
+                "reference": "6dde9dc70155e91b850b1d009d1f841c54bc4aba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/225034620ecd4b34fd826e9983d85e2b7a359094",
-                "reference": "225034620ecd4b34fd826e9983d85e2b7a359094",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/6dde9dc70155e91b850b1d009d1f841c54bc4aba",
+                "reference": "6dde9dc70155e91b850b1d009d1f841c54bc4aba",
                 "shasum": ""
             },
             "require": {
                 "mime",
                 "mime-type"
             ],
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.13.1",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3"
+                "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
-                "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
+                "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.13-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
                 "polyfill",
                 "portable"
             ],
-            "time": "2019-11-27T13:56:44+00:00"
+            "time": "2020-02-27T09:26:54+00:00"
         },
         {
             "name": "symfony/polyfill-iconv",
-            "version": "v1.13.1",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-iconv.git",
-                "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36"
+                "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/a019efccc03f1a335af6b4f20c30f5ea8060be36",
-                "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36",
+                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/ad6d62792bfbcfc385dd34b424d4fcf9712a32c8",
+                "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.13-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
                 "portable",
                 "shim"
             ],
-            "time": "2019-11-27T13:56:44+00:00"
+            "time": "2020-03-09T19:04:49+00:00"
         },
         {
             "name": "symfony/polyfill-intl-idn",
-            "version": "v1.13.1",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-idn.git",
-                "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46"
+                "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46",
-                "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
+                "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
                 "symfony/polyfill-mbstring": "^1.3",
-                "symfony/polyfill-php72": "^1.9"
+                "symfony/polyfill-php72": "^1.10"
             },
             "suggest": {
                 "ext-intl": "For best performance"
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.13-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
                 "portable",
                 "shim"
             ],
-            "time": "2019-11-27T13:56:44+00:00"
+            "time": "2020-03-09T19:04:49+00:00"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.13.1",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f"
+                "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f",
-                "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
+                "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.13-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
                 "portable",
                 "shim"
             ],
-            "time": "2019-11-27T14:18:11+00:00"
+            "time": "2020-03-09T19:04:49+00:00"
         },
         {
             "name": "symfony/polyfill-php72",
-            "version": "v1.13.1",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php72.git",
-                "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038"
+                "reference": "37b0976c78b94856543260ce09b460a7bc852747"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038",
-                "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747",
+                "reference": "37b0976c78b94856543260ce09b460a7bc852747",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.13-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
                 "portable",
                 "shim"
             ],
-            "time": "2019-11-27T13:56:44+00:00"
+            "time": "2020-02-27T09:26:54+00:00"
         },
         {
             "name": "symfony/polyfill-php73",
-            "version": "v1.13.1",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php73.git",
-                "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f"
+                "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f",
-                "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
+                "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.13-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
                 "portable",
                 "shim"
             ],
-            "time": "2019-11-27T16:25:15+00:00"
+            "time": "2020-02-27T09:26:54+00:00"
         },
         {
             "name": "symfony/process",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36"
+                "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/f5697ab4cb14a5deed7473819e63141bf5352c36",
-                "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36",
+                "url": "https://api.github.com/repos/symfony/process/zipball/3e40e87a20eaf83a1db825e1fa5097ae89042db3",
+                "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-09T09:50:08+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a"
+                "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/7bf4e38573728e317b926ca4482ad30470d0e86a",
-                "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/0f562fa613e288d7dbae6c63abbc9b33ed75a8f8",
+                "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8",
                 "shasum": ""
             },
             "require": {
                 "uri",
                 "url"
             ],
-            "time": "2020-01-08T17:29:02+00:00"
+            "time": "2020-03-30T11:41:10+00:00"
         },
         {
             "name": "symfony/service-contracts",
         },
         {
             "name": "symfony/translation",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c"
+                "reference": "4e54d336f2eca5facad449d0b0118bb449375b76"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/f5d2ac46930238b30a9c2f1b17c905f3697d808c",
-                "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/4e54d336f2eca5facad449d0b0118bb449375b76",
+                "reference": "4e54d336f2eca5facad449d0b0118bb449375b76",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony Translation Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-15T13:29:06+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/translation-contracts",
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "7cfa470bc3b1887a7b2a47c0a702a84ad614fa92"
+                "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7cfa470bc3b1887a7b2a47c0a702a84ad614fa92",
-                "reference": "7cfa470bc3b1887a7b2a47c0a702a84ad614fa92",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5a0c2d93006131a36cf6f767d10e2ca8333b0d4a",
+                "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a",
                 "shasum": ""
             },
             "require": {
                 "debug",
                 "dump"
             ],
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
         },
         {
             "name": "vlucas/phpdotenv",
-            "version": "v3.6.0",
+            "version": "v3.6.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/vlucas/phpdotenv.git",
-                "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156"
+                "reference": "786a947e57086cf236cefdee80784634224b99fa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1bdf24f065975594f6a117f0f1f6cabf1333b156",
-                "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156",
+                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/786a947e57086cf236cefdee80784634224b99fa",
+                "reference": "786a947e57086cf236cefdee80784634224b99fa",
                 "shasum": ""
             },
             "require": {
                 "symfony/polyfill-ctype": "^1.9"
             },
             "require-dev": {
+                "ext-filter": "*",
+                "ext-pcre": "*",
                 "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
             },
+            "suggest": {
+                "ext-filter": "Required to use the boolean validator.",
+                "ext-pcre": "Required to use most of the library."
+            },
             "type": "library",
             "extra": {
                 "branch-alias": {
                 "env",
                 "environment"
             ],
-            "time": "2019-09-10T21:37:39+00:00"
+            "time": "2020-03-27T23:36:02+00:00"
         }
     ],
     "packages-dev": [
         {
             "name": "barryvdh/laravel-debugbar",
-            "version": "v3.2.8",
+            "version": "v3.2.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-debugbar.git",
-                "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0"
+                "reference": "42d5da5379a7860093f8e4032167e4cb5ebec180"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/18208d64897ab732f6c04a19b319fe8f1d57a9c0",
-                "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0",
+                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/42d5da5379a7860093f8e4032167e4cb5ebec180",
+                "reference": "42d5da5379a7860093f8e4032167e4cb5ebec180",
                 "shasum": ""
             },
             "require": {
-                "illuminate/routing": "^5.5|^6",
-                "illuminate/session": "^5.5|^6",
-                "illuminate/support": "^5.5|^6",
-                "maximebf/debugbar": "~1.15.0",
+                "illuminate/routing": "^5.5|^6|^7",
+                "illuminate/session": "^5.5|^6|^7",
+                "illuminate/support": "^5.5|^6|^7",
+                "maximebf/debugbar": "^1.15.1",
                 "php": ">=7.0",
-                "symfony/debug": "^3|^4",
-                "symfony/finder": "^3|^4"
+                "symfony/debug": "^3|^4|^5",
+                "symfony/finder": "^3|^4|^5"
             },
             "require-dev": {
                 "laravel/framework": "5.5.x"
                 "profiler",
                 "webprofiler"
             ],
-            "time": "2019-08-29T07:01:03+00:00"
+            "time": "2020-02-25T20:42:23+00:00"
         },
         {
             "name": "barryvdh/laravel-ide-helper",
-            "version": "v2.6.6",
+            "version": "v2.6.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-ide-helper.git",
-                "reference": "b91b959364d97af658f268c733c75dccdbff197e"
+                "reference": "edd69c5e0508972c81f1f7173236de2459c45814"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/b91b959364d97af658f268c733c75dccdbff197e",
-                "reference": "b91b959364d97af658f268c733c75dccdbff197e",
+                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/edd69c5e0508972c81f1f7173236de2459c45814",
+                "reference": "edd69c5e0508972c81f1f7173236de2459c45814",
                 "shasum": ""
             },
             "require": {
                 "barryvdh/reflection-docblock": "^2.0.6",
                 "composer/composer": "^1.6",
                 "doctrine/dbal": "~2.3",
-                "illuminate/console": "^5.5|^6",
-                "illuminate/filesystem": "^5.5|^6",
-                "illuminate/support": "^5.5|^6",
-                "php": ">=7"
+                "illuminate/console": "^5.5|^6|^7",
+                "illuminate/filesystem": "^5.5|^6|^7",
+                "illuminate/support": "^5.5|^6|^7",
+                "php": ">=7.2"
             },
             "require-dev": {
-                "illuminate/config": "^5.5|^6",
-                "illuminate/view": "^5.5|^6",
-                "phpro/grumphp": "^0.14",
-                "phpunit/phpunit": "4.*",
-                "scrutinizer/ocular": "~1.1",
+                "illuminate/config": "^5.5|^6|^7",
+                "illuminate/view": "^5.5|^6|^7",
+                "mockery/mockery": "^1.3",
+                "orchestra/testbench": "^3|^4",
+                "phpro/grumphp": "^0.17.1",
                 "squizlabs/php_codesniffer": "^3"
             },
             "type": "library",
                 "phpstorm",
                 "sublime"
             ],
-            "time": "2019-10-30T20:53:27+00:00"
+            "time": "2020-02-25T20:41:32+00:00"
         },
         {
             "name": "barryvdh/reflection-docblock",
         },
         {
             "name": "composer/composer",
-            "version": "1.9.2",
+            "version": "1.10.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/composer.git",
-                "reference": "7a04aa0201ddaa0b3cf64d41022bd8cdcd7fafeb"
+                "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/composer/zipball/7a04aa0201ddaa0b3cf64d41022bd8cdcd7fafeb",
-                "reference": "7a04aa0201ddaa0b3cf64d41022bd8cdcd7fafeb",
+                "url": "https://api.github.com/repos/composer/composer/zipball/b912a45da3e2b22f5cb5a23e441b697a295ba011",
+                "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011",
                 "shasum": ""
             },
             "require": {
                 "psr/log": "^1.0",
                 "seld/jsonlint": "^1.4",
                 "seld/phar-utils": "^1.0",
-                "symfony/console": "^2.7 || ^3.0 || ^4.0",
-                "symfony/filesystem": "^2.7 || ^3.0 || ^4.0",
-                "symfony/finder": "^2.7 || ^3.0 || ^4.0",
-                "symfony/process": "^2.7 || ^3.0 || ^4.0"
+                "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0"
             },
             "conflict": {
                 "symfony/console": "2.8.38"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7",
-                "phpunit/phpunit-mock-objects": "^2.3 || ^3.0"
+                "phpspec/prophecy": "^1.10",
+                "symfony/phpunit-bridge": "^3.4"
             },
             "suggest": {
                 "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.9-dev"
+                    "dev-master": "1.10-dev"
                 }
             },
             "autoload": {
                 "dependency",
                 "package"
             ],
-            "time": "2020-01-14T15:30:32+00:00"
+            "time": "2020-03-13T19:34:27+00:00"
         },
         {
             "name": "composer/semver",
         },
         {
             "name": "composer/spdx-licenses",
-            "version": "1.5.2",
+            "version": "1.5.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/spdx-licenses.git",
-                "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5"
+                "reference": "0c3e51e1880ca149682332770e25977c70cf9dae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5",
-                "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5",
+                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae",
+                "reference": "0c3e51e1880ca149682332770e25977c70cf9dae",
                 "shasum": ""
             },
             "require": {
                 "spdx",
                 "validator"
             ],
-            "time": "2019-07-29T10:31:59+00:00"
+            "time": "2020-02-14T07:44:31+00:00"
         },
         {
             "name": "composer/xdebug-handler",
-            "version": "1.4.0",
+            "version": "1.4.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/xdebug-handler.git",
-                "reference": "cbe23383749496fe0f373345208b79568e4bc248"
+                "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248",
-                "reference": "cbe23383749496fe0f373345208b79568e4bc248",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7",
+                "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7",
                 "shasum": ""
             },
             "require": {
                 "Xdebug",
                 "performance"
             ],
-            "time": "2019-11-06T16:40:04+00:00"
+            "time": "2020-03-01T12:26:26+00:00"
         },
         {
             "name": "doctrine/instantiator",
         },
         {
             "name": "maximebf/debugbar",
-            "version": "v1.15.1",
+            "version": "v1.16.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/maximebf/php-debugbar.git",
-                "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e"
+                "reference": "58998b818c6567fac01e35b8a4b70c1a64530556"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/6c4277f6117e4864966c9cb58fb835cee8c74a1e",
-                "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e",
+                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/58998b818c6567fac01e35b8a4b70c1a64530556",
+                "reference": "58998b818c6567fac01e35b8a4b70c1a64530556",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
+                "php": "^7.1",
                 "psr/log": "^1.0",
-                "symfony/var-dumper": "^2.6|^3|^4"
+                "symfony/var-dumper": "^2.6|^3|^4|^5"
             },
             "require-dev": {
                 "phpunit/phpunit": "^5"
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.15-dev"
+                    "dev-master": "1.16-dev"
                 }
             },
             "autoload": {
                 "debug",
                 "debugbar"
             ],
-            "time": "2019-09-24T14:55:42+00:00"
+            "time": "2019-11-24T09:46:11+00:00"
         },
         {
             "name": "mockery/mockery",
         },
         {
             "name": "phpdocumentor/reflection-docblock",
-            "version": "4.3.4",
+            "version": "5.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
+                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
-                "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
+                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0",
-                "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
-                "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
-                "webmozart/assert": "^1.0"
+                "ext-filter": "^7.1",
+                "php": "^7.2",
+                "phpdocumentor/reflection-common": "^2.0",
+                "phpdocumentor/type-resolver": "^1.0",
+                "webmozart/assert": "^1"
             },
             "require-dev": {
-                "doctrine/instantiator": "^1.0.5",
-                "mockery/mockery": "^1.0",
-                "phpdocumentor/type-resolver": "0.4.*",
-                "phpunit/phpunit": "^6.4"
+                "doctrine/instantiator": "^1",
+                "mockery/mockery": "^1"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.x-dev"
+                    "dev-master": "5.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "phpDocumentor\\Reflection\\": [
-                        "src/"
-                    ]
+                    "phpDocumentor\\Reflection\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
                 {
                     "name": "Mike van Riel",
                     "email": "[email protected]"
+                },
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "[email protected]"
                 }
             ],
             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
-            "time": "2019-12-28T18:55:12+00:00"
+            "time": "2020-02-22T12:28:44+00:00"
         },
         {
             "name": "phpdocumentor/type-resolver",
-            "version": "1.0.1",
+            "version": "1.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
-                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
+                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
-                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
+                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1",
+                "php": "^7.2",
                 "phpdocumentor/reflection-common": "^2.0"
             },
             "require-dev": {
-                "ext-tokenizer": "^7.1",
-                "mockery/mockery": "~1",
-                "phpunit/phpunit": "^7.0"
+                "ext-tokenizer": "^7.2",
+                "mockery/mockery": "~1"
             },
             "type": "library",
             "extra": {
                 }
             ],
             "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
-            "time": "2019-08-22T18:11:29+00:00"
+            "time": "2020-02-18T18:59:58+00:00"
         },
         {
             "name": "phploc/phploc",
         },
         {
             "name": "phpspec/prophecy",
-            "version": "v1.10.2",
+            "version": "v1.10.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9"
+                "reference": "451c3cd1418cf640de218914901e51b064abb093"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
-                "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+                "reference": "451c3cd1418cf640de218914901e51b064abb093",
                 "shasum": ""
             },
             "require": {
                 "spy",
                 "stub"
             ],
-            "time": "2020-01-20T15:57:02+00:00"
+            "time": "2020-03-05T15:02:03+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
         },
         {
             "name": "phpunit/phpunit",
-            "version": "8.5.2",
+            "version": "8.5.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0"
+                "reference": "67750516bc02f300e2742fed2f50177f8f37bedf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
-                "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/67750516bc02f300e2742fed2f50177f8f37bedf",
+                "reference": "67750516bc02f300e2742fed2f50177f8f37bedf",
                 "shasum": ""
             },
             "require": {
                 "testing",
                 "xunit"
             ],
-            "time": "2020-01-08T08:49:49+00:00"
+            "time": "2020-03-31T08:52:04+00:00"
         },
         {
             "name": "sebastian/code-unit-reverse-lookup",
         },
         {
             "name": "seld/phar-utils",
-            "version": "1.0.2",
+            "version": "1.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Seldaek/phar-utils.git",
-                "reference": "84715761c35808076b00908a20317a3a8a67d17e"
+                "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/84715761c35808076b00908a20317a3a8a67d17e",
-                "reference": "84715761c35808076b00908a20317a3a8a67d17e",
+                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0",
+                "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "PHAR file format utilities, for when PHP phars you up",
             "keywords": [
-                "phra"
+                "phar"
             ],
-            "time": "2020-01-13T10:41:09+00:00"
+            "time": "2020-02-14T15:25:33+00:00"
         },
         {
             "name": "squizlabs/php_codesniffer",
-            "version": "3.5.3",
+            "version": "3.5.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
-                "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb"
+                "reference": "dceec07328401de6211037abbb18bda423677e26"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/557a1fc7ac702c66b0bbfe16ab3d55839ef724cb",
-                "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb",
+                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dceec07328401de6211037abbb18bda423677e26",
+                "reference": "dceec07328401de6211037abbb18bda423677e26",
                 "shasum": ""
             },
             "require": {
                 "phpcs",
                 "standards"
             ],
-            "time": "2019-12-04T04:46:47+00:00"
+            "time": "2020-01-30T22:20:29+00:00"
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dom-crawler.git",
-                "reference": "b66fe8ccc850ea11c4cd31677706c1219768bea1"
+                "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b66fe8ccc850ea11c4cd31677706c1219768bea1",
-                "reference": "b66fe8ccc850ea11c4cd31677706c1219768bea1",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4d0fb3374324071ecdd94898367a3fa4b5563162",
+                "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony DomCrawler Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-03-29T19:12:22+00:00"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v4.4.3",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd"
+                "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/266c9540b475f26122b61ef8b23dd9198f5d1cfd",
-                "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/fe297193bf2e6866ed900ed2d5869362768df6a7",
+                "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Symfony Filesystem Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-21T08:20:44+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "theseer/fdomdocument",
         },
         {
             "name": "webmozart/assert",
-            "version": "1.6.0",
+            "version": "1.7.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/webmozart/assert.git",
-                "reference": "573381c0a64f155a0d9a23f4b0c797194805b925"
+                "reference": "aed98a490f9a8f78468232db345ab9cf606cf598"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925",
-                "reference": "573381c0a64f155a0d9a23f4b0c797194805b925",
+                "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598",
+                "reference": "aed98a490f9a8f78468232db345ab9cf606cf598",
                 "shasum": ""
             },
             "require": {
                 "check",
                 "validate"
             ],
-            "time": "2019-11-24T13:36:37+00:00"
+            "time": "2020-02-14T12:15:55+00:00"
         },
         {
             "name": "wnx/laravel-stats",
-            "version": "v2.0.0",
+            "version": "v2.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/stefanzweifel/laravel-stats.git",
-                "reference": "1b3c60bfbf81233973cbc2a63be4e6f83b2d6205"
+                "reference": "e86ebfdd149383b18a41fe3efa1601d82d447140"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/stefanzweifel/laravel-stats/zipball/1b3c60bfbf81233973cbc2a63be4e6f83b2d6205",
-                "reference": "1b3c60bfbf81233973cbc2a63be4e6f83b2d6205",
+                "url": "https://api.github.com/repos/stefanzweifel/laravel-stats/zipball/e86ebfdd149383b18a41fe3efa1601d82d447140",
+                "reference": "e86ebfdd149383b18a41fe3efa1601d82d447140",
                 "shasum": ""
             },
             "require": {
-                "illuminate/console": "~5.8.0|^6.0",
-                "illuminate/support": "~5.8.0|^6.0",
+                "illuminate/console": "~5.8.0|^6.0|^7.0",
+                "illuminate/support": "~5.8.0|^6.0|^7.0",
                 "php": ">=7.2.0",
-                "phploc/phploc": "~4.0|~5.0",
-                "symfony/finder": "~3.3|~4.0"
+                "phploc/phploc": "~5.0|~6.0",
+                "symfony/finder": "~4.0"
             },
             "require-dev": {
-                "laravel/browser-kit-testing": "~2.0|~3.0|~4.0|~5.0",
-                "laravel/dusk": "~3.0|~4.0|~5.0",
+                "friendsofphp/php-cs-fixer": "^2.15",
+                "laravel/browser-kit-testing": "~5.0",
+                "laravel/dusk": "~5.0",
                 "mockery/mockery": "^1.1",
-                "orchestra/testbench": "^3.8",
-                "phpunit/phpunit": "6.*|7.*|8.*"
+                "orchestra/testbench": "^3.8|^4.0|^5.0",
+                "phpunit/phpunit": "8.*|9.*"
             },
             "type": "library",
             "extra": {
                 "stats",
                 "wnx"
             ],
-            "time": "2019-09-01T14:18:49+00:00"
+            "time": "2020-02-22T19:09:14+00:00"
         }
     ],
     "aliases": [],
diff --git a/dev/api/requests/shelves-create.json b/dev/api/requests/shelves-create.json
new file mode 100644 (file)
index 0000000..39b88af
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "name": "My shelf",
+  "description": "This is my shelf with some books",
+  "books": [5,1,3]
+}
\ No newline at end of file
diff --git a/dev/api/requests/shelves-update.json b/dev/api/requests/shelves-update.json
new file mode 100644 (file)
index 0000000..df5f573
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "name": "My updated shelf",
+  "description": "This is my update shelf with some books",
+  "books": [5,1,3]
+}
\ No newline at end of file
index e0570444ff732d3496b9d39d4ea8a52368331c6f..11408e9ab2df3251081a9cffaf8adf35a16b6c6d 100644 (file)
@@ -8,15 +8,11 @@
   "created_by": {
     "id": 1,
     "name": "Admin",
-    "created_at": "2019-05-05 21:15:13",
-    "updated_at": "2019-12-16 12:18:37",
     "image_id": 48
   },
   "updated_by": {
     "id": 1,
     "name": "Admin",
-    "created_at": "2019-05-05 21:15:13",
-    "updated_at": "2019-12-16 12:18:37",
     "image_id": 48
   },
   "image_id": 452,
diff --git a/dev/api/responses/shelves-create.json b/dev/api/responses/shelves-create.json
new file mode 100644 (file)
index 0000000..64f3c7f
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "name": "My shelf",
+  "description": "This is my shelf with some books",
+  "created_by": 1,
+  "updated_by": 1,
+  "slug": "my-shelf",
+  "updated_at": "2020-04-10 13:24:09",
+  "created_at": "2020-04-10 13:24:09",
+  "id": 14
+}
\ No newline at end of file
diff --git a/dev/api/responses/shelves-list.json b/dev/api/responses/shelves-list.json
new file mode 100644 (file)
index 0000000..bccd086
--- /dev/null
@@ -0,0 +1,38 @@
+{
+  "data": [
+    {
+      "id": 8,
+      "name": "Qui qui aspernatur autem molestiae libero necessitatibus molestias.",
+      "slug": "qui-qui-aspernatur-autem-molestiae-libero-necessitatibus-molestias",
+      "description": "Enim dolor ut quia error dolores est. Aut distinctio consequuntur non nisi nostrum. Labore cupiditate error labore aliquid provident impedit voluptatibus. Quaerat impedit excepturi eius qui eius voluptatem reiciendis.",
+      "created_at": "2019-05-05 22:10:16",
+      "updated_at": "2020-04-10 13:00:45",
+      "created_by": 4,
+      "updated_by": 1,
+      "image_id": 31
+    },
+    {
+      "id": 9,
+      "name": "Ipsum aut inventore fuga libero non facilis.",
+      "slug": "ipsum-aut-inventore-fuga-libero-non-facilis",
+      "description": "Labore culpa modi perspiciatis harum sit. Maxime non et nam est. Quae ut laboriosam repellendus sunt quisquam. Velit at est perspiciatis nesciunt adipisci nobis illo. Sed possimus odit optio officiis nisi voluptates officiis dolor.",
+      "created_at": "2019-05-05 22:10:16",
+      "updated_at": "2020-04-10 13:00:58",
+      "created_by": 4,
+      "updated_by": 1,
+      "image_id": 28
+    },
+    {
+      "id": 10,
+      "name": "Omnis reiciendis aut molestias sint accusantium.",
+      "slug": "omnis-reiciendis-aut-molestias-sint-accusantium",
+      "description": "Qui ea occaecati alias est dolores voluptatem doloribus. Ad reiciendis corporis vero nostrum omnis et. Non doloribus ut eaque ut quos dolores.",
+      "created_at": "2019-05-05 22:10:16",
+      "updated_at": "2020-04-10 13:00:53",
+      "created_by": 4,
+      "updated_by": 1,
+      "image_id": 30
+    }
+  ],
+  "total": 3
+}
\ No newline at end of file
diff --git a/dev/api/responses/shelves-read.json b/dev/api/responses/shelves-read.json
new file mode 100644 (file)
index 0000000..8a8e234
--- /dev/null
@@ -0,0 +1,60 @@
+{
+  "id": 14,
+  "name": "My shelf",
+  "slug": "my-shelf",
+  "description": "This is my shelf with some books",
+  "created_by": {
+    "id": 1,
+    "name": "Admin",
+    "image_id": 48
+  },
+  "updated_by": {
+    "id": 1,
+    "name": "Admin",
+    "image_id": 48
+  },
+  "image_id": 501,
+  "created_at": "2020-04-10 13:24:09",
+  "updated_at": "2020-04-10 13:31:04",
+  "tags": [
+    {
+      "id": 16,
+      "entity_id": 14,
+      "entity_type": "BookStack\\Bookshelf",
+      "name": "Category",
+      "value": "Guide",
+      "order": 0,
+      "created_at": "2020-04-10 13:31:04",
+      "updated_at": "2020-04-10 13:31:04"
+    }
+  ],
+  "cover": {
+    "id": 501,
+    "name": "anafrancisconi_Sp04AfFCPNM.jpg",
+    "url": "http://bookstack.local/uploads/images/cover_book/2020-04/anafrancisconi_Sp04AfFCPNM.jpg",
+    "created_at": "2020-04-10 13:31:04",
+    "updated_at": "2020-04-10 13:31:04",
+    "created_by": 1,
+    "updated_by": 1,
+    "path": "/uploads/images/cover_book/2020-04/anafrancisconi_Sp04AfFCPNM.jpg",
+    "type": "cover_book",
+    "uploaded_to": 14
+  },
+  "books": [
+    {
+      "id": 5,
+      "name": "Sint explicabo alias sunt.",
+      "slug": "jbsQrzuaXe"
+    },
+    {
+      "id": 1,
+      "name": "BookStack User Guide",
+      "slug": "bookstack-user-guide"
+    },
+    {
+      "id": 3,
+      "name": "Molestiae doloribus sint velit suscipit dolorem.",
+      "slug": "H99QxALaoG"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/dev/api/responses/shelves-update.json b/dev/api/responses/shelves-update.json
new file mode 100644 (file)
index 0000000..4820150
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "id": 14,
+  "name": "My updated shelf",
+  "slug": "my-updated-shelf",
+  "description": "This is my update shelf with some books",
+  "created_by": 1,
+  "updated_by": 1,
+  "image_id": 501,
+  "created_at": "2020-04-10 13:24:09",
+  "updated_at": "2020-04-10 13:48:22"
+}
\ No newline at end of file
index 7142eebd2017ae05e97337083371e779f4c4b20f..243a19a9b71d71a084d8f59f08deea5fc3590a7d 100644 (file)
   "lockfileVersion": 1,
   "dependencies": {
     "@webassemblyjs/ast": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
-      "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/helper-module-context": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/wast-parser": "1.8.5"
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
       }
     },
     "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
-      "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
       "dev": true
     },
     "@webassemblyjs/helper-api-error": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
-      "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
       "dev": true
     },
     "@webassemblyjs/helper-buffer": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
-      "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
       "dev": true
     },
     "@webassemblyjs/helper-code-frame": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
-      "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/wast-printer": "1.8.5"
+        "@webassemblyjs/wast-printer": "1.9.0"
       }
     },
     "@webassemblyjs/helper-fsm": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
-      "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
       "dev": true
     },
     "@webassemblyjs/helper-module-context": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
-      "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "mamacro": "^0.0.3"
+        "@webassemblyjs/ast": "1.9.0"
       }
     },
     "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
-      "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
       "dev": true
     },
     "@webassemblyjs/helper-wasm-section": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
-      "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-buffer": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/wasm-gen": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
       }
     },
     "@webassemblyjs/ieee754": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
-      "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
       "dev": true,
       "requires": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
     "@webassemblyjs/leb128": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
-      "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
       "dev": true,
       "requires": {
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/utf8": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
-      "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
       "dev": true
     },
     "@webassemblyjs/wasm-edit": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
-      "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-buffer": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/helper-wasm-section": "1.8.5",
-        "@webassemblyjs/wasm-gen": "1.8.5",
-        "@webassemblyjs/wasm-opt": "1.8.5",
-        "@webassemblyjs/wasm-parser": "1.8.5",
-        "@webassemblyjs/wast-printer": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
       }
     },
     "@webassemblyjs/wasm-gen": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
-      "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/ieee754": "1.8.5",
-        "@webassemblyjs/leb128": "1.8.5",
-        "@webassemblyjs/utf8": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
       }
     },
     "@webassemblyjs/wasm-opt": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
-      "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-buffer": "1.8.5",
-        "@webassemblyjs/wasm-gen": "1.8.5",
-        "@webassemblyjs/wasm-parser": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
       }
     },
     "@webassemblyjs/wasm-parser": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
-      "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-api-error": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/ieee754": "1.8.5",
-        "@webassemblyjs/leb128": "1.8.5",
-        "@webassemblyjs/utf8": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
       }
     },
     "@webassemblyjs/wast-parser": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
-      "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/floating-point-hex-parser": "1.8.5",
-        "@webassemblyjs/helper-api-error": "1.8.5",
-        "@webassemblyjs/helper-code-frame": "1.8.5",
-        "@webassemblyjs/helper-fsm": "1.8.5",
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/wast-printer": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
-      "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/wast-parser": "1.8.5",
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
     },
       "dev": true
     },
     "acorn": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz",
-      "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==",
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+      "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
       "dev": true
     },
     "ajv": {
       }
     },
     "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
       "dev": true,
       "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
       }
     },
     "aproba": {
       "dev": true
     },
     "aws4": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz",
-      "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
+      "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
       "dev": true
     },
     "balanced-match": {
       "dev": true
     },
     "binary-extensions": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
+      "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
       "dev": true
     },
-    "bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
     "block-stream": {
       "version": "0.0.9",
       "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
       }
     },
     "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dev": true,
       "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
+        "fill-range": "^7.0.1"
       }
     },
     "brorand": {
       "dev": true
     },
     "cacache": {
-      "version": "12.0.3",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
-      "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+      "version": "12.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
       "dev": true,
       "requires": {
         "bluebird": "^3.5.5",
       }
     },
     "chokidar": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
+      "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
       "dev": true,
       "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "fsevents": "^1.2.7",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.1.2",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.3.0"
       }
     },
     "chownr": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
-      "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
       "dev": true
     },
     "chrome-trace-event": {
       }
     },
     "clipboard": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz",
-      "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==",
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
+      "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
       "requires": {
         "good-listener": "^1.2.2",
         "select": "^1.1.2",
       "dev": true
     },
     "codemirror": {
-      "version": "5.50.0",
-      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.50.0.tgz",
-      "integrity": "sha512-32LAmGcBNhKtJP4WGgkcaCVQDyChAyaWA6jasg778ziZzo3PWBuhpAQIJMO8//Id45RoaLyXjuhcRUBoS8Vg+Q=="
+      "version": "5.52.2",
+      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.52.2.tgz",
+      "integrity": "sha512-WCGCixNUck2HGvY8/ZNI1jYfxPG5cRHv0VjmWuNzbtCLz8qYA5d+je4QhSSCtCaagyeOwMi/HmmPTjBgiTm2lQ=="
     },
     "collection-visit": {
       "version": "1.0.0",
       }
     },
     "css-loader": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.0.tgz",
-      "integrity": "sha512-JornYo4RAXl1Mzt0lOSVPmArzAMV3rGY2VuwtaDc732WTWjdwTaeS19nCGWMcSCf305Q396lhhDAJEWWM0SgPQ==",
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz",
+      "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==",
       "dev": true,
       "requires": {
         "camelcase": "^5.3.1",
       "dev": true
     },
     "dropzone": {
-      "version": "5.5.1",
-      "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.5.1.tgz",
-      "integrity": "sha512-3VduRWLxx9hbVr42QieQN25mx/I61/mRdUSuxAmDGdDqZIN8qtP7tcKMa3KfpJjuGjOJGYYUzzeq6eGDnkzesA=="
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.7.0.tgz",
+      "integrity": "sha512-kOltiZXH5cO/72I22JjE+w6BoT6uaVLfWdFMsi1PMKFkU6BZWpqRwjnsRm0o6ANGTBuZar5Piu7m/CbKqRPiYg=="
     },
     "duplexify": {
       "version": "3.7.1",
       "dev": true
     },
     "events": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
-      "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
+      "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==",
       "dev": true
     },
     "evp_bytestokey": {
       "dev": true
     },
     "figgy-pudding": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
-      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
       "dev": true
     },
-    "file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true,
-      "optional": true
-    },
     "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
       "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
+        "to-regex-range": "^5.0.1"
       }
     },
     "find-cache-dir": {
       "dev": true
     },
     "fsevents": {
-      "version": "1.2.11",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz",
-      "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+      "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+      "dev": true,
+      "optional": true
+    },
+    "fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "requires": {
+        "globule": "^1.0.0"
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+      "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "global-modules": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "bindings": "^1.5.0",
-        "nan": "^2.12.1",
-        "node-pre-gyp": "*"
+        "global-prefix": "^3.0.0"
       },
       "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.1.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "3.2.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "deep-extend": {
-          "version": "0.6.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.7",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.6.0"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.6",
-          "bundled": true,
+        "global-prefix": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
           "dev": true,
-          "optional": true,
           "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
+            "ini": "^1.3.5",
+            "kind-of": "^6.0.2",
+            "which": "^1.3.1"
           }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minipass": {
-          "version": "2.9.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.3.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.9.0"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.4.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "^3.2.6",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.14.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.1",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.2.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4.4.2"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "npm-normalize-package-bin": "^1.0.1"
-          }
-        },
-        "npm-normalize-package-bin": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.4.7",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.6.0",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.7.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.7.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.13",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.1.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.8.6",
-            "minizlib": "^1.2.1",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.3"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2 || 2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
         }
       }
     },
-    "fstream": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
-      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
       "dev": true,
       "requires": {
-        "graceful-fs": "^4.1.2",
-        "inherits": "~2.0.0",
-        "mkdirp": ">=0.5 0",
-        "rimraf": "2"
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
       }
     },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+    "globule": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz",
+      "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==",
       "dev": true,
       "requires": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
+        "glob": "~7.1.1",
+        "lodash": "~4.17.12",
+        "minimatch": "~3.0.2"
       }
     },
-    "gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
       "requires": {
-        "globule": "^1.0.0"
+        "delegate": "^3.1.2"
       }
     },
-    "get-caller-file": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "requires": {
-        "pump": "^3.0.0"
-      }
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "global-modules": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^3.0.0"
-      },
-      "dependencies": {
-        "global-prefix": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
-          "dev": true,
-          "requires": {
-            "ini": "^1.3.5",
-            "kind-of": "^6.0.2",
-            "which": "^1.3.1"
-          }
-        }
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      }
-    },
-    "globule": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz",
-      "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==",
-      "dev": true,
-      "requires": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      }
-    },
-    "good-listener": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
-      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
-      "requires": {
-        "delegate": "^3.1.2"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
       "dev": true
     },
     "har-schema": {
         "kind-of": "^4.0.0"
       },
       "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
         "kind-of": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
       "dev": true
     },
     "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
       "requires": {
-        "binary-extensions": "^1.0.0"
+        "binary-extensions": "^2.0.0"
       }
     },
     "is-buffer": {
       "dev": true
     },
     "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
     },
     "is-fullwidth-code-point": {
       "version": "1.0.0",
       }
     },
     "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
     },
     "is-plain-obj": {
       "version": "1.1.0",
       "dev": true
     },
     "js-base64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
-      "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz",
+      "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==",
       "dev": true
     },
     "jsbn": {
       }
     },
     "kind-of": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true
     },
     "lcid": {
       }
     },
     "livereload": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.8.2.tgz",
-      "integrity": "sha512-8wCvhiCL4cGVoT3U5xoe+UjpiiVZLrlOvr6dbhb1VlyC5QarhrlyRRt4z7EMGO4KSgXj+tKF/dr284F28/wI+g==",
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz",
+      "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==",
       "dev": true,
       "requires": {
-        "chokidar": "^2.1.5",
+        "chokidar": "^3.3.0",
+        "livereload-js": "^3.1.0",
         "opts": ">= 1.2.0",
         "ws": "^6.2.1"
       }
     },
+    "livereload-js": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz",
+      "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==",
+      "dev": true
+    },
     "load-json-file": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
         }
       }
     },
-    "mamacro": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
-      "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
-      "dev": true
-    },
     "map-age-cleaner": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
         "regex-not": "^1.0.0",
         "snapdragon": "^0.8.1",
         "to-regex": "^3.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
       }
     },
     "miller-rabin": {
       }
     },
     "mime-db": {
-      "version": "1.42.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
-      "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
+      "version": "1.43.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+      "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.25",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
-      "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
+      "version": "2.1.26",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+      "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
       "dev": true,
       "requires": {
-        "mime-db": "1.42.0"
+        "mime-db": "1.43.0"
       }
     },
     "mimic-fn": {
       }
     },
     "minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
       "dev": true
     },
     "mississippi": {
       }
     },
     "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "dev": true,
       "requires": {
-        "minimist": "0.0.8"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true
-        }
+        "minimist": "^1.2.5"
       }
     },
     "move-concurrently": {
       }
     },
     "node-sass": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz",
-      "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz",
+      "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==",
       "dev": true,
       "requires": {
         "async-foreach": "^0.1.3",
       "dev": true
     },
     "p-limit": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-      "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+      "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
       "dev": true,
       "requires": {
         "p-try": "^2.0.0"
       "dev": true
     },
     "pako": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
-      "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
       "dev": true
     },
     "parallel-transform": {
       "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
       "dev": true
     },
+    "picomatch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
+      "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
+      "dev": true
+    },
     "pidtree": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
       "dev": true
     },
     "postcss": {
-      "version": "7.0.25",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.25.tgz",
-      "integrity": "sha512-NXXVvWq9icrm/TgQC0O6YVFi4StfJz46M1iNd/h6B26Nvh/HKI+q4YZtFN/EjcInZliEscO/WL10BXnc1E5nwg==",
+      "version": "7.0.27",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
+      "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
       }
     },
     "postcss-value-parser": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz",
-      "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
+      "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
       "dev": true
     },
     "prepend-http": {
       "dev": true
     },
     "psl": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz",
-      "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
+      "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==",
       "dev": true
     },
     "public-encrypt": {
       }
     },
     "readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
       }
     },
     "readdirp": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
+      "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
       "dev": true,
       "requires": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
+        "picomatch": "^2.0.7"
       }
     },
     "redent": {
       }
     },
     "request": {
-      "version": "2.88.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
-      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
       "dev": true,
       "requires": {
         "aws-sign2": "~0.7.0",
         "extend": "~3.0.2",
         "forever-agent": "~0.6.1",
         "form-data": "~2.3.2",
-        "har-validator": "~5.1.0",
+        "har-validator": "~5.1.3",
         "http-signature": "~1.2.0",
         "is-typedarray": "~1.0.0",
         "isstream": "~0.1.2",
         "performance-now": "^2.1.0",
         "qs": "~6.5.2",
         "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.4.3",
+        "tough-cookie": "~2.5.0",
         "tunnel-agent": "^0.6.0",
         "uuid": "^3.3.2"
       }
       }
     },
     "sass-loader": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz",
-      "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==",
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
+      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
       "dev": true,
       "requires": {
         "clone-deep": "^4.0.1",
         "loader-utils": "^1.2.3",
         "neo-async": "^2.6.1",
-        "schema-utils": "^2.1.0",
+        "schema-utils": "^2.6.1",
         "semver": "^6.3.0"
       },
       "dependencies": {
       }
     },
     "schema-utils": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz",
-      "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==",
+      "version": "2.6.5",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
+      "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
       "dev": true,
       "requires": {
-        "ajv": "^6.10.2",
+        "ajv": "^6.12.0",
         "ajv-keywords": "^3.4.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+          "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+          "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+          "dev": true
+        }
       }
     },
     "scss-tokenizer": {
       }
     },
     "sortablejs": {
-      "version": "1.10.1",
-      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.1.tgz",
-      "integrity": "sha512-N6r7GrVmO8RW1rn0cTdvK3JR0BcqecAJ0PmYMCL3ZuqTH3pY+9QyqkmJSkkLyyDvd+AJnwaxTP22Ybr/83V9hQ=="
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
     },
     "source-list-map": {
       "version": "2.0.1",
       "dev": true
     },
     "source-map-resolve": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
-      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
       "dev": true,
       "requires": {
-        "atob": "^2.1.1",
+        "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0",
         "resolve-url": "^0.2.1",
         "source-map-url": "^0.4.0",
       }
     },
     "style-loader": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.1.tgz",
-      "integrity": "sha512-oIVF12trRq0od4Yojg7q0K3Lq/O6Ix/AYgVosykrVg+kWxxxUyk8KhKCCmekyGSUiVK1xxlAQymLWWdh6S9lOg==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz",
+      "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==",
       "dev": true,
       "requires": {
         "loader-utils": "^1.2.3",
-        "schema-utils": "^2.0.1"
+        "schema-utils": "^2.6.4"
       }
     },
     "supports-color": {
       }
     },
     "terser": {
-      "version": "4.4.3",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.3.tgz",
-      "integrity": "sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA==",
+      "version": "4.6.10",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz",
+      "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
       }
     },
     "tiny-emitter": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz",
-      "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
     },
     "to-arraybuffer": {
       "version": "1.0.1",
       }
     },
     "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
       "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
+        "is-number": "^7.0.0"
       }
     },
     "tough-cookie": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
-      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
       "dev": true,
       "requires": {
-        "psl": "^1.1.24",
-        "punycode": "^1.4.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
       }
     },
     "trim-newlines": {
       }
     },
     "tslib": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
-      "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
+      "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
       "dev": true
     },
     "tty-browserify": {
           "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
           "dev": true,
           "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "dev": true
+    },
+    "v8-compile-cache": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
+      "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
+      "dev": true
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true
+    },
+    "vue": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz",
+      "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ=="
+    },
+    "vuedraggable": {
+      "version": "2.23.2",
+      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.2.tgz",
+      "integrity": "sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==",
+      "requires": {
+        "sortablejs": "^1.10.1"
+      }
+    },
+    "watchpack": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz",
+      "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^2.1.8",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.12",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
+          "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "nan": "^2.12.1",
+            "node-pre-gyp": "*"
+          },
+          "dependencies": {
+            "abbrev": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "ansi-regex": {
+              "version": "2.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "aproba": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "are-we-there-yet": {
+              "version": "1.1.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^2.0.6"
+              }
+            },
+            "balanced-match": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "brace-expansion": {
+              "version": "1.1.11",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+              }
+            },
+            "chownr": {
+              "version": "1.1.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "code-point-at": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "concat-map": {
+              "version": "0.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "console-control-strings": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "core-util-is": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "debug": {
+              "version": "3.2.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ms": "^2.1.1"
+              }
+            },
+            "deep-extend": {
+              "version": "0.6.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "delegates": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "detect-libc": {
+              "version": "1.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "fs-minipass": {
+              "version": "1.2.7",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.6.0"
+              }
+            },
+            "fs.realpath": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "gauge": {
+              "version": "2.7.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "aproba": "^1.0.3",
+                "console-control-strings": "^1.0.0",
+                "has-unicode": "^2.0.0",
+                "object-assign": "^4.1.0",
+                "signal-exit": "^3.0.0",
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wide-align": "^1.1.0"
+              }
+            },
+            "glob": {
+              "version": "7.1.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            },
+            "has-unicode": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "iconv-lite": {
+              "version": "0.4.24",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safer-buffer": ">= 2.1.2 < 3"
+              }
+            },
+            "ignore-walk": {
+              "version": "3.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minimatch": "^3.0.4"
+              }
+            },
+            "inflight": {
+              "version": "1.0.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+              }
+            },
+            "inherits": {
+              "version": "2.0.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "ini": {
+              "version": "1.3.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "number-is-nan": "^1.0.0"
+              }
+            },
+            "isarray": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "minimatch": {
+              "version": "3.0.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "brace-expansion": "^1.1.7"
+              }
+            },
+            "minimist": {
+              "version": "1.2.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "minipass": {
+              "version": "2.9.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safe-buffer": "^5.1.2",
+                "yallist": "^3.0.0"
+              }
+            },
+            "minizlib": {
+              "version": "1.3.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.9.0"
+              }
+            },
+            "mkdirp": {
+              "version": "0.5.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minimist": "^1.2.5"
+              }
+            },
+            "ms": {
+              "version": "2.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "needle": {
+              "version": "2.3.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "debug": "^3.2.6",
+                "iconv-lite": "^0.4.4",
+                "sax": "^1.2.4"
+              }
+            },
+            "node-pre-gyp": {
+              "version": "0.14.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "detect-libc": "^1.0.2",
+                "mkdirp": "^0.5.1",
+                "needle": "^2.2.1",
+                "nopt": "^4.0.1",
+                "npm-packlist": "^1.1.6",
+                "npmlog": "^4.0.2",
+                "rc": "^1.2.7",
+                "rimraf": "^2.6.1",
+                "semver": "^5.3.0",
+                "tar": "^4.4.2"
+              }
+            },
+            "nopt": {
+              "version": "4.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "abbrev": "1",
+                "osenv": "^0.1.4"
+              }
+            },
+            "npm-bundled": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "npm-normalize-package-bin": "^1.0.1"
+              }
+            },
+            "npm-normalize-package-bin": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "npm-packlist": {
+              "version": "1.4.8",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ignore-walk": "^3.0.1",
+                "npm-bundled": "^1.0.1",
+                "npm-normalize-package-bin": "^1.0.1"
+              }
+            },
+            "npmlog": {
+              "version": "4.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "are-we-there-yet": "~1.1.2",
+                "console-control-strings": "~1.1.0",
+                "gauge": "~2.7.3",
+                "set-blocking": "~2.0.0"
+              }
+            },
+            "number-is-nan": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "object-assign": {
+              "version": "4.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "once": {
+              "version": "1.4.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "wrappy": "1"
+              }
+            },
+            "os-homedir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "os-tmpdir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "osenv": {
+              "version": "0.1.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "os-homedir": "^1.0.0",
+                "os-tmpdir": "^1.0.0"
+              }
+            },
+            "path-is-absolute": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "process-nextick-args": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "rc": {
+              "version": "1.2.8",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+              }
+            },
+            "readable-stream": {
+              "version": "2.3.7",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+              }
+            },
+            "rimraf": {
+              "version": "2.7.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "glob": "^7.1.3"
+              }
+            },
+            "safe-buffer": {
+              "version": "5.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "safer-buffer": {
+              "version": "2.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "sax": {
+              "version": "1.2.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "semver": {
+              "version": "5.7.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "set-blocking": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "signal-exit": {
+              "version": "3.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            },
+            "string_decoder": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safe-buffer": "~5.1.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "3.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ansi-regex": "^2.0.0"
+              }
+            },
+            "strip-json-comments": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "tar": {
+              "version": "4.4.13",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "chownr": "^1.1.1",
+                "fs-minipass": "^1.2.5",
+                "minipass": "^2.8.6",
+                "minizlib": "^1.2.1",
+                "mkdirp": "^0.5.0",
+                "safe-buffer": "^5.1.2",
+                "yallist": "^3.0.3"
+              }
+            },
+            "util-deprecate": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "wide-align": {
+              "version": "1.1.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "string-width": "^1.0.2 || 2"
+              }
+            },
+            "wrappy": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "yallist": {
+              "version": "3.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           },
           "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
               "dev": true,
               "requires": {
-                "isarray": "1.0.0"
+                "is-extglob": "^2.1.0"
               }
             }
           }
         },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        }
-      }
-    },
-    "upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
-        }
-      }
-    },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
-    },
-    "util": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
-      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
-      "dev": true,
-      "requires": {
-        "inherits": "2.0.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
         }
       }
     },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "uuid": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
-      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
-      "dev": true
-    },
-    "v8-compile-cache": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
-      "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
-      "dev": true
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
-      "dev": true
-    },
-    "vue": {
-      "version": "2.6.11",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz",
-      "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ=="
-    },
-    "vuedraggable": {
-      "version": "2.23.2",
-      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.2.tgz",
-      "integrity": "sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==",
-      "requires": {
-        "sortablejs": "^1.10.1"
-      }
-    },
-    "watchpack": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
-      "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
-      "dev": true,
-      "requires": {
-        "chokidar": "^2.0.2",
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
-      }
-    },
     "webpack": {
-      "version": "4.41.4",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.4.tgz",
-      "integrity": "sha512-Lc+2uB6NjpCWsHI3trkoISOI64h9QYIXenbEWj3bn3oyjfB1lEBXjWAfAyY2sM0rZn41oD5V91OLwKRwS6Wp8Q==",
+      "version": "4.42.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz",
+      "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-module-context": "1.8.5",
-        "@webassemblyjs/wasm-edit": "1.8.5",
-        "@webassemblyjs/wasm-parser": "1.8.5",
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
         "acorn": "^6.2.1",
         "ajv": "^6.10.2",
         "ajv-keywords": "^3.4.1",
         "loader-utils": "^1.2.3",
         "memory-fs": "^0.4.1",
         "micromatch": "^3.1.10",
-        "mkdirp": "^0.5.1",
+        "mkdirp": "^0.5.3",
         "neo-async": "^2.6.1",
         "node-libs-browser": "^2.2.1",
         "schema-utils": "^1.0.0",
         "webpack-sources": "^1.4.1"
       },
       "dependencies": {
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
         "schema-utils": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
       }
     },
     "webpack-cli": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz",
-      "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==",
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz",
+      "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==",
       "dev": true,
       "requires": {
         "chalk": "2.4.2",
           }
         },
         "yargs-parser": {
-          "version": "13.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
-          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
           "dev": true,
           "requires": {
             "camelcase": "^5.0.0",
index 8877cb9e8d332524eff4f7a1fb966191c789e458..a05851987d10486b08901e55e9b82e9b4fbfa08e 100644 (file)
     "permissions": "chown -R $USER:$USER bootstrap/cache storage public/uploads"
   },
   "devDependencies": {
-    "css-loader": "^3.4.0",
-    "livereload": "^0.8.2",
+    "css-loader": "^3.4.2",
+    "livereload": "^0.9.1",
     "mini-css-extract-plugin": "^0.9.0",
-    "node-sass": "^4.13.0",
+    "node-sass": "^4.13.1",
     "npm-run-all": "^4.1.5",
-    "sass-loader": "^8.0.0",
-    "style-loader": "^1.1.1",
-    "webpack": "^4.41.4",
-    "webpack-cli": "^3.3.10"
+    "sass-loader": "^8.0.2",
+    "style-loader": "^1.1.3",
+    "webpack": "^4.42.1",
+    "webpack-cli": "^3.3.11"
   },
   "dependencies": {
-    "clipboard": "^2.0.4",
-    "codemirror": "^5.50.0",
-    "dropzone": "^5.5.1",
+    "clipboard": "^2.0.6",
+    "codemirror": "^5.52.2",
+    "dropzone": "^5.7.0",
     "markdown-it": "^10.0.0",
     "markdown-it-task-lists": "^2.1.1",
-    "sortablejs": "^1.10.1",
+    "sortablejs": "^1.10.2",
     "vue": "^2.6.11",
     "vuedraggable": "^2.23.2"
   },
index 0d55354ec6fb756086be2bcace7be11078064f29..abe87b39de7a73abd817cedd264d3c1f7b9ec17b 100644 (file)
@@ -5,6 +5,10 @@
 
     RewriteEngine On
 
+    # Handle Authorization Header
+    RewriteCond %{HTTP:Authorization} .
+    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
     # Redirect Trailing Slashes If Not A Folder...
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^(.*)/$ /$1 [L,R=301]
index 5b51b8eab5180b4469ef6d5a5f287762d7d8be85..2c68d094c1e5c20c3dc1167072db1c7eb1b2d5e5 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -13,6 +13,8 @@ A platform for storing and organising information and documentation. Details for
 * [Demo Instance](https://demo.bookstackapp.com)
     * [Admin Login](https://demo.bookstackapp.com/[email protected]&password=password)
 * [BookStack Blog](https://www.bookstackapp.com/blog)
+* [Issue List](https://github.com/BookStackApp/BookStack/issues)
+* [Discord Chat](https://discord.gg/ztkBqR2)
 
 ## 📚 Project Definition
 
@@ -49,7 +51,7 @@ All development on BookStack is currently done on the master branch. When it's t
 
 * [Node.js](https://nodejs.org/en/) v10.0+
 
-SASS is used to help the CSS development and the JavaScript is run through babel to allow for writing ES6 code. This is done using webpack. To run the build task you can use the following commands:
+This project uses SASS for CSS development and this is built, along with the JavaScript, using webpack. The below npm commands can be used to install the dependencies & run the build tasks:
 
 ``` bash
 # Install NPM Dependencies
@@ -78,7 +80,7 @@ Once done you can run `php vendor/bin/phpunit` in the application root directory
 
 ### 📜 Code Standards
 
-PHP code within BookStack is generally to [PSR-2](http://www.php-fig.org/psr/psr-2/) standards. From the BookStack root folder you can run `./vendor/bin/phpcs` to check code is formatted correctly and `./vendor/bin/phpcbf` to auto-fix non-PSR-2 code.
+PHP code within BookStack is generally to [PSR-2](http://www.php-fig.org/psr/psr-2/) standards. From the BookStack root folder you can run `./vendor/bin/phpcs` to check code is formatted correctly and `./vendor/bin/phpcbf` to auto-fix non-PSR-2 code. Please don't auto-fix code unless it's related to changes you've made otherwise you'll likely cause git conflicts.
 
 ### 🐋 Development using Docker
 
@@ -118,7 +120,9 @@ Please note, translations in BookStack are provided to the "Crowdin Global Trans
 
 Feel free to create issues to request new features or to report bugs & problems. Just please follow the template given when creating the issue.
 
-Pull requests are welcome. Unless a small tweak or language update, It may be best to open the pull request early or create an issue for your intended change to discuss how it will fit in to the project and plan out the merge. Pull requests should be created from the `master` branch since they will be merged back into `master` once done. Please do not build from or request a merge into the `release` branch as this is only for publishing releases. If you are looking to alter CSS or JavaScript content please edit the source files found in `resources/assets`. Any CSS or JS files within `public` are built from these source files and therefore should not be edited directly.
+Pull requests are welcome. Unless a small tweak or language update, It may be best to open the pull request early or create an issue for your intended change to discuss how it will fit in to the project and plan out the merge. Just because a feature request exists, or is tagged, does not mean that feature would be accepted into the core project.
+
+Pull requests should be created from the `master` branch since they will be merged back into `master` once done. Please do not build from or request a merge into the `release` branch as this is only for publishing releases. If you are looking to alter CSS or JavaScript content please edit the source files found in `resources/assets`. Any CSS or JS files within `public` are built from these source files and therefore should not be edited directly.
 
 The project's code of conduct [can be found here](https://github.com/BookStackApp/BookStack/blob/master/.github/CODE_OF_CONDUCT.md).
 
index 4de1e239b93b3747bd7474ad188d7684b62dfb9e..367c956ce3b7b757c28cefc6140c1ea19c794d35 100644 (file)
@@ -11,6 +11,7 @@ class DropDown {
         this.menu = elem.querySelector('.dropdown-menu, [dropdown-menu]');
         this.moveMenu = elem.hasAttribute('dropdown-move-menu');
         this.toggle = elem.querySelector('[dropdown-toggle]');
+        this.direction = (document.dir === 'rtl') ? 'right' : 'left';
         this.body = document.body;
         this.showing = false;
         this.setupListeners();
@@ -28,7 +29,11 @@ class DropDown {
             this.rect = this.menu.getBoundingClientRect();
             this.body.appendChild(this.menu);
             this.menu.style.position = 'fixed';
-            this.menu.style.left = `${this.rect.left}px`;
+            if (this.direction === 'right') {
+                this.menu.style.right = `${(this.rect.right - this.rect.width)}px`;
+            } else {
+                this.menu.style.left = `${this.rect.left}px`;
+            }
             this.menu.style.top = `${this.rect.top}px`;
             this.menu.style.width = `${this.rect.width}px`;
         }
@@ -67,7 +72,7 @@ class DropDown {
         this.toggle.setAttribute('aria-expanded', 'false');
         if (this.moveMenu) {
             this.menu.style.position = '';
-            this.menu.style.left = '';
+            this.menu.style[this.direction] = '';
             this.menu.style.top = '';
             this.menu.style.width = '';
             this.container.appendChild(this.menu);
index 25d6bde47aa9771b2fef3fbff890f51121dd0809..f88cb765104d617095bdf0fd95f9d9a24a24cc78 100644 (file)
@@ -411,17 +411,23 @@ class MarkdownEditor {
         });
     }
 
+    getDrawioUrl() {
+        const drawioUrlElem = document.querySelector('[drawio-url]');
+        return drawioUrlElem ? drawioUrlElem.getAttribute('drawio-url') : false;
+    }
+
     // Show draw.io if enabled and handle save.
     actionStartDrawing() {
-        if (document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') !== 'true') return;
-        let cursorPos = this.cm.getCursor('from');
+        const url = this.getDrawioUrl();
+        if (!url) return;
+
+        const cursorPos = this.cm.getCursor('from');
 
-        DrawIO.show(() => {
+        DrawIO.show(url,() => {
             return Promise.resolve('');
         }, (pngData) => {
-            // let id = "image-" + Math.random().toString(16).slice(2);
-            // let loadingImage = window.baseUrl('/loading.gif');
-            let data = {
+
+            const data = {
                 image: pngData,
                 uploaded_to: Number(document.getElementById('page-editor').getAttribute('page-id'))
             };
@@ -445,15 +451,15 @@ class MarkdownEditor {
 
     // Show draw.io if enabled and handle save.
     actionEditDrawing(imgContainer) {
-        const drawingDisabled = document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') !== 'true';
-        if (drawingDisabled) {
+        const drawioUrl = this.getDrawioUrl();
+        if (!drawioUrl) {
             return;
         }
 
         const cursorPos = this.cm.getCursor('from');
         const drawingId = imgContainer.getAttribute('drawio-diagram');
 
-        DrawIO.show(() => {
+        DrawIO.show(drawioUrl, () => {
             return DrawIO.load(drawingId);
         }, (pngData) => {
 
index f7edb08aa1327fda20c76728f2fb8add65119b60..35bab4ea656b1c052e875fac2bcdf0e4ef27d268 100644 (file)
@@ -28,7 +28,11 @@ class Notification {
             this.elem.classList.add('showing');
         }, 1);
 
-        if (this.autohide) setTimeout(this.hide.bind(this), 2000);
+        if (this.autohide) {
+            const words = textToShow.split(' ').length;
+            const timeToShow = Math.max(2000, 1000 + (250 * words));
+            setTimeout(this.hide.bind(this), timeToShow);
+        }
     }
 
     hide() {
index d004a43076e2e788aa3983f08283eb304ee212a2..f8b19a40c86c5baf51d4239e887c55beba97c48b 100644 (file)
@@ -56,6 +56,10 @@ class TemplateManager {
 
     setupSearchBox() {
         const searchBox = this.elem.querySelector('.search-box');
+
+        // Search box may not exist if there are no existing templates in the system.
+        if (!searchBox) return;
+
         const input = searchBox.querySelector('input');
         const submitButton = searchBox.querySelector('button');
         const cancelButton = searchBox.querySelector('button.search-box-cancel');
@@ -70,7 +74,7 @@ class TemplateManager {
         }
         performSearch = performSearch.bind(this);
 
-        // Searchbox enter press
+        // Search box enter press
         searchBox.addEventListener('keypress', event => {
             if (event.key === 'Enter') {
                 event.preventDefault();
index 7818db260317c5feecba40af955496886baf6096..be1bac6be23a861ec796c1e199099f5c07e17159 100644 (file)
@@ -139,19 +139,21 @@ function codePlugin() {
     }
 
     function showPopup(editor) {
-        let selectedNode = editor.selection.getNode();
+        const selectedNode = editor.selection.getNode();
 
         if (!elemIsCodeBlock(selectedNode)) {
-            let providedCode = editor.selection.getNode().textContent;
+            const providedCode = editor.selection.getNode().textContent;
             window.vues['code-editor'].open(providedCode, '', (code, lang) => {
-                let wrap = document.createElement('div');
+                const wrap = document.createElement('div');
                 wrap.innerHTML = `<pre><code class="language-${lang}"></code></pre>`;
                 wrap.querySelector('code').innerText = code;
 
                 editor.formatter.toggle('pre');
-                let node = editor.selection.getNode();
+                const node = editor.selection.getNode();
                 editor.dom.setHTML(node, wrap.querySelector('pre').innerHTML);
                 editor.fire('SetContent');
+
+                editor.focus()
             });
             return;
         }
@@ -160,15 +162,17 @@ function codePlugin() {
         let currentCode = selectedNode.querySelector('textarea').textContent;
 
         window.vues['code-editor'].open(currentCode, lang, (code, lang) => {
-            let editorElem = selectedNode.querySelector('.CodeMirror');
-            let cmInstance = editorElem.CodeMirror;
+            const editorElem = selectedNode.querySelector('.CodeMirror');
+            const cmInstance = editorElem.CodeMirror;
             if (cmInstance) {
                 Code.setContent(cmInstance, code);
                 Code.setMode(cmInstance, lang, code);
             }
-            let textArea = selectedNode.querySelector('textarea');
+            const textArea = selectedNode.querySelector('textarea');
             if (textArea) textArea.textContent = code;
             selectedNode.setAttribute('data-lang', lang);
+
+            editor.focus()
         });
     }
 
@@ -238,7 +242,7 @@ function codePlugin() {
     });
 }
 
-function drawIoPlugin() {
+function drawIoPlugin(drawioUrl) {
 
     let pageEditor = null;
     let currentNode = null;
@@ -266,7 +270,7 @@ function drawIoPlugin() {
     function showDrawingEditor(mceEditor, selectedNode = null) {
         pageEditor = mceEditor;
         currentNode = selectedNode;
-        DrawIO.show(drawingInit, updateContent);
+        DrawIO.show(drawioUrl, drawingInit, updateContent);
     }
 
     async function updateContent(pngData) {
@@ -423,10 +427,14 @@ class WysiwygEditor {
     loadPlugins() {
         codePlugin();
         customHrPlugin();
-        if (document.querySelector('[drawio-enabled]').getAttribute('drawio-enabled') === 'true') {
-            drawIoPlugin();
+
+        const drawioUrlElem = document.querySelector('[drawio-url]');
+        if (drawioUrlElem) {
+            const url = drawioUrlElem.getAttribute('drawio-url');
+            drawIoPlugin(url);
             this.plugins += ' drawio';
         }
+
         if (this.textDirection === 'rtl') {
             this.plugins += ' directionality'
         }
@@ -500,7 +508,15 @@ class WysiwygEditor {
                         const originalField = win.document.getElementById(field_name);
                         originalField.value = entity.link;
                         const mceForm = originalField.closest('.mce-form');
-                        mceForm.querySelectorAll('input')[2].value = entity.name;
+                        const inputs = mceForm.querySelectorAll('input');
+
+                        // Set text to display if not empty
+                        if (!inputs[1].value) {
+                            inputs[1].value = entity.name;
+                        }
+
+                        // Set title field
+                        inputs[2].value = entity.name;
                     });
                 }
 
index a8cede5f4447787c8721c071c4214a0add48883e..14801de9c9aaec93cf89d8955c36d947ff2a68bb 100644 (file)
@@ -5,15 +5,18 @@ import Clipboard from "clipboard/dist/clipboard.min";
 import 'codemirror/mode/css/css';
 import 'codemirror/mode/clike/clike';
 import 'codemirror/mode/diff/diff';
+import 'codemirror/mode/fortran/fortran';
 import 'codemirror/mode/go/go';
+import 'codemirror/mode/haskell/haskell';
 import 'codemirror/mode/htmlmixed/htmlmixed';
 import 'codemirror/mode/javascript/javascript';
 import 'codemirror/mode/julia/julia';
 import 'codemirror/mode/lua/lua';
-import 'codemirror/mode/haskell/haskell';
 import 'codemirror/mode/markdown/markdown';
 import 'codemirror/mode/mllike/mllike';
 import 'codemirror/mode/nginx/nginx';
+import 'codemirror/mode/perl/perl';
+import 'codemirror/mode/pascal/pascal';
 import 'codemirror/mode/php/php';
 import 'codemirror/mode/powershell/powershell';
 import 'codemirror/mode/properties/properties';
@@ -25,7 +28,6 @@ import 'codemirror/mode/sql/sql';
 import 'codemirror/mode/toml/toml';
 import 'codemirror/mode/xml/xml';
 import 'codemirror/mode/yaml/yaml';
-import 'codemirror/mode/pascal/pascal';
 
 // Addons
 import 'codemirror/addon/scroll/scrollpastend';
@@ -43,6 +45,8 @@ const modeMap = {
     'c#': 'text/x-csharp',
     csharp: 'text/x-csharp',
     diff: 'diff',
+    for: 'fortran',
+    fortran: 'fortran',
     go: 'go',
     haskell: 'haskell',
     hs: 'haskell',
@@ -59,6 +63,8 @@ const modeMap = {
     markdown: 'markdown',
     ml: 'mllike',
     nginx: 'nginx',
+    perl: 'perl',
+    pl: 'perl',
     powershell: 'powershell',
     properties: 'properties',
     ocaml: 'mllike',
index a570737d11f5bcc0d77964d46fc03a93ab41bd96..17e57cd6b9165d567aa09f48197ea95e8b62551f 100644 (file)
@@ -1,22 +1,21 @@
-
-const drawIoUrl = 'https://www.draw.io/?embed=1&ui=atlas&spin=1&proto=json';
 let iFrame = null;
 
 let onInit, onSave;
 
 /**
  * Show the draw.io editor.
- * @param onInitCallback - Must return a promise with the xml to load for the editor.
- * @param onSaveCallback - Is called with the drawing data on save.
+ * @param {String} drawioUrl
+ * @param {Function} onInitCallback - Must return a promise with the xml to load for the editor.
+ * @param {Function} onSaveCallback - Is called with the drawing data on save.
  */
-function show(onInitCallback, onSaveCallback) {
+function show(drawioUrl, onInitCallback, onSaveCallback) {
     onInit = onInitCallback;
     onSave = onSaveCallback;
 
     iFrame = document.createElement('iframe');
     iFrame.setAttribute('frameborder', '0');
     window.addEventListener('message', drawReceive);
-    iFrame.setAttribute('src', drawIoUrl);
+    iFrame.setAttribute('src', drawioUrl);
     iFrame.setAttribute('class', 'fullscreen');
     iFrame.style.backgroundColor = '#FFFFFF';
     document.body.appendChild(iFrame);
index 48b4e1766b9ba0c4a84919a7dc2ee097c25b248f..f888e62277e989da786716ac2660e6bf150124ff 100644 (file)
@@ -5,6 +5,7 @@ const methods = {
         if (!this.editor) this.editor = codeLib.popupEditor(this.$refs.editor, this.language);
         this.$refs.overlay.components.overlay.show(() => {
             codeLib.updateLayout(this.editor);
+            this.editor.focus();
         });
     },
     hide() {
index c1f53e17104af6b714debab8ee7931cb69c88e80..2714d3dbbca7c3aa397e8bc970af0ca245341cb1 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'لم يتم العثور على الصفحة',
     'sorry_page_not_found' => 'عفواً, لا يمكن العثور على الصفحة التي تبحث عنها.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'العودة للصفحة الرئيسية',
     'error_occurred' => 'حدث خطأ',
     'app_down' => ':appName لا يعمل حالياً',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index c3216aa07fdac6eb8597c486c247fd71acfd80f0..56b0a51be954ed038f7546efa0709a2e0a5cfe03 100755 (executable)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index fbda0150d72688d446387174d31430b934b9be2f..ff84f2ae9636fe239d53c7aed627ec8b35ec79aa 100644 (file)
@@ -18,7 +18,7 @@ return [
 
     'name' => 'Jméno',
     'username' => 'Jméno účtu',
-    'email' => 'Email',
+    'email' => 'E-mail',
     'password' => 'Heslo',
     'password_confirm' => 'Potvrdit heslo',
     'password_hint' => 'Musí mít víc než 7 znaků',
@@ -26,8 +26,8 @@ return [
     'remember_me' => 'Neodhlašovat',
     'ldap_email_hint' => 'Zadejte email, který chcete přiřadit k tomuto účtu.',
     'create_account' => 'Vytvořit účet',
-    'already_have_account' => 'Already have an account?',
-    'dont_have_account' => 'Don\'t have an account?',
+    'already_have_account' => 'Máte už založený účet?',
+    'dont_have_account' => 'Nemáte učet?',
     'social_login' => 'Přihlášení přes sociální sítě',
     'social_registration' => 'Registrace přes sociální sítě',
     'social_registration_text' => 'Registrovat a přihlásit se přes jinou službu',
@@ -66,12 +66,12 @@ return [
     'email_not_confirmed_resend_button' => 'Znovu poslat email pro potvrzení emailové adresy',
 
     // User Invite
-    'user_invite_email_subject' => 'You have been invited to join :appName!',
-    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
-    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
-    'user_invite_email_action' => 'Set Account Password',
-    'user_invite_page_welcome' => 'Welcome to :appName!',
-    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
-    'user_invite_page_confirm_button' => 'Confirm Password',
-    'user_invite_success' => 'Password set, you now have access to :appName!'
+    'user_invite_email_subject' => 'Byl jste pozván do :appName!',
+    'user_invite_email_greeting' => 'Byl pro vás vytvořen účet na :appName.',
+    'user_invite_email_text' => 'Klikněte na tlačítko níže pro nastavení hesla k účtu a získání přístupu:',
+    'user_invite_email_action' => 'Nastavit heslo účtu',
+    'user_invite_page_welcome' => 'Vítejte v :appName!',
+    'user_invite_page_text' => 'Chcete-li dokončit svůj účet a získat přístup, musíte nastavit heslo, které bude použito k přihlášení do :appName při budoucích návštěvách.',
+    'user_invite_page_confirm_button' => 'Potvrdit heslo',
+    'user_invite_success' => 'Heslo nastaveno, nyní máte přístup k :appName!'
 ];
\ No newline at end of file
index 52d596838748450cf4a20142bef281b5dd993b0e..785648180c2c36bb197a07d6b09938812bb60b13 100644 (file)
@@ -11,20 +11,20 @@ return [
     'save' => 'Uložit',
     'continue' => 'Pokračovat',
     'select' => 'Zvolit',
-    'toggle_all' => 'Toggle All',
+    'toggle_all' => 'Přepnout vše',
     'more' => 'Více',
 
     // Form Labels
     'name' => 'Jméno',
     'description' => 'Popis',
-    'role' => 'Role',
+    'role' => 'Funkce',
     'cover_image' => 'Obrázek na přebal',
     'cover_image_description' => 'Obrázek by měl být asi 440 × 250px.',
     
     // Actions
     'actions' => 'Akce',
     'view' => 'Pohled',
-    'view_all' => 'View All',
+    'view_all' => 'Zobrazit vše',
     'create' => 'Vytvořit',
     'update' => 'Aktualizovat',
     'edit' => 'Upravit',
@@ -35,19 +35,19 @@ return [
     'delete' => 'Smazat',
     'search' => 'Hledat',
     'search_clear' => 'Vyčistit hledání',
-    'reset' => 'Reset',
+    'reset' => 'Resetovat',
     'remove' => 'Odstranit',
     'add' => 'Přidat',
-    'fullscreen' => 'Fullscreen',
+    'fullscreen' => 'Celá obrazovka',
 
     // Sort Options
-    'sort_options' => 'Sort Options',
-    'sort_direction_toggle' => 'Sort Direction Toggle',
-    'sort_ascending' => 'Sort Ascending',
-    'sort_descending' => 'Sort Descending',
-    'sort_name' => 'Name',
-    'sort_created_at' => 'Created Date',
-    'sort_updated_at' => 'Updated Date',
+    'sort_options' => 'Možnosti řazení',
+    'sort_direction_toggle' => 'Přepínač směru řazení',
+    'sort_ascending' => 'Řadit vzestupně',
+    'sort_descending' => 'Řadit sestupně',
+    'sort_name' => 'Jméno',
+    'sort_created_at' => 'Datum vytvoření',
+    'sort_updated_at' => 'Datum aktualizace',
 
     // Misc
     'deleted_user' => 'Smazaný uživatel',
@@ -60,16 +60,16 @@ return [
     'grid_view' => 'Zobrazit dlaždice',
     'list_view' => 'Zobrazit seznam',
     'default' => 'Výchozí',
-    'breadcrumb' => 'Breadcrumb',
+    'breadcrumb' => 'Drobečková navigace',
 
     // Header
-    'profile_menu' => 'Profile Menu',
+    'profile_menu' => 'Nabídka profilu',
     'view_profile' => 'Ukázat profil',
     'edit_profile' => 'Upravit profil',
 
     // Layout tabs
     'tab_info' => 'Info',
-    'tab_content' => 'Content',
+    'tab_content' => 'Obsah',
 
     // Email Content
     'email_action_help' => 'Pokud se vám nedaří kliknout na tlačítko ":actionText", zkopírujte odkaz níže přímo do webového prohlížeče:',
index ebcf3f44e2f833229b4d455c3d489937bcf1d598..f3b87fc02f178db5eaf272570e80f99e3987eb1b 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Stránka nenalezena',
     'sorry_page_not_found' => 'Omlouváme se, ale stránka, kterou hledáte nebyla nalezena.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Návrat domů',
     'error_occurred' => 'Nastala chyba',
     'app_down' => ':appName je momentálně vypnutá',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index 7488560a76975b8c13afc165807e25d6e2a69b8b..e36a53009c4d87325c422ee941a1cc7e75c70070 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index fe1b6207976597b6110e275b407b5181657f0281..01c725ee6aebe974c02c9c54fa2099ac0f941e24 100644 (file)
@@ -34,44 +34,44 @@ return [
 
     'register_thanks' => 'Tak for registreringen!',
     'register_confirm' => 'Check venligst din e-mail og klik deri på bekræftelses knappen for at tilgå :appName.',
-    'registrations_disabled' => 'Registrations are currently disabled',
-    'registration_email_domain_invalid' => 'That email domain does not have access to this application',
-    'register_success' => 'Thanks for signing up! You are now registered and signed in.',
+    'registrations_disabled' => 'Registrering er i øjeblikket deaktiveret',
+    'registration_email_domain_invalid' => 'E-Mail domænet har ikke adgang til denne applikation',
+    'register_success' => 'Tak for din registrering. Du er nu registeret og logget ind.',
 
 
     // Password Reset
-    'reset_password' => 'Reset Password',
-    'reset_password_send_instructions' => 'Enter your email below and you will be sent an email with a password reset link.',
-    'reset_password_send_button' => 'Send Reset Link',
-    'reset_password_sent_success' => 'A password reset link has been sent to :email.',
-    'reset_password_success' => 'Your password has been successfully reset.',
-    'email_reset_subject' => 'Reset your :appName password',
-    'email_reset_text' => 'You are receiving this email because we received a password reset request for your account.',
-    'email_reset_not_requested' => 'If you did not request a password reset, no further action is required.',
+    'reset_password' => 'Nulstil adgangskode',
+    'reset_password_send_instructions' => 'Indtast din E-Mail herunder og du vil blive sendt en E-Mail med et link til at nulstille din adgangskode.',
+    'reset_password_send_button' => 'Send link til nulstilling',
+    'reset_password_sent_success' => 'Et link til at nulstille adgangskoden er blevet sendt til :email.',
+    'reset_password_success' => 'Din adgangskode er blevet nulstillet.',
+    'email_reset_subject' => 'Nulstil din :appName adgangskode',
+    'email_reset_text' => 'Du modtager denne E-Mail fordi vi har modtaget en anmodning om at nulstille din adgangskode.',
+    'email_reset_not_requested' => 'Hvis du ikke har anmodet om at få din adgangskode nulstillet, behøver du ikke at foretage dig noget.',
 
 
     // Email Confirmation
-    'email_confirm_subject' => 'Confirm your email on :appName',
-    'email_confirm_greeting' => 'Thanks for joining :appName!',
-    'email_confirm_text' => 'Please confirm your email address by clicking the button below:',
-    'email_confirm_action' => 'Confirm Email',
-    'email_confirm_send_error' => 'Email confirmation required but the system could not send the email. Contact the admin to ensure email is set up correctly.',
-    'email_confirm_success' => 'Your email has been confirmed!',
-    'email_confirm_resent' => 'Confirmation email resent, Please check your inbox.',
+    'email_confirm_subject' => 'Bekræft din E-Mail på :appName',
+    'email_confirm_greeting' => 'Tak for at oprette dig på :appName!',
+    'email_confirm_text' => 'Bekræft venligst din E-Mail adresse ved at klikke på linket nedenfor:',
+    'email_confirm_action' => 'Bekræft E-Mail',
+    'email_confirm_send_error' => 'E-Mail-bekræftelse kræves, men systemet kunne ikke sende E-Mailen. Kontakt administratoren for at sikre, at E-Mail er konfigureret korrekt.',
+    'email_confirm_success' => 'Din E-Mail er blevet bekræftet!',
+    'email_confirm_resent' => 'Bekræftelsesmail sendt, tjek venligst din indboks.',
 
-    'email_not_confirmed' => 'Email Address Not Confirmed',
-    'email_not_confirmed_text' => 'Your email address has not yet been confirmed.',
-    'email_not_confirmed_click_link' => 'Please click the link in the email that was sent shortly after you registered.',
-    'email_not_confirmed_resend' => 'If you cannot find the email you can re-send the confirmation email by submitting the form below.',
-    'email_not_confirmed_resend_button' => 'Resend Confirmation Email',
+    'email_not_confirmed' => 'E-Mail adresse ikke bekræftet',
+    'email_not_confirmed_text' => 'Din E-Mail adresse er endnu ikke blevet bekræftet.',
+    'email_not_confirmed_click_link' => 'Klik venligst på linket i E-Mailen der blev sendt kort efter du registrerede dig.',
+    'email_not_confirmed_resend' => 'Hvis du ikke kan finde E-Mailen, kan du du få gensendt bekræftelsesemailen ved at trykke herunder.',
+    'email_not_confirmed_resend_button' => 'Gensend bekræftelsesemail',
 
     // User Invite
-    'user_invite_email_subject' => 'You have been invited to join :appName!',
-    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
-    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
-    'user_invite_email_action' => 'Set Account Password',
-    'user_invite_page_welcome' => 'Welcome to :appName!',
-    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
-    'user_invite_page_confirm_button' => 'Confirm Password',
-    'user_invite_success' => 'Password set, you now have access to :appName!'
+    'user_invite_email_subject' => 'Du er blevet inviteret til :appName!',
+    'user_invite_email_greeting' => 'En konto er blevet oprettet til dig på :appName.',
+    'user_invite_email_text' => 'Klik på knappen nedenunderm for at sætte en adgangskode og opnå adgang:',
+    'user_invite_email_action' => 'Set adgangskode',
+    'user_invite_page_welcome' => 'Velkommen til :appName!',
+    'user_invite_page_text' => 'For at færdiggøre din konto og få adgang skal du indstille en adgangskode, der bruges til at logge ind på :appName ved fremtidige besøg.',
+    'user_invite_page_confirm_button' => 'Bekræft adgangskode',
+    'user_invite_success' => 'Adgangskode indstillet, du har nu adgang til :appName!'
 ];
\ No newline at end of file
index be37d11ae4172435573139e3d5e951eaaa5dc03a..aaec2cc7a2c8590b2536fcd243beffa30a18152f 100644 (file)
@@ -19,10 +19,10 @@ return [
     'description' => 'Beskrivelse',
     'role' => 'Rolle',
     'cover_image' => 'Coverbillede',
-    'cover_image_description' => 'This image should be approx 440x250px.',
+    'cover_image_description' => 'Dette billede skal være omtrent 440x250px.',
     
     // Actions
-    'actions' => 'Actions',
+    'actions' => 'Handlinger',
     'view' => 'Vis',
     'view_all' => 'Vis alle',
     'create' => 'Opret',
@@ -42,36 +42,36 @@ return [
 
     // Sort Options
     'sort_options' => 'Sorteringsindstillinger',
-    'sort_direction_toggle' => 'Sort Direction Toggle',
-    'sort_ascending' => 'Sort Ascending',
-    'sort_descending' => 'Sort Descending',
-    'sort_name' => 'Name',
-    'sort_created_at' => 'Created Date',
-    'sort_updated_at' => 'Updated Date',
+    'sort_direction_toggle' => 'Sorteringsretning',
+    'sort_ascending' => 'Sorter stigende',
+    'sort_descending' => 'Sorter faldende',
+    'sort_name' => 'Navn',
+    'sort_created_at' => 'Oprettelsesdato',
+    'sort_updated_at' => 'Opdateringsdato',
 
     // Misc
-    'deleted_user' => 'Deleted User',
-    'no_activity' => 'No activity to show',
-    'no_items' => 'No items available',
-    'back_to_top' => 'Back to top',
-    'toggle_details' => 'Toggle Details',
-    'toggle_thumbnails' => 'Toggle Thumbnails',
-    'details' => 'Details',
-    'grid_view' => 'Grid View',
-    'list_view' => 'List View',
-    'default' => 'Default',
-    'breadcrumb' => 'Breadcrumb',
+    'deleted_user' => 'Slettet bruger',
+    'no_activity' => 'Ingen aktivitet at vise',
+    'no_items' => 'Intet indhold tilgængeligt',
+    'back_to_top' => 'Tilbage til toppen',
+    'toggle_details' => 'Vis/skjul detaljer',
+    'toggle_thumbnails' => 'Vis/skjul miniaturer',
+    'details' => 'Detaljer',
+    'grid_view' => 'Gittervisning',
+    'list_view' => 'Listevisning',
+    'default' => 'Standard',
+    'breadcrumb' => 'Brødkrumme',
 
     // Header
-    'profile_menu' => 'Profile Menu',
-    'view_profile' => 'View Profile',
-    'edit_profile' => 'Edit Profile',
+    'profile_menu' => 'Profilmenu',
+    'view_profile' => 'Vis profil',
+    'edit_profile' => 'Redigér Profil',
 
     // Layout tabs
     'tab_info' => 'Info',
-    'tab_content' => 'Content',
+    'tab_content' => 'Indhold',
 
     // Email Content
-    'email_action_help' => 'If you’re having trouble clicking the ":actionText" button, copy and paste the URL below into your web browser:',
-    'email_rights' => 'All rights reserved',
+    'email_action_help' => 'Hvis du har problemer med at trykke på ":actionText" knappen, prøv at kopiere og indsætte linket herunder ind i din webbrowser:',
+    'email_rights' => 'Alle rettigheder forbeholdes',
 ];
diff --git a/resources/lang/da/components.php b/resources/lang/da/components.php
new file mode 100644 (file)
index 0000000..135dc9d
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'Billedselektion',
+    'image_all' => 'Alt',
+    'image_all_title' => 'Se alle billeder',
+    'image_book_title' => 'Vis billeder uploadet til denne bog',
+    'image_page_title' => 'Vis billeder uploadet til denne side',
+    'image_search_hint' => 'Søg efter billednavn',
+    'image_uploaded' => 'Uploadet :uploadedDate',
+    'image_load_more' => 'Indlæse mere',
+    'image_image_name' => 'Billednavn',
+    'image_delete_used' => 'Dette billede er brugt på siderne nedenfor.',
+    'image_delete_confirm' => 'Tryk på slet igen for at bekræft at du ønsker at slette dette billede.',
+    'image_select_image' => 'Vælg billede',
+    'image_dropzone' => 'Træk-og-slip billede eller klik her for at uploade',
+    'images_deleted' => 'Billede slettet',
+    'image_preview' => 'Billedeksempel',
+    'image_upload_success' => 'Foto uploadet',
+    'image_update_success' => 'Billeddetaljer succesfuldt opdateret',
+    'image_delete_success' => 'Billede slettet',
+    'image_upload_remove' => 'Fjern',
+
+    // Code Editor
+    'code_editor' => 'Rediger kode',
+    'code_language' => 'Kodesprog',
+    'code_content' => 'Kodeindhold',
+    'code_save' => 'Gem kode',
+];
diff --git a/resources/lang/da/entities.php b/resources/lang/da/entities.php
new file mode 100644 (file)
index 0000000..3a24677
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'Nyligt oprettet',
+    'recently_created_pages' => 'Nyligt oprettede sider',
+    'recently_updated_pages' => 'Nyligt opdaterede sider',
+    'recently_created_chapters' => 'Nyligt oprettede kapitler',
+    'recently_created_books' => 'Nyligt oprettede bøger',
+    'recently_created_shelves' => 'Nyligt oprettede reoler',
+    'recently_update' => 'Opdateret for nyligt',
+    'recently_viewed' => 'Senest viste',
+    'recent_activity' => 'Seneste aktivitet',
+    'create_now' => 'Opret en nu',
+    'revisions' => 'Revisioner',
+    'meta_revision' => 'Revision #:revisionCount',
+    'meta_created' => 'Oprettet :timeLength',
+    'meta_created_name' => 'Oprettet :timeLength af :user',
+    'meta_updated' => 'Opdateret :timeLength',
+    'meta_updated_name' => 'Opdateret :timeLength af :user',
+    'entity_select' => 'Vælg emne',
+    'images' => 'Billeder',
+    'my_recent_drafts' => 'Mine seneste kladder',
+    'my_recently_viewed' => 'Mine senest viste',
+    'no_pages_viewed' => 'Du har ikke besøgt nogle sider',
+    'no_pages_recently_created' => 'Ingen sider er blevet oprettet for nyligt',
+    'no_pages_recently_updated' => 'Ingen sider er blevet opdateret for nyligt',
+    'export' => 'Exporter',
+    'export_html' => 'Indeholdt webfil',
+    'export_pdf' => 'PDF-fil',
+    'export_text' => 'Almindelig tekstfil',
+
+    // Permissions and restrictions
+    'permissions' => 'Rettigheder',
+    'permissions_intro' => 'Når de er aktiveret, vil disse tilladelser have prioritet over alle indstillede rolletilladelser.',
+    'permissions_enable' => 'Aktivér tilpassede tilladelser',
+    'permissions_save' => 'Gem tilladelser',
+
+    // Search
+    'search_results' => 'Søgeresultater',
+    'search_total_results_found' => ':count resultat fundet|:count resultater fundet',
+    'search_clear' => 'Ryd søgning',
+    'search_no_pages' => 'Ingen sider matchede søgning',
+    'search_for_term' => 'Søgning for :term',
+    'search_more' => 'Flere resultater',
+    'search_filters' => 'Søgefiltre',
+    'search_content_type' => 'Indholdstype',
+    'search_exact_matches' => 'Nøjagtige matches',
+    'search_tags' => 'Tagsøgninger',
+    'search_options' => 'Indstillinger',
+    'search_viewed_by_me' => 'Set af mig',
+    'search_not_viewed_by_me' => 'Ikke set af mig',
+    'search_permissions_set' => 'Rettigheders sæt',
+    'search_created_by_me' => 'Oprettet af mig',
+    'search_updated_by_me' => 'Opdateret af mig',
+    'search_date_options' => 'Datoindstillinger',
+    'search_updated_before' => 'Opdateret før',
+    'search_updated_after' => 'Opdateret efter',
+    'search_created_before' => 'Oprettet før',
+    'search_created_after' => 'Oprettet efter',
+    'search_set_date' => 'Sæt dato',
+    'search_update' => 'Opdatér søgning',
+
+    // Shelves
+    'shelf' => 'Reol',
+    'shelves' => 'Reoler',
+    'x_shelves' => ':count reol|:count reoler',
+    'shelves_long' => 'Bogreoler',
+    'shelves_empty' => 'Ingen reoler er blevet oprettet',
+    'shelves_create' => 'Opret ny reol',
+    'shelves_popular' => 'Populære reoler',
+    'shelves_new' => 'Nye reoler',
+    'shelves_new_action' => 'Ny reol',
+    'shelves_popular_empty' => 'De mest populære reoler vil blive vist her.',
+    'shelves_new_empty' => 'De nyeste reoler vil blive vist her.',
+    'shelves_save' => 'Gem reol',
+    'shelves_books' => 'Bøger på denne reol',
+    'shelves_add_books' => 'Tilføj bøger til denne reol',
+    'shelves_drag_books' => 'Træk bog her for at tilføje dem til denne reol',
+    'shelves_empty_contents' => 'Denne reol har ingen bøger tilknyttet til den',
+    'shelves_edit_and_assign' => 'Rediger reol for at tilføje bøger',
+    'shelves_edit_named' => 'Rediger reol :name',
+    'shelves_edit' => 'Rediger reol',
+    'shelves_delete' => 'Slet reol',
+    'shelves_delete_named' => 'Slet bogreol :name',
+    'shelves_delete_explain' => "Dette vil slette bogreolen med navn ':name'. Bøger heri vil ikke blive slettet.",
+    'shelves_delete_confirmation' => 'Er du sikker på at du vil slette denne bogreol?',
+    'shelves_permissions' => 'Reoltilladelser',
+    'shelves_permissions_updated' => 'Reoltilladelser opdateret',
+    'shelves_permissions_active' => 'Aktive reoltilladelser',
+    'shelves_copy_permissions_to_books' => 'Kopier tilladelser til bøger',
+    'shelves_copy_permissions' => 'Kopier tilladelser',
+    'shelves_copy_permissions_explain' => 'Dette vil anvende de aktuelle tilladelsesindstillinger på denne boghylde på alle bøger indeholdt i. Før aktivering skal du sikre dig, at ændringer i tilladelserne til denne boghylde er blevet gemt.',
+    'shelves_copy_permission_success' => 'Reolstilladelser kopieret til :count bøger',
+
+    // Books
+    'book' => 'Bog',
+    'books' => 'Bøger',
+    'x_books' => ':count bog|:count bøger',
+    'books_empty' => 'Ingen bøger er blevet oprettet',
+    'books_popular' => 'Populære bøger',
+    'books_recent' => 'Nylige bøger',
+    'books_new' => 'Nye bøger',
+    'books_new_action' => 'Ny bog',
+    'books_popular_empty' => 'De mest populære bøger vil blive vist her.',
+    'books_new_empty' => 'De nyeste boger vil blive vist her.',
+    'books_create' => 'Lav en ny bog',
+    'books_delete' => 'Slet bog',
+    'books_delete_named' => 'Slet bog :bookName',
+    'books_delete_explain' => 'Dette vil slette bogen ved navn \':bookName\'. Alle sider og kapitler vil blive slettet.',
+    'books_delete_confirmation' => 'Er du sikker på at du vil slette denne bog?',
+    'books_edit' => 'Rediger bog',
+    'books_edit_named' => 'Rediger bog :bookName',
+    'books_form_book_name' => 'Bognavn',
+    'books_save' => 'Gem bog',
+    'books_permissions' => 'Bogtilladelser',
+    'books_permissions_updated' => 'Bogtilladelser opdateret',
+    'books_empty_contents' => 'Ingen sider eller kapitler er blevet oprettet i denne bog.',
+    'books_empty_create_page' => 'Opret en ny side',
+    'books_empty_sort_current_book' => 'Sortér denne bog',
+    'books_empty_add_chapter' => 'Tilføj et kapitel',
+    'books_permissions_active' => 'Aktive bogtilladelser',
+    'books_search_this' => 'Søg i denne bog',
+    'books_navigation' => 'Bognavigation',
+    'books_sort' => 'Sorter bogindhold',
+    'books_sort_named' => 'Sorter bog :bookName',
+    'books_sort_name' => 'Sortér efter navn',
+    'books_sort_created' => 'Sortér efter oprettelsesdato',
+    'books_sort_updated' => 'Sortér efter opdateringsdato',
+    'books_sort_chapters_first' => 'Kapitler først',
+    'books_sort_chapters_last' => 'Kapitler sidst',
+    'books_sort_show_other' => 'Vis andre bøger',
+    'books_sort_save' => 'Gem ny ordre',
+
+    // Chapters
+    'chapter' => 'Kapitel',
+    'chapters' => 'Kapitler',
+    'x_chapters' => ':count kapitel|:count kapitler',
+    'chapters_popular' => 'Populære kapitler',
+    'chapters_new' => 'Nyt kapitel',
+    'chapters_create' => 'Opret nyt kapitel',
+    'chapters_delete' => 'Slet kapitel',
+    'chapters_delete_named' => 'Slet kapitel :chapterName',
+    'chapters_delete_explain' => 'Dette vil slette kapitlet med navnet \':chapterName\'. Alle sider fjernes og tilføjes direkte til den tilhørende bog.',
+    'chapters_delete_confirm' => 'Er du sikker på du vil slette dette kapitel?',
+    'chapters_edit' => 'Rediger kapitel',
+    'chapters_edit_named' => 'Rediger kapitel :chapterName',
+    'chapters_save' => 'Gem kapitel',
+    'chapters_move' => 'Flyt kapitel',
+    'chapters_move_named' => 'Flyt kapitel :chapterName',
+    'chapter_move_success' => 'Kapitel flyttet til :bookName',
+    'chapters_permissions' => 'Kapiteltilladelser',
+    'chapters_empty' => 'Der er lige nu ingen sider i dette kapitel.',
+    'chapters_permissions_active' => 'Aktive kapiteltilladelser',
+    'chapters_permissions_success' => 'Kapiteltilladelser opdateret',
+    'chapters_search_this' => 'Søg i dette kapitel',
+
+    // Pages
+    'page' => 'Side',
+    'pages' => 'Sider',
+    'x_pages' => ':count Side|:count Sider',
+    'pages_popular' => 'Populære sider',
+    'pages_new' => 'Ny side',
+    'pages_attachments' => 'Vedhæftninger',
+    'pages_navigation' => 'Sidenavigation',
+    'pages_delete' => 'Slet side',
+    'pages_delete_named' => 'Slet side :pageName',
+    'pages_delete_draft_named' => 'Slet kladdesidde :pageName',
+    'pages_delete_draft' => 'Slet kladdeside',
+    'pages_delete_success' => 'Side slettet',
+    'pages_delete_draft_success' => 'Kladdeside slettet',
+    'pages_delete_confirm' => 'Er du sikker på, du vil slette denne side?',
+    'pages_delete_draft_confirm' => 'Er du sikker på at du vil slette denne kladdesidde?',
+    'pages_editing_named' => 'Redigerer :pageName',
+    'pages_edit_draft_options' => 'Kladdeindstillinger',
+    'pages_edit_save_draft' => 'Gem kladde',
+    'pages_edit_draft' => 'Rediger sidekladde',
+    'pages_editing_draft' => 'Redigerer kladde',
+    'pages_editing_page' => 'Redigerer side',
+    'pages_edit_draft_save_at' => 'Kladde gemt ved ',
+    'pages_edit_delete_draft' => 'Slet kladde',
+    'pages_edit_discard_draft' => 'Kassér kladde',
+    'pages_edit_set_changelog' => 'Sæt ændringsoversigt',
+    'pages_edit_enter_changelog_desc' => 'Indtast en kort beskrivelse af ændringer du har lavet',
+    'pages_edit_enter_changelog' => 'Indtast ændringsoversigt',
+    'pages_save' => 'Gem siden',
+    'pages_title' => 'Overskrift',
+    'pages_name' => 'Sidenavn',
+    'pages_md_editor' => 'Editor',
+    'pages_md_preview' => 'Forhåndsvisning',
+    'pages_md_insert_image' => 'Indsæt billede',
+    'pages_md_insert_link' => 'Indsæt emnelink',
+    'pages_md_insert_drawing' => 'Indsæt tegning',
+    'pages_not_in_chapter' => 'Side er ikke i et kapitel',
+    'pages_move' => 'Flyt side',
+    'pages_move_success' => 'Flyt side til ":parentName"',
+    'pages_copy' => 'Kopier side',
+    'pages_copy_desination' => 'Kopier destination',
+    'pages_copy_success' => 'Side kopieret succesfuldt',
+    'pages_permissions' => 'Sidetilladelser',
+    'pages_permissions_success' => 'Sidetilladelser opdateret',
+    'pages_revision' => 'Revision',
+    'pages_revisions' => 'Sidserevisioner',
+    'pages_revisions_named' => 'Siderevisioner for :pageName',
+    'pages_revision_named' => 'Siderevision for :pageName',
+    'pages_revisions_created_by' => 'Oprettet af',
+    'pages_revisions_date' => 'Revisionsdato',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'Revision #:id',
+    'pages_revisions_numbered_changes' => 'Revision #:id ændringer',
+    'pages_revisions_changelog' => 'Ændringsoversigt',
+    'pages_revisions_changes' => 'Ændringer',
+    'pages_revisions_current' => 'Nuværende version',
+    'pages_revisions_preview' => 'Forhåndsvisning',
+    'pages_revisions_restore' => 'Gendan',
+    'pages_revisions_none' => 'Denne side har ingen revisioner',
+    'pages_copy_link' => 'Kopier link',
+    'pages_edit_content_link' => 'Redigér indhold',
+    'pages_permissions_active' => 'Aktive sidetilladelser',
+    'pages_initial_revision' => 'Første udgivelse',
+    'pages_initial_name' => 'Ny side',
+    'pages_editing_draft_notification' => 'Du redigerer en kladde der sidst var gemt :timeDiff.',
+    'pages_draft_edited_notification' => 'Siden har været opdateret siden da. Det er anbefalet at du kasserer denne kladde.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count brugerer har begyndt at redigere denne side',
+        'start_b' => ':userName er begyndt at redigere denne side',
+        'time_a' => 'siden siden sidst blev opdateret',
+        'time_b' => 'i de sidste :minCount minutter',
+        'message' => ':start : time. Pas på ikke at overskrive hinandens opdateringer!',
+    ],
+    'pages_draft_discarded' => 'Kladde kasseret, editoren er blevet opdateret med aktuelt sideindhold',
+    'pages_specific' => 'Specifik side',
+    'pages_is_template' => 'Sideskabelon',
+
+    // Editor Sidebar
+    'page_tags' => 'Sidetags',
+    'chapter_tags' => 'Kapiteltags',
+    'book_tags' => 'Bogtags',
+    'shelf_tags' => 'Reoltags',
+    'tag' => 'Tag',
+    'tags' =>  'Tags',
+    'tag_name' =>  'Tagnavn',
+    'tag_value' => 'Tagværdi (valgfri)',
+    'tags_explain' => "Tilføj nogle tags for bedre at kategorisere dit indhold. \n Du kan tildele en værdi til et tag for mere dybdegående organisering.",
+    'tags_add' => 'Tilføj endnu et tag',
+    'tags_remove' => 'Fjern dette tag',
+    'attachments' => 'Vedhæftninger',
+    'attachments_explain' => 'Upload nogle filer, eller vedhæft nogle links, der skal vises på siden. Disse er synlige i sidepanelet.',
+    'attachments_explain_instant_save' => 'Ændringer her gemmes med det samme.',
+    'attachments_items' => 'Vedhæftede emner',
+    'attachments_upload' => 'Upload fil',
+    'attachments_link' => 'Vedhæft link',
+    'attachments_set_link' => 'Sæt link',
+    'attachments_delete_confirm' => 'Tryk på slet igen for at bekræft at du ønsker at slette denne vedhæftning.',
+    'attachments_dropzone' => 'Slip filer eller klik her for at vedhæfte en fil',
+    'attachments_no_files' => 'Ingen filer er blevet overført',
+    'attachments_explain_link' => 'Du kan vedhæfte et link, hvis du foretrækker ikke at uploade en fil. Dette kan være et link til en anden side eller et link til en fil i skyen.',
+    'attachments_link_name' => 'Linknavn',
+    'attachment_link' => 'Vedhæftningslink',
+    'attachments_link_url' => 'Link til filen',
+    'attachments_link_url_hint' => 'Adresse (URL) på side eller fil',
+    'attach' => 'Vedhæft',
+    'attachments_edit_file' => 'Rediger fil',
+    'attachments_edit_file_name' => 'Filnavn',
+    'attachments_edit_drop_upload' => 'Slip filer eller klik her for at uploade og overskrive',
+    'attachments_order_updated' => 'Vedhæftningsordre opdateret',
+    'attachments_updated_success' => 'Vedhæftningsdetaljer opdateret',
+    'attachments_deleted' => 'Vedhæftning slettet',
+    'attachments_file_uploaded' => 'Filen blev uploadet korrekt',
+    'attachments_file_updated' => 'Filen blev opdateret korrekt',
+    'attachments_link_attached' => 'Link succesfuldt vedhæftet til side',
+    'templates' => 'Skabeloner',
+    'templates_set_as_template' => 'Side er en skabelon',
+    'templates_explain_set_as_template' => 'Du kan indstille denne side som en skabelon, så dens indhold bruges, når du opretter andre sider. Andre brugere vil kunne bruge denne skabelon, hvis de har visningstilladelser til denne side.',
+    'templates_replace_content' => 'Udskift sideindhold',
+    'templates_append_content' => 'Tilføj efter sideindhold',
+    'templates_prepend_content' => 'Tilføj før sideindhold',
+
+    // Profile View
+    'profile_user_for_x' => 'Bruger i :time',
+    'profile_created_content' => 'Oprettet indhold',
+    'profile_not_created_pages' => ':userName har ikke oprettet nogle sider',
+    'profile_not_created_chapters' => ':userName har ikke oprettet nogle kapitler',
+    'profile_not_created_books' => ':userName har ikke oprettet nogle bøger',
+    'profile_not_created_shelves' => ':userName har ikke oprettet nogle reoler',
+
+    // Comments
+    'comment' => 'Kommentar',
+    'comments' => 'Kommentarer',
+    'comment_add' => 'Tilføj kommentar',
+    'comment_placeholder' => 'Skriv en kommentar her',
+    'comment_count' => '{0} Ingen kommentarer|{1} 1 Kommentar|[2,*] :count kommentarer',
+    'comment_save' => 'Gem kommentar',
+    'comment_saving' => 'Gemmer kommentar...',
+    'comment_deleting' => 'Sletter kommentar...',
+    'comment_new' => 'Ny kommentar',
+    'comment_created' => 'kommenteret :createDiff',
+    'comment_updated' => 'Opdateret :updateDiff af :username',
+    'comment_deleted_success' => 'Kommentar slettet',
+    'comment_created_success' => 'Kommentaren er tilføjet',
+    'comment_updated_success' => 'Kommentaren er opdateret',
+    'comment_delete_confirm' => 'Er du sikker på, at du vil slette denne kommentar?',
+    'comment_in_reply_to' => 'Som svar til :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'Er du sikker på at du vil slette denne revision?',
+    'revision_restore_confirm' => 'Er du sikker på at du ønsker at gendanne denne revision? Nuværende sideindhold vil blive erstattet.',
+    'revision_delete_success' => 'Revision slettet',
+    'revision_cannot_delete_latest' => 'Kan ikke slette seneste revision.'
+];
\ No newline at end of file
index e92dab45c05945d7e6f7d3a3fff5c4dc791b1a66..e5a388c33ac53d4c7c3f97fce46091d0fb156f96 100644 (file)
@@ -13,87 +13,91 @@ return [
     'email_already_confirmed' => 'Email er allerede bekræftet. Prøv at logge ind.',
     'email_confirmation_invalid' => 'Denne bekræftelsestoken er ikke gyldig eller er allerede blevet brugt. Prøv at registrere dig igen.',
     'email_confirmation_expired' => 'Bekræftelsestoken er udløbet. En ny bekræftelsesmail er blevet sendt.',
-    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
-    'ldap_fail_anonymous' => 'LDAP access failed using anonymous bind',
+    'email_confirmation_awaiting' => 'Mail-adressen for din konto i brug er nød til at blive bekræftet',
+    'ldap_fail_anonymous' => 'LDAP-adgang fejlede ved brugen af annonym bind',
     'ldap_fail_authed' => 'LDAP adgang fejlede med de givne DN & kodeord oplysninger',
     'ldap_extension_not_installed' => 'LDAP PHP udvidelse er ikke installeret',
     'ldap_cannot_connect' => 'Kan ikke forbinde til ldap server. Indledende forbindelse mislykkedes',
     'saml_already_logged_in' => 'Allerede logget ind',
     'saml_user_not_registered' => 'Brugeren :name er ikke registreret, og automatisk registrering er slået fra',
-    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
-    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
-    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
-    'social_no_action_defined' => 'No action defined',
-    'social_login_bad_response' => "Error received during :socialAccount login: \n:error",
-    'social_account_in_use' => 'This :socialAccount account is already in use, Try logging in via the :socialAccount option.',
-    'social_account_email_in_use' => 'The email :email is already in use. If you already have an account you can connect your :socialAccount account from your profile settings.',
-    'social_account_existing' => 'This :socialAccount is already attached to your profile.',
-    'social_account_already_used_existing' => 'This :socialAccount account is already used by another user.',
-    'social_account_not_used' => 'This :socialAccount account is not linked to any users. Please attach it in your profile settings. ',
-    'social_account_register_instructions' => 'If you do not yet have an account, You can register an account using the :socialAccount option.',
-    'social_driver_not_found' => 'Social driver not found',
-    'social_driver_not_configured' => 'Your :socialAccount social settings are not configured correctly.',
-    'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
+    'saml_no_email_address' => 'Kunne ikke finde en e-mail-adresse for denne bruger i de data, der leveres af det eksterne godkendelsessystem',
+    'saml_invalid_response_id' => 'Anmodningen fra det eksterne godkendelsessystem genkendes ikke af en proces, der er startet af denne applikation. Navigering tilbage efter et login kan forårsage dette problem.',
+    'saml_fail_authed' => 'Login ved hjælp af :system failed, systemet har ikke givet tilladelse',
+    'social_no_action_defined' => 'Ingen handling er defineret',
+    'social_login_bad_response' => "Der opstod en fejl under :socialAccount login:\n:error",
+    'social_account_in_use' => 'Denne :socialAccount konto er allerede i brug, prøv at logge ind med :socialAccount loginmetoden.',
+    'social_account_email_in_use' => 'Emailen :email er allerede i brug. Hvis du allerede har en konto, kan du forbinde din :socialAccount fra dine profilindstillinger.',
+    'social_account_existing' => ':socialAccount er allerede tilknyttet din profil.',
+    'social_account_already_used_existing' => 'Denne :socialAccount konto er allerede i brug af en anden bruger.',
+    'social_account_not_used' => 'Denne :socialAccount konto er ikke tilknyttet nogle brugere. Tilknyt den i dine profilindstillinger. ',
+    'social_account_register_instructions' => 'Hvis du ikke har en konto, kan du registrere en konto gennem :socialAccount loginmetoden.',
+    'social_driver_not_found' => 'Socialdriver ikke fundet',
+    'social_driver_not_configured' => 'Dine :socialAccount indstillinger er ikke konfigureret korret.',
+    'invite_token_expired' => 'Dette invitationslink er udløbet. I stedet kan du prøve at nulstille din kontos kodeord.',
 
     // System
-    'path_not_writable' => 'File path :filePath could not be uploaded to. Ensure it is writable to the server.',
-    'cannot_get_image_from_url' => 'Cannot get image from :url',
-    'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.',
-    'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.',
-    'uploaded'  => 'The server does not allow uploads of this size. Please try a smaller file size.',
-    'image_upload_error' => 'An error occurred uploading the image',
-    'image_upload_type_error' => 'The image type being uploaded is invalid',
-    'file_upload_timeout' => 'The file upload has timed out.',
+    'path_not_writable' => 'Filsti :filePath kunne ikke uploades til. Sørg for at den kan skrives til af webserveren.',
+    'cannot_get_image_from_url' => 'Kan ikke finde billede på :url',
+    'cannot_create_thumbs' => 'Serveren kan ikke oprette miniaturer. Kontroller, at GD PHP-udvidelsen er installeret.',
+    'server_upload_limit' => 'Serveren tillader ikke uploads af denne størrelse. Prøv en mindre filstørrelse.',
+    'uploaded'  => 'Serveren tillader ikke uploads af denne størrelse. Prøv en mindre filstørrelse.',
+    'image_upload_error' => 'Der opstod en fejl ved upload af billedet',
+    'image_upload_type_error' => 'Billedtypen, der uploades, er ugyldig',
+    'file_upload_timeout' => 'Filuploaden udløb.',
 
     // Attachments
-    'attachment_page_mismatch' => 'Page mismatch during attachment update',
-    'attachment_not_found' => 'Attachment not found',
+    'attachment_page_mismatch' => 'Der blev fundet en uoverensstemmelse på siden under opdatering af vedhæftet fil',
+    'attachment_not_found' => 'Vedhæftning ikke fundet',
 
     // Pages
-    'page_draft_autosave_fail' => 'Failed to save draft. Ensure you have internet connection before saving this page',
-    'page_custom_home_deletion' => 'Cannot delete a page while it is set as a homepage',
+    'page_draft_autosave_fail' => 'Kunne ikke gemme kladde. Tjek at du har internetforbindelse før du gemmer siden',
+    'page_custom_home_deletion' => 'Kan ikke slette en side der er sat som forside',
 
     // Entities
-    'entity_not_found' => 'Entity not found',
-    'bookshelf_not_found' => 'Bookshelf not found',
-    'book_not_found' => 'Book not found',
-    'page_not_found' => 'Page not found',
-    'chapter_not_found' => 'Chapter not found',
-    'selected_book_not_found' => 'The selected book was not found',
-    'selected_book_chapter_not_found' => 'The selected Book or Chapter was not found',
-    'guests_cannot_save_drafts' => 'Guests cannot save drafts',
+    'entity_not_found' => 'Emne ikke fundet',
+    'bookshelf_not_found' => 'Bogreol ikke fundet',
+    'book_not_found' => 'Bog ikke fundet',
+    'page_not_found' => 'Side ikke fundet',
+    'chapter_not_found' => 'Kapitel ikke fundet',
+    'selected_book_not_found' => 'Den valgte bog kunne ikke findes',
+    'selected_book_chapter_not_found' => 'Den valgte bog eller kapitel kunne ikke findes',
+    'guests_cannot_save_drafts' => 'Gæster kan ikke gemme kladder',
 
     // Users
-    'users_cannot_delete_only_admin' => 'You cannot delete the only admin',
-    'users_cannot_delete_guest' => 'You cannot delete the guest user',
+    'users_cannot_delete_only_admin' => 'Du kan ikke slette den eneste admin',
+    'users_cannot_delete_guest' => 'Du kan ikke slette gæstebrugeren',
 
     // Roles
-    'role_cannot_be_edited' => 'This role cannot be edited',
-    'role_system_cannot_be_deleted' => 'This role is a system role and cannot be deleted',
-    'role_registration_default_cannot_delete' => 'This role cannot be deleted while set as the default registration role',
-    'role_cannot_remove_only_admin' => 'This user is the only user assigned to the administrator role. Assign the administrator role to another user before attempting to remove it here.',
+    'role_cannot_be_edited' => 'Denne rolle kan ikke redigeres',
+    'role_system_cannot_be_deleted' => 'Denne rolle er en systemrolle og kan ikke slettes',
+    'role_registration_default_cannot_delete' => 'Kan ikke slette rollen mens den er sat som standardrolle for registrerede brugere',
+    'role_cannot_remove_only_admin' => 'Denne bruger er den eneste bruger der har administratorrollen. Tilføj en anden bruger til administratorrollen før du forsøger at slette den her.',
 
     // Comments
-    'comment_list' => 'An error occurred while fetching the comments.',
-    'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.',
-    'comment_add' => 'An error occurred while adding / updating the comment.',
-    'comment_delete' => 'An error occurred while deleting the comment.',
-    'empty_comment' => 'Cannot add an empty comment.',
+    'comment_list' => 'Der opstod en fejl under hentning af kommentarerne.',
+    'cannot_add_comment_to_draft' => 'Du kan ikke kommentere på en kladde.',
+    'comment_add' => 'Der opstod en fejl under tilføjelse/opdatering af kommentaren.',
+    'comment_delete' => 'Der opstod en fejl under sletning af kommentaren.',
+    'empty_comment' => 'Kan ikke tilføje en tom kommentar.',
 
     // Error pages
-    '404_page_not_found' => 'Page Not Found',
-    'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
-    'return_home' => 'Return to home',
-    'error_occurred' => 'An Error Occurred',
-    'app_down' => ':appName is down right now',
-    'back_soon' => 'It will be back up soon.',
+    '404_page_not_found' => 'Siden blev ikke fundet',
+    'sorry_page_not_found' => 'Beklager, siden du leder efter blev ikke fundet.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
+    'return_home' => 'Gå tilbage til hjem',
+    'error_occurred' => 'Der opstod en fejl',
+    'app_down' => ':appName er nede lige nu',
+    'back_soon' => 'Den er oppe igen snart.',
 
     // API errors
-    'api_no_authorization_found' => 'No authorization token found on the request',
-    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
-    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
-    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
-    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
-    'api_user_token_expired' => 'The authorization token used has expired',
+    'api_no_authorization_found' => 'Der blev ikke fundet nogen autorisationstoken på anmodningen',
+    'api_bad_authorization_format' => 'En autorisationstoken blev fundet på anmodningen, men formatet var forkert',
+    'api_user_token_not_found' => 'Der blev ikke fundet nogen matchende API-token for det angivne autorisationstoken',
+    'api_incorrect_token_secret' => 'Hemmeligheden leveret til det givne anvendte API-token er forkert',
+    'api_user_no_api_permission' => 'Ejeren af den brugte API token har ikke adgang til at foretage API-kald',
+    'api_user_token_expired' => 'Den brugte godkendelsestoken er udløbet',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Følgende fejl opstod under afsendelse af testemail:',
 
 ];
diff --git a/resources/lang/da/pagination.php b/resources/lang/da/pagination.php
new file mode 100644 (file)
index 0000000..85bd12f
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; Previous',
+    'next'     => 'Next &raquo;',
+
+];
index b653f09506a2f3e44c6de1509673a2190121358c..8427d3722dd16501fa94df63076baebb2b5ee228 100644 (file)
@@ -12,74 +12,74 @@ return [
     'settings_save_success' => 'Indstillinger gemt',
 
     // App Settings
-    'app_customization' => 'Customization',
-    'app_features_security' => 'Features & Security',
-    'app_name' => 'Application Name',
-    'app_name_desc' => 'This name is shown in the header and in any system-sent emails.',
-    'app_name_header' => 'Show name in header',
+    'app_customization' => 'Tilpasning',
+    'app_features_security' => 'Funktioner & sikkerhed',
+    'app_name' => 'Programnavn',
+    'app_name_desc' => 'Dette er navnet vist i headeren og i systemafsendte E-Mails.',
+    'app_name_header' => 'Vis navn i header',
     'app_public_access' => 'Offentlig adgang',
-    'app_public_access_desc' => 'Enabling this option will allow visitors, that are not logged-in, to access content in your BookStack instance.',
-    'app_public_access_desc_guest' => 'Access for public visitors can be controlled through the "Guest" user.',
+    'app_public_access_desc' => 'Aktivering af denne funktion giver besøgende, der ikke er logget ind, adgang til indhold i din BookStack-instans.',
+    'app_public_access_desc_guest' => 'Adgang for ikke-registrerede besøgende kan kontrolleres via "Gæst" -brugeren.',
     'app_public_access_toggle' => 'Tillad offentlig adgang',
-    'app_public_viewing' => 'Allow public viewing?',
-    'app_secure_images' => 'Higher Security Image Uploads',
-    'app_secure_images_toggle' => 'Enable higher security image uploads',
-    'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.',
-    'app_editor' => 'Page Editor',
-    'app_editor_desc' => 'Select which editor will be used by all users to edit pages.',
-    'app_custom_html' => 'Custom HTML Head Content',
-    'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the <head> section of every page. This is handy for overriding styles or adding analytics code.',
-    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
-    'app_logo' => 'Application Logo',
-    'app_logo_desc' => 'This image should be 43px in height. <br>Large images will be scaled down.',
-    'app_primary_color' => 'Application Primary Color',
-    'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.',
-    'app_homepage' => 'Application Homepage',
-    'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.',
+    'app_public_viewing' => 'Tillad offentlig visning?',
+    'app_secure_images' => 'Højere sikkerhed for billeduploads',
+    'app_secure_images_toggle' => 'Aktiver højere sikkerhed for billeduploads',
+    'app_secure_images_desc' => 'Af ydeevneårsager er alle billeder offentlige. Denne funktion tilføjer en tilfældig, vanskelig at gætte streng foran billed-Url\'er. Sørg for, at mappeindekser ikke er aktiveret for at forhindre nem adgang.',
+    'app_editor' => 'Sideeditor',
+    'app_editor_desc' => 'Vælg hvilken editor der skal bruges af alle brugere til at redigere sider.',
+    'app_custom_html' => 'Tilpasset HTML head-indhold',
+    'app_custom_html_desc' => 'Al indhold tilføjet her, vil blive indsat i bunden af <head> sektionen på alle sider. Dette er brugbart til overskrivning af styling og tilføjelse af analysekode.',
+    'app_custom_html_disabled_notice' => 'Brugerdefineret HTML-head indhold er deaktiveret på denne indstillingsside for at sikre, at ødelæggende ændringer kan rettes.',
+    'app_logo' => 'Programlogo',
+    'app_logo_desc' => 'Dette billede skal være 43px højt. <br> Større billeder vil blive skaleret ned.',
+    'app_primary_color' => 'Primær programfarve',
+    'app_primary_color_desc' => 'Sætter den primære farve for applikationen herunder banneret, knapper og links.',
+    'app_homepage' => 'Programforside',
+    'app_homepage_desc' => 'Vælg en visning, der skal vises på startsiden i stedet for standardvisningen. Sidetilladelser ignoreres for valgte sider.',
     'app_homepage_select' => 'Vælg en side',
-    'app_disable_comments' => 'Disable Comments',
-    'app_disable_comments_toggle' => 'Disable comments',
-    'app_disable_comments_desc' => 'Disables comments across all pages in the application. <br> Existing comments are not shown.',
+    'app_disable_comments' => 'Deaktiver kommentarer',
+    'app_disable_comments_toggle' => 'Deaktiver kommentar',
+    'app_disable_comments_desc' => 'Deaktiverer kommentarer på tværs af alle sider i applikationen. <br> Eksisterende kommentarer vises ikke.',
 
     // Color settings
-    'content_colors' => 'Content Colors',
-    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
-    'bookshelf_color' => 'Shelf Color',
-    'book_color' => 'Book Color',
-    'chapter_color' => 'Chapter Color',
+    'content_colors' => 'Indholdsfarver',
+    'content_colors_desc' => 'Sætter farver for alle elementer i sideorganisationshierarkiet. Valg af farver med en lignende lysstyrke som standardfarverne anbefales af hensyn til læsbarhed.',
+    'bookshelf_color' => 'Bogreolfarve',
+    'book_color' => 'Bogfarve',
+    'chapter_color' => 'Kapitelfarve',
     'page_color' => 'Sidefarve',
-    'page_draft_color' => 'Page Draft Color',
+    'page_draft_color' => 'Sidekladdefarve',
 
     // Registration Settings
     'reg_settings' => 'Registrering',
     'reg_enable' => 'Aktivér tilmelding',
     'reg_enable_toggle' => 'Aktivér tilmelding',
-    'reg_enable_desc' => 'When registration is enabled user will be able to sign themselves up as an application user. Upon registration they are given a single, default user role.',
-    'reg_default_role' => 'Default user role after registration',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_desc' => 'Når registrering er aktiveret, vil alle kunne registrere sig som en applikationsbruger. Ved registrering får de en standardbrugerrolle.',
+    'reg_default_role' => 'Standardrolle efter registrering',
+    'reg_enable_external_warning' => 'Indstillingen ovenfor ignoreres, mens ekstern LDAP- eller SAML-godkendelse er aktiv. Brugerkonti for ikke-eksisterende medlemmer oprettes automatisk, hvis godkendelse mod det eksterne system, der er i brug, er vellykket.',
     'reg_email_confirmation' => 'Email bekræftelse',
-    'reg_email_confirmation_toggle' => 'Require email confirmation',
-    'reg_confirm_email_desc' => 'If domain restriction is used then email confirmation will be required and this option will be ignored.',
-    'reg_confirm_restrict_domain' => 'Domain Restriction',
-    'reg_confirm_restrict_domain_desc' => 'Enter a comma separated list of email domains you would like to restrict registration to. Users will be sent an email to confirm their address before being allowed to interact with the application. <br> Note that users will be able to change their email addresses after successful registration.',
-    'reg_confirm_restrict_domain_placeholder' => 'No restriction set',
+    'reg_email_confirmation_toggle' => 'Kræv E-Mail bekræftelse',
+    'reg_confirm_email_desc' => 'Hvis domænebegrænsning bruges, kræves e-mail-bekræftelse, og denne indstilling ignoreres.',
+    'reg_confirm_restrict_domain' => 'Domæneregistrering',
+    'reg_confirm_restrict_domain_desc' => 'Indtast en kommasepareret liste over e-mail-domæner, som du vil begrænse registreringen til. Brugere får en E-Mail for at bekræfte deres adresse, før de får tilladelse til at interagere med applikationen. <br> Bemærk, at brugere vil kunne ændre deres e-mail-adresser efter vellykket registrering.',
+    'reg_confirm_restrict_domain_placeholder' => 'Ingen restriktion opsat',
 
     // Maintenance settings
     'maint' => 'Vedligeholdelse',
-    'maint_image_cleanup' => 'Cleanup Images',
-    'maint_image_cleanup_desc' => "Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.",
-    'maint_image_cleanup_ignore_revisions' => 'Ignore images in revisions',
-    'maint_image_cleanup_run' => 'Run Cleanup',
-    'maint_image_cleanup_warning' => ':count potentially unused images were found. Are you sure you want to delete these images?',
-    'maint_image_cleanup_success' => ':count potentially unused images found and deleted!',
-    'maint_image_cleanup_nothing_found' => 'No unused images found, Nothing deleted!',
-    'maint_send_test_email' => 'Send a Test Email',
-    'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.',
-    'maint_send_test_email_run' => 'Send test email',
-    'maint_send_test_email_success' => 'Email sent to :address',
-    'maint_send_test_email_mail_subject' => 'Test Email',
-    'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!',
-    'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.',
+    'maint_image_cleanup' => 'Ryd op i billeder',
+    'maint_image_cleanup_desc' => "Scanner side & revisionsindhold for at kontrollere, hvilke billeder og tegninger, der i øjeblikket er i brug, og hvilke billeder, der er overflødige. Sørg for, at du opretter en komplet database og billedbackup, før du kører dette.",
+    'maint_image_cleanup_ignore_revisions' => 'Ignorer billeder i revisioner',
+    'maint_image_cleanup_run' => 'Kør Oprydning',
+    'maint_image_cleanup_warning' => 'der blev fundet :count potentielt ubrugte billeder. Er du sikker på, at du vil slette disse billeder?',
+    'maint_image_cleanup_success' => ':count: potentielt ubrugte billeder fundet og slettet!',
+    'maint_image_cleanup_nothing_found' => 'Ingen ubrugte billeder fundet, intet slettet!',
+    'maint_send_test_email' => 'Send en Testemail',
+    'maint_send_test_email_desc' => 'Dette sender en testmail til din mailadresse specificeret på din profil.',
+    'maint_send_test_email_run' => 'Afsend test E-Mail',
+    'maint_send_test_email_success' => 'E-Mail sendt til :address',
+    'maint_send_test_email_mail_subject' => 'Test E-Mail',
+    'maint_send_test_email_mail_greeting' => 'E-Mail levering ser ud til at virke!',
+    'maint_send_test_email_mail_text' => 'Tillykke! Da du har modtaget denne mailnotifikation, ser det ud som om, at dine mailindstillinger er opsat korrekt.',
 
     // Role Settings
     'roles' => 'Roller',
@@ -87,34 +87,34 @@ return [
     'role_create' => 'Opret en ny rolle',
     'role_create_success' => 'Rollen blev oprette korrekt',
     'role_delete' => 'Slet rolle',
-    'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
-    'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
-    'role_delete_no_migration' => "Don't migrate users",
-    'role_delete_sure' => 'Are you sure you want to delete this role?',
-    'role_delete_success' => 'Role successfully deleted',
+    'role_delete_confirm' => 'Dette vil slette rollen med navnet \':roleName\'.',
+    'role_delete_users_assigned' => 'Denne rolle er tildelt :userCount brugere. Hvis du vil rykke disse brugere fra denne rolle, kan du vælge en ny nedenunder.',
+    'role_delete_no_migration' => "Ryk ikke brugere",
+    'role_delete_sure' => 'Er du sikker på, at du vil slette denne rolle?',
+    'role_delete_success' => 'Rollen blev slettet',
     'role_edit' => 'Rediger rolle',
-    'role_details' => 'Role Details',
+    'role_details' => 'Rolledetaljer',
     'role_name' => 'Rollenavn',
-    'role_desc' => 'Short Description of Role',
-    'role_external_auth_id' => 'External Authentication IDs',
-    'role_system' => 'System Permissions',
+    'role_desc' => 'Kort beskrivelse af rolle',
+    'role_external_auth_id' => 'Eksterne godkendelses-IDer',
+    'role_system' => 'Systemtilladelser',
     'role_manage_users' => 'Administrere brugere',
-    'role_manage_roles' => 'Manage roles & role permissions',
-    'role_manage_entity_permissions' => 'Manage all book, chapter & page permissions',
-    'role_manage_own_entity_permissions' => 'Manage permissions on own book, chapter & pages',
-    'role_manage_page_templates' => 'Manage page templates',
-    'role_access_api' => 'Access system API',
-    'role_manage_settings' => 'Manage app settings',
-    'role_asset' => 'Asset Permissions',
-    'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
-    'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.',
+    'role_manage_roles' => 'Administrer roller & rollerettigheder',
+    'role_manage_entity_permissions' => 'Administrer alle bog-, kapitel- & side-rettigheder',
+    'role_manage_own_entity_permissions' => 'Administrer tilladelser på egne bøger, kapitler og sider',
+    'role_manage_page_templates' => 'Administrer side-skabeloner',
+    'role_access_api' => 'Tilgå system-API',
+    'role_manage_settings' => 'Administrer app-indstillinger',
+    'role_asset' => 'Tilladelser for medier og "assets"',
+    'role_asset_desc' => 'Disse tilladelser kontrollerer standardadgang til medier og "assets" i systemet. Tilladelser til bøger, kapitler og sider tilsidesætter disse tilladelser.',
+    'role_asset_admins' => 'Administratorer får automatisk adgang til alt indhold, men disse indstillinger kan vise eller skjule UI-indstillinger.',
     'role_all' => 'Alle',
     'role_own' => 'Eget',
-    'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
-    'role_save' => 'Save Role',
-    'role_update_success' => 'Role successfully updated',
-    'role_users' => 'Users in this role',
-    'role_users_none' => 'No users are currently assigned to this role',
+    'role_controlled_by_asset' => 'Styres af det medie/"asset", de uploades til',
+    'role_save' => 'Gem rolle',
+    'role_update_success' => 'Rollen blev opdateret',
+    'role_users' => 'Brugere med denne rolle',
+    'role_users_none' => 'Ingen brugere er i øjeblikket tildelt denne rolle',
 
     // Users
     'users' => 'Brugere',
@@ -122,62 +122,62 @@ return [
     'users_add_new' => 'Tilføj ny bruger',
     'users_search' => 'Søg efter brugere',
     'users_details' => 'Brugeroplysninger',
-    'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.',
-    'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.',
+    'users_details_desc' => 'Angiv et visningsnavn og en E-Mail-adresse for denne bruger. E-Mail-adressen bruges til at logge ind på applikationen.',
+    'users_details_desc_no_email' => 'Sætter et visningsnavn for denne bruger, så andre kan genkende dem.',
     'users_role' => 'Brugerroller',
-    'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.',
-    'users_password' => 'User Password',
-    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 characters long.',
-    'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
-    'users_send_invite_option' => 'Send user invite email',
+    'users_role_desc' => 'Vælg hvilke roller denne bruger skal tildeles. Hvis en bruger er tildelt flere roller, sammenføres tilladelserne fra disse roller, og de får alle evnerne fra de tildelte roller.',
+    'users_password' => 'Brugeradgangskode',
+    'users_password_desc' => 'Sæt et kodeord, der bruges til at logge på applikationen. Dette skal være mindst 6 tegn langt.',
+    'users_send_invite_text' => 'Du kan vælge at sende denne bruger en invitation på E-Mail, som giver dem mulighed for at indstille deres egen adgangskode, ellers kan du indstille deres adgangskode selv.',
+    'users_send_invite_option' => 'Send bruger en invitationsmail',
     'users_external_auth_id' => 'Ekstern godkendelses ID',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
-    'users_password_warning' => 'Only fill the below if you would like to change your password.',
-    'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.',
-    'users_delete' => 'Delete User',
-    'users_delete_named' => 'Delete user :userName',
-    'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.',
-    'users_delete_confirm' => 'Are you sure you want to delete this user?',
-    'users_delete_success' => 'Users successfully removed',
-    'users_edit' => 'Edit User',
-    'users_edit_profile' => 'Edit Profile',
-    'users_edit_success' => 'User successfully updated',
-    'users_avatar' => 'User Avatar',
-    'users_avatar_desc' => 'Select an image to represent this user. This should be approx 256px square.',
-    'users_preferred_language' => 'Preferred Language',
-    'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.',
-    'users_social_accounts' => 'Social Accounts',
-    'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not revoke previously authorized access. Revoke access from your profile settings on the connected social account.',
-    'users_social_connect' => 'Connect Account',
-    'users_social_disconnect' => 'Disconnect Account',
+    'users_external_auth_id_desc' => 'Dette er det ID, der bruges til at matche denne bruger ved kommunikation med dit eksterne godkendelsessystem.',
+    'users_password_warning' => 'Udfyld kun nedenstående, hvis du vil ændre din adgangskode.',
+    'users_system_public' => 'Denne bruger repræsenterer alle gæstebrugere, der besøger din instans. Den kan ikke bruges til at logge på, men tildeles automatisk.',
+    'users_delete' => 'Slet bruger',
+    'users_delete_named' => 'Slet bruger :userName',
+    'users_delete_warning' => 'Dette vil helt slette denne bruger med navnet \':userName\' fra systemet.',
+    'users_delete_confirm' => 'Er du sikker på, at du vil slette denne bruger?',
+    'users_delete_success' => 'Brugere blev fjernet',
+    'users_edit' => 'Rediger bruger',
+    'users_edit_profile' => 'Rediger profil',
+    'users_edit_success' => 'Bruger suscesfuldt opdateret',
+    'users_avatar' => 'Brugeravatar',
+    'users_avatar_desc' => 'Vælg et billede for at repræsentere denne bruger. Dette skal være ca. 256px kvadratisk.',
+    'users_preferred_language' => 'Foretrukket sprog',
+    'users_preferred_language_desc' => 'Denne indstilling ændrer det sprog, der bruges til applikationens brugergrænseflade. Dette påvirker ikke noget brugeroprettet indhold.',
+    'users_social_accounts' => 'Sociale konti',
+    'users_social_accounts_info' => 'Her kan du forbinde dine andre konti for hurtigere og lettere login. Afbrydelse af en konto her tilbagekalder ikke tidligere autoriseret adgang. Tilbagekald adgang fra dine profilindstillinger på den tilsluttede sociale konto.',
+    'users_social_connect' => 'Forbind konto',
+    'users_social_disconnect' => 'Frakobl konto',
     'users_social_connected' => ':socialAccount kontoen blev knyttet til din profil.',
     'users_social_disconnected' => ':socialAccount kontoen blev afbrudt fra din profil.',
     'users_api_tokens' => 'API Tokens',
-    'users_api_tokens_none' => 'No API tokens have been created for this user',
-    'users_api_tokens_create' => 'Create Token',
-    'users_api_tokens_expires' => 'Expires',
-    'users_api_tokens_docs' => 'API Documentation',
+    'users_api_tokens_none' => 'Ingen API tokens er blevet oprettet for denne bruger',
+    'users_api_tokens_create' => 'Opret Token',
+    'users_api_tokens_expires' => 'Udløber',
+    'users_api_tokens_docs' => 'API-dokumentation',
 
     // API Tokens
-    'user_api_token_create' => 'Create API Token',
-    'user_api_token_name' => 'Name',
-    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
-    'user_api_token_expiry' => 'Expiry Date',
-    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
-    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
-    'user_api_token_create_success' => 'API token successfully created',
-    'user_api_token_update_success' => 'API token successfully updated',
+    'user_api_token_create' => 'Opret API-token',
+    'user_api_token_name' => 'Navn',
+    'user_api_token_name_desc' => 'Giv din token et læsbart navn som en fremtidig påmindelse om dets tilsigtede formål.',
+    'user_api_token_expiry' => 'Udløbsdato',
+    'user_api_token_expiry_desc' => 'Indstil en dato, hvorpå denne token udløber. Efter denne dato fungerer anmodninger, der er lavet med denne token, ikke længere. Hvis du lader dette felt være tomt, udløber den 100 år ud i fremtiden.',
+    'user_api_token_create_secret_message' => 'Umiddelbart efter oprettelse af denne token genereres og vises et "Token-ID" og Token hemmelighed". Hemmeligheden vises kun en gang, så husk at kopiere værdien til et sikkert sted inden du fortsætter.',
+    'user_api_token_create_success' => 'API token succesfuldt oprettet',
+    'user_api_token_update_success' => 'API token succesfuldt opdateret',
     'user_api_token' => 'API Token',
-    'user_api_token_id' => 'Token ID',
-    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
-    'user_api_token_secret' => 'Token Secret',
-    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
-    'user_api_token_created' => 'Token Created :timeAgo',
-    'user_api_token_updated' => 'Token Updated :timeAgo',
-    'user_api_token_delete' => 'Delete Token',
-    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
-    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
-    'user_api_token_delete_success' => 'API token successfully deleted',
+    'user_api_token_id' => 'Token-ID',
+    'user_api_token_id_desc' => 'Dette er en ikke-redigerbar systemgenereret identifikator for denne token, som skal sendes i API-anmodninger.',
+    'user_api_token_secret' => 'Token hemmelighed',
+    'user_api_token_secret_desc' => 'Dette er et system genereret hemmelighed for denne token, som skal sendes i API-anmodninger. Dette vises kun denne ene gang, så kopier denne værdi til et sikkert sted.',
+    'user_api_token_created' => 'Token oprettet :timeAgo',
+    'user_api_token_updated' => 'Token opdateret :timeAgo',
+    'user_api_token_delete' => 'Slet Token',
+    'user_api_token_delete_warning' => 'Dette vil helt slette API-token\'en med navnet \':tokenName\' fra systemet.',
+    'user_api_token_delete_confirm' => 'Er du sikker på, at du vil slette denne API-token?',
+    'user_api_token_delete_success' => 'API-token slettet',
 
     //! If editing translations files directly please ignore this in all
     //! languages apart from en. Content will be auto-copied from en.
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
diff --git a/resources/lang/da/validation.php b/resources/lang/da/validation.php
new file mode 100644 (file)
index 0000000..79ed1bd
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => ':attribute skal være accepteret.',
+    'active_url'           => ':attribute er ikke en gyldig URL.',
+    'after'                => ':attribute skal være en dato efter :date.',
+    'alpha'                => ':attribute må kun indeholde bogstaver.',
+    'alpha_dash'           => ':attribute må kun bestå af bogstaver, tal, binde- og under-streger.',
+    'alpha_num'            => ':attribute må kun indeholde bogstaver og tal.',
+    'array'                => ':attribute skal være et array.',
+    'before'               => ':attribute skal være en dato før :date.',
+    'between'              => [
+        'numeric' => ':attribute skal være mellem :min og :max.',
+        'file'    => ':attribute skal være mellem :min og :max kilobytes.',
+        'string'  => ':attribute skal være mellem :min og :max tegn.',
+        'array'   => ':attribute skal have mellem :min og :max elementer.',
+    ],
+    'boolean'              => ':attribute-feltet skal være enten sandt eller falsk.',
+    'confirmed'            => ':attribute-bekræftelsen matcher ikke.',
+    'date'                 => ':attribute er ikke en gyldig dato.',
+    'date_format'          => ':attribute matcher ikke formatet :format.',
+    'different'            => ':attribute og :other skal være forskellige.',
+    'digits'               => ':attribute skal være :digits cifre.',
+    'digits_between'       => ':attribute skal være mellem :min og :max cifre.',
+    'email'                => ':attribute skal være en gyldig mail-adresse.',
+    'ends_with' => ':attribute skal slutte på en af følgende værdier: :values',
+    'filled'               => ':attribute er obligatorisk.',
+    'gt'                   => [
+        'numeric' => ':attribute skal være større end :value.',
+        'file'    => ':attribute skal være større end :value kilobytes.',
+        'string'  => ':attribute skal have mere end :value tegn.',
+        'array'   => ':attribute skal indeholde mere end :value elementer.',
+    ],
+    'gte'                  => [
+        'numeric' => ':attribute skal mindst være :value.',
+        'file'    => ':attribute skal være mindst :value kilobytes.',
+        'string'  => ':attribute skal indeholde mindst :value tegn.',
+        'array'   => ':attribute skal have :value elementer eller flere.',
+    ],
+    'exists'               => 'Den valgte :attribute er ikke gyldig.',
+    'image'                => ':attribute skal være et billede.',
+    'image_extension'      => ':attribute skal være et gyldigt og understøttet billedformat.',
+    'in'                   => 'Den valgte :attribute er ikke gyldig.',
+    'integer'              => ':attribute skal være et heltal.',
+    'ip'                   => ':attribute skal være en gyldig IP-adresse.',
+    'ipv4'                 => ':attribute skal være en gyldig IPv4-adresse.',
+    'ipv6'                 => ':attribute skal være en gyldig IPv6-adresse.',
+    'json'                 => ':attribute skal være en gyldig JSON-streng.',
+    'lt'                   => [
+        'numeric' => ':attribute skal være mindre end :value.',
+        'file'    => ':attribute skal være mindre end :value kilobytes.',
+        'string'  => ':attribute skal have mindre end :value tegn.',
+        'array'   => ':attribute skal indeholde mindre end :value elementer.',
+    ],
+    'lte'                  => [
+        'numeric' => ':attribute skal være mindre end eller lig med :value.',
+        'file'    => 'The :attribute skal være mindre eller lig med :value kilobytes.',
+        'string'  => ':attribute skal maks være :value tegn.',
+        'array'   => ':attribute må ikke indeholde mere end :value elementer.',
+    ],
+    'max'                  => [
+        'numeric' => ':attribute må ikke overstige :max.',
+        'file'    => ':attribute må ikke overstige :max kilobytes.',
+        'string'  => ':attribute må ikke overstige :max. tegn.',
+        'array'   => ':attribute må ikke have mere end :max elementer.',
+    ],
+    'mimes'                => ':attribute skal være en fil af typen: :values.',
+    'min'                  => [
+        'numeric' => ':attribute skal mindst være :min.',
+        'file'    => ':attribute skal være mindst :min kilobytes.',
+        'string'  => ':attribute skal mindst være :min tegn.',
+        'array'   => ':attribute skal have mindst :min elementer.',
+    ],
+    'no_double_extension'  => ':attribute må kun indeholde én filtype.',
+    'not_in'               => 'Den valgte :attribute er ikke gyldig.',
+    'not_regex'            => ':attribute-formatet er ugyldigt.',
+    'numeric'              => ':attribute skal være et tal.',
+    'regex'                => ':attribute-formatet er ugyldigt.',
+    'required'             => ':attribute er obligatorisk.',
+    'required_if'          => ':attribute skal udfyldes når :other er :value.',
+    'required_with'        => ':attribute skal udfyldes når :values er udfyldt.',
+    'required_with_all'    => ':attribute skal udfyldes når :values er udfyldt.',
+    'required_without'     => ':attribute skal udfyldes når :values ikke er udfyldt.',
+    'required_without_all' => ':attribute skal udfyldes når ingen af :values er udfyldt.',
+    'same'                 => ':attribute og :other skal være ens.',
+    'size'                 => [
+        'numeric' => ':attribute skal være :size.',
+        'file'    => ':attribute skal være :size kilobytes.',
+        'string'  => ':attribute skal være :size tegn.',
+        'array'   => ':attribute skal indeholde :size elementer.',
+    ],
+    'string'               => ':attribute skal være tekst.',
+    'timezone'             => ':attribute skal være en gyldig zone.',
+    'unique'               => ':attribute er allerede i brug.',
+    'url'                  => ':attribute-formatet er ugyldigt.',
+    'uploaded'             => 'Filen kunne ikke oploades. Serveren accepterer muligvis ikke filer af denne størrelse.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'Adgangskodebekræftelse påkrævet',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index 1b81bf36ef94410da4e6de8b795daf93ee6da00a..205a8a6325576baf304650d634d839ba495fce6d 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Seite nicht gefunden',
     'sorry_page_not_found' => 'Entschuldigung. Die Seite, die Sie angefordert haben, wurde nicht gefunden.',
+    'sorry_page_not_found_permission_warning' => 'Wenn Sie erwartet haben, dass diese Seite existiert, haben Sie möglicherweise nicht die Berechtigung, sie anzuzeigen.',
     'return_home' => 'Zurück zur Startseite',
     'error_occurred' => 'Es ist ein Fehler aufgetreten',
     'app_down' => ':appName befindet sich aktuell im Wartungsmodus.',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'Der Besitzer des verwendeten API-Token hat keine Berechtigung für API-Aufrufe',
     'api_user_token_expired' => 'Das verwendete Autorisierungs-Token ist abgelaufen',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Fehler beim Senden einer Test E-Mail:',
+
 ];
index 98a04b0626bc6adb324a3e1c74575b63ea4b988f..263c0f923652a6f76dab3e592b05f89f14991b58 100644 (file)
@@ -58,7 +58,7 @@ Wenn Sie nicht eingeben, wird die Anwendung auf die Standardfarbe zurückgesetzt
     'reg_enable_toggle' => 'Registrierung erlauben',
     'reg_enable_desc' => 'Wenn die Registrierung erlaubt ist, kann sich der Benutzer als Anwendungsbenutzer anmelden. Bei der Registrierung erhält er eine einzige, voreingestellte Benutzerrolle.',
     'reg_default_role' => 'Standard-Benutzerrolle nach Registrierung',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'Die obige Option wird ignoriert, während eine externe LDAP oder SAML Authentifizierung aktiv ist. Benutzerkonten für nicht existierende Mitglieder werden automatisch erzeugt, wenn die Authentifizierung gegen das verwendete externe System erfolgreich ist.',
     'reg_email_confirmation' => 'Bestätigung per E-Mail',
     'reg_email_confirmation_toggle' => 'Bestätigung per E-Mail erforderlich',
     'reg_confirm_email_desc' => 'Falls die Einschränkung für Domains genutzt wird, ist die Bestätigung per E-Mail zwingend erforderlich und der untenstehende Wert wird ignoriert.',
@@ -134,7 +134,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'users_send_invite_text' => 'Sie können diesem Benutzer eine Einladungs-E-Mail senden, die es ihm erlaubt, sein eigenes Passwort zu setzen, andernfalls können Sie sein Passwort selbst setzen.',
     'users_send_invite_option' => 'Benutzer-Einladungs-E-Mail senden',
     'users_external_auth_id' => 'Externe Authentifizierungs-ID',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'Dies ist die ID, mit der dieser Benutzer bei der Kommunikation mit Ihrem externen Authentifizierungssystem übereinstimmt.',
     'users_password_warning' => 'Füllen Sie die folgenden Felder nur aus, wenn Sie Ihr Passwort ändern möchten:',
     'users_system_public' => 'Dieser Benutzer repräsentiert alle unangemeldeten Benutzer, die diese Seite betrachten. Er kann nicht zum Anmelden benutzt werden, sondern wird automatisch zugeordnet.',
     'users_delete' => 'Benutzer löschen',
@@ -188,27 +188,29 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dänisch',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index c91cd4129077fee0ffa3004b463e7c2a9f8e9c83..4528eda405f215a82ee523835de34871fb0d1d26 100644 (file)
@@ -20,7 +20,7 @@ return [
     'username' => 'Benutzername',
     'email' => 'E-Mail',
     'password' => 'Passwort',
-    'password_confirm' => 'Passwort best&auml;tigen',
+    'password_confirm' => 'Passwort bestätigen',
     'password_hint' => 'Mindestlänge: 7 Zeichen',
     'forgot_password' => 'Passwort vergessen?',
     'remember_me' => 'Angemeldet bleiben',
@@ -32,11 +32,11 @@ return [
     'social_registration' => 'Mit Sozialem Netzwerk registrieren',
     'social_registration_text' => 'Mit einer dieser Dienste registrieren oder anmelden',
 
-    'register_thanks' => 'Vielen Dank für Ihre Registrierung!',
+    'register_thanks' => 'Vielen Dank für deine Registrierung!',
     'register_confirm' => 'Bitte prüfe Deinen Posteingang und bestätig die Registrierung.',
     'registrations_disabled' => 'Eine Registrierung ist momentan nicht möglich',
     'registration_email_domain_invalid' => 'Du kannst dich mit dieser E-Mail nicht registrieren.',
-    'register_success' => 'Vielen Dank für Deine Registrierung! Die Daten sind gespeichert und Du bist angemeldet.',
+    'register_success' => 'Vielen Dank für deine Registrierung! Du bist jetzt registriert und eingeloggt.',
 
 
     // Password Reset
@@ -47,7 +47,7 @@ return [
     'reset_password_success' => 'Dein Passwort wurde erfolgreich zurückgesetzt.',
     'email_reset_subject' => 'Passwort zurücksetzen für :appName',
     'email_reset_text' => 'Du erhältsts diese E-Mail, weil jemand versucht hat, Dein Passwort zurückzusetzen.',
-    'email_reset_not_requested' => 'Wenn Du das nicht warst, brauchst Du nichts weiter zu tun.',
+    'email_reset_not_requested' => 'Wenn du das zurücksetzen des Passworts nicht angefordert hast, ist keine weitere Aktion erforderlich.',
 
 
     // Email Confirmation
@@ -55,8 +55,8 @@ return [
     'email_confirm_greeting' => 'Danke, dass Du dich für :appName registrierst hast!',
     'email_confirm_text' => 'Bitte bestätige Deine E-Mail-Adresse, indem Du auf die Schaltfläche klickst:',
     'email_confirm_action' => 'E-Mail-Adresse bestätigen',
-    'email_confirm_send_error' => 'Leider konnte die für die Registrierung notwendige E-Mail zur Bestätigung Deine E-Mail-Adresse nicht versandt werden. Bitte kontaktiere den Systemadministrator!',
-    'email_confirm_success' => 'Deine E-Mail-Adresse wurde best&auml;tigt!',
+    'email_confirm_send_error' => 'Leider konnte die für die Registrierung notwendige E-Mail zur Bestätigung Deiner E-Mail-Adresse nicht versandt werden. Bitte kontaktiere den Systemadministrator!',
+    'email_confirm_success' => 'Deine E-Mail-Adresse wurde bestätigt!',
     'email_confirm_resent' => 'Bestätigungs-E-Mail wurde erneut versendet, bitte überprüfe Deinen Posteingang.',
 
     'email_not_confirmed' => 'E-Mail-Adresse ist nicht bestätigt',
@@ -67,11 +67,11 @@ return [
 
     // User Invite
     'user_invite_email_subject' => 'Du wurdest eingeladen :appName beizutreten!',
-    'user_invite_email_greeting' => 'Ein Konto wurde für Sie auf :appName erstellt.',
-    'user_invite_email_text' => 'Klicken Sie auf die Schaltfläche unten, um ein Passwort festzulegen und Zugriff zu erhalten:',
-    'user_invite_email_action' => 'Account-Passwort festlegen',
+    'user_invite_email_greeting' => 'Ein Konto wurde für dich auf :appName erstellt.',
+    'user_invite_email_text' => 'Klicke auf die Schaltfläche unten, um ein Passwort festzulegen und Zugriff zu erhalten:',
+    'user_invite_email_action' => 'Konto-Passwort festlegen',
     'user_invite_page_welcome' => 'Willkommen bei :appName!',
     'user_invite_page_text' => 'Um die Anmeldung abzuschließen und Zugriff auf :appName zu bekommen muss noch ein Passwort festgelegt werden. Dieses wird in Zukunft zum Einloggen benötigt.',
-    'user_invite_page_confirm_button' => 'Passwort wiederholen',
-    'user_invite_success' => 'Passwort gesetzt, Sie haben nun Zugriff auf :appName!'
+    'user_invite_page_confirm_button' => 'Passwort bestätigen',
+    'user_invite_success' => 'Das Passwort wurde gesetzt, du hast nun Zugriff auf :appName!'
 ];
\ No newline at end of file
index e0cbedf9198b3920a59a1b793beb355f3dc1e6b6..3888035c315af5b7730c4e2e740df4ccfc69ace9 100644 (file)
@@ -275,7 +275,7 @@ return [
     'attachments_link_attached' => 'Link erfolgreich der Seite hinzugefügt',
     'templates' => 'Vorlagen',
     'templates_set_as_template' => 'Seite ist eine Vorlage',
-    'templates_explain_set_as_template' => 'Sie können diese Seite als Vorlage festlegen, damit deren Inhalt beim Erstellen anderer Seiten verwendet werden kann. Andere Benutzer können diese Vorlage verwenden, wenn sie die Zugriffsrechte für diese Seite haben.',
+    'templates_explain_set_as_template' => 'Du kannst diese Seite als Vorlage festlegen, damit deren Inhalt beim Erstellen anderer Seiten verwendet werden kann. Andere Benutzer können diese Vorlage verwenden, wenn diese die Zugriffsrechte für diese Seite haben.',
     'templates_replace_content' => 'Seiteninhalt ersetzen',
     'templates_append_content' => 'An Seiteninhalt anhängen',
     'templates_prepend_content' => 'Seiteninhalt voranstellen',
index a5dac12eb97e3e80ab525787fd14ecfac9d534c4..3707dbf13768e2647f41ebb5abcffa49c057fa48 100644 (file)
@@ -16,15 +16,15 @@ return [
     'email_confirmation_awaiting' => 'Die E-Mail-Adresse für das verwendete Konto muss bestätigt werden',
     'ldap_fail_anonymous' => 'Anonymer LDAP-Zugriff ist fehlgeschlafgen',
     'ldap_fail_authed' => 'LDAP-Zugriff mit DN und Passwort ist fehlgeschlagen',
-    'ldap_extension_not_installed' => 'LDAP-PHP-Erweiterung ist nicht installiert.',
-    'ldap_cannot_connect' => 'Die Verbindung zum LDAP-Server ist fehlgeschlagen. Beim initialen Verbindungsaufbau trat ein Fehler auf.',
+    'ldap_extension_not_installed' => 'LDAP-PHP-Erweiterung ist nicht installiert',
+    'ldap_cannot_connect' => 'Die Verbindung zum LDAP-Server ist fehlgeschlagen. Beim initialen Verbindungsaufbau trat ein Fehler auf',
     'saml_already_logged_in' => 'Du bist bereits angemeldet',
     'saml_user_not_registered' => 'Kein Benutzer mit ID :name registriert und die automatische Registrierung ist deaktiviert',
     'saml_no_email_address' => 'Es konnte keine E-Mail-Adresse für diesen Benutzer in den vom externen Authentifizierungssystem zur Verfügung gestellten Daten gefunden werden',
     'saml_invalid_response_id' => 'Die Anfrage vom externen Authentifizierungssystem wird von einem von dieser Anwendung gestarteten Prozess nicht erkannt. Das Zurückgehen nach einem Login könnte dieses Problem verursachen.',
     'saml_fail_authed' => 'Anmeldung mit :system fehlgeschlagen, System konnte keine erfolgreiche Autorisierung bereitstellen',
     'social_no_action_defined' => 'Es ist keine Aktion definiert',
-    'social_login_bad_response' => "Fehler bei der :socialAccount-Anmeldung: \n:error",
+    'social_login_bad_response' => "Fehler bei :socialAccount Login: \n:error",
     'social_account_in_use' => 'Dieses :socialAccount-Konto wird bereits verwendet. Bitte melde dich mit dem :socialAccount-Konto an.',
     'social_account_email_in_use' => 'Die E-Mail-Adresse ":email" ist bereits registriert. Wenn Du bereits registriert bist, kannst Du Dein :socialAccount-Konto in Deinen Profil-Einstellungen verknüpfen.',
     'social_account_existing' => 'Dieses :socialAccount-Konto ist bereits mit Ihrem Profil verknüpft.',
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Seite nicht gefunden',
     'sorry_page_not_found' => 'Entschuldigung. Die Seite, die Du angefordert hast, wurde nicht gefunden.',
+    'sorry_page_not_found_permission_warning' => 'Wenn du erwartet hast, dass diese Seite existiert, hast du möglicherweise nicht die Berechtigung, sie anzuzeigen.',
     'return_home' => 'Zurück zur Startseite',
     'error_occurred' => 'Es ist ein Fehler aufgetreten',
     'app_down' => ':appName befindet sich aktuell im Wartungsmodus.',
@@ -92,8 +93,11 @@ return [
     'api_no_authorization_found' => 'Kein Autorisierungs-Token für die Anfrage gefunden',
     'api_bad_authorization_format' => 'Ein Autorisierungs-Token wurde auf die Anfrage gefunden, aber das Format schien falsch zu sein',
     'api_user_token_not_found' => 'Es wurde kein passender API-Token für den angegebenen Autorisierungs-Token gefunden',
-    'api_incorrect_token_secret' => 'Das für den angegebenen API-Token angegebene Kennwort ist falsch',
+    'api_incorrect_token_secret' => 'Das für den API-Token angegebene geheimen Token ist falsch',
     'api_user_no_api_permission' => 'Der Besitzer des verwendeten API-Token hat keine Berechtigung für API-Aufrufe',
     'api_user_token_expired' => 'Das verwendete Autorisierungs-Token ist abgelaufen',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Fehler beim Senden einer Test E-Mail:',
+
 ];
index fb563ffdf008616031c84e899ffab8ccc25cceff..9af19031def32013ba3a6c7d7be2991d9c35ad75 100644 (file)
@@ -23,7 +23,7 @@ return [
     'app_public_access_toggle' => 'Öffentlichen Zugriff erlauben',
     'app_public_viewing' => 'Öffentliche Ansicht erlauben?',
     'app_secure_images' => 'Erhöhte Sicherheit für hochgeladene Bilder aktivieren?',
-    'app_secure_images_toggle' => 'Aktiviere Bild-Upload höherer Sicherheit',
+    'app_secure_images_toggle' => 'Aktiviere Bild-Upload mit höherer Sicherheit',
     'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu eratene, Zeichenketten zu Bild-URLs hinzu. Stellen sie sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.',
     'app_editor' => 'Seiteneditor',
     'app_editor_desc' => 'Wähle den Editor aus, der von allen Benutzern genutzt werden soll, um Seiten zu editieren.',
@@ -58,7 +58,7 @@ Wenn Du nichts eingibst, wird die Anwendung auf die Standardfarbe zurückgesetzt
     'reg_enable_toggle' => 'Registrierung erlauben',
     'reg_enable_desc' => 'Wenn die Registrierung erlaubt ist, kann sich der Benutzer als Anwendungsbenutzer anmelden. Bei der Registrierung erhält er eine einzige, voreingestellte Benutzerrolle.',
     'reg_default_role' => 'Standard-Benutzerrolle nach Registrierung',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'Die obige Option wird ignoriert, während eine externe LDAP oder SAML Authentifizierung aktiv ist. Benutzerkonten für nicht existierende Mitglieder werden automatisch erzeugt, wenn die Authentifizierung gegen das verwendete externe System erfolgreich ist.',
     'reg_email_confirmation' => 'Bestätigung per E-Mail',
     'reg_email_confirmation_toggle' => 'Bestätigung per E-Mail erforderlich',
     'reg_confirm_email_desc' => 'Falls die Einschränkung für Domains genutzt wird, ist die Bestätigung per E-Mail zwingend erforderlich und der untenstehende Wert wird ignoriert.',
@@ -77,12 +77,12 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'maint_image_cleanup_success' => ':count eventuell unbenutze Bilder wurden gefunden und gelöscht.',
     'maint_image_cleanup_nothing_found' => 'Keine unbenutzen Bilder gefunden. Nichts zu löschen!',
     'maint_send_test_email' => 'Test Email versenden',
-    'maint_send_test_email_desc' => 'Dies sendet eine Test E-Mail an Ihre in Ihrem Profil angegebene E-Mail-Adresse.',
+    'maint_send_test_email_desc' => 'Dies sendet eine Test E-Mail an die in deinem Profil angegebene E-Mail-Adresse.',
     'maint_send_test_email_run' => 'Sende eine Test E-Mail',
     'maint_send_test_email_success' => 'E-Mail wurde an :address gesendet',
     'maint_send_test_email_mail_subject' => 'Test E-Mail',
     'maint_send_test_email_mail_greeting' => 'E-Mail-Versand scheint zu funktionieren!',
-    'maint_send_test_email_mail_text' => 'Glückwunsch! Da Sie diese E-Mail Benachrichtigung erhalten haben, scheinen Ihre E-Mail-Einstellungen korrekt konfiguriert zu sein.',
+    'maint_send_test_email_mail_text' => 'Glückwunsch! Da du diese E-Mail Benachrichtigung erhalten hast, scheinen deine E-Mail-Einstellungen korrekt konfiguriert zu sein.',
 
     // Role Settings
     'roles' => 'Rollen',
@@ -131,10 +131,10 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'users_role_desc' => 'Wählen Sie aus, welchen Rollen dieser Benutzer zugeordnet werden soll. Wenn ein Benutzer mehreren Rollen zugeordnet ist, werden die Berechtigungen dieser Rollen gestapelt und er erhält alle Fähigkeiten der zugewiesenen Rollen.',
     'users_password' => 'Benutzerpasswort',
     'users_password_desc' => 'Legen Sie ein Passwort fest, mit dem Sie sich anmelden möchten. Diese muss mindestens 5 Zeichen lang sein.',
-    'users_send_invite_text' => 'Sie können diesem Benutzer eine Einladungs-E-Mail senden, die es ihm erlaubt, sein eigenes Passwort zu setzen, andernfalls können Sie sein Passwort selbst setzen.',
+    'users_send_invite_text' => 'Du kannst diesem Benutzer eine Einladungs-E-Mail senden, die es ihm erlaubt, sein eigenes Passwort zu setzen, andernfalls kannst du sein Passwort selbst setzen.',
     'users_send_invite_option' => 'Benutzer-Einladungs-E-Mail senden',
     'users_external_auth_id' => 'Externe Authentifizierungs-ID',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'Dies ist die ID, die verwendet wird, um diesen Benutzer bei der Kommunikation mit deinem externen Authentifizierungssystem abzugleichen.',
     'users_password_warning' => 'Fülle die folgenden Felder nur aus, wenn Du Dein Passwort ändern möchtest:',
     'users_system_public' => 'Dieser Benutzer repräsentiert alle unangemeldeten Benutzer, die diese Seite betrachten. Er kann nicht zum Anmelden benutzt werden, sondern wird automatisch zugeordnet.',
     'users_delete' => 'Benutzer löschen',
@@ -164,22 +164,22 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     // API Tokens
     'user_api_token_create' => 'Neuen API-Token erstellen',
     'user_api_token_name' => 'Name',
-    'user_api_token_name_desc' => 'Geben Sie Ihrem Token einen aussagekräftigen Namen als spätere Erinnerung an seinen Verwendungszweck.',
+    'user_api_token_name_desc' => 'Gebe deinem Token einen aussagekräftigen Namen als spätere Erinnerung an seinen Verwendungszweck.',
     'user_api_token_expiry' => 'Ablaufdatum',
-    'user_api_token_expiry_desc' => 'Legen Sie ein Datum fest, an dem dieser Token abläuft. Nach diesem Datum funktionieren Anfragen, die mit diesem Token gestellt werden, nicht mehr. Wenn Sie dieses Feld leer lassen, wird ein Ablaufdatum von 100 Jahren in der Zukunft festgelegt.',
-    'user_api_token_create_secret_message' => 'Unmittelbar nach der Erstellung dieses Tokens wird eine "Token ID" & ein "Token Kennwort" generiert und angezeigt. Das Kennwort wird nur ein einziges Mal angezeigt. Stellen Sie also sicher, dass Sie den Inhalt an einen sicheren Ort kopieren, bevor Sie fortfahren.',
+    'user_api_token_expiry_desc' => 'Lege ein Datum fest, an dem dieser Token abläuft. Nach diesem Datum funktionieren Anfragen, die mit diesem Token gestellt werden, nicht mehr. Wenn du dieses Feld leer lässt, wird ein Ablaufdatum von 100 Jahren in der Zukunft festgelegt.',
+    'user_api_token_create_secret_message' => 'Unmittelbar nach der Erstellung dieses Tokens wird eine "Token ID" & ein "Token Kennwort" generiert und angezeigt. Das Kennwort wird nur ein einziges Mal angezeigt. Stelle also sicher, dass du den Inhalt an einen sicheren Ort kopierst, bevor du fortfährst.',
     'user_api_token_create_success' => 'API-Token erfolgreich erstellt',
     'user_api_token_update_success' => 'API-Token erfolgreich aktualisiert',
     'user_api_token' => 'API-Token',
     'user_api_token_id' => 'Token ID',
     'user_api_token_id_desc' => 'Dies ist ein nicht editierbarer, vom System generierter Identifikator für diesen Token, welcher bei API-Anfragen angegeben werden muss.',
     'user_api_token_secret' => 'Token Kennwort',
-    'user_api_token_secret_desc' => 'Dies ist ein systemgeneriertes Kennwort für diesen Token, das bei API-Anfragen zur Verfügung gestellt werden muss. Es wird nur dieses eine Mal angezeigt, deshalb kopieren Sie diesen Wert an einen sicheren und geschützten Ort.',
+    'user_api_token_secret_desc' => 'Dies ist ein systemgeneriertes Kennwort für diesen Token, das bei API-Anfragen zur Verfügung gestellt werden muss. Es wird nur dieses eine Mal angezeigt, deshalb kopiere diesen an einen sicheren und geschützten Ort.',
     'user_api_token_created' => 'Token erstellt :timeAgo',
     'user_api_token_updated' => 'Token aktualisiert :timeAgo',
     'user_api_token_delete' => 'Lösche Token',
     'user_api_token_delete_warning' => 'Dies löscht den API-Token mit dem Namen \':tokenName\' vollständig aus dem System.',
-    'user_api_token_delete_confirm' => 'Sind Sie sicher, dass Sie diesen API-Token löschen möchten?',
+    'user_api_token_delete_confirm' => 'Bist du sicher, dass du diesen API-Token löschen möchtest?',
     'user_api_token_delete_success' => 'API-Token erfolgreich gelöscht',
 
     //! If editing translations files directly please ignore this in all
@@ -188,27 +188,29 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dänisch',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slowenisch',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index b6105d192858da66ce689644cfc6ef6cee60a34e..4be38446889ce05c2ded5504e498f23083fdd215 100644 (file)
@@ -34,14 +34,14 @@ return [
     'filled'               => ':attribute ist erforderlich.',
     'gt'                   => [
         'numeric' => ':attribute muss größer als :value sein.',
-        'file'    => ':attribute muss mindestens :value Kilobytes groß sein.',
+        'file'    => ':attribute muss mindestens größer als :value Kilobytes sein.',
         'string'  => ':attribute muss mehr als :value Zeichen haben.',
-        'array'   => ':attribute muss mindestens :value Elemente haben.',
+        'array'   => ':attribute muss mehr als :value Elemente haben.',
     ],
     'gte'                  => [
         'numeric' => ':attribute muss größer-gleich :value sein.',
-        'file'    => ':attribute muss mindestens :value Kilobytes groß sein.',
-        'string'  => ':attribute muss mindestens :value Zeichen enthalten.',
+        'file'    => ':attribute muss größer-gleich :value Kilobytes sein.',
+        'string'  => ':attribute muss mindestens :value Zeichen haben.',
         'array'   => ':attribute muss :value Elemente oder mehr haben.',
     ],
     'exists'               => ':attribute ist ungültig.',
@@ -52,9 +52,9 @@ return [
     'ip'                   => ':attribute muss eine valide IP-Adresse sein.',
     'ipv4'                 => ':attribute muss eine gültige IPv4 Adresse sein.',
     'ipv6'                 => ':attribute muss eine gültige IPv6-Adresse sein.',
-    'json'                 => 'Das Attribut muss eine gültige JSON-Zeichenfolge sein.',
+    'json'                 => ':attribute muss ein gültiger JSON-String sein.',
     'lt'                   => [
-        'numeric' => ':attribute muss kleiner sein :value sein.',
+        'numeric' => ':attribute muss kleiner als :value sein.',
         'file'    => ':attribute muss kleiner als :value Kilobytes sein.',
         'string'  => ':attribute muss weniger als :value Zeichen haben.',
         'array'   => ':attribute muss weniger als :value Elemente haben.',
@@ -62,7 +62,7 @@ return [
     'lte'                  => [
         'numeric' => ':attribute muss kleiner oder gleich :value sein.',
         'file'    => ':attribute muss kleiner oder gleich :value Kilobytes sein.',
-        'string'  => ':attribute darf höchstens :value Zeichen besitzen.',
+        'string'  => ':attribute muss :value oder weniger Zeichen haben.',
         'array'   => ':attribute darf höchstens :value Elemente haben.',
     ],
     'max'                  => [
@@ -80,7 +80,7 @@ return [
     ],
     'no_double_extension'  => ':attribute darf nur eine gültige Dateiendung',
     'not_in'               => ':attribute ist ungültig.',
-    'not_regex'            => ':attribute ist kein valides Format.',
+    'not_regex'            => ':attribute ist kein gültiges Format.',
     'numeric'              => ':attribute muss eine Zahl sein.',
     'regex'                => ':attribute ist in einem ungültigen Format.',
     'required'             => ':attribute ist erforderlich.',
index 6961e049b3dc2ad15d25d2a1369f4dc6988e2a6b..d64fce93a62d90889b2297a9e4f6482ad9046475 100644 (file)
@@ -43,7 +43,7 @@ return [
     'reset_password' => 'Reset Password',
     'reset_password_send_instructions' => 'Enter your email below and you will be sent an email with a password reset link.',
     'reset_password_send_button' => 'Send Reset Link',
-    'reset_password_sent_success' => 'A password reset link has been sent to :email.',
+    'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.',
     'reset_password_success' => 'Your password has been successfully reset.',
     'email_reset_subject' => 'Reset your :appName password',
     'email_reset_text' => 'You are receiving this email because we received a password reset request for your account.',
index 38f1ce28a9de0cd3d1b10f7975a7be11bd468279..06a5285f56fc4ce11e6642549a1002b1bacae698 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Page Not Found',
     'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Return to home',
     'error_occurred' => 'An Error Occurred',
     'app_down' => ':appName is down right now',
index f41ca7868f66f2937e8ad49e7e2daee1eff3c569..b408f3c2fdaf1e80e9cdafa36ae9507db9fbda48 100644 (file)
@@ -8,7 +8,7 @@ return [
 
     'password' => 'Passwords must be at least eight characters and match the confirmation.',
     'user' => "We can't find a user with that e-mail address.",
-    'token' => 'This password reset token is invalid.',
+    'token' => 'The password reset token is invalid for this email address.',
     'sent' => 'We have e-mailed your password reset link!',
     'reset' => 'Your password has been reset!',
 
index ab274256f20e21d45490a28c67d9164fa4ea835f..f1345c743b6dcc2bdfc7555774627195ebcd4109 100755 (executable)
@@ -185,27 +185,30 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'he' => 'עברית',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index aa90d9cd3e91832e3c33c73ea625c7be200afdff..e89b69fd385b337917d22d9468249d183d012c79 100644 (file)
@@ -7,41 +7,41 @@ return [
 
     // Pages
     'page_create'                 => 'página creada',
-    'page_create_notification'    => 'Página creada exitosamente',
+    'page_create_notification'    => 'Página creada correctamente',
     'page_update'                 => 'página actualizada',
-    'page_update_notification'    => 'Página actualizada exitosamente',
-    'page_delete'                 => 'página borrada',
-    'page_delete_notification'    => 'Página borrada exitosamente',
+    'page_update_notification'    => 'Página actualizada correctamente',
+    'page_delete'                 => 'página eliminada',
+    'page_delete_notification'    => 'Página eliminada correctamente',
     'page_restore'                => 'página restaurada',
-    'page_restore_notification'   => 'Página restaurada exitosamente',
+    'page_restore_notification'   => 'Página restaurada correctamente',
     'page_move'                   => 'página movida',
 
     // Chapters
     'chapter_create'              => 'capítulo creado',
-    'chapter_create_notification' => 'Capítulo creado exitosamente',
+    'chapter_create_notification' => 'Capítulo creado correctamente',
     'chapter_update'              => 'capítulo actualizado',
-    'chapter_update_notification' => 'Capítulo actualizado exitosamente',
-    'chapter_delete'              => 'capítulo borrado',
-    'chapter_delete_notification' => 'Capítulo borrado exitosamente',
+    'chapter_update_notification' => 'Capítulo actualizado correctamente',
+    'chapter_delete'              => 'capítulo eliminado',
+    'chapter_delete_notification' => 'Capítulo eliminado correctamente',
     'chapter_move'                => 'capítulo movido',
 
     // Books
     'book_create'                 => 'libro creado',
-    'book_create_notification'    => 'Libro creado exitosamente',
+    'book_create_notification'    => 'Libro creado correctamente',
     'book_update'                 => 'libro actualizado',
-    'book_update_notification'    => 'Libro actualizado exitosamente',
-    'book_delete'                 => 'libro borrado',
-    'book_delete_notification'    => 'Libro borrado exitosamente',
+    'book_update_notification'    => 'Libro actualizado correctamente',
+    'book_delete'                 => 'libro eliminado',
+    'book_delete_notification'    => 'Libro eliminado correctamente',
     'book_sort'                   => 'libro ordenado',
-    'book_sort_notification'      => 'Libro reordenado exitosamente',
+    'book_sort_notification'      => 'Libro reordenado correctamente',
 
     // Bookshelves
     'bookshelf_create'            => 'estante creado',
-    'bookshelf_create_notification'    => 'Estante creado exitosamente',
+    'bookshelf_create_notification'    => 'Estante creado correctamente',
     'bookshelf_update'                 => 'estante actualizado',
-    'bookshelf_update_notification'    => 'Estante actualizado exitosamente',
-    'bookshelf_delete'                 => 'estante borrado',
-    'bookshelf_delete_notification'    => 'Estante borrado exitosamente',
+    'bookshelf_update_notification'    => 'Estante actualizado correctamente',
+    'bookshelf_delete'                 => 'estante eliminado',
+    'bookshelf_delete_notification'    => 'Estante eliminado correctamente',
 
     // Other
     'commented_on'                => 'comentada el',
index 3636507fee72669b19fcc12aa023e1eaad476e22..00ff8b137ee123752434deb7d04befce110b2c46 100644 (file)
@@ -6,15 +6,15 @@
  */
 return [
 
-    'failed' => 'Las credenciales no concuerdan con nuestros registros.',
-    'throttle' => 'Demasiados intentos fallidos de conexión. Por favor intente nuevamente en :seconds segundos.',
+    'failed' => 'Estas credenciales no coinciden con nuestros registros.',
+    'throttle' => 'Demasiados intentos de inicio de sesión. Por favor, inténtalo de nuevo en :seconds segundos.',
 
     // Login & Register
     'sign_up' => 'Registrarse',
     'log_in' => 'Acceder',
     'log_in_with' => 'Acceder con :socialDriver',
     'sign_up_with' => 'Registrarse con :socialDriver',
-    'logout' => 'Salir',
+    'logout' => 'Cerrar sesión',
 
     'name' => 'Nombre',
     'username' => 'Usuario',
index 65b20afc7e91b9f5c2749b13d161ce009e7b8c60..ce69b6157f3720dedb085b8a3e43064e7b46b7f8 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Página no encontrada',
     'sorry_page_not_found' => 'Lo sentimos, la página a la que intenta acceder no pudo ser encontrada.',
+    'sorry_page_not_found_permission_warning' => 'Si esperaba que esta página existiera, puede que no tenga permiso para verla.',
     'return_home' => 'Volver a la página de inicio',
     'error_occurred' => 'Ha ocurrido un error',
     'app_down' => 'La aplicación :appName se encuentra caída en este momento',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'El propietario del token API usado no tiene permiso para hacer llamadas API',
     'api_user_token_expired' => 'El token de autorización usado ha caducado',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error al enviar un email de prueba:',
+
 ];
index ff5c40ee13cd9c78e103a1379cb15fe8a7b19db5..57b91d033bcfae66968e7df6c04fd6d228878d9c 100644 (file)
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Habilitar registro',
     'reg_enable_desc' => 'Cuando se habilita el registro los usuarios podrán registrarse como usuarios de la aplicación. Al registrarse se les asigna un rol único por defecto.',
     'reg_default_role' => 'Rol de usuario por defecto después del registro',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'La opción anterior no se utiliza mientras la autenticación LDAP o SAML externa esté activa. Las cuentas de usuario para los miembros no existentes se crearán automáticamente si la autenticación en el sistema externo en uso es exitosa.',
     'reg_email_confirmation' => 'Confirmación por Email',
     'reg_email_confirmation_toggle' => 'Requerir confirmación por Email',
     'reg_confirm_email_desc' => 'Si se emplea la restricción por dominio, entonces se requerirá la confirmación por correo electrónico y esta opción será ignorada.',
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Danés',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index a3ce98e0872d94dce331a4341b4f76dd71ee1d6f..c640492fecda756ef69eb7b994d8d3ca8ff95522 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Página no encontrada',
     'sorry_page_not_found' => 'Lo sentimos, la página que intenta acceder no pudo ser encontrada.',
+    'sorry_page_not_found_permission_warning' => 'Si esperaba que esta página existiera, puede que no tenga permiso para verla.',
     'return_home' => 'Volver al home',
     'error_occurred' => 'Ha ocurrido un error',
     'app_down' => 'La aplicación :appName se encuentra caída en este momento',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'El propietario del token API usado no tiene permiso para hacer llamadas API',
     'api_user_token_expired' => 'El token de autorización usado ha caducado',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error al enviar un email de prueba:',
+
 ];
index 465e2ed074e1e25fc38a08f7402e2ddd5c2c7e00..f218dd95c9c7d630794eeda596de77eecb156940 100644 (file)
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Habilitar registro',
     'reg_enable_desc' => 'Cuando se habilita el registro, el usuario podrá crear su usuario en la aplicación. Con el regsitro, se le otorga un rol de usuario único y por defecto.',
     'reg_default_role' => 'Rol de usuario por defecto despúes del registro',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'La opción anterior no se utiliza mientras la autenticación LDAP o SAML externa esté activa. Las cuentas de usuario para los miembros no existentes se crearán automáticamente si la autenticación en el sistema externo en uso es exitosa.',
     'reg_email_confirmation' => 'Confirmación de correo electrónico',
     'reg_email_confirmation_toggle' => 'Requerir confirmación de correo electrónico',
     'reg_confirm_email_desc' => 'Si se utiliza la restricción por dominio, entonces se requerirá la confirmación por correo electrónico y se ignorará el valor a continuación.',
@@ -186,27 +186,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Danés',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
diff --git a/resources/lang/fa/activities.php b/resources/lang/fa/activities.php
new file mode 100644 (file)
index 0000000..4cac54b
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Activity text strings.
+ * Is used for all the text within activity logs & notifications.
+ */
+return [
+
+    // Pages
+    'page_create'                 => 'created page',
+    'page_create_notification'    => 'Page Successfully Created',
+    'page_update'                 => 'updated page',
+    'page_update_notification'    => 'Page Successfully Updated',
+    'page_delete'                 => 'deleted page',
+    'page_delete_notification'    => 'Page Successfully Deleted',
+    'page_restore'                => 'restored page',
+    'page_restore_notification'   => 'Page Successfully Restored',
+    'page_move'                   => 'moved page',
+
+    // Chapters
+    'chapter_create'              => 'created chapter',
+    'chapter_create_notification' => 'Chapter Successfully Created',
+    'chapter_update'              => 'updated chapter',
+    'chapter_update_notification' => 'Chapter Successfully Updated',
+    'chapter_delete'              => 'deleted chapter',
+    'chapter_delete_notification' => 'Chapter Successfully Deleted',
+    'chapter_move'                => 'moved chapter',
+
+    // Books
+    'book_create'                 => 'created book',
+    'book_create_notification'    => 'Book Successfully Created',
+    'book_update'                 => 'updated book',
+    'book_update_notification'    => 'Book Successfully Updated',
+    'book_delete'                 => 'deleted book',
+    'book_delete_notification'    => 'Book Successfully Deleted',
+    'book_sort'                   => 'sorted book',
+    'book_sort_notification'      => 'Book Successfully Re-sorted',
+
+    // Bookshelves
+    'bookshelf_create'            => 'created Bookshelf',
+    'bookshelf_create_notification'    => 'Bookshelf Successfully Created',
+    'bookshelf_update'                 => 'updated bookshelf',
+    'bookshelf_update_notification'    => 'Bookshelf Successfully Updated',
+    'bookshelf_delete'                 => 'deleted bookshelf',
+    'bookshelf_delete_notification'    => 'Bookshelf Successfully Deleted',
+
+    // Other
+    'commented_on'                => 'commented on',
+];
diff --git a/resources/lang/fa/auth.php b/resources/lang/fa/auth.php
new file mode 100644 (file)
index 0000000..6961e04
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Authentication Language Lines
+ * The following language lines are used during authentication for various
+ * messages that we need to display to the user.
+ */
+return [
+
+    'failed' => 'These credentials do not match our records.',
+    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
+
+    // Login & Register
+    'sign_up' => 'Sign up',
+    'log_in' => 'Log in',
+    'log_in_with' => 'Login with :socialDriver',
+    'sign_up_with' => 'Sign up with :socialDriver',
+    'logout' => 'Logout',
+
+    'name' => 'Name',
+    'username' => 'Username',
+    'email' => 'Email',
+    'password' => 'Password',
+    'password_confirm' => 'Confirm Password',
+    'password_hint' => 'Must be over 7 characters',
+    'forgot_password' => 'Forgot Password?',
+    'remember_me' => 'Remember Me',
+    'ldap_email_hint' => 'Please enter an email to use for this account.',
+    'create_account' => 'Create Account',
+    'already_have_account' => 'Already have an account?',
+    'dont_have_account' => 'Don\'t have an account?',
+    'social_login' => 'Social Login',
+    'social_registration' => 'Social Registration',
+    'social_registration_text' => 'Register and sign in using another service.',
+
+    'register_thanks' => 'Thanks for registering!',
+    'register_confirm' => 'Please check your email and click the confirmation button to access :appName.',
+    'registrations_disabled' => 'Registrations are currently disabled',
+    'registration_email_domain_invalid' => 'That email domain does not have access to this application',
+    'register_success' => 'Thanks for signing up! You are now registered and signed in.',
+
+
+    // Password Reset
+    'reset_password' => 'Reset Password',
+    'reset_password_send_instructions' => 'Enter your email below and you will be sent an email with a password reset link.',
+    'reset_password_send_button' => 'Send Reset Link',
+    'reset_password_sent_success' => 'A password reset link has been sent to :email.',
+    'reset_password_success' => 'Your password has been successfully reset.',
+    'email_reset_subject' => 'Reset your :appName password',
+    'email_reset_text' => 'You are receiving this email because we received a password reset request for your account.',
+    'email_reset_not_requested' => 'If you did not request a password reset, no further action is required.',
+
+
+    // Email Confirmation
+    'email_confirm_subject' => 'Confirm your email on :appName',
+    'email_confirm_greeting' => 'Thanks for joining :appName!',
+    'email_confirm_text' => 'Please confirm your email address by clicking the button below:',
+    'email_confirm_action' => 'Confirm Email',
+    'email_confirm_send_error' => 'Email confirmation required but the system could not send the email. Contact the admin to ensure email is set up correctly.',
+    'email_confirm_success' => 'Your email has been confirmed!',
+    'email_confirm_resent' => 'Confirmation email resent, Please check your inbox.',
+
+    'email_not_confirmed' => 'Email Address Not Confirmed',
+    'email_not_confirmed_text' => 'Your email address has not yet been confirmed.',
+    'email_not_confirmed_click_link' => 'Please click the link in the email that was sent shortly after you registered.',
+    'email_not_confirmed_resend' => 'If you cannot find the email you can re-send the confirmation email by submitting the form below.',
+    'email_not_confirmed_resend_button' => 'Resend Confirmation Email',
+
+    // User Invite
+    'user_invite_email_subject' => 'You have been invited to join :appName!',
+    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
+    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
+    'user_invite_email_action' => 'Set Account Password',
+    'user_invite_page_welcome' => 'Welcome to :appName!',
+    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
+    'user_invite_page_confirm_button' => 'Confirm Password',
+    'user_invite_success' => 'Password set, you now have access to :appName!'
+];
\ No newline at end of file
diff --git a/resources/lang/fa/common.php b/resources/lang/fa/common.php
new file mode 100644 (file)
index 0000000..c8b4a2b
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Common elements found throughout many areas of BookStack.
+ */
+return [
+
+    // Buttons
+    'cancel' => 'Cancel',
+    'confirm' => 'Confirm',
+    'back' => 'Back',
+    'save' => 'Save',
+    'continue' => 'Continue',
+    'select' => 'Select',
+    'toggle_all' => 'Toggle All',
+    'more' => 'More',
+
+    // Form Labels
+    'name' => 'Name',
+    'description' => 'Description',
+    'role' => 'Role',
+    'cover_image' => 'Cover image',
+    'cover_image_description' => 'This image should be approx 440x250px.',
+    
+    // Actions
+    'actions' => 'Actions',
+    'view' => 'View',
+    'view_all' => 'View All',
+    'create' => 'Create',
+    'update' => 'Update',
+    'edit' => 'Edit',
+    'sort' => 'Sort',
+    'move' => 'Move',
+    'copy' => 'Copy',
+    'reply' => 'Reply',
+    'delete' => 'Delete',
+    'search' => 'Search',
+    'search_clear' => 'Clear Search',
+    'reset' => 'Reset',
+    'remove' => 'Remove',
+    'add' => 'Add',
+    'fullscreen' => 'Fullscreen',
+
+    // Sort Options
+    'sort_options' => 'Sort Options',
+    'sort_direction_toggle' => 'Sort Direction Toggle',
+    'sort_ascending' => 'Sort Ascending',
+    'sort_descending' => 'Sort Descending',
+    'sort_name' => 'Name',
+    'sort_created_at' => 'Created Date',
+    'sort_updated_at' => 'Updated Date',
+
+    // Misc
+    'deleted_user' => 'Deleted User',
+    'no_activity' => 'No activity to show',
+    'no_items' => 'No items available',
+    'back_to_top' => 'Back to top',
+    'toggle_details' => 'Toggle Details',
+    'toggle_thumbnails' => 'Toggle Thumbnails',
+    'details' => 'Details',
+    'grid_view' => 'Grid View',
+    'list_view' => 'List View',
+    'default' => 'Default',
+    'breadcrumb' => 'Breadcrumb',
+
+    // Header
+    'profile_menu' => 'Profile Menu',
+    'view_profile' => 'View Profile',
+    'edit_profile' => 'Edit Profile',
+
+    // Layout tabs
+    'tab_info' => 'Info',
+    'tab_content' => 'Content',
+
+    // Email Content
+    'email_action_help' => 'If you’re having trouble clicking the ":actionText" button, copy and paste the URL below into your web browser:',
+    'email_rights' => 'All rights reserved',
+];
diff --git a/resources/lang/fa/components.php b/resources/lang/fa/components.php
new file mode 100644 (file)
index 0000000..d8e8981
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'Image Select',
+    'image_all' => 'All',
+    'image_all_title' => 'View all images',
+    'image_book_title' => 'View images uploaded to this book',
+    'image_page_title' => 'View images uploaded to this page',
+    'image_search_hint' => 'Search by image name',
+    'image_uploaded' => 'Uploaded :uploadedDate',
+    'image_load_more' => 'Load More',
+    'image_image_name' => 'Image Name',
+    'image_delete_used' => 'This image is used in the pages below.',
+    'image_delete_confirm' => 'Click delete again to confirm you want to delete this image.',
+    'image_select_image' => 'Select Image',
+    'image_dropzone' => 'Drop images or click here to upload',
+    'images_deleted' => 'Images Deleted',
+    'image_preview' => 'Image Preview',
+    'image_upload_success' => 'Image uploaded successfully',
+    'image_update_success' => 'Image details successfully updated',
+    'image_delete_success' => 'Image successfully deleted',
+    'image_upload_remove' => 'Remove',
+
+    // Code Editor
+    'code_editor' => 'Edit Code',
+    'code_language' => 'Code Language',
+    'code_content' => 'Code Content',
+    'code_save' => 'Save Code',
+];
diff --git a/resources/lang/fa/entities.php b/resources/lang/fa/entities.php
new file mode 100644 (file)
index 0000000..6bbc723
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'Recently Created',
+    'recently_created_pages' => 'Recently Created Pages',
+    'recently_updated_pages' => 'Recently Updated Pages',
+    'recently_created_chapters' => 'Recently Created Chapters',
+    'recently_created_books' => 'Recently Created Books',
+    'recently_created_shelves' => 'Recently Created Shelves',
+    'recently_update' => 'Recently Updated',
+    'recently_viewed' => 'Recently Viewed',
+    'recent_activity' => 'Recent Activity',
+    'create_now' => 'Create one now',
+    'revisions' => 'Revisions',
+    'meta_revision' => 'Revision #:revisionCount',
+    'meta_created' => 'Created :timeLength',
+    'meta_created_name' => 'Created :timeLength by :user',
+    'meta_updated' => 'Updated :timeLength',
+    'meta_updated_name' => 'Updated :timeLength by :user',
+    'entity_select' => 'Entity Select',
+    'images' => 'Images',
+    'my_recent_drafts' => 'My Recent Drafts',
+    'my_recently_viewed' => 'My Recently Viewed',
+    'no_pages_viewed' => 'You have not viewed any pages',
+    'no_pages_recently_created' => 'No pages have been recently created',
+    'no_pages_recently_updated' => 'No pages have been recently updated',
+    'export' => 'Export',
+    'export_html' => 'Contained Web File',
+    'export_pdf' => 'PDF File',
+    'export_text' => 'Plain Text File',
+
+    // Permissions and restrictions
+    'permissions' => 'Permissions',
+    'permissions_intro' => 'Once enabled, These permissions will take priority over any set role permissions.',
+    'permissions_enable' => 'Enable Custom Permissions',
+    'permissions_save' => 'Save Permissions',
+
+    // Search
+    'search_results' => 'Search Results',
+    'search_total_results_found' => ':count result found|:count total results found',
+    'search_clear' => 'Clear Search',
+    'search_no_pages' => 'No pages matched this search',
+    'search_for_term' => 'Search for :term',
+    'search_more' => 'More Results',
+    'search_filters' => 'Search Filters',
+    'search_content_type' => 'Content Type',
+    'search_exact_matches' => 'Exact Matches',
+    'search_tags' => 'Tag Searches',
+    'search_options' => 'Options',
+    'search_viewed_by_me' => 'Viewed by me',
+    'search_not_viewed_by_me' => 'Not viewed by me',
+    'search_permissions_set' => 'Permissions set',
+    'search_created_by_me' => 'Created by me',
+    'search_updated_by_me' => 'Updated by me',
+    'search_date_options' => 'Date Options',
+    'search_updated_before' => 'Updated before',
+    'search_updated_after' => 'Updated after',
+    'search_created_before' => 'Created before',
+    'search_created_after' => 'Created after',
+    'search_set_date' => 'Set Date',
+    'search_update' => 'Update Search',
+
+    // Shelves
+    'shelf' => 'Shelf',
+    'shelves' => 'Shelves',
+    'x_shelves' => ':count Shelf|:count Shelves',
+    'shelves_long' => 'Bookshelves',
+    'shelves_empty' => 'No shelves have been created',
+    'shelves_create' => 'Create New Shelf',
+    'shelves_popular' => 'Popular Shelves',
+    'shelves_new' => 'New Shelves',
+    'shelves_new_action' => 'New Shelf',
+    'shelves_popular_empty' => 'The most popular shelves will appear here.',
+    'shelves_new_empty' => 'The most recently created shelves will appear here.',
+    'shelves_save' => 'Save Shelf',
+    'shelves_books' => 'Books on this shelf',
+    'shelves_add_books' => 'Add books to this shelf',
+    'shelves_drag_books' => 'Drag books here to add them to this shelf',
+    'shelves_empty_contents' => 'This shelf has no books assigned to it',
+    'shelves_edit_and_assign' => 'Edit shelf to assign books',
+    'shelves_edit_named' => 'Edit Bookshelf :name',
+    'shelves_edit' => 'Edit Bookshelf',
+    'shelves_delete' => 'Delete Bookshelf',
+    'shelves_delete_named' => 'Delete Bookshelf :name',
+    'shelves_delete_explain' => "This will delete the bookshelf with the name ':name'. Contained books will not be deleted.",
+    'shelves_delete_confirmation' => 'Are you sure you want to delete this bookshelf?',
+    'shelves_permissions' => 'Bookshelf Permissions',
+    'shelves_permissions_updated' => 'Bookshelf Permissions Updated',
+    'shelves_permissions_active' => 'Bookshelf Permissions Active',
+    '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',
+
+    // Books
+    'book' => 'Book',
+    'books' => 'Books',
+    'x_books' => ':count Book|:count Books',
+    'books_empty' => 'No books have been created',
+    'books_popular' => 'Popular Books',
+    'books_recent' => 'Recent Books',
+    'books_new' => 'New Books',
+    'books_new_action' => 'New Book',
+    'books_popular_empty' => 'The most popular books will appear here.',
+    'books_new_empty' => 'The most recently created books will appear here.',
+    'books_create' => 'Create New Book',
+    'books_delete' => 'Delete Book',
+    'books_delete_named' => 'Delete Book :bookName',
+    'books_delete_explain' => 'This will delete the book with the name \':bookName\'. All pages and chapters will be removed.',
+    'books_delete_confirmation' => 'Are you sure you want to delete this book?',
+    'books_edit' => 'Edit Book',
+    'books_edit_named' => 'Edit Book :bookName',
+    'books_form_book_name' => 'Book Name',
+    'books_save' => 'Save Book',
+    'books_permissions' => 'Book Permissions',
+    'books_permissions_updated' => 'Book Permissions Updated',
+    'books_empty_contents' => 'No pages or chapters have been created for this book.',
+    'books_empty_create_page' => 'Create a new page',
+    'books_empty_sort_current_book' => 'Sort the current book',
+    'books_empty_add_chapter' => 'Add a chapter',
+    'books_permissions_active' => 'Book Permissions Active',
+    'books_search_this' => 'Search this book',
+    'books_navigation' => 'Book Navigation',
+    'books_sort' => 'Sort Book Contents',
+    'books_sort_named' => 'Sort Book :bookName',
+    'books_sort_name' => 'Sort by Name',
+    'books_sort_created' => 'Sort by Created Date',
+    'books_sort_updated' => 'Sort by Updated Date',
+    'books_sort_chapters_first' => 'Chapters First',
+    'books_sort_chapters_last' => 'Chapters Last',
+    'books_sort_show_other' => 'Show Other Books',
+    'books_sort_save' => 'Save New Order',
+
+    // Chapters
+    'chapter' => 'Chapter',
+    'chapters' => 'Chapters',
+    'x_chapters' => ':count Chapter|:count Chapters',
+    'chapters_popular' => 'Popular Chapters',
+    'chapters_new' => 'New Chapter',
+    'chapters_create' => 'Create New Chapter',
+    'chapters_delete' => 'Delete Chapter',
+    'chapters_delete_named' => 'Delete Chapter :chapterName',
+    'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages will be removed and added directly to the parent book.',
+    'chapters_delete_confirm' => 'Are you sure you want to delete this chapter?',
+    'chapters_edit' => 'Edit Chapter',
+    'chapters_edit_named' => 'Edit Chapter :chapterName',
+    'chapters_save' => 'Save Chapter',
+    'chapters_move' => 'Move Chapter',
+    'chapters_move_named' => 'Move Chapter :chapterName',
+    'chapter_move_success' => 'Chapter moved to :bookName',
+    'chapters_permissions' => 'Chapter Permissions',
+    'chapters_empty' => 'No pages are currently in this chapter.',
+    'chapters_permissions_active' => 'Chapter Permissions Active',
+    'chapters_permissions_success' => 'Chapter Permissions Updated',
+    'chapters_search_this' => 'Search this chapter',
+
+    // Pages
+    'page' => 'Page',
+    'pages' => 'Pages',
+    'x_pages' => ':count Page|:count Pages',
+    'pages_popular' => 'Popular Pages',
+    'pages_new' => 'New Page',
+    'pages_attachments' => 'Attachments',
+    'pages_navigation' => 'Page Navigation',
+    'pages_delete' => 'Delete Page',
+    'pages_delete_named' => 'Delete Page :pageName',
+    'pages_delete_draft_named' => 'Delete Draft Page :pageName',
+    'pages_delete_draft' => 'Delete Draft Page',
+    'pages_delete_success' => 'Page deleted',
+    'pages_delete_draft_success' => 'Draft page deleted',
+    'pages_delete_confirm' => 'Are you sure you want to delete this page?',
+    'pages_delete_draft_confirm' => 'Are you sure you want to delete this draft page?',
+    'pages_editing_named' => 'Editing Page :pageName',
+    'pages_edit_draft_options' => 'Draft Options',
+    'pages_edit_save_draft' => 'Save Draft',
+    'pages_edit_draft' => 'Edit Page Draft',
+    'pages_editing_draft' => 'Editing Draft',
+    'pages_editing_page' => 'Editing Page',
+    'pages_edit_draft_save_at' => 'Draft saved at ',
+    'pages_edit_delete_draft' => 'Delete Draft',
+    'pages_edit_discard_draft' => 'Discard Draft',
+    'pages_edit_set_changelog' => 'Set Changelog',
+    'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
+    'pages_edit_enter_changelog' => 'Enter Changelog',
+    'pages_save' => 'Save Page',
+    'pages_title' => 'Page Title',
+    'pages_name' => 'Page Name',
+    'pages_md_editor' => 'Editor',
+    'pages_md_preview' => 'Preview',
+    'pages_md_insert_image' => 'Insert Image',
+    'pages_md_insert_link' => 'Insert Entity Link',
+    'pages_md_insert_drawing' => 'Insert Drawing',
+    'pages_not_in_chapter' => 'Page is not in a chapter',
+    'pages_move' => 'Move Page',
+    'pages_move_success' => 'Page moved to ":parentName"',
+    'pages_copy' => 'Copy Page',
+    'pages_copy_desination' => 'Copy Destination',
+    'pages_copy_success' => 'Page successfully copied',
+    'pages_permissions' => 'Page Permissions',
+    'pages_permissions_success' => 'Page permissions updated',
+    'pages_revision' => 'Revision',
+    'pages_revisions' => 'Page Revisions',
+    'pages_revisions_named' => 'Page Revisions for :pageName',
+    'pages_revision_named' => 'Page Revision for :pageName',
+    'pages_revisions_created_by' => 'Created By',
+    'pages_revisions_date' => 'Revision Date',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'Revision #:id',
+    'pages_revisions_numbered_changes' => 'Revision #:id Changes',
+    'pages_revisions_changelog' => 'Changelog',
+    'pages_revisions_changes' => 'Changes',
+    'pages_revisions_current' => 'Current Version',
+    'pages_revisions_preview' => 'Preview',
+    'pages_revisions_restore' => 'Restore',
+    'pages_revisions_none' => 'This page has no revisions',
+    'pages_copy_link' => 'Copy Link',
+    'pages_edit_content_link' => 'Edit Content',
+    'pages_permissions_active' => 'Page Permissions Active',
+    'pages_initial_revision' => 'Initial publish',
+    'pages_initial_name' => 'New Page',
+    'pages_editing_draft_notification' => 'You are currently editing a draft that was last saved :timeDiff.',
+    'pages_draft_edited_notification' => 'This page has been updated by since that time. It is recommended that you discard this draft.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count users have started editing this page',
+        'start_b' => ':userName has started editing this page',
+        'time_a' => 'since the page was last updated',
+        'time_b' => 'in the last :minCount minutes',
+        'message' => ':start :time. Take care not to overwrite each other\'s updates!',
+    ],
+    'pages_draft_discarded' => 'Draft discarded, The editor has been updated with the current page content',
+    'pages_specific' => 'Specific Page',
+    'pages_is_template' => 'Page Template',
+
+    // Editor Sidebar
+    'page_tags' => 'Page Tags',
+    'chapter_tags' => 'Chapter Tags',
+    'book_tags' => 'Book Tags',
+    'shelf_tags' => 'Shelf Tags',
+    'tag' => 'Tag',
+    'tags' =>  'Tags',
+    'tag_name' =>  'Tag Name',
+    'tag_value' => 'Tag Value (Optional)',
+    'tags_explain' => "Add some tags to better categorise your content. \n You can assign a value to a tag for more in-depth organisation.",
+    'tags_add' => 'Add another tag',
+    'tags_remove' => 'Remove this tag',
+    'attachments' => 'Attachments',
+    'attachments_explain' => 'Upload some files or attach some links to display on your page. These are visible in the page sidebar.',
+    'attachments_explain_instant_save' => 'Changes here are saved instantly.',
+    'attachments_items' => 'Attached Items',
+    'attachments_upload' => 'Upload File',
+    'attachments_link' => 'Attach Link',
+    'attachments_set_link' => 'Set Link',
+    'attachments_delete_confirm' => 'Click delete again to confirm you want to delete this attachment.',
+    'attachments_dropzone' => 'Drop files or click here to attach a file',
+    'attachments_no_files' => 'No files have been uploaded',
+    'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.',
+    'attachments_link_name' => 'Link Name',
+    'attachment_link' => 'Attachment link',
+    'attachments_link_url' => 'Link to file',
+    'attachments_link_url_hint' => 'Url of site or file',
+    'attach' => 'Attach',
+    'attachments_edit_file' => 'Edit File',
+    'attachments_edit_file_name' => 'File Name',
+    'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite',
+    'attachments_order_updated' => 'Attachment order updated',
+    'attachments_updated_success' => 'Attachment details updated',
+    'attachments_deleted' => 'Attachment deleted',
+    'attachments_file_uploaded' => 'File successfully uploaded',
+    'attachments_file_updated' => 'File successfully updated',
+    'attachments_link_attached' => 'Link successfully attached to page',
+    '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',
+
+    // Profile View
+    'profile_user_for_x' => 'User for :time',
+    'profile_created_content' => 'Created Content',
+    'profile_not_created_pages' => ':userName has not created any pages',
+    'profile_not_created_chapters' => ':userName has not created any chapters',
+    'profile_not_created_books' => ':userName has not created any books',
+    'profile_not_created_shelves' => ':userName has not created any shelves',
+
+    // Comments
+    'comment' => 'Comment',
+    'comments' => 'Comments',
+    'comment_add' => 'Add Comment',
+    'comment_placeholder' => 'Leave a comment here',
+    'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
+    'comment_save' => 'Save Comment',
+    'comment_saving' => 'Saving comment...',
+    'comment_deleting' => 'Deleting comment...',
+    'comment_new' => 'New Comment',
+    'comment_created' => 'commented :createDiff',
+    'comment_updated' => 'Updated :updateDiff by :username',
+    'comment_deleted_success' => 'Comment deleted',
+    'comment_created_success' => 'Comment added',
+    'comment_updated_success' => 'Comment updated',
+    'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
+    'comment_in_reply_to' => 'In reply to :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'Are you sure you want to delete this revision?',
+    'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.',
+    'revision_delete_success' => 'Revision deleted',
+    'revision_cannot_delete_latest' => 'Cannot delete the latest revision.'
+];
\ No newline at end of file
diff --git a/resources/lang/fa/errors.php b/resources/lang/fa/errors.php
new file mode 100644 (file)
index 0000000..06a5285
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Text shown in error messaging.
+ */
+return [
+
+    // Permissions
+    'permission' => 'You do not have permission to access the requested page.',
+    'permissionJson' => 'You do not have permission to perform the requested action.',
+
+    // Auth
+    'error_user_exists_different_creds' => 'A user with the email :email already exists but with different credentials.',
+    'email_already_confirmed' => 'Email has already been confirmed, Try logging in.',
+    'email_confirmation_invalid' => 'This confirmation token is not valid or has already been used, Please try registering again.',
+    'email_confirmation_expired' => 'The confirmation token has expired, A new confirmation email has been sent.',
+    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'ldap_fail_anonymous' => 'LDAP access failed using anonymous bind',
+    'ldap_fail_authed' => 'LDAP access failed using given dn & password details',
+    'ldap_extension_not_installed' => 'LDAP PHP extension not installed',
+    'ldap_cannot_connect' => 'Cannot connect to ldap server, Initial connection failed',
+    'saml_already_logged_in' => 'Already logged in',
+    'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
+    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
+    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
+    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'social_no_action_defined' => 'No action defined',
+    'social_login_bad_response' => "Error received during :socialAccount login: \n:error",
+    'social_account_in_use' => 'This :socialAccount account is already in use, Try logging in via the :socialAccount option.',
+    'social_account_email_in_use' => 'The email :email is already in use. If you already have an account you can connect your :socialAccount account from your profile settings.',
+    'social_account_existing' => 'This :socialAccount is already attached to your profile.',
+    'social_account_already_used_existing' => 'This :socialAccount account is already used by another user.',
+    'social_account_not_used' => 'This :socialAccount account is not linked to any users. Please attach it in your profile settings. ',
+    'social_account_register_instructions' => 'If you do not yet have an account, You can register an account using the :socialAccount option.',
+    'social_driver_not_found' => 'Social driver not found',
+    'social_driver_not_configured' => 'Your :socialAccount social settings are not configured correctly.',
+    'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
+
+    // System
+    'path_not_writable' => 'File path :filePath could not be uploaded to. Ensure it is writable to the server.',
+    'cannot_get_image_from_url' => 'Cannot get image from :url',
+    'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.',
+    'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.',
+    'uploaded'  => 'The server does not allow uploads of this size. Please try a smaller file size.',
+    'image_upload_error' => 'An error occurred uploading the image',
+    'image_upload_type_error' => 'The image type being uploaded is invalid',
+    'file_upload_timeout' => 'The file upload has timed out.',
+
+    // Attachments
+    'attachment_page_mismatch' => 'Page mismatch during attachment update',
+    'attachment_not_found' => 'Attachment not found',
+
+    // Pages
+    'page_draft_autosave_fail' => 'Failed to save draft. Ensure you have internet connection before saving this page',
+    'page_custom_home_deletion' => 'Cannot delete a page while it is set as a homepage',
+
+    // Entities
+    'entity_not_found' => 'Entity not found',
+    'bookshelf_not_found' => 'Bookshelf not found',
+    'book_not_found' => 'Book not found',
+    'page_not_found' => 'Page not found',
+    'chapter_not_found' => 'Chapter not found',
+    'selected_book_not_found' => 'The selected book was not found',
+    'selected_book_chapter_not_found' => 'The selected Book or Chapter was not found',
+    'guests_cannot_save_drafts' => 'Guests cannot save drafts',
+
+    // Users
+    'users_cannot_delete_only_admin' => 'You cannot delete the only admin',
+    'users_cannot_delete_guest' => 'You cannot delete the guest user',
+
+    // Roles
+    'role_cannot_be_edited' => 'This role cannot be edited',
+    'role_system_cannot_be_deleted' => 'This role is a system role and cannot be deleted',
+    'role_registration_default_cannot_delete' => 'This role cannot be deleted while set as the default registration role',
+    'role_cannot_remove_only_admin' => 'This user is the only user assigned to the administrator role. Assign the administrator role to another user before attempting to remove it here.',
+
+    // Comments
+    'comment_list' => 'An error occurred while fetching the comments.',
+    'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.',
+    'comment_add' => 'An error occurred while adding / updating the comment.',
+    'comment_delete' => 'An error occurred while deleting the comment.',
+    'empty_comment' => 'Cannot add an empty comment.',
+
+    // Error pages
+    '404_page_not_found' => 'Page Not Found',
+    'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
+    'return_home' => 'Return to home',
+    'error_occurred' => 'An Error Occurred',
+    'app_down' => ':appName is down right now',
+    'back_soon' => 'It will be back up soon.',
+
+    // API errors
+    'api_no_authorization_found' => 'No authorization token found on the request',
+    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
+    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
+    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
+    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
+    'api_user_token_expired' => 'The authorization token used has expired',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
+];
diff --git a/resources/lang/fa/pagination.php b/resources/lang/fa/pagination.php
new file mode 100644 (file)
index 0000000..85bd12f
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; Previous',
+    'next'     => 'Next &raquo;',
+
+];
diff --git a/resources/lang/fa/passwords.php b/resources/lang/fa/passwords.php
new file mode 100644 (file)
index 0000000..f41ca78
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Password Reminder Language Lines
+ * The following language lines are the default lines which match reasons
+ * that are given by the password broker for a password update attempt has failed.
+ */
+return [
+
+    'password' => 'Passwords must be at least eight characters and match the confirmation.',
+    'user' => "We can't find a user with that e-mail address.",
+    'token' => 'This password reset token is invalid.',
+    'sent' => 'We have e-mailed your password reset link!',
+    'reset' => 'Your password has been reset!',
+
+];
diff --git a/resources/lang/fa/settings.php b/resources/lang/fa/settings.php
new file mode 100644 (file)
index 0000000..35bb09c
--- /dev/null
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Settings text strings
+ * Contains all text strings used in the general settings sections of BookStack
+ * including users and roles.
+ */
+return [
+
+    // Common Messages
+    'settings' => 'Settings',
+    'settings_save' => 'Save Settings',
+    'settings_save_success' => 'Settings saved',
+
+    // App Settings
+    'app_customization' => 'Customization',
+    'app_features_security' => 'Features & Security',
+    'app_name' => 'Application Name',
+    'app_name_desc' => 'This name is shown in the header and in any system-sent emails.',
+    'app_name_header' => 'Show name in header',
+    'app_public_access' => 'Public Access',
+    'app_public_access_desc' => 'Enabling this option will allow visitors, that are not logged-in, to access content in your BookStack instance.',
+    'app_public_access_desc_guest' => 'Access for public visitors can be controlled through the "Guest" user.',
+    'app_public_access_toggle' => 'Allow public access',
+    'app_public_viewing' => 'Allow public viewing?',
+    'app_secure_images' => 'Higher Security Image Uploads',
+    'app_secure_images_toggle' => 'Enable higher security image uploads',
+    'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.',
+    'app_editor' => 'Page Editor',
+    'app_editor_desc' => 'Select which editor will be used by all users to edit pages.',
+    'app_custom_html' => 'Custom HTML Head Content',
+    'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the <head> section of every page. This is handy for overriding styles or adding analytics code.',
+    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
+    'app_logo' => 'Application Logo',
+    'app_logo_desc' => 'This image should be 43px in height. <br>Large images will be scaled down.',
+    'app_primary_color' => 'Application Primary Color',
+    'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.',
+    'app_homepage' => 'Application Homepage',
+    'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.',
+    'app_homepage_select' => 'Select a page',
+    'app_disable_comments' => 'Disable Comments',
+    'app_disable_comments_toggle' => 'Disable comments',
+    'app_disable_comments_desc' => 'Disables comments across all pages in the application. <br> Existing comments are not shown.',
+
+    // Color settings
+    'content_colors' => 'Content Colors',
+    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
+    'bookshelf_color' => 'Shelf Color',
+    'book_color' => 'Book Color',
+    'chapter_color' => 'Chapter Color',
+    'page_color' => 'Page Color',
+    'page_draft_color' => 'Page Draft Color',
+
+    // Registration Settings
+    'reg_settings' => 'Registration',
+    'reg_enable' => 'Enable Registration',
+    'reg_enable_toggle' => 'Enable registration',
+    'reg_enable_desc' => 'When registration is enabled user will be able to sign themselves up as an application user. Upon registration they are given a single, default user role.',
+    'reg_default_role' => 'Default user role after registration',
+    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_email_confirmation' => 'Email Confirmation',
+    'reg_email_confirmation_toggle' => 'Require email confirmation',
+    'reg_confirm_email_desc' => 'If domain restriction is used then email confirmation will be required and this option will be ignored.',
+    'reg_confirm_restrict_domain' => 'Domain Restriction',
+    'reg_confirm_restrict_domain_desc' => 'Enter a comma separated list of email domains you would like to restrict registration to. Users will be sent an email to confirm their address before being allowed to interact with the application. <br> Note that users will be able to change their email addresses after successful registration.',
+    'reg_confirm_restrict_domain_placeholder' => 'No restriction set',
+
+    // Maintenance settings
+    'maint' => 'Maintenance',
+    'maint_image_cleanup' => 'Cleanup Images',
+    'maint_image_cleanup_desc' => "Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.",
+    'maint_image_cleanup_ignore_revisions' => 'Ignore images in revisions',
+    'maint_image_cleanup_run' => 'Run Cleanup',
+    'maint_image_cleanup_warning' => ':count potentially unused images were found. Are you sure you want to delete these images?',
+    'maint_image_cleanup_success' => ':count potentially unused images found and deleted!',
+    'maint_image_cleanup_nothing_found' => 'No unused images found, Nothing deleted!',
+    'maint_send_test_email' => 'Send a Test Email',
+    'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.',
+    'maint_send_test_email_run' => 'Send test email',
+    'maint_send_test_email_success' => 'Email sent to :address',
+    'maint_send_test_email_mail_subject' => 'Test Email',
+    'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!',
+    'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.',
+
+    // Role Settings
+    'roles' => 'Roles',
+    'role_user_roles' => 'User Roles',
+    'role_create' => 'Create New Role',
+    'role_create_success' => 'Role successfully created',
+    'role_delete' => 'Delete Role',
+    'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
+    'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
+    'role_delete_no_migration' => "Don't migrate users",
+    'role_delete_sure' => 'Are you sure you want to delete this role?',
+    'role_delete_success' => 'Role successfully deleted',
+    'role_edit' => 'Edit Role',
+    'role_details' => 'Role Details',
+    'role_name' => 'Role Name',
+    'role_desc' => 'Short Description of Role',
+    'role_external_auth_id' => 'External Authentication IDs',
+    'role_system' => 'System Permissions',
+    'role_manage_users' => 'Manage users',
+    'role_manage_roles' => 'Manage roles & role permissions',
+    'role_manage_entity_permissions' => 'Manage all book, chapter & page permissions',
+    'role_manage_own_entity_permissions' => 'Manage permissions on own book, chapter & pages',
+    'role_manage_page_templates' => 'Manage page templates',
+    'role_access_api' => 'Access system API',
+    'role_manage_settings' => 'Manage app settings',
+    'role_asset' => 'Asset Permissions',
+    'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
+    'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.',
+    'role_all' => 'All',
+    'role_own' => 'Own',
+    'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
+    'role_save' => 'Save Role',
+    'role_update_success' => 'Role successfully updated',
+    'role_users' => 'Users in this role',
+    'role_users_none' => 'No users are currently assigned to this role',
+
+    // Users
+    'users' => 'Users',
+    'user_profile' => 'User Profile',
+    'users_add_new' => 'Add New User',
+    'users_search' => 'Search Users',
+    'users_details' => 'User Details',
+    'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.',
+    'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.',
+    'users_role' => 'User Roles',
+    'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.',
+    'users_password' => 'User Password',
+    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 characters long.',
+    'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
+    'users_send_invite_option' => 'Send user invite email',
+    'users_external_auth_id' => 'External Authentication ID',
+    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_password_warning' => 'Only fill the below if you would like to change your password.',
+    'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.',
+    'users_delete' => 'Delete User',
+    'users_delete_named' => 'Delete user :userName',
+    'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.',
+    'users_delete_confirm' => 'Are you sure you want to delete this user?',
+    'users_delete_success' => 'Users successfully removed',
+    'users_edit' => 'Edit User',
+    'users_edit_profile' => 'Edit Profile',
+    'users_edit_success' => 'User successfully updated',
+    'users_avatar' => 'User Avatar',
+    'users_avatar_desc' => 'Select an image to represent this user. This should be approx 256px square.',
+    'users_preferred_language' => 'Preferred Language',
+    'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.',
+    'users_social_accounts' => 'Social Accounts',
+    'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not revoke previously authorized access. Revoke access from your profile settings on the connected social account.',
+    'users_social_connect' => 'Connect Account',
+    'users_social_disconnect' => 'Disconnect Account',
+    'users_social_connected' => ':socialAccount account was successfully attached to your profile.',
+    'users_social_disconnected' => ':socialAccount account was successfully disconnected from your profile.',
+    'users_api_tokens' => 'API Tokens',
+    'users_api_tokens_none' => 'No API tokens have been created for this user',
+    'users_api_tokens_create' => 'Create Token',
+    'users_api_tokens_expires' => 'Expires',
+    'users_api_tokens_docs' => 'API Documentation',
+
+    // API Tokens
+    'user_api_token_create' => 'Create API Token',
+    'user_api_token_name' => 'Name',
+    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
+    'user_api_token_expiry' => 'Expiry Date',
+    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
+    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
+    'user_api_token_create_success' => 'API token successfully created',
+    'user_api_token_update_success' => 'API token successfully updated',
+    'user_api_token' => 'API Token',
+    'user_api_token_id' => 'Token ID',
+    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_secret' => 'Token Secret',
+    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
+    'user_api_token_created' => 'Token Created :timeAgo',
+    'user_api_token_updated' => 'Token Updated :timeAgo',
+    'user_api_token_delete' => 'Delete Token',
+    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
+    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
+    'user_api_token_delete_success' => 'API token successfully deleted',
+
+    //! If editing translations files directly please ignore this in all
+    //! languages apart from en. Content will be auto-copied from en.
+    //!////////////////////////////////
+    'language_select' => [
+        'en' => 'English',
+        'ar' => 'العربية',
+        'cs' => 'Česky',
+        'da' => 'Dansk',
+        'de' => 'Deutsch (Sie)',
+        'de_informal' => 'Deutsch (Du)',
+        'es' => 'Español',
+        'es_AR' => 'Español Argentina',
+        'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
+        'nl' => 'Nederlands',
+        'pl' => 'Polski',
+        'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
+        'sk' => 'Slovensky',
+        'sl' => 'Slovenščina',
+        'sv' => 'Svenska',
+        'tr' => 'Türkçe',
+        'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
+        'zh_CN' => '简体中文',
+        'zh_TW' => '繁體中文',
+    ]
+    //!////////////////////////////////
+];
diff --git a/resources/lang/fa/validation.php b/resources/lang/fa/validation.php
new file mode 100644 (file)
index 0000000..76b57a2
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => 'The :attribute must be accepted.',
+    'active_url'           => 'The :attribute is not a valid URL.',
+    'after'                => 'The :attribute must be a date after :date.',
+    'alpha'                => 'The :attribute may only contain letters.',
+    'alpha_dash'           => 'The :attribute may only contain letters, numbers, dashes and underscores.',
+    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
+    'array'                => 'The :attribute must be an array.',
+    'before'               => 'The :attribute must be a date before :date.',
+    'between'              => [
+        'numeric' => 'The :attribute must be between :min and :max.',
+        'file'    => 'The :attribute must be between :min and :max kilobytes.',
+        'string'  => 'The :attribute must be between :min and :max characters.',
+        'array'   => 'The :attribute must have between :min and :max items.',
+    ],
+    'boolean'              => 'The :attribute field must be true or false.',
+    'confirmed'            => 'The :attribute confirmation does not match.',
+    'date'                 => 'The :attribute is not a valid date.',
+    'date_format'          => 'The :attribute does not match the format :format.',
+    'different'            => 'The :attribute and :other must be different.',
+    'digits'               => 'The :attribute must be :digits digits.',
+    'digits_between'       => 'The :attribute must be between :min and :max digits.',
+    'email'                => 'The :attribute must be a valid email address.',
+    'ends_with' => 'The :attribute must end with one of the following: :values',
+    'filled'               => 'The :attribute field is required.',
+    'gt'                   => [
+        'numeric' => 'The :attribute must be greater than :value.',
+        'file'    => 'The :attribute must be greater than :value kilobytes.',
+        'string'  => 'The :attribute must be greater than :value characters.',
+        'array'   => 'The :attribute must have more than :value items.',
+    ],
+    'gte'                  => [
+        'numeric' => 'The :attribute must be greater than or equal :value.',
+        'file'    => 'The :attribute must be greater than or equal :value kilobytes.',
+        'string'  => 'The :attribute must be greater than or equal :value characters.',
+        'array'   => 'The :attribute must have :value items or more.',
+    ],
+    'exists'               => 'The selected :attribute is invalid.',
+    'image'                => 'The :attribute must be an image.',
+    'image_extension'      => 'The :attribute must have a valid & supported image extension.',
+    'in'                   => 'The selected :attribute is invalid.',
+    'integer'              => 'The :attribute must be an integer.',
+    'ip'                   => 'The :attribute must be a valid IP address.',
+    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
+    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
+    'json'                 => 'The :attribute must be a valid JSON string.',
+    'lt'                   => [
+        'numeric' => 'The :attribute must be less than :value.',
+        'file'    => 'The :attribute must be less than :value kilobytes.',
+        'string'  => 'The :attribute must be less than :value characters.',
+        'array'   => 'The :attribute must have less than :value items.',
+    ],
+    'lte'                  => [
+        'numeric' => 'The :attribute must be less than or equal :value.',
+        'file'    => 'The :attribute must be less than or equal :value kilobytes.',
+        'string'  => 'The :attribute must be less than or equal :value characters.',
+        'array'   => 'The :attribute must not have more than :value items.',
+    ],
+    'max'                  => [
+        'numeric' => 'The :attribute may not be greater than :max.',
+        'file'    => 'The :attribute may not be greater than :max kilobytes.',
+        'string'  => 'The :attribute may not be greater than :max characters.',
+        'array'   => 'The :attribute may not have more than :max items.',
+    ],
+    'mimes'                => 'The :attribute must be a file of type: :values.',
+    'min'                  => [
+        'numeric' => 'The :attribute must be at least :min.',
+        'file'    => 'The :attribute must be at least :min kilobytes.',
+        'string'  => 'The :attribute must be at least :min characters.',
+        'array'   => 'The :attribute must have at least :min items.',
+    ],
+    'no_double_extension'  => 'The :attribute must only have a single file extension.',
+    'not_in'               => 'The selected :attribute is invalid.',
+    'not_regex'            => 'The :attribute format is invalid.',
+    'numeric'              => 'The :attribute must be a number.',
+    'regex'                => 'The :attribute format is invalid.',
+    'required'             => 'The :attribute field is required.',
+    'required_if'          => 'The :attribute field is required when :other is :value.',
+    'required_with'        => 'The :attribute field is required when :values is present.',
+    'required_with_all'    => 'The :attribute field is required when :values is present.',
+    'required_without'     => 'The :attribute field is required when :values is not present.',
+    'required_without_all' => 'The :attribute field is required when none of :values are present.',
+    'same'                 => 'The :attribute and :other must match.',
+    'size'                 => [
+        'numeric' => 'The :attribute must be :size.',
+        'file'    => 'The :attribute must be :size kilobytes.',
+        'string'  => 'The :attribute must be :size characters.',
+        'array'   => 'The :attribute must contain :size items.',
+    ],
+    'string'               => 'The :attribute must be a string.',
+    'timezone'             => 'The :attribute must be a valid zone.',
+    'unique'               => 'The :attribute has already been taken.',
+    'url'                  => 'The :attribute format is invalid.',
+    'uploaded'             => 'The file could not be uploaded. The server may not accept files of this size.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'Password confirmation required',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index af31f458a51e220d68b0e32da87e5e7ac800fc23..9a618d73a85060206410b8767fc5af02d867d493 100644 (file)
@@ -38,7 +38,7 @@ return [
     'reset' => 'Réinitialiser',
     'remove' => 'Enlever',
     'add' => 'Ajouter',
-    'fullscreen' => 'Fullscreen',
+    'fullscreen' => 'Plein écran',
 
     // Sort Options
     'sort_options' => 'Options de tri',
index 709b208b03298af35f682a3fa781de6a1350b23e..2c697e67df9d21adc094981e865d33babe89e65e 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Page non trouvée',
     'sorry_page_not_found' => 'Désolé, cette page n\'a pas pu être trouvée.',
+    'sorry_page_not_found_permission_warning' => 'Si vous vous attendiez à ce que cette page existe, il se peut que vous n\'ayez pas l\'autorisation de la consulter.',
     'return_home' => 'Retour à l\'accueil',
     'error_occurred' => 'Une erreur est survenue',
     'app_down' => ':appName n\'est pas en service pour le moment',
@@ -92,8 +93,11 @@ return [
     'api_no_authorization_found' => 'Aucun jeton d\'autorisation trouvé pour la demande',
     'api_bad_authorization_format' => 'Un jeton d\'autorisation a été trouvé pour la requête, mais le format semble incorrect',
     'api_user_token_not_found' => 'Aucun jeton API correspondant n\'a été trouvé pour le jeton d\'autorisation fourni',
-    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
-    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
+    'api_incorrect_token_secret' => 'Le secret fourni pour le jeton d\'API utilisé est incorrect',
+    'api_user_no_api_permission' => 'Le propriétaire du jeton API utilisé n\'a pas la permission de passer des appels API',
     'api_user_token_expired' => 'Le jeton d\'autorisation utilisé a expiré',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Erreur émise lors de l\'envoi d\'un e-mail de test :',
+
 ];
index 2fd8980aeb0925ad20cd420c5faab505de540ffd..ab56d8ea2df7b4bcee60fe00003d06099be38ca2 100644 (file)
@@ -29,7 +29,7 @@ return [
     'app_editor_desc' => 'Sélectionnez l\'éditeur qui sera utilisé pour modifier les pages.',
     'app_custom_html' => 'HTML personnalisé dans l\'en-tête',
     'app_custom_html_desc' => 'Le contenu inséré ici sera ajouté en bas de la balise <head> de toutes les pages. Vous pouvez l\'utiliser pour ajouter du CSS personnalisé ou un tracker analytique.',
-    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
+    'app_custom_html_disabled_notice' => 'Le contenu de la tête HTML personnalisée est désactivé sur cette page de paramètres pour garantir que les modifications les plus récentes peuvent être annulées.',
     'app_logo' => 'Logo de l\'Application',
     'app_logo_desc' => 'Cette image doit faire 43px de hauteur. <br>Les images plus larges seront réduites.',
     'app_primary_color' => 'Couleur principale de l\'application',
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Activer l\'inscription',
     'reg_enable_desc' => 'Lorsque l\'inscription est activée, l\'utilisateur pourra s\'enregistrer en tant qu\'utilisateur de l\'application. Lors de l\'inscription, ils se voient attribuer un rôle par défaut.',
     'reg_default_role' => 'Rôle par défaut lors de l\'inscription',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'L\'option ci-dessus est ignorée lorsque l\'authentification externe LDAP ou SAML est activée. Les comptes utilisateur pour les membres non existants seront créés automatiquement si l\'authentification, par rapport au système externe utilisé, est réussie.',
     'reg_email_confirmation' => 'Confirmation de l\'e-mail',
     'reg_email_confirmation_toggle' => 'Obliger la confirmation par e-mail ?',
     'reg_confirm_email_desc' => 'Si la restriction de domaine est activée, la confirmation sera automatiquement obligatoire et cette valeur sera ignorée.',
@@ -131,7 +131,7 @@ return [
     'users_send_invite_text' => 'Vous pouvez choisir d\'envoyer à cet utilisateur un email d\'invitation qui lui permet de définir son propre mot de passe, sinon vous pouvez définir son mot de passe vous-même.',
     'users_send_invite_option' => 'Envoyer l\'e-mail d\'invitation',
     'users_external_auth_id' => 'Identifiant d\'authentification externe',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'C\'est l\'ID utilisé pour correspondre à cet utilisateur lors de la communication avec votre système d\'authentification externe.',
     'users_password_warning' => 'Remplissez ce formulaire uniquement si vous souhaitez changer de mot de passe:',
     'users_system_public' => 'Cet utilisateur représente les invités visitant votre instance. Il est assigné automatiquement aux invités.',
     'users_delete' => 'Supprimer un utilisateur',
@@ -161,21 +161,21 @@ return [
     // API Tokens
     'user_api_token_create' => 'Créer un nouveau jeton API',
     'user_api_token_name' => 'Nom',
-    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
+    'user_api_token_name_desc' => 'Donnez à votre jeton un nom lisible pour l\'identifier plus tard.',
     'user_api_token_expiry' => 'Date d\'expiration',
-    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
-    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
+    'user_api_token_expiry_desc' => 'Définissez une date à laquelle ce jeton expire. Après cette date, les demandes effectuées à l\'aide de ce jeton ne fonctionneront plus. Le fait de laisser ce champ vide entraînera une expiration dans 100 ans.',
+    'user_api_token_create_secret_message' => 'Immédiatement après la création de ce jeton, un "ID de jeton" "et" Secret de jeton "sera généré et affiché. Le secret ne sera affiché qu\'une seule fois, alors assurez-vous de copier la valeur dans un endroit sûr et sécurisé avant de continuer.',
     'user_api_token_create_success' => 'L\'API token a été créé avec succès',
     'user_api_token_update_success' => 'L\'API token a été mis à jour avec succès',
     'user_api_token' => 'Token API',
     'user_api_token_id' => 'Token ID',
-    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_id_desc' => 'Il s\'agit d\'un identifiant généré par le système non modifiable pour ce jeton qui devra être fourni dans les demandes d\'API.',
     'user_api_token_secret' => 'Token Secret',
-    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
+    'user_api_token_secret_desc' => 'Il s\'agit d\'un secret généré par le système pour ce jeton, qui devra être fourni dans les demandes d\'API. Cela ne sera affiché qu\'une seule fois, alors copiez cette valeur dans un endroit sûr et sécurisé.',
     'user_api_token_created' => 'Jeton créé :timeAgo',
     'user_api_token_updated' => 'Jeton mis à jour :timeAgo',
     'user_api_token_delete' => 'Supprimer le Token',
-    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
+    'user_api_token_delete_warning' => 'Cela supprimera complètement le jeton d\'API avec le nom \':tokenName\'.',
     'user_api_token_delete_confirm' => 'Souhaitez-vous vraiment effacer l\'API Token ?',
     'user_api_token_delete_success' => 'L\'API token a été supprimé avec succès',
 
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Danois',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
diff --git a/resources/lang/he/activities.php b/resources/lang/he/activities.php
new file mode 100644 (file)
index 0000000..3486017
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Activity text strings.
+ * Is used for all the text within activity logs & notifications.
+ */
+return [
+
+    // Pages
+    'page_create'                 => 'created page',
+    'page_create_notification'    => 'הדף נוצר בהצלחה',
+    'page_update'                 => 'updated page',
+    'page_update_notification'    => 'הדף עודכן בהצלחה',
+    'page_delete'                 => 'deleted page',
+    'page_delete_notification'    => 'הדף הוסר בהצלחה',
+    'page_restore'                => 'restored page',
+    'page_restore_notification'   => 'הדף שוחזר בהצלחה',
+    'page_move'                   => 'moved page',
+
+    // Chapters
+    'chapter_create'              => 'created chapter',
+    'chapter_create_notification' => 'הפרק נוצר בהצלחה',
+    'chapter_update'              => 'updated chapter',
+    'chapter_update_notification' => 'הפרק עודכן בהצלחה',
+    'chapter_delete'              => 'deleted chapter',
+    'chapter_delete_notification' => 'הפרק הוסר בהצלחה',
+    'chapter_move'                => 'moved chapter',
+
+    // Books
+    'book_create'                 => 'created book',
+    'book_create_notification'    => 'הספר נוצר בהצלחה',
+    'book_update'                 => 'updated book',
+    'book_update_notification'    => 'הספר עודכן בהצלחה',
+    'book_delete'                 => 'deleted book',
+    'book_delete_notification'    => 'הספר הוסר בהצלחה',
+    'book_sort'                   => 'sorted book',
+    'book_sort_notification'      => 'הספר מוין מחדש בהצלחה',
+
+    // Bookshelves
+    'bookshelf_create'            => 'created Bookshelf',
+    'bookshelf_create_notification'    => 'מדף הספרים נוצר בהצלחה',
+    'bookshelf_update'                 => 'updated bookshelf',
+    'bookshelf_update_notification'    => 'מדף הספרים עודכן בהצלחה',
+    'bookshelf_delete'                 => 'deleted bookshelf',
+    'bookshelf_delete_notification'    => 'מדף הספרים הוסר בהצלחה',
+
+    // Other
+    'commented_on'                => 'commented on',
+];
diff --git a/resources/lang/he/auth.php b/resources/lang/he/auth.php
new file mode 100644 (file)
index 0000000..8a982db
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Authentication Language Lines
+ * The following language lines are used during authentication for various
+ * messages that we need to display to the user.
+ */
+return [
+
+    'failed' => 'פרטי ההתחברות אינם תואמים את הנתונים שלנו',
+    'throttle' => 'נסיונות התחברות רבים מדי, יש להמתין :seconds שניות ולנסות שנית',
+
+    // Login & Register
+    'sign_up' => 'הרשמה',
+    'log_in' => 'התחבר',
+    'log_in_with' => 'התחבר באמצעות :socialDriver',
+    'sign_up_with' => 'הרשם באמצעות :socialDriver',
+    'logout' => 'התנתק',
+
+    'name' => 'שם',
+    'username' => 'שם משתמש',
+    'email' => 'אי-מייל',
+    'password' => 'סיסמא',
+    'password_confirm' => 'אימות סיסמא',
+    'password_hint' => 'חייבת להיות יותר מ-5 תווים',
+    'forgot_password' => 'שכחת סיסמא?',
+    'remember_me' => 'זכור אותי',
+    'ldap_email_hint' => 'אנא ציין כתובת אי-מייל לשימוש בחשבון זה',
+    'create_account' => 'צור חשבון',
+    'already_have_account' => 'יש לך כבר חשבון?',
+    'dont_have_account' => 'אין לך חשבון?',
+    'social_login' => 'התחברות באמצעות אתר חברתי',
+    'social_registration' => 'הרשמה באמצעות אתר חברתי',
+    'social_registration_text' => 'הרשם והתחבר באמצעות שירות אחר',
+
+    'register_thanks' => 'תודה על הרשמתך!',
+    'register_confirm' => 'יש לבדוק את תיבת המייל שלך ולאשר את ההרשמה על מנת להשתמש ב:appName',
+    'registrations_disabled' => 'הרשמה כרגע מבוטלת',
+    'registration_email_domain_invalid' => 'לא ניתן להרשם באמצעות המייל שסופק',
+    'register_success' => 'תודה על הרשמתך! ניתן כעת להתחבר',
+
+
+    // Password Reset
+    'reset_password' => 'איפוס סיסמא',
+    'reset_password_send_instructions' => 'יש להזין את כתובת המייל למטה ואנו נשלח אלייך הוראות לאיפוס הסיסמא',
+    'reset_password_send_button' => 'שלח קישור לאיפוס סיסמא',
+    'reset_password_sent_success' => 'שלחנו הוראות לאיפוס הסיסמא אל :email',
+    'reset_password_success' => 'סיסמתך עודכנה בהצלחה',
+    'email_reset_subject' => 'איפוס סיסמא ב :appName',
+    'email_reset_text' => 'קישור זה נשלח עקב בקשה לאיפוס סיסמא בחשבון שלך',
+    'email_reset_not_requested' => 'אם לא ביקשת לאפס את סיסמתך, אפשר להתעלם ממייל זה',
+
+
+    // Email Confirmation
+    'email_confirm_subject' => 'אמת אי-מייל ב :appName',
+    'email_confirm_greeting' => 'תודה שהצטרפת אל :appName!',
+    'email_confirm_text' => 'יש לאמת את כתובת המייל של על ידי לחיצה על הכפור למטה:',
+    'email_confirm_action' => 'אמת כתובת אי-מייל',
+    'email_confirm_send_error' => 'נדרש אימות אי-מייל אך שליחת האי-מייל אליך נכשלה. יש ליצור קשר עם מנהל המערכת כדי לוודא שאכן ניתן לשלוח מיילים.',
+    'email_confirm_success' => 'האי-מייל שלך אושר!',
+    'email_confirm_resent' => 'אימות נשלח לאי-מייל שלך, יש לבדוק בתיבת הדואר הנכנס',
+
+    'email_not_confirmed' => 'כתובת המייל לא אומתה',
+    'email_not_confirmed_text' => 'כתובת המייל שלך טרם אומתה',
+    'email_not_confirmed_click_link' => 'יש ללחוץ על הקישור אשר נשלח אליך לאחר ההרשמה',
+    'email_not_confirmed_resend' => 'אם אינך מוצא את המייל, ניתן לשלוח בשנית את האימות על ידי לחיצה על הכפתור למטה',
+    'email_not_confirmed_resend_button' => 'שלח שוב מייל אימות',
+
+    // User Invite
+    'user_invite_email_subject' => 'You have been invited to join :appName!',
+    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
+    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
+    'user_invite_email_action' => 'Set Account Password',
+    'user_invite_page_welcome' => 'Welcome to :appName!',
+    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
+    'user_invite_page_confirm_button' => 'Confirm Password',
+    'user_invite_success' => 'Password set, you now have access to :appName!'
+];
\ No newline at end of file
diff --git a/resources/lang/he/common.php b/resources/lang/he/common.php
new file mode 100644 (file)
index 0000000..55c50bf
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Common elements found throughout many areas of BookStack.
+ */
+return [
+
+    // Buttons
+    'cancel' => 'ביטול',
+    'confirm' => 'אישור',
+    'back' => 'אחורה',
+    'save' => 'שמור',
+    'continue' => 'המשך',
+    'select' => 'בחר',
+    'toggle_all' => 'סמן הכל',
+    'more' => 'עוד',
+
+    // Form Labels
+    'name' => 'שם',
+    'description' => 'תיאור',
+    'role' => 'תפקיד',
+    'cover_image' => 'תמונת נושא',
+    'cover_image_description' => 'התמונה צריכה להיות בסביבות 440x250px',
+    
+    // Actions
+    'actions' => 'פעולות',
+    'view' => 'הצג',
+    'view_all' => 'הצג הכל',
+    'create' => 'צור',
+    'update' => 'עדכן',
+    'edit' => 'ערוך',
+    'sort' => 'מיין',
+    'move' => 'הזז',
+    'copy' => 'העתק',
+    'reply' => 'השב',
+    'delete' => 'מחק',
+    'search' => 'חיפוש',
+    'search_clear' => 'נקה חיפוש',
+    'reset' => 'איפוס',
+    'remove' => 'הסר',
+    'add' => 'הוסף',
+    'fullscreen' => 'Fullscreen',
+
+    // Sort Options
+    'sort_options' => 'Sort Options',
+    'sort_direction_toggle' => 'Sort Direction Toggle',
+    'sort_ascending' => 'Sort Ascending',
+    'sort_descending' => 'Sort Descending',
+    'sort_name' => 'שם',
+    'sort_created_at' => 'תאריך יצירה',
+    'sort_updated_at' => 'תאריך עדכון',
+
+    // Misc
+    'deleted_user' => 'משתמש שנמחק',
+    'no_activity' => 'אין פעילות להציג',
+    'no_items' => 'אין פריטים זמינים',
+    'back_to_top' => 'בחזרה ללמעלה',
+    'toggle_details' => 'הצג/הסתר פרטים',
+    'toggle_thumbnails' => 'הצג/הסתר תמונות',
+    'details' => 'פרטים',
+    'grid_view' => 'תצוגת רשת',
+    'list_view' => 'תצוגת רשימה',
+    'default' => 'ברירת מחדל',
+    'breadcrumb' => 'Breadcrumb',
+
+    // Header
+    'profile_menu' => 'Profile Menu',
+    'view_profile' => 'הצג פרופיל',
+    'edit_profile' => 'ערוך פרופיל',
+
+    // Layout tabs
+    'tab_info' => 'מידע',
+    'tab_content' => 'תוכן',
+
+    // Email Content
+    'email_action_help' => 'אם לא ניתן ללחות על כפתור ״:actionText״, יש להעתיק ולהדביק את הכתובת למטה אל דפדפן האינטרנט שלך:',
+    'email_rights' => 'כל הזכויות שמורות',
+];
diff --git a/resources/lang/he/components.php b/resources/lang/he/components.php
new file mode 100644 (file)
index 0000000..73dbe4e
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'בחירת תמונה',
+    'image_all' => 'הכל',
+    'image_all_title' => 'הצג את כל התמונות',
+    'image_book_title' => 'הצג תמונות שהועלו לספר זה',
+    'image_page_title' => 'הצג תמונות שהועלו לדף זה',
+    'image_search_hint' => 'חפש תמונה לפי שם',
+    'image_uploaded' => 'הועלה :uploadedDate',
+    'image_load_more' => 'טען עוד',
+    'image_image_name' => 'שם התמונה',
+    'image_delete_used' => 'תמונה זו בשימוש בדפים שמתחת',
+    'image_delete_confirm' => 'לחץ ״מחק״ שוב על מנת לאשר שברצונך למחוק תמונה זו',
+    'image_select_image' => 'בחר תמונה',
+    'image_dropzone' => 'גרור תמונות או לחץ כאן להעלאה',
+    'images_deleted' => 'התמונות נמחקו',
+    'image_preview' => 'תצוגה מקדימה',
+    'image_upload_success' => 'התמונה עלתה בהצלחה',
+    'image_update_success' => 'פרטי התמונה עודכנו בהצלחה',
+    'image_delete_success' => 'התמונה נמחקה בהצלחה',
+    'image_upload_remove' => 'מחק',
+
+    // Code Editor
+    'code_editor' => 'ערוך קוד',
+    'code_language' => 'שפת הקוד',
+    'code_content' => 'תוכן הקוד',
+    'code_save' => 'שמור קוד',
+];
diff --git a/resources/lang/he/entities.php b/resources/lang/he/entities.php
new file mode 100644 (file)
index 0000000..2fb0e82
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'נוצר לאחרונה',
+    'recently_created_pages' => 'דפים שנוצרו לאחרונה',
+    'recently_updated_pages' => 'דפים שעודכנו לאחרונה',
+    'recently_created_chapters' => 'פרקים שנוצרו לאחרונה',
+    'recently_created_books' => 'ספרים שנוצרו לאחרונה',
+    'recently_created_shelves' => 'מדפים שנוצרו לאחרונה',
+    'recently_update' => 'עודכן לאחרונה',
+    'recently_viewed' => 'נצפה לאחרונה',
+    'recent_activity' => 'פעילות לאחרונה',
+    'create_now' => 'צור אחד כעת',
+    'revisions' => 'עדכונים',
+    'meta_revision' => 'עדכון #:revisionCount',
+    'meta_created' => 'נוצר :timeLength',
+    'meta_created_name' => 'נוצר :timeLength על ידי :user',
+    'meta_updated' => 'עודכן :timeLength',
+    'meta_updated_name' => 'עודכן :timeLength על ידי :user',
+    'entity_select' => 'בחר יישות',
+    'images' => 'תמונות',
+    'my_recent_drafts' => 'הטיוטות האחרונות שלי',
+    'my_recently_viewed' => 'הנצפים לאחרונה שלי',
+    'no_pages_viewed' => 'לא צפית בדפים כלשהם',
+    'no_pages_recently_created' => 'לא נוצרו דפים לאחרונה',
+    'no_pages_recently_updated' => 'לא עודכנו דפים לאחרונה',
+    'export' => 'ייצוא',
+    'export_html' => 'דף אינטרנט',
+    'export_pdf' => 'קובץ PDF',
+    'export_text' => 'טקסט רגיל',
+
+    // Permissions and restrictions
+    'permissions' => 'הרשאות',
+    'permissions_intro' => 'ברגע שמסומן, הרשאות אלו יגברו על כל הרשאת תפקיד שקיימת',
+    'permissions_enable' => 'הפעל הרשאות מותאמות אישית',
+    'permissions_save' => 'שמור הרשאות',
+
+    // Search
+    'search_results' => 'תוצאות חיפוש',
+    'search_total_results_found' => ':count תוצאות נמצאו|:count סה״כ תוצאות',
+    'search_clear' => 'נקה חיפוש',
+    'search_no_pages' => 'לא נמצאו דפים התואמים לחיפוש',
+    'search_for_term' => 'חפש את :term',
+    'search_more' => 'תוצאות נוספות',
+    'search_filters' => 'מסנני חיפוש',
+    'search_content_type' => 'סוג התוכן',
+    'search_exact_matches' => 'התאמות מדויקות',
+    'search_tags' => 'חפש בתגים',
+    'search_options' => 'אפשרויות',
+    'search_viewed_by_me' => 'נצפו על ידי',
+    'search_not_viewed_by_me' => 'שלא נצפו על ידי',
+    'search_permissions_set' => 'סט הרשאות',
+    'search_created_by_me' => 'שנוצרו על ידי',
+    'search_updated_by_me' => 'שעודכנו על ידי',
+    'search_date_options' => 'אפשרויות תאריך',
+    'search_updated_before' => 'שעודכנו לפני',
+    'search_updated_after' => 'שעודכנו לאחר',
+    'search_created_before' => 'שנוצרו לפני',
+    'search_created_after' => 'שנוצרו לאחר',
+    'search_set_date' => 'הגדר תאריך',
+    'search_update' => 'עדכן חיפוש',
+
+    // Shelves
+    'shelf' => 'מדף',
+    'shelves' => 'מדפים',
+    'x_shelves' => ':count מדף|:count מדפים',
+    'shelves_long' => 'מדפים',
+    'shelves_empty' => 'לא נוצרו מדפים',
+    'shelves_create' => 'צור מדף חדש',
+    'shelves_popular' => 'מדפים פופולרים',
+    'shelves_new' => 'מדפים חדשים',
+    'shelves_new_action' => 'מדף חדש',
+    'shelves_popular_empty' => 'המדפים הפופולריים ביותר יופיעו כאן',
+    'shelves_new_empty' => 'המדפים שנוצרו לאחרונה יופיעו כאן',
+    'shelves_save' => 'שמור מדף',
+    'shelves_books' => 'ספרים במדף זה',
+    'shelves_add_books' => 'הוסף ספרים למדף זה',
+    'shelves_drag_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' => 'הרשאות מדף',
+    'shelves_permissions_updated' => 'הרשאות מדף עודכנו',
+    'shelves_permissions_active' => 'הרשאות מדף פעילות',
+    'shelves_copy_permissions_to_books' => 'העתק הרשאות מדף אל הספרים',
+    'shelves_copy_permissions' => 'העתק הרשאות',
+    'shelves_copy_permissions_explain' => 'פעולה זו תעתיק את כל הרשאות המדף לכל הספרים המשוייכים למדף זה. לפני הביצוע, יש לוודא שכל הרשאות המדף אכן נשמרו.',
+    'shelves_copy_permission_success' => 'הרשאות המדף הועתקו אל :count ספרים',
+
+    // Books
+    'book' => 'ספר',
+    'books' => 'ספרים',
+    'x_books' => ':count ספר|:count ספרים',
+    'books_empty' => 'לא נוצרו ספרים',
+    'books_popular' => 'ספרים פופולריים',
+    'books_recent' => 'ספרים אחרונים',
+    'books_new' => 'ספרים חדשים',
+    'books_new_action' => 'ספר חדש',
+    'books_popular_empty' => 'הספרים הפופולריים יופיעו כאן',
+    'books_new_empty' => 'הספרים שנוצרו לאחרונה יופיעו כאן',
+    'books_create' => 'צור ספר חדש',
+    'books_delete' => 'מחק ספר',
+    'books_delete_named' => 'מחק ספר :bookName',
+    'books_delete_explain' => 'פעולה זו תמחק את הספר :bookName, כל הדפים והפרקים ימחקו גם כן.',
+    'books_delete_confirmation' => 'האם ברצונך למחוק את הספר הזה?',
+    'books_edit' => 'ערוך ספר',
+    'books_edit_named' => 'עריכת ספר :bookName',
+    'books_form_book_name' => 'שם הספר',
+    'books_save' => 'שמור ספר',
+    'books_permissions' => 'הרשאות ספר',
+    'books_permissions_updated' => 'הרשאות הספר עודכנו',
+    'books_empty_contents' => 'לא נוצרו פרקים או דפים עבור ספר זה',
+    'books_empty_create_page' => 'צור דף חדש',
+    'books_empty_sort_current_book' => 'מיין את הספר הנוכחי',
+    'books_empty_add_chapter' => 'הוסף פרק',
+    'books_permissions_active' => 'הרשאות ספר פעילות',
+    'books_search_this' => 'חפש בספר זה',
+    'books_navigation' => 'ניווט בספר',
+    'books_sort' => 'מיין את תוכן הספר',
+    'books_sort_named' => 'מיין את הספר :bookName',
+    'books_sort_name' => 'מיין לפי שם',
+    'books_sort_created' => 'מיין לפי תאריך יצירה',
+    'books_sort_updated' => 'מיין לפי תאריך עדכון',
+    'books_sort_chapters_first' => 'פרקים בהתחלה',
+    'books_sort_chapters_last' => 'פרקים בסוף',
+    'books_sort_show_other' => 'הצג ספרים אחרונים',
+    'books_sort_save' => 'שמור את הסדר החדש',
+
+    // Chapters
+    'chapter' => 'פרק',
+    'chapters' => 'פרקים',
+    'x_chapters' => ':count פרק|:count פרקים',
+    'chapters_popular' => 'פרקים פופולריים',
+    'chapters_new' => 'פרק חדש',
+    'chapters_create' => 'צור פרק חדש',
+    'chapters_delete' => 'מחק פרק',
+    'chapters_delete_named' => 'מחק את פרק :chapterName',
+    'chapters_delete_explain' => 'פעולה זו תמחוק את הפרק בשם \':chapterName\'. כל הדפים יועברו אוטומטית לספר עצמו',
+    'chapters_delete_confirm' => 'האם ברצונך למחוק פרק זה?',
+    'chapters_edit' => 'ערוך פרק',
+    'chapters_edit_named' => 'ערוך פרק :chapterName',
+    'chapters_save' => 'שמור פרק',
+    'chapters_move' => 'העבר פרק',
+    'chapters_move_named' => 'העבר פרק :chapterName',
+    'chapter_move_success' => 'הפרק הועבר אל :bookName',
+    'chapters_permissions' => 'הרשאות פרק',
+    'chapters_empty' => 'לא נמצאו דפים בפרק זה.',
+    'chapters_permissions_active' => 'הרשאות פרק פעילות',
+    'chapters_permissions_success' => 'הרשאות פרק עודכנו',
+    'chapters_search_this' => 'חפש בפרק זה',
+
+    // Pages
+    'page' => 'דף',
+    'pages' => 'דפים',
+    'x_pages' => ':count דף|:count דפים',
+    'pages_popular' => 'דפים פופולריים',
+    'pages_new' => 'דף חדש',
+    'pages_attachments' => 'קבצים מצורפים',
+    'pages_navigation' => 'ניווט בדף',
+    'pages_delete' => 'מחק דף',
+    'pages_delete_named' => 'מחק דף :pageName',
+    'pages_delete_draft_named' => 'מחק טיוטת דף :pageName',
+    'pages_delete_draft' => 'מחק טיוטת דף',
+    'pages_delete_success' => 'הדף נמחק',
+    'pages_delete_draft_success' => 'טיוטת דף נמחקה',
+    'pages_delete_confirm' => 'האם ברצונך למחוק דף זה?',
+    'pages_delete_draft_confirm' => 'האם ברצונך למחוק את טיוטת הדף הזה?',
+    'pages_editing_named' => 'עריכת דף :pageName',
+    'pages_edit_draft_options' => 'Draft Options',
+    'pages_edit_save_draft' => 'שמור טיוטה',
+    'pages_edit_draft' => 'ערוך טיוטת דף',
+    'pages_editing_draft' => 'עריכת טיוטה',
+    'pages_editing_page' => 'עריכת דף',
+    'pages_edit_draft_save_at' => 'טיוטה נשמרה ב ',
+    'pages_edit_delete_draft' => 'מחק טיוטה',
+    'pages_edit_discard_draft' => 'התעלם מהטיוטה',
+    'pages_edit_set_changelog' => 'הגדר יומן שינויים',
+    'pages_edit_enter_changelog_desc' => 'ציין תיאור קצר אודות השינויים שביצעת',
+    'pages_edit_enter_changelog' => 'הכנס יומן שינויים',
+    'pages_save' => 'שמור דף',
+    'pages_title' => 'כותרת דף',
+    'pages_name' => 'שם הדף',
+    'pages_md_editor' => 'עורך',
+    'pages_md_preview' => 'תצוגה מקדימה',
+    'pages_md_insert_image' => 'הכנס תמונה',
+    'pages_md_insert_link' => 'הכנס קישור ליישות',
+    'pages_md_insert_drawing' => 'הכנס סרטוט',
+    'pages_not_in_chapter' => 'דף אינו חלק מפרק',
+    'pages_move' => 'העבר דף',
+    'pages_move_success' => 'הדף הועבר אל ":parentName"',
+    'pages_copy' => 'העתק דף',
+    'pages_copy_desination' => 'העתק יעד',
+    'pages_copy_success' => 'הדף הועתק בהצלחה',
+    'pages_permissions' => 'הרשאות דף',
+    'pages_permissions_success' => 'הרשאות הדף עודכנו',
+    'pages_revision' => 'נוסח',
+    'pages_revisions' => 'נוסחי דף',
+    'pages_revisions_named' => 'נוסחי דף עבור :pageName',
+    'pages_revision_named' => 'נוסח דף עבור :pageName',
+    'pages_revisions_created_by' => 'נוצר על ידי',
+    'pages_revisions_date' => 'תאריך נוסח',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'נוסח #:id',
+    'pages_revisions_numbered_changes' => 'שינויי נוסח #:id',
+    'pages_revisions_changelog' => 'יומן שינויים',
+    'pages_revisions_changes' => 'שינויים',
+    'pages_revisions_current' => 'גירסא נוכחית',
+    'pages_revisions_preview' => 'תצוגה מקדימה',
+    'pages_revisions_restore' => 'שחזר',
+    'pages_revisions_none' => 'לדף זה אין נוסחים',
+    'pages_copy_link' => 'העתק קישור',
+    'pages_edit_content_link' => 'ערוך תוכן',
+    'pages_permissions_active' => 'הרשאות דף פעילות',
+    'pages_initial_revision' => 'פרסום ראשוני',
+    'pages_initial_name' => 'דף חדש',
+    'pages_editing_draft_notification' => 'הינך עורך טיוטה אשר נשמרה לאחרונה ב :timeDiff',
+    'pages_draft_edited_notification' => 'דף זה עודכן מאז, מומלץ להתעלם מהטיוטה הזו.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count משתמשים החלו לערוך דף זה',
+        'start_b' => ':userName החל לערוך דף זה',
+        'time_a' => 'מאז שהדף עודכן לאחרונה',
+        'time_b' => 'ב :minCount דקות האחרונות',
+        'message' => ':start :time. יש לשים לב לא לדרוס שינויים של משתמשים אחרים!',
+    ],
+    'pages_draft_discarded' => 'הסקיצה נמחקה, העורך עודכן עם תוכן הדף העכשוי',
+    'pages_specific' => 'דף ספציפי',
+    'pages_is_template' => 'Page Template',
+
+    // Editor Sidebar
+    'page_tags' => 'תגיות דף',
+    'chapter_tags' => 'תגיות פרק',
+    'book_tags' => 'תגיות ספר',
+    'shelf_tags' => 'תגיות מדף',
+    'tag' => 'תגית',
+    'tags' =>  'תגיות',
+    'tag_name' =>  'Tag Name',
+    'tag_value' => 'ערך התגית (אופציונאלי)',
+    'tags_explain' => "הכנס תגיות על מנת לסדר את התוכן שלך. \n  ניתן לציין ערך לתגית על מנת לבצע סידור יסודי יותר",
+    'tags_add' => 'הוסף תגית נוספת',
+    'tags_remove' => 'Remove this tag',
+    'attachments' => 'קבצים מצורפים',
+    'attachments_explain' => 'צרף קבצים או קישורים על מנת להציגם בדף שלך. צירופים אלו יהיו זמינים בתפריט הצדדי של הדף',
+    'attachments_explain_instant_save' => 'שינויים נשמרים באופן מיידי',
+    'attachments_items' => 'פריטים שצורפו',
+    'attachments_upload' => 'העלה קובץ',
+    'attachments_link' => 'צרף קישור',
+    'attachments_set_link' => 'הגדר קישור',
+    'attachments_delete_confirm' => 'יש ללחוץ שוב על מחיקה על מנת לאשר את מחיקת הקובץ המצורף',
+    'attachments_dropzone' => 'גרור לכאן קבצים או לחץ על מנת לצרף קבצים',
+    'attachments_no_files' => 'לא הועלו קבצים',
+    'attachments_explain_link' => 'ניתן לצרף קישור במקום העלאת קובץ, קישור זה יכול להוביל לדף אחר או לכל קובץ באינטרנט',
+    'attachments_link_name' => 'שם הקישור',
+    'attachment_link' => 'כתובת הקישור',
+    'attachments_link_url' => 'קישור לקובץ',
+    'attachments_link_url_hint' => 'כתובת האתר או הקובץ',
+    'attach' => 'צרף',
+    'attachments_edit_file' => 'ערוך קובץ',
+    'attachments_edit_file_name' => 'שם הקובץ',
+    'attachments_edit_drop_upload' => 'גרור קבצים או לחץ כאן על מנת להעלות קבצים במקום הקבצים הקיימים',
+    'attachments_order_updated' => 'סדר הקבצים עודכן',
+    'attachments_updated_success' => 'פרטי הקבצים עודכנו',
+    'attachments_deleted' => 'קובץ מצורף הוסר',
+    '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',
+
+    // Profile View
+    'profile_user_for_x' => 'משתמש במערכת כ :time',
+    'profile_created_content' => 'תוכן שנוצר',
+    'profile_not_created_pages' => 'המשתמש :userName לא יצר דפים',
+    'profile_not_created_chapters' => 'המשתמש :userName לא יצר פרקים',
+    'profile_not_created_books' => 'המשתמש :userName לא יצר ספרים',
+    'profile_not_created_shelves' => 'המשתמש :userName לא יצר מדפים',
+
+    // Comments
+    'comment' => 'תגובה',
+    'comments' => 'תגובות',
+    'comment_add' => 'הוסף תגובה',
+    'comment_placeholder' => 'השאר תגובה כאן',
+    'comment_count' => '{0} אין תגובות|{1} 1 תגובה|[2,*] :count תגובות',
+    'comment_save' => 'שמור תגובה',
+    'comment_saving' => 'שומר תגובה...',
+    'comment_deleting' => 'מוחק תגובה...',
+    'comment_new' => 'תגובה חדשה',
+    'comment_created' => 'הוגב :createDiff',
+    'comment_updated' => 'עודכן :updateDiff על ידי :username',
+    'comment_deleted_success' => 'התגובה נמחקה',
+    'comment_created_success' => 'התגובה נוספה',
+    'comment_updated_success' => 'התגובה עודכנה',
+    'comment_delete_confirm' => 'האם ברצונך למחוק תגובה זו?',
+    'comment_in_reply_to' => 'בתגובה ל :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'האם ברצונך למחוק נוסח זה?',
+    'revision_restore_confirm' => 'האם ברצונך לשחזר נוסח זה? תוכן הדף הנוכחי יעודכן לנוסח זה.',
+    'revision_delete_success' => 'נוסח נמחק',
+    'revision_cannot_delete_latest' => 'לא ניתן למחוק את הנוסח האחרון'
+];
\ No newline at end of file
diff --git a/resources/lang/he/errors.php b/resources/lang/he/errors.php
new file mode 100644 (file)
index 0000000..9920f1b
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Text shown in error messaging.
+ */
+return [
+
+    // Permissions
+    'permission' => 'אין לך הרשאות על מנת לצפות בדף המבוקש.',
+    'permissionJson' => 'אין לך הרשאות על מנת לבצע את הפעולה המבוקשת.',
+
+    // Auth
+    'error_user_exists_different_creds' => 'משתמש עם המייל :email כבר קיים אך עם פרטי הזדהות שונים',
+    'email_already_confirmed' => 'המייל כבר אומת, אנא נסה להתחבר',
+    'email_confirmation_invalid' => 'מפתח האימות אינו תקין או שכבר נעשה בו שימוש, אנא נסה להרשם שנית',
+    'email_confirmation_expired' => 'מפתח האימות פג-תוקף, מייל אימות חדש נשלח שוב.',
+    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'ldap_fail_anonymous' => 'LDAP access failed using anonymous bind',
+    'ldap_fail_authed' => 'LDAP access failed using given dn & password details',
+    'ldap_extension_not_installed' => 'LDAP PHP extension not installed',
+    'ldap_cannot_connect' => 'Cannot connect to ldap server, Initial connection failed',
+    'saml_already_logged_in' => 'Already logged in',
+    'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
+    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
+    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
+    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'social_no_action_defined' => 'לא הוגדרה פעולה',
+    'social_login_bad_response' => "Error received during :socialAccount login: \n:error",
+    'social_account_in_use' => 'החשבון :socialAccount כבר בשימוש. אנא נסה להתחבר באמצעות אפשרות :socialAccount',
+    'social_account_email_in_use' => 'המייל :email כבר נמצא בשימוש. אם כבר יש ברשותך חשבון ניתן להתחבר באמצעות :socialAccount ממסך הגדרות הפרופיל שלך.',
+    'social_account_existing' => 'ה - :socialAccount כבר מחובר לחשבון שלך.',
+    'social_account_already_used_existing' => 'This :socialAccount account is already used by another user.',
+    'social_account_not_used' => 'החשבון :socialAccount אינו מחובר למשתמש כלשהוא. אנא חבר אותו לחשבונך במסך הגדרות הפרופיל שלך.',
+    'social_account_register_instructions' => 'אם אין ברשותך חשבון, תוכל להרשם באמצעות :socialAccount',
+    'social_driver_not_found' => 'Social driver not found',
+    'social_driver_not_configured' => 'הגדרות ה :socialAccount אינן מוגדרות כראוי',
+    'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
+
+    // System
+    'path_not_writable' => 'לא ניתן להעלות את :filePath אנא ודא שניתן לכתוב למיקום זה',
+    'cannot_get_image_from_url' => 'לא ניתן לקבל תמונה מ :url',
+    'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.',
+    'server_upload_limit' => 'השרת אינו מרשה העלאת קבצים במשקל זה. אנא נסה להעלות קובץ קטן יותר.',
+    'uploaded'  => 'השרת אינו מרשה העלאת קבצים במשקל זה. אנא נסה להעלות קובץ קטן יותר.',
+    'image_upload_error' => 'התרחשה שגיאה במהלך העלאת התמונה',
+    'image_upload_type_error' => 'התמונה שהועלתה אינה תקינה',
+    'file_upload_timeout' => 'The file upload has timed out.',
+
+    // Attachments
+    'attachment_page_mismatch' => 'Page mismatch during attachment update',
+    'attachment_not_found' => 'קובץ מצורף לא נמצא',
+
+    // Pages
+    'page_draft_autosave_fail' => 'שגיאה בשמירת הטיוטה. אנא ודא כי חיבור האינטרנט תקין לפני שמירת דף זה.',
+    'page_custom_home_deletion' => 'לא ניתן למחוק דף אשר מוגדר כדף הבית',
+
+    // Entities
+    'entity_not_found' => 'פריט לא נמצא',
+    'bookshelf_not_found' => 'מדף הספרים לא נמצא',
+    'book_not_found' => 'ספר לא נמצא',
+    'page_not_found' => 'דף לא נמצא',
+    'chapter_not_found' => 'פרק לא נמצא',
+    'selected_book_not_found' => 'הספר שנבחר לא נמצא',
+    'selected_book_chapter_not_found' => 'הפרק או הספר שנבחר לא נמצאו',
+    'guests_cannot_save_drafts' => 'אורחים אינם יכולים לשמור סקיצות',
+
+    // Users
+    'users_cannot_delete_only_admin' => 'אינך יכול למחוק את המנהל היחיד',
+    'users_cannot_delete_guest' => 'אינך יכול למחוק את משתמש האורח',
+
+    // Roles
+    'role_cannot_be_edited' => 'לא ניתן לערוך תפקיד זה',
+    'role_system_cannot_be_deleted' => 'תפקיד זה הינו תפקיד מערכת ולא ניתן למחיקה',
+    'role_registration_default_cannot_delete' => 'לא ניתן למחוק תפקיד זה מכיוון שהוא מוגדר כתפקיד ברירת המחדל בעת הרשמה',
+    'role_cannot_remove_only_admin' => 'משתמש זה הינו המשתמש היחיד המשוייך לפקיד המנהל. נסה לשייך את תפקיד המנהל למשתמש נוסף לפני הסרה כאן',
+
+    // Comments
+    'comment_list' => 'התרחשה שגיאה בעת שליפת התגובות',
+    'cannot_add_comment_to_draft' => 'אינך יכול להוסיף תגובות לסקיצה זו',
+    'comment_add' => 'התרחשה שגיאה בעת הוספה / עדכון התגובה',
+    'comment_delete' => 'התרחשה שגיאה בעת מחיקת התגובה',
+    'empty_comment' => 'לא ניתן להוסיף תגובה ריקה',
+
+    // Error pages
+    '404_page_not_found' => 'דף לא קיים',
+    'sorry_page_not_found' => 'מצטערים, הדף שחיפשת אינו קיים',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
+    'return_home' => 'בחזרה לדף הבית',
+    'error_occurred' => 'התרחשה שגיאה',
+    'app_down' => ':appName כרגע אינו זמין',
+    'back_soon' => 'מקווים שיחזור במהרה',
+
+    // API errors
+    'api_no_authorization_found' => 'No authorization token found on the request',
+    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
+    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
+    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
+    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
+    'api_user_token_expired' => 'The authorization token used has expired',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
+];
diff --git a/resources/lang/he/pagination.php b/resources/lang/he/pagination.php
new file mode 100644 (file)
index 0000000..8f7c5c4
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; הקודם',
+    'next'     => 'הבא &raquo;',
+
+];
diff --git a/resources/lang/he/passwords.php b/resources/lang/he/passwords.php
new file mode 100644 (file)
index 0000000..9ada7bc
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Password Reminder Language Lines
+ * The following language lines are the default lines which match reasons
+ * that are given by the password broker for a password update attempt has failed.
+ */
+return [
+
+    'password' => 'הסיסמא חייבת להיות בעלת 6 תווים ולהתאים לאימות',
+    'user' => "לא ניתן למצוא משתמש עם המייל שסופק",
+    'token' => 'איפוס הסיסמא אינו תקין',
+    'sent' => 'נשלח אליך אי-מייל עם קישור לאיפוס הסיסמא',
+    'reset' => 'איפוס הסיסמא הושלם בהצלחה!',
+
+];
diff --git a/resources/lang/he/settings.php b/resources/lang/he/settings.php
new file mode 100755 (executable)
index 0000000..103f939
--- /dev/null
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Settings text strings
+ * Contains all text strings used in the general settings sections of BookStack
+ * including users and roles.
+ */
+return [
+
+    // Common Messages
+    'settings' => 'הגדרות',
+    'settings_save' => 'שמור הגדרות',
+    'settings_save_success' => 'ההגדרות נשמרו',
+
+    // App Settings
+    'app_customization' => 'התאמה אישית',
+    'app_features_security' => 'מאפיינים ואבטחה',
+    'app_name' => 'שם היישום',
+    'app_name_desc' => 'השם הזה יופיע בכותרת ובכל אי-מייל הנשלח מהמערכת',
+    'app_name_header' => 'הצג שם בחלק העליון',
+    'app_public_access' => 'גישה ציבורית',
+    'app_public_access_desc' => 'הפעלת אפשרות זו תאפשר למשתמשים אשר אינם רשומים לגשת לתוכן שלך',
+    'app_public_access_desc_guest' => 'הגדרות הרשאה למשתמשים ציבוריים ניתנות לשינוי דרך משתמש מסוג ״אורח״',
+    'app_public_access_toggle' => 'אפשר גישה ציבורית',
+    'app_public_viewing' => 'לאפשר גישה ציבורית?',
+    'app_secure_images' => 'העלאת תמונות מאובטחת',
+    'app_secure_images_toggle' => 'אפשר העלאת תמונות מאובטחת',
+    'app_secure_images_desc' => 'משיקולי ביצועים, כל התמונות הינן ציבוריות. אפשרות זו מוסיפה מחרוזת אקראית שקשה לנחש לכל כתובת של תמונה. אנא ודא שאפשרות הצגת תוכן התיקייה מבוטל.',
+    'app_editor' => 'עורך הדפים',
+    'app_editor_desc' => 'בחר באמצעות איזה עורך תתבצע עריכת הדפים',
+    'app_custom_html' => 'HTML מותאם אישית לחלק העליון',
+    'app_custom_html_desc' => 'כל קוד שיתווסף כאן, יופיע בתחתית תגית ה head של כל דף. חלק זה שימושי על מנת להגדיר עיצובי CSS והתקנת קוד Analytics',
+    'app_custom_html_disabled_notice' => 'קוד HTML מותאם מבוטל בדף ההגדרות על מנת לוודא ששינויים שגורמים לבעיה יוכלו להיות מבוטלים לאחר מכן',
+    'app_logo' => 'לוגו היישום',
+    'app_logo_desc' => 'תמונה זו צריכה להיות בגובה 43 פיקסלים. תמונות גדולות יותר יוקטנו.',
+    'app_primary_color' => 'צבע עיקרי ליישום',
+    'app_primary_color_desc' => 'ערך זה צריך להיות מסוג hex. <br> יש להשאיר ריק לשימוש בצבע ברירת המחדל',
+    'app_homepage' => 'דף הבית של היישום',
+    'app_homepage_desc' => 'אנא בחר דף להצגה בדף הבית במקום דף ברירת המחדל. הרשאות הדף לא יחולו בדפים הנבחרים.',
+    'app_homepage_select' => 'בחר דף',
+    'app_disable_comments' => 'ביטול תגובות',
+    'app_disable_comments_toggle' => 'בטל תגובות',
+    'app_disable_comments_desc' => 'מבטל את התגובות לאורך כל היישום, תגובות קיימות לא יוצגו.',
+
+    // Color settings
+    'content_colors' => 'Content Colors',
+    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
+    'bookshelf_color' => 'Shelf Color',
+    'book_color' => 'Book Color',
+    'chapter_color' => 'Chapter Color',
+    'page_color' => 'Page Color',
+    'page_draft_color' => 'Page Draft Color',
+
+    // Registration Settings
+    'reg_settings' => 'הרשמה',
+    'reg_enable' => 'אפשר הרשמה',
+    'reg_enable_toggle' => 'אפשר להרשם',
+    'reg_enable_desc' => 'כאשר אפשר להרשם משתמשים יוכלו להכנס באופן עצמאי. בעת ההרשמה המשתמש יקבל הרשאה יחידה כברירת מחדל.',
+    'reg_default_role' => 'הרשאה כברירת מחדל',
+    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_email_confirmation' => 'אימות כתובת אי-מייל',
+    'reg_email_confirmation_toggle' => 'יש לאמת את כתובת המייל',
+    'reg_confirm_email_desc' => 'אם מופעלת הגבלה לדומיין ספציפי אז אימות המייל לא יבוצע',
+    'reg_confirm_restrict_domain' => 'הגבלה לדומיין ספציפי',
+    'reg_confirm_restrict_domain_desc' => 'הכנס דומיינים מופרדים בפסיק אשר עבורם תוגבל ההרשמה. משתמשים יקבלו אי-מייל על מנת לאמת את כתובת המייל שלהם. <br> לתשומת לבך: משתמש יוכל לשנות את כתובת המייל שלו לאחר ההרשמה',
+    'reg_confirm_restrict_domain_placeholder' => 'אין הגבלה לדומיין',
+
+    // Maintenance settings
+    'maint' => 'תחזוקה',
+    'maint_image_cleanup' => 'ניקוי תמונות',
+    'maint_image_cleanup_desc' => "סורק את הדפים והגרסאות על מנת למצוא אילו תמונות לא בשימוש. יש לוודא גיבוי מלא של מסד הנתונים והתמונות לפני הרצה",
+    'maint_image_cleanup_ignore_revisions' => 'התעלם מהתמונות בגרסאות',
+    'maint_image_cleanup_run' => 'הפעל ניקוי תמונות',
+    'maint_image_cleanup_warning' => 'נמצאו כ :count תמונות אשר לא בשימוש האם ברצונך להמשיך?',
+    'maint_image_cleanup_success' => ':count תמונות שלא בשימוש נמחקו',
+    'maint_image_cleanup_nothing_found' => 'לא נמצאו תמונות אשר לא בשימוש, לא נמחקו קבצים כלל.',
+    'maint_send_test_email' => 'Send a Test Email',
+    'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.',
+    'maint_send_test_email_run' => 'Send test email',
+    'maint_send_test_email_success' => 'Email sent to :address',
+    'maint_send_test_email_mail_subject' => 'Test Email',
+    'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!',
+    'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.',
+
+    // Role Settings
+    'roles' => 'תפקידים',
+    'role_user_roles' => 'תפקידי משתמשים',
+    'role_create' => 'צור תפקיד משתמש חדש',
+    'role_create_success' => 'התפקיד נוצר בהצלחה',
+    'role_delete' => 'מחק תפקיד',
+    'role_delete_confirm' => 'פעולה זו תמחק את התפקיד: :roleName',
+    'role_delete_users_assigned' => 'לתפקיד :userCount יש משתמשים אשר משויכים אליו. אם ברצונך להעבירם לתפקיד אחר אנא בחר תפקיד מלמטה',
+    'role_delete_no_migration' => "אל תעביר משתמשים לתפקיד",
+    'role_delete_sure' => 'האם אתה בטוח שברצונך למחוק את התפקיד?',
+    'role_delete_success' => 'התפקיד נמחק בהצלחה',
+    'role_edit' => 'ערוך תפקיד',
+    'role_details' => 'פרטי תפקיד',
+    'role_name' => 'שם התפקיד',
+    'role_desc' => 'תיאור קצר של התפקיד',
+    'role_external_auth_id' => 'External Authentication IDs',
+    'role_system' => 'הרשאות מערכת',
+    'role_manage_users' => 'ניהול משתמשים',
+    'role_manage_roles' => 'ניהול תפקידים והרשאות תפקידים',
+    'role_manage_entity_permissions' => 'נהל הרשאות ספרים, פרקים ודפים',
+    'role_manage_own_entity_permissions' => 'נהל הרשאות על ספרים, פרקים ודפים בבעלותך',
+    'role_manage_page_templates' => 'Manage page templates',
+    'role_access_api' => 'Access system API',
+    'role_manage_settings' => 'ניהול הגדרות יישום',
+    'role_asset' => 'הרשאות משאבים',
+    'role_asset_desc' => 'הרשאות אלו שולטות בגישת ברירת המחדל למשאבים בתוך המערכת. הרשאות של ספרים, פרקים ודפים יגברו על הרשאות אלו.',
+    'role_asset_admins' => 'מנהלים מקבלים הרשאה מלאה לכל התוכן אך אפשרויות אלו עלולות להציג או להסתיר אפשרויות בממשק',
+    'role_all' => 'הכל',
+    'role_own' => 'שלי',
+    'role_controlled_by_asset' => 'נשלטים על ידי המשאב אליו הועלו',
+    'role_save' => 'שמור תפקיד',
+    'role_update_success' => 'התפקיד עודכן בהצלחה',
+    'role_users' => 'משתמשים משוייכים לתפקיד זה',
+    'role_users_none' => 'אין משתמשים המשוייכים לתפקיד זה',
+
+    // Users
+    'users' => 'משתמשים',
+    'user_profile' => 'פרופיל משתמש',
+    'users_add_new' => 'הוסף משתמש חדש',
+    'users_search' => 'חפש משתמשים',
+    'users_details' => 'פרטי משתמש',
+    'users_details_desc' => 'הגדר שם לתצוגה ומייל עבור משתמש זה. כתובת המייל תשמש על מנת להתחבר למערכת',
+    'users_details_desc_no_email' => 'הגדר שם לתצוגה כדי שאחרים יוכלו לזהות',
+    'users_role' => 'תפקידי משתמשים',
+    'users_role_desc' => 'בחר אילו תפקידים ישויכו למשתמש זה. אם המשתמש משוייך למספר תפקידים, ההרשאות יהיו כלל ההרשאות של כל התפקידים',
+    'users_password' => 'סיסמא',
+    'users_password_desc' => 'הגדר סיסמא עבור גישה למערכת. על הסיסמא להיות באורך של 5 תווים לפחות',
+    'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
+    'users_send_invite_option' => 'Send user invite email',
+    'users_external_auth_id' => 'זיהוי חיצוני - ID',
+    'users_external_auth_id_desc' => 'זיהוי זה יהיה בשימוש מול מערכת ה LDAP שלך',
+    'users_password_warning' => 'יש למלא רק אם ברצונך לשנות את הסיסמא.',
+    'users_system_public' => 'משתמש זה מייצג את כל האורחים שלא מזוהים אשר משתמשים במערכת. לא ניתן להתחבר למשתמש זה אך הוא מוגדר כברירת מחדל',
+    'users_delete' => 'מחק משתמש',
+    'users_delete_named' => 'מחק משתמש :userName',
+    'users_delete_warning' => 'פעולה זו תמחק את המשתמש \':userName\' מהמערכת',
+    'users_delete_confirm' => 'האם ברצונך למחוק משתמש זה?',
+    'users_delete_success' => 'המשתמש נמחק בהצלחה',
+    'users_edit' => 'עריכת משתמש',
+    'users_edit_profile' => 'עריכת פרופיל',
+    'users_edit_success' => 'המשתמש עודכן בהצלחה',
+    'users_avatar' => 'תמונת משתמש',
+    'users_avatar_desc' => 'בחר תמונה אשר תייצג את המשתמש. על התמונה להיות ריבוע של 256px',
+    'users_preferred_language' => 'שפה מועדפת',
+    'users_preferred_language_desc' => 'אפשרות זו תשנע את השפה אשר מוצגת בממשק המערכת. פעולה זו לא תשנה את התוכן אשר נכתב על ידי המשתמשים.',
+    'users_social_accounts' => 'רשתות חברתיות',
+    'users_social_accounts_info' => 'כן ניתן לשייך חשבונות אחרים שלך לחיבור וזיהוי קל ומהיר. ניתוק חשבון אינו מנתק גישה קיימת למערכת. לביצוע ניתוק יש לשנות את ההגדרה בהגדרות של חשבון הרשת החברתית',
+    'users_social_connect' => 'חיבור החשבון',
+    'users_social_disconnect' => 'ניתוק חשבון',
+    'users_social_connected' => 'חשבון :socialAccount חובר בהצלחה לחשבון שלך',
+    'users_social_disconnected' => ':socialAccount נותק בהצלחה מהחשבון שלך',
+    'users_api_tokens' => 'API Tokens',
+    'users_api_tokens_none' => 'No API tokens have been created for this user',
+    'users_api_tokens_create' => 'Create Token',
+    'users_api_tokens_expires' => 'Expires',
+    'users_api_tokens_docs' => 'API Documentation',
+
+    // API Tokens
+    'user_api_token_create' => 'Create API Token',
+    'user_api_token_name' => 'Name',
+    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
+    'user_api_token_expiry' => 'Expiry Date',
+    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
+    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
+    'user_api_token_create_success' => 'API token successfully created',
+    'user_api_token_update_success' => 'API token successfully updated',
+    'user_api_token' => 'API Token',
+    'user_api_token_id' => 'Token ID',
+    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_secret' => 'Token Secret',
+    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
+    'user_api_token_created' => 'Token Created :timeAgo',
+    'user_api_token_updated' => 'Token Updated :timeAgo',
+    'user_api_token_delete' => 'Delete Token',
+    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
+    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
+    'user_api_token_delete_success' => 'API token successfully deleted',
+
+    //! If editing translations files directly please ignore this in all
+    //! languages apart from en. Content will be auto-copied from en.
+    //!////////////////////////////////
+    'language_select' => [
+        'en' => 'English',
+        'ar' => 'العربية',
+        'cs' => 'Česky',
+        'da' => 'Dansk',
+        'de' => 'Deutsch (Sie)',
+        'de_informal' => 'Deutsch (Du)',
+        'es' => 'Español',
+        'es_AR' => 'Español Argentina',
+        'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
+        'nl' => 'Nederlands',
+        'pl' => 'Polski',
+        'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
+        'sk' => 'Slovensky',
+        'sl' => 'Slovenščina',
+        'sv' => 'Svenska',
+        'tr' => 'Türkçe',
+        'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
+        'zh_CN' => '简体中文',
+        'zh_TW' => '繁體中文',
+    ]
+    //!////////////////////////////////
+];
diff --git a/resources/lang/he/validation.php b/resources/lang/he/validation.php
new file mode 100644 (file)
index 0000000..2797a9c
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => 'שדה :attribute חייב להיות מסומן.',
+    'active_url'           => 'שדה :attribute הוא לא כתובת אתר תקנית.',
+    'after'                => 'שדה :attribute חייב להיות תאריך אחרי :date.',
+    'alpha'                => 'שדה :attribute יכול להכיל אותיות בלבד.',
+    'alpha_dash'           => 'שדה :attribute יכול להכיל אותיות, מספרים ומקפים בלבד.',
+    'alpha_num'            => 'שדה :attribute יכול להכיל אותיות ומספרים בלבד.',
+    'array'                => 'שדה :attribute חייב להיות מערך.',
+    'before'               => 'שדה :attribute חייב להיות תאריך לפני :date.',
+    'between'              => [
+        'numeric' => 'שדה :attribute חייב להיות בין :min ל-:max.',
+        'file'    => 'שדה :attribute חייב להיות בין :min ל-:max קילובייטים.',
+        'string'  => 'שדה :attribute חייב להיות בין :min ל-:max תווים.',
+        'array'   => 'שדה :attribute חייב להיות בין :min ל-:max פריטים.',
+    ],
+    'boolean'              => 'שדה :attribute חייב להיות אמת או שקר.',
+    'confirmed'            => 'שדה האישור של :attribute לא תואם.',
+    'date'                 => 'שדה :attribute אינו תאריך תקני.',
+    'date_format'          => 'שדה :attribute לא תואם את הפורמט :format.',
+    'different'            => 'שדה :attribute ושדה :other חייבים להיות שונים.',
+    'digits'               => 'שדה :attribute חייב להיות בעל :digits ספרות.',
+    'digits_between'       => 'שדה :attribute חייב להיות בין :min ו-:max ספרות.',
+    'email'                => 'שדה :attribute חייב להיות כתובת אימייל תקנית.',
+    'ends_with' => 'The :attribute must end with one of the following: :values',
+    'filled'               => 'שדה :attribute הוא חובה.',
+    'gt'                   => [
+        'numeric' => 'The :attribute must be greater than :value.',
+        'file'    => 'The :attribute must be greater than :value kilobytes.',
+        'string'  => 'The :attribute must be greater than :value characters.',
+        'array'   => 'The :attribute must have more than :value items.',
+    ],
+    'gte'                  => [
+        'numeric' => 'The :attribute must be greater than or equal :value.',
+        'file'    => 'The :attribute must be greater than or equal :value kilobytes.',
+        'string'  => 'The :attribute must be greater than or equal :value characters.',
+        'array'   => 'The :attribute must have :value items or more.',
+    ],
+    'exists'               => 'בחירת ה-:attribute אינה תקפה.',
+    'image'                => 'שדה :attribute חייב להיות תמונה.',
+    'image_extension'      => 'שדה :attribute חייב להיות מסוג תמונה נתמך',
+    'in'                   => 'בחירת ה-:attribute אינה תקפה.',
+    'integer'              => 'שדה :attribute חייב להיות מספר שלם.',
+    'ip'                   => 'שדה :attribute חייב להיות כתובת IP תקנית.',
+    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
+    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
+    'json'                 => 'The :attribute must be a valid JSON string.',
+    'lt'                   => [
+        'numeric' => 'The :attribute must be less than :value.',
+        'file'    => 'The :attribute must be less than :value kilobytes.',
+        'string'  => 'The :attribute must be less than :value characters.',
+        'array'   => 'The :attribute must have less than :value items.',
+    ],
+    'lte'                  => [
+        'numeric' => 'The :attribute must be less than or equal :value.',
+        'file'    => 'The :attribute must be less than or equal :value kilobytes.',
+        'string'  => 'The :attribute must be less than or equal :value characters.',
+        'array'   => 'The :attribute must not have more than :value items.',
+    ],
+    'max'                  => [
+        'numeric' => 'שדה :attribute אינו יכול להיות גדול מ-:max.',
+        'file'    => 'שדה :attribute לא יכול להיות גדול מ-:max קילובייטים.',
+        'string'  => 'שדה :attribute לא יכול להיות גדול מ-:max characters.',
+        'array'   => 'שדה :attribute לא יכול להכיל יותר מ-:max פריטים.',
+    ],
+    'mimes'                => 'שדה :attribute צריך להיות קובץ מסוג: :values.',
+    'min'                  => [
+        'numeric' => 'שדה :attribute חייב להיות לפחות :min.',
+        'file'    => 'שדה :attribute חייב להיות לפחות :min קילובייטים.',
+        'string'  => 'שדה :attribute חייב להיות לפחות :min תווים.',
+        'array'   => 'שדה :attribute חייב להיות לפחות :min פריטים.',
+    ],
+    'no_double_extension'  => 'השדה :attribute חייב להיות בעל סיומת קובץ אחת בלבד.',
+    'not_in'               => 'בחירת ה-:attribute אינה תקפה.',
+    'not_regex'            => 'The :attribute format is invalid.',
+    'numeric'              => 'שדה :attribute חייב להיות מספר.',
+    'regex'                => 'שדה :attribute בעל פורמט שאינו תקין.',
+    'required'             => 'שדה :attribute הוא חובה.',
+    'required_if'          => 'שדה :attribute נחוץ כאשר :other הוא :value.',
+    'required_with'        => 'שדה :attribute נחוץ כאשר :values נמצא.',
+    'required_with_all'    => 'שדה :attribute נחוץ כאשר :values נמצא.',
+    'required_without'     => 'שדה :attribute נחוץ כאשר :values לא בנמצא.',
+    'required_without_all' => 'שדה :attribute נחוץ כאשר אף אחד מ-:values נמצאים.',
+    'same'                 => 'שדה :attribute ו-:other חייבים להיות זהים.',
+    'size'                 => [
+        'numeric' => 'שדה :attribute חייב להיות :size.',
+        'file'    => 'שדה :attribute חייב להיות :size קילובייטים.',
+        'string'  => 'שדה :attribute חייב להיות :size תווים.',
+        'array'   => 'שדה :attribute חייב להכיל :size פריטים.',
+    ],
+    'string'               => 'שדה :attribute חייב להיות מחרוזת.',
+    'timezone'             => 'שדה :attribute חייב להיות איזור תקני.',
+    'unique'               => 'שדה :attribute כבר תפוס.',
+    'url'                  => 'שדה :attribute בעל פורמט שאינו תקין.',
+    'uploaded'             => 'שדה :attribute ארעה שגיאה בעת ההעלאה.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'נדרש אימות סיסמא',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index c901e5423394cefbd3907f2084cdffdab0cf0ab3..668e57783a0a8697581dd1b4e02a144ba07191a8 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Oldal nem található',
     'sorry_page_not_found' => 'Sajnáljuk, a keresett oldal nem található.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Vissza a kezdőlapra',
     'error_occurred' => 'Hiba örtént',
     'app_down' => ':appName jelenleg nem üzemel',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'A használt API vezérjel tulajdonosának nincs jogosultsága API hívások végrehajtásához',
     'api_user_token_expired' => 'A használt hitelesítési vezérjel lejárt',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Hiba történt egy teszt email küldésekor:',
+
 ];
index 1462fee5d109f3eb0f210e900e23a6defc6eb8cd..8a87db85aee9c8269ba25ffa6a886d5838ce7181 100644 (file)
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Regisztráció engedélyezése',
     'reg_enable_desc' => 'Ha a regisztráció engedélyezett, akkor a felhasználó képes lesz bejelentkezni mint az alkalmazás egy felhasználója. Regisztráció után egy egyszerű, alapértelmezés szerinti felhasználói szerepkör lesz hozzárendelve.',
     'reg_default_role' => 'Regisztráció utáni alapértelmezett felhasználói szerepkör',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'A fenti beállítási lehetőség nincs használatban, ha külső LDAP vagy SAML hitelesítés aktív. A nem létező tagok felhasználói fiókjai automatikusan létrejönnek ha a használatban lévő külső rendszeren sikeres a hitelesítés.',
     'reg_email_confirmation' => 'Email megerősítés',
     'reg_email_confirmation_toggle' => 'Email megerősítés szükséges',
     'reg_confirm_email_desc' => 'Ha a tartomány korlátozás be van állítva, akkor email megerősítés szükséges és ez a beállítás figyelmen kívül lesz hagyva.',
@@ -131,7 +131,7 @@ return [
     'users_send_invite_text' => 'Lehetséges egy meghívó emailt küldeni ennek a felhasználónak ami lehetővé teszi, hogy beállíthassa a saját jelszavát. Máskülönben a jelszót az erre jogosult felhasználónak kell beállítania.',
     'users_send_invite_option' => 'Felhasználó meghívó levél küldése',
     'users_external_auth_id' => 'Külső hitelesítés azonosítója',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'Ez az azonosító lesz használva a felhasználó ellenőrzéséhez mikor a külső hitelesítő rendszerrel kommunikál.',
     'users_password_warning' => 'A lenti mezőket csak a jelszó módosításához kell kitölteni.',
     'users_system_public' => 'Ez a felhasználó bármelyik, a példányt megtekintő felhasználót képviseli. Nem lehet vele bejelentkezni de automatikusan hozzá lesz rendelve.',
     'users_delete' => 'Felhasználó törlése',
@@ -170,7 +170,7 @@ return [
     'user_api_token' => 'API vezérjel',
     'user_api_token_id' => 'Vezérjel azonosító',
     'user_api_token_id_desc' => 'Ez egy nem szerkeszthető, a rendszer által létrehozott azonosító ehhez a vezérjelhez amire API kérésekben lehet szükség.',
-    'user_api_token_secret' => 'Token Secret',
+    'user_api_token_secret' => 'Vezérjel titkos kódja',
     'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
     'user_api_token_created' => 'Vezérjel létrehozva :timeAgo',
     'user_api_token_updated' => 'Vezérjel frissítve :timeAgo',
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 977f26e19c45b320d5176727c3403c342a017db6..ca605cde0c9c71c90dd76f9be2ee12ec2fa31431 100755 (executable)
@@ -13,7 +13,7 @@ return [
     'email_already_confirmed' => 'La mail è già stata confermata, esegui il login.',
     'email_confirmation_invalid' => 'Questo token di conferma non è valido o già stato utilizzato, registrati nuovamente.',
     'email_confirmation_expired' => 'Il token di conferma è scaduto, è stata inviata una nuova mail di conferma.',
-    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'email_confirmation_awaiting' => 'L\'indirizzo email per l\'account in uso deve essere confermato',
     'ldap_fail_anonymous' => 'Accesso LDAP fallito usando bind anonimo',
     'ldap_fail_authed' => 'Accesso LDAP fallito usando il dn e la password inseriti',
     'ldap_extension_not_installed' => 'L\'estensione PHP LDAP non è installata',
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Pagina Non Trovata',
     'sorry_page_not_found' => 'La pagina che stavi cercando non è stata trovata.',
+    'sorry_page_not_found_permission_warning' => 'Se pensi che questa pagina possa esistere, potresti non avere i permessi per visualizzarla.',
     'return_home' => 'Ritorna alla home',
     'error_occurred' => 'C\'è Stato un errore',
     'app_down' => ':appName è offline',
@@ -90,10 +91,13 @@ return [
 
     // API errors
     'api_no_authorization_found' => 'No authorization token found on the request',
-    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
+    'api_bad_authorization_format' => 'Un token di autorizzazione è stato trovato nella richiesta, ma il formato sembra non corretto',
     'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
     'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
-    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
+    'api_user_no_api_permission' => 'Il proprietario del token API utilizzato non ha il permesso di effettuare chiamate API',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index 3a1779f95fa81e74053a80552ee7e2956d7cc007..d4fb0b9c6a36bad5af4e1c13d8fb2f87d0554160 100755 (executable)
@@ -160,9 +160,9 @@ return [
 
     // API Tokens
     'user_api_token_create' => 'Create API Token',
-    'user_api_token_name' => 'Name',
+    'user_api_token_name' => 'Nome',
     'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
-    'user_api_token_expiry' => 'Expiry Date',
+    'user_api_token_expiry' => 'Data di scadenza',
     'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
     'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
     'user_api_token_create_success' => 'API token successfully created',
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
-        'da' => 'Dansk',
+        'cs' => 'Česky',
+        'da' => 'Danese',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Sloveno',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 65e8a7a79c9591ea0e187256cf6026597339bd1a..7cc560b43cfcb692cae22a1824f9bccd25f9838e 100644 (file)
@@ -16,17 +16,17 @@ return [
     'image_image_name' => '画像名',
     'image_delete_used' => 'この画像は以下のページで利用されています。',
     'image_delete_confirm' => '削除してもよろしければ、再度ボタンを押して下さい。',
-    'image_select_image' => '選択',
+    'image_select_image' => '画像を選択',
     'image_dropzone' => '画像をドロップするか、クリックしてアップロード',
     'images_deleted' => '画像を削除しました',
     'image_preview' => '画像プレビュー',
     'image_upload_success' => '画像がアップロードされました',
     'image_update_success' => '画像が更新されました',
     'image_delete_success' => '画像が削除されました',
-    'image_upload_remove' => 'Remove',
+    'image_upload_remove' => '削除',
 
     // Code Editor
-    'code_editor' => 'ã\83\97ã\83­ã\82°ã\83©ã\83 ã\83\96ã\83­ã\83\83ã\82¯ç·¨é\9b\86',
+    'code_editor' => 'ã\82³ã\83¼ã\83\89ã\82\92ç·¨é\9b\86ã\81\99ã\82\8b',
     'code_language' => 'プログラミング言語の選択',
     'code_content' => 'プログラム内容',
     'code_save' => 'プログラムを保存',
index cd0dd777c3b88a994a8002b8e64e844493ee1c72..ace2f77bd3d6d9947de0a707ee4b525ed35eccaa 100644 (file)
@@ -18,7 +18,7 @@ return [
     'ldap_fail_authed' => '識別名, パスワードを用いたLDAPアクセスに失敗しました',
     'ldap_extension_not_installed' => 'LDAP PHP extensionがインストールされていません',
     'ldap_cannot_connect' => 'LDAPサーバに接続できませんでした',
-    'saml_already_logged_in' => 'Already logged in',
+    'saml_already_logged_in' => '既にログインしています',
     'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
     'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
     'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
@@ -36,7 +36,7 @@ return [
     'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
 
     // System
-    'path_not_writable' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\83\91ã\82¹ :filePath ã\81¸ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82ã\82µã\83¼ã\83\90ä¸\8aã\81§ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\82\92許å\8f¯してください。',
+    'path_not_writable' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\83\91ã\82¹ :filePath ã\81¸ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82ã\82µã\83¼ã\83\90ä¸\8aã\81§ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\81\8c許å\8f¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\8b確èª\8dしてください。',
     'cannot_get_image_from_url' => ':url から画像を取得できませんでした。',
     'cannot_create_thumbs' => 'このサーバはサムネイルを作成できません。GD PHP extensionがインストールされていることを確認してください。',
     'server_upload_limit' => 'このサイズの画像をアップロードすることは許可されていません。ファイルサイズを小さくし、再試行してください。',
@@ -47,7 +47,7 @@ return [
 
     // Attachments
     'attachment_page_mismatch' => '添付を更新するページが一致しません',
-    'attachment_not_found' => 'Attachment not found',
+    'attachment_not_found' => '添付ファイルが見つかりません。',
 
     // Pages
     'page_draft_autosave_fail' => '下書きの保存に失敗しました。インターネットへ接続してください。',
@@ -75,7 +75,7 @@ return [
 
     // Comments
     'comment_list' => 'An error occurred while fetching the comments.',
-    'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.',
+    'cannot_add_comment_to_draft' => '下書きにコメントは追加できません。',
     'comment_add' => 'An error occurred while adding / updating the comment.',
     'comment_delete' => 'An error occurred while deleting the comment.',
     'empty_comment' => 'Cannot add an empty comment.',
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'ページが見つかりません',
     'sorry_page_not_found' => 'ページを見つけることができませんでした。',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'ホームに戻る',
     'error_occurred' => 'エラーが発生しました',
     'app_down' => ':appNameは現在停止しています',
@@ -94,6 +95,9 @@ return [
     'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
     'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
-    'api_user_token_expired' => 'The authorization token used has expired',
+    'api_user_token_expired' => '認証トークンが期限切れです。',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
 
 ];
index 5b1f31a05f9db09a80ef33b1e0abef021861a51a..3da916877f96ec7f679cec04cdbb3966fc8f23f3 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 506baf5a6c1d317d299b6a571b0ff30dd6c6a61a..a9e917e912aa453fa85e08ec3b3a8f1baa6af7c6 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => '404 Not Found',
     'sorry_page_not_found' => '문서를 못 찾았습니다.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => '처음으로 돌아가기',
     'error_occurred' => '문제가 생겼습니다.',
     'app_down' => ':appName에 문제가 있는 것 같습니다',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index 5523ee4d3039a338cdf21bd7d0a2a658015d10b2..bd23e380f5420372a317ac36f7701b3eceb29c42 100755 (executable)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 7dd2bdaa5288a215c474d469f17343d74a40d034..dca27ca396229562e3bc59cf578d1075fd630fb2 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Pagina Niet Gevonden',
     'sorry_page_not_found' => 'Sorry, de pagina die je zocht is niet beschikbaar.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Terug naar home',
     'error_occurred' => 'Er Ging Iets Fout',
     'app_down' => ':appName is nu niet beschikbaar',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index 0c320be639a48eb6a2822172661dcee1a19446f2..069ee65f885caaaf2a32a3f3a0a0167479024e2e 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index c31f04efa4b79a5012b739dc6b35900c323a9005..5273906a021a79703df56435a181f1ef0017189c 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Strona nie została znaleziona',
     'sorry_page_not_found' => 'Przepraszamy, ale strona której szukasz nie została znaleziona.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Powrót do strony głównej',
     'error_occurred' => 'Wystąpił błąd',
     'app_down' => ':appName jest aktualnie wyłączona',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index 4edb214da7663d6652472a89fcf431290ee13e6a..97f4222d6b34d775a6d8d9350ace204524173c21 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
diff --git a/resources/lang/pt/activities.php b/resources/lang/pt/activities.php
new file mode 100644 (file)
index 0000000..4cac54b
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Activity text strings.
+ * Is used for all the text within activity logs & notifications.
+ */
+return [
+
+    // Pages
+    'page_create'                 => 'created page',
+    'page_create_notification'    => 'Page Successfully Created',
+    'page_update'                 => 'updated page',
+    'page_update_notification'    => 'Page Successfully Updated',
+    'page_delete'                 => 'deleted page',
+    'page_delete_notification'    => 'Page Successfully Deleted',
+    'page_restore'                => 'restored page',
+    'page_restore_notification'   => 'Page Successfully Restored',
+    'page_move'                   => 'moved page',
+
+    // Chapters
+    'chapter_create'              => 'created chapter',
+    'chapter_create_notification' => 'Chapter Successfully Created',
+    'chapter_update'              => 'updated chapter',
+    'chapter_update_notification' => 'Chapter Successfully Updated',
+    'chapter_delete'              => 'deleted chapter',
+    'chapter_delete_notification' => 'Chapter Successfully Deleted',
+    'chapter_move'                => 'moved chapter',
+
+    // Books
+    'book_create'                 => 'created book',
+    'book_create_notification'    => 'Book Successfully Created',
+    'book_update'                 => 'updated book',
+    'book_update_notification'    => 'Book Successfully Updated',
+    'book_delete'                 => 'deleted book',
+    'book_delete_notification'    => 'Book Successfully Deleted',
+    'book_sort'                   => 'sorted book',
+    'book_sort_notification'      => 'Book Successfully Re-sorted',
+
+    // Bookshelves
+    'bookshelf_create'            => 'created Bookshelf',
+    'bookshelf_create_notification'    => 'Bookshelf Successfully Created',
+    'bookshelf_update'                 => 'updated bookshelf',
+    'bookshelf_update_notification'    => 'Bookshelf Successfully Updated',
+    'bookshelf_delete'                 => 'deleted bookshelf',
+    'bookshelf_delete_notification'    => 'Bookshelf Successfully Deleted',
+
+    // Other
+    'commented_on'                => 'commented on',
+];
diff --git a/resources/lang/pt/auth.php b/resources/lang/pt/auth.php
new file mode 100644 (file)
index 0000000..6961e04
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Authentication Language Lines
+ * The following language lines are used during authentication for various
+ * messages that we need to display to the user.
+ */
+return [
+
+    'failed' => 'These credentials do not match our records.',
+    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
+
+    // Login & Register
+    'sign_up' => 'Sign up',
+    'log_in' => 'Log in',
+    'log_in_with' => 'Login with :socialDriver',
+    'sign_up_with' => 'Sign up with :socialDriver',
+    'logout' => 'Logout',
+
+    'name' => 'Name',
+    'username' => 'Username',
+    'email' => 'Email',
+    'password' => 'Password',
+    'password_confirm' => 'Confirm Password',
+    'password_hint' => 'Must be over 7 characters',
+    'forgot_password' => 'Forgot Password?',
+    'remember_me' => 'Remember Me',
+    'ldap_email_hint' => 'Please enter an email to use for this account.',
+    'create_account' => 'Create Account',
+    'already_have_account' => 'Already have an account?',
+    'dont_have_account' => 'Don\'t have an account?',
+    'social_login' => 'Social Login',
+    'social_registration' => 'Social Registration',
+    'social_registration_text' => 'Register and sign in using another service.',
+
+    'register_thanks' => 'Thanks for registering!',
+    'register_confirm' => 'Please check your email and click the confirmation button to access :appName.',
+    'registrations_disabled' => 'Registrations are currently disabled',
+    'registration_email_domain_invalid' => 'That email domain does not have access to this application',
+    'register_success' => 'Thanks for signing up! You are now registered and signed in.',
+
+
+    // Password Reset
+    'reset_password' => 'Reset Password',
+    'reset_password_send_instructions' => 'Enter your email below and you will be sent an email with a password reset link.',
+    'reset_password_send_button' => 'Send Reset Link',
+    'reset_password_sent_success' => 'A password reset link has been sent to :email.',
+    'reset_password_success' => 'Your password has been successfully reset.',
+    'email_reset_subject' => 'Reset your :appName password',
+    'email_reset_text' => 'You are receiving this email because we received a password reset request for your account.',
+    'email_reset_not_requested' => 'If you did not request a password reset, no further action is required.',
+
+
+    // Email Confirmation
+    'email_confirm_subject' => 'Confirm your email on :appName',
+    'email_confirm_greeting' => 'Thanks for joining :appName!',
+    'email_confirm_text' => 'Please confirm your email address by clicking the button below:',
+    'email_confirm_action' => 'Confirm Email',
+    'email_confirm_send_error' => 'Email confirmation required but the system could not send the email. Contact the admin to ensure email is set up correctly.',
+    'email_confirm_success' => 'Your email has been confirmed!',
+    'email_confirm_resent' => 'Confirmation email resent, Please check your inbox.',
+
+    'email_not_confirmed' => 'Email Address Not Confirmed',
+    'email_not_confirmed_text' => 'Your email address has not yet been confirmed.',
+    'email_not_confirmed_click_link' => 'Please click the link in the email that was sent shortly after you registered.',
+    'email_not_confirmed_resend' => 'If you cannot find the email you can re-send the confirmation email by submitting the form below.',
+    'email_not_confirmed_resend_button' => 'Resend Confirmation Email',
+
+    // User Invite
+    'user_invite_email_subject' => 'You have been invited to join :appName!',
+    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
+    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
+    'user_invite_email_action' => 'Set Account Password',
+    'user_invite_page_welcome' => 'Welcome to :appName!',
+    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
+    'user_invite_page_confirm_button' => 'Confirm Password',
+    'user_invite_success' => 'Password set, you now have access to :appName!'
+];
\ No newline at end of file
diff --git a/resources/lang/pt/common.php b/resources/lang/pt/common.php
new file mode 100644 (file)
index 0000000..c8b4a2b
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Common elements found throughout many areas of BookStack.
+ */
+return [
+
+    // Buttons
+    'cancel' => 'Cancel',
+    'confirm' => 'Confirm',
+    'back' => 'Back',
+    'save' => 'Save',
+    'continue' => 'Continue',
+    'select' => 'Select',
+    'toggle_all' => 'Toggle All',
+    'more' => 'More',
+
+    // Form Labels
+    'name' => 'Name',
+    'description' => 'Description',
+    'role' => 'Role',
+    'cover_image' => 'Cover image',
+    'cover_image_description' => 'This image should be approx 440x250px.',
+    
+    // Actions
+    'actions' => 'Actions',
+    'view' => 'View',
+    'view_all' => 'View All',
+    'create' => 'Create',
+    'update' => 'Update',
+    'edit' => 'Edit',
+    'sort' => 'Sort',
+    'move' => 'Move',
+    'copy' => 'Copy',
+    'reply' => 'Reply',
+    'delete' => 'Delete',
+    'search' => 'Search',
+    'search_clear' => 'Clear Search',
+    'reset' => 'Reset',
+    'remove' => 'Remove',
+    'add' => 'Add',
+    'fullscreen' => 'Fullscreen',
+
+    // Sort Options
+    'sort_options' => 'Sort Options',
+    'sort_direction_toggle' => 'Sort Direction Toggle',
+    'sort_ascending' => 'Sort Ascending',
+    'sort_descending' => 'Sort Descending',
+    'sort_name' => 'Name',
+    'sort_created_at' => 'Created Date',
+    'sort_updated_at' => 'Updated Date',
+
+    // Misc
+    'deleted_user' => 'Deleted User',
+    'no_activity' => 'No activity to show',
+    'no_items' => 'No items available',
+    'back_to_top' => 'Back to top',
+    'toggle_details' => 'Toggle Details',
+    'toggle_thumbnails' => 'Toggle Thumbnails',
+    'details' => 'Details',
+    'grid_view' => 'Grid View',
+    'list_view' => 'List View',
+    'default' => 'Default',
+    'breadcrumb' => 'Breadcrumb',
+
+    // Header
+    'profile_menu' => 'Profile Menu',
+    'view_profile' => 'View Profile',
+    'edit_profile' => 'Edit Profile',
+
+    // Layout tabs
+    'tab_info' => 'Info',
+    'tab_content' => 'Content',
+
+    // Email Content
+    'email_action_help' => 'If you’re having trouble clicking the ":actionText" button, copy and paste the URL below into your web browser:',
+    'email_rights' => 'All rights reserved',
+];
diff --git a/resources/lang/pt/components.php b/resources/lang/pt/components.php
new file mode 100644 (file)
index 0000000..d8e8981
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'Image Select',
+    'image_all' => 'All',
+    'image_all_title' => 'View all images',
+    'image_book_title' => 'View images uploaded to this book',
+    'image_page_title' => 'View images uploaded to this page',
+    'image_search_hint' => 'Search by image name',
+    'image_uploaded' => 'Uploaded :uploadedDate',
+    'image_load_more' => 'Load More',
+    'image_image_name' => 'Image Name',
+    'image_delete_used' => 'This image is used in the pages below.',
+    'image_delete_confirm' => 'Click delete again to confirm you want to delete this image.',
+    'image_select_image' => 'Select Image',
+    'image_dropzone' => 'Drop images or click here to upload',
+    'images_deleted' => 'Images Deleted',
+    'image_preview' => 'Image Preview',
+    'image_upload_success' => 'Image uploaded successfully',
+    'image_update_success' => 'Image details successfully updated',
+    'image_delete_success' => 'Image successfully deleted',
+    'image_upload_remove' => 'Remove',
+
+    // Code Editor
+    'code_editor' => 'Edit Code',
+    'code_language' => 'Code Language',
+    'code_content' => 'Code Content',
+    'code_save' => 'Save Code',
+];
diff --git a/resources/lang/pt/entities.php b/resources/lang/pt/entities.php
new file mode 100644 (file)
index 0000000..6bbc723
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'Recently Created',
+    'recently_created_pages' => 'Recently Created Pages',
+    'recently_updated_pages' => 'Recently Updated Pages',
+    'recently_created_chapters' => 'Recently Created Chapters',
+    'recently_created_books' => 'Recently Created Books',
+    'recently_created_shelves' => 'Recently Created Shelves',
+    'recently_update' => 'Recently Updated',
+    'recently_viewed' => 'Recently Viewed',
+    'recent_activity' => 'Recent Activity',
+    'create_now' => 'Create one now',
+    'revisions' => 'Revisions',
+    'meta_revision' => 'Revision #:revisionCount',
+    'meta_created' => 'Created :timeLength',
+    'meta_created_name' => 'Created :timeLength by :user',
+    'meta_updated' => 'Updated :timeLength',
+    'meta_updated_name' => 'Updated :timeLength by :user',
+    'entity_select' => 'Entity Select',
+    'images' => 'Images',
+    'my_recent_drafts' => 'My Recent Drafts',
+    'my_recently_viewed' => 'My Recently Viewed',
+    'no_pages_viewed' => 'You have not viewed any pages',
+    'no_pages_recently_created' => 'No pages have been recently created',
+    'no_pages_recently_updated' => 'No pages have been recently updated',
+    'export' => 'Export',
+    'export_html' => 'Contained Web File',
+    'export_pdf' => 'PDF File',
+    'export_text' => 'Plain Text File',
+
+    // Permissions and restrictions
+    'permissions' => 'Permissions',
+    'permissions_intro' => 'Once enabled, These permissions will take priority over any set role permissions.',
+    'permissions_enable' => 'Enable Custom Permissions',
+    'permissions_save' => 'Save Permissions',
+
+    // Search
+    'search_results' => 'Search Results',
+    'search_total_results_found' => ':count result found|:count total results found',
+    'search_clear' => 'Clear Search',
+    'search_no_pages' => 'No pages matched this search',
+    'search_for_term' => 'Search for :term',
+    'search_more' => 'More Results',
+    'search_filters' => 'Search Filters',
+    'search_content_type' => 'Content Type',
+    'search_exact_matches' => 'Exact Matches',
+    'search_tags' => 'Tag Searches',
+    'search_options' => 'Options',
+    'search_viewed_by_me' => 'Viewed by me',
+    'search_not_viewed_by_me' => 'Not viewed by me',
+    'search_permissions_set' => 'Permissions set',
+    'search_created_by_me' => 'Created by me',
+    'search_updated_by_me' => 'Updated by me',
+    'search_date_options' => 'Date Options',
+    'search_updated_before' => 'Updated before',
+    'search_updated_after' => 'Updated after',
+    'search_created_before' => 'Created before',
+    'search_created_after' => 'Created after',
+    'search_set_date' => 'Set Date',
+    'search_update' => 'Update Search',
+
+    // Shelves
+    'shelf' => 'Shelf',
+    'shelves' => 'Shelves',
+    'x_shelves' => ':count Shelf|:count Shelves',
+    'shelves_long' => 'Bookshelves',
+    'shelves_empty' => 'No shelves have been created',
+    'shelves_create' => 'Create New Shelf',
+    'shelves_popular' => 'Popular Shelves',
+    'shelves_new' => 'New Shelves',
+    'shelves_new_action' => 'New Shelf',
+    'shelves_popular_empty' => 'The most popular shelves will appear here.',
+    'shelves_new_empty' => 'The most recently created shelves will appear here.',
+    'shelves_save' => 'Save Shelf',
+    'shelves_books' => 'Books on this shelf',
+    'shelves_add_books' => 'Add books to this shelf',
+    'shelves_drag_books' => 'Drag books here to add them to this shelf',
+    'shelves_empty_contents' => 'This shelf has no books assigned to it',
+    'shelves_edit_and_assign' => 'Edit shelf to assign books',
+    'shelves_edit_named' => 'Edit Bookshelf :name',
+    'shelves_edit' => 'Edit Bookshelf',
+    'shelves_delete' => 'Delete Bookshelf',
+    'shelves_delete_named' => 'Delete Bookshelf :name',
+    'shelves_delete_explain' => "This will delete the bookshelf with the name ':name'. Contained books will not be deleted.",
+    'shelves_delete_confirmation' => 'Are you sure you want to delete this bookshelf?',
+    'shelves_permissions' => 'Bookshelf Permissions',
+    'shelves_permissions_updated' => 'Bookshelf Permissions Updated',
+    'shelves_permissions_active' => 'Bookshelf Permissions Active',
+    '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',
+
+    // Books
+    'book' => 'Book',
+    'books' => 'Books',
+    'x_books' => ':count Book|:count Books',
+    'books_empty' => 'No books have been created',
+    'books_popular' => 'Popular Books',
+    'books_recent' => 'Recent Books',
+    'books_new' => 'New Books',
+    'books_new_action' => 'New Book',
+    'books_popular_empty' => 'The most popular books will appear here.',
+    'books_new_empty' => 'The most recently created books will appear here.',
+    'books_create' => 'Create New Book',
+    'books_delete' => 'Delete Book',
+    'books_delete_named' => 'Delete Book :bookName',
+    'books_delete_explain' => 'This will delete the book with the name \':bookName\'. All pages and chapters will be removed.',
+    'books_delete_confirmation' => 'Are you sure you want to delete this book?',
+    'books_edit' => 'Edit Book',
+    'books_edit_named' => 'Edit Book :bookName',
+    'books_form_book_name' => 'Book Name',
+    'books_save' => 'Save Book',
+    'books_permissions' => 'Book Permissions',
+    'books_permissions_updated' => 'Book Permissions Updated',
+    'books_empty_contents' => 'No pages or chapters have been created for this book.',
+    'books_empty_create_page' => 'Create a new page',
+    'books_empty_sort_current_book' => 'Sort the current book',
+    'books_empty_add_chapter' => 'Add a chapter',
+    'books_permissions_active' => 'Book Permissions Active',
+    'books_search_this' => 'Search this book',
+    'books_navigation' => 'Book Navigation',
+    'books_sort' => 'Sort Book Contents',
+    'books_sort_named' => 'Sort Book :bookName',
+    'books_sort_name' => 'Sort by Name',
+    'books_sort_created' => 'Sort by Created Date',
+    'books_sort_updated' => 'Sort by Updated Date',
+    'books_sort_chapters_first' => 'Chapters First',
+    'books_sort_chapters_last' => 'Chapters Last',
+    'books_sort_show_other' => 'Show Other Books',
+    'books_sort_save' => 'Save New Order',
+
+    // Chapters
+    'chapter' => 'Chapter',
+    'chapters' => 'Chapters',
+    'x_chapters' => ':count Chapter|:count Chapters',
+    'chapters_popular' => 'Popular Chapters',
+    'chapters_new' => 'New Chapter',
+    'chapters_create' => 'Create New Chapter',
+    'chapters_delete' => 'Delete Chapter',
+    'chapters_delete_named' => 'Delete Chapter :chapterName',
+    'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages will be removed and added directly to the parent book.',
+    'chapters_delete_confirm' => 'Are you sure you want to delete this chapter?',
+    'chapters_edit' => 'Edit Chapter',
+    'chapters_edit_named' => 'Edit Chapter :chapterName',
+    'chapters_save' => 'Save Chapter',
+    'chapters_move' => 'Move Chapter',
+    'chapters_move_named' => 'Move Chapter :chapterName',
+    'chapter_move_success' => 'Chapter moved to :bookName',
+    'chapters_permissions' => 'Chapter Permissions',
+    'chapters_empty' => 'No pages are currently in this chapter.',
+    'chapters_permissions_active' => 'Chapter Permissions Active',
+    'chapters_permissions_success' => 'Chapter Permissions Updated',
+    'chapters_search_this' => 'Search this chapter',
+
+    // Pages
+    'page' => 'Page',
+    'pages' => 'Pages',
+    'x_pages' => ':count Page|:count Pages',
+    'pages_popular' => 'Popular Pages',
+    'pages_new' => 'New Page',
+    'pages_attachments' => 'Attachments',
+    'pages_navigation' => 'Page Navigation',
+    'pages_delete' => 'Delete Page',
+    'pages_delete_named' => 'Delete Page :pageName',
+    'pages_delete_draft_named' => 'Delete Draft Page :pageName',
+    'pages_delete_draft' => 'Delete Draft Page',
+    'pages_delete_success' => 'Page deleted',
+    'pages_delete_draft_success' => 'Draft page deleted',
+    'pages_delete_confirm' => 'Are you sure you want to delete this page?',
+    'pages_delete_draft_confirm' => 'Are you sure you want to delete this draft page?',
+    'pages_editing_named' => 'Editing Page :pageName',
+    'pages_edit_draft_options' => 'Draft Options',
+    'pages_edit_save_draft' => 'Save Draft',
+    'pages_edit_draft' => 'Edit Page Draft',
+    'pages_editing_draft' => 'Editing Draft',
+    'pages_editing_page' => 'Editing Page',
+    'pages_edit_draft_save_at' => 'Draft saved at ',
+    'pages_edit_delete_draft' => 'Delete Draft',
+    'pages_edit_discard_draft' => 'Discard Draft',
+    'pages_edit_set_changelog' => 'Set Changelog',
+    'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
+    'pages_edit_enter_changelog' => 'Enter Changelog',
+    'pages_save' => 'Save Page',
+    'pages_title' => 'Page Title',
+    'pages_name' => 'Page Name',
+    'pages_md_editor' => 'Editor',
+    'pages_md_preview' => 'Preview',
+    'pages_md_insert_image' => 'Insert Image',
+    'pages_md_insert_link' => 'Insert Entity Link',
+    'pages_md_insert_drawing' => 'Insert Drawing',
+    'pages_not_in_chapter' => 'Page is not in a chapter',
+    'pages_move' => 'Move Page',
+    'pages_move_success' => 'Page moved to ":parentName"',
+    'pages_copy' => 'Copy Page',
+    'pages_copy_desination' => 'Copy Destination',
+    'pages_copy_success' => 'Page successfully copied',
+    'pages_permissions' => 'Page Permissions',
+    'pages_permissions_success' => 'Page permissions updated',
+    'pages_revision' => 'Revision',
+    'pages_revisions' => 'Page Revisions',
+    'pages_revisions_named' => 'Page Revisions for :pageName',
+    'pages_revision_named' => 'Page Revision for :pageName',
+    'pages_revisions_created_by' => 'Created By',
+    'pages_revisions_date' => 'Revision Date',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'Revision #:id',
+    'pages_revisions_numbered_changes' => 'Revision #:id Changes',
+    'pages_revisions_changelog' => 'Changelog',
+    'pages_revisions_changes' => 'Changes',
+    'pages_revisions_current' => 'Current Version',
+    'pages_revisions_preview' => 'Preview',
+    'pages_revisions_restore' => 'Restore',
+    'pages_revisions_none' => 'This page has no revisions',
+    'pages_copy_link' => 'Copy Link',
+    'pages_edit_content_link' => 'Edit Content',
+    'pages_permissions_active' => 'Page Permissions Active',
+    'pages_initial_revision' => 'Initial publish',
+    'pages_initial_name' => 'New Page',
+    'pages_editing_draft_notification' => 'You are currently editing a draft that was last saved :timeDiff.',
+    'pages_draft_edited_notification' => 'This page has been updated by since that time. It is recommended that you discard this draft.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count users have started editing this page',
+        'start_b' => ':userName has started editing this page',
+        'time_a' => 'since the page was last updated',
+        'time_b' => 'in the last :minCount minutes',
+        'message' => ':start :time. Take care not to overwrite each other\'s updates!',
+    ],
+    'pages_draft_discarded' => 'Draft discarded, The editor has been updated with the current page content',
+    'pages_specific' => 'Specific Page',
+    'pages_is_template' => 'Page Template',
+
+    // Editor Sidebar
+    'page_tags' => 'Page Tags',
+    'chapter_tags' => 'Chapter Tags',
+    'book_tags' => 'Book Tags',
+    'shelf_tags' => 'Shelf Tags',
+    'tag' => 'Tag',
+    'tags' =>  'Tags',
+    'tag_name' =>  'Tag Name',
+    'tag_value' => 'Tag Value (Optional)',
+    'tags_explain' => "Add some tags to better categorise your content. \n You can assign a value to a tag for more in-depth organisation.",
+    'tags_add' => 'Add another tag',
+    'tags_remove' => 'Remove this tag',
+    'attachments' => 'Attachments',
+    'attachments_explain' => 'Upload some files or attach some links to display on your page. These are visible in the page sidebar.',
+    'attachments_explain_instant_save' => 'Changes here are saved instantly.',
+    'attachments_items' => 'Attached Items',
+    'attachments_upload' => 'Upload File',
+    'attachments_link' => 'Attach Link',
+    'attachments_set_link' => 'Set Link',
+    'attachments_delete_confirm' => 'Click delete again to confirm you want to delete this attachment.',
+    'attachments_dropzone' => 'Drop files or click here to attach a file',
+    'attachments_no_files' => 'No files have been uploaded',
+    'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.',
+    'attachments_link_name' => 'Link Name',
+    'attachment_link' => 'Attachment link',
+    'attachments_link_url' => 'Link to file',
+    'attachments_link_url_hint' => 'Url of site or file',
+    'attach' => 'Attach',
+    'attachments_edit_file' => 'Edit File',
+    'attachments_edit_file_name' => 'File Name',
+    'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite',
+    'attachments_order_updated' => 'Attachment order updated',
+    'attachments_updated_success' => 'Attachment details updated',
+    'attachments_deleted' => 'Attachment deleted',
+    'attachments_file_uploaded' => 'File successfully uploaded',
+    'attachments_file_updated' => 'File successfully updated',
+    'attachments_link_attached' => 'Link successfully attached to page',
+    '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',
+
+    // Profile View
+    'profile_user_for_x' => 'User for :time',
+    'profile_created_content' => 'Created Content',
+    'profile_not_created_pages' => ':userName has not created any pages',
+    'profile_not_created_chapters' => ':userName has not created any chapters',
+    'profile_not_created_books' => ':userName has not created any books',
+    'profile_not_created_shelves' => ':userName has not created any shelves',
+
+    // Comments
+    'comment' => 'Comment',
+    'comments' => 'Comments',
+    'comment_add' => 'Add Comment',
+    'comment_placeholder' => 'Leave a comment here',
+    'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
+    'comment_save' => 'Save Comment',
+    'comment_saving' => 'Saving comment...',
+    'comment_deleting' => 'Deleting comment...',
+    'comment_new' => 'New Comment',
+    'comment_created' => 'commented :createDiff',
+    'comment_updated' => 'Updated :updateDiff by :username',
+    'comment_deleted_success' => 'Comment deleted',
+    'comment_created_success' => 'Comment added',
+    'comment_updated_success' => 'Comment updated',
+    'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
+    'comment_in_reply_to' => 'In reply to :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'Are you sure you want to delete this revision?',
+    'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.',
+    'revision_delete_success' => 'Revision deleted',
+    'revision_cannot_delete_latest' => 'Cannot delete the latest revision.'
+];
\ No newline at end of file
diff --git a/resources/lang/pt/errors.php b/resources/lang/pt/errors.php
new file mode 100644 (file)
index 0000000..06a5285
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Text shown in error messaging.
+ */
+return [
+
+    // Permissions
+    'permission' => 'You do not have permission to access the requested page.',
+    'permissionJson' => 'You do not have permission to perform the requested action.',
+
+    // Auth
+    'error_user_exists_different_creds' => 'A user with the email :email already exists but with different credentials.',
+    'email_already_confirmed' => 'Email has already been confirmed, Try logging in.',
+    'email_confirmation_invalid' => 'This confirmation token is not valid or has already been used, Please try registering again.',
+    'email_confirmation_expired' => 'The confirmation token has expired, A new confirmation email has been sent.',
+    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'ldap_fail_anonymous' => 'LDAP access failed using anonymous bind',
+    'ldap_fail_authed' => 'LDAP access failed using given dn & password details',
+    'ldap_extension_not_installed' => 'LDAP PHP extension not installed',
+    'ldap_cannot_connect' => 'Cannot connect to ldap server, Initial connection failed',
+    'saml_already_logged_in' => 'Already logged in',
+    'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
+    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
+    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
+    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'social_no_action_defined' => 'No action defined',
+    'social_login_bad_response' => "Error received during :socialAccount login: \n:error",
+    'social_account_in_use' => 'This :socialAccount account is already in use, Try logging in via the :socialAccount option.',
+    'social_account_email_in_use' => 'The email :email is already in use. If you already have an account you can connect your :socialAccount account from your profile settings.',
+    'social_account_existing' => 'This :socialAccount is already attached to your profile.',
+    'social_account_already_used_existing' => 'This :socialAccount account is already used by another user.',
+    'social_account_not_used' => 'This :socialAccount account is not linked to any users. Please attach it in your profile settings. ',
+    'social_account_register_instructions' => 'If you do not yet have an account, You can register an account using the :socialAccount option.',
+    'social_driver_not_found' => 'Social driver not found',
+    'social_driver_not_configured' => 'Your :socialAccount social settings are not configured correctly.',
+    'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
+
+    // System
+    'path_not_writable' => 'File path :filePath could not be uploaded to. Ensure it is writable to the server.',
+    'cannot_get_image_from_url' => 'Cannot get image from :url',
+    'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.',
+    'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.',
+    'uploaded'  => 'The server does not allow uploads of this size. Please try a smaller file size.',
+    'image_upload_error' => 'An error occurred uploading the image',
+    'image_upload_type_error' => 'The image type being uploaded is invalid',
+    'file_upload_timeout' => 'The file upload has timed out.',
+
+    // Attachments
+    'attachment_page_mismatch' => 'Page mismatch during attachment update',
+    'attachment_not_found' => 'Attachment not found',
+
+    // Pages
+    'page_draft_autosave_fail' => 'Failed to save draft. Ensure you have internet connection before saving this page',
+    'page_custom_home_deletion' => 'Cannot delete a page while it is set as a homepage',
+
+    // Entities
+    'entity_not_found' => 'Entity not found',
+    'bookshelf_not_found' => 'Bookshelf not found',
+    'book_not_found' => 'Book not found',
+    'page_not_found' => 'Page not found',
+    'chapter_not_found' => 'Chapter not found',
+    'selected_book_not_found' => 'The selected book was not found',
+    'selected_book_chapter_not_found' => 'The selected Book or Chapter was not found',
+    'guests_cannot_save_drafts' => 'Guests cannot save drafts',
+
+    // Users
+    'users_cannot_delete_only_admin' => 'You cannot delete the only admin',
+    'users_cannot_delete_guest' => 'You cannot delete the guest user',
+
+    // Roles
+    'role_cannot_be_edited' => 'This role cannot be edited',
+    'role_system_cannot_be_deleted' => 'This role is a system role and cannot be deleted',
+    'role_registration_default_cannot_delete' => 'This role cannot be deleted while set as the default registration role',
+    'role_cannot_remove_only_admin' => 'This user is the only user assigned to the administrator role. Assign the administrator role to another user before attempting to remove it here.',
+
+    // Comments
+    'comment_list' => 'An error occurred while fetching the comments.',
+    'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.',
+    'comment_add' => 'An error occurred while adding / updating the comment.',
+    'comment_delete' => 'An error occurred while deleting the comment.',
+    'empty_comment' => 'Cannot add an empty comment.',
+
+    // Error pages
+    '404_page_not_found' => 'Page Not Found',
+    'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
+    'return_home' => 'Return to home',
+    'error_occurred' => 'An Error Occurred',
+    'app_down' => ':appName is down right now',
+    'back_soon' => 'It will be back up soon.',
+
+    // API errors
+    'api_no_authorization_found' => 'No authorization token found on the request',
+    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
+    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
+    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
+    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
+    'api_user_token_expired' => 'The authorization token used has expired',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
+];
diff --git a/resources/lang/pt/pagination.php b/resources/lang/pt/pagination.php
new file mode 100644 (file)
index 0000000..85bd12f
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; Previous',
+    'next'     => 'Next &raquo;',
+
+];
diff --git a/resources/lang/pt/passwords.php b/resources/lang/pt/passwords.php
new file mode 100644 (file)
index 0000000..f41ca78
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Password Reminder Language Lines
+ * The following language lines are the default lines which match reasons
+ * that are given by the password broker for a password update attempt has failed.
+ */
+return [
+
+    'password' => 'Passwords must be at least eight characters and match the confirmation.',
+    'user' => "We can't find a user with that e-mail address.",
+    'token' => 'This password reset token is invalid.',
+    'sent' => 'We have e-mailed your password reset link!',
+    'reset' => 'Your password has been reset!',
+
+];
diff --git a/resources/lang/pt/settings.php b/resources/lang/pt/settings.php
new file mode 100644 (file)
index 0000000..35bb09c
--- /dev/null
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Settings text strings
+ * Contains all text strings used in the general settings sections of BookStack
+ * including users and roles.
+ */
+return [
+
+    // Common Messages
+    'settings' => 'Settings',
+    'settings_save' => 'Save Settings',
+    'settings_save_success' => 'Settings saved',
+
+    // App Settings
+    'app_customization' => 'Customization',
+    'app_features_security' => 'Features & Security',
+    'app_name' => 'Application Name',
+    'app_name_desc' => 'This name is shown in the header and in any system-sent emails.',
+    'app_name_header' => 'Show name in header',
+    'app_public_access' => 'Public Access',
+    'app_public_access_desc' => 'Enabling this option will allow visitors, that are not logged-in, to access content in your BookStack instance.',
+    'app_public_access_desc_guest' => 'Access for public visitors can be controlled through the "Guest" user.',
+    'app_public_access_toggle' => 'Allow public access',
+    'app_public_viewing' => 'Allow public viewing?',
+    'app_secure_images' => 'Higher Security Image Uploads',
+    'app_secure_images_toggle' => 'Enable higher security image uploads',
+    'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.',
+    'app_editor' => 'Page Editor',
+    'app_editor_desc' => 'Select which editor will be used by all users to edit pages.',
+    'app_custom_html' => 'Custom HTML Head Content',
+    'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the <head> section of every page. This is handy for overriding styles or adding analytics code.',
+    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
+    'app_logo' => 'Application Logo',
+    'app_logo_desc' => 'This image should be 43px in height. <br>Large images will be scaled down.',
+    'app_primary_color' => 'Application Primary Color',
+    'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.',
+    'app_homepage' => 'Application Homepage',
+    'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.',
+    'app_homepage_select' => 'Select a page',
+    'app_disable_comments' => 'Disable Comments',
+    'app_disable_comments_toggle' => 'Disable comments',
+    'app_disable_comments_desc' => 'Disables comments across all pages in the application. <br> Existing comments are not shown.',
+
+    // Color settings
+    'content_colors' => 'Content Colors',
+    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
+    'bookshelf_color' => 'Shelf Color',
+    'book_color' => 'Book Color',
+    'chapter_color' => 'Chapter Color',
+    'page_color' => 'Page Color',
+    'page_draft_color' => 'Page Draft Color',
+
+    // Registration Settings
+    'reg_settings' => 'Registration',
+    'reg_enable' => 'Enable Registration',
+    'reg_enable_toggle' => 'Enable registration',
+    'reg_enable_desc' => 'When registration is enabled user will be able to sign themselves up as an application user. Upon registration they are given a single, default user role.',
+    'reg_default_role' => 'Default user role after registration',
+    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_email_confirmation' => 'Email Confirmation',
+    'reg_email_confirmation_toggle' => 'Require email confirmation',
+    'reg_confirm_email_desc' => 'If domain restriction is used then email confirmation will be required and this option will be ignored.',
+    'reg_confirm_restrict_domain' => 'Domain Restriction',
+    'reg_confirm_restrict_domain_desc' => 'Enter a comma separated list of email domains you would like to restrict registration to. Users will be sent an email to confirm their address before being allowed to interact with the application. <br> Note that users will be able to change their email addresses after successful registration.',
+    'reg_confirm_restrict_domain_placeholder' => 'No restriction set',
+
+    // Maintenance settings
+    'maint' => 'Maintenance',
+    'maint_image_cleanup' => 'Cleanup Images',
+    'maint_image_cleanup_desc' => "Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.",
+    'maint_image_cleanup_ignore_revisions' => 'Ignore images in revisions',
+    'maint_image_cleanup_run' => 'Run Cleanup',
+    'maint_image_cleanup_warning' => ':count potentially unused images were found. Are you sure you want to delete these images?',
+    'maint_image_cleanup_success' => ':count potentially unused images found and deleted!',
+    'maint_image_cleanup_nothing_found' => 'No unused images found, Nothing deleted!',
+    'maint_send_test_email' => 'Send a Test Email',
+    'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.',
+    'maint_send_test_email_run' => 'Send test email',
+    'maint_send_test_email_success' => 'Email sent to :address',
+    'maint_send_test_email_mail_subject' => 'Test Email',
+    'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!',
+    'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.',
+
+    // Role Settings
+    'roles' => 'Roles',
+    'role_user_roles' => 'User Roles',
+    'role_create' => 'Create New Role',
+    'role_create_success' => 'Role successfully created',
+    'role_delete' => 'Delete Role',
+    'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
+    'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
+    'role_delete_no_migration' => "Don't migrate users",
+    'role_delete_sure' => 'Are you sure you want to delete this role?',
+    'role_delete_success' => 'Role successfully deleted',
+    'role_edit' => 'Edit Role',
+    'role_details' => 'Role Details',
+    'role_name' => 'Role Name',
+    'role_desc' => 'Short Description of Role',
+    'role_external_auth_id' => 'External Authentication IDs',
+    'role_system' => 'System Permissions',
+    'role_manage_users' => 'Manage users',
+    'role_manage_roles' => 'Manage roles & role permissions',
+    'role_manage_entity_permissions' => 'Manage all book, chapter & page permissions',
+    'role_manage_own_entity_permissions' => 'Manage permissions on own book, chapter & pages',
+    'role_manage_page_templates' => 'Manage page templates',
+    'role_access_api' => 'Access system API',
+    'role_manage_settings' => 'Manage app settings',
+    'role_asset' => 'Asset Permissions',
+    'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
+    'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.',
+    'role_all' => 'All',
+    'role_own' => 'Own',
+    'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
+    'role_save' => 'Save Role',
+    'role_update_success' => 'Role successfully updated',
+    'role_users' => 'Users in this role',
+    'role_users_none' => 'No users are currently assigned to this role',
+
+    // Users
+    'users' => 'Users',
+    'user_profile' => 'User Profile',
+    'users_add_new' => 'Add New User',
+    'users_search' => 'Search Users',
+    'users_details' => 'User Details',
+    'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.',
+    'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.',
+    'users_role' => 'User Roles',
+    'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.',
+    'users_password' => 'User Password',
+    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 characters long.',
+    'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
+    'users_send_invite_option' => 'Send user invite email',
+    'users_external_auth_id' => 'External Authentication ID',
+    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_password_warning' => 'Only fill the below if you would like to change your password.',
+    'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.',
+    'users_delete' => 'Delete User',
+    'users_delete_named' => 'Delete user :userName',
+    'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.',
+    'users_delete_confirm' => 'Are you sure you want to delete this user?',
+    'users_delete_success' => 'Users successfully removed',
+    'users_edit' => 'Edit User',
+    'users_edit_profile' => 'Edit Profile',
+    'users_edit_success' => 'User successfully updated',
+    'users_avatar' => 'User Avatar',
+    'users_avatar_desc' => 'Select an image to represent this user. This should be approx 256px square.',
+    'users_preferred_language' => 'Preferred Language',
+    'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.',
+    'users_social_accounts' => 'Social Accounts',
+    'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not revoke previously authorized access. Revoke access from your profile settings on the connected social account.',
+    'users_social_connect' => 'Connect Account',
+    'users_social_disconnect' => 'Disconnect Account',
+    'users_social_connected' => ':socialAccount account was successfully attached to your profile.',
+    'users_social_disconnected' => ':socialAccount account was successfully disconnected from your profile.',
+    'users_api_tokens' => 'API Tokens',
+    'users_api_tokens_none' => 'No API tokens have been created for this user',
+    'users_api_tokens_create' => 'Create Token',
+    'users_api_tokens_expires' => 'Expires',
+    'users_api_tokens_docs' => 'API Documentation',
+
+    // API Tokens
+    'user_api_token_create' => 'Create API Token',
+    'user_api_token_name' => 'Name',
+    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
+    'user_api_token_expiry' => 'Expiry Date',
+    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
+    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
+    'user_api_token_create_success' => 'API token successfully created',
+    'user_api_token_update_success' => 'API token successfully updated',
+    'user_api_token' => 'API Token',
+    'user_api_token_id' => 'Token ID',
+    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_secret' => 'Token Secret',
+    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
+    'user_api_token_created' => 'Token Created :timeAgo',
+    'user_api_token_updated' => 'Token Updated :timeAgo',
+    'user_api_token_delete' => 'Delete Token',
+    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
+    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
+    'user_api_token_delete_success' => 'API token successfully deleted',
+
+    //! If editing translations files directly please ignore this in all
+    //! languages apart from en. Content will be auto-copied from en.
+    //!////////////////////////////////
+    'language_select' => [
+        'en' => 'English',
+        'ar' => 'العربية',
+        'cs' => 'Česky',
+        'da' => 'Dansk',
+        'de' => 'Deutsch (Sie)',
+        'de_informal' => 'Deutsch (Du)',
+        'es' => 'Español',
+        'es_AR' => 'Español Argentina',
+        'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
+        'nl' => 'Nederlands',
+        'pl' => 'Polski',
+        'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
+        'sk' => 'Slovensky',
+        'sl' => 'Slovenščina',
+        'sv' => 'Svenska',
+        'tr' => 'Türkçe',
+        'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
+        'zh_CN' => '简体中文',
+        'zh_TW' => '繁體中文',
+    ]
+    //!////////////////////////////////
+];
diff --git a/resources/lang/pt/validation.php b/resources/lang/pt/validation.php
new file mode 100644 (file)
index 0000000..76b57a2
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => 'The :attribute must be accepted.',
+    'active_url'           => 'The :attribute is not a valid URL.',
+    'after'                => 'The :attribute must be a date after :date.',
+    'alpha'                => 'The :attribute may only contain letters.',
+    'alpha_dash'           => 'The :attribute may only contain letters, numbers, dashes and underscores.',
+    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
+    'array'                => 'The :attribute must be an array.',
+    'before'               => 'The :attribute must be a date before :date.',
+    'between'              => [
+        'numeric' => 'The :attribute must be between :min and :max.',
+        'file'    => 'The :attribute must be between :min and :max kilobytes.',
+        'string'  => 'The :attribute must be between :min and :max characters.',
+        'array'   => 'The :attribute must have between :min and :max items.',
+    ],
+    'boolean'              => 'The :attribute field must be true or false.',
+    'confirmed'            => 'The :attribute confirmation does not match.',
+    'date'                 => 'The :attribute is not a valid date.',
+    'date_format'          => 'The :attribute does not match the format :format.',
+    'different'            => 'The :attribute and :other must be different.',
+    'digits'               => 'The :attribute must be :digits digits.',
+    'digits_between'       => 'The :attribute must be between :min and :max digits.',
+    'email'                => 'The :attribute must be a valid email address.',
+    'ends_with' => 'The :attribute must end with one of the following: :values',
+    'filled'               => 'The :attribute field is required.',
+    'gt'                   => [
+        'numeric' => 'The :attribute must be greater than :value.',
+        'file'    => 'The :attribute must be greater than :value kilobytes.',
+        'string'  => 'The :attribute must be greater than :value characters.',
+        'array'   => 'The :attribute must have more than :value items.',
+    ],
+    'gte'                  => [
+        'numeric' => 'The :attribute must be greater than or equal :value.',
+        'file'    => 'The :attribute must be greater than or equal :value kilobytes.',
+        'string'  => 'The :attribute must be greater than or equal :value characters.',
+        'array'   => 'The :attribute must have :value items or more.',
+    ],
+    'exists'               => 'The selected :attribute is invalid.',
+    'image'                => 'The :attribute must be an image.',
+    'image_extension'      => 'The :attribute must have a valid & supported image extension.',
+    'in'                   => 'The selected :attribute is invalid.',
+    'integer'              => 'The :attribute must be an integer.',
+    'ip'                   => 'The :attribute must be a valid IP address.',
+    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
+    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
+    'json'                 => 'The :attribute must be a valid JSON string.',
+    'lt'                   => [
+        'numeric' => 'The :attribute must be less than :value.',
+        'file'    => 'The :attribute must be less than :value kilobytes.',
+        'string'  => 'The :attribute must be less than :value characters.',
+        'array'   => 'The :attribute must have less than :value items.',
+    ],
+    'lte'                  => [
+        'numeric' => 'The :attribute must be less than or equal :value.',
+        'file'    => 'The :attribute must be less than or equal :value kilobytes.',
+        'string'  => 'The :attribute must be less than or equal :value characters.',
+        'array'   => 'The :attribute must not have more than :value items.',
+    ],
+    'max'                  => [
+        'numeric' => 'The :attribute may not be greater than :max.',
+        'file'    => 'The :attribute may not be greater than :max kilobytes.',
+        'string'  => 'The :attribute may not be greater than :max characters.',
+        'array'   => 'The :attribute may not have more than :max items.',
+    ],
+    'mimes'                => 'The :attribute must be a file of type: :values.',
+    'min'                  => [
+        'numeric' => 'The :attribute must be at least :min.',
+        'file'    => 'The :attribute must be at least :min kilobytes.',
+        'string'  => 'The :attribute must be at least :min characters.',
+        'array'   => 'The :attribute must have at least :min items.',
+    ],
+    'no_double_extension'  => 'The :attribute must only have a single file extension.',
+    'not_in'               => 'The selected :attribute is invalid.',
+    'not_regex'            => 'The :attribute format is invalid.',
+    'numeric'              => 'The :attribute must be a number.',
+    'regex'                => 'The :attribute format is invalid.',
+    'required'             => 'The :attribute field is required.',
+    'required_if'          => 'The :attribute field is required when :other is :value.',
+    'required_with'        => 'The :attribute field is required when :values is present.',
+    'required_with_all'    => 'The :attribute field is required when :values is present.',
+    'required_without'     => 'The :attribute field is required when :values is not present.',
+    'required_without_all' => 'The :attribute field is required when none of :values are present.',
+    'same'                 => 'The :attribute and :other must match.',
+    'size'                 => [
+        'numeric' => 'The :attribute must be :size.',
+        'file'    => 'The :attribute must be :size kilobytes.',
+        'string'  => 'The :attribute must be :size characters.',
+        'array'   => 'The :attribute must contain :size items.',
+    ],
+    'string'               => 'The :attribute must be a string.',
+    'timezone'             => 'The :attribute must be a valid zone.',
+    'unique'               => 'The :attribute has already been taken.',
+    'url'                  => 'The :attribute format is invalid.',
+    'uploaded'             => 'The file could not be uploaded. The server may not accept files of this size.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'Password confirmation required',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index d7aa69bf01e38af7021f55c7a057709c4289c560..0758c3e978ce0144ab25ec1795efe72ea8e8e9ff 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Página Não Encontrada',
     'sorry_page_not_found' => 'Desculpe, a página que você está procurando não pôde ser encontrada.',
+    'sorry_page_not_found_permission_warning' => 'Se você esperava que esta página existisse, talvez você não tenha permissão para visualizá-la.',
     'return_home' => 'Retornar à página inicial',
     'error_occurred' => 'Ocorreu um Erro',
     'app_down' => ':appName está fora do ar no momento',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'O proprietário do token de API utilizado não tem permissão para fazer requisições de API',
     'api_user_token_expired' => 'O token de autenticação expirou',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Erro encontrado ao enviar um e-mail de teste:',
+
 ];
index 7c470da2a9a43c72888e38a0d6617e1c977f4e11..bc78f8328d6d925e64f078737604947cb5c0fdd8 100644 (file)
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Habilitar cadastro',
     'reg_enable_desc' => 'Quando o cadastro é habilitado, visitantes poderão cadastrar-se como usuários do aplicativo. Realizado o cadastro, recebem um único cargo padrão.',
     'reg_default_role' => 'Cargo padrão para usuários após o cadastro',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'A opção acima é ignorada enquanto a autenticação externa LDAP ou SAML estiver ativa. Contas de usuários para membros não existentes serão criadas automaticamente se a autenticação pelo sistema externo em uso for bem sucedida.',
     'reg_email_confirmation' => 'Confirmação de E-mail',
     'reg_email_confirmation_toggle' => 'Requerer confirmação de e-mail',
     'reg_confirm_email_desc' => 'Em caso da restrição de domínios estar em uso, a confirmação de e-mail será requerida e essa opção será ignorada.',
@@ -131,7 +131,7 @@ return [
     'users_send_invite_text' => 'Você pode escolher enviar a este usuário um convite por e-mail que o possibilitará definir sua própria senha, ou defina você uma senha.',
     'users_send_invite_option' => 'Enviar convite por e-mail',
     'users_external_auth_id' => 'ID de Autenticação Externa',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'Este ID é usado para relacionar o usuário quando comunicando com algum sistema de autenticação externo.',
     'users_password_warning' => 'Apenas preencha os dados abaixo caso queira modificar a sua senha.',
     'users_system_public' => 'Esse usuário representa quaisquer convidados que visitam o aplicativo. Ele não pode ser usado para login mas é automaticamente atribuído.',
     'users_delete' => 'Excluir Usuário',
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 7c8efcacb880bb8f56db0122279274928ca394cb..06b1e354b1e8948e5efe147be7d7180824208ea5 100644 (file)
@@ -18,7 +18,7 @@ return [
 
     // Chapters
     'chapter_create'              => 'создал главу',
-    'chapter_create_notification' => 'глава успешно создана',
+    'chapter_create_notification' => 'Ð\93лава успешно создана',
     'chapter_update'              => 'обновил главу',
     'chapter_update_notification' => 'Глава успешно обновлена',
     'chapter_delete'              => 'удалил главу',
@@ -36,12 +36,12 @@ return [
     'book_sort_notification'      => 'Книга успешно отсортирована',
 
     // Bookshelves
-    'bookshelf_create'            => 'Ñ\81оздал ÐºÐ½Ð¸Ð¶Ð½Ñ\83Ñ\8e Ð¿Ð¾Ð»ÐºÑ\83',
-    'bookshelf_create_notification'    => 'Ð\9aнижнаÑ\8f Ð¿олка успешно создана',
-    'bookshelf_update'                 => 'обновил ÐºÐ½Ð¸Ð¶Ð½Ñ\83Ñ\8e Ð¿Ð¾Ð»ÐºÑ\83',
-    'bookshelf_update_notification'    => 'Ð\9aнижнаÑ\8f Ð¿олка успешно обновлена',
-    'bookshelf_delete'                 => 'Ñ\83далил ÐºÐ½Ð¸Ð¶Ð½Ñ\83Ñ\8e Ð¿Ð¾Ð»ÐºÑ\83',
-    'bookshelf_delete_notification'    => 'Ð\9aнижнаÑ\8f Ð¿олка успешно удалена',
+    'bookshelf_create'            => 'создал полку',
+    'bookshelf_create_notification'    => 'Ð\9fолка успешно создана',
+    'bookshelf_update'                 => 'обновил полку',
+    'bookshelf_update_notification'    => 'Ð\9fолка успешно обновлена',
+    'bookshelf_delete'                 => 'удалил полку',
+    'bookshelf_delete_notification'    => 'Ð\9fолка успешно удалена',
 
     // Other
     'commented_on'                => 'прокомментировал',
index 490707c83298d05938d3508ef0fcd071c1404c8c..369da7aa38bd0bf197340a386baa7bf8c5f485ae 100644 (file)
@@ -7,7 +7,7 @@
 return [
 
     'failed' => 'Учетная запись не найдена.',
-    'throttle' => 'СлиÑ\88ком Ð¼Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð¿Ñ\8bÑ\82ок Ð²Ñ\85ода. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ð¾Ð¿Ñ\80обÑ\83йÑ\82е Ð¿Ð¾Ð·Ð¶Ðµ через :seconds секунд.',
+    'throttle' => 'СлиÑ\88ком Ð¼Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð¿Ñ\8bÑ\82ок Ð²Ñ\85ода. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ð¾Ð²Ñ\82оÑ\80иÑ\82е Ð¿Ð¾Ð¿Ñ\8bÑ\82кÑ\83 через :seconds секунд.',
 
     // Login & Register
     'sign_up' => 'Регистрация',
@@ -21,7 +21,7 @@ return [
     'email' => 'Адрес электронной почты',
     'password' => 'Пароль',
     'password_confirm' => 'Подтверждение пароля',
-    'password_hint' => 'Ð\94олжен Ð±Ñ\8bÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е 7 символов',
+    'password_hint' => 'Ð\9cинимÑ\83м 8 символов',
     'forgot_password' => 'Забыли пароль?',
     'remember_me' => 'Запомнить меня',
     'ldap_email_hint' => 'Введите адрес электронной почты для этой учетной записи.',
@@ -41,11 +41,11 @@ return [
 
     // Password Reset
     'reset_password' => 'Сброс пароля',
-    'reset_password_send_instructions' => 'Введите свой email ниже, и вам будет отправлено письмо со ссылкой для сброса пароля.',
-    'reset_password_send_button' => 'Ð\9eÑ\82пÑ\80авиÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлкÑ\83 Ð´Ð»Ñ\8f Ñ\81бÑ\80оÑ\81а',
-    'reset_password_sent_success' => 'Ссылка для сброса была отправлена на :email.',
+    'reset_password_send_instructions' => 'Введите свой адрес электронной почты ниже, и вам будет отправлено письмо со ссылкой для сброса пароля.',
+    'reset_password_send_button' => 'СбÑ\80оÑ\81иÑ\82Ñ\8c Ð¿Ð°Ñ\80олÑ\8c',
+    'reset_password_sent_success' => 'СÑ\81Ñ\8bлка Ð´Ð»Ñ\8f Ñ\81бÑ\80оÑ\81а Ð¿Ð°Ñ\80олÑ\8f Ð±Ñ\8bла Ð¾Ñ\82пÑ\80авлена Ð½Ð° :email.',
     'reset_password_success' => 'Ваш пароль был успешно сброшен.',
-    'email_reset_subject' => 'Сбросить ваш :appName пароль',
+    'email_reset_subject' => 'Сброс пароля от :appName',
     'email_reset_text' => 'Вы получили это письмо, потому что запросили сброс пароля для вашей учетной записи.',
     'email_reset_not_requested' => 'Если вы не запрашивали сброса пароля, то никаких дополнительных действий не требуется.',
 
@@ -62,14 +62,14 @@ return [
     'email_not_confirmed' => 'Адрес электронной почты не подтвержден',
     'email_not_confirmed_text' => 'Ваш email адрес все еще не подтвержден.',
     'email_not_confirmed_click_link' => 'Пожалуйста, нажмите на ссылку в письме, которое было отправлено при регистрации.',
-    'email_not_confirmed_resend' => 'Ð\95Ñ\81ли Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ð¹Ñ\82и Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81нова Ð¾Ñ\82пÑ\80авиÑ\82Ñ\8c Ð¿Ð¸Ñ\81Ñ\8cмо с подтверждением по форме ниже.',
+    'email_not_confirmed_resend' => 'Ð\95Ñ\81ли Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ð¹Ñ\82и Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\81нова Ð¾Ñ\82пÑ\80авиÑ\82Ñ\8c ÐµÐ³о с подтверждением по форме ниже.',
     'email_not_confirmed_resend_button' => 'Переотправить письмо с подтверждением',
 
     // User Invite
     'user_invite_email_subject' => 'Вас приглашают присоединиться к :appName!',
     'user_invite_email_greeting' => 'Для вас создан аккаунт в :appName.',
     'user_invite_email_text' => 'Нажмите кнопку ниже, чтобы задать пароль и получить доступ:',
-    'user_invite_email_action' => 'УÑ\81Ñ\82ановиÑ\82Ñ\8c Ð¿Ð°Ñ\80олÑ\8c Ð°ÐºÐºÐ°Ñ\83нÑ\82Ñ\83.',
+    'user_invite_email_action' => 'УÑ\81Ñ\82ановиÑ\82Ñ\8c Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f Ð°ÐºÐºÐ°Ñ\83нÑ\82а',
     'user_invite_page_welcome' => 'Добро пожаловать в :appName!',
     'user_invite_page_text' => 'Завершите настройку аккаунта, установите пароль для дальнейшего входа в :appName.',
     'user_invite_page_confirm_button' => 'Подтвердите пароль',
index cd6661d57b97756fb058c0ad87e1d5fa6a125b67..50bd672e7ba54f0ce1b2d01c6e9d3dd0a709f0dc 100644 (file)
@@ -38,11 +38,11 @@ return [
     'reset' => 'Сбросить',
     'remove' => 'Удалить',
     'add' => 'Добавить',
-    'fullscreen' => 'Fullscreen',
+    'fullscreen' => 'На весь экран',
 
     // Sort Options
     'sort_options' => 'Параметры сортировки',
-    'sort_direction_toggle' => 'Переключить направления сортировки',
+    'sort_direction_toggle' => 'Переключить направление сортировки',
     'sort_ascending' => 'По возрастанию',
     'sort_descending' => 'По убыванию',
     'sort_name' => 'По имени',
@@ -64,7 +64,7 @@ return [
 
     // Header
     'profile_menu' => 'Меню профиля',
-    'view_profile' => 'Просмотреть профиль',
+    'view_profile' => 'Посмотреть профиль',
     'edit_profile' => 'Редактировать профиль',
 
     // Layout tabs
@@ -72,6 +72,6 @@ return [
     'tab_content' => 'Содержание',
 
     // Email Content
-    'email_action_help' => 'Ð\95Ñ\81ли Ñ\83 Ð²Ð°Ñ\81 Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ Ð¿Ñ\80облемÑ\8b Ñ\81 Ð½Ð°Ð¶Ð°Ñ\82ием ÐºÐ½Ð¾Ð¿ÐºÐ¸ \':actionText\', Ñ\82о Ñ\81копиÑ\80Ñ\83йÑ\82е Ð¸ Ð²Ñ\81Ñ\82авÑ\8cÑ\82е Ñ\83казаннÑ\8bй URL-адÑ\80еÑ\81 Ð² Ñ\81вой Ð²ÐµÐ±-бÑ\80аÑ\83зеÑ\80:',
+    'email_action_help' => 'Если у вас возникли проблемы с нажатием кнопки \':actionText\', то скопируйте и вставьте указанный URL-адрес в свой браузер:',
     'email_rights' => 'Все права защищены',
 ];
index e9481f791466520021fedc76a7aa5593b0bb3752..d85fca0084358546f89ba300745cdecd58bb3b5f 100644 (file)
@@ -7,20 +7,20 @@ return [
     // Image Manager
     'image_select' => 'Выбрать изображение',
     'image_all' => 'Все',
-    'image_all_title' => 'Простмотр всех изображений',
+    'image_all_title' => 'Просмотр всех изображений',
     'image_book_title' => 'Просмотр всех изображений, загруженных в эту книгу',
     'image_page_title' => 'Просмотр всех изображений, загруженных на эту страницу',
-    'image_search_hint' => 'Ð\9fоиÑ\81к Ð¿Ð¾ Ð¸Ð¼ÐµÐ½Ð¸ изображения',
-    'image_uploaded' => 'Ð\97агÑ\80Ñ\83женно :uploadedDate',
+    'image_search_hint' => 'Ð\9fоиÑ\81к Ð¿Ð¾ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ\8e изображения',
+    'image_uploaded' => 'Загружено :uploadedDate',
     'image_load_more' => 'Загрузить еще',
-    'image_image_name' => 'Ð\98мÑ\8f изображения',
+    'image_image_name' => 'Ð\9dазвание изображения',
     'image_delete_used' => 'Это изображение используется на странице ниже.',
     'image_delete_confirm' => 'Нажмите \'Удалить\' еще раз для подтверждения удаления.',
     'image_select_image' => 'Выбрать изображение',
     'image_dropzone' => 'Перетащите изображение или кликните для загрузки',
     'images_deleted' => 'Изображения удалены',
-    'image_preview' => 'Предосмотр изображения',
-    'image_upload_success' => 'Изображение загружено успешно',
+    'image_preview' => 'Ð\9fÑ\80едпÑ\80оÑ\81моÑ\82Ñ\80 Ð¸Ð·Ð¾Ð±Ñ\80ажениÑ\8f',
+    'image_upload_success' => 'Изображение успешно загружено',
     'image_update_success' => 'Детали изображения успешно обновлены',
     'image_delete_success' => 'Изображение успешно удалено',
     'image_upload_remove' => 'Удалить изображение',
index e9fe6ba309a0184e4dea4eeb3b9ebd9c6c58d55e..fc180061a86e20ae8f4ebb947b658de1dd708fa7 100644 (file)
@@ -16,7 +16,7 @@ return [
     'recently_viewed' => 'Недавно просмотренные',
     'recent_activity' => 'Недавние действия',
     'create_now' => 'Создать сейчас',
-    'revisions' => 'Версия',
+    'revisions' => 'Версии',
     'meta_revision' => 'Версия #:revisionCount',
     'meta_created' => 'Создано :timeLength',
     'meta_created_name' => ':user создал :timeLength',
@@ -36,15 +36,15 @@ return [
 
     // Permissions and restrictions
     'permissions' => 'Разрешения',
-    'permissions_intro' => 'После включения эти разрешения будут иметь приоритет над любыми установленными полномочиями.',
+    'permissions_intro' => 'После включения опции эти разрешения будут иметь приоритет над любыми установленными разрешениями роли.',
     'permissions_enable' => 'Включение пользовательских разрешений',
     'permissions_save' => 'Сохранить разрешения',
 
     // Search
     'search_results' => 'Результаты поиска',
-    'search_total_results_found' => ':count результатов найдено|:count всего результатов найдено',
+    'search_total_results_found' => 'Найден :count результат|Найдено :count результата|Найдено :count результатов',
     'search_clear' => 'Очистить поиск',
-    'search_no_pages' => 'Нет страниц, соответствующих этому поиску.',
+    'search_no_pages' => 'Нет страниц, соответствующих этому поиску',
     'search_for_term' => 'Искать :term',
     'search_more' => 'Еще результаты',
     'search_filters' => 'Фильтры поиска',
@@ -68,7 +68,7 @@ return [
     // Shelves
     'shelf' => 'Полка',
     'shelves' => 'Полки',
-    'x_shelves' => ':count Ð¿Ð¾Ð»Ð¾Ðº|:count полок',
+    'x_shelves' => ':count Ð¿Ð¾Ð»ÐºÐ°|:count Ð¿Ð¾Ð»ÐºÐ¸|:count полок',
     'shelves_long' => 'Книжные полки',
     'shelves_empty' => 'Полки не созданы',
     'shelves_create' => 'Создать новую полку',
@@ -80,7 +80,7 @@ return [
     'shelves_save' => 'Сохранить полку',
     'shelves_books' => 'Книги из этой полки',
     'shelves_add_books' => 'Добавить книгу в эту полку',
-    'shelves_drag_books' => 'Перетащите книгу сюда, чтобы добавить на эту полку',
+    'shelves_drag_books' => 'Перетащите книги сюда, чтобы добавить их на эту полку',
     'shelves_empty_contents' => 'На этой полке нет книг',
     'shelves_edit_and_assign' => 'Изменить полку для привязки книг',
     'shelves_edit_named' => 'Редактировать полку :name',
@@ -91,16 +91,16 @@ return [
     'shelves_delete_confirmation' => 'Вы уверены, что хотите удалить эту полку?',
     'shelves_permissions' => 'Доступы к книжной полке',
     'shelves_permissions_updated' => 'Доступы к книжной полке обновлены',
-    'shelves_permissions_active' => 'Ð\94оÑ\81Ñ\82Ñ\83пÑ\8b Ðº ÐºÐ½Ð¸Ð¶Ð½Ð¾Ð¹ Ð¿Ð¾Ð»ÐºÐµ Ð°ÐºÑ\82ивнÑ\8b',
+    'shelves_permissions_active' => 'Ð\94ейÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ие Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ½Ð¸Ð¶Ð½Ð¾Ð¹ Ð¿Ð¾Ð»ÐºÐ¸',
     'shelves_copy_permissions_to_books' => 'Наследовать доступы книгам',
     'shelves_copy_permissions' => 'Копировать доступы',
     'shelves_copy_permissions_explain' => 'Это применит текущие настройки доступов этой книжной полки ко всем книгам, содержащимся внутри. Перед активацией убедитесь, что все изменения в доступах этой книжной полки сохранены.',
-    'shelves_copy_permission_success' => 'Доступы книжной полки скопированы для :count books',
+    'shelves_copy_permission_success' => 'Доступы книжной полки скопированы для :count книг',
 
     // Books
     'book' => 'Книга',
     'books' => 'Книги',
-    'x_books' => ':count книга|:count книг',
+    'x_books' => ':count книга|:count книги|:count книг',
     'books_empty' => 'Нет созданных книг',
     'books_popular' => 'Популярные книги',
     'books_recent' => 'Недавние книги',
@@ -115,7 +115,7 @@ return [
     'books_delete_confirmation' => 'Вы действительно хотите удалить эту книгу?',
     'books_edit' => 'Редактировать книгу',
     'books_edit_named' => 'Редактировать книгу :bookName',
-    'books_form_book_name' => 'Ð\98мÑ\8f книги',
+    'books_form_book_name' => 'Ð\9dазвание книги',
     'books_save' => 'Сохранить книгу',
     'books_permissions' => 'Разрешения на книгу',
     'books_permissions_updated' => 'Разрешения на книгу обновлены',
@@ -123,23 +123,23 @@ return [
     'books_empty_create_page' => 'Создать новую страницу',
     'books_empty_sort_current_book' => 'Сортировка текущей книги',
     'books_empty_add_chapter' => 'Добавить главу',
-    'books_permissions_active' => 'дейÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ие Ñ\80азÑ\80еÑ\88ениÑ\8f Ð½Ð° ÐºÐ½Ð¸Ð³Ñ\83',
+    'books_permissions_active' => 'Ð\94ейÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ие Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ½Ð¸Ð³Ð¸',
     'books_search_this' => 'Поиск в этой книге',
     'books_navigation' => 'Навигация по книге',
     'books_sort' => 'Сортировка содержимого книги',
     'books_sort_named' => 'Сортировка книги :bookName',
-    'books_sort_name' => 'СоÑ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ð¿о имени',
-    'books_sort_created' => 'СоÑ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ð¿о дате создания',
-    'books_sort_updated' => 'СоÑ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ð¿о дате обновления',
-    'books_sort_chapters_first' => 'СнаÑ\87ала Ð³Ð»Ð°Ð²Ñ\8b',
-    'books_sort_chapters_last' => 'Ð\93лавÑ\8b Ð¿Ð¾Ñ\81ледние',
+    'books_sort_name' => 'Ð\9fо имени',
+    'books_sort_created' => 'Ð\9fо дате создания',
+    'books_sort_updated' => 'Ð\9fо дате обновления',
+    'books_sort_chapters_first' => 'Ð\93лавÑ\8b Ð² Ð½Ð°Ñ\87але',
+    'books_sort_chapters_last' => 'Ð\93лавÑ\8b Ð² ÐºÐ¾Ð½Ñ\86е',
     'books_sort_show_other' => 'Показать другие книги',
     'books_sort_save' => 'Сохранить новый порядок',
 
     // Chapters
     'chapter' => 'Глава',
     'chapters' => 'Главы',
-    'x_chapters' => ':count глава|:count главы',
+    'x_chapters' => ':count глава|:count главы|:count глав',
     'chapters_popular' => 'Популярные главы',
     'chapters_new' => 'Новая глава',
     'chapters_create' => 'Создать новую главу',
@@ -148,7 +148,7 @@ return [
     'chapters_delete_explain' => 'Это удалит главу с именем \':chapterName\'. Все страницы главы будут удалены и перемещены напрямую в книгу.',
     'chapters_delete_confirm' => 'Вы действительно хотите удалить эту главу?',
     'chapters_edit' => 'Редактировать главу',
-    'chapters_edit_named' => 'редактировать главу :chapterName',
+    'chapters_edit_named' => 'Редактировать главу :chapterName',
     'chapters_save' => 'Сохранить главу',
     'chapters_move' => 'Переместить главу',
     'chapters_move_named' => 'Переместить главу :chapterName',
@@ -162,12 +162,12 @@ return [
     // Pages
     'page' => 'Страница',
     'pages' => 'Страницы',
-    'x_pages' => ':count страница|:count страниц',
+    'x_pages' => ':count страница|:count страницы|:count страниц',
     'pages_popular' => 'Популярные страницы',
     'pages_new' => 'Новая страница',
     'pages_attachments' => 'Вложения',
     'pages_navigation' => 'Навигация на странице',
-    'pages_delete' => 'УдалиÑ\82Ñ\8c Ñ\83Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83',
+    'pages_delete' => 'Удалить страницу',
     'pages_delete_named' => 'Удалить страницу :pageName',
     'pages_delete_draft_named' => 'Удалить черновик :pageName',
     'pages_delete_draft' => 'Удалить черновик',
@@ -183,13 +183,13 @@ return [
     'pages_editing_page' => 'Редактирование страницы',
     'pages_edit_draft_save_at' => 'Черновик сохранён в ',
     'pages_edit_delete_draft' => 'Удалить черновик',
-    'pages_edit_discard_draft' => 'отменить черновик',
+    'pages_edit_discard_draft' => 'Ð\9eтменить черновик',
     'pages_edit_set_changelog' => 'Задать список изменений',
-    'pages_edit_enter_changelog_desc' => 'Ð\92ведиÑ\82е ÐºÑ\80аÑ\82кое Ð¾Ð¿Ð¸Ñ\81ание Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð²Ñ\8b Ñ\81делали',
+    'pages_edit_enter_changelog_desc' => 'Ð\92ведиÑ\82е ÐºÑ\80аÑ\82кое Ð¾Ð¿Ð¸Ñ\81ание Ð²Ð½ÐµÑ\81еннÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹',
     'pages_edit_enter_changelog' => 'Введите список изменений',
     'pages_save' => 'Сохранить страницу',
     'pages_title' => 'Заголовок страницы',
-    'pages_name' => 'Ð\98мÑ\8f страницы',
+    'pages_name' => 'Ð\9dазвание страницы',
     'pages_md_editor' => 'Редактор',
     'pages_md_preview' => 'Просмотр',
     'pages_md_insert_image' => 'Вставить изображение',
@@ -204,14 +204,14 @@ return [
     'pages_permissions' => 'Разрешения страницы',
     'pages_permissions_success' => 'Pазрешения страницы обновлены',
     'pages_revision' => 'Версия',
-    'pages_revisions' => 'Версия страницы',
+    'pages_revisions' => 'Версии страницы',
     'pages_revisions_named' => 'Версии страницы для :pageName',
     'pages_revision_named' => 'Версия страницы для :pageName',
     'pages_revisions_created_by' => 'Создана',
     'pages_revisions_date' => 'Дата версии',
     'pages_revisions_number' => '#',
-    'pages_revisions_numbered' => 'Ревизия #:id',
-    'pages_revisions_numbered_changes' => 'РевизиÑ\8f #:id Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f',
+    'pages_revisions_numbered' => 'Ð\92еÑ\80Ñ\81ия #:id',
+    'pages_revisions_numbered_changes' => 'Ð\98зменениÑ\8f Ð² Ð²ÐµÑ\80Ñ\81ии #:id',
     'pages_revisions_changelog' => 'Список изменений',
     'pages_revisions_changes' => 'Изменения',
     'pages_revisions_current' => 'Текущая версия',
@@ -223,8 +223,8 @@ return [
     'pages_permissions_active' => 'Действующие разрешения на страницу',
     'pages_initial_revision' => 'Первоначальное издание',
     'pages_initial_name' => 'Новая страница',
-    'pages_editing_draft_notification' => 'Вы в настоящее время редактируете черновик, который был сохранен :timeDiff.',
-    'pages_draft_edited_notification' => 'Эта страница была обновлена до этого момента. Рекомендуется отменить этот черновик',
+    'pages_editing_draft_notification' => 'В настоящее время вы редактируете черновик, который был сохранён :timeDiff.',
+    'pages_draft_edited_notification' => 'Эта страница была обновлена до этого момента. Рекомендуется отменить этот черновик.',
     'pages_draft_edit_active' => [
         'start_a' => ':count пользователей начали редактирование этой страницы',
         'start_b' => ':userName начал редактирование этой страницы',
@@ -247,8 +247,8 @@ return [
     'tag_value' => 'Значение тега (опционально)',
     'tags_explain' => "Добавьте теги, чтобы лучше классифицировать ваш контент. \\n Вы можете присвоить значение тегу для более глубокой организации.",
     'tags_add' => 'Добавить тег',
-    'tags_remove' => 'Удалить этот тэг',
-    'attachments' => 'Вложение',
+    'tags_remove' => 'Удалить этот тег',
+    'attachments' => 'Вложения',
     'attachments_explain' => 'Загрузите несколько файлов или добавьте ссылку для отображения на своей странице. Они видны на боковой панели страницы.',
     'attachments_explain_instant_save' => 'Изменения здесь сохраняются мгновенно.',
     'attachments_items' => 'Прикрепленные элементы',
@@ -258,34 +258,34 @@ return [
     'attachments_delete_confirm' => 'Нажмите \'Удалить\' еще раз, чтобы подтвердить удаление этого файла.',
     'attachments_dropzone' => 'Перетащите файл сюда или нажмите здесь, чтобы загрузить файл',
     'attachments_no_files' => 'Файлы не загружены',
-    'attachments_explain_link' => 'Вы можете присоединить ссылку, если вы предпочитаете не загружать файл. Это может быть ссылка на другую страницу или ссылку на файл в облаке',
-    'attachments_link_name' => 'Ð\98мÑ\8f ссылки',
+    'attachments_explain_link' => 'Вы можете присоединить ссылку, если вы предпочитаете не загружать файл. Это может быть ссылка на другую страницу или ссылка на файл в облаке.',
+    'attachments_link_name' => 'Ð\9dазвание ссылки',
     'attachment_link' => 'Ссылка на вложение',
     'attachments_link_url' => 'Ссылка на файл',
     'attachments_link_url_hint' => 'URL-адрес сайта или файла',
     'attach' => 'Прикрепить',
     'attachments_edit_file' => 'Редактировать файл',
-    'attachments_edit_file_name' => 'Ð\98мÑ\8f файла',
-    'attachments_edit_drop_upload' => 'перетащите файлы или нажмите здесь, чтобы загрузить и перезаписать',
-    'attachments_order_updated' => 'Прикрепленный файл обновлен',
-    'attachments_updated_success' => 'Детали файла обновлены',
-    'attachments_deleted' => 'Ð\9fÑ\80иложение удалено',
+    'attachments_edit_file_name' => 'Ð\9dазвание файла',
+    'attachments_edit_drop_upload' => 'Ð\9fеретащите файлы или нажмите здесь, чтобы загрузить и перезаписать',
+    'attachments_order_updated' => 'Порядок вложений обновлен',
+    'attachments_updated_success' => 'Детали вложения обновлены',
+    'attachments_deleted' => 'Ð\92ложение удалено',
     'attachments_file_uploaded' => 'Файл успешно загружен',
     'attachments_file_updated' => 'Файл успешно обновлен',
     'attachments_link_attached' => 'Ссылка успешно присоединена к странице',
     'templates' => 'Шаблоны',
-    'templates_set_as_template' => 'СÑ\82Ñ\80аниÑ\86а Ñ\8dÑ\82о Ñ\88аблон',
+    'templates_set_as_template' => 'СÑ\82Ñ\80аниÑ\86а Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\88аблоном',
     'templates_explain_set_as_template' => 'Вы можете назначить эту страницу в качестве шаблона, её содержимое будет использоваться при создании других страниц. Пользователи смогут использовать этот шаблон в случае, если имеют разрешения на просмотр этой страницы.',
     'templates_replace_content' => 'Заменить содержимое страницы',
     'templates_append_content' => 'Добавить к содержанию страницы',
     'templates_prepend_content' => 'Добавить в начало содержимого страницы',
 
     // Profile View
-    'profile_user_for_x' => 'пользователь уже :time',
+    'profile_user_for_x' => 'Ð\9fользователь уже :time',
     'profile_created_content' => 'Созданный контент',
-    'profile_not_created_pages' => ':userName Ð½Ðµ Ñ\81оздавал Ñ\81Ñ\82Ñ\80аниÑ\86',
-    'profile_not_created_chapters' => ':userName Ð½Ðµ Ñ\81оздавал Ð³Ð»Ð°Ð²',
-    'profile_not_created_books' => ':userName Ð½Ðµ Ñ\81оздавал Ð½Ð¸ Ð¾Ð´Ð½Ð¾Ð¹ ÐºÐ½Ð¸Ð³Ð¸',
+    'profile_not_created_pages' => ':userName Ð½Ðµ Ñ\81оздал Ð½Ð¸ Ð¾Ð´Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b',
+    'profile_not_created_chapters' => ':userName Ð½Ðµ Ñ\81оздал Ð½Ð¸ Ð¾Ð´Ð½Ð¾Ð¹ Ð³Ð»Ð°Ð²Ñ\8b',
+    'profile_not_created_books' => ':userName не создал ни одной книги',
     'profile_not_created_shelves' => ':userName не создал ни одной полки',
 
     // Comments
@@ -295,7 +295,7 @@ return [
     'comment_placeholder' => 'Оставить комментарий здесь',
     'comment_count' => '{0} Нет комментариев|{1} 1 комментарий|[2,*] :count комментария',
     'comment_save' => 'Сохранить комментарий',
-    'comment_saving' => 'СоÑ\85Ñ\80аниение ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иÑ\8f...',
+    'comment_saving' => 'Сохранение комментария...',
     'comment_deleting' => 'Удаление комментария...',
     'comment_new' => 'Новый комментарий',
     'comment_created' => 'прокомментировал :createDiff',
@@ -307,8 +307,8 @@ return [
     'comment_in_reply_to' => 'В ответ на :commentId',
 
     // Revision
-    'revision_delete_confirm' => 'Удалить эту ревизию?',
-    'revision_restore_confirm' => 'Восстановить эту ревизию? Текущее содержимое будет заменено.',
-    'revision_delete_success' => 'Ревизия удалена',
+    'revision_delete_confirm' => 'Удалить эту версию?',
+    'revision_restore_confirm' => 'Вы уверены, что хотите восстановить эту версию? Текущее содержимое страницы будет заменено.',
+    'revision_delete_success' => 'Ð\92еÑ\80Ñ\81ия удалена',
     'revision_cannot_delete_latest' => 'Нельзя удалить последнюю версию.'
 ];
\ No newline at end of file
index 2f5f74caa832703ce758c5414679069909356e03..0cc4a72b147727ca9acbbfbfec852852004f8f6c 100644 (file)
@@ -9,23 +9,23 @@ return [
     'permissionJson' => 'У вас нет разрешения для запрашиваемого действия.',
 
     // Auth
-    'error_user_exists_different_creds' => 'Пользователь с электронной почтой: :email уже существует, но с другими учетными данными.',
-    'email_already_confirmed' => 'ЭлекÑ\82Ñ\80оннаÑ\8f Ð¿Ð¾Ñ\87Ñ\82а Ñ\83же Ð¿Ð¾Ð´Ñ\82веÑ\80ждена, попробуйте войти в систему.',
+    'error_user_exists_different_creds' => 'Пользователь с электронной почтой :email уже существует, но с другими учетными данными.',
+    'email_already_confirmed' => 'Ð\90дÑ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b Ñ\83же Ð±Ñ\8bл Ð¿Ð¾Ð´Ñ\82веÑ\80жден, попробуйте войти в систему.',
     'email_confirmation_invalid' => 'Этот токен подтверждения недействителен или уже используется. Повторите попытку регистрации.',
     'email_confirmation_expired' => 'Истек срок действия токена. Отправлено новое письмо с подтверждением.',
-    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'email_confirmation_awaiting' => 'Для используемой учетной записи необходимо подтвердить адрес электронной почты',
     'ldap_fail_anonymous' => 'Недопустимый доступ LDAP с использованием анонимной привязки',
     'ldap_fail_authed' => 'Не удалось получить доступ к LDAP, используя данные dn & password',
-    'ldap_extension_not_installed' => 'LDAP расширения для PHP не установлено',
-    'ldap_cannot_connect' => 'Не удается подключиться к серверу ldap, не удалось выполнить начальное соединение',
-    'saml_already_logged_in' => 'Already logged in',
-    'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
-    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
-    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
-    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'ldap_extension_not_installed' => 'LDAP расширение для PHP не установлено',
+    'ldap_cannot_connect' => 'Не удается подключиться к серверу LDAP, не удалось выполнить начальное соединение',
+    'saml_already_logged_in' => 'Уже вошли в систему',
+    'saml_user_not_registered' => 'Пользователь :name не зарегистрирован. Автоматическая регистрация отключена',
+    'saml_no_email_address' => 'Не удалось найти email для этого пользователя в данных, предоставленных внешней системой аутентификации',
+    'saml_invalid_response_id' => 'Запрос от внешней системы аутентификации не распознается процессом, запущенным этим приложением. Переход назад после входа в систему может вызвать эту проблему.',
+    'saml_fail_authed' => 'Вход с помощью :system не удался, система не предоставила успешную авторизацию',
     'social_no_action_defined' => 'Действие не определено',
     'social_login_bad_response' => "При попытке входа с :socialAccount произошла ошибка: \\n:error",
-    'social_account_in_use' => 'ЭÑ\82оÑ\82 :socialAccount Ð°ÐºÐºÐ°Ñ\83нÑ\82 Ñ\83же Ð¸Ñ\81опльзуется, попробуйте войти с параметрами :socialAccount.',
+    'social_account_in_use' => 'ЭÑ\82оÑ\82 :socialAccount Ð°ÐºÐºÐ°Ñ\83нÑ\82 Ñ\83же Ð¸Ñ\81пользуется, попробуйте войти с параметрами :socialAccount.',
     'social_account_email_in_use' => 'Электронный ящик :email уже используется. Если у вас уже есть учетная запись, вы можете подключить свою учетную запись :socialAccount из настроек своего профиля.',
     'social_account_existing' => 'Этот :socialAccount уже привязан к вашему профилю.',
     'social_account_already_used_existing' => 'Этот :socialAccount уже используется другим пользователем.',
@@ -36,14 +36,14 @@ return [
     'invite_token_expired' => 'Срок действия приглашения истек. Вместо этого вы можете попытаться сбросить пароль своей учетной записи.',
 
     // System
-    'path_not_writable' => 'Невозможно загрузить файл по пути :filePath . Убедитесь что сервер доступен для записи.',
+    'path_not_writable' => 'Невозможно загрузить файл по пути :filePath. Убедитесь что сервер доступен для записи.',
     'cannot_get_image_from_url' => 'Не удается получить изображение из :url',
     'cannot_create_thumbs' => 'Сервер не может создавать эскизы. Убедитесь, что у вас установлено расширение GD PHP.',
-    'server_upload_limit' => 'Сервер не разрешает загрузку такого размера. Попробуйте уменьшить размер файла.',
+    'server_upload_limit' => 'СеÑ\80веÑ\80 Ð½Ðµ Ñ\80азÑ\80еÑ\88аеÑ\82 Ð·Ð°Ð³Ñ\80Ñ\83зкÑ\83 Ñ\84айлов Ñ\82акого Ñ\80азмеÑ\80а. Ð\9fопÑ\80обÑ\83йÑ\82е Ñ\83менÑ\8cÑ\88иÑ\82Ñ\8c Ñ\80азмеÑ\80 Ñ\84айла.',
     'uploaded'  => 'Сервер не позволяет загружать файлы такого размера. Пожалуйста, попробуйте файл меньше.',
-    'image_upload_error' => 'Произошла ошибка при загрузке изображения.',
+    'image_upload_error' => 'Произошла ошибка при загрузке изображения',
     'image_upload_type_error' => 'Неправильный тип загружаемого изображения',
-    'file_upload_timeout' => 'Ð\92Ñ\8bгÑ\80Ñ\83зка Ñ\84айла Ð·Ð°ÐºÐ¾Ð½Ñ\87илаÑ\81Ñ\8c.',
+    'file_upload_timeout' => 'Ð\92Ñ\80емÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83зки Ñ\84айла Ð¸Ñ\81Ñ\82екло.',
 
     // Attachments
     'attachment_page_mismatch' => 'Несоответствие страницы во время обновления вложения',
@@ -51,7 +51,7 @@ return [
 
     // Pages
     'page_draft_autosave_fail' => 'Не удалось сохранить черновик. Перед сохранением этой страницы убедитесь, что у вас есть подключение к Интернету.',
-    'page_custom_home_deletion' => 'Ð\9dелÑ\8cзÑ\8f Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ñ\83Ñ\81Ñ\82ановленнÑ\83Ñ\8e Ð²Ð¼ÐµÑ\81Ñ\82о Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b',
+    'page_custom_home_deletion' => 'Ð\9dевозможно Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð¿Ð¾ÐºÐ° Ð¾Ð½Ð° Ñ\83Ñ\81Ñ\82ановлена ÐºÐ°Ðº Ð´Ð¾Ð¼Ð°Ñ\88нÑ\8fÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а',
 
     // Entities
     'entity_not_found' => 'Объект не найден',
@@ -61,39 +61,43 @@ return [
     'chapter_not_found' => 'Глава не найдена',
     'selected_book_not_found' => 'Выбранная книга не найдена',
     'selected_book_chapter_not_found' => 'Выбранная книга или глава не найдена',
-    'guests_cannot_save_drafts' => 'Гости не могут сохранить черновики',
+    'guests_cannot_save_drafts' => 'Гости не могут сохранять черновики',
 
     // Users
     'users_cannot_delete_only_admin' => 'Вы не можете удалить единственного администратора',
     'users_cannot_delete_guest' => 'Вы не можете удалить гостевого пользователя',
 
     // Roles
-    'role_cannot_be_edited' => 'Ð\9dевозможно Ð¾Ñ\82Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ð´Ð°Ð½Ð½Ñ\83Ñ\8e Ñ\80олÑ\8c',
+    'role_cannot_be_edited' => 'ЭÑ\82а Ñ\80олÑ\8c Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°',
     'role_system_cannot_be_deleted' => 'Эта роль является системной и не может быть удалена',
-    'role_registration_default_cannot_delete' => 'Эта роль не может быть удалена, так как она устанолена в качестве роли по умолчанию',
+    'role_registration_default_cannot_delete' => 'ЭÑ\82а Ñ\80олÑ\8c Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ñ\83далена, Ñ\82ак ÐºÐ°Ðº Ð¾Ð½Ð° Ñ\83Ñ\81Ñ\82ановлена Ð² ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ñ\80оли Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e',
     'role_cannot_remove_only_admin' => 'Этот пользователь единственный с правами администратора. Назначьте роль администратора другому пользователю, прежде чем удалить этого.',
 
     // Comments
-    'comment_list' => 'Ð\9fÑ\80и Ð¿Ð¾Ð»Ñ\83Ñ\87ении ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иев Ð¿Ñ\80оизоÑ\88ла Ð¾Ñ\88ибка.',
+    'comment_list' => 'Ð\9fÑ\80оизоÑ\88ла Ð¾Ñ\88ибка Ð¿Ñ\80и Ð¿Ð¾Ð»Ñ\83Ñ\87ении ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иев.',
     'cannot_add_comment_to_draft' => 'Вы не можете добавлять комментарии к черновику.',
-    'comment_add' => 'Ð\9fÑ\80и Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¸ / Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¸ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иÑ\8f Ð¿Ñ\80оизоÑ\88ла Ð¾Ñ\88ибка.',
-    'comment_delete' => 'Ð\9fÑ\80и Ñ\83далении ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иÑ\8f Ð¿Ñ\80оизоÑ\88ла Ð¾Ñ\88ибка.',
+    'comment_add' => 'Ð\9fÑ\80оизоÑ\88ла Ð¾Ñ\88ибка Ð¿Ñ\80и Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¸ / Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¸ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иÑ\8f.',
+    'comment_delete' => 'Ð\9fÑ\80оизоÑ\88ла Ð¾Ñ\88ибка Ð¿Ñ\80и Ñ\83далении ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иÑ\8f.',
     'empty_comment' => 'Нельзя добавить пустой комментарий.',
 
     // Error pages
     '404_page_not_found' => 'Страница не найдена',
     'sorry_page_not_found' => 'Извините, страница, которую вы искали, не найдена.',
+    'sorry_page_not_found_permission_warning' => 'Если вы ожидали что страница существует, возможно у вас нет прав для её просмотра.',
     'return_home' => 'вернуться на главную страницу',
     'error_occurred' => 'Произошла ошибка',
-    'app_down' => ':appName в данный момент не достпуно',
+    'app_down' => ':appName в данный момент не доступно',
     'back_soon' => 'Скоро восстановится.',
 
     // API errors
-    'api_no_authorization_found' => 'No authorization token found on the request',
-    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
-    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
-    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
-    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
-    'api_user_token_expired' => 'The authorization token used has expired',
+    'api_no_authorization_found' => 'Отсутствует токен авторизации в запросе',
+    'api_bad_authorization_format' => 'Токен авторизации найден, но формат запроса неверен',
+    'api_user_token_not_found' => 'Отсутствует соответствующий API токен для предоставленного токена авторизации',
+    'api_incorrect_token_secret' => 'Секрет, предоставленный для данного использованного API токена неверен',
+    'api_user_no_api_permission' => 'Владелец используемого API токена не имеет прав на выполнение вызовов API',
+    'api_user_token_expired' => 'Срок действия используемого токена авторизации истек',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Ошибка при отправке тестового письма:',
 
 ];
index 5e7717803390525b55e3afcbd60278260e7a3a3d..d04970f08966f98bcb82551d7c8f32fae22362da 100644 (file)
@@ -6,8 +6,8 @@
  */
 return [
 
-    'password' => 'Пароль должен содержать не менее шести символов и совпадать с подтверждением.',
-    'user' => "Пользователя с таким адресом не существует.",
+    'password' => 'Пароль должен содержать не менее восьми символов и совпадать с подтверждением.',
+    'user' => "Пользователя с данным адресом электронной почты не существует.",
     'token' => 'Токен сброса пароля недействителен.',
     'sent' => 'Ссылка для сброса пароля отправлена на вашу почту!',
     'reset' => 'Ваш пароль был сброшен!',
index ecd80c2839b40df06b3d3e19a43f35f76abc4cb5..8eeb3bca16eb5d62b1b61ce154f623964ae80238 100755 (executable)
@@ -13,55 +13,55 @@ return [
 
     // App Settings
     'app_customization' => 'Настройки',
-    'app_features_security' => 'Функционал & Безопасность',
-    'app_name' => 'Ð\98мÑ\8f приложения',
-    'app_name_desc' => 'Ð\98мÑ\8f Ð¾Ñ\82обÑ\80ажаеÑ\82Ñ\81Ñ\8f Ð² Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐµ email отправленных системой.',
-    'app_name_header' => 'Ð\9eÑ\82обÑ\80ажаÑ\82Ñ\8c Ð¸Ð¼Ñ\8f приложения в заголовке',
+    'app_features_security' => 'Функционал и безопасность',
+    'app_name' => 'Ð\9dазвание приложения',
+    'app_name_desc' => 'Ð\9dазвание Ð¾Ñ\82обÑ\80ажаеÑ\82Ñ\81Ñ\8f Ð² Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ñ\85 Ð¸ Ñ\81ообÑ\89ениÑ\8fÑ\85 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b отправленных системой.',
+    'app_name_header' => 'Ð\9eÑ\82обÑ\80ажаÑ\82Ñ\8c Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ приложения в заголовке',
     'app_public_access' => 'Публичный доступ',
     'app_public_access_desc' => 'Включение этой опции позволит неавторизованным посетителям получить доступ к содержимому вашего BookStack.',
     'app_public_access_desc_guest' => 'Публичный доступ контролируется через настройки пользователя "Guest"',
     'app_public_access_toggle' => 'Разрешить публичный доступ',
     'app_public_viewing' => 'Разрешить публичный просмотр?',
-    'app_secure_images' => 'Загрузка изображений с высоким уровнем безопасности.',
+    'app_secure_images' => 'Загрузка изображений с высоким уровнем безопасности',
     'app_secure_images_toggle' => 'Включить загрузку изображений с высоким уровнем безопасности',
     'app_secure_images_desc' => 'Для высокой производительности все изображения являются общедоступными. Этот параметр добавляет случайную строку перед URL изображения. Убедитесь, что индексация каталогов отключена, для предотвращения легкого доступа.',
-    'app_editor' => 'Редактор страницы',
+    'app_editor' => 'Редактор страниц',
     'app_editor_desc' => 'Выберите, какой редактор будет использоваться всеми пользователями для редактирования страниц.',
     'app_custom_html' => 'Пользовательский контент заголовка HTML',
     'app_custom_html_desc' => 'Любой контент, добавленный здесь, будет вставлен в нижнюю часть раздела <head> каждой страницы. Это удобно для переопределения стилей или добавления кода аналитики.',
     'app_custom_html_disabled_notice' => 'Пользовательский контент заголовка HTML отключен на этой странице, чтобы гарантировать отмену любых критических изменений',
-    'app_logo' => 'Лого приложения',
+    'app_logo' => 'Логотип приложения',
     'app_logo_desc' => 'Это изображение должно быть 43px в высоту. <br>Большое изображение будет уменьшено.',
     'app_primary_color' => 'Основной цвет приложения',
     'app_primary_color_desc' => 'Значение должно быть указано в hex-формате. <br>Оставьте пустым чтобы использовать цвет по умолчанию.',
     'app_homepage' => 'Стартовая страница приложения',
     'app_homepage_desc' => 'Выберите страницу, которая будет отображаться на главной странице вместо стандартной. Права на страницы игнорируются для выбранных страниц.',
     'app_homepage_select' => 'Выберите страницу',
-    'app_disable_comments' => 'Ð\9eÑ\82клÑ\8eÑ\87ение ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82ов',
+    'app_disable_comments' => 'Ð\9eÑ\82клÑ\8eÑ\87ение ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иев',
     'app_disable_comments_toggle' => 'Отключить комментарии',
-    'app_disable_comments_desc' => 'Ð\9eÑ\82клÑ\8eÑ\87ение ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82ов Ð½Ð° Ð²Ñ\81еÑ\85 Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85. Ð¡Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ие ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ии Ð¾Ñ\82обÑ\80ажаÑ\82Ñ\8cÑ\81Ñ\8f Ð½Ðµ Ð±Ñ\83дÑ\83Ñ\82.',
+    'app_disable_comments_desc' => 'Ð\9eÑ\82клÑ\8eÑ\87ение ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80иев Ð½Ð° Ð²Ñ\81еÑ\85 Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85. Ð¡Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ие ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ии Ð±Ñ\83дÑ\83Ñ\82 Ñ\81кÑ\80Ñ\8bÑ\82Ñ\8b.',
 
     // Color settings
-    'content_colors' => 'Content Colors',
-    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
-    'bookshelf_color' => 'Shelf Color',
-    'book_color' => 'Book Color',
-    'chapter_color' => 'Chapter Color',
-    'page_color' => 'Page Color',
-    'page_draft_color' => 'Page Draft Color',
+    'content_colors' => 'Цвета элементов иерархии',
+    'content_colors_desc' => 'Задает цвета для всех элементов организационной иерархии страницы. Для удобства чтения рекомендуется выбирать цвета, яркость которых близка к цветам по умолчанию.',
+    'bookshelf_color' => 'Цвет полки',
+    'book_color' => 'Цвет книги',
+    'chapter_color' => 'Цвет главы',
+    'page_color' => 'Цвет страницы',
+    'page_draft_color' => 'Цвет черновика страницы',
 
     // Registration Settings
     'reg_settings' => 'Настройки регистрации',
     'reg_enable' => 'Разрешить регистрацию',
     'reg_enable_toggle' => 'Разрешить регистрацию',
-    'reg_enable_desc' => 'Если регистрация разрешена, пользователь сможет зарегистрироваться в системе самостоятельно. При регистрации назначается роль пользователя по умолчанию',
+    'reg_enable_desc' => 'Если регистрация разрешена, пользователь сможет зарегистрироваться в системе самостоятельно. При регистрации назначается роль пользователя по умолчанию.',
     'reg_default_role' => 'Роль пользователя по умолчанию после регистрации',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'Вышеуказанный параметр игнорируется, пока активна внешняя аутентификация LDAP или SAML. Учетные записи для несуществующих пользователей будут создаваться автоматически при условии успешной аутентификации на внешнем сервере.',
     'reg_email_confirmation' => 'Подтверждение электронной почты',
     'reg_email_confirmation_toggle' => 'Требовать подтверждение по электронной почте',
     'reg_confirm_email_desc' => 'При использовании ограничения по домену - подтверждение обязательно, этот пункт игнорируется.',
     'reg_confirm_restrict_domain' => 'Ограничить регистрацию по домену',
-    'reg_confirm_restrict_domain_desc' => 'Введите список доменов почты через запятую, для которых разрешена регистрация. Пользователям будет отправлено письмо для подтверждения адреса перед входом в приложение. <br> Обратите внимание, что пользователи смогут изменять свой адрес после регистрации.',
+    'reg_confirm_restrict_domain_desc' => 'Введите список доменов почты через запятую, для которых разрешена регистрация. Пользователям будет отправлено письмо для подтверждения адреса перед входом в приложение. <br> Обратите внимание, что пользователи смогут изменить свой адрес после регистрации.',
     'reg_confirm_restrict_domain_placeholder' => 'Без ограничений',
 
     // Maintenance settings
@@ -85,27 +85,27 @@ return [
     'roles' => 'Роли',
     'role_user_roles' => 'Роли пользователя',
     'role_create' => 'Добавить роль',
-    'role_create_success' => 'Роль упешно добавлена',
+    'role_create_success' => 'Роль успешно добавлена',
     'role_delete' => 'Удалить роль',
     'role_delete_confirm' => 'Это удалит роль с именем \':roleName\'.',
-    'role_delete_users_assigned' => 'Эта роль назначена :userCount пользователям. Если вы хотите перенести их из этой роли, выберите новую роль ниже.',
-    'role_delete_no_migration' => "Ð\9dе Ð¼Ð¸Ð³Ñ\80иÑ\80овать пользователей",
+    'role_delete_users_assigned' => 'Эта роль назначена :userCount пользователям. Если вы хотите перенести их, выберите новую роль ниже.',
+    'role_delete_no_migration' => "Ð\9dе Ð¿ÐµÑ\80еноÑ\81ить пользователей",
     'role_delete_sure' => 'Вы уверены что хотите удалить данную роль?',
     'role_delete_success' => 'Роль успешно удалена',
     'role_edit' => 'Редактировать роль',
     'role_details' => 'Детали роли',
-    'role_name' => 'Ð\98мÑ\8f роли',
+    'role_name' => 'Ð\9dазвание роли',
     'role_desc' => 'Краткое описание роли',
     'role_external_auth_id' => 'Внешние ID авторизации',
     'role_system' => 'Системные разрешения',
     'role_manage_users' => 'Управление пользователями',
     'role_manage_roles' => 'Управление ролями и правами на роли',
     'role_manage_entity_permissions' => 'Управление правами на все книги, главы и страницы',
-    'role_manage_own_entity_permissions' => 'Управление разрешениями для собственных книг, разделов и страниц',
+    'role_manage_own_entity_permissions' => 'Управление разрешениями для собственных книг, глав и страниц',
     'role_manage_page_templates' => 'Управление шаблонами страниц',
-    'role_access_api' => 'Access system API',
+    'role_access_api' => 'Доступ к системному API',
     'role_manage_settings' => 'Управление настройками приложения',
-    'role_asset' => 'РазÑ\80еÑ\88ение Ð´Ð»Ñ\8f Ð°ÐºÑ\82иваÑ\86ии',
+    'role_asset' => 'Ð\9fÑ\80ава Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ðº Ð¼Ð°Ñ\82еÑ\80иалам',
     'role_asset_desc' => 'Эти разрешения контролируют доступ по умолчанию к параметрам внутри системы. Разрешения на книги, главы и страницы перезапишут эти разрешения.',
     'role_asset_admins' => 'Администраторы автоматически получают доступ ко всему контенту, но эти опции могут отображать или скрывать параметры пользовательского интерфейса.',
     'role_all' => 'Все',
@@ -123,16 +123,16 @@ return [
     'users_search' => 'Поиск пользователей',
     'users_details' => 'Данные пользователя',
     'users_details_desc' => 'Укажите имя и адрес электронной почты для этого пользователя. Адрес электронной почты будет использоваться для входа в приложение.',
-    'users_details_desc_no_email' => 'Задайте имя для этого пользователя, чтобы другие могли его узнать',
+    'users_details_desc_no_email' => 'Задайте имя для этого пользователя, чтобы другие могли его узнать.',
     'users_role' => 'Роли пользователя',
     'users_role_desc' => 'Назначьте роли пользователю. Если назначено несколько ролей, разрешения будут суммироваться и пользователь получит все права назначенных ролей.',
     'users_password' => 'Пароль пользователя',
-    'users_password_desc' => 'УÑ\81Ñ\82ановиÑ\82е Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f Ð²Ñ\85ода Ð² Ð¿Ñ\80иложение. Ð\94олжно быть не менее 6 символов.',
-    'users_send_invite_text' => 'Вы можете отправить этому пользователю email с приглашением, которое позволит ему установить пароль самостоятельно или задайте пароль сами.',
+    'users_password_desc' => 'УÑ\81Ñ\82ановиÑ\82е Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f Ð²Ñ\85ода Ð² Ð¿Ñ\80иложение. Ð\94лина Ð¿Ð°Ñ\80олÑ\8f Ð´Ð¾Ð»Ð¶Ð½Ð° быть не менее 6 символов.',
+    'users_send_invite_text' => 'Вы можете отправить этому пользователю письмо с приглашением, которое позволит ему установить пароль самостоятельно или задайте пароль сами.',
     'users_send_invite_option' => 'Отправить пользователю письмо с приглашением',
     'users_external_auth_id' => 'Внешний ID аутентификации',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
-    'users_password_warning' => 'Ð\97аполниÑ\82е Ð½Ð¸Ð¶Ðµ Ñ\82олÑ\8cко ÐµÑ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ñ\81мениÑ\82Ñ\8c Ñ\81вой пароль.',
+    'users_external_auth_id_desc' => 'Этот ID используется для связи с вашей внешней системой аутентификации.',
+    'users_password_warning' => 'Ð\97аполниÑ\82е Ð¿Ð¾Ð»Ñ\8f Ð½Ð¸Ð¶Ðµ Ñ\82олÑ\8cко ÐµÑ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c пароль.',
     'users_system_public' => 'Этот пользователь представляет любых гостевых пользователей, которые посещают ваше приложение. Он не может использоваться для входа в систему и назначается автоматически.',
     'users_delete' => 'Удалить пользователя',
     'users_delete_named' => 'Удалить пользователя :userName',
@@ -146,38 +146,38 @@ return [
     'users_avatar_desc' => 'Выберите изображение. Изображение должно быть квадратным, размером около 256px.',
     'users_preferred_language' => 'Предпочитаемый язык',
     'users_preferred_language_desc' => 'Этот параметр изменит язык интерфейса приложения. Это не влияет на созданный пользователем контент.',
-    'users_social_accounts' => 'Аккаунты Соцсетей',
-    'users_social_accounts_info' => 'Здесь вы можете подключить другие учетные записи для более быстрого и легкого входа в систему. Отключение учетной записи здесь не возможно. Отмените доступ к настройкам вашего профиля в подключенном аккаунте соцсети.',
+    'users_social_accounts' => 'Аккаунты социальных сетей',
+    'users_social_accounts_info' => 'Здесь вы можете подключить другие учетные записи для более быстрого и легкого входа в систему. Отключение учетной записи здесь не возможно. Отмените доступ к настройкам вашего профиля в подключенном социальном аккаунте.',
     'users_social_connect' => 'Подключить аккаунт',
     'users_social_disconnect' => 'Отключить аккаунт',
-    'users_social_connected' => ':socialAccount аккаунт упешно подключен к вашему профилю.',
+    'users_social_connected' => ':socialAccount аккаунт успешно подключен к вашему профилю.',
     'users_social_disconnected' => ':socialAccount аккаунт успешно отключен от вашего профиля.',
-    'users_api_tokens' => 'API Tokens',
-    'users_api_tokens_none' => 'No API tokens have been created for this user',
-    'users_api_tokens_create' => 'Create Token',
-    'users_api_tokens_expires' => 'Expires',
-    'users_api_tokens_docs' => 'API Documentation',
+    'users_api_tokens' => 'API токены',
+    'users_api_tokens_none' => 'Для этого пользователя не создано API токенов',
+    'users_api_tokens_create' => 'Создать токен',
+    'users_api_tokens_expires' => 'Истекает',
+    'users_api_tokens_docs' => 'Документация',
 
     // API Tokens
-    'user_api_token_create' => 'Create API Token',
-    'user_api_token_name' => 'Name',
-    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
-    'user_api_token_expiry' => 'Expiry Date',
-    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
-    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
-    'user_api_token_create_success' => 'API token successfully created',
-    'user_api_token_update_success' => 'API token successfully updated',
-    'user_api_token' => 'API Token',
-    'user_api_token_id' => 'Token ID',
-    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
-    'user_api_token_secret' => 'Token Secret',
-    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
-    'user_api_token_created' => 'Token Created :timeAgo',
-    'user_api_token_updated' => 'Token Updated :timeAgo',
-    'user_api_token_delete' => 'Delete Token',
-    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
-    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
-    'user_api_token_delete_success' => 'API token successfully deleted',
+    'user_api_token_create' => 'Создать токен',
+    'user_api_token_name' => 'Имя',
+    'user_api_token_name_desc' => 'Присвойте вашему токену читаемое имя, в качестве напоминания о его назначении в будущем.',
+    'user_api_token_expiry' => 'Истекает',
+    'user_api_token_expiry_desc' => 'Установите дату истечения срока действия этого токена. После этой даты запросы, сделанные с использованием этого токена, больше не будут работать. Если оставить это поле пустым, срок действия истечет через 100 лет.',
+    'user_api_token_create_secret_message' => 'Сразу после создания этого токена будут сгенерированы и отображены идентификатор токена и секретный ключ. Секретный ключ будет показан только один раз, поэтому перед продолжением обязательно скопируйте значение в безопасное и надежное место.',
+    'user_api_token_create_success' => 'API токен успешно создан',
+    'user_api_token_update_success' => 'API токен успешно обновлен',
+    'user_api_token' => 'API токен',
+    'user_api_token_id' => 'Идентификатор токена',
+    'user_api_token_id_desc' => 'Это нередактируемый системный идентификатор для этого токена, который необходимо указывать в запросах API.',
+    'user_api_token_secret' => 'Секретный ключ',
+    'user_api_token_secret_desc' => 'Это сгенерированный системой секретный ключ для этого токена, который необходимо будет указывать в запросах API. Он будет показан только один раз, поэтому скопируйте это значение в безопасное и надежное место.',
+    'user_api_token_created' => 'Токен создан :timeAgo',
+    'user_api_token_updated' => 'Токен обновлён :timeAgo',
+    'user_api_token_delete' => 'Удалить токен',
+    'user_api_token_delete_warning' => 'Это полностью удалит API токен с именем \':tokenName\' из системы.',
+    'user_api_token_delete_confirm' => 'Вы уверены, что хотите удалить этот API токен?',
+    'user_api_token_delete_success' => 'API токен успешно удален',
 
     //! If editing translations files directly please ignore this in all
     //! languages apart from en. Content will be auto-copied from en.
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 80cd89fd5f8c5feddad658fd1f25787ffd4749bd..e5e9d1eec22cfdeba75674adedb76c5fab0cfc34 100644 (file)
@@ -19,8 +19,8 @@ return [
     'between'              => [
         'numeric' => ':attribute должен быть между :min и :max.',
         'file'    => ':attribute должен быть между :min и :max килобайт.',
-        'string'  => 'длина :attribute Ð´Ð¾Ð»Ð¶ÐµÐ½Ð° Ð±Ñ\8bÑ\82Ñ\8c Ð¼ÐµÐ¶Ð´Ñ\83 :min Ð¸ :max Ñ\81имволами.',
-        'array'   => ':attribute должен содержать не менее :min и не более:max элементов.',
+        'string'  => 'длина :attribute должна быть между :min и :max символами.',
+        'array'   => ':attribute должен содержать не менее :min и не более :max элементов.',
     ],
     'boolean'              => ':attribute поле может быть только true или false.',
     'confirmed'            => ':attribute подтверждение не совпадает.',
@@ -30,19 +30,19 @@ return [
     'digits'               => ':attribute должен состоять из :digits цифр.',
     'digits_between'       => ':attribute должен иметь от :min до :max цифр.',
     'email'                => ':attribute должен быть корректным email адресом.',
-    'ends_with' => 'The :attribute must end with one of the following: :values',
+    'ends_with' => ':attribute должен заканчиваться одним из следующих: :values',
     'filled'               => ':attribute поле необходимо.',
     'gt'                   => [
-        'numeric' => 'The :attribute must be greater than :value.',
-        'file'    => 'The :attribute must be greater than :value kilobytes.',
-        'string'  => 'The :attribute must be greater than :value characters.',
-        'array'   => 'The :attribute must have more than :value items.',
+        'numeric' => 'Значение :attribute должно быть больше чем :value.',
+        'file'    => 'Значение :attribute должно быть больше :value килобайт.',
+        'string'  => 'Значение :attribute должно быть больше :value символов.',
+        'array'   => 'Значение :attribute должно содержать больше :value элементов.',
     ],
     'gte'                  => [
-        'numeric' => 'The :attribute must be greater than or equal :value.',
-        'file'    => 'The :attribute must be greater than or equal :value kilobytes.',
-        'string'  => 'The :attribute must be greater than or equal :value characters.',
-        'array'   => 'The :attribute must have :value items or more.',
+        'numeric' => 'Значение :attribute должно быть больше или равно :value.',
+        'file'    => 'Значение :attribute должно быть больше или равно :value килобайт.',
+        'string'  => 'Значение :attribute должно быть больше или равно :value символам.',
+        'array'   => ':attribute должен иметь :value элементов или больше.',
     ],
     'exists'               => 'выделенный :attribute некорректен.',
     'image'                => ':attribute должен быть изображением.',
@@ -50,20 +50,20 @@ return [
     'in'                   => 'выделенный :attribute некорректен.',
     'integer'              => ':attribute должно быть целое число.',
     'ip'                   => ':attribute должен быть корректным IP адресом.',
-    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
-    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
-    'json'                 => 'The :attribute must be a valid JSON string.',
+    'ipv4'                 => ':attribute должен быть корректным IPv4-адресом.',
+    'ipv6'                 => ':attribute должен быть корректным IPv6-адресом.',
+    'json'                 => ':attribute должен быть допустимой строкой JSON.',
     'lt'                   => [
-        'numeric' => 'The :attribute must be less than :value.',
-        'file'    => 'The :attribute must be less than :value kilobytes.',
-        'string'  => 'The :attribute must be less than :value characters.',
-        'array'   => 'The :attribute must have less than :value items.',
+        'numeric' => 'Значение :attribute должно быть меньше, чем :value.',
+        'file'    => 'Значение :attribute должно быть меньше :value килобайт.',
+        'string'  => 'Значение :attribute должно быть меньше :value символов.',
+        'array'   => 'Значение :attribute должно быть меньше :value элементов.',
     ],
     'lte'                  => [
-        'numeric' => 'The :attribute must be less than or equal :value.',
-        'file'    => 'The :attribute must be less than or equal :value kilobytes.',
-        'string'  => 'The :attribute must be less than or equal :value characters.',
-        'array'   => 'The :attribute must not have more than :value items.',
+        'numeric' => 'Значение :attribute должно быть меньше или равно :value.',
+        'file'    => 'Значение :attribute должно быть меньше или равно :value килобайт.',
+        'string'  => 'Значение :attribute должно быть меньше или равно :value символам.',
+        'array'   => 'Поле :attribute не должно содержать больше :value элементов.',
     ],
     'max'                  => [
         'numeric' => ':attribute не может быть больше чем :max.',
@@ -73,16 +73,16 @@ return [
     ],
     'mimes'                => ':attribute должен быть файлом с типом: :values.',
     'min'                  => [
-        'numeric' => ':attribute должен быть хотя бы :min.',
+        'numeric' => 'Поле :attribute должно быть не менее :min.',
         'file'    => ':attribute должен быть минимум :min килобайт.',
         'string'  => ':attribute должен быть минимум :min символов.',
         'array'   => ':attribute должен содержать хотя бы :min элементов.',
     ],
     'no_double_extension'  => ':attribute должен иметь только одно расширение файла.',
     'not_in'               => 'Выбранный :attribute некорректен.',
-    'not_regex'            => 'The :attribute format is invalid.',
+    'not_regex'            => 'Формат :attribute некорректен.',
     'numeric'              => ':attribute должен быть числом.',
-    'regex'                => ':attribute неправильный формат.',
+    'regex'                => 'Формат :attribute некорректен.',
     'required'             => ':attribute обязательное поле.',
     'required_if'          => ':attribute обязательное поле когда :other со значением :value.',
     'required_with'        => ':attribute обязательное поле когда :values установлено.',
@@ -99,7 +99,7 @@ return [
     'string'               => ':attribute должен быть строкой.',
     'timezone'             => ':attribute должен быть корректным часовым поясом.',
     'unique'               => ':attribute уже есть.',
-    'url'                  => ':attribute имеет неправильный формат.',
+    'url'                  => 'Формат :attribute некорректен.',
     'uploaded'             => 'Не удалось загрузить файл. Сервер не может принимать файлы такого размера.',
 
     // Custom validation lines
index ef6474b4d33c884dfac258d9d57c4bac16e47549..3b52a667c3675c29c8536612364c63e19701aa95 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Stránka nenájdená',
     'sorry_page_not_found' => 'Prepáčte, stránka ktorú hľadáte nebola nájdená.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Vrátiť sa domov',
     'error_occurred' => 'Nastala chyba',
     'app_down' => ':appName je momentálne nedostupná',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index f4e67f2ffb520b2f9b196159cdf5b207ca7661c8..ce682189030d45d33868734daf5eaaf9dd5cd88a 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
diff --git a/resources/lang/sl/activities.php b/resources/lang/sl/activities.php
new file mode 100644 (file)
index 0000000..01057f7
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Activity text strings.
+ * Is used for all the text within activity logs & notifications.
+ */
+return [
+
+    // Pages
+    'page_create'                 => 'ustvarjena stran',
+    'page_create_notification'    => 'Zapis uspešno ustvarjen',
+    'page_update'                 => 'nadgrajena stran',
+    'page_update_notification'    => 'Uspešno posodobljeno',
+    'page_delete'                 => 'izbrisana stran',
+    'page_delete_notification'    => 'Uspešno izbrisano',
+    'page_restore'                => 'obnovljena stran',
+    'page_restore_notification'   => 'Uspešna obnovitev',
+    'page_move'                   => 'premaknjena stran',
+
+    // Chapters
+    'chapter_create'              => 'ustvarjeno poglavje',
+    'chapter_create_notification' => 'Zapis uspešno ustvarjen',
+    'chapter_update'              => 'nadgradi poglavje',
+    'chapter_update_notification' => 'Uspešno posodobljeno',
+    'chapter_delete'              => 'izbrisano poglavje',
+    'chapter_delete_notification' => 'Uspešno izbrisano',
+    'chapter_move'                => 'premaknjeno poglavje',
+
+    // Books
+    'book_create'                 => 'knjiga ustvarjena',
+    'book_create_notification'    => 'Knjiga Uspešno Usvarjena',
+    'book_update'                 => 'knjiga posodobljena',
+    'book_update_notification'    => 'Uspešno posodobljeno',
+    'book_delete'                 => 'izbrisana knjiga',
+    'book_delete_notification'    => 'Uspešno izbrisano',
+    'book_sort'                   => 'razvrščena knjiga',
+    'book_sort_notification'      => 'Knjiga Uspešno Razvrščena',
+
+    // Bookshelves
+    'bookshelf_create'            => 'knjižna polica izdelana',
+    'bookshelf_create_notification'    => 'Knjižna Polica Izdelana',
+    'bookshelf_update'                 => 'knjižna polica posodobljena',
+    'bookshelf_update_notification'    => 'Knjižna Polica Uspešno Posodobljena',
+    'bookshelf_delete'                 => 'knjižna polica izbrisana',
+    'bookshelf_delete_notification'    => 'Knjižna Polica Uspešno Izbrisana',
+
+    // Other
+    'commented_on'                => 'komentar na',
+];
diff --git a/resources/lang/sl/auth.php b/resources/lang/sl/auth.php
new file mode 100644 (file)
index 0000000..171baa3
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Authentication Language Lines
+ * The following language lines are used during authentication for various
+ * messages that we need to display to the user.
+ */
+return [
+
+    'failed' => 'Poverilnice se ne ujemajo s podatki v naši bazi.',
+    'throttle' => 'Prekoračili ste število možnih prijav. Poskusite znova čez :seconds sekund.',
+
+    // Login & Register
+    'sign_up' => 'Registracija',
+    'log_in' => 'Prijavi se',
+    'log_in_with' => 'Prijavi se z :socialDriver',
+    'sign_up_with' => 'Registriraj se z :socialDriver',
+    'logout' => 'Odjavi se',
+
+    'name' => 'Ime',
+    'username' => 'Uporabniško ime',
+    'email' => 'E-pošta',
+    'password' => 'Geslo',
+    'password_confirm' => 'Potrdi geslo',
+    'password_hint' => 'Mora vebovati vsaj 8 znakov',
+    'forgot_password' => 'Pozabljeno geslo?',
+    'remember_me' => 'Zapomni si me',
+    'ldap_email_hint' => 'Prosimo vpišite e-poštni naslov za ta račun.',
+    'create_account' => 'Ustvari račun',
+    'already_have_account' => 'Že imate račun?',
+    'dont_have_account' => 'Nimate računa?',
+    'social_login' => 'Prijava z računi družbenih omrežij',
+    'social_registration' => 'Registracija z družbenim omrežjem',
+    'social_registration_text' => 'Registrirajte in prijavite se za uporabo drugih možnosti.',
+
+    'register_thanks' => 'Hvala za registracijo!',
+    'register_confirm' => 'Prosimo preverite vaš e-poštni predal in kliknite na potrditveni gumb za dostop :appName.',
+    'registrations_disabled' => 'Registracija trenutno ni mogoča',
+    'registration_email_domain_invalid' => 'Ta e-poštna domena nima dostopa do te aplikacije',
+    'register_success' => 'Hvala za registracijo! Sedaj ste registrirani in prijavljeni.',
+
+
+    // Password Reset
+    'reset_password' => 'Ponastavi geslo',
+    'reset_password_send_instructions' => 'Spodaj vpišite vaš e-poštni naslov in prejeli boste e-pošto s povezavo za ponastavitev gesla.',
+    'reset_password_send_button' => 'Pošlji povezavo za ponastavitev',
+    'reset_password_sent_success' => 'Povezava za ponastavitev gesla je bila poslana na :email.',
+    'reset_password_success' => 'Vaše geslo je bilo uspešno spremenjeno.',
+    'email_reset_subject' => 'Ponastavi svoje :appName geslo',
+    'email_reset_text' => 'To e-poštno sporočilo ste prejeli, ker smo prejeli zahtevo za ponastavitev gesla za vaš račun.',
+    'email_reset_not_requested' => 'Če niste zahtevali ponastavitve gesla, vam ni potrebno ničesar storiti.',
+
+
+    // Email Confirmation
+    'email_confirm_subject' => 'Potrdi svojo e-pošto za :appName',
+    'email_confirm_greeting' => 'Hvala ker ste se pridružili :appName!',
+    'email_confirm_text' => 'Potrdite svoj e-naslov s klikom spodnjega gumba:',
+    'email_confirm_action' => 'Potrdi e-pošto',
+    'email_confirm_send_error' => 'E-poštna potrditev je zahtevana ampak sistem ni mogel poslati e-pošte. Kontaktirajte administratorja, da zagotovite, da je e-pošta pravilno nastavljena.',
+    'email_confirm_success' => 'Vaš e-naslov je bil potrjen!',
+    'email_confirm_resent' => 'Poslali smo vam potrditveno sporočilo. Prosimo preverite svojo elektronsko pošto.',
+
+    'email_not_confirmed' => 'Elektronski naslov ni potrjen',
+    'email_not_confirmed_text' => 'Vaš e-naslov še ni bil potrjen.',
+    'email_not_confirmed_click_link' => 'Prosimo kliknite na link v e-poštnem sporočilu, ki ste ga prejeli kmalu po registraciji.',
+    'email_not_confirmed_resend' => 'Če ne najdete e-pošte jo lahko ponovno pošljete s potrditvijo obrazca.',
+    'email_not_confirmed_resend_button' => 'Ponovno pošlji potrditveno e-pošto',
+
+    // User Invite
+    'user_invite_email_subject' => 'Povabljen si bil da se pridružiš :appName!',
+    'user_invite_email_greeting' => 'Račun je bil ustvarjen zate na :appName.',
+    'user_invite_email_text' => 'Klikni na spodnji gumb, da si nastaviš geslo in dobiš dostop:',
+    'user_invite_email_action' => 'Nastavi geslo za račun',
+    'user_invite_page_welcome' => 'Dobrodošli na :appName!',
+    'user_invite_page_text' => 'Za zaključiti in pridobiti dostop si morate nastaviti geslo, ki bo uporabljeno za prijavo v :appName.',
+    'user_invite_page_confirm_button' => 'Potrdi geslo',
+    'user_invite_success' => 'Geslo nastavljeno, sedaj imaš dostop do :appName!'
+];
\ No newline at end of file
diff --git a/resources/lang/sl/common.php b/resources/lang/sl/common.php
new file mode 100644 (file)
index 0000000..6508509
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Common elements found throughout many areas of BookStack.
+ */
+return [
+
+    // Buttons
+    'cancel' => 'Prekliči',
+    'confirm' => 'Potrdi',
+    'back' => 'Nazaj',
+    'save' => 'Shrani',
+    'continue' => 'Naprej',
+    'select' => 'Izberi',
+    'toggle_all' => 'Vklopi vse',
+    'more' => 'Več',
+
+    // Form Labels
+    'name' => 'Ime',
+    'description' => 'Opis',
+    'role' => 'Vloga',
+    'cover_image' => 'Naslovna slika',
+    'cover_image_description' => 'Slika naj bo okoli 440x250px velika.',
+    
+    // Actions
+    'actions' => 'Dejanja',
+    'view' => 'Pogled',
+    'view_all' => 'Prikaži vse',
+    'create' => 'Ustvari',
+    'update' => 'Posodobi',
+    'edit' => 'Uredi',
+    'sort' => 'Razvrsti',
+    'move' => 'Premakni',
+    'copy' => 'Kopiraj',
+    'reply' => 'Odgovori',
+    'delete' => 'Izbriši',
+    'search' => 'Išči',
+    'search_clear' => 'Počisti iskanje',
+    'reset' => 'Ponastavi',
+    'remove' => 'Remove',
+    'add' => 'Dodaj',
+    'fullscreen' => 'Celozaslonski način',
+
+    // Sort Options
+    'sort_options' => 'Možnosti razvrščanja',
+    'sort_direction_toggle' => 'Preklopi smer razvrščanja',
+    'sort_ascending' => 'Razvrsti naraščajoče',
+    'sort_descending' => 'Razvrsti padajoče',
+    'sort_name' => 'Ime',
+    'sort_created_at' => 'Datum nastanka',
+    'sort_updated_at' => 'Datum posodobitve',
+
+    // Misc
+    'deleted_user' => 'Izbrisan uporabnik',
+    'no_activity' => 'Ni aktivnosti za prikaz',
+    'no_items' => 'Ni na voljo nobenih elementov',
+    'back_to_top' => 'Nazaj na vrh',
+    'toggle_details' => 'Preklopi podrobnosti',
+    'toggle_thumbnails' => 'Preklopi sličice',
+    'details' => 'Podrobnosti',
+    'grid_view' => 'Mrežni pogled',
+    'list_view' => 'Seznam',
+    'default' => 'Privzeto',
+    'breadcrumb' => 'Pot',
+
+    // Header
+    'profile_menu' => 'Meni profila',
+    'view_profile' => 'Ogled profila',
+    'edit_profile' => 'Uredi profil',
+
+    // Layout tabs
+    'tab_info' => 'Informacije',
+    'tab_content' => 'Vsebina',
+
+    // Email Content
+    'email_action_help' => 'Če imate težave s klikom na ":actionText" gumb, kopirajte im prilepite spodnjo povezavo v vaš brskalnik:',
+    'email_rights' => 'Vse pravice pridržane',
+];
diff --git a/resources/lang/sl/components.php b/resources/lang/sl/components.php
new file mode 100644 (file)
index 0000000..42e87be
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'Izberi slike',
+    'image_all' => 'Vse',
+    'image_all_title' => 'Prikaži vse slike',
+    'image_book_title' => 'Preglej slike naložene v to knjigo',
+    'image_page_title' => 'Preglej slike naložene na to stran',
+    'image_search_hint' => 'Iskanje po nazivu slike',
+    'image_uploaded' => 'Naloženo :uploadedDate',
+    'image_load_more' => 'Naloži več',
+    'image_image_name' => 'Ime slike',
+    'image_delete_used' => 'Ta slika je uporabljena na spodnjih straneh.',
+    'image_delete_confirm' => 'Ponovno kliknite izbriši, da potrdite izbris te slike.',
+    'image_select_image' => 'Izberite sliko',
+    'image_dropzone' => 'Povlecite slike ali kliknite tukaj za nalaganje',
+    'images_deleted' => 'Slike so bile izbrisane',
+    'image_preview' => 'Predogled slike',
+    'image_upload_success' => 'Slika uspešno naložena',
+    'image_update_success' => 'Podatki slike uspešno posodobljeni',
+    'image_delete_success' => 'Uspešno izbrisano',
+    'image_upload_remove' => 'Odstrani',
+
+    // Code Editor
+    'code_editor' => 'Uredi kodo',
+    'code_language' => 'Koda jezika',
+    'code_content' => 'Koda vsebine',
+    'code_save' => 'Shrani kodo',
+];
diff --git a/resources/lang/sl/entities.php b/resources/lang/sl/entities.php
new file mode 100644 (file)
index 0000000..ff13821
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'Nazadnje objavljeno',
+    'recently_created_pages' => 'Nazadnje objavljene strani',
+    'recently_updated_pages' => 'Nedavno posodobljene strani',
+    'recently_created_chapters' => 'Nazadnje objavljena poglavja',
+    'recently_created_books' => 'Nazadnje objavljene knjige',
+    'recently_created_shelves' => 'Nazadnje objavljene police',
+    'recently_update' => 'Nedavno posodobljeno',
+    'recently_viewed' => 'Nedavno prikazano',
+    'recent_activity' => 'Nedavna dejavnost',
+    'create_now' => 'Ustvarite eno sedaj',
+    'revisions' => 'Revizije',
+    'meta_revision' => 'Revizije #:revisionCount',
+    'meta_created' => 'Ustvarjeno :timeLength',
+    'meta_created_name' => 'Created :timeLength by :user',
+    'meta_updated' => 'Posodobljeno :timeLength',
+    'meta_updated_name' => 'Posodobljeno :timeLength by :user',
+    'entity_select' => 'Izbira entitete',
+    'images' => 'Slike',
+    'my_recent_drafts' => 'Moji nedavni osnutki',
+    'my_recently_viewed' => 'Nedavno prikazano',
+    'no_pages_viewed' => 'Niste si ogledali še nobene strani',
+    'no_pages_recently_created' => 'Nedavno ni bila ustvarjena nobena stran',
+    'no_pages_recently_updated' => 'Nedavno ni bila posodobljena nobena stran',
+    'export' => 'Izvozi',
+    'export_html' => 'Vsebuje spletno datoteko',
+    'export_pdf' => 'Datoteka PDF',
+    'export_text' => 'Navadna besedilna datoteka',
+
+    // Permissions and restrictions
+    'permissions' => 'Dovoljenja',
+    'permissions_intro' => 'Ko so enkrat omogočena, bodo ta dovoljenja imela prednost pred dovoljenji za določanje vlog.',
+    'permissions_enable' => 'Omogoči dovoljenja po meri',
+    'permissions_save' => 'Shrani dovoljenja',
+
+    // Search
+    'search_results' => 'Rezultati iskanja',
+    'search_total_results_found' => ':count najdenih rezultatov|:count skupaj najdenih rezultatov',
+    'search_clear' => 'Počisti iskanje',
+    'search_no_pages' => 'Nobena stran se ne ujema z vašim iskanjem',
+    'search_for_term' => 'Išči :term',
+    'search_more' => 'Prikaži več rezultatov',
+    'search_filters' => 'Iskalni filtri',
+    'search_content_type' => 'Vrsta vsebine',
+    'search_exact_matches' => 'Natančno ujemanje',
+    'search_tags' => 'Iskanje oznak',
+    'search_options' => 'Možnosti',
+    'search_viewed_by_me' => 'Ogledano',
+    'search_not_viewed_by_me' => 'Neogledano',
+    'search_permissions_set' => 'Nastavljena dovoljenja',
+    'search_created_by_me' => 'Ustvaril sem jaz',
+    'search_updated_by_me' => 'Posodobil sem jaz',
+    'search_date_options' => 'Možnosti datuma',
+    'search_updated_before' => 'Posodobljeno pred',
+    'search_updated_after' => 'Posodobljeno po',
+    'search_created_before' => 'Ustvarjeno pred',
+    'search_created_after' => 'Ustvarjeno po',
+    'search_set_date' => 'Nastavi datum',
+    'search_update' => 'Posodobi iskanje',
+
+    // Shelves
+    'shelf' => 'Polica',
+    'shelves' => 'Police',
+    'x_shelves' => ':count Polica|:count Police',
+    'shelves_long' => 'Knjižne police',
+    'shelves_empty' => 'Ustvarjena ni bila nobena polica',
+    'shelves_create' => 'Izdelaj novo polico',
+    'shelves_popular' => 'Priljubljene police',
+    'shelves_new' => 'Nove police',
+    'shelves_new_action' => 'Nova polica',
+    'shelves_popular_empty' => 'Najbolj priljubljene police se bodo pojavile tukaj.',
+    'shelves_new_empty' => 'Zadnje ustvarjene police se bodo pojavile tukaj.',
+    'shelves_save' => 'Shrani polico',
+    'shelves_books' => 'Knjige na tej polici',
+    'shelves_add_books' => 'Dodaj knjige na to polico',
+    'shelves_drag_books' => 'Povleci knjige sem za jih dodati na to polico',
+    'shelves_empty_contents' => 'Ta polica nima dodeljenih knjig',
+    'shelves_edit_and_assign' => 'Uredi polico za dodajanje knjig',
+    'shelves_edit_named' => 'Uredi knjižno polico :name',
+    'shelves_edit' => 'Uredi knjižno polico',
+    'shelves_delete' => 'Izbriši knjižno polico',
+    'shelves_delete_named' => 'Izbriši knjižno polico :name',
+    'shelves_delete_explain' => "To bo izbrisalo knjižno polico z imenom ':name'. Vsebovane knjige ne bodo izbrisane.",
+    'shelves_delete_confirmation' => 'Ali ste prepričani, da želite izbrisati ta knjižno polico?',
+    'shelves_permissions' => 'Dovoljenja knjižnih polic',
+    'shelves_permissions_updated' => 'Posodobljena dovoljenja knjižnih polic',
+    'shelves_permissions_active' => 'Aktivna dovoljenja knjižnih polic',
+    'shelves_copy_permissions_to_books' => 'Kopiraj dovoljenja na knjige',
+    'shelves_copy_permissions' => 'Kopiraj dovoljenja',
+    'shelves_copy_permissions_explain' => 'To bo uporabilo trenutne nastavitve dovoljenj te knjižne police za vse knjige, ki jih vsebuje. Pred aktiviranjem zagotovite, da so shranjene vse spremembe dovoljenj te knjižne police.',
+    'shelves_copy_permission_success' => 'Dovoljenja knjižne police kopirana na :count knjig',
+
+    // Books
+    'book' => 'Knjiga',
+    'books' => 'Knjige',
+    'x_books' => ':count Knjiga|:count Knjig',
+    'books_empty' => 'Ustvarjena ni bila nobena knjiga',
+    'books_popular' => 'Priljubjene knjige',
+    'books_recent' => 'Zadnje knjige',
+    'books_new' => 'Nove knjige',
+    'books_new_action' => 'Nova knjiga',
+    'books_popular_empty' => 'Najbolj priljubljene knjige se bodo pojavile tukaj.',
+    'books_new_empty' => 'Zadnje ustvarjene knjige se bodo pojavile tukaj.',
+    'books_create' => 'Izdelaj novo knjigo',
+    'books_delete' => 'Izbriši knjigo',
+    'books_delete_named' => 'Izbriši knjigo :bookName',
+    'books_delete_explain' => 'To bo izbrisalo knjigo z imenom \':bookName\'. Vse strani in poglavja bodo odstranjena.',
+    'books_delete_confirmation' => 'Ali ste prepričani, da želite izbrisati to knjigo?',
+    'books_edit' => 'Uredi knjigo',
+    'books_edit_named' => 'Uredi knjigo :bookName',
+    'books_form_book_name' => 'Ime knjige',
+    'books_save' => 'Shrani knjigo',
+    'books_permissions' => 'Dovoljenja knjige',
+    'books_permissions_updated' => 'Posodobljena dovoljenja knjige',
+    'books_empty_contents' => 'Nobena stran ali poglavje ni bilo ustvarjeno za to knjigo.',
+    'books_empty_create_page' => 'Ustvari novo stran',
+    'books_empty_sort_current_book' => 'Razvrsti trenutno knjigo',
+    'books_empty_add_chapter' => 'Dodaj poglavje',
+    'books_permissions_active' => 'Aktivna dovoljenja knjige',
+    'books_search_this' => 'Išči to knjigo',
+    'books_navigation' => 'Navigacija knjige',
+    'books_sort' => 'Razvrsti vsebine knjige',
+    'books_sort_named' => 'Razvrsti knjigo :bookName',
+    'books_sort_name' => 'Razvrsti po imenu',
+    'books_sort_created' => 'Razvrsti po datumu nastanka',
+    'books_sort_updated' => 'Razvrsti po datumu posodobitve',
+    'books_sort_chapters_first' => 'Najprej poglavja',
+    'books_sort_chapters_last' => 'Nazadnje poglavja',
+    'books_sort_show_other' => 'Prikaži druge knjige',
+    'books_sort_save' => 'Shrani novo naročilo',
+
+    // Chapters
+    'chapter' => 'Poglavje',
+    'chapters' => 'Poglavja',
+    'x_chapters' => ':count Poglavje|:count Poglavja',
+    'chapters_popular' => 'Priljubljena poglavja',
+    'chapters_new' => 'Novo poglavje',
+    'chapters_create' => 'Ustvari novo poglavje',
+    'chapters_delete' => 'Izbriši poglavje',
+    'chapters_delete_named' => 'Izbriši poglavje :chapterName',
+    'chapters_delete_explain' => 'To bo izbrisalo poglavje z \':chapterName\'. Vse strani bodo odstranjene in dodane neposredno v matično knjigo.',
+    'chapters_delete_confirm' => 'Si prepričan, da želiš izbrisati to poglavje?',
+    'chapters_edit' => 'Uredi poglavje',
+    'chapters_edit_named' => 'Uredi poglavje :chapterName',
+    'chapters_save' => 'Shrani poglavje',
+    'chapters_move' => 'Premakni poglavje',
+    'chapters_move_named' => 'Premakni poglavje :chapterName',
+    'chapter_move_success' => 'Poglavje premaknjeno v :bookName',
+    'chapters_permissions' => 'Dovoljenja poglavij',
+    'chapters_empty' => 'V tem poglavju trenutno ni strani.',
+    'chapters_permissions_active' => 'Aktivna dovoljenja poglavij',
+    'chapters_permissions_success' => 'Posodobljena dovoljenja poglavij',
+    'chapters_search_this' => 'Išči v tem poglavju',
+
+    // Pages
+    'page' => 'Stran',
+    'pages' => 'Strani',
+    'x_pages' => ':count Stran|:count Strani',
+    'pages_popular' => 'Priljubjene strani',
+    'pages_new' => 'Nova stran',
+    'pages_attachments' => 'Priloge',
+    'pages_navigation' => 'Navigacija po strani',
+    'pages_delete' => 'Izbriši stran',
+    'pages_delete_named' => 'Izbriši stran :pageName',
+    'pages_delete_draft_named' => 'Izbriši osnutek strani :pageName',
+    'pages_delete_draft' => 'Izbriši osnutek strani',
+    'pages_delete_success' => 'Stran izbirsana',
+    'pages_delete_draft_success' => 'Osnutek strani izbrisan',
+    'pages_delete_confirm' => 'Ste prepričani, da želite izbrisati to stran?',
+    'pages_delete_draft_confirm' => 'Ali ste prepričani, da želite izbrisati ta osnutek?',
+    'pages_editing_named' => 'Urejanje strani :pageName',
+    'pages_edit_draft_options' => 'Možnosti osnutka',
+    'pages_edit_save_draft' => 'Shrani osnutek',
+    'pages_edit_draft' => 'Uredi osnutek strani',
+    'pages_editing_draft' => 'Urejanje osnutka',
+    'pages_editing_page' => 'Urejanje strani',
+    'pages_edit_draft_save_at' => 'Osnutek shranjen ob ',
+    'pages_edit_delete_draft' => 'Izbriši osnutek',
+    'pages_edit_discard_draft' => 'Zavrzi osnutek',
+    'pages_edit_set_changelog' => 'Nastavi zgodovino sprememb',
+    'pages_edit_enter_changelog_desc' => 'Vnesite kratek opis sprememb, ki ste jih naredili',
+    'pages_edit_enter_changelog' => 'Vnesite zgodovino sprememb',
+    'pages_save' => 'Shrani stran',
+    'pages_title' => 'Naslov strani',
+    'pages_name' => 'Ime strani',
+    'pages_md_editor' => 'Urejevalnik',
+    'pages_md_preview' => 'Predogled',
+    'pages_md_insert_image' => 'Vstavi sliko',
+    'pages_md_insert_link' => 'Vnesi povezavo entitete',
+    'pages_md_insert_drawing' => 'Vstavi risbo',
+    'pages_not_in_chapter' => 'Stran ni v poglavju',
+    'pages_move' => 'Premakni stran',
+    'pages_move_success' => 'Stran premaknjena v ":parentName"',
+    'pages_copy' => 'Kopiraj stran',
+    'pages_copy_desination' => 'Destinacija kopije',
+    'pages_copy_success' => 'Stran uspešno kopirana',
+    'pages_permissions' => 'Dovoljenja strani',
+    'pages_permissions_success' => 'Posodobljena dovoljenja strani',
+    'pages_revision' => 'Revizija',
+    'pages_revisions' => 'Pregled strani',
+    'pages_revisions_named' => 'Pregledi strani za :pageName',
+    'pages_revision_named' => 'Pregled strani za :pageName',
+    'pages_revisions_created_by' => 'Ustvaril',
+    'pages_revisions_date' => 'Datum revizije',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'Revizija #:id',
+    'pages_revisions_numbered_changes' => 'Revizija #:id Changes',
+    'pages_revisions_changelog' => 'Dnevnik sprememb',
+    'pages_revisions_changes' => 'Spremembe',
+    'pages_revisions_current' => 'Trenutna različica',
+    'pages_revisions_preview' => 'Predogled',
+    'pages_revisions_restore' => 'Obnovi',
+    'pages_revisions_none' => 'Ta stran nima revizije',
+    'pages_copy_link' => 'Kopiraj povezavo',
+    'pages_edit_content_link' => 'Uredi vsebino',
+    'pages_permissions_active' => 'Aktivna dovoljenja strani',
+    'pages_initial_revision' => 'Prvotno objavljeno',
+    'pages_initial_name' => 'Nova stran',
+    'pages_editing_draft_notification' => 'Trenutno urejate osnutek ku je bil nazadnje shranjen :timeDiff.',
+    'pages_draft_edited_notification' => 'Ta stran je od takrat posodobljena. Priporočamo, da zavržete ta osnutek.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count uporabnikov je začelo urejati to stran',
+        'start_b' => ':userName je začel urejati to stran',
+        'time_a' => 'od kar je bila stran nazandnje posodobljena',
+        'time_b' => 'v zadnjih :minCount minutah',
+        'message' => ':start :time. Pazite, da ne boste prepisali posodobitev drug drugega!',
+    ],
+    'pages_draft_discarded' => 'Osnutek zavržen, urejevalnik je bil posodobljen s trenutno vsebino strani',
+    'pages_specific' => 'Določena stran',
+    'pages_is_template' => 'Predloga strani',
+
+    // Editor Sidebar
+    'page_tags' => 'Oznake strani',
+    'chapter_tags' => 'Oznake poglavja',
+    'book_tags' => 'Oznake knjige',
+    'shelf_tags' => 'Oznake police',
+    'tag' => 'Oznaka',
+    'tags' =>  'Oznake',
+    'tag_name' =>  'Ime oznake',
+    'tag_value' => 'Vrednost oznake (opcijsko)',
+    'tags_explain' => "Dodajte nekaj oznak za boljšo kategorizacijo vaše vsebine.\nDodelite lahko vrednost oznake za boljšo poglobljeno organizacijo.",
+    'tags_add' => 'Dodaj drugo oznako',
+    'tags_remove' => 'Odstrani to oznako',
+    'attachments' => 'Priloge',
+    'attachments_explain' => 'Naložite nekaj datotek ali pripnite nekaj povezav, da bo prikazano na vaši strani. Te so vidne v stranski vrstici strani.',
+    'attachments_explain_instant_save' => 'Spremembe tukaj so takoj shranjene.',
+    'attachments_items' => 'Priloženi element',
+    'attachments_upload' => 'Naloži datoteko',
+    'attachments_link' => 'Pripni povezavo',
+    'attachments_set_link' => 'Nastavi povezavo',
+    'attachments_delete_confirm' => 'Ponovno kliknite izbriši, da potrdite izbris te priloge.',
+    'attachments_dropzone' => 'Spustite datoteke ali kliknite tukaj, če želite priložiti datoteko',
+    'attachments_no_files' => 'Nobena datoteka ni bila naložena',
+    'attachments_explain_link' => 'Lahko pripnete povezavo, če ne želite naložiti datoteke. Lahko je povezava na drugo stran ali povezava do dateteke v oblaku.',
+    'attachments_link_name' => 'Ime povezave',
+    'attachment_link' => 'Povezava priponke',
+    'attachments_link_url' => 'Povezava do datoteke',
+    'attachments_link_url_hint' => 'Url mesta ali datoteke',
+    'attach' => 'Pripni',
+    'attachments_edit_file' => 'Uredi datoteko',
+    'attachments_edit_file_name' => 'Ime datoteke',
+    'attachments_edit_drop_upload' => 'Spustite datoteke ali kliknite tukaj, če želite naložiti in prepisati',
+    'attachments_order_updated' => 'Priloga posodobljena',
+    'attachments_updated_success' => 'Podrobnosti priloge posodobljene',
+    'attachments_deleted' => 'Priloga izbirsana',
+    'attachments_file_uploaded' => 'Datoteka uspešno naložena',
+    'attachments_file_updated' => 'Datoteka uspešno posodobljena',
+    'attachments_link_attached' => 'Povezava uspešno dodana na stran',
+    'templates' => 'Predloge',
+    'templates_set_as_template' => 'Stran je predloga',
+    'templates_explain_set_as_template' => 'To stran lahko nastavite kot predlogo tako bo njena vsebina uporabljena pri izdelavi drugih strani. Ostali uporabniki bodo lahko uporabljali to predlogo, če imajo dovoljenja za to stran.',
+    'templates_replace_content' => 'Zamenjaj vsebino strani',
+    'templates_append_content' => 'Dodajte vsebini strani',
+    'templates_prepend_content' => 'Dodaj k vsebini strani',
+
+    // Profile View
+    'profile_user_for_x' => 'Uporabnik že :time',
+    'profile_created_content' => 'Ustvarjena vsebina',
+    'profile_not_created_pages' => ':userName ni izdelal nobene strani',
+    'profile_not_created_chapters' => ':userName ni izdelal nobenega poglavja',
+    'profile_not_created_books' => ':userName ni izdelal nobene knjige',
+    'profile_not_created_shelves' => ':userName ni izdelal nobene knjižne police',
+
+    // Comments
+    'comment' => 'Komentar',
+    'comments' => 'Komentarji',
+    'comment_add' => 'Dodaj komentar',
+    'comment_placeholder' => 'Dodaj komentar',
+    'comment_count' => '{0} Ni komentarjev|{1} 1 Komentar|[2,*] :count Komentarji',
+    'comment_save' => 'Shrani komentar',
+    'comment_saving' => 'Shranjujem komentar...',
+    'comment_deleting' => 'Brišem komentar...',
+    'comment_new' => 'Nov kometar',
+    'comment_created' => 'komentirano :createDiff',
+    'comment_updated' => 'Posodobljeno :updateDiff od :username',
+    'comment_deleted_success' => 'Komentar je izbrisan',
+    'comment_created_success' => 'Komentar dodan',
+    'comment_updated_success' => 'Komentar posodobljen',
+    'comment_delete_confirm' => 'Ste prepričani, da želite izbrisati ta komentar?',
+    'comment_in_reply_to' => 'Odgovor na :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'Ali ste prepričani, da želite izbrisati to revizijo?',
+    'revision_restore_confirm' => 'Ali ste prepričani da želite obnoviti to revizijo? Vsebina trenutne strani bo zamenjana.',
+    'revision_delete_success' => 'Revizija izbrisana',
+    'revision_cannot_delete_latest' => 'Ne morem izbrisati zadnje revizije.'
+];
\ No newline at end of file
diff --git a/resources/lang/sl/errors.php b/resources/lang/sl/errors.php
new file mode 100644 (file)
index 0000000..bf1564e
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Text shown in error messaging.
+ */
+return [
+
+    // Permissions
+    'permission' => 'Nimate pravic za dostop do želene strani.',
+    'permissionJson' => 'Nimate dovoljenja za izvedbo zahtevanega dejanja.',
+
+    // Auth
+    'error_user_exists_different_creds' => 'Uporabnik z e-pošto :email že obstaja, vendar z drugačnimi poverilnicami.',
+    'email_already_confirmed' => 'E-naslov je že bil potrjen, poskusite se prijaviti.',
+    'email_confirmation_invalid' => 'Ta potrditveni žeton ni veljaven ali je že bil uporabljen. Poizkusite znova.',
+    'email_confirmation_expired' => 'Potrditveni žeton je pretečen. Nova potrditvena e-pošta je bila poslana.',
+    'email_confirmation_awaiting' => 'Potrebno je potrditi e-naslov',
+    'ldap_fail_anonymous' => 'Dostop do LDAP ni uspel z anonimno povezavo',
+    'ldap_fail_authed' => 'Neuspešen LDAP dostop z danimi podrobnostimi dn & gesla',
+    'ldap_extension_not_installed' => 'PHP razširitev za LDAP ni nameščen',
+    'ldap_cannot_connect' => 'Ne morem se povezati na LDAP strežnik, neuspešna začetna povezava',
+    'saml_already_logged_in' => 'Že prijavljen',
+    'saml_user_not_registered' => 'Uporabniško ime :name ni registrirano in avtomatska registracija je onemogočena',
+    'saml_no_email_address' => 'Nisem našel e-naslova za tega uporabnika v podatkih iz zunanjega sistema za preverjanje pristnosti',
+    'saml_invalid_response_id' => 'Zahteva iz zunanjega sistema za preverjanje pristnosti ni prepoznana s strani procesa zagnanega s strani te aplikacije. Pomik nazaj po prijavi je lahko povzročil te težave.',
+    'saml_fail_authed' => 'Prijava z uporabo :system ni uspela, sistem ni zagotovil uspešne avtorizacije',
+    'social_no_action_defined' => 'Akcija ni določena',
+    'social_login_bad_response' => "Napaka pri :socialAccount prijavi:\n:error",
+    'social_account_in_use' => 'Ta :socialAccount je že v uporabi. Poskusite se prijaviti z :socialAccount možnostjo.',
+    'social_account_email_in_use' => 'Ta e-naslov :email je že v uporabi. Če že imate račun lahko povežete vaš :socialAccount v vaših nastavitvah profila.',
+    'social_account_existing' => 'Ta :socialAccount je že dodan vašemu profilu.',
+    'social_account_already_used_existing' => 'Ta :socialAccount je v uporabi s strani drugega uporabnika.',
+    'social_account_not_used' => 'Ta :socialAccount ni povezan z nobenim uporabnikom. Prosimo povežite ga v vaših nastavitvah profila. ',
+    'social_account_register_instructions' => 'Če še nimate računa, se lahko registrirate z uporabo :socialAccount.',
+    'social_driver_not_found' => 'Socialni vtičnik ni najden',
+    'social_driver_not_configured' => 'Vaše nastavitve :socialAccount niso pravilo nastavljene.',
+    'invite_token_expired' => 'Ta link je pretečen. Namesto tega lahko ponastavite vaše geslo računa.',
+
+    // System
+    'path_not_writable' => 'Poti :filePath ni bilo mogoče naložiti. Prepričajte se da je zapisljiva na strežnik.',
+    'cannot_get_image_from_url' => 'Ne morem pridobiti slike z :url',
+    'cannot_create_thumbs' => 'Strežnik ne more izdelati sličice. Prosimo preverite če imate GD PHP razširitev nameščeno.',
+    'server_upload_limit' => 'Strežnik ne dovoli nalaganj take velikosti. Prosimo poskusite manjšo velikost datoteke.',
+    'uploaded'  => 'Strežnik ne dovoli nalaganj take velikosti. Prosimo poskusite manjšo velikost datoteke.',
+    'image_upload_error' => 'Prišlo je do napake med nalaganjem slike',
+    'image_upload_type_error' => 'Napačen tip (format) slike',
+    'file_upload_timeout' => 'Čas nalaganjanja datoteke je potekel.',
+
+    // Attachments
+    'attachment_page_mismatch' => 'Neskladje strani med posodobitvijo priloge',
+    'attachment_not_found' => 'Priloga ni najdena',
+
+    // Pages
+    'page_draft_autosave_fail' => 'Osnutka ni bilo mogoče shraniti. Pred shranjevanjem te strani se prepričajte, da imate internetno povezavo',
+    'page_custom_home_deletion' => 'Ne morem izbrisati strani dokler je nastavljena kot domača stran',
+
+    // Entities
+    'entity_not_found' => 'Entiteta ni najdena',
+    'bookshelf_not_found' => 'Knjižna polica ni najdena',
+    'book_not_found' => 'Knjiga ni najdena',
+    'page_not_found' => 'Stran ni najdena',
+    'chapter_not_found' => 'Poglavje ni najdeno',
+    'selected_book_not_found' => 'Izbrana knjiga ni najdena',
+    'selected_book_chapter_not_found' => 'Izbrana knjiga ali poglavje ni najdeno',
+    'guests_cannot_save_drafts' => 'Gosti ne morejo shranjevati osnutkov',
+
+    // Users
+    'users_cannot_delete_only_admin' => 'Ne morete odstraniti edinega administratorja',
+    'users_cannot_delete_guest' => 'Ne morete odstraniti uporabnika gost',
+
+    // Roles
+    'role_cannot_be_edited' => 'Te vloge mi možno urejati',
+    'role_system_cannot_be_deleted' => 'Ta vloga je sistemska in je ni možno brisati',
+    'role_registration_default_cannot_delete' => 'Te vloge ni možno brisati dokler je nastavljena kot privzeta',
+    'role_cannot_remove_only_admin' => 'Ta uporabnik je edini administrator. Dodelite vlogo administratorja drugemu uporabniku preden ga poskusite brisati.',
+
+    // Comments
+    'comment_list' => 'Napaka se je pojavila pri pridobivanju komentarjev.',
+    'cannot_add_comment_to_draft' => 'Ni mogoče dodajanje komentarjev v osnutek.',
+    'comment_add' => 'Napaka se je pojavila pri dodajanju / posodobitev komentarjev.',
+    'comment_delete' => 'Napaka se je pojavila pri brisanju komentarja.',
+    'empty_comment' => 'Praznega komentarja ne morete objaviti.',
+
+    // Error pages
+    '404_page_not_found' => 'Strani ni mogoče najti',
+    'sorry_page_not_found' => 'Oprostite, strani ki jo iščete ni mogoče najti.',
+    'sorry_page_not_found_permission_warning' => 'Če pričakujete, da ta stran obstaja, mogoče nimate pravic, da jo vidite.',
+    'return_home' => 'Vrni se domov',
+    'error_occurred' => 'Prišlo je do napake',
+    'app_down' => ':appName trenutno ni dosegljiva',
+    'back_soon' => 'Kmalu bo ponovno dosegljiva.',
+
+    // API errors
+    'api_no_authorization_found' => 'Avtorizacija ni bila najdena',
+    'api_bad_authorization_format' => 'Avtorizacija je bila najdena, vendar je v napačni obliki',
+    'api_user_token_not_found' => 'Za dano avtorizacijo ni bil najden noben ustrezen API',
+    'api_incorrect_token_secret' => 'Skrivnost, ki je bila dana za uporabljeni žeton API, je napačna',
+    'api_user_no_api_permission' => 'Lastnik API nima pravic za klicanje API',
+    'api_user_token_expired' => 'Avtorizacijski žeton je pretečen',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Napaka se je pojavila pri pošiljanju testne e-pošte:',
+
+];
diff --git a/resources/lang/sl/pagination.php b/resources/lang/sl/pagination.php
new file mode 100644 (file)
index 0000000..b7df082
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; Prejšnje',
+    'next'     => 'Naslednje &raquo;',
+
+];
diff --git a/resources/lang/sl/passwords.php b/resources/lang/sl/passwords.php
new file mode 100644 (file)
index 0000000..12e52ef
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Password Reminder Language Lines
+ * The following language lines are the default lines which match reasons
+ * that are given by the password broker for a password update attempt has failed.
+ */
+return [
+
+    'password' => 'Gesla morajo biti najmanj osem znakov in se morajo ujemati s potrditvijo.',
+    'user' => "Ne moremo najti uporabnika s tem e-poštnim naslovom.",
+    'token' => 'Žeton za ponastavitev gesla ni veljaven.',
+    'sent' => 'Poslali smo vam povezavo za ponastavitev gesla!',
+    'reset' => 'Vaše geslo je bilo ponastavljeno!',
+
+];
diff --git a/resources/lang/sl/settings.php b/resources/lang/sl/settings.php
new file mode 100644 (file)
index 0000000..09e687c
--- /dev/null
@@ -0,0 +1,217 @@
+<?php
+/**
+ * Settings text strings
+ * Contains all text strings used in the general settings sections of BookStack
+ * including users and roles.
+ */
+return [
+
+    // Common Messages
+    'settings' => 'Nastavitve',
+    'settings_save' => 'Shrani nastavitve',
+    'settings_save_success' => 'Nastavitve, shranjene',
+
+    // App Settings
+    'app_customization' => 'Prilagajanje',
+    'app_features_security' => 'Lastnosti & Varnost',
+    'app_name' => 'Ime aplikacije',
+    'app_name_desc' => 'To ime je prikazano v glavi in vsaki sistemski e-pošti.',
+    'app_name_header' => 'Prikaži ime v glavi',
+    'app_public_access' => 'Javni dostop',
+    'app_public_access_desc' => 'Če omogočite to možnost, bo obiskovalcem, ki niso prijavljeni, omogočen dostop do vsebine v BookStack.',
+    'app_public_access_desc_guest' => 'Dostop za javne obiskovalce je mogoče nadzorovati prek uporabnika "Gost".',
+    'app_public_access_toggle' => 'Dovoli javni dostop',
+    'app_public_viewing' => 'Dovoli javni pregled?',
+    'app_secure_images' => 'Nalaganje slik z večjo varnostjo',
+    'app_secure_images_toggle' => 'Omogoči nalaganje slik z večjo varnostjo',
+    'app_secure_images_desc' => 'Zaradi delovanja so vse slike javne. Ta možnost doda naključni, hard-to-guess niz pred Url-ji slike. Prepričajte se, da indeksi imenikov niso omogočeni, da preprečite enostaven dostop.',
+    'app_editor' => 'Urejevalnik strani',
+    'app_editor_desc' => 'Izberite urejevalnik, ki bodo uporabniki uporabljali za urejanje strani.',
+    'app_custom_html' => 'Po meri HTML vsebina glave',
+    'app_custom_html_desc' => 'Katerakoli vsebina dodana tukaj, bo vstavljena na dno <head> dela vsake strani. To je uporabno za uporabo prevladujočih slogov ali dodajanje analitike.',
+    'app_custom_html_disabled_notice' => 'Po meri narejena HTML glava vsebine je onemogočena na tej strani z nastavitvami, da se zagotovi, da bodo morebitne zrušitve lahko povrnjene.',
+    'app_logo' => 'Logotip aplikacije',
+    'app_logo_desc' => 'Ta slika bi morala biti 43px visoka. <br>Velike slike bodo pomanjšane.',
+    'app_primary_color' => 'Osnovna barva aplikacije',
+    'app_primary_color_desc' => 'Nastavi osnovno barvo za aplikacijo vključno s pasico, gumbi in povezavami.',
+    'app_homepage' => 'Domača stran aplikacije',
+    'app_homepage_desc' => 'Izberi pogled, da se pokaže na domači strani, namesto osnovnega pogleda. Dovoljenja strani so prezrta za izbrane strani.',
+    'app_homepage_select' => 'Izberi stran',
+    'app_disable_comments' => 'Onemogoči komentarje',
+    'app_disable_comments_toggle' => 'Onemogoči komentarje',
+    'app_disable_comments_desc' => 'Onemogoči komentarje na vseh straneh v aplikaciji. <br> Obstoječi komentarji se ne prikazujejo.',
+
+    // Color settings
+    'content_colors' => 'Barve vsebine',
+    'content_colors_desc' => 'Nastavi barve za vse elemente v hierarhiji. Izbor barv s podobno barvno svetlostjo je priporočljivo za osnovne barve za branje.',
+    'bookshelf_color' => 'Barva police',
+    'book_color' => 'knjiga barv',
+    'chapter_color' => 'barvno poglavje',
+    'page_color' => 'Stran barv',
+    'page_draft_color' => 'stran osnutka barv',
+
+    // Registration Settings
+    'reg_settings' => 'registracija',
+    'reg_enable' => 'onemogočena registracija',
+    'reg_enable_toggle' => 'omogočena registracija',
+    'reg_enable_desc' => 'Ko je registracija omogočena, se  bo uporabnik lahko prijavil sam kot uporabnik aplikacije. Po registraciji je uporabniku dodeljena ena prevzeta vloga.',
+    'reg_default_role' => 'prevzeta uporabniška vloga po registraciji',
+    'reg_enable_external_warning' => 'Ta možnosti je ignorirana ko zunanja LDAP ali SAML avtentikacija je akitivna. Uporabniški računi za ne obstoječe uporabnike bodo avtomatsko izdelani, če avtentikacija zunanjih uporabljenih sistemov je uspešna.',
+    'reg_email_confirmation' => 'potrditev e-pošte',
+    'reg_email_confirmation_toggle' => 'potrebna potrditev e-pošte',
+    'reg_confirm_email_desc' => 'Če uporabite omejitev domene, bo potrebna potrditev e-pošte in ta možnost bo prezrta.',
+    'reg_confirm_restrict_domain' => 'omejitev domene',
+    'reg_confirm_restrict_domain_desc' => 'Vnesite seznam domen, ločenih z vejico, na katere želite omejiti registracijo. Uporabnik bo prejel e-pošto za potrditev naslova, preden bo omogočena interakcija z aplikacijo. <br> Upoštevajte, da uporabnik po uspešni registrciji lahko spremeni svoj e-poštni naslov.',
+    'reg_confirm_restrict_domain_placeholder' => 'Brez omejitev',
+
+    // Maintenance settings
+    'maint' => 'Vzdrževanje',
+    'maint_image_cleanup' => 'odstrani /počisti slike',
+    'maint_image_cleanup_desc' => "Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.",
+    'maint_image_cleanup_ignore_revisions' => 'Ignore images in revisions',
+    'maint_image_cleanup_run' => 'zaženite čiščenje',
+    'maint_image_cleanup_warning' => ':zaznano je bilo število neuporabljenih slik. Ali si prepričan, da želiš odstraniti izbrane slike?',
+    'maint_image_cleanup_success' => ':najdeno in izbrisano je bilo število neuporabljenih slik!',
+    'maint_image_cleanup_nothing_found' => 'Najdenih ni bilo nobenih neuporabljenih slik!',
+    'maint_send_test_email' => 'Pošlji testno e-pismo',
+    'maint_send_test_email_desc' => 'To pošlje testno e-pošto na vaš e-poštni naslov, naveden v vašem profilu.',
+    'maint_send_test_email_run' => 'Pošlji preizkusno sporočilo',
+    'maint_send_test_email_success' => 'e-pošta poslana na :naslov',
+    'maint_send_test_email_mail_subject' => 'Preizkusno sporočilo',
+    'maint_send_test_email_mail_greeting' => 'Zdi se, da dostava e-pošte deluje!',
+    'maint_send_test_email_mail_text' => 'Čestitke! Če ste prejeli e.poštno obvestilo so bile vaše e-poštne nastavitve pravilno konfigurirane.',
+
+    // Role Settings
+    'roles' => 'Vloge',
+    'role_user_roles' => 'Pravilo uporabnika',
+    'role_create' => 'Izdelaj novo polico',
+    'role_create_success' => 'Zapis uspešno ustvarjen',
+    'role_delete' => 'Brisanje vloge',
+    'role_delete_confirm' => 'Izbrisana bo vloga z imenom \':vlogaImena\'.',
+    'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
+    'role_delete_no_migration' => "Uporabniki niso prenosljivi",
+    'role_delete_sure' => 'Ali ste prepričani, da želite izbrisati to element?',
+    'role_delete_success' => 'Uspešno izbrisano',
+    'role_edit' => 'Uredi zapis',
+    'role_details' => 'Podrobnosti zapisa',
+    'role_name' => 'Ime zapisa',
+    'role_desc' => 'Kratki opis ',
+    'role_external_auth_id' => 'Zunanje dokazilo ID',
+    'role_system' => 'Sistemska dovoljenja',
+    'role_manage_users' => 'Upravljanje uporabnikov',
+    'role_manage_roles' => 'Vloga upravljanja & vloga dovoljenj',
+    'role_manage_entity_permissions' => 'Upravljanje vseh knjig, poglavij & dovoljenj',
+    'role_manage_own_entity_permissions' => 'Manage permissions on own book, chapter & pages',
+    'role_manage_page_templates' => 'Manage page templates',
+    'role_access_api' => 'Access system API',
+    'role_manage_settings' => 'Nastavitve za upravljanje',
+    'role_asset' => 'Sistemska dovoljenja',
+    'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
+    'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.',
+    'role_all' => 'Vse',
+    'role_own' => 'Own',
+    'role_controlled_by_asset' => '
+46/5000
+Nadzira ga sredstvo, v katerega so naloženi',
+    'role_save' => 'Shrani vlogo',
+    'role_update_success' => 'Vloga uspešno posodobljena',
+    'role_users' => 'Uporabniki v tej vlogi',
+    'role_users_none' => '
+V tej vlogi trenutno ni dodeljen noben uporabnik',
+
+    // Users
+    'users' => 'Uporabniki',
+    'user_profile' => 'Uporabniški profil',
+    'users_add_new' => 'Dodaj novega uporabnika',
+    'users_search' => 'Išči uporabnike',
+    'users_details' => 'Podatki o uporabniku',
+    'users_details_desc' => 'Nastavite prikazno ime in e-poštni naslov za tega uporabnika. E-poštni naslov bo uporabljen za prijavo v aplikacijo.',
+    'users_details_desc_no_email' => ' Nastavite prikazno ime za tega uporabnika, da ga bodo drugi lahko prepoznali.',
+    'users_role' => 'Vloge uporabnika',
+    'users_role_desc' => 'Izberi katere vloge bodo dodeljene uporabniku. Če je uporabniku dodeljenih več vlog, se dovoljenja združijo in prejmenjo vse sposobnosti dodeljenih vlog.',
+    'users_password' => 'Uporabniško geslo',
+    'users_password_desc' => 'Nastavite geslo, ki se uporablja za prijavo v aplikacijo. Dolg mora biti vsaj 6 znakov.',
+    'users_send_invite_text' => 'Uporabniku lahko pošljete e-poštno sporočilo s povabilom, ki mu omogoča, da nastavi svoje geslo, ali ga nastavite kar sami.',
+    'users_send_invite_option' => 'Pošlji uporabniku e-povabilo',
+    'users_external_auth_id' => 'Zunanje dokazilo ID',
+    'users_external_auth_id_desc' => 'To je ID, s katerim se ta uporabnik ujema pri komunikaciji z vašim zunanjim sistemom za preverjanje pristnosti.',
+    'users_password_warning' => 'Spodaj izpolni le, če želiš spremeniti geslo.',
+    'users_system_public' => 'Ta uporabnik predstavlja vse gostujoče uporabnike, ki obiščejo vaš primer. Za prijavo je ni mogoče uporabiti, ampak je dodeljena samodejno.',
+    'users_delete' => 'Brisanje uporabnika',
+    'users_delete_named' => 'Brisanje uporabnika :userName',
+    'users_delete_warning' => 'Iz sistema se bo popolnoma  izbrisal uporabnik z imenom \':userName\'',
+    'users_delete_confirm' => 'Ste prepričani, da želite izbrisati izbranega uporabnika?',
+    'users_delete_success' => 'Uporabniki uspešno odstranjeni.',
+    'users_edit' => 'Uredi uporabnika',
+    'users_edit_profile' => 'Uredi profil',
+    'users_edit_success' => 'Uporabnik uspešno posodobljen',
+    'users_avatar' => 'uporabnikov avatar',
+    'users_avatar_desc' => 'Izberi sliko, ki predstavlja uporabnika. Velikost mora biti približno 256px.',
+    'users_preferred_language' => 'Izbrani jezik',
+    'users_preferred_language_desc' => 'Ta možnost bo spremenila jezik, ki se uporablja za uporabniški vmesnik aplikacije. To ne bo vplivalo na nobeno vsebino, ki jo ustvari uporabnik.',
+    'users_social_accounts' => 'Družbene ikone / računi',
+    'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not revoke previously authorized access. Revoke access from your profile settings on the connected social account.',
+    'users_social_connect' => 'Povežite račun',
+    'users_social_disconnect' => 'Odklop računa',
+    'users_social_connected' => ':socialAccount  račun je bil uspešno dodan na vašem profilu',
+    'users_social_disconnected' => ':socialAccount račun je bil uspešno odstranjen iz vašega profila',
+    'users_api_tokens' => 'API žeton',
+    'users_api_tokens_none' => 'Nič API žetonov ni bilo ustvarjenih za uporabnika',
+    'users_api_tokens_create' => 'Ustvari žeton',
+    'users_api_tokens_expires' => 'Poteče',
+    'users_api_tokens_docs' => 'API dokumentacija',
+
+    // API Tokens
+    'user_api_token_create' => 'Ustvari žeton',
+    'user_api_token_name' => 'Ime',
+    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
+    'user_api_token_expiry' => 'Datum poteka',
+    'user_api_token_expiry_desc' => 'Določi datum izteka uporabnosti žetona. Po tem datumu, zahteve poslane s tem žetonom, ne bodo več delovale. 
+Če pustite to polje prazno, bo iztek uporabnosti 100.let .',
+    'user_api_token_create_secret_message' => 'Takoj po ustvarjanju tega žetona se ustvari in prikaže "Token ID" "in" Token Secret ". Skrivnost  bo prikazana samo enkrat, zato se pred nadaljevanjem prepričajte o varnosti kopirnega mesta.',
+    'user_api_token_create_success' => 'API žeton uspešno ustvarjen',
+    'user_api_token_update_success' => 'API žeton uspešno posodobljen',
+    'user_api_token' => 'API žeton',
+    'user_api_token_id' => 'Žeton ID',
+    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_secret' => 'Skrivnost žetona',
+    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
+    'user_api_token_created' => 'Žeton ustvarjen :timeAgo',
+    'user_api_token_updated' => 'Žeton posodobljen :timeAgo',
+    'user_api_token_delete' => 'Briši žeton',
+    'user_api_token_delete_warning' => 'Iz sistema se bo popolnoma  izbrisal API žeton z imenom \':tokenName\' ',
+    'user_api_token_delete_confirm' => 'Ali ste prepričani, da želite izbrisati ta API žeton?',
+    'user_api_token_delete_success' => 'API žeton uspešno izbrisan',
+
+    //! If editing translations files directly please ignore this in all
+    //! languages apart from en. Content will be auto-copied from en.
+    //!////////////////////////////////
+    'language_select' => [
+        'en' => 'English',
+        'ar' => 'العربية',
+        'cs' => 'Česky',
+        'da' => 'danščina',
+        'de' => 'Deutsch (Sie)',
+        'de_informal' => 'Deutsch (Du)',
+        'es' => 'Español',
+        'es_AR' => 'Español Argentina',
+        'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
+        'nl' => 'Nederlands',
+        'pl' => 'Polski',
+        'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
+        'sk' => 'Slovensky',
+        'sl' => 'slovenščina',
+        'sv' => 'Svenska',
+        'tr' => 'Türkçe',
+        'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
+        'zh_CN' => '简体中文',
+        'zh_TW' => '繁體中文',
+    ]
+    //!////////////////////////////////
+];
diff --git a/resources/lang/sl/validation.php b/resources/lang/sl/validation.php
new file mode 100644 (file)
index 0000000..fec6d56
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => ':attribute mora biti potrjen.',
+    'active_url'           => ':attribute ni veljaven URL.',
+    'after'                => ':attribute mora biti datum po :date.',
+    'alpha'                => ':attribute lahko vsebuje samo črke.',
+    'alpha_dash'           => ':attribute lahko vsebuje samo ?rke, ?tevilke in ?rtice.',
+    'alpha_num'            => ':attribute lahko vsebuje samo črke in številke.',
+    'array'                => ':attribute mora biti niz.',
+    'before'               => ':attribute mora biti datum pred :date.',
+    'between'              => [
+        'numeric' => ':attribute mora biti med :min in :max.',
+        'file'    => ':attribute mora biti med :min in :max kilobajti.',
+        'string'  => ':attribute mora biti med :min in :max znaki.',
+        'array'   => ':attribute mora imeti med :min in :max elementov.',
+    ],
+    'boolean'              => ':attribute polje mora biti pravilno ali napačno.',
+    'confirmed'            => ':attribute potrditev se ne ujema.',
+    'date'                 => ':attribute ni veljaven datum.',
+    'date_format'          => ':attribute se ne ujema z obliko :format.',
+    'different'            => ':attribute in :other morata biti različna.',
+    'digits'               => 'Atribut mora biti: števnik.',
+    'digits_between'       => ':attribute mora biti med :min in :max števkami.',
+    'email'                => ':attribute mora biti veljaven e-naslov.',
+    'ends_with' => 'The :attribute se mora končati z eno od določenih: :vrednost/values',
+    'filled'               => 'Polje ne sme biti prazno.',
+    'gt'                   => [
+        'numeric' => ':attribute mora biti večji kot :vrednost.',
+        'file'    => ':attribute mora biti večji kot :vrednost kilobytes',
+        'string'  => ':attribute mora biti večji kot :vrednost znakov',
+        'array'   => ':attribute mora biti večji kot :vrednost znakov',
+    ],
+    'gte'                  => [
+        'numeric' => ':attribute mora biti večji kot ali enak :vrednost.',
+        'file'    => ':attribute mora biti večji kot ali enak :vrednost kilobytes',
+        'string'  => ':attribute mora biti večji kot ali enak :vrednost znakov',
+        'array'   => ':attribute mora imeti :vrednost znakov ali več',
+    ],
+    'exists'               => 'Izbrani atribut je neveljaven.',
+    'image'                => ':attribute mora biti slika.',
+    'image_extension'      => ':attribute mora imeti veljavno & podprto slikovno pripono',
+    'in'                   => 'izbran :attribute je neveljaven.',
+    'integer'              => ':attribute mora biti celo število.',
+    'ip'                   => ':attribute mora biti veljaven IP naslov.',
+    'ipv4'                 => ':attribute mora biti veljaven IPv4 naslov.',
+    'ipv6'                 => ':attribute mora biti veljaven IPv6 naslov.',
+    'json'                 => ':attribute mora biti veljavna JSON povezava.',
+    'lt'                   => [
+        'numeric' => ':attribute mora biti manj kot :vrednost.',
+        'file'    => ':attribute mora biti manj kot :vrednost kilobytes',
+        'string'  => ':attribute mora biti manj kot :vrednost znakov',
+        'array'   => ':attribute mora imeti manj kot :vrednost znakov',
+    ],
+    'lte'                  => [
+        'numeric' => ':attribute mora biti manj kot ali enak :vrednost.',
+        'file'    => ':attribute mora biti manj kot ali enak :vrednost kilobytes',
+        'string'  => ':attribute mora biti manj kot ali enak :vrednost znakov',
+        'array'   => ':attribute ne sme imeti več kot :vrednost elementov',
+    ],
+    'max'                  => [
+        'numeric' => ':attribute ne sme biti večja od :max.',
+        'file'    => ':attribute ne sme biti večja od :max kilobytes.',
+        'string'  => 'Atribut naj ne bo večji od: max znakov.',
+        'array'   => ':attribute ne sme imeti več kot :max elementov.',
+    ],
+    'mimes'                => 'Atribut mora biti datoteka vrste:: vrednost.',
+    'min'                  => [
+        'numeric' => ':attribute mora biti najmanj :min.',
+        'file'    => ':attribute mora biti najmanj :min KB.',
+        'string'  => ':attribute mora biti najmanj :min znakov.',
+        'array'   => ':attribute mora imeti vsaj :min elementov.',
+    ],
+    'no_double_extension'  => ':attribute mora imeti samo eno razširitveno datoteko',
+    'not_in'               => 'Izbrani atribut je neveljaven.',
+    'not_regex'            => ':attribute oblika ni veljavna.',
+    'numeric'              => 'Atribut mora biti število.',
+    'regex'                => ':attribute oblika ni veljavna.',
+    'required'             => 'Polje :attribute je obvezno.',
+    'required_if'          => 'Polje atributa je obvezno, če: drugo je: vrednost.',
+    'required_with'        => 'Polje atributa je obvezno, ko: so prisotne vrednosti.',
+    'required_with_all'    => 'Polje atributa je obvezno, ko: so prisotne vrednosti.',
+    'required_without'     => 'Polje atributa je obvezno, če: vrednosti niso prisotne.',
+    'required_without_all' => 'Polje atributa je obvezno, če nobena od: vrednosti ni prisotna.',
+    'same'                 => 'Atribut in: drugi se morajo ujemati.',
+    'size'                 => [
+        'numeric' => ':attribute mora biti :velikost.',
+        'file'    => ':attribute mora biti :velikost KB.',
+        'string'  => 'Atribut mora biti: velikost znakov.',
+        'array'   => ':attribute mora vsebovati :velikost elementov.',
+    ],
+    'string'               => ':attribute mora biti niz.',
+    'timezone'             => ':attribute mora biti veljavna cona.',
+    'unique'               => ':attribute je že zaseden.',
+    'url'                  => ':attribute oblika ni veljavna.',
+    'uploaded'             => 'Datoteke ni bilo mogoče naložiti. Strežnik morda ne sprejema datotek te velikosti.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'Potrditev gesla',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index 96feee117011cab43499e45872f58f0fb3d700ae..0ca269e2e466d371c9ff8b1fcc8786f15632ed0d 100644 (file)
@@ -66,12 +66,12 @@ return [
     'email_not_confirmed_resend_button' => 'Skicka bekräftelse på nytt',
 
     // User Invite
-    'user_invite_email_subject' => 'You have been invited to join :appName!',
-    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
-    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
-    'user_invite_email_action' => 'Set Account Password',
-    'user_invite_page_welcome' => 'Welcome to :appName!',
-    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
-    'user_invite_page_confirm_button' => 'Confirm Password',
-    'user_invite_success' => 'Password set, you now have access to :appName!'
+    'user_invite_email_subject' => 'Du har blivit inbjuden att gå med i :appName!',
+    'user_invite_email_greeting' => 'Ett konto har skapats för dig i :appName.',
+    'user_invite_email_text' => 'Klicka på knappen nedan för att ange ett lösenord och få tillgång:',
+    'user_invite_email_action' => 'Ange kontolösenord',
+    'user_invite_page_welcome' => 'Välkommen till :appName!',
+    'user_invite_page_text' => 'För att slutföra ditt konto och få åtkomst måste du ange ett lösenord som kommer att användas för att logga in på :appName vid framtida besök.',
+    'user_invite_page_confirm_button' => 'Bekräfta lösenord',
+    'user_invite_success' => 'Lösenord satt, du har nu tillgång till :appName!'
 ];
\ No newline at end of file
index 1e49ad03e56cc98e57912c893252c67c42e37d05..1c37af2772bf50ac049916315714fa80c0102f83 100644 (file)
@@ -38,13 +38,13 @@ return [
     'reset' => 'Återställ',
     'remove' => 'Radera',
     'add' => 'Lägg till',
-    'fullscreen' => 'Fullscreen',
+    'fullscreen' => 'Helskärm',
 
     // Sort Options
-    'sort_options' => 'Sort Options',
-    'sort_direction_toggle' => 'Sort Direction Toggle',
-    'sort_ascending' => 'Sort Ascending',
-    'sort_descending' => 'Sort Descending',
+    'sort_options' => 'Sorteringsalternativ',
+    'sort_direction_toggle' => 'Växla sorteringsriktning',
+    'sort_ascending' => 'Sortera stigande',
+    'sort_descending' => 'Sortera fallande',
     'sort_name' => 'Namn',
     'sort_created_at' => 'Skapad',
     'sort_updated_at' => 'Uppdaterad',
@@ -60,10 +60,10 @@ return [
     'grid_view' => 'Rutnätsvy',
     'list_view' => 'Listvy',
     'default' => 'Förvald',
-    'breadcrumb' => 'Breadcrumb',
+    'breadcrumb' => 'Brödsmula',
 
     // Header
-    'profile_menu' => 'Profile Menu',
+    'profile_menu' => 'Profilmeny',
     'view_profile' => 'Visa profil',
     'edit_profile' => 'Redigera profil',
 
index bc4b3a4afa55ca808bb9e546c531f4ff241f974a..e4938fbfd542426543025997042482452a840c4d 100644 (file)
@@ -17,12 +17,12 @@ return [
     'recent_activity' => 'Aktivitet',
     'create_now' => 'Skapa en nu',
     'revisions' => 'Revisioner',
-    'meta_revision' => 'Revision #:revisionCount',
+    'meta_revision' => 'Revisions #:revisionCount',
     'meta_created' => 'Skapad :timeLength',
     'meta_created_name' => 'Skapad :timeLength av :user',
     'meta_updated' => 'Uppdaterad :timeLength',
     'meta_updated_name' => 'Uppdaterad :timeLength av :user',
-    'entity_select' => 'Entity Select',
+    'entity_select' => 'Välj enhet',
     'images' => 'Bilder',
     'my_recent_drafts' => 'Mina nyaste utkast',
     'my_recently_viewed' => 'Mina senast visade sidor',
@@ -176,7 +176,7 @@ return [
     'pages_delete_confirm' => 'Är du säker på att du vill ta bort den här sidan?',
     'pages_delete_draft_confirm' => 'Är du säker på att du vill ta bort det här utkastet?',
     'pages_editing_named' => 'Redigerar sida :pageName',
-    'pages_edit_draft_options' => 'Draft Options',
+    'pages_edit_draft_options' => 'Inställningar för utkast',
     'pages_edit_save_draft' => 'Spara utkast',
     'pages_edit_draft' => 'Redigera utkast',
     'pages_editing_draft' => 'Redigerar utkast',
@@ -203,14 +203,14 @@ return [
     'pages_copy_success' => 'Sidan har kopierats',
     'pages_permissions' => 'Rättigheter för sida',
     'pages_permissions_success' => 'Rättigheterna för sidan har uppdaterats',
-    'pages_revision' => 'Revision',
+    'pages_revision' => 'Revidering',
     'pages_revisions' => 'Sidrevisioner',
     'pages_revisions_named' => 'Sidrevisioner för :pageName',
     'pages_revision_named' => 'Sidrevision för :pageName',
     'pages_revisions_created_by' => 'Skapad av',
     'pages_revisions_date' => 'Revisionsdatum',
     'pages_revisions_number' => '#',
-    'pages_revisions_numbered' => 'Revision #:id',
+    'pages_revisions_numbered' => 'Revisions #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id ändringar',
     'pages_revisions_changelog' => 'Ändringslogg',
     'pages_revisions_changes' => 'Ändringar',
@@ -234,7 +234,7 @@ return [
     ],
     'pages_draft_discarded' => 'Utkastet har tagits bort. Redigeringsverktyget har uppdaterats med aktuellt innehåll.',
     'pages_specific' => 'Specifik sida',
-    'pages_is_template' => 'Page Template',
+    'pages_is_template' => 'Sidmall',
 
     // Editor Sidebar
     'page_tags' => 'Sidtaggar',
@@ -243,11 +243,11 @@ return [
     'shelf_tags' => 'Hylltaggar',
     'tag' => 'Tagg',
     'tags' =>  'Taggar',
-    'tag_name' =>  'Tag Name',
+    'tag_name' =>  'Etikettnamn',
     'tag_value' => 'Taggvärde (Frivilligt)',
     'tags_explain' => "Lägg till taggar för att kategorisera ditt innehåll bättre. \n Du kan tilldela ett värde till en tagg för ännu bättre organisering.",
     'tags_add' => 'Lägg till ännu en tagg',
-    'tags_remove' => 'Remove this tag',
+    'tags_remove' => 'Ta bort denna etikett',
     'attachments' => 'Bilagor',
     'attachments_explain' => 'Ladda upp filer eller bifoga länkar till ditt innehåll. Dessa visas i sidokolumnen.',
     'attachments_explain_instant_save' => 'Ändringar här sparas omgående.',
@@ -273,12 +273,12 @@ return [
     'attachments_file_uploaded' => 'Filen har laddats upp',
     'attachments_file_updated' => 'Filen har uppdaterats',
     'attachments_link_attached' => 'Länken har bifogats till sidan',
-    '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' => 'Mallar',
+    'templates_set_as_template' => 'Sidan är en mall',
+    'templates_explain_set_as_template' => 'Du kan använda denna sida som en mall så att dess innehåll kan användas när du skapar andra sidor. Andra användare kommer att kunna använda denna mall om de har visningsrättigheter för den här sidan.',
+    'templates_replace_content' => 'Ersätt sidinnehåll',
+    'templates_append_content' => 'Lägg till till sidans innehåll',
+    'templates_prepend_content' => 'Lägg till före sidans innehåll',
 
     // Profile View
     'profile_user_for_x' => 'Användare i :time',
index a00109e3d29fdb0e25c96d4dcd33ea84e20535b3..adf22af1d18f9f50c7d221083bb5b0d8e5730256 100644 (file)
@@ -13,16 +13,16 @@ return [
     'email_already_confirmed' => 'E-posten har redan bekräftats, prova att logga in.',
     'email_confirmation_invalid' => 'Denna bekräftelsekod är inte giltig eller har redan använts. Vänligen prova att registera dig på nytt',
     'email_confirmation_expired' => 'Denna bekräftelsekod har gått ut. Vi har skickat dig en ny.',
-    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'email_confirmation_awaiting' => 'E-postadressen för det konto som används måste bekräftas',
     'ldap_fail_anonymous' => 'LDAP-inloggning misslyckades med anonym bindning',
     'ldap_fail_authed' => 'LDAP-inloggning misslyckades med angivna dn- och lösenordsuppgifter',
     'ldap_extension_not_installed' => 'LDAP PHP-tillägg inte installerat',
     'ldap_cannot_connect' => 'Kan inte ansluta till ldap-servern. Anslutningen misslyckades',
-    'saml_already_logged_in' => 'Already logged in',
-    'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
-    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
-    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
-    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'saml_already_logged_in' => 'Redan inloggad',
+    'saml_user_not_registered' => 'Användarnamnet är inte registrerat och automatisk registrering är inaktiverad',
+    'saml_no_email_address' => 'Kunde inte hitta en e-postadress för den här användaren i data som tillhandahålls av det externa autentiseringssystemet',
+    'saml_invalid_response_id' => 'En begäran från det externa autentiseringssystemet känns inte igen av en process som startats av denna applikation. Att navigera bakåt efter en inloggning kan orsaka detta problem.',
+    'saml_fail_authed' => 'Inloggning med :system misslyckades, systemet godkände inte auktoriseringen',
     'social_no_action_defined' => 'Ingen åtgärd definierad',
     'social_login_bad_response' => "Ett fel inträffade vid inloggning genom :socialAccount: \n:error",
     'social_account_in_use' => 'Detta konto från :socialAccount används redan. Testa att logga in med :socialAccount istället.',
@@ -33,7 +33,7 @@ return [
     'social_account_register_instructions' => 'Om du inte har något konto ännu kan du registerar dig genom att välja :socialAccount.',
     'social_driver_not_found' => 'Drivrutinen för den här tjänsten hittades inte',
     'social_driver_not_configured' => 'Dina inställningar för :socialAccount är inte korrekta.',
-    'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
+    'invite_token_expired' => 'Denna inbjudningslänk har löpt ut. Du kan istället försöka återställa ditt kontos lösenord.',
 
     // System
     'path_not_writable' => 'Kunde inte ladda upp till sökvägen :filePath. Kontrollera att webbservern har skrivåtkomst.',
@@ -83,17 +83,21 @@ return [
     // Error pages
     '404_page_not_found' => 'Sidan hittades inte',
     'sorry_page_not_found' => 'Tyvärr gick det inte att hitta sidan du söker.',
+    'sorry_page_not_found_permission_warning' => 'Om du förväntade dig att denna sida skulle existera, kanske du inte har behörighet att se den.',
     'return_home' => 'Återvänd till startsidan',
     'error_occurred' => 'Ett fel inträffade',
     'app_down' => ':appName är nere just nu',
     'back_soon' => 'Vi är snart tillbaka.',
 
     // API errors
-    'api_no_authorization_found' => 'No authorization token found on the request',
-    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
-    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
-    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
-    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
-    'api_user_token_expired' => 'The authorization token used has expired',
+    'api_no_authorization_found' => 'Ingen auktoriseringstoken hittades på denna begäran',
+    'api_bad_authorization_format' => 'En auktoriseringstoken hittades på denna begäran men formatet verkade felaktigt',
+    'api_user_token_not_found' => 'Ingen matchande API-token hittades för den angivna auktoriseringstoken',
+    'api_incorrect_token_secret' => 'Hemligheten för den angivna API-token är felaktig',
+    'api_user_no_api_permission' => 'Ägaren av den använda API-token har inte behörighet att göra API-anrop',
+    'api_user_token_expired' => 'Den använda auktoriseringstoken har löpt ut',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Ett fel uppstod när ett test mail skulle skickas:',
 
 ];
index 514f8f894509a2dcdc831fa7d1a9e0daac8d2320..05284cc5a0343f8fc0ff315b68ea364134654e4d 100644 (file)
@@ -29,7 +29,7 @@ return [
     'app_editor_desc' => 'Välj vilket redigeringsverktyg som ska användas av alla användare för att redigera sidor.',
     'app_custom_html' => 'Egen HTML i <head>',
     'app_custom_html_desc' => 'Eventuellt innehåll i det här fältet placeras längst ner i <head>-sektionen på varje sida. Detta är användbart för att skriva över stilmaller eller lägga in spårningskoder.',
-    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
+    'app_custom_html_disabled_notice' => 'Anpassat innehåll i HTML-huvud är inaktiverat på denna inställningssida för att säkerställa att eventuella ändringar som påverkar funktionaliteten kan återställas.',
     'app_logo' => 'Applikationslogotyp',
     'app_logo_desc' => 'Bilden bör vara minst 43px hög. <br>Större bilder skalas ner.',
     'app_primary_color' => 'Primärfärg',
@@ -42,13 +42,13 @@ return [
     'app_disable_comments_desc' => 'Inaktivera kommentarer på alla sidor i applikationen. Befintliga kommentarer visas inte.',
 
     // Color settings
-    'content_colors' => 'Content Colors',
-    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
-    'bookshelf_color' => 'Shelf Color',
-    'book_color' => 'Book Color',
-    'chapter_color' => 'Chapter Color',
-    'page_color' => 'Page Color',
-    'page_draft_color' => 'Page Draft Color',
+    'content_colors' => 'Innehållsfärger',
+    'content_colors_desc' => 'Ställer in färger för alla element i sidornas hierarki. Att välja färger med samma ljusstyrka som standardfärgerna rekommenderas för läsbarhet.',
+    'bookshelf_color' => 'Hyllfärg',
+    'book_color' => 'Bokens färg',
+    'chapter_color' => 'Kapitels färg',
+    'page_color' => 'Sidfärg',
+    'page_draft_color' => 'Färg på sidutkast',
 
     // Registration Settings
     'reg_settings' => 'Registreringsinställningar',
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Tillåt registrering',
     'reg_enable_desc' => 'När registrering tillåts kan användaren logga in som en användare. Vid registreringen ges de en förvald användarroll.',
     'reg_default_role' => 'Standardroll efter registrering',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'Alternativet ovan ignoreras medan extern LDAP eller SAML-autentisering är aktiv. Användarkonton för icke-existerande medlemmar kommer att skapas automatiskt om autentisering mot det externa system som används lyckas.',
     'reg_email_confirmation' => 'E-postbekräftelse',
     'reg_email_confirmation_toggle' => 'Kräv e-postbekräftelse',
     'reg_confirm_email_desc' => 'Om registrering begränas till vissa domäner kommer e-postbekräftelse alltid att krävas och den här inställningen kommer att ignoreras.',
@@ -73,13 +73,13 @@ return [
     'maint_image_cleanup_warning' => 'Hittade :count bilder som potentiellt inte används. Vill du verkligen ta bort dessa bilder?',
     'maint_image_cleanup_success' => 'Hittade och raderade :count bilder som potentiellt inte används!',
     'maint_image_cleanup_nothing_found' => 'Hittade inga oanvända bilder, så inget har raderats!',
-    'maint_send_test_email' => 'Send a Test Email',
-    'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.',
-    'maint_send_test_email_run' => 'Send test email',
-    'maint_send_test_email_success' => 'Email sent to :address',
-    'maint_send_test_email_mail_subject' => 'Test Email',
-    'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!',
-    'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.',
+    'maint_send_test_email' => 'Skicka ett testmail',
+    'maint_send_test_email_desc' => 'Detta skickar ett testmeddelande till den e-postadress som anges i din profil.',
+    'maint_send_test_email_run' => 'Skicka testmail',
+    'maint_send_test_email_success' => 'E-post skickat till :address',
+    'maint_send_test_email_mail_subject' => 'Testmejl',
+    'maint_send_test_email_mail_greeting' => 'E-postleverans verkar fungera!',
+    'maint_send_test_email_mail_text' => 'Grattis! Eftersom du fick detta e-postmeddelande verkar dina e-postinställningar vara korrekt konfigurerade.',
 
     // Role Settings
     'roles' => 'Roller',
@@ -102,8 +102,8 @@ return [
     'role_manage_roles' => 'Hantera roller & rättigheter',
     'role_manage_entity_permissions' => 'Hantera rättigheter för alla böcker, kapitel och sidor',
     'role_manage_own_entity_permissions' => 'Hantera rättigheter för egna böcker, kapitel och sidor',
-    'role_manage_page_templates' => 'Manage page templates',
-    'role_access_api' => 'Access system API',
+    'role_manage_page_templates' => 'Hantera mallar',
+    'role_access_api' => 'Åtkomst till systemets API',
     'role_manage_settings' => 'Hantera appinställningar',
     'role_asset' => 'Tillgång till innehåll',
     'role_asset_desc' => 'Det här är standardinställningarna för allt innehåll i systemet. Eventuella anpassade rättigheter på böcker, kapitel och sidor skriver över dessa inställningar.',
@@ -128,10 +128,10 @@ return [
     'users_role_desc' => 'Välj vilka roller den här användaren ska tilldelas. Om en användare har tilldelats flera roller kommer behörigheterna från dessa roller att staplas och de kommer att få alla rättigheter i de tilldelade rollerna.',
     'users_password' => 'Användarlösenord',
     'users_password_desc' => 'Ange ett lösenord som ska användas för att logga in på sidan. Lösenordet måste vara minst 5 tecken långt.',
-    'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
-    'users_send_invite_option' => 'Send user invite email',
+    'users_send_invite_text' => 'Du kan välja att skicka denna användare ett e-postmeddelande som tillåter dem att ställa in sitt eget lösenord, eller så kan du ställa in deras lösenord själv.',
+    'users_send_invite_option' => 'Skicka e-post med inbjudan',
     'users_external_auth_id' => 'Externt ID för autentisering',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'Detta är det ID som används för att matcha denna användare när du kommunicerar med ditt externa autentiseringssystem.',
     'users_password_warning' => 'Fyll i nedanstående fält endast om du vill byta lösenord:',
     'users_system_public' => 'Den här användaren representerar eventuella gäster som använder systemet. Den kan inte användas för att logga in utan tilldeles automatiskt.',
     'users_delete' => 'Ta bort användare',
@@ -152,32 +152,32 @@ return [
     'users_social_disconnect' => 'Koppla från konto',
     'users_social_connected' => ':socialAccount har kopplats till ditt konto.',
     'users_social_disconnected' => ':socialAccount har kopplats bort från ditt konto.',
-    'users_api_tokens' => 'API Tokens',
-    'users_api_tokens_none' => 'No API tokens have been created for this user',
-    'users_api_tokens_create' => 'Create Token',
-    'users_api_tokens_expires' => 'Expires',
-    'users_api_tokens_docs' => 'API Documentation',
+    'users_api_tokens' => 'API-nyckel',
+    'users_api_tokens_none' => 'Inga API-tokens har skapats för den här användaren',
+    'users_api_tokens_create' => 'Skapa token',
+    'users_api_tokens_expires' => 'Förfaller',
+    'users_api_tokens_docs' => 'API-dokumentation',
 
     // API Tokens
-    'user_api_token_create' => 'Create API Token',
-    'user_api_token_name' => 'Name',
-    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
-    'user_api_token_expiry' => 'Expiry Date',
-    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
-    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
-    'user_api_token_create_success' => 'API token successfully created',
-    'user_api_token_update_success' => 'API token successfully updated',
-    'user_api_token' => 'API Token',
+    'user_api_token_create' => 'Skapa API-nyckel',
+    'user_api_token_name' => 'Namn',
+    'user_api_token_name_desc' => 'Ge din token ett läsbart namn som en framtida påminnelse om dess avsedda syfte.',
+    'user_api_token_expiry' => 'Förfallodatum',
+    'user_api_token_expiry_desc' => 'Ange ett datum då denna token går ut. Efter detta datum kommer förfrågningar som görs med denna token inte längre att fungera. Lämnar du detta fält tomt kommer utgångsdatum att sättas 100 år in i framtiden.',
+    'user_api_token_create_secret_message' => 'Omedelbart efter att du skapat denna token kommer ett "Token ID" & "Token Secret" att genereras och visas. Token Secret kommer bara att visas en enda gång så se till att kopiera värdet till en säker plats innan du fortsätter.',
+    'user_api_token_create_success' => 'API-token har skapats',
+    'user_api_token_update_success' => 'API-token har uppdaterats',
+    'user_api_token' => 'API-nyckel',
     'user_api_token_id' => 'Token ID',
-    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_id_desc' => 'Detta är en icke-redigerbar systemgenererad identifierare för denna token som måste tillhandahållas i API-förfrågningar.',
     'user_api_token_secret' => 'Token Secret',
-    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
-    'user_api_token_created' => 'Token Created :timeAgo',
-    'user_api_token_updated' => 'Token Updated :timeAgo',
-    'user_api_token_delete' => 'Delete Token',
-    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
-    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
-    'user_api_token_delete_success' => 'API token successfully deleted',
+    'user_api_token_secret_desc' => 'Detta är en systemgenererad hemlighet för denna token som måste tillhandahållas i API-förfrågningar. Denna kommer bara att visas en gång så kopiera detta värde till en säker plats.',
+    'user_api_token_created' => 'Token skapad :timeAgo',
+    'user_api_token_updated' => 'Token Uppdaterad :timeAgo',
+    'user_api_token_delete' => 'Ta bort token',
+    'user_api_token_delete_warning' => 'Detta kommer att helt ta bort denna API-token med namnet \':tokenName\' från systemet.',
+    'user_api_token_delete_confirm' => 'Är du säker på att du vill ta bort denna API-token?',
+    'user_api_token_delete_success' => 'API-token har tagits bort',
 
     //! If editing translations files directly please ignore this in all
     //! languages apart from en. Content will be auto-copied from en.
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
-        'da' => 'Dansk',
+        'cs' => 'Česky',
+        'da' => 'Danska',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenska',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index 490d1d85b2c7ead48198f9dfcb605772526aa2c2..5da78b2457f14fe13f48c476aee929650e0a8cdd 100644 (file)
@@ -30,19 +30,19 @@ return [
     'digits'               => ':attribute måste vara :digits siffror.',
     'digits_between'       => ':attribute måste vara mellan :min och :max siffror.',
     'email'                => ':attribute måste vara en giltig e-postadress.',
-    'ends_with' => 'The :attribute must end with one of the following: :values',
+    'ends_with' => ':attribute måste sluta med något av följande: :values',
     'filled'               => ':attribute är obligatoriskt.',
     'gt'                   => [
-        'numeric' => 'The :attribute must be greater than :value.',
-        'file'    => 'The :attribute must be greater than :value kilobytes.',
-        'string'  => 'The :attribute must be greater than :value characters.',
-        'array'   => 'The :attribute must have more than :value items.',
+        'numeric' => ':attribute måste vara större än :value.',
+        'file'    => ':attribute måste vara större än :value kilobytes.',
+        'string'  => ':attribute måste vara större än :value tecken.',
+        'array'   => ':attribute måste ha mer än :value objekt.',
     ],
     'gte'                  => [
-        'numeric' => 'The :attribute must be greater than or equal :value.',
-        'file'    => 'The :attribute must be greater than or equal :value kilobytes.',
-        'string'  => 'The :attribute must be greater than or equal :value characters.',
-        'array'   => 'The :attribute must have :value items or more.',
+        'numeric' => ':attribute måste vara större än eller likamed :value.',
+        'file'    => ':attribute måste vara större än eller lika med :value kilobytes.',
+        'string'  => ':attribute måste vara större än eller lika med :value tecken.',
+        'array'   => ':attribute måste ha :value objekt eller mer.',
     ],
     'exists'               => 'Valt värde för :attribute är ogiltigt.',
     'image'                => ':attribute måste vara en bild.',
@@ -50,20 +50,20 @@ return [
     'in'                   => 'Vald :attribute är ogiltigt.',
     'integer'              => ':attribute måste vara en integer.',
     'ip'                   => ':attribute måste vara en giltig IP-adress.',
-    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
-    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
-    'json'                 => 'The :attribute must be a valid JSON string.',
+    'ipv4'                 => ':attribute måste vara en giltig IPv4-adress.',
+    'ipv6'                 => ':attribute måste vara en giltig IPv6-adress.',
+    'json'                 => ':attribute måste vara en giltig JSON-sträng.',
     'lt'                   => [
-        'numeric' => 'The :attribute must be less than :value.',
-        'file'    => 'The :attribute must be less than :value kilobytes.',
-        'string'  => 'The :attribute must be less than :value characters.',
-        'array'   => 'The :attribute must have less than :value items.',
+        'numeric' => ':attribute måste vara mindre än :value.',
+        'file'    => ':attribute måste vara mindre än :value kilobytes.',
+        'string'  => ':attribute måste vara mindre än :value tecken.',
+        'array'   => ':attribute måste ha mindre än :value objekt.',
     ],
     'lte'                  => [
-        'numeric' => 'The :attribute must be less than or equal :value.',
-        'file'    => 'The :attribute must be less than or equal :value kilobytes.',
-        'string'  => 'The :attribute must be less than or equal :value characters.',
-        'array'   => 'The :attribute must not have more than :value items.',
+        'numeric' => ':attribute måste vara mindre än eller lika :value.',
+        'file'    => ':attribute måste vara mindre än eller lika med :value kilobytes.',
+        'string'  => ':attribute måste vara mindre än eller lika med :value tecken.',
+        'array'   => ':attribute får inte innehålla mer än :max objekt.',
     ],
     'max'                  => [
         'numeric' => ':attribute får inte vara större än :max.',
@@ -80,7 +80,7 @@ return [
     ],
     'no_double_extension'  => ':attribute får bara ha ett filtillägg.',
     'not_in'               => 'Vald :attribute är inte giltig',
-    'not_regex'            => 'The :attribute format is invalid.',
+    'not_regex'            => 'Formatet på :attribute är ogiltigt.',
     'numeric'              => ':attribute måste vara ett nummer.',
     'regex'                => ':attribute har ett ogiltigt format.',
     'required'             => ':attribute är obligatoriskt.',
index 4e20e3b009d4947fe192e0632a476e6d0b1675ed..50688219eb9f05ff7e6c9da360cdc26b02f8bab9 100644 (file)
@@ -13,7 +13,7 @@ return [
     'email_already_confirmed' => 'E-mail halihazırda onaylanmış, giriş yapmayı dene.',
     'email_confirmation_invalid' => 'Bu doğrulama tokenı daha önce kullanılmış veya geçerli değil, lütfen tekrar kayıt olmayı deneyin.',
     'email_confirmation_expired' => 'Doğrulama token\'ının süresi geçmiş, yeni bir mail gönderildi.',
-    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'email_confirmation_awaiting' => 'Kullanılan hesabın e-posta adresinin onaylanması gerekiyor',
     'ldap_fail_anonymous' => 'Anonim LDAP girişi başarısız oldu',
     'ldap_fail_authed' => 'Verdiğiniz bilgiler ile LDAP girişi başarısız oldu.',
     'ldap_extension_not_installed' => 'LDAP PHP eklentisi yüklenmedi',
@@ -83,17 +83,21 @@ return [
     // Error pages
     '404_page_not_found' => 'Sayfa Bulunamadı',
     'sorry_page_not_found' => 'Üzgünüz, aradığınız sayfa bulunamıyor.',
+    'sorry_page_not_found_permission_warning' => 'Görüntüleyemediğiniz bu sayfanın var olduğunu düşünüyorsanız, görüntüleme izniniz olmayabilir.',
     'return_home' => 'Anasayfaya dön',
     'error_occurred' => 'Bir Hata Oluştu',
     'app_down' => ':appName şu anda inaktif',
     'back_soon' => 'En kısa zamanda aktif hale gelecek.',
 
     // API errors
-    'api_no_authorization_found' => 'No authorization token found on the request',
-    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
-    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
-    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
-    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
-    'api_user_token_expired' => 'The authorization token used has expired',
+    'api_no_authorization_found' => 'İstekte yetkilendirme anahtarı bulunamadı',
+    'api_bad_authorization_format' => 'İstekte bir yetkilendirme anahtarı bulundu, ancak biçim yanlış görünüyor',
+    'api_user_token_not_found' => 'Sağlanan yetkilendirme anahtarı ile eşleşen bir API anahtarı bulunamadı',
+    'api_incorrect_token_secret' => 'Kullanılan API anahtarı için sağlanan gizli anahtar doğru değil',
+    'api_user_no_api_permission' => 'Kullanılan API anahtarının sahibi API çağrısı yapmak için izne sahip değil',
+    'api_user_token_expired' => 'Kullanılan yetkilendirme anahtarının süresi doldu',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Test e-postası gönderilirken hata oluştu:',
 
 ];
index 4e81344bd530d54908d10fb905dd9185459b3035..638796fa4ae06afe93682324bfb9e0d1ce1b5be4 100755 (executable)
@@ -43,7 +43,7 @@ return [
 
     // Color settings
     'content_colors' => 'İçerik Renkleri',
-    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
+    'content_colors_desc' => 'Sayfa organizasyon hiyerarşisi içerisindeki tüm elementler için renkleri ayarla. Renkleri benzer parlaklıkta seçmeniz okunurluk açısından önerilir.',
     'bookshelf_color' => 'Raf Rengi',
     'book_color' => 'Kitap Rengi',
     'chapter_color' => 'Kısım Rengi',
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => 'Kaydolmaya izin ver',
     'reg_enable_desc' => 'Kayıt olmaya izin verdiğinizde kullanıcılar kendilerini uygulamaya kaydedebilecekler. Kayıt olduktan sonra kendilerine varsayılan kullanıcı rolü atanacaktır.',
     'reg_default_role' => 'Kayıt olduktan sonra varsayılan kullanıcı rolü',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => 'Harici LDAP veya SAML kimlik doğrulaması etkinken yukarıdaki seçenek yok sayılır. Mevcut harici üyelere yönelik kimlik doğrulama başarılı olursa, mevcut olmayan üyelerin kullanıcı hesapları otomatik olarak oluşturulur.',
     'reg_email_confirmation' => 'Email Doğrulama',
     'reg_email_confirmation_toggle' => 'E-mail onayı gerektir',
     'reg_confirm_email_desc' => 'Eğer domain kısıtlaması kullanılıyorsa o zaman email doğrulaması gereklidir ve bu seçenek yok sayılacaktır.',
@@ -103,7 +103,7 @@ return [
     'role_manage_entity_permissions' => 'Bütün kitap, bölüm ve sayfa izinlerini yönet',
     'role_manage_own_entity_permissions' => 'Sahip olunan kitap, bölüm ve sayfaların izinlerini yönet',
     'role_manage_page_templates' => 'Sayfa şablonlarını yönet',
-    'role_access_api' => 'Access system API',
+    'role_access_api' => 'Sistem API\'na eriş',
     'role_manage_settings' => 'Uygulama ayarlarını yönet',
     'role_asset' => 'Asset Yetkileri',
     'role_asset_desc' => 'Bu izinleri assetlere sistem içinden varsayılan erişimi kontrol eder. Kitaplar, bölümler ve sayfaların izinleri bu izinleri override eder.',
@@ -131,7 +131,7 @@ return [
     'users_send_invite_text' => 'Bu kullanıcıya parolasını sıfırlayabilmesi için bir e-posta gönder veya şifresini sen belirle.',
     'users_send_invite_option' => 'Kullanıcıya davet e-postası gönder',
     'users_external_auth_id' => 'Harici Authentication ID\'si',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_external_auth_id_desc' => 'Bu ID, harici kimlik doğrulama sisteminizle iletişim kurarken bu kullanıcıyla eşleştirmek için kullanılır.',
     'users_password_warning' => 'Sadece parolanızı değiştirmek istiyorsanız aşağıyı doldurunuz.',
     'users_system_public' => 'Bu kullanıcı sizin uygulamanızı ziyaret eden bütün misafir kullanıcıları temsil eder. Giriş yapmak için kullanılamaz, otomatik olarak atanır.',
     'users_delete' => 'Kullanıcı Sil',
@@ -152,32 +152,33 @@ return [
     'users_social_disconnect' => 'Hesabın Bağlantısını Kes',
     'users_social_connected' => ':socialAccount hesabı profilinize başarıyla bağlandı.',
     'users_social_disconnected' => ':socialAccount hesabınızın profilinizle ilişiği başarıyla kesildi.',
-    'users_api_tokens' => 'API Tokens',
-    'users_api_tokens_none' => 'No API tokens have been created for this user',
-    'users_api_tokens_create' => 'Create Token',
-    'users_api_tokens_expires' => 'Expires',
-    'users_api_tokens_docs' => 'API Documentation',
+    'users_api_tokens' => 'API Anahtarları',
+    'users_api_tokens_none' => 'Bu kullanıcı için oluşturulmuş API anahtarı bulunmuyor',
+    'users_api_tokens_create' => 'Anahtar Oluştur',
+    'users_api_tokens_expires' => 'Bitiş süresi',
+    'users_api_tokens_docs' => 'API Dokümantasyonu',
 
     // API Tokens
-    'user_api_token_create' => 'Create API Token',
-    'user_api_token_name' => 'Name',
-    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
-    'user_api_token_expiry' => 'Expiry Date',
-    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
-    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID"" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
-    'user_api_token_create_success' => 'API token successfully created',
-    'user_api_token_update_success' => 'API token successfully updated',
-    'user_api_token' => 'API Token',
-    'user_api_token_id' => 'Token ID',
-    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
-    'user_api_token_secret' => 'Token Secret',
-    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
-    'user_api_token_created' => 'Token Created :timeAgo',
-    'user_api_token_updated' => 'Token Updated :timeAgo',
-    'user_api_token_delete' => 'Delete Token',
-    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
-    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
-    'user_api_token_delete_success' => 'API token successfully deleted',
+    'user_api_token_create' => 'API Anahtarı Oluştur',
+    'user_api_token_name' => 'İsim',
+    'user_api_token_name_desc' => 'Anahtarınıza gelecekte ne amaçla kullanıldığını hatırlatması açısından anlamlı bir isim veriniz.',
+    'user_api_token_expiry' => 'Bitiş Tarihi',
+    'user_api_token_expiry_desc' => 'Bu anahtarın süresinin dolduğu bir tarih belirleyin. Bu tarihten sonra, bu anahtar kullanılarak yapılan istekler artık çalışmaz. Bu alanı boş bırakmak, bitiş tarihini 100 yıl sonrası yapar.',
+    'user_api_token_create_secret_message' => 'Bu jetonu oluşturduktan hemen sonra bir "ID Anahtarı" "ve" Gizli Anahtar "oluşturulacak ve görüntülenecektir.
+Gizli Anahtar yalnızca tek bir kez gösterilecektir, bu yüzden devam etmeden önce değeri güvenli bir yere kopyaladığınızdan emin olun.',
+    'user_api_token_create_success' => 'API anahtarı başarıyla oluşturuldu',
+    'user_api_token_update_success' => 'API anahtarı başarıyla güncellendi',
+    'user_api_token' => 'API Erişim Anahtarı',
+    'user_api_token_id' => 'Anahtar ID',
+    'user_api_token_id_desc' => 'Bu API isteklerini karşılamak için sistem tarafından oluşturulmuş sonradan düzenlenemez bir tanımlayıcıdır.',
+    'user_api_token_secret' => 'Gizli Anahtar',
+    'user_api_token_secret_desc' => 'Bu, API isteklerinde sağlanması gereken anahtar için sistem tarafından oluşturulan bir gizli anahtardır. Bu yalnızca bir kez görüntülenecektir, bu nedenle bu değeri güvenli bir yere kopyalayın.',
+    'user_api_token_created' => 'Anahtar :timeAgo Önce Oluşturuldu',
+    'user_api_token_updated' => 'Anahtar :timeAgo Önce Güncellendi',
+    'user_api_token_delete' => 'Anahtarı Sil',
+    'user_api_token_delete_warning' => 'Bu işlem \':tokenName\' adındaki API anahtarını sistemden tamamen silecektir.',
+    'user_api_token_delete_confirm' => 'Bu API anahtarını silmek istediğinizden emin misiniz?',
+    'user_api_token_delete_success' => 'API anahtarı başarıyla silindi',
 
     //! If editing translations files directly please ignore this in all
     //! languages apart from en. Content will be auto-copied from en.
@@ -185,27 +186,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
-        'da' => 'Dansk',
+        'cs' => 'Česky',
+        'da' => 'Danca',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovence',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index a6291167356b3560b5e9a4100c08006e880c1004..f3aa299ed72ffcc103778a639ab3871e2c01c32c 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => 'Сторінку не знайдено',
     'sorry_page_not_found' => 'Вибачте, сторінку, яку ви шукали, не знайдено.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => 'Повернутися на головну',
     'error_occurred' => 'Виникла помилка',
     'app_down' => ':appName зараз недоступний',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
     'api_user_token_expired' => 'The authorization token used has expired',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index a41dc0d361b57280fd25ff022d1c52fbe5052785..daf8a56d578e2296a1bb8a1b15320732bd6c6887 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => 'Dansk',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
diff --git a/resources/lang/vi/activities.php b/resources/lang/vi/activities.php
new file mode 100644 (file)
index 0000000..19fae85
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Activity text strings.
+ * Is used for all the text within activity logs & notifications.
+ */
+return [
+
+    // Pages
+    'page_create'                 => 'đã tạo trang',
+    'page_create_notification'    => 'Trang đã được tạo thành công',
+    'page_update'                 => 'đã cập nhật trang',
+    'page_update_notification'    => 'Trang đã được cập nhật thành công',
+    'page_delete'                 => 'đã xóa trang',
+    'page_delete_notification'    => 'Trang đã được xóa thành công',
+    'page_restore'                => 'đã khôi phục trang',
+    'page_restore_notification'   => 'Trang đã được khôi phục thành công',
+    'page_move'                   => 'đã di chuyển trang',
+
+    // Chapters
+    'chapter_create'              => 'đã tạo chương',
+    'chapter_create_notification' => 'Chương đã được tạo thành công',
+    'chapter_update'              => 'đã cập nhật chương',
+    'chapter_update_notification' => 'Chương đã được cập nhật thành công',
+    'chapter_delete'              => 'đã xóa chương',
+    'chapter_delete_notification' => 'Chương đã được xóa thành công',
+    'chapter_move'                => 'đã di chuyển chương',
+
+    // Books
+    'book_create'                 => 'đã tạo sách',
+    'book_create_notification'    => 'Sách đã được tạo thành công',
+    'book_update'                 => 'đã cập nhật sách',
+    'book_update_notification'    => 'Sách đã được cập nhật thành công',
+    'book_delete'                 => 'đã xóa sách',
+    'book_delete_notification'    => 'Sách đã được xóa thành công',
+    'book_sort'                   => 'đã sắp xếp sách',
+    'book_sort_notification'      => 'Sách đã được sắp xếp lại thành công',
+
+    // Bookshelves
+    'bookshelf_create'            => 'đã tạo giá sách',
+    'bookshelf_create_notification'    => 'Giá sách đã được tạo thành công',
+    'bookshelf_update'                 => 'cập nhật giá sách',
+    'bookshelf_update_notification'    => 'Giá sách đã tạo thành công',
+    'bookshelf_delete'                 => 'đã xóa giá sách',
+    'bookshelf_delete_notification'    => 'Giá sách đã được xóa thành công',
+
+    // Other
+    'commented_on'                => 'đã bình luận về',
+];
diff --git a/resources/lang/vi/auth.php b/resources/lang/vi/auth.php
new file mode 100644 (file)
index 0000000..ef8c633
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Authentication Language Lines
+ * The following language lines are used during authentication for various
+ * messages that we need to display to the user.
+ */
+return [
+
+    'failed' => 'Thông tin đăng nhập này không khớp với dữ liệu của chúng tôi.',
+    'throttle' => 'Quá nhiều lần đăng nhập sai. Vui lòng thử lại sau :seconds giây.',
+
+    // Login & Register
+    'sign_up' => 'Đăng ký',
+    'log_in' => 'Đăng nhập',
+    'log_in_with' => 'Đăng nhập với :socialDriver',
+    'sign_up_with' => 'Đăng kí với :socialDriver',
+    'logout' => 'Đăng xuất',
+
+    'name' => 'Tên',
+    'username' => 'Tên đăng nhập',
+    'email' => 'Email',
+    'password' => 'Mật khẩu',
+    'password_confirm' => 'Xác nhận mật khẩu',
+    'password_hint' => 'Cần tối thiểu 7 kí tự',
+    'forgot_password' => 'Quên Mật khẩu?',
+    'remember_me' => 'Ghi nhớ đăng nhập',
+    'ldap_email_hint' => 'Vui lòng điền một địa chỉ email để sử dụng tài khoản này.',
+    'create_account' => 'Tạo Tài khoản',
+    'already_have_account' => 'Bạn đã có tài khoản?',
+    'dont_have_account' => 'Bạn không có tài khoản?',
+    'social_login' => 'Đăng nhập bằng MXH',
+    'social_registration' => 'Đăng kí bằng MXH',
+    'social_registration_text' => 'Đăng kí và đăng nhập bằng dịch vụ khác.',
+
+    'register_thanks' => 'Cảm ơn bạn đã đăng ký!',
+    'register_confirm' => 'Vui lòng kiểm tra email và bấm vào nút xác nhận để truy cập :appName.',
+    'registrations_disabled' => 'Việc đăng kí đang bị tắt',
+    'registration_email_domain_invalid' => 'Tên miền của email không có quyền truy cập tới ứng dụng này',
+    'register_success' => 'Cảm ơn bạn đã đăng kí! Bạn đã được xác nhận và đăng nhập.',
+
+
+    // Password Reset
+    'reset_password' => 'Đặt lại mật khẩu',
+    'reset_password_send_instructions' => 'Nhập email vào ô dưới đây và bạn sẽ nhận được một email với liên kết để đặt lại mật khẩu.',
+    'reset_password_send_button' => 'Gửi liên kết đặt lại mật khẩu',
+    'reset_password_sent_success' => 'Một liên kết đặt lại mật khẩu đã được gửi tới :email.',
+    'reset_password_success' => 'Mật khẩu đã được đặt lại thành công.',
+    'email_reset_subject' => 'Đặt lại mật khẩu của :appName',
+    'email_reset_text' => 'Bạn nhận được email này bởi vì chúng tôi nhận được một yêu cầu đặt lại mật khẩu cho tài khoản của bạn.',
+    'email_reset_not_requested' => 'Nếu bạn không yêu cầu đặt lại mật khẩu, không cần có bất cứ hành động nào khác.',
+
+
+    // Email Confirmation
+    'email_confirm_subject' => 'Xác nhận email trên :appName',
+    'email_confirm_greeting' => 'Cảm ơn bạn đã tham gia :appName!',
+    'email_confirm_text' => 'Xin hãy xác nhận địa chỉa email bằng cách bấm vào nút dưới đây:',
+    'email_confirm_action' => 'Xác nhận Email',
+    'email_confirm_send_error' => 'Email xác nhận cần gửi nhưng hệ thống đã không thể gửi được email. Liên hệ với quản trị viên để chắc chắn email được thiết lập đúng.',
+    'email_confirm_success' => 'Email của bạn đã được xác nhận!',
+    'email_confirm_resent' => 'Email xác nhận đã được gửi lại, Vui lòng kiểm tra hộp thư.',
+
+    'email_not_confirmed' => 'Địa chỉ email chưa được xác nhận',
+    'email_not_confirmed_text' => 'Địa chỉ email của bạn hiện vẫn chưa được xác nhận.',
+    'email_not_confirmed_click_link' => 'Vui lòng bấm vào liên kết trong mail được gửi trong thời gian ngắn ngay sau khi bạn đăng kí.',
+    'email_not_confirmed_resend' => 'Nếu bạn không tìm thấy email bạn có thể yêu cầu gửi lại email xác nhận bằng cách gửi mẫu dưới đây.',
+    'email_not_confirmed_resend_button' => 'Gửi lại email xác nhận',
+
+    // User Invite
+    'user_invite_email_subject' => 'Bạn được mời tham gia :appName!',
+    'user_invite_email_greeting' => 'Một tài khoản đã được tạo dành cho bạn trên :appName.',
+    'user_invite_email_text' => 'Bấm vào nút dưới đây để đặt lại mật khẩu tài khoản và lấy quyền truy cập:',
+    'user_invite_email_action' => 'Đặt mật khẩu tài khoản',
+    'user_invite_page_welcome' => 'Chào mừng đến với :appName!',
+    'user_invite_page_text' => 'Để hoàn tất tài khoản và lấy quyền truy cập bạn cần đặt mật khẩu để sử dụng cho các lần đăng nhập sắp tới tại :appName.',
+    'user_invite_page_confirm_button' => 'Xác nhận Mật khẩu',
+    'user_invite_success' => 'Mật khẩu đã được thiết lập, bạn có quyền truy cập đến :appName!'
+];
\ No newline at end of file
diff --git a/resources/lang/vi/common.php b/resources/lang/vi/common.php
new file mode 100644 (file)
index 0000000..777fb57
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Common elements found throughout many areas of BookStack.
+ */
+return [
+
+    // Buttons
+    'cancel' => 'Huỷ',
+    'confirm' => 'Xác nhận',
+    'back' => 'Quay lại',
+    'save' => 'Lưu',
+    'continue' => 'Tiếp tục',
+    'select' => 'Chọn',
+    'toggle_all' => 'Bật/tắt tất cả',
+    'more' => 'Thêm',
+
+    // Form Labels
+    'name' => 'Tên',
+    'description' => 'Mô tả',
+    'role' => 'Quyền',
+    'cover_image' => 'Ảnh bìa',
+    'cover_image_description' => 'Ảnh nên có kích thước 440x250px.',
+    
+    // Actions
+    'actions' => 'Hành động',
+    'view' => 'Xem',
+    'view_all' => 'Xem tất cả',
+    'create' => 'Tạo',
+    'update' => 'Cập nhật',
+    'edit' => 'Sửa',
+    'sort' => 'Sắp xếp',
+    'move' => 'Di chuyển',
+    'copy' => 'Sao chép',
+    'reply' => 'Trả lời',
+    'delete' => 'Xóa',
+    'search' => 'Tìm kiếm',
+    'search_clear' => 'Xoá tìm kiếm',
+    'reset' => 'Thiết lập lại',
+    'remove' => 'Xóa bỏ',
+    'add' => 'Thêm',
+    'fullscreen' => 'Toàn màn hình',
+
+    // Sort Options
+    'sort_options' => 'Tùy Chọn Sắp Xếp',
+    'sort_direction_toggle' => 'Đảo chiều sắp xếp',
+    'sort_ascending' => 'Sắp xếp tăng dần',
+    'sort_descending' => 'Sắp xếp giảm dần',
+    'sort_name' => 'Tên',
+    'sort_created_at' => 'Ngày Tạo',
+    'sort_updated_at' => 'Ngày cập nhật',
+
+    // Misc
+    'deleted_user' => 'Người dùng bị xóa',
+    'no_activity' => 'Không có hoạt động nào',
+    'no_items' => 'Không có mục nào khả dụng',
+    'back_to_top' => 'Lên đầu trang',
+    'toggle_details' => 'Bật/tắt chi tiết',
+    'toggle_thumbnails' => 'Bật/tắt ảnh ảnh nhỏ',
+    'details' => 'Chi tiết',
+    'grid_view' => 'Hiển thị dạng lưới',
+    'list_view' => 'Hiển thị dạng danh sách',
+    'default' => 'Mặc định',
+    'breadcrumb' => 'Đường dẫn liên kết',
+
+    // Header
+    'profile_menu' => 'Menu Hồ sơ',
+    'view_profile' => 'Xem Hồ sơ',
+    'edit_profile' => 'Sửa Hồ sơ',
+
+    // Layout tabs
+    'tab_info' => 'Thông tin',
+    'tab_content' => 'Nội dung',
+
+    // Email Content
+    'email_action_help' => 'Nếu bạn đang có vấn đề trong việc bấm nút ":actionText", sao chép và dán địa chỉ URL dưới đây vào trình duyệt web:',
+    'email_rights' => 'Bản quyền đã được bảo hộ',
+];
diff --git a/resources/lang/vi/components.php b/resources/lang/vi/components.php
new file mode 100644 (file)
index 0000000..c1a9b34
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'Chọn Ảnh',
+    'image_all' => 'Tất cả',
+    'image_all_title' => 'Xem tất cả các ảnh',
+    'image_book_title' => 'Xem các ảnh đã được tải lên sách này',
+    'image_page_title' => 'Xem các ảnh đã được tải lên trang này',
+    'image_search_hint' => 'Tìm kiếm ảnh bằng tên',
+    'image_uploaded' => 'Đã tải lên :uploadedDate',
+    'image_load_more' => 'Hiện thêm',
+    'image_image_name' => 'Tên Ảnh',
+    'image_delete_used' => 'Ảnh này được sử dụng trong các trang dưới đây.',
+    'image_delete_confirm' => 'Bấm nút xóa lần nữa để xác nhận bạn muốn xóa ảnh này.',
+    'image_select_image' => 'Chọn Ảnh',
+    'image_dropzone' => 'Thả các ảnh hoặc bấm vào đây để tải lên',
+    'images_deleted' => 'Các ảnh đã được xóa',
+    'image_preview' => 'Xem trước Ảnh',
+    'image_upload_success' => 'Ảnh đã tải lên thành công',
+    'image_update_success' => 'Chi tiết ảnh được cập nhật thành công',
+    'image_delete_success' => 'Ảnh đã được xóa thành công',
+    'image_upload_remove' => 'Xóa bỏ',
+
+    // Code Editor
+    'code_editor' => 'Sửa Mã',
+    'code_language' => 'Ngôn ngữ Mã',
+    'code_content' => 'Nội dung Mã',
+    'code_save' => 'Lưu Mã',
+];
diff --git a/resources/lang/vi/entities.php b/resources/lang/vi/entities.php
new file mode 100644 (file)
index 0000000..31fbaaf
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'Được tạo gần đây',
+    'recently_created_pages' => 'Trang được tạo gần đây',
+    'recently_updated_pages' => 'Trang được cập nhật gần đây',
+    'recently_created_chapters' => 'Chương được tạo gần đây',
+    'recently_created_books' => 'Sách được tạo gần đây',
+    'recently_created_shelves' => 'Giá sách được tạo gần đây',
+    'recently_update' => 'Được cập nhật gần đây',
+    'recently_viewed' => 'Được xem gần đây',
+    'recent_activity' => 'Hoạt động gần đây',
+    'create_now' => 'Tạo ngay',
+    'revisions' => 'Phiên bản',
+    'meta_revision' => 'Phiên bản #:revisionCount',
+    'meta_created' => 'Được tạo :timeLength',
+    'meta_created_name' => 'Được tạo :timeLength bởi :user',
+    'meta_updated' => 'Được cập nhật :timeLength',
+    'meta_updated_name' => 'Được cập nhật :timeLength bởi :user',
+    'entity_select' => 'Chọn thực thể',
+    'images' => 'Ảnh',
+    'my_recent_drafts' => 'Bản nháp gần đây của tôi',
+    'my_recently_viewed' => 'Xem gần đây',
+    'no_pages_viewed' => 'Bạn chưa xem bất cứ trang nào',
+    'no_pages_recently_created' => 'Không có trang nào được tạo gần đây',
+    'no_pages_recently_updated' => 'Không có trang nào được cập nhật gần đây',
+    'export' => 'Kết xuất',
+    'export_html' => 'Đang chứa tệp tin Web',
+    'export_pdf' => 'Tệp PDF',
+    'export_text' => 'Tệp văn bản thuần túy',
+
+    // Permissions and restrictions
+    'permissions' => 'Quyền',
+    'permissions_intro' => 'Một khi được bật, các quyền này sẽ được ưu tiên trên hết tất cả các quyền hạn khác.',
+    'permissions_enable' => 'Bật quyền hạn tùy chỉnh',
+    'permissions_save' => 'Lưu quyền hạn',
+
+    // Search
+    'search_results' => 'Kết quả Tìm kiếm',
+    'search_total_results_found' => 'Tìm thấy :count kết quả|:count tổng kết quả',
+    'search_clear' => 'Xoá tìm kiếm',
+    'search_no_pages' => 'Không trang nào khớp với tìm kiếm này',
+    'search_for_term' => 'Tìm kiếm cho :term',
+    'search_more' => 'Thêm kết quả',
+    'search_filters' => 'Bộ lọc Tìm kiếm',
+    'search_content_type' => 'Kiểu Nội dung',
+    'search_exact_matches' => 'Hoàn toàn trùng khớp',
+    'search_tags' => 'Tìm kiếm Tag',
+    'search_options' => 'Tuỳ chọn',
+    'search_viewed_by_me' => 'Được xem bởi tôi',
+    'search_not_viewed_by_me' => 'Không được xem bởi tôi',
+    'search_permissions_set' => 'Phân quyền',
+    'search_created_by_me' => 'Được tạo bởi tôi',
+    'search_updated_by_me' => 'Được cập nhật bởi tôi',
+    'search_date_options' => 'Tùy chọn ngày',
+    'search_updated_before' => 'Đã được cập nhật trước đó',
+    'search_updated_after' => 'Đã được cập nhật sau',
+    'search_created_before' => 'Đã được tạo trước',
+    'search_created_after' => 'Đã được tạo sau',
+    'search_set_date' => 'Đặt ngày',
+    'search_update' => 'Cập nhật tìm kiếm',
+
+    // Shelves
+    'shelf' => 'Giá',
+    'shelves' => 'Giá',
+    'x_shelves' => ':count Giá |:count Giá',
+    'shelves_long' => 'Giá sách',
+    'shelves_empty' => 'Không có giá nào được tạo',
+    'shelves_create' => 'Tạo Giá mới',
+    'shelves_popular' => 'Các Giá phổ biến',
+    'shelves_new' => 'Các Giá mới',
+    'shelves_new_action' => 'Giá mới',
+    'shelves_popular_empty' => 'Các giá phổ biến sẽ xuất hiện ở đây.',
+    'shelves_new_empty' => 'Các Giá được tạo gần đây sẽ xuất hiện ở đây.',
+    'shelves_save' => 'Lưu Giá',
+    'shelves_books' => 'Sách trên Giá này',
+    'shelves_add_books' => 'Thêm sách vào Giá này',
+    'shelves_drag_books' => 'Kéo sách vào đây để thêm vào giá',
+    'shelves_empty_contents' => 'Giá này không có sách nào',
+    'shelves_edit_and_assign' => 'Chỉnh sửa kệ để gán sách',
+    'shelves_edit_named' => 'Chỉnh sửa kệ sách :name',
+    'shelves_edit' => 'Chỉnh sửa kệ sách',
+    'shelves_delete' => 'Xóa kệ sách',
+    'shelves_delete_named' => 'Xóa kệ sách :name',
+    'shelves_delete_explain' => "Chức năng này sẽ xóa kệ sách với tên ':name'. Các sách chứa trong nó sẽ không bị xóa.",
+    'shelves_delete_confirmation' => 'Bạn có chắc chắn muốn xóa kệ sách này?',
+    'shelves_permissions' => 'Các quyền đối với kệ sách',
+    'shelves_permissions_updated' => 'Các quyền với kệ sách đã được cập nhật',
+    'shelves_permissions_active' => 'Đang bật các quyền hạn từ Kệ sách',
+    'shelves_copy_permissions_to_books' => 'Sao chép các quyền cho sách',
+    'shelves_copy_permissions' => 'Sao chép các quyền',
+    'shelves_copy_permissions_explain' => 'Điều này sẽ áp dụng các cài đặt quyền của giá sách hiện tại với tất cả các cuốn sách bên trong. Trước khi kích hoạt, đảm bảo bất cứ thay đổi liên quan đến quyền của giá sách này đã được lưu.',
+    'shelves_copy_permission_success' => 'Các quyền của giá sách đã được sao chép tới :count quyển sách',
+
+    // Books
+    'book' => 'Sách',
+    'books' => 'Tất cả sách',
+    'x_books' => ':count Sách|:count Tất cả sách',
+    'books_empty' => 'Không có cuốn sách nào được tạo',
+    'books_popular' => 'Những cuốn sách phổ biến',
+    'books_recent' => 'Những cuốn sách gần đây',
+    'books_new' => 'Những cuốn sách mới',
+    'books_new_action' => 'Sách mới',
+    'books_popular_empty' => 'Những cuốn sách phổ biến nhất sẽ xuất hiện ở đây.',
+    'books_new_empty' => 'Những cuốn sách tạo gần đây sẽ được xuất hiện ở đây.',
+    'books_create' => 'Tạo cuốn sách mới',
+    'books_delete' => 'Xóa sách',
+    'books_delete_named' => 'Xóa sách :bookName',
+    'books_delete_explain' => 'Điều này sẽ xóa cuốn sách với tên \':bookName\'. Tất cả các trang và các chương sẽ bị xóa.',
+    'books_delete_confirmation' => 'Bạn có chắc chắn muốn xóa cuốn sách này?',
+    'books_edit' => 'Sửa sách',
+    'books_edit_named' => 'Sửa sách :bookName',
+    'books_form_book_name' => 'Tên sách',
+    'books_save' => 'Lưu sách',
+    'books_permissions' => 'Các quyền của cuốn sách',
+    'books_permissions_updated' => 'Các quyền của cuốn sách đã được cập nhật',
+    'books_empty_contents' => 'Không có trang hay chương nào được tạo cho cuốn sách này.',
+    'books_empty_create_page' => 'Tao một trang mới',
+    'books_empty_sort_current_book' => 'Sắp xếp cuốn sách này',
+    'books_empty_add_chapter' => 'Thêm một chương mới',
+    'books_permissions_active' => 'Đang bật các quyền hạn từ Sách',
+    'books_search_this' => 'Tìm cuốn sách này',
+    'books_navigation' => 'Điều hướng cuốn sách',
+    'books_sort' => 'Sắp xếp nội dung cuốn sách',
+    'books_sort_named' => 'Sắp xếp sách :bookName',
+    'books_sort_name' => 'Sắp xếp theo tên',
+    'books_sort_created' => 'Sắp xếp theo ngày tạo',
+    'books_sort_updated' => 'Sắp xếp theo ngày cập nhật',
+    'books_sort_chapters_first' => 'Các Chương đầu',
+    'books_sort_chapters_last' => 'Các Chương cuối',
+    'books_sort_show_other' => 'Hiển thị các Sách khác',
+    'books_sort_save' => 'Lưu thứ tự mới',
+
+    // Chapters
+    'chapter' => 'Chương',
+    'chapters' => 'Các chương',
+    'x_chapters' => ':count Chương|:count Chương',
+    'chapters_popular' => 'Các Chương phổ biến',
+    'chapters_new' => 'Chương mới',
+    'chapters_create' => 'Tạo Chương mới',
+    'chapters_delete' => 'Xóa Chương',
+    'chapters_delete_named' => 'Xóa Chương :chapterName',
+    'chapters_delete_explain' => 'Chức năng này sẽ xóa chương với tên \':chapterName\'. Tất cả các trang sẽ bị loại bỏ và thêm trực tiếp vào sách chứa nó.',
+    'chapters_delete_confirm' => 'Bạn có chắc chắn muốn xóa chương này?',
+    'chapters_edit' => 'Sửa Chương',
+    'chapters_edit_named' => 'Sửa chương :chapterName',
+    'chapters_save' => 'Lưu Chương',
+    'chapters_move' => 'Di chuyển Chương',
+    'chapters_move_named' => 'Di chuyển Chương :chapterName',
+    'chapter_move_success' => 'Chương được di chuyển đến :bookName',
+    'chapters_permissions' => 'Quyền hạn Chương',
+    'chapters_empty' => 'Không có trang nào hiện có trong chương này.',
+    'chapters_permissions_active' => 'Đang bật các quyền hạn từ Chương',
+    'chapters_permissions_success' => 'Quyền hạn Chương được cập nhật',
+    'chapters_search_this' => 'Tìm kiếm trong Chương này',
+
+    // Pages
+    'page' => 'Trang',
+    'pages' => 'Các trang',
+    'x_pages' => ':count Trang|:count Trang',
+    'pages_popular' => 'Các Trang phổ biến',
+    'pages_new' => 'Trang Mới',
+    'pages_attachments' => 'Các đính kèm',
+    'pages_navigation' => 'Điều hướng Trang',
+    'pages_delete' => 'Xóa Trang',
+    'pages_delete_named' => 'Xóa Trang :pageName',
+    'pages_delete_draft_named' => 'Xóa Trang Nháp :pageName',
+    'pages_delete_draft' => 'Xóa Trang Nháp',
+    'pages_delete_success' => 'Đã xóa Trang',
+    'pages_delete_draft_success' => 'Đã xóa trang Nháp',
+    'pages_delete_confirm' => 'Bạn có chắc chắn muốn xóa trang này?',
+    'pages_delete_draft_confirm' => 'Bạn có chắc chắn muốn xóa trang nháp này?',
+    'pages_editing_named' => 'Đang chỉnh sửa Trang :pageName',
+    'pages_edit_draft_options' => 'Tùy chọn bản nháp',
+    'pages_edit_save_draft' => 'Lưu Nháp',
+    'pages_edit_draft' => 'Sửa trang nháp',
+    'pages_editing_draft' => 'Đang chỉnh sửa Nháp',
+    'pages_editing_page' => 'Đang chỉnh sửa Trang',
+    'pages_edit_draft_save_at' => 'Bản nháp đã lưu lúc ',
+    'pages_edit_delete_draft' => 'Xóa Bản nháp',
+    'pages_edit_discard_draft' => 'Hủy bỏ Bản nháp',
+    'pages_edit_set_changelog' => 'Đặt Changelog',
+    'pages_edit_enter_changelog_desc' => 'Viết mô tả ngắn gọn cho các thay đổi mà bạn tạo',
+    'pages_edit_enter_changelog' => 'Viết Changelog',
+    'pages_save' => 'Lưu Trang',
+    'pages_title' => 'Tiêu đề Trang',
+    'pages_name' => 'Tên Trang',
+    'pages_md_editor' => 'Trình chỉnh sửa',
+    'pages_md_preview' => 'Xem trước',
+    'pages_md_insert_image' => 'Chèn hình ảnh',
+    'pages_md_insert_link' => 'Chèn liên kết thực thể',
+    'pages_md_insert_drawing' => 'Chèn bản vẽ',
+    'pages_not_in_chapter' => 'Trang không nằm trong một chương',
+    'pages_move' => 'Di chuyển Trang',
+    'pages_move_success' => 'Trang đã chuyển tới ":parentName"',
+    'pages_copy' => 'Sao chép Trang',
+    'pages_copy_desination' => 'Sao lưu đến',
+    'pages_copy_success' => 'Trang được sao chép thành công',
+    'pages_permissions' => 'Quyền hạn Trang',
+    'pages_permissions_success' => 'Quyền hạn Trang được cập nhật',
+    'pages_revision' => 'Phiên bản',
+    'pages_revisions' => 'Phiên bản Trang',
+    'pages_revisions_named' => 'Phiên bản Trang cho :pageName',
+    'pages_revision_named' => 'Phiên bản Trang cho :pageName',
+    'pages_revisions_created_by' => 'Tạo bởi',
+    'pages_revisions_date' => 'Ngày của Phiên bản',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'Phiên bản #:id',
+    'pages_revisions_numbered_changes' => 'Các thay đổi của phiên bản #:id',
+    'pages_revisions_changelog' => 'Nhật ký thay đổi',
+    'pages_revisions_changes' => 'Các thay đổi',
+    'pages_revisions_current' => 'Phiên bản hiện tại',
+    'pages_revisions_preview' => 'Xem trước',
+    'pages_revisions_restore' => 'Khôi phục',
+    'pages_revisions_none' => 'Trang này không có phiên bản nào',
+    'pages_copy_link' => 'Sao chép Liên kết',
+    'pages_edit_content_link' => 'Soạn thảo Nội dung',
+    'pages_permissions_active' => 'Đang bật các quyền hạn từ Trang',
+    'pages_initial_revision' => 'Đăng bài mở đầu',
+    'pages_initial_name' => 'Trang mới',
+    'pages_editing_draft_notification' => 'Bạn hiện đang chỉnh sửa một bản nháp được lưu cách đây :timeDiff.',
+    'pages_draft_edited_notification' => 'Trang này đã được cập nhật từ lúc đó. Bạn nên loại bỏ bản nháp này.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count người dùng đang bắt đầu chỉnh sửa trang này',
+        'start_b' => ':userName đang bắt đầu chỉnh sửa trang này',
+        'time_a' => 'kể từ khi thang được cập nhật lần cuối',
+        'time_b' => 'trong :minCount phút cuối',
+        'message' => ':start :time. Hãy cẩn thận đừng ghi đè vào các bản cập nhật của nhau!',
+    ],
+    'pages_draft_discarded' => 'Bản nháp đã được loại bỏ, Người sửa đã cập nhật trang với nội dung hiện tại',
+    'pages_specific' => 'Trang cụ thể',
+    'pages_is_template' => 'Biểu mẫu trang',
+
+    // Editor Sidebar
+    'page_tags' => 'Các Thẻ Trang',
+    'chapter_tags' => 'Các Thẻ Chương',
+    'book_tags' => 'Các Thẻ Sách',
+    'shelf_tags' => 'Các Thẻ Kệ',
+    'tag' => 'Nhãn',
+    'tags' =>  'Các Thẻ',
+    'tag_name' =>  'Tên Nhãn',
+    'tag_value' => 'Giá trị Thẻ (Tùy chọn)',
+    'tags_explain' => "Thêm vài thẻ để phân loại nội dung của bạn tốt hơn. \n Bạn có thể đặt giá trị cho thẻ để quản lí kĩ càng hơn.",
+    'tags_add' => 'Thêm thẻ khác',
+    'tags_remove' => 'Xóa thẻ này',
+    'attachments' => 'Các Đính kèm',
+    'attachments_explain' => 'Cập nhật một số tập tin và đính một số liên kết để hiển thị trên trang của bạn. Chúng được hiện trong sidebar của trang.',
+    'attachments_explain_instant_save' => 'Các thay đổi ở đây sẽ được lưu ngay lập tức.',
+    'attachments_items' => 'Đính kèm các Mục',
+    'attachments_upload' => 'Tải lên Tập tin',
+    'attachments_link' => 'Đính kèm Liên kết',
+    'attachments_set_link' => 'Đặt Liên kết',
+    'attachments_delete_confirm' => 'Bấm xóa lần nữa để xác nhận bạn muốn xóa đính kèm này.',
+    'attachments_dropzone' => 'Thả các tập tin hoặc bấm vào đây để đính kèm một tập tin',
+    'attachments_no_files' => 'Không có tập tin nào được tải lên',
+    'attachments_explain_link' => 'Bạn có thể đính kèm một liên kết nếu bạn lựa chọn không tải lên tập tin. Liên kết này có thể trỏ đến một trang khác hoặc một tập tin ở trên mạng (đám mây).',
+    'attachments_link_name' => 'Tên Liên kết',
+    'attachment_link' => 'Liên kết đính kèm',
+    'attachments_link_url' => 'Liên kết đến tập tin',
+    'attachments_link_url_hint' => 'URL của trang hoặc tập tin',
+    'attach' => 'Đính kèm',
+    'attachments_edit_file' => 'Sửa tập tin',
+    'attachments_edit_file_name' => 'Tên tệp tin',
+    'attachments_edit_drop_upload' => 'Thả tập tin hoặc bấm vào đây để tải lên và ghi đè',
+    'attachments_order_updated' => 'Đã cập nhật thứ tự đính kèm',
+    'attachments_updated_success' => 'Đã cập nhật chi tiết đính kèm',
+    'attachments_deleted' => 'Đính kèm đã được xóa',
+    'attachments_file_uploaded' => 'Tập tin tải lên thành công',
+    'attachments_file_updated' => 'Tập tin cập nhật thành công',
+    'attachments_link_attached' => 'Liên kết được đính kèm đến trang thành công',
+    'templates' => 'Các Mẫu',
+    'templates_set_as_template' => 'Trang là một mẫu',
+    'templates_explain_set_as_template' => 'Bạn có thể đặt trang này làm mẫu, nội dung của nó sẽ được sử dụng lại khi tạo các trang mới. Người dùng khác có thể sử dụng mẫu này nếu học có quyền hạn xem trang này.',
+    'templates_replace_content' => 'Thay thế nội dung trang',
+    'templates_append_content' => 'Viết vào nội dung trang',
+    'templates_prepend_content' => 'Thêm vào đầu nội dung trang',
+
+    // Profile View
+    'profile_user_for_x' => 'Đã là người dùng trong :time',
+    'profile_created_content' => 'Đã tạo nội dung',
+    'profile_not_created_pages' => ':userName chưa tạo bất kỳ trang nào',
+    'profile_not_created_chapters' => ':userName chưa tạo bất kì chương nào',
+    'profile_not_created_books' => ':userName chưa tạo bất cứ sách nào',
+    'profile_not_created_shelves' => ':userName chưa tạo bất kỳ giá sách nào',
+
+    // Comments
+    'comment' => 'Bình luận',
+    'comments' => 'Các bình luận',
+    'comment_add' => 'Thêm bình luận',
+    'comment_placeholder' => 'Đăng bình luận tại đây',
+    'comment_count' => '{0} Không có bình luận|{1} 1 Bình luận|[2,*] :count Bình luận',
+    'comment_save' => 'Lưu bình luận',
+    'comment_saving' => 'Đang lưu bình luận...',
+    'comment_deleting' => 'Đang xóa bình luận...',
+    'comment_new' => 'Bình luận mới',
+    'comment_created' => 'đã bình luận :createDiff',
+    'comment_updated' => 'Đã cập nhật :updateDiff bởi :username',
+    'comment_deleted_success' => 'Bình luận đã bị xóa',
+    'comment_created_success' => 'Đã thêm bình luận',
+    'comment_updated_success' => 'Bình luận đã được cập nhật',
+    'comment_delete_confirm' => 'Bạn có chắc bạn muốn xóa bình luận này?',
+    'comment_in_reply_to' => 'Trả lời cho :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'Bạn có chắc bạn muốn xóa phiên bản này?',
+    'revision_restore_confirm' => 'Bạn có chắc bạn muốn khôi phục phiên bản này? Nội dung trang hiện tại sẽ được thay thế.',
+    'revision_delete_success' => 'Phiên bản đã được xóa',
+    'revision_cannot_delete_latest' => 'Không thể xóa phiên bản mới nhất.'
+];
\ No newline at end of file
diff --git a/resources/lang/vi/errors.php b/resources/lang/vi/errors.php
new file mode 100644 (file)
index 0000000..e93f74e
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Text shown in error messaging.
+ */
+return [
+
+    // Permissions
+    'permission' => 'Bạn không có quyền truy cập đến trang này.',
+    'permissionJson' => 'Bạn không có quyền để thực hiện hành động này.',
+
+    // Auth
+    'error_user_exists_different_creds' => 'Đã có người sử dụng email :email nhưng với thông tin định danh khác.',
+    'email_already_confirmed' => 'Email đã được xác nhận trước đó, Đang đăng nhập.',
+    'email_confirmation_invalid' => 'Token xác nhận này không hợp lệ hoặc đã được sử dụng trước đó, Xin hãy thử đăng ký lại.',
+    'email_confirmation_expired' => 'Token xác nhận đã hết hạn, Một email xác nhận mới đã được gửi.',
+    'email_confirmation_awaiting' => 'Địa chỉ email của tài khoản bạn đang sử dụng cần phải được xác nhận',
+    'ldap_fail_anonymous' => 'Truy cập đến LDAP sử dụng gán ẩn danh thất bại',
+    'ldap_fail_authed' => 'Truy cập đến LDAP sử dụng dn và mật khẩu thất bại',
+    'ldap_extension_not_installed' => 'Tiện ích mở rộng LDAP PHP chưa được cài đặt',
+    'ldap_cannot_connect' => 'Không thể kết nối đến máy chủ LDAP, mở đầu kết nối thất bại',
+    'saml_already_logged_in' => 'Đã đăng nhập',
+    'saml_user_not_registered' => 'Người dùng :name chưa được đăng ký và tự động đăng ký đang bị tắt',
+    'saml_no_email_address' => 'Không tìm thấy địa chỉ email cho người dùng này trong dữ liệu được cung cấp bới hệ thống xác thực ngoài',
+    'saml_invalid_response_id' => 'Yêu cầu từ hệ thống xác thực bên ngoài không được nhận diện bởi quy trình chạy cho ứng dụng này. Điều hướng trở lại sau khi đăng nhập có thể đã gây ra vấn đề này.',
+    'saml_fail_authed' => 'Đăng nhập sử dụng :system thất bại, hệ thống không cung cấp được sự xác thực thành công',
+    'social_no_action_defined' => 'Không có hành động được xác định',
+    'social_login_bad_response' => "Xảy ra lỗi trong lúc đăng nhập :socialAccount: \n:error",
+    'social_account_in_use' => 'Tài khoản :socialAccount này đang được sử dụng, Vui lòng thử đăng nhập bằng tùy chọn :socialAccount.',
+    'social_account_email_in_use' => 'Địa chỉ email :email đã được sử dụng. Nếu bạn đã có tài khoản bạn có thể kết nối đến tài khoản :socialAccount của mình từ cài đặt cá nhân của bạn.',
+    'social_account_existing' => ':socialAccount đã được gắn với hồ sơ của bạn từ trước.',
+    'social_account_already_used_existing' => 'Tài khoản :socialAccount đã được sử dụng bởi một người dùng khác.',
+    'social_account_not_used' => 'Tài khoản :socialAccount này chưa được liên kết bởi bất cứ người dùng nào. Vui lòng liên kết nó tại cài đặt cá nhân của bạn. ',
+    'social_account_register_instructions' => 'Nếu bạn chưa có tài khoản, Bạn có thể đăng ký một tài khoản bằng tùy chọn :socialAccount.',
+    'social_driver_not_found' => 'Không tìm thấy driver cho MXH',
+    'social_driver_not_configured' => 'Cài đặt MXH :socialAccount của bạn đang không được cấu hình hợp lệ.',
+    'invite_token_expired' => 'Liên kết mời này đã hết hạn. Bạn có thể thử đặt lại mật khẩu của tài khoản.',
+
+    // System
+    'path_not_writable' => 'Đường dẫn tệp tin :filePath không thể tải đến được. Đảm bảo rằng đường dẫn này có thể ghi được ở trên máy chủ.',
+    'cannot_get_image_from_url' => 'Không thể lấy ảnh từ :url',
+    'cannot_create_thumbs' => 'Máy chủ không thể tạo ảnh nhỏ. Vui lòng kiểm tra bạn đã cài đặt tiện ích mở rộng GD PHP.',
+    'server_upload_limit' => 'Máy chủ không cho phép tải lên kích thước này. Vui lòng thử lại với tệp tin nhỏ hơn.',
+    'uploaded'  => 'Máy chủ không cho phép tải lên kích thước này. Vui lòng thử lại với tệp tin nhỏ hơn.',
+    'image_upload_error' => 'Đã xảy ra lỗi khi đang tải lên ảnh',
+    'image_upload_type_error' => 'Ảnh đang được tải lên không hợp lệ',
+    'file_upload_timeout' => 'Đã quá thời gian tải lên tệp tin.',
+
+    // Attachments
+    'attachment_page_mismatch' => 'Trang không trùng khớp khi cập nhật đính kèm',
+    'attachment_not_found' => 'Không tìm thấy đính kèm',
+
+    // Pages
+    'page_draft_autosave_fail' => 'Lưu bản nháp thất bại. Đảm bảo rằng bạn có kết nối đến internet trước khi lưu trang này',
+    'page_custom_home_deletion' => 'Không thể xóa trang khi nó đang được đặt là trang chủ',
+
+    // Entities
+    'entity_not_found' => 'Không tìm thấy thực thể',
+    'bookshelf_not_found' => 'Không tìm thấy giá sách',
+    'book_not_found' => 'Không tìm thấy sách',
+    'page_not_found' => 'Không tìm thấy trang',
+    'chapter_not_found' => 'Không tìm thấy chương',
+    'selected_book_not_found' => 'Không tìm thấy sách được chọn',
+    'selected_book_chapter_not_found' => 'Không tìm thấy Sách hoặc Chương được chọn',
+    'guests_cannot_save_drafts' => 'Khách không thể lưu bản nháp',
+
+    // Users
+    'users_cannot_delete_only_admin' => 'Bạn không thể xóa quản trị viên duy nhất',
+    'users_cannot_delete_guest' => 'Bạn không thể xóa người dùng khách',
+
+    // Roles
+    'role_cannot_be_edited' => 'Không thể chỉnh sửa quyền này',
+    'role_system_cannot_be_deleted' => 'Quyền này là quyền hệ thống và không thể bị xóa',
+    'role_registration_default_cannot_delete' => 'Quyền này không thể bị xóa trong khi đang đặt là quyền mặc định khi đăng ký',
+    'role_cannot_remove_only_admin' => 'Người dùng này là người dùng duy nhất được chỉ định quyền quản trị viên. Gán quyền quản trị viên cho người dùng khác trước khi thử xóa người dùng này.',
+
+    // Comments
+    'comment_list' => 'Đã có lỗi xảy ra khi tải bình luận.',
+    'cannot_add_comment_to_draft' => 'Bạn không thể thêm bình luận vào bản nháp.',
+    'comment_add' => 'Đã xảy ra lỗi khi thêm / sửa bình luận.',
+    'comment_delete' => 'Đã xảy ra lỗi khi xóa bình luận.',
+    'empty_comment' => 'Không thể thêm bình luận bị bỏ trống.',
+
+    // Error pages
+    '404_page_not_found' => 'Không Tìm Thấy Trang',
+    'sorry_page_not_found' => 'Xin lỗi, Không tìm thấy trang bạn đang tìm kiếm.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
+    'return_home' => 'Quay lại trang chủ',
+    'error_occurred' => 'Đã xảy ra lỗi',
+    'app_down' => ':appName hiện đang ngoại tuyến',
+    'back_soon' => 'Nó sẽ sớm hoạt động trở lại.',
+
+    // API errors
+    'api_no_authorization_found' => 'Không tìm thấy token ủy quyền trong yêu cầu',
+    'api_bad_authorization_format' => 'Đã tìm thấy một token ủy quyền trong yêu cầu nhưng định dạng hiển thị không hợp lệ',
+    'api_user_token_not_found' => 'Không tìm thấy token API nào khớp với token ủy quyền được cung cấp',
+    'api_incorrect_token_secret' => 'Mã bí mật được cung cấp cho token API đang được sử dụng không hợp lệ',
+    'api_user_no_api_permission' => 'Chủ của token API đang sử dụng không có quyền gọi API',
+    'api_user_token_expired' => 'Token sử dụng cho việc ủy quyền đã hết hạn',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Lỗi khi gửi email thử:',
+
+];
diff --git a/resources/lang/vi/pagination.php b/resources/lang/vi/pagination.php
new file mode 100644 (file)
index 0000000..cb3a0a5
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; Trước',
+    'next'     => 'Tiếp &raquo;',
+
+];
diff --git a/resources/lang/vi/passwords.php b/resources/lang/vi/passwords.php
new file mode 100644 (file)
index 0000000..d972961
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Password Reminder Language Lines
+ * The following language lines are the default lines which match reasons
+ * that are given by the password broker for a password update attempt has failed.
+ */
+return [
+
+    'password' => 'Mật khẩu phải có tối thiểu 8 ký tự và và phải trùng với mật khẩu xác nhận.',
+    'user' => "Chúng tôi không tìm thấy người dùng với địa chỉ email đó.",
+    'token' => 'Token đặt lại mật khẩu không hợp lệ.',
+    'sent' => 'Chúng tôi đã gửi email chứa liên kết đặt lại mật khẩu cho bạn!',
+    'reset' => 'Mật khẩu của bạn đã được đặt lại!',
+
+];
diff --git a/resources/lang/vi/settings.php b/resources/lang/vi/settings.php
new file mode 100644 (file)
index 0000000..8886acd
--- /dev/null
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Settings text strings
+ * Contains all text strings used in the general settings sections of BookStack
+ * including users and roles.
+ */
+return [
+
+    // Common Messages
+    'settings' => 'Cài đặt',
+    'settings_save' => 'Lưu Cài đặt',
+    'settings_save_success' => 'Đã lưu cài đặt',
+
+    // App Settings
+    'app_customization' => 'Tuỳ biến',
+    'app_features_security' => 'Chức năng & Bảo mật',
+    'app_name' => 'Tên Ứng dụng',
+    'app_name_desc' => 'Tên này được hiển thị trong header và trong bất kì email hệ thống được gửi.',
+    'app_name_header' => 'Hiển thị tên trong header',
+    'app_public_access' => 'Quyền truy cập công khai',
+    'app_public_access_desc' => 'Bật tùy chọn này sẽ cho phép khách, người không cần đăng nhập, truy cập đến nội dung bản BookStack của bạn.',
+    'app_public_access_desc_guest' => 'Quyền truy cập của khách có thể được điều khiển thông qua người dùng "Guest".',
+    'app_public_access_toggle' => 'Cho phép truy cập công khai',
+    'app_public_viewing' => 'Cho phép xem công khai?',
+    'app_secure_images' => 'Bảo mật tốt hơn cho việc tải lên ảnh',
+    'app_secure_images_toggle' => 'Bật bảo mật tốt hơn cho các ảnh được tải lên',
+    'app_secure_images_desc' => 'Vì lí do hiệu năng, tất cả các ảnh đều được truy cập công khai. Tùy chọn này thêm một chuỗi ngẫu nhiên, khó đoán vào phần liên kết đến ảnh. Đảm bảo rằng tránh việc index thư mục để ngăn chặn việc truy cập đến ảnh một cách dễ dàng.',
+    'app_editor' => 'Soạn thảo Trang',
+    'app_editor_desc' => 'Chọn trình soạn thảo nào sẽ được sử dụng bởi tất cả người dùng để chỉnh sửa trang.',
+    'app_custom_html' => 'Tùy chọn nội dung Head HTML',
+    'app_custom_html_desc' => 'Bất cứ nội dung nào được thêm vào đây sẽ được đưa vào phần cuối của khu vực <head> của mỗi trang. Tiện cho việc ghi đè style hoặc thêm mã phân tích dữ liệu.',
+    'app_custom_html_disabled_notice' => 'Nội dung tùy biến HTML head bị tắt tại trang cài đặt này để đảm bảo mọi thay đổi làm hỏng hệ thống có để được khôi phục.',
+    'app_logo' => 'Logo Ứng dụng',
+    'app_logo_desc' => 'Ảnh này nên có kích thước chiều cao là 43px. <br>Ảnh lớn sẽ được điều chỉnh tỷ lệ xuống.',
+    'app_primary_color' => 'Màu chủ đạo của Ứng dụng',
+    'app_primary_color_desc' => 'Đặt màu chủ đạo của ứng dụng kể cả banner, các nút và các đường dẫn liên kết.',
+    'app_homepage' => 'Trang chủ Ứng dụng',
+    'app_homepage_desc' => 'Chọn hiển thị để hiện tại trang chủ thay cho hiển thị mặc định. Quyền cho trang được bỏ qua cho các trang được chọn.',
+    'app_homepage_select' => 'Chọn một trang',
+    'app_disable_comments' => 'Tắt bình luận',
+    'app_disable_comments_toggle' => 'Tắt bình luận',
+    'app_disable_comments_desc' => 'Tắt các bình luận trên tất cả các trang của ứng dụng. <br> Các bình luận đã tồn tại sẽ không được hiển thị.',
+
+    // Color settings
+    'content_colors' => 'Màu của phần Nội dung',
+    'content_colors_desc' => 'Đặt màu cho tất cả các thành phần trong trang theo sự tổ chức kế thừa. Việc chọn màu sắc với cùng độ sáng với màu mặc định là được khuyến nghị giúp cho việc đọc thuận lợi.',
+    'bookshelf_color' => 'Màu Giá sách',
+    'book_color' => 'Màu Sách',
+    'chapter_color' => 'Màu Chương',
+    'page_color' => 'Màu Trang',
+    'page_draft_color' => 'Màu Trang Nháp',
+
+    // Registration Settings
+    'reg_settings' => 'Đăng ký',
+    'reg_enable' => 'Bật Đăng ký',
+    'reg_enable_toggle' => 'Bật đăng ký',
+    'reg_enable_desc' => 'Khi đăng ký được bật người dùng sẽ có thể tự đăng ký để trở thành người dùng của ứng dụng. Khi đăng kí người dùng sẽ được cấp một quyền sử dụng mặc định.',
+    'reg_default_role' => 'Quyền người dùng sử dụng mặc định sau khi đăng kí',
+    'reg_enable_external_warning' => 'Tùy chọn trên bị bỏ qua khi xác thực từ bên ngoài LDAP hoặc SAML được bật. Tài khoản người dùng chưa phải là thành viên sẽ được tự động tạo nếu xác thực với hệ thống bên ngoài thành công.',
+    'reg_email_confirmation' => 'Xác nhận Email',
+    'reg_email_confirmation_toggle' => 'Yêu cầu xác nhận email',
+    'reg_confirm_email_desc' => 'Nếu giới hạn tên miền được sử dụng, xác nhận email là bắt buộc và tùy chọn này sẽ bị bỏ qua.',
+    'reg_confirm_restrict_domain' => 'Giới hạn tên miền',
+    'reg_confirm_restrict_domain_desc' => 'Điền dấu phẩy ngăn cách danh sách các tên miền email dành cho việc bạn muốn giới hạn đăng nhập. Người dùng sẽ nhận được email xác nhận địa chỉ của họ trước khi được phép tương tác với ứng dụng. <br> Lưu ý rằng người dùng có thể thay đổi địa chỉ email của họ sau khi đăng ký thành công.',
+    'reg_confirm_restrict_domain_placeholder' => 'Không có giới hạn nào được thiết lập',
+
+    // Maintenance settings
+    'maint' => 'Bảo trì',
+    'maint_image_cleanup' => 'Dọn dẹp ảnh',
+    'maint_image_cleanup_desc' => "Quét nội dung trang và phiên bản để kiểm tra xem các ảnh và hình vẽ nào đang được sử dụng và ảnh nào dư thừa. Đảm bảo rằng bạn đã tạo bản sao lưu toàn dữ liệu và ảnh trước khi chạy chức năng này.",
+    'maint_image_cleanup_ignore_revisions' => 'Bỏ qua ảnh trong phiên bản chỉnh sửa',
+    'maint_image_cleanup_run' => 'Chạy Dọn dẹp',
+    'maint_image_cleanup_warning' => 'Đã tìm thấy :count ảnh có thể không được sử dụng. Bạn muốn chắc rằng muốn xóa các ảnh này?',
+    'maint_image_cleanup_success' => ':count ảnh có thể không được sử dụng đã được tìm thấy và xóa!',
+    'maint_image_cleanup_nothing_found' => 'Không tìm thấy ảnh nào không được xử dụng, Không có gì để xóa!',
+    'maint_send_test_email' => 'Gửi một email thử',
+    'maint_send_test_email_desc' => 'Chức năng này gửi một email thử đến địa chỉ email bạn chỉ định trong hồ sơ của mình.',
+    'maint_send_test_email_run' => 'Gửi email thử',
+    'maint_send_test_email_success' => 'Email đã được gửi đến :address',
+    'maint_send_test_email_mail_subject' => 'Thử Email',
+    'maint_send_test_email_mail_greeting' => 'Chức năng gửi email có vẻ đã hoạt động!',
+    'maint_send_test_email_mail_text' => 'Chúc mừng! Khi bạn nhận được email thông báo này, cài đặt email của bạn có vẻ đã được cấu hình đúng.',
+
+    // Role Settings
+    'roles' => 'Quyền',
+    'role_user_roles' => 'Quyền người dùng',
+    'role_create' => 'Tạo quyền mới',
+    'role_create_success' => 'Quyền mới đã được tạo thành công',
+    'role_delete' => 'Xóa quyền',
+    'role_delete_confirm' => 'Chức năng này sẽ xóa quyền với tên \':roleName\'.',
+    'role_delete_users_assigned' => 'Quyền này có :userCount người dùng được gán. Nếu bạn muốn di dời các người dùng từ quyền này hãy chọn một quyền mới bên dưới.',
+    'role_delete_no_migration' => "Không di dời các người dùng",
+    'role_delete_sure' => 'Bạn có chắc rằng muốn xóa quyền này?',
+    'role_delete_success' => 'Quyền đã được xóa thành công',
+    'role_edit' => 'Sửa quyền',
+    'role_details' => 'Thông tin chi tiết Quyền',
+    'role_name' => 'Tên quyền',
+    'role_desc' => 'Thông tin vắn tắt của Quyền',
+    'role_external_auth_id' => 'Mã của xác thực ngoài',
+    'role_system' => 'Quyền Hệ thống',
+    'role_manage_users' => 'Quản lý người dùng',
+    'role_manage_roles' => 'Quản lý quyền và chức năng quyền',
+    'role_manage_entity_permissions' => 'Quản lý tất cả quyền của các sách, chương & trang',
+    'role_manage_own_entity_permissions' => 'Quản lý quyền trên sách, chương & trang bạn tạo ra',
+    'role_manage_page_templates' => 'Quản lý các mẫu trang',
+    'role_access_api' => 'Truy cập đến API hệ thống',
+    'role_manage_settings' => 'Quản lý cài đặt của ứng dụng',
+    'role_asset' => 'Quyền tài sản (asset)',
+    'role_asset_desc' => 'Các quyền này điều khiển truy cập mặc định tới tài sản (asset) nằm trong hệ thống. Quyền tại Sách, Chường và Trang se ghi đè các quyền này.',
+    'role_asset_admins' => 'Quản trị viên được tự động cấp quyền truy cập đến toàn bộ nội dung, tuy nhiên các tùy chọn đó có thể hiện hoặc ẩn tùy chọn giao diện.',
+    'role_all' => 'Tất cả',
+    'role_own' => 'Sở hữu',
+    'role_controlled_by_asset' => 'Kiểm soát các tài sản (asset) người dùng tải lên',
+    'role_save' => 'Lưu Quyền',
+    'role_update_success' => 'Quyền đã được cập nhật thành công',
+    'role_users' => 'Người dùng được gán quyền này',
+    'role_users_none' => 'Không có người dùng nào hiện được gán quyền này',
+
+    // Users
+    'users' => 'Người dùng',
+    'user_profile' => 'Hồ sơ người dùng',
+    'users_add_new' => 'Thêm người dùng mới',
+    'users_search' => 'Tìm kiếm người dùng',
+    'users_details' => 'Chi tiết người dùng',
+    'users_details_desc' => 'Hiển thị tên và địa chỉ email cho người dùng này. Địa chỉ email sẽ được sử dụng để đăng nhập vào ứng dụng.',
+    'users_details_desc_no_email' => 'Đặt tên cho người dùng này để giúp người dùng khác nhận ra họ.',
+    'users_role' => 'Quyền người dùng',
+    'users_role_desc' => 'Chọn quyền mà người dùng sẽ được gán. Nếu người dùng được gán nhiều quyền, các quyền hạn sẽ ghi đè lên nhau và họ sẽ nhận được tất cả các quyền hạn từ quyền được gán.',
+    'users_password' => 'Mật khẩu người dùng',
+    'users_password_desc' => 'Đặt mật khẩu dùng để đăng nhập ứng dụng. Nó phải có độ dài tối thiểu 6 ký tự.',
+    'users_send_invite_text' => 'Bạn có thể chọn để gửi cho người dùng này một email mời, giúp họ có thể tự đặt mật khẩu cho chính họ. Nếu không bạn có thể đặt mật khẩu cho họ.',
+    'users_send_invite_option' => 'Gửi email mời người dùng',
+    'users_external_auth_id' => 'Mã của xác thực ngoài',
+    'users_external_auth_id_desc' => 'Đây là mã được sử dụng để xác thực với người dùng này khi giao tiếp với hệ thống xác thực bên ngoài.',
+    'users_password_warning' => 'Chỉ điền ô bên dưới nếu bạn muốn thay đổi mật khẩu.',
+    'users_system_public' => 'Người dùng này đại diện cho bất kỳ khách nào thăm trang của bạn. Nó được tự động gán và không thể dùng để đăng nhập.',
+    'users_delete' => 'Xóa Người dùng',
+    'users_delete_named' => 'Xóa người dùng :userName',
+    'users_delete_warning' => 'Chức năng này sẽ hoàn toàn xóa người dùng với tên \':userName\' từ hệ thống.',
+    'users_delete_confirm' => 'Bạn có chắc muốn xóa người dùng này không?',
+    'users_delete_success' => 'Người dùng đã được xóa thành công',
+    'users_edit' => 'Sửa người dùng',
+    'users_edit_profile' => 'Sửa Hồ sơ',
+    'users_edit_success' => 'Người dùng được cập nhật thành công',
+    'users_avatar' => 'Ảnh đại diện',
+    'users_avatar_desc' => 'Chọn ảnh đê đại hiện cho người dùng này. Ảnh nên có kích cỡ hình vuông 256px.',
+    'users_preferred_language' => 'Ngôn ngữ ưu tiên',
+    'users_preferred_language_desc' => 'Tùy chọn này sẽ thay đổi ngôn ngư sử dụng cho giao diện người dùng của ứng dụng. Nó sẽ không ảnh hưởng đến bất cứ nội dung nào người dùng tạo ra.',
+    'users_social_accounts' => 'Tài khoản MXH',
+    'users_social_accounts_info' => 'Bạn có thể kết nối đến các tài khoản khác để đăng nhập nhanh chóng và dễ dàng. Ngắt kết nối đến một tài khoản ở đây không thu hồi việc ủy quyền truy cập trước đó. Thu hồi truy cập của các tài khoản kết nối MXH từ trang cài đặt hồ sở của bạn.',
+    'users_social_connect' => 'Kết nối tài khoản',
+    'users_social_disconnect' => 'Ngắt kết nối tài khoản',
+    'users_social_connected' => 'Tài khoản :socialAccount đã được liên kết với hồ sơ của bạn thành công.',
+    'users_social_disconnected' => 'Tài khoản :socialAccount đã được ngắt kết nối khỏi hồ sơ của bạn thành công.',
+    'users_api_tokens' => 'Các Token API',
+    'users_api_tokens_none' => 'Khong có Token API nào được tạo cho người dùng này',
+    'users_api_tokens_create' => 'Tạo Token',
+    'users_api_tokens_expires' => 'Hết hạn',
+    'users_api_tokens_docs' => 'Tài liệu API',
+
+    // API Tokens
+    'user_api_token_create' => 'Tạo Token API',
+    'user_api_token_name' => 'Tên',
+    'user_api_token_name_desc' => 'Đặt cho token của bạn một tên dễ đọc để nhắc nhở mục đích sử dụng của nó trong tương lai.',
+    'user_api_token_expiry' => 'Ngày hết hạn',
+    'user_api_token_expiry_desc' => 'Đặt một ngày hết hạn cho token này. Sau ngày này, các yêu cầu được tạo khi sử dụng token này sẽ không còn hoạt động. Để trống trường này sẽ đặt ngày hết hạn sau 100 năm tới.',
+    'user_api_token_create_secret_message' => 'Ngay sau khi tạo token này một "Mã Token" & "Mật khẩu Token" sẽ được tạo và hiển thị. Mật khẩu sẽ chỉ được hiện một lần duy nhất nên hãy chắc rằng bạn sao lưu giá trị của nó ở nơi an toàn và bảo mật trước khi tiếp tục.',
+    'user_api_token_create_success' => 'Token API đã được tạo thành công',
+    'user_api_token_update_success' => 'Token API đã được cập nhật thành công',
+    'user_api_token' => 'Token API',
+    'user_api_token_id' => 'Mã Token',
+    'user_api_token_id_desc' => 'Đây là hệ thống sinh ra định danh không thể chỉnh sửa cho token này, thứ mà sẽ cần phải cung cấp khi yêu cầu API.',
+    'user_api_token_secret' => 'Mật khẩu Token',
+    'user_api_token_secret_desc' => 'Đây là mật khẩu được hệ thống tạo ra cho token để phục vụ cho các yêu cầu API này. Nó sẽ chỉ được hiển thị một lần duy nhất nên hãy sao lưu nó vào nơi nào đó an toàn và bảo mật.',
+    'user_api_token_created' => 'Token được tạo :timeAgo',
+    'user_api_token_updated' => 'Token được cập nhật :timeAgo',
+    'user_api_token_delete' => 'Xóa Token',
+    'user_api_token_delete_warning' => 'Chức năng này sẽ hoàn toàn xóa token API với tên \':tokenName\' từ hệ thống.',
+    'user_api_token_delete_confirm' => 'Bạn có chắc rằng muốn xóa token API này?',
+    'user_api_token_delete_success' => 'Token API đã được xóa thành công',
+
+    //! If editing translations files directly please ignore this in all
+    //! languages apart from en. Content will be auto-copied from en.
+    //!////////////////////////////////
+    'language_select' => [
+        'en' => 'English',
+        'ar' => 'العربية',
+        'cs' => 'Česky',
+        'da' => 'Đan Mạch',
+        'de' => 'Deutsch (Sie)',
+        'de_informal' => 'Deutsch (Du)',
+        'es' => 'Español',
+        'es_AR' => 'Español Argentina',
+        'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
+        'nl' => 'Nederlands',
+        'pl' => 'Polski',
+        'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
+        'sk' => 'Slovensky',
+        'sl' => 'Slovenščina',
+        'sv' => 'Svenska',
+        'tr' => 'Türkçe',
+        'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
+        'zh_CN' => '简体中文',
+        'zh_TW' => '繁體中文',
+    ]
+    //!////////////////////////////////
+];
diff --git a/resources/lang/vi/validation.php b/resources/lang/vi/validation.php
new file mode 100644 (file)
index 0000000..0308854
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => ':attribute phải được chấp nhận.',
+    'active_url'           => ':attribute không phải là một đường dẫn hợp lệ.',
+    'after'                => ':attribute phải là một ngày sau :date.',
+    'alpha'                => ':attribute chỉ được chứa chữ cái.',
+    'alpha_dash'           => ':attribute chỉ được chứa chữ cái, chữ số, gạch nối và gạch dưới.',
+    'alpha_num'            => ':attribute chỉ được chứa chữ cái hoặc chữ số.',
+    'array'                => ':attribute phải là một mảng.',
+    'before'               => ':attribute phải là một ngày trước :date.',
+    'between'              => [
+        'numeric' => ':attribute phải nằm trong khoảng :min đến :max.',
+        'file'    => ':attribute phải nằm trong khoảng :min đến :max KB.',
+        'string'  => ':attribute phải trong khoảng :min đến :max ký tự.',
+        'array'   => ':attribute phải nằm trong khoảng :min đến :max mục.',
+    ],
+    'boolean'              => 'Trường :attribute phải có giá trị đúng hoặc sai.',
+    'confirmed'            => 'Xác nhận :attribute không khớp.',
+    'date'                 => ':attribute không phải là ngày hợp lệ.',
+    'date_format'          => ':attribute không khớp với định dạng :format.',
+    'different'            => ':attribute và :other phải khác nhau.',
+    'digits'               => ':attribute phải có :digits chữ số.',
+    'digits_between'       => ':attribute phải có từ :min đến :max chữ số.',
+    'email'                => ':attribute phải là địa chỉ email hợp lệ.',
+    'ends_with' => ':attribute phải kết thúc bằng một trong các ký tự: :values',
+    'filled'               => 'Trường :attribute là bắt buộc.',
+    'gt'                   => [
+        'numeric' => ':attribute phải lớn hơn :value.',
+        'file'    => ':attribute phải lớn hơn :value KB.',
+        'string'  => ':attribute phải có nhiều hơn :value ký tự.',
+        'array'   => ':attribute phải có nhiều hơn :value mục.',
+    ],
+    'gte'                  => [
+        'numeric' => ':attribute phải lớn hơn hoặc bằng :value.',
+        'file'    => ':attribute phải lớn hơn hoặc bằng :value KB.',
+        'string'  => ':attribute phải có nhiều hơn hoặc bằng :value ký tự.',
+        'array'   => ':attribute phải có :value mục trở lên.',
+    ],
+    'exists'               => ':attribute đã chọn không hợp lệ.',
+    'image'                => ':attribute phải là ảnh.',
+    'image_extension'      => ':attribute phải có định dạng ảnh hợp lệ và được hỗ trợ.',
+    'in'                   => ':attribute đã chọn không hợp lệ.',
+    'integer'              => ':attribute phải là một số nguyên.',
+    'ip'                   => ':attribute phải là một địa chỉ IP hợp lệ.',
+    'ipv4'                 => ':attribute phải là địa chỉ IPv4 hợp lệ.',
+    'ipv6'                 => ':attribute phải là địa chỉ IPv6 hợp lệ.',
+    'json'                 => ':attribute phải là một chuỗi JSON hợp lệ.',
+    'lt'                   => [
+        'numeric' => ':attribute phải nhỏ hơn :value.',
+        'file'    => ':attribute phải nhỏ hơn :value KB.',
+        'string'  => ':attribute phải có it hơn :value ký tự.',
+        'array'   => ':attribute phải có ít hơn :value mục.',
+    ],
+    'lte'                  => [
+        'numeric' => ':attribute phải nhỏ hơn hoặc bằng :value.',
+        'file'    => ':attribute phải nhỏ hơn hoặc bằng :value KB.',
+        'string'  => ':attribute phải có ít hơn hoặc bằng :value ký tự.',
+        'array'   => ':attribute không được có nhiều hơn :value mục.',
+    ],
+    'max'                  => [
+        'numeric' => ':attribute không được lớn hơn :max.',
+        'file'    => ':attribute không được lớn hơn :max KB.',
+        'string'  => ':attribute không được nhiều hơn :max ký tự.',
+        'array'   => ':attribute không thể có nhiều hơn :max mục.',
+    ],
+    'mimes'                => ':attribute phải là tệp tin có kiểu: :values.',
+    'min'                  => [
+        'numeric' => ':attribute phải tối thiểu là :min.',
+        'file'    => ':attribute phải tối thiểu là :min KB.',
+        'string'  => ':attribute phải có tối thiểu :min ký tự.',
+        'array'   => ':attribute phải có tối thiểu :min mục.',
+    ],
+    'no_double_extension'  => ':attribute chỉ được có một định dạng mở rộng duy nhất.',
+    'not_in'               => ':attribute đã chọn không hợp lệ.',
+    'not_regex'            => 'Định dạng của :attribute không hợp lệ.',
+    'numeric'              => ':attribute phải là một số.',
+    'regex'                => 'Định dạng của :attribute không hợp lệ.',
+    'required'             => 'Trường :attribute là bắt buộc.',
+    'required_if'          => 'Trường :attribute là bắt buộc khi :other là :value.',
+    'required_with'        => 'Trường :attribute là bắt buộc khi :values tồn tại.',
+    'required_with_all'    => 'Trường :attribute là bắt buộc khi :values tồn tại.',
+    'required_without'     => 'Trường :attribute là bắt buộc khi :values không tồn tại.',
+    'required_without_all' => 'Trường :attribute là bắt buộc khi không có bất cứ :values nào tồn tại.',
+    'same'                 => ':attribute và :other phải trùng khớp với nhau.',
+    'size'                 => [
+        'numeric' => ':attribute phải có cỡ :size.',
+        'file'    => ':attribute phải có cỡ :size KB.',
+        'string'  => ':attribute phải có :size ký tự.',
+        'array'   => ':attribute phải chứa :size mục.',
+    ],
+    'string'               => ':attribute phải là một chuỗi.',
+    'timezone'             => ':attribute phải là một khu vực hợp lệ.',
+    'unique'               => ':attribute đã có người sử dụng.',
+    'url'                  => 'Định dạng của :attribute không hợp lệ.',
+    'uploaded'             => 'Tệp tin đã không được tải lên. Máy chủ không chấp nhận các tệp tin với dung lượng lớn như tệp tin trên.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'Bắt buộc xác nhận mật khẩu',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index 465592b6f90c22e4ee573ea1a5edffd7aa556b2f..21034f3991359f681c6a4cb13c87e9b50476ac61 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => '无法找到页面',
     'sorry_page_not_found' => '对不起,无法找到您想访问的页面。',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => '返回主页',
     'error_occurred' => '出现错误',
     'app_down' => ':appName现在正在关闭',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => '使用过的 API 令牌的所有者没有进行API 调用的权限',
     'api_user_token_expired' => '所使用的身份令牌已过期',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => '发送测试电子邮件时出现错误:',
+
 ];
index 0b936c8c0b5e1cdc35ede669917ecdbb600cb4ae..bc01ff7ab9cf3e64ebca1af90e8f093d02c4257d 100755 (executable)
@@ -56,7 +56,7 @@ return [
     'reg_enable_toggle' => '启用注册',
     'reg_enable_desc' => '启用注册后,用户将可以自己注册为站点用户。 注册后,他们将获得一个默认的单一用户角色。',
     'reg_default_role' => '注册后的默认用户角色',
-    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_enable_external_warning' => '当启用外部LDAP或者SAML认证时,上面的选项会被忽略。当使用外部系统认证认证成功时,将自动创建非现有会员的用户账户。',
     'reg_email_confirmation' => '邮箱确认n',
     'reg_email_confirmation_toggle' => '需要电子邮件确认',
     'reg_confirm_email_desc' => '如果使用域名限制,则需要Email验证,并且该值将被忽略。',
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => '丹麦',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index e71575e595ada089933a6f1e91e79b35c970b7bf..f44f7eb8be52031867aada69174e08f35af40023 100644 (file)
@@ -83,6 +83,7 @@ return [
     // Error pages
     '404_page_not_found' => '無法找到頁面',
     'sorry_page_not_found' => '對不起,無法找到您想進入的頁面。',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
     'return_home' => '返回首頁',
     'error_occurred' => '發生錯誤',
     'app_down' => ':appName現在正在關閉',
@@ -96,4 +97,7 @@ return [
     'api_user_no_api_permission' => '使用的API令牌的擁有者者無權進行API調用',
     'api_user_token_expired' => '授權令牌已過期',
 
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
 ];
index 061e7ad588920d52bda604ef1103f2644264d348..02c11e5deb7c49886238f1c78dd5029972835073 100644 (file)
@@ -185,27 +185,29 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
+        'cs' => 'Česky',
         'da' => '丹麥',
         'de' => 'Deutsch (Sie)',
         'de_informal' => 'Deutsch (Du)',
         'es' => 'Español',
         'es_AR' => 'Español Argentina',
         'fr' => 'Français',
+        'hu' => 'Magyar',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
         'nl' => 'Nederlands',
+        'pl' => 'Polski',
         'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
         'sk' => 'Slovensky',
-        'cs' => 'Česky',
+        'sl' => 'Slovenščina',
         'sv' => 'Svenska',
-        'ko' => '한국어',
-        'ja' => '日本語',
-        'pl' => 'Polski',
-        'it' => 'Italian',
-        'ru' => 'Русский',
+        'tr' => 'Türkçe',
         'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
         'zh_CN' => '简体中文',
         'zh_TW' => '繁體中文',
-        'hu' => 'Magyar',
-        'tr' => 'Türkçe',
     ]
     //!////////////////////////////////
 ];
index ff344158f81c547c027ef55f8d370d529679e923..d02d25db4baa127018365b945ac1febe58381417 100644 (file)
@@ -3,7 +3,7 @@
  * Callouts
  */
 .callout {
-  border-left: 3px solid #BBB;
+  border-inline-start: 3px solid #BBB;
   background-color: #EEE;
   padding: $-s $-s $-s $-xl;
   display: block;
       background-color: #EEE;
     }
     .svg-icon {
-      margin-right: 0px;
+      margin-inline-end: 0px;
     }
   }
   > div .outline input {
 
 .content-wrap.card {
   padding: $-m $-xxl;
-  margin-left: auto;
-  margin-right: auto;
+  margin-inline-start: auto;
+  margin-inline-end: auto;
   margin-bottom: $-xl;
   overflow: initial;
   min-height: 60vh;
 .tag-item {
   display: inline-flex;
   margin-bottom: $-xs;
-  margin-right: $-xs;
+  margin-inline-end: $-xs;
   border-radius: 4px;
   border: 1px solid #CCC;
   overflow: hidden;
     fill: #888;
   }
   .tag-value {
-    border-left: 1px solid #DDD;
+    border-inline-start: 1px solid #DDD;
     background-color: rgba(255, 255, 255, 0.5);
   }
 }
index e3d9e17cad825beec15792dac617ce3914c45d9b..7df1d61a47668c1927f12eea2112f81eb4c015a8 100644 (file)
@@ -66,7 +66,7 @@ button {
 }
 
 .button + .button {
-  margin-left: $-s;
+  margin-inline-start: $-s;
 }
 
 .button.small {
@@ -99,26 +99,28 @@ button {
 
 .button.block {
   width: 100%;
-  text-align: left;
+  text-align: start;
   display: block;
 }
 
 .button.icon {
   .svg-icon {
-    margin-right: 0;
+    margin-inline-end: 0;
   }
 }
 
 .button.svg {
+  display: flex;
+  align-items: center;
+  padding: $-s $-m;
+  padding-bottom: ($-s - 2px);
   svg {
     display: inline-block;
-    position: absolute;
-    left: $-m;
-    top: $-s - 2px;
     width: 24px;
     height: 24px;
+    bottom: auto;
+    margin-inline-end: $-m;
   }
-  padding: $-s $-m ($-s - 2px) ($-m*2 + 24px);
 }
 
 .button[disabled] {
index 6ef53b7193d60825627fc194765d73eabb5e5499..f4ed45c2c9400dc6b6cd879dfc31dbb87f40b900 100644 (file)
@@ -7,7 +7,7 @@
   padding: $-m $-l;
   background-color: #FFF;
   border-radius: 4px;
-  border-left: 6px solid currentColor;
+  border-inline-start: 6px solid currentColor;
   box-shadow: $bs-large;
   z-index: 999999;
   cursor: pointer;
@@ -26,7 +26,7 @@
   svg {
     width: 2.8rem;
     height: 2.8rem;
-    padding-right: $-s;
+    padding-inline-end: $-s;
     fill: currentColor;
   }
   .dismiss {
@@ -63,7 +63,7 @@
   transition: all ease-in-out 180ms;
   user-select: none;
   svg[data-icon="caret-right"] {
-    margin-right: 0;
+    margin-inline-end: 0;
     font-size: 1rem;
     transition: all ease-in-out 180ms;
     transform: rotate(0deg);
@@ -73,7 +73,7 @@
     transform: rotate(90deg);
   }
   svg[data-icon="caret-right"] + * {
-    margin-left: $-xs;
+    margin-inline-start: $-xs;
   }
 }
 
@@ -243,7 +243,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
   width: 300px;
   overflow-y: auto;
   overflow-x: hidden;
-  border-left: 1px solid #DDD;
+  border-inline-start: 1px solid #DDD;
   .inner {
     padding: $-m;
   }
@@ -477,7 +477,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
   display: block;
   top: 50%;
   left: 50%;
-  margin-left: -27px;
+  margin-inline-start: -27px;
   margin-top: -35px;
 }
 
@@ -511,7 +511,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
   top: 50%;
   margin-top: -8px;
   width: 80px;
-  margin-left: -40px;
+  margin-inline-start: -40px;
   background: rgba(255, 255, 255, 0.9);
   transform: scale(1);
   border-radius: 8px;
@@ -568,14 +568,14 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
   left: 44px;
   width: 0;
   height: 0;
-  border-left: 6px solid transparent;
-  border-right: 6px solid transparent;
+  border-inline-start: 6px solid transparent;
+  border-inline-end: 6px solid transparent;
   border-bottom: 6px solid $negative;
 }
 
 
 .tab-container .nav-tabs {
-  text-align: left;
+  text-align: start;
   border-bottom: 1px solid #DDD;
   margin-bottom: $-m;
   .tab-item {
@@ -613,7 +613,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
   max-width: 480px;
   margin-bottom: $-s;
   a {
-    margin-right: $-xs;
+    margin-inline-end: $-xs;
     text-decoration: underline;
   }
 }
@@ -659,7 +659,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
     }
     a { color: #666; }
     span {
-      padding-left: $-xxs;
+      padding-inline-start: $-xxs;
     }
   }
   .text-muted {
@@ -692,7 +692,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
     height: 100%;
     display: flex;
     flex-direction: column;
-    border-left: 1px solid #DDD;
+    border-inline-start: 1px solid #DDD;
   }
   .template-item-actions button {
     cursor: pointer;
index da0f7ef4c191be13f4989186ffe03e208f95ca57..f306a717b3608225ef15daf3f992c4e2c7491054 100644 (file)
 }
 
 .markdown-display {
-  margin-left: -1px;
+  margin-inline-start: -1px;
 }
 
 .markdown-editor-display {
   background-color: #FFFFFF;
   body {
     background-color: #FFFFFF;
-    padding-left: 16px;
-    padding-right: 16px;
+    padding-inline-start: 16px;
+    pmargin-inline-end: 16px;
   }
   [drawio-diagram]:hover {
     outline: 2px solid var(--color-primary);
@@ -155,12 +155,12 @@ label.radio, label.checkbox {
   font-weight: 400;
   user-select: none;
   input[type="radio"], input[type="checkbox"] {
-    margin-right: $-xs;
+    margin-inline-end: $-xs;
   }
 }
 
 label.inline.checkbox {
-  margin-right: $-m;
+  margin-inline-end: $-m;
 }
 
 label + p.small {
@@ -288,12 +288,12 @@ input[type=color] {
   border: 1px solid #DDD;
   border-radius: 4px;
   .collapse-title {
-    margin-left: -$-m;
-    margin-right: -$-m;
+    margin-inline-start: -$-m;
+    margin-inline-end: -$-m;
     padding: $-s $-m;
     display: block;
     width: calc(100% + 32px);
-    text-align: left;
+    text-align: start;
   }
   .collapse-title, .collapse-title label {
     cursor: pointer;
@@ -306,7 +306,7 @@ input[type=color] {
   .collapse-title label:before {
     display: inline-block;
     content: '▸';
-    margin-right: $-m;
+    margin-inline-end: $-m;
     transition: all ease-in-out 400ms;
     transform: rotate(0);
   }
@@ -373,10 +373,14 @@ div[editor-type="markdown"] .title-input.page-title input[type="text"] {
     position: absolute;
     left: 8px;
     top: 9px;
+    @include rtl {
+      right: 8px;
+      left: auto;
+    }
   }
   input {
     display: block;
-    padding-left: $-l + 4px;
+    padding-inline-start: $-l + 4px;
     width: 300px;
     max-width: 100%;
   }
index 687ddd8d2259c83dcf0cb94530e7b34b7d5e9b9d..5503a0895d5c5ca6b83e4a08ca7357dc43589f2d 100644 (file)
@@ -34,8 +34,8 @@ header {
     fill: #FFF;
   }
   .dropdown-container {
-    padding-left: $-m;
-    padding-right: 0;
+    padding-inline-start: $-m;
+    padding-inline-end: 0;
   }
   .avatar, .user-name {
     display: inline-block;
@@ -53,7 +53,7 @@ header {
       vertical-align: top;
     }
     > span {
-      padding-left: $-xs;
+      padding-inline-start: $-xs;
       display: inline-block;
       padding-top: $-xxs;
     }
@@ -62,7 +62,7 @@ header {
       font-size: 18px;
     }
     @include between($l, $xl) {
-      padding-left: $-xs;
+      padding-inline-start: $-xs;
       .name {
         display: none;
       }
@@ -87,7 +87,7 @@ header .search-box {
     border-radius: 40px;
     color: #EEE;
     z-index: 2;
-    padding-left: 40px;
+    padding-inline-start: 40px;
     &:focus {
       outline: none;
       border: 1px solid rgba(255, 255, 255, 0.6);
@@ -97,8 +97,12 @@ header .search-box {
     fill: #EEE;
     z-index: 1;
     left: 16px;
+    @include rtl {
+      left: auto;
+      right: 16px;
+    }
     svg {
-      margin-right: 0;
+      margin-block-end: 0;
     }
   }
   ::-webkit-input-placeholder { /* Chrome/Opera/Safari */
@@ -124,12 +128,12 @@ header .search-box {
   font-size: 1.8em;
   color: #fff;
   font-weight: 400;
-  padding: 14px $-l 14px 0;
+  @include padding(14px, $-l, 14px, 0);
   vertical-align: top;
   line-height: 1;
 }
 .logo-image {
-  margin: $-xs $-s $-xs 0;
+  @include margin($-xs, $-s, $-xs, 0);
   vertical-align: top;
   height: 43px;
 }
@@ -151,8 +155,14 @@ header .search-box {
     margin: 0;
     bottom: -2px;
   }
+  @include rtl() {
+    left: $-m;
+    right: auto;
+  }
 }
 
+
+
 @include smaller-than($l) {
   header .header-links {
     display: none;
@@ -169,13 +179,13 @@ header .search-box {
     }
   }
   header .links a, header .dropdown-container ul li a {
-    text-align: left;
+    text-align: start;
     display: block;
     padding: $-s $-m;
     color: $text-dark;
     fill: $text-dark;
     svg {
-      margin-right: $-s;
+      margin-inline-end: $-s;
     }
     &:hover {
       background-color: #EEE;
@@ -186,7 +196,7 @@ header .search-box {
   }
   header .dropdown-container {
     display: block;
-    padding-left: 0;
+    padding-inline-start: 0;
   }
   header .links {
     display: block;
@@ -215,7 +225,7 @@ header .search-box {
   border-bottom: 3px solid #BBB;
   cursor: pointer;
   &:first-child {
-    border-right: 1px solid #DDD;
+    border-inline-end: 1px solid #DDD;
   }
   &.active {
     border-bottom-color: currentColor;
@@ -253,7 +263,7 @@ header .search-box {
       display: none;
     }
     > span:first-child {
-      margin-right: 0;
+      margin-block-end: 0;
     }
   }
 }
@@ -269,7 +279,7 @@ header .search-box {
     }
   }
   .svg-icon {
-    margin-right: 0;
+    margin-block-end: 0;
   }
 }
 
@@ -282,9 +292,17 @@ header .search-box {
   position: absolute;
   z-index: 80;
   right: -$-m;
+  @include rtl {
+    right: auto;
+    left: -$-m;
+  }
   .breadcrumb-listing-search .svg-icon {
     position: absolute;
     left: $-s;
+    @include rtl {
+      right: $-s;
+      left: auto;
+    }
     top: 11px;
     fill: #888;
     pointer-events: none;
@@ -292,10 +310,10 @@ header .search-box {
   .breadcrumb-listing-entity-list {
     max-height: 400px;
     overflow-y: scroll;
-    text-align: left;
+    text-align: start;
   }
   input {
-    padding-left: $-xl;
+    padding-inline-start: $-xl;
     border-radius: 0;
     border: 0;
     border-bottom: 1px solid #DDD;
@@ -337,25 +355,25 @@ header .search-box {
   display: inline-block;
   padding: $-xs $-s;
   &:last-child {
-    padding-right: 0;
+    padding-inline-end: 0;
   }
   &:first-child {
-    padding-left: 0;
+    padding-inline-start: 0;
   }
 }
 
 
 .action-buttons .dropdown-container:last-child a {
-  padding-right: 0;
-  padding-left: $-s;
+  padding-inline-end: 0;
+  padding-inline-start: $-s;
 }
 .action-buttons {
-  text-align: right;
+  text-align: end;
   &.text-left {
-    text-align: left;
+    text-align: start;
     .text-button {
-      padding-right: $-m;
-      padding-left: 0;
+      padding-inline-end: $-m;
+      padding-inline-start: 0;
     }
   }
   &.text-center {
@@ -368,6 +386,6 @@ header .search-box {
     padding: $-xs $-xs;
   }
   .action-buttons .dropdown-container:last-child a {
-    padding-left: $-xs;
+    padding-inline-start: $-xs;
   }
 }
\ No newline at end of file
index a280e4ed1f25514ad689b590dda7522d3aba2caa..197d5271b7d1017cf8c2293c494a46dbc392ac40 100644 (file)
@@ -4,10 +4,10 @@
  */
 .container {
   max-width: $xxl;
-  margin-left: auto;
-  margin-right: auto;
-  padding-left: $-m;
-  padding-right: $-m;
+  margin-inline-start: auto;
+  margin-inline-end: auto;
+  padding-inline-start: $-m;
+  padding-inline-end: $-m;
   &.small {
     max-width: 840px;
   }
@@ -198,8 +198,8 @@ body.flexbox {
  */
 .tri-layout-container {
   display: grid;
-  margin-left: $-xl;
-  margin-right: $-xl;
+  margin-inline-start: $-xl;
+  margin-inline-end: $-xl;
   grid-template-columns: 1fr 4fr 1fr;
   grid-template-areas: "a b c";
   grid-column-gap: $-xxl;
@@ -223,7 +223,7 @@ body.flexbox {
     ". b b";
     grid-template-columns: 1fr 3fr;
     grid-template-rows: min-content min-content 1fr;
-    padding-right: $-l;
+    padding-inline-end: $-l;
   }
 }
 @include between($l, $xxl) {
@@ -258,11 +258,11 @@ body.flexbox {
     grid-template-areas:  none;
     grid-template-columns: 1fr;
     grid-column-gap: 0;
-    padding-right: $-xs;
-    padding-left: $-xs;
+    padding-inline-end: $-xs;
+    padding-inline-start: $-xs;
     .tri-layout-left-contents, .tri-layout-right-contents {
-      padding-left: $-m;
-      padding-right: $-m;
+      padding-inline-start: $-m;
+      padding-inline-end: $-m;
     }
     .tri-layout-left > *, .tri-layout-right > * {
       display: none;
@@ -316,7 +316,7 @@ body.flexbox {
 
 @include smaller-than($m) {
   .tri-layout-container {
-    margin-left: 0;
-    margin-right: 0;
+    margin-inline-start: 0;
+    margin-inline-end: 0;
   }
 }
\ No newline at end of file
index 2e8fa257aebcf270e87bf438b00659ca85efcebd..7beb63d4e57b01ad1840a8425ba7e365ec4efb93 100644 (file)
@@ -6,7 +6,7 @@
     justify-self: stretch;
     align-self: stretch;
     height: auto;
-    margin-right: $-l;
+    margin-inline-end: $-l;
   }
   .icon:after {
     opacity: 0.5;
@@ -60,7 +60,7 @@
     border-radius: 0 4px 4px 0;
     padding: $-xs $-m;
     width: 100%;
-    text-align: left;
+    text-align: start;
   }
   .chapter-expansion-toggle:hover {
     background-color: rgba(0, 0, 0, 0.06);
 .sidebar-page-nav {
   $nav-indent: $-m;
   list-style: none;
-  margin: $-s 0 $-m $-xs;
+  @include margin($-s, 0, $-m, $-xs);
   position: relative;
   &:after {
     content: '';
     display: block;
     position: absolute;
     left: 0;
+    @include rtl {
+      left: auto;
+      right: 0;
+    }
     background-color: rgba(0, 0, 0, 0.2);
     width: 2px;
     top: 5px;
     position: relative;
   }
   .h1 {
-    padding-left: $nav-indent;
+    padding-inline-start: $nav-indent;
   }
   .h2 {
-    padding-left: $nav-indent * 1.5;
+    padding-inline-start: $nav-indent * 1.5;
   }
   .h3 {
-    padding-left: $nav-indent * 2;
+    padding-inline-start: $nav-indent * 2;
   }
   .h4 {
-    padding-left: $nav-indent * 2.5;
+    padding-inline-start: $nav-indent * 2.5;
   }
   .h5 {
-    padding-left: $nav-indent*3;
+    padding-inline-start: $nav-indent*3;
   }
   .h6 {
-    padding-left: $nav-indent*3.5;
+    padding-inline-start: $nav-indent*3.5;
   }
   .current-heading {
     font-weight: bold;
     border-radius: 50%;
     box-shadow: 0 0 0 6px #F2F2F2;
     z-index: 1;
+    @include rtl {
+      left: auto;
+      right: -2px;
+    }
   }
 }
 
 // Sidebar list
 .book-tree .sidebar-page-list  {
   list-style: none;
-  margin: $-xs -$-s 0 -$-s;
-  padding-left: 0;
-  padding-right: 0;
+  @include margin($-xs, -$-s, 0, -$-s);
+  padding-inline-start: 0;
+  padding-inline-end: 0;
   position: relative;
 
   &:after, .sub-menu:after {
     left: $-m;
     top: 1rem;
     bottom: 1rem;
-    border-left: 4px solid rgba(0, 0, 0, 0.1);
+    border-inline-start: 4px solid rgba(0, 0, 0, 0.1);
     z-index: 0;
+    @include rtl {
+      left: auto;
+      right: $-m;
+    }
   }
 
   ul {
     list-style: none;
-    padding-left: 1rem;
-    padding-right: 0;
+    padding-inline-start: 1rem;
+    padding-inline-end: 0;
   }
 
   .entity-list-item {
   }
   .entity-list-item.no-hover {
     margin-top: -$-xs;
-    padding-right: 0;
+    padding-inline-end: 0;
   }
   .entity-list-item-name {
     font-size: 1em;
   .chapter-child-menu {
     font-size: .8rem;
     margin-top: -.2rem;
-    margin-left: -1rem;
+    margin-inline-start: -1rem;
   }
   [chapter-toggle] {
-    padding-left: .7rem;
+    padding-inline-start: .7rem;
     padding-bottom: .2rem;
   }
   .entity-list-item .icon {
 .chapter-child-menu {
   ul.sub-menu {
     display: none;
-    padding-left: 0;
+    padding-inline-start: 0;
     position: relative;
   }
   [chapter-toggle].open + .sub-menu {
   justify-content: space-between;
 }
 .sort-box-options .button {
-  margin-left: 0;
+  margin-inline-start: 0;
 }
 .sortable-page-list {
-  margin-left: 0;
+  margin-inline-start: 0;
   padding: 0;
   .entity-list-item > span:first-child {
     align-self: flex-start;
     flex: 1;
   }
   > ul {
-    margin-left: 0;
+    margin-inline-start: 0;
   }
   ul {
     margin-bottom: $-m;
     margin-top: 0;
-    padding-left: $-m;
+    padding-inline-start: $-m;
   }
   li {
     border: 1px solid #DDD;
     min-height: 38px;
   }
   li.text-page, li.text-chapter {
-    border-left: 2px solid currentColor;
+    border-inline-start: 2px solid currentColor;
   }
   li:first-child {
     margin-top: $-xs;
@@ -320,7 +332,7 @@ ul.pagination {
   display: inline-block;
   list-style: none;
   margin: $-m 0;
-  padding-left: 1px;
+  padding-inline-start: 1px;
   li {
     float: left;
   }
@@ -338,7 +350,7 @@ ul.pagination {
     display: block;
     padding: $-xxs $-s;
     border: 1px solid #CCC;
-    margin-left: -1px;
+    margin-inline-start: -1px;
     user-select: none;
     &.disabled {
       cursor: not-allowed;
@@ -402,13 +414,13 @@ ul.pagination {
     color: #666;
   }
   > span:first-child {
-    margin-right: $-m;
+    margin-inline-end: $-m;
     flex-basis: 1.88em;
     flex: none;
   }
   > span:last-child {
     flex: 1;
-    text-align: left;
+    text-align: start;
   }
   &:not(.no-hover) {
     cursor: pointer;
@@ -438,7 +450,7 @@ ul.pagination {
   position: relative;
   top: 1px;
   svg {
-    margin-right: 0;
+    margin-inline-end: 0;
   }
 }
 
@@ -460,7 +472,7 @@ ul.pagination {
     text-overflow: ellipsis;
     height: 2.5em;
     overflow: hidden;
-    text-align: left;
+    text-align: start;
     display: block;
     white-space: nowrap;
   }
@@ -474,7 +486,7 @@ ul.pagination {
   background-position: 50% 50%;
   border-radius: 3px;
   position: relative;
-  margin-right: $-l;
+  margin-inline-end: $-l;
 
   &.entity-list-item-image-wide {
     width: 220px;
@@ -484,7 +496,7 @@ ul.pagination {
     color: #FFF;
     fill: #FFF;
     font-size: 1.66rem;
-    margin-right: 0;
+    margin-inline-end: 0;
     position: absolute;
     bottom: $-xs;
     left: $-xs;
@@ -550,7 +562,7 @@ ul.pagination {
   padding: $-xs 0;
   color: #555;
   fill: #555;
-  text-align: left !important;
+  text-align: start !important;
   &.wide {
     min-width: 220px;
   }
@@ -577,14 +589,14 @@ ul.pagination {
       outline-offset: -2px;
     }
     svg {
-      margin-right: $-s;
+      margin-inline-end: $-s;
       display: inline-block;
       width: 16px;
     }
   }
   button {
     width: 100%;
-    text-align: left;
+    text-align: start;
   }
   li.border-bottom {
     border-bottom: 1px solid #DDD;
@@ -615,7 +627,7 @@ ul.pagination {
     color: #FFF;
     fill: #FFF;
     font-size: 2rem;
-    margin-right: 0;
+    margin-inline-end: 0;
     position: absolute;
     bottom: 10px;
     left: 6px;
index 1c45ebd3080b92ff4f14ebce0f181e84dac71100..8a6becf6b70746131a0e54b05545b4bc288721f9 100644 (file)
@@ -8,3 +8,27 @@
 @mixin between($min, $max) {
   @media screen and (min-width: $min) and (max-width: $max) { @content; }
 }
+
+// Padding shorthand using logical operators to better support RTL.
+@mixin padding($t, $r, $b, $l) {
+  padding-block-start: $t;
+  padding-block-end: $b;
+  padding-inline-start: $l;
+  padding-inline-end: $r;
+}
+
+// Margin shorthand using logical operators to better support RTL.
+@mixin margin($t, $r, $b, $l) {
+  margin-block-start: $t;
+  margin-block-end: $b;
+  margin-inline-start: $l;
+  margin-inline-end: $r;
+}
+
+// Create a RTL specific style block.
+// Mostly used as a patch until browser support improves for logical properties.
+@mixin rtl() {
+  html[dir=rtl] & {
+    @content;
+  }
+}
\ No newline at end of file
index 9281a21946db4c75a6211cdf2ee20568640cd6b7..7019051653f8a17e62f400e2079143786797c876 100755 (executable)
@@ -59,7 +59,7 @@ body.mce-fullscreen, body.markdown-fullscreen {
   text-align: center;
   svg {
     fill: #FFF;
-    margin-right: 0;
+    margin-inline-end: 0;
   }
 }
 
@@ -174,14 +174,14 @@ body.mce-fullscreen, body.markdown-fullscreen {
     bottom: -9px;
     width: 16px;
     height: 16px;
-    margin-left: -8px;
+    margin-inline-start: -8px;
     content: '';
     display: block;
     background-color:#FFF;
     transform: rotate(45deg);
     transform-origin: 50% 50%;
-    border-bottom: 1px solid #CCC;
-    border-right: 1px solid #CCC;
+    border-inline-startom: 1px solid #CCC;
+    border-inline-end: 1px solid #CCC;
     z-index: 56;
   }
   input, button, a {
@@ -255,7 +255,7 @@ body.mce-fullscreen, body.markdown-fullscreen {
   }
   .tabs {
     display: block;
-    border-right: 1px solid #DDD;
+    border-inline-end: 1px solid #DDD;
     width: 48px;
     flex: 0 1 auto;
   }
@@ -294,8 +294,8 @@ body.mce-fullscreen, body.markdown-fullscreen {
     width: 100%;
     min-width: 50px;
   }
-  .tags td, .tag-table > div > div > div {
-    padding-right: $-s;
+  .tags td, .inline-start-table > div > div > div {
+    padding-inline-end: $-s;
     padding-top: $-s;
     position: relative;
   }
@@ -319,42 +319,6 @@ body.mce-fullscreen, body.markdown-fullscreen {
   display: none;
 }
 
-.tag-display {
-  position: relative;
-  table {
-    width: 100%;
-    margin: 0;
-    padding: 0;
-  }
-  tr:first-child td {
-    padding-top: 0;
-  }
-  .heading th {
-    padding: $-xs $-s;
-    color: rgba(100, 100, 100, 0.7);
-    border: 0;
-    font-weight: 400;
-  }
-  td {
-    border: 0;
-    border-bottom: 1px solid #EEE;
-    padding: $-xs $-s;
-    color: #444;
-  }
-  tr td:first-child {
-    padding-left:0;
-  }
-  .tag-value {
-    color: #888;
-  }
-  tr:last-child td {
-    border-bottom: none;
-  }
-  .tag {
-    padding: $-s;
-  }
-}
-
 .suggestion-box {
   position: absolute;
   background-color: #FFF;
index 69ed5a2d3c0174517ba02ed44d491ad098782d3d..57b229ab8eb3f50617c26e112f5ab2fb5e16bd4e 100644 (file)
@@ -7,8 +7,8 @@
       #{$prop}: $size !important;
     }
     .#{$propLetter}x-#{$sizeLetter} {
-      #{$prop}-left: $size !important;
-      #{$prop}-right: $size !important;
+      #{$prop}-inline-start: $size !important;
+      #{$prop}-inline-end: $size !important;
     }
     .#{$propLetter}y-#{$sizeLetter} {
       #{$prop}-top: $size !important;
       #{$prop}-top: $size !important;
     }
     .#{$propLetter}r-#{$sizeLetter} {
-      #{$prop}-right: $size !important;
+      #{$prop}-inline-end: $size !important;
     }
     .#{$propLetter}b-#{$sizeLetter} {
       #{$prop}-bottom: $size !important;
     }
     .#{$propLetter}l-#{$sizeLetter} {
-      #{$prop}-left: $size !important;
+      #{$prop}-inline-start: $size !important;
     }
   }
 }
index a1a2fef0a44537057b186fdd1969bf7461edb175..2778736083662ac7901612bc4b590c09547da625 100644 (file)
@@ -23,7 +23,7 @@ table.table {
     border-bottom: 1px solid rgba(0, 0, 0, 0.05);
   }
   th, td {
-    text-align: left;
+    text-align: start;
     border: none;
     padding: $-s $-s;
     vertical-align: middle;
@@ -36,7 +36,7 @@ table.table {
     background-color: #EEE;
   }
   .text-right {
-    text-align: right;
+    text-align: end;
   }
   .text-center {
     text-align: center;
index d28706781529317c9d53db9e7ce2a418bbb2a134..8d2759b91700262b5919e6c1fcb206a2cf305c4a 100644 (file)
@@ -262,7 +262,6 @@ span.highlight {
  * Lists
  */
 ul, ol {
-  overflow: hidden;
   p {
     margin: 0;
   }
@@ -295,6 +294,13 @@ li.checkbox-item, li.task-list-item {
   }
 }
 
+li > ol, li > ul {
+  margin-block-end: 0px;
+  margin-block-start: 0px;
+  padding-block-end: 0px;
+  padding-block-start: 0px;
+}
+
 /*
  * Generic text styling classes
  */
@@ -306,10 +312,10 @@ li.checkbox-item, li.task-list-item {
   text-align: center;
 }
 .text-left {
-  text-align: left;
+  text-align: start;
 }
 .text-right {
-  text-align: right;
+  text-align: end;
 }
 
 @each $sizeLetter, $size in $screen-sizes {
@@ -318,10 +324,10 @@ li.checkbox-item, li.task-list-item {
       text-align: center;
     }
     .text-#{$sizeLetter}-left {
-      text-align: left;
+      text-align: start;
     }
     .text-#{$sizeLetter}-right {
-      text-align: right;
+      text-align: end;
     }
   }
 }
@@ -377,6 +383,6 @@ span.sep {
   display: inline-block;
   position: relative;
   bottom: -0.105em;
-  margin-right: $-xs;
+  margin-inline-end: $-xs;
   pointer-events: none;
 }
index 296afbe76f0cb11efbb7c0b327885858016c949d..5cbd7f9d5e226b9c4710acaa3b5012862ea77c63 100644 (file)
@@ -20,8 +20,8 @@ html, body {
 .tri-layout-container {
   grid-template-columns: 1fr;
   grid-template-areas: "b";
-  margin-left: 0;
-  margin-right: 0;
+  margin-inline-start: 0;
+  margin-inline-end: 0;
   display: block;
 }
 
@@ -30,6 +30,6 @@ html, body {
 }
 
 .content-wrap.card {
-  padding-left: 0;
-  padding-right: 0;
+  padding-inline-start: 0;
+  padding-inline-end: 0;
 }
\ No newline at end of file
index 1f4d00f6b9606b1ebe15d94b0c5b8788dd747b6e..09d8b41000f199d6599a1fd96a400a7e226a0e0f 100644 (file)
@@ -74,7 +74,7 @@ $loadingSize: 10px;
     animation-duration: 1.4s;
     animation-iteration-count: infinite;
     animation-timing-function: cubic-bezier(.62, .28, .23, .99);
-    margin-right: 4px;
+    margin-inline-end: 4px;
     background-color: var(--color-page);
     animation-delay: 0.3s;
   }
@@ -89,7 +89,7 @@ $loadingSize: 10px;
     animation-delay: 0.6s;
   }
   > span {
-    margin-left: $-s;
+    margin-inline-start: $-s;
     font-style: italic;
     color: #888;
     vertical-align: top;
@@ -110,7 +110,7 @@ $btt-size: 40px;
   svg {
     width: $btt-size / 1.5;
     height: $btt-size / 1.5;
-    margin-right: 4px;
+    margin-inline-end: 4px;
   }
   width: $btt-size;
   height: $btt-size;
@@ -138,7 +138,7 @@ $btt-size: 40px;
   input, button {
     border-radius: 0;
     border: 1px solid #DDD;
-    margin-left: -1px;
+    margin-inline-start: -1px;
   }
   input {
     flex: 5;
@@ -177,8 +177,8 @@ $btt-size: 40px;
     overflow-y: scroll;
     height: 400px;
     background-color: #EEEEEE;
-    margin-right: 0;
-    margin-left: 0;
+    margin-inline-end: 0;
+    margin-inline-start: 0;
   }
   .entity-list-item {
     background-color: #FFF;
@@ -252,7 +252,7 @@ $btt-size: 40px;
   }
   .list-sort {
     display: inline-grid;
-    margin-left: $-s;
+    margin-inline-start: $-s;
     grid-template-columns: minmax(120px, max-content) 40px;
     font-size: 0.9rem;
     border: 2px solid #DDD;
@@ -264,14 +264,14 @@ $btt-size: 40px;
     color: #555;
   }
   .list-sort-type {
-    text-align: left;
+    text-align: start;
   }
   .list-sort-type, .list-sort-dir {
     padding: $-xs $-s;
     cursor: pointer;
   }
   .list-sort-dir {
-    border-left: 2px solid #DDD;
+    border-inline-start: 2px solid #DDD;
     fill: #888;
     .svg-icon {
       transition: transform ease-in-out 120ms;
index ab4db89e8d606ea9a93b06b7544a348f53245664..e92b505cf3792c4b74d002b0b92f384c39ec609b 100644 (file)
@@ -26,7 +26,7 @@
                                     <span class="api-method" data-method="{{ $endpoint['method'] }}">{{ $endpoint['method'] }}</span>
                                 </a>
                                 <a href="#{{ $endpoint['name'] }}" class="text-mono">
-                                    {{ $endpoint['controller_method'] }}
+                                    {{ $endpoint['controller_method_kebab'] }}
                                 </a>
                             </div>
                         @endforeach
                         <h1 class="list-heading text-capitals">{{ $model }}</h1>
 
                         @foreach($endpoints as $endpoint)
-                            <h6 class="text-uppercase text-muted float right">{{ $endpoint['controller_method'] }}</h6>
+                            <h6 class="text-uppercase text-muted float right">{{ $endpoint['controller_method_kebab'] }}</h6>
                             <h5 id="{{ $endpoint['name'] }}" class="text-mono mb-m">
                                 <span class="api-method" data-method="{{ $endpoint['method'] }}">{{ $endpoint['method'] }}</span>
                                 {{ url($endpoint['uri']) }}
index aa1913e3179853c203035dcfcbd64c1ae1c9871c..7d6595894fa5222c974e670415bd7dceddc04b3f 100644 (file)
@@ -4,7 +4,7 @@
     <div>
         <button id="saml-login" class="button outline block svg">
             @icon('saml2')
-            {{ trans('auth.log_in_with', ['socialDriver' => config('saml2.name')]) }}
+            <span>{{ trans('auth.log_in_with', ['socialDriver' => config('saml2.name')]) }}</span>
         </button>
     </div>
 
index 0a21a0f62d421238e97130de5be402505958b946..868e0555fd5fe7a13f6cad9f0ce5142892223492 100644 (file)
@@ -17,7 +17,7 @@
                     <div>
                         <a id="social-login-{{$driver}}" class="button outline block svg" href="{{ url("/login/service/" . $driver) }}">
                             @icon('auth/' . $driver)
-                            {{ trans('auth.log_in_with', ['socialDriver' => $name]) }}
+                            <span>{{ trans('auth.log_in_with', ['socialDriver' => $name]) }}</span>
                         </a>
                     </div>
                 @endforeach
index 1625ebc4c588afbcf77d18475a6336a4c61439a1..34aa81d7bf991f078104f8cff5dbecca69773737 100644 (file)
@@ -44,7 +44,7 @@
                     <div>
                         <a id="social-register-{{$driver}}" class="button block outline svg" href="{{ url("/register/service/" . $driver) }}">
                             @icon('auth/' . $driver)
-                            {{ trans('auth.sign_up_with', ['socialDriver' => $name]) }}
+                            <span>{{ trans('auth.sign_up_with', ['socialDriver' => $name]) }}</span>
                         </a>
                     </div>
                 @endforeach
index 07548162067404fa82061695c6753fe5bd15e27c..d362ef37360dcafe48a5157865ba85dd11529a5a 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="{{ config('app.lang') }}" class="@yield('body-class')">
+<html lang="{{ config('app.lang') }}" dir="{{ config('app.rtl') ? 'rtl' : 'ltr' }}" class="@yield('body-class')">
 <head>
     <title>{{ isset($pageTitle) ? $pageTitle . ' | ' : '' }}{{ setting('app-name') }}</title>
 
index b9bd987a9c723224eddd35272a5f2ea2a61aa900..f3c3ee34b1ca2e6b16f869346e936c8d9843995a 100644 (file)
@@ -43,7 +43,7 @@
                 </a>
             @endif
 
-            @include('partials.view-toggle', ['view' => $view, 'type' => 'book'])
+            @include('partials.view-toggle', ['view' => $view, 'type' => 'books'])
         </div>
     </div>
 
index cbafdb4364b0d18e350369d83e6457775edba5e5..e3a536fc9cd7d8ab5931927198af77e31791af54 100644 (file)
@@ -57,9 +57,7 @@
 
 @stop
 
-
 @section('right')
-
     <div class="mb-xl">
         <h5>{{ trans('common.details') }}</h5>
         <div class="text-small text-muted blended-links">
@@ -76,7 +74,6 @@
         </div>
     </div>
 
-
     <div class="actions mb-xl">
         <h5>{{ trans('common.actions') }}</h5>
         <div class="icon-list text-primary">
         </div>
     @endif
 
+    @if(count($bookParentShelves) > 0)
+        <div class="actions mb-xl">
+            <h5>{{ trans('entities.shelves_long') }}</h5>
+            @include('partials.entity-list', ['entities' => $bookParentShelves, 'style' => 'compact'])
+        </div>
+    @endif
+
     @if(count($activity) > 0)
         <div class="mb-xl">
             <h5>{{ trans('entities.recent_activity') }}</h5>
index 7c837ec29bd90a25f178094a12592976c76ea88b..ec90739ee497f8dfd41155ab90cae76f547f153a 100644 (file)
@@ -25,7 +25,7 @@
         </div>
 
         <div class="text-right">
-            <nav class="header-links" >
+            <nav class="header-links">
                 <div class="links text-center">
                     @if (hasAppAccess())
                         <a class="hide-over-l" href="{{ url('/search') }}">@icon('search'){{ trans('common.search') }}</a>
@@ -43,9 +43,9 @@
 
                     @if(!signedInUser())
                         @if(setting('registration-enabled') && config('auth.method') === 'standard')
-                            <a href="{{ url('/register') }}">@icon('new-user') {{ trans('auth.sign_up') }}</a>
+                            <a href="{{ url('/register') }}">@icon('new-user'){{ trans('auth.sign_up') }}</a>
                         @endif
-                        <a href="{{ url('/login') }}">@icon('login') {{ trans('auth.log_in') }}</a>
+                        <a href="{{ url('/login')  }}">@icon('login'){{ trans('auth.log_in') }}</a>
                     @endif
                 </div>
                 @if(signedInUser())
@@ -77,4 +77,4 @@
         </div>
 
     </div>
-</header>
\ No newline at end of file
+</header>
index 7644eeb8871278e6b0618d911a5a935c5fd5f948..8caae814a5f063e4eadd20b457a2c22bbe8152aa 100644 (file)
@@ -12,7 +12,7 @@
     <div class="actions mb-xl">
         <h5>{{ trans('common.actions') }}</h5>
         <div class="icon-list text-primary">
-            @include('partials.view-toggle', ['view' => $view, 'type' => 'book'])
+            @include('partials.view-toggle', ['view' => $view, 'type' => 'books'])
             @include('components.expand-toggle', ['target' => '.entity-list.compact .entity-item-snippet', 'key' => 'home-details'])
         </div>
     </div>
index a9c58589386df4ac996facacd32c3edc8c3c4753..bac6fa154d418057394a23163128aa10a9142c88 100644 (file)
@@ -12,7 +12,7 @@
     <div class="actions mb-xl">
         <h5>{{ trans('common.actions') }}</h5>
         <div class="icon-list text-primary">
-            @include('partials.view-toggle', ['view' => $view, 'type' => 'shelf'])
+            @include('partials.view-toggle', ['view' => $view, 'type' => 'shelves'])
             @include('components.expand-toggle', ['target' => '.entity-list.compact .entity-item-snippet', 'key' => 'home-details'])
         </div>
     </div>
index 70ffc350f61b5e0c8889b56923abaefc6df5b5f6..15f6ae252fdd09c1331c78e972b76888512018d4 100644 (file)
@@ -1,6 +1,6 @@
 <div id="code-editor">
     <div overlay ref="overlay" v-cloak @click="hide()">
-        <div class="popup-body" tabindex="-1" @click.stop>
+        <div class="popup-body" tabindex="-1" @click.stop @keydown.enter.ctrl="save">
 
             <div class="popup-header primary-background">
                 <div class="popup-title">{{ trans('components.code_editor') }}</div>
@@ -16,6 +16,7 @@
                             <a @click="updateLanguage('C')">C</a>
                             <a @click="updateLanguage('C++')">C++</a>
                             <a @click="updateLanguage('C#')">C#</a>
+                            <a @click="updateLanguage('Fortran')">Fortran</a>
                             <a @click="updateLanguage('Go')">Go</a>
                             <a @click="updateLanguage('HTML')">HTML</a>
                             <a @click="updateLanguage('INI')">INI</a>
@@ -26,6 +27,7 @@
                             <a @click="updateLanguage('MarkDown')">MarkDown</a>
                             <a @click="updateLanguage('Nginx')">Nginx</a>
                             <a @click="updateLanguage('PASCAL')">Pascal</a>
+                            <a @click="updateLanguage('Perl')">Perl</a>
                             <a @click="updateLanguage('PHP')">PHP</a>
                             <a @click="updateLanguage('Powershell')">Powershell</a>
                             <a @click="updateLanguage('Python')">Python</a>
index fffb4220ed6836763b32d84bab3205628564ed99..3b99d0b7cd681a130f83a9dea5c65da7515136f0 100644 (file)
@@ -5,7 +5,7 @@
     <div>
         <label for="setting-{{ $type }}-color" class="text-dark">{{ trans('settings.'. str_replace('-', '_', $type) .'_color') }}</label>
         <button type="button" class="text-button text-muted" setting-color-picker-default>{{ trans('common.default') }}</button>
-        <span class="sep mx-xs">|</span>
+        <span class="sep">|</span>
         <button type="button" class="text-button text-muted" setting-color-picker-reset>{{ trans('common.reset') }}</button>
     </div>
     <div>
@@ -18,4 +18,4 @@
                placeholder="{{ config('setting-defaults.'. $type .'-color') }}"
                class="small">
     </div>
-</div>
\ No newline at end of file
+</div>
index 9c599307ed0279c22de797ea8790717aa91cadf8..02f97fc546fcbc195ec04421731fba44b15cfb1d 100644 (file)
@@ -3,13 +3,17 @@
 @section('content')
 <div class="container mt-l">
 
-    <div class="card mb-xl px-l pb-xl pt-l">
+    <div class="card mb-xl px-l pb-l pt-l">
         <div class="grid half v-center">
             <div>
                 <h1 class="list-heading">{{ $message ?? trans('errors.404_page_not_found') }}</h1>
                 <h5>{{ trans('errors.sorry_page_not_found') }}</h5>
+                <p>{{ trans('errors.sorry_page_not_found_permission_warning') }}</p>
             </div>
             <div class="text-right">
+                @if(!signedInUser())
+                    <a href="{{ url('/login') }}" class="button outline">{{ trans('auth.log_in') }}</a>
+                @endif
                 <a href="{{ url('/') }}" class="button outline">{{ trans('errors.return_home') }}</a>
             </div>
         </div>
index ffc286c2cadadc32f3f9834dfd72ffb6be54ee3c..3c2b4f0b00658922444c3ad3f86b1459ceadd684 100644 (file)
@@ -1,6 +1,8 @@
 <div class="page-editor flex-fill flex" id="page-editor"
      drafts-enabled="{{ $draftsEnabled ? 'true' : 'false' }}"
-     drawio-enabled="{{ config('services.drawio') ? 'true' : 'false' }}"
+     @if(config('services.drawio'))
+        drawio-url="{{ is_string(config('services.drawio')) ? config('services.drawio') : 'https://www.draw.io/?embed=1&proto=json&spin=1' }}"
+     @endif
      editor-type="{{ setting('app-editor') }}"
      page-id="{{ $model->id ?? 0 }}"
      text-direction="{{ config('app.rtl') ? 'rtl' : 'ltr' }}"
index b3a11955dcdb68d5d5bd5d4a2342657066a12c1d..07ca1fcc19f5555c9691a9f92f686a9d27cdf849 100644 (file)
                         <div setting-app-color-picker class="text-m-right">
                             <input type="color" data-default="#206ea7" data-current="{{ setting('app-color') }}" value="{{ setting('app-color') }}" name="setting-app-color" id="setting-app-color" placeholder="#206ea7">
                             <input type="hidden" value="{{ setting('app-color-light') }}" name="setting-app-color-light" id="setting-app-color-light">
-                            <br>
-                            <button type="button" class="text-button text-muted mt-s mx-s" setting-app-color-picker-default>{{ trans('common.default') }}</button>
-                            <span class="sep">|</span>
-                            <button type="button" class="text-button text-muted mt-s mx-s" setting-app-color-picker-reset>{{ trans('common.reset') }}</button>
+                            <div class="pr-s">
+                                <button type="button" class="text-button text-muted mt-s" setting-app-color-picker-default>{{ trans('common.default') }}</button>
+                                <span class="sep">|</span>
+                                <button type="button" class="text-button text-muted mt-s" setting-app-color-picker-reset>{{ trans('common.reset') }}</button>
+                            </div>
+
                         </div>
                     </div>
 
index 98f97f1331b8c9985dd6f869759ac0116571c510..56b76f96f01855e7646d5371b0e372f25fc10c8a 100644 (file)
@@ -15,7 +15,7 @@
                     <span>{{ trans('entities.shelves_new_action') }}</span>
                 </a>
             @endif
-            @include('partials.view-toggle', ['view' => $view, 'type' => 'shelf'])
+            @include('partials.view-toggle', ['view' => $view, 'type' => 'shelves'])
         </div>
     </div>
 
index 2212e1c1e32ae3014b3f839f802d1dc534542c3a..6fee6f45d522718ac0829dd7b9cf33e4a9b2874d 100644 (file)
         <div class="book-content">
             <p class="text-muted">{!! nl2br(e($shelf->description)) !!}</p>
             @if(count($shelf->visibleBooks) > 0)
-                <div class="entity-list">
-                    @foreach($shelf->visibleBooks as $book)
-                        @include('books.list-item', ['book' => $book])
-                    @endforeach
-                </div>
+                @if($view === 'list')
+                    <div class="entity-list">
+                        @foreach($shelf->visibleBooks as $book)
+                            @include('books.list-item', ['book' => $book])
+                        @endforeach
+                    </div>
+                @else
+                    <div class="grid third">
+                        @foreach($shelf->visibleBooks as $key => $book)
+                            @include('books.grid-item', ['book' => $book])
+                        @endforeach
+                    </div>
+                @endif
             @else
                 <div class="mt-xl">
                     <hr>
@@ -87,6 +95,8 @@
                 </a>
             @endif
 
+            @include('partials.view-toggle', ['view' => $view, 'type' => 'shelf'])
+
             <hr class="primary-background">
 
             @if(userCan('bookshelf-update', $shelf))
index 73f2faf793cc7ce344279878d0d12a270f5ecab2..f9c27b62f29581770b65c0a704ebaf31a8f66324 100644 (file)
@@ -14,3 +14,13 @@ Route::post('books', 'BooksApiController@create');
 Route::get('books/{id}', 'BooksApiController@read');
 Route::put('books/{id}', 'BooksApiController@update');
 Route::delete('books/{id}', 'BooksApiController@delete');
+
+Route::get('books/{id}/export/html', 'BooksExportApiController@exportHtml');
+Route::get('books/{id}/export/pdf', 'BooksExportApiController@exportPdf');
+Route::get('books/{id}/export/plaintext', 'BooksExportApiController@exportPlainText');
+
+Route::get('shelves', 'BookshelfApiController@list');
+Route::post('shelves', 'BookshelfApiController@create');
+Route::get('shelves/{id}', 'BookshelfApiController@read');
+Route::put('shelves/{id}', 'BookshelfApiController@update');
+Route::delete('shelves/{id}', 'BookshelfApiController@delete');
\ No newline at end of file
index 90261e1ac291c128b7df9442f230d7e004372063..4dfccdf367e9156509cfe72c9f65856491700c93 100644 (file)
@@ -178,7 +178,8 @@ Route::group(['middleware' => 'auth'], function () {
         Route::get('/users', 'UserController@index');
         Route::get('/users/create', 'UserController@create');
         Route::get('/users/{id}/delete', 'UserController@delete');
-        Route::patch('/users/{id}/switch-book-view', 'UserController@switchBookView');
+        Route::patch('/users/{id}/switch-books-view', 'UserController@switchBooksView');
+        Route::patch('/users/{id}/switch-shelves-view', 'UserController@switchShelvesView');
         Route::patch('/users/{id}/switch-shelf-view', 'UserController@switchShelfView');
         Route::patch('/users/{id}/change-sort/{type}', 'UserController@changeSort');
         Route::patch('/users/{id}/update-expansion-preference/{key}', 'UserController@updateExpansionPreference');
index 1f283753ae9dc02f83d2dddd0c4107d4aa4b7604..3020939479b355ab0d91fab30e6dc3acedb2288e 100644 (file)
@@ -1,10 +1,9 @@
-<?php
-
-namespace Tests;
+<?php namespace Tests\Api;
 
 use BookStack\Auth\Permissions\RolePermission;
 use BookStack\Auth\User;
 use Carbon\Carbon;
+use Tests\TestCase;
 
 class ApiAuthTest extends TestCase
 {
index 1b3da2f34f8d19c8c0df42ceccea045dbea208ac..def62c94dd40465899f3e794e2c6b7897a963ff4 100644 (file)
@@ -1,9 +1,6 @@
-<?php
+<?php namespace Tests\Api;
 
-namespace Tests;
-
-use BookStack\Auth\Permissions\RolePermission;
-use Carbon\Carbon;
+use Tests\TestCase;
 
 class ApiConfigTest extends TestCase
 {
index b240c1672d17fb219f98c4f0c1338aaba5efd544..3cbcadfa30759d4197bbc8775370b0b954760590 100644 (file)
@@ -1,6 +1,6 @@
-<?php
+<?php namespace Tests\Api;
 
-namespace Tests;
+use Tests\TestCase;
 
 class ApiDocsTest extends TestCase
 {
index 741b9664b9a8dece27895705cf961b9cddc4dc98..ac6d61aa142c85d1c4e005d85c2ecb1a7e3be454 100644 (file)
@@ -1,8 +1,7 @@
-<?php
-
-namespace Tests;
+<?php namespace Tests\Api;
 
 use BookStack\Entities\Book;
+use Tests\TestCase;
 
 class ApiListingTest extends TestCase
 {
index a40e4c93b6c43aab535dee805b78a7c91b6517a3..3fd763ec625969872d9fa5a5f27f27e6002ad80e 100644 (file)
@@ -1,6 +1,7 @@
-<?php namespace Tests;
+<?php namespace Tests\Api;
 
 use BookStack\Entities\Book;
+use Tests\TestCase;
 
 class BooksApiTest extends TestCase
 {
@@ -104,4 +105,36 @@ class BooksApiTest extends TestCase
         $resp->assertStatus(204);
         $this->assertActivityExists('book_delete');
     }
+
+    public function test_export_html_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $book = Book::visible()->first();
+
+        $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/html");
+        $resp->assertStatus(200);
+        $resp->assertSee($book->name);
+        $resp->assertHeader('Content-Disposition', 'attachment; filename="' . $book->slug . '.html"');
+    }
+
+    public function test_export_plain_text_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $book = Book::visible()->first();
+
+        $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/plaintext");
+        $resp->assertStatus(200);
+        $resp->assertSee($book->name);
+        $resp->assertHeader('Content-Disposition', 'attachment; filename="' . $book->slug . '.txt"');
+    }
+
+    public function test_export_pdf_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $book = Book::visible()->first();
+
+        $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/pdf");
+        $resp->assertStatus(200);
+        $resp->assertHeader('Content-Disposition', 'attachment; filename="' . $book->slug . '.pdf"');
+    }
 }
\ No newline at end of file
diff --git a/tests/Api/ShelvesApiTest.php b/tests/Api/ShelvesApiTest.php
new file mode 100644 (file)
index 0000000..13e44d9
--- /dev/null
@@ -0,0 +1,136 @@
+<?php namespace Tests\Api;
+
+use BookStack\Entities\Book;
+use BookStack\Entities\Bookshelf;
+use Tests\TestCase;
+
+class ShelvesApiTest extends TestCase
+{
+    use TestsApi;
+
+    protected $baseEndpoint = '/api/shelves';
+
+    public function test_index_endpoint_returns_expected_shelf()
+    {
+        $this->actingAsApiEditor();
+        $firstBookshelf = Bookshelf::query()->orderBy('id', 'asc')->first();
+
+        $resp = $this->getJson($this->baseEndpoint . '?count=1&sort=+id');
+        $resp->assertJson(['data' => [
+            [
+                'id' => $firstBookshelf->id,
+                'name' => $firstBookshelf->name,
+                'slug' => $firstBookshelf->slug,
+            ]
+        ]]);
+    }
+
+    public function test_create_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $books = Book::query()->take(2)->get();
+
+        $details = [
+            'name' => 'My API shelf',
+            'description' => 'A shelf created via the API',
+        ];
+
+        $resp = $this->postJson($this->baseEndpoint, array_merge($details, ['books' => [$books[0]->id, $books[1]->id]]));
+        $resp->assertStatus(200);
+        $newItem = Bookshelf::query()->orderByDesc('id')->where('name', '=', $details['name'])->first();
+        $resp->assertJson(array_merge($details, ['id' => $newItem->id, 'slug' => $newItem->slug]));
+        $this->assertActivityExists('bookshelf_create', $newItem);
+        foreach ($books as $index => $book) {
+            $this->assertDatabaseHas('bookshelves_books', [
+                'bookshelf_id' => $newItem->id,
+                'book_id' => $book->id,
+                'order' => $index,
+            ]);
+        }
+    }
+
+    public function test_shelf_name_needed_to_create()
+    {
+        $this->actingAsApiEditor();
+        $details = [
+            'description' => 'A shelf created via the API',
+        ];
+
+        $resp = $this->postJson($this->baseEndpoint, $details);
+        $resp->assertStatus(422);
+        $resp->assertJson([
+            "error" => [
+                "message" => "The given data was invalid.",
+                "validation" => [
+                    "name" => ["The name field is required."]
+                ],
+                "code" => 422,
+            ],
+        ]);
+    }
+
+    public function test_read_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $shelf = Bookshelf::visible()->first();
+
+        $resp = $this->getJson($this->baseEndpoint . "/{$shelf->id}");
+
+        $resp->assertStatus(200);
+        $resp->assertJson([
+            'id' => $shelf->id,
+            'slug' => $shelf->slug,
+            'created_by' => [
+                'name' => $shelf->createdBy->name,
+            ],
+            'updated_by' => [
+                'name' => $shelf->createdBy->name,
+            ]
+        ]);
+    }
+
+    public function test_update_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $shelf = Bookshelf::visible()->first();
+        $details = [
+            'name' => 'My updated API shelf',
+            'description' => 'A shelf created via the API',
+        ];
+
+        $resp = $this->putJson($this->baseEndpoint . "/{$shelf->id}", $details);
+        $shelf->refresh();
+
+        $resp->assertStatus(200);
+        $resp->assertJson(array_merge($details, ['id' => $shelf->id, 'slug' => $shelf->slug]));
+        $this->assertActivityExists('bookshelf_update', $shelf);
+    }
+
+    public function test_update_only_assigns_books_if_param_provided()
+    {
+        $this->actingAsApiEditor();
+        $shelf = Bookshelf::visible()->first();
+        $this->assertTrue($shelf->books()->count() > 0);
+        $details = [
+            'name' => 'My updated API shelf',
+        ];
+
+        $resp = $this->putJson($this->baseEndpoint . "/{$shelf->id}", $details);
+        $resp->assertStatus(200);
+        $this->assertTrue($shelf->books()->count() > 0);
+
+        $resp = $this->putJson($this->baseEndpoint . "/{$shelf->id}", ['books' => []]);
+        $resp->assertStatus(200);
+        $this->assertTrue($shelf->books()->count() === 0);
+    }
+
+    public function test_delete_endpoint()
+    {
+        $this->actingAsApiEditor();
+        $shelf = Bookshelf::visible()->first();
+        $resp = $this->deleteJson($this->baseEndpoint . "/{$shelf->id}");
+
+        $resp->assertStatus(204);
+        $this->assertActivityExists('bookshelf_delete');
+    }
+}
\ No newline at end of file
similarity index 96%
rename from tests/TestsApi.php
rename to tests/Api/TestsApi.php
index 0bb10a4cc764c22941a0c0c99b280c7b59587bf6..623fa6969a7128bf9652f9e50e16fa710d29ac54 100644 (file)
@@ -1,6 +1,4 @@
-<?php
-
-namespace Tests;
+<?php namespace Tests\Api;
 
 trait TestsApi
 {
index eb83faded44edc67d721e595d1a11d3861e12255..40bcda713d6affc1cd1097346c2b1986eeaf7c15 100644 (file)
@@ -1,10 +1,15 @@
-<?php namespace Tests;
+<?php namespace Tests\Auth;
 
+use BookStack\Auth\Role;
 use BookStack\Auth\User;
 use BookStack\Entities\Page;
 use BookStack\Notifications\ConfirmEmail;
+use BookStack\Notifications\ResetPassword;
 use BookStack\Settings\SettingService;
+use DB;
+use Hash;
 use Illuminate\Support\Facades\Notification;
+use Tests\BrowserKitTest;
 
 class AuthTest extends BrowserKitTest
 {
@@ -128,7 +133,7 @@ class AuthTest extends BrowserKitTest
             ->press('Resend Confirmation Email');
 
         // Get confirmation and confirm notification matches
-        $emailConfirmation = \DB::table('email_confirmations')->where('user_id', '=', $dbUser->id)->first();
+        $emailConfirmation = DB::table('email_confirmations')->where('user_id', '=', $dbUser->id)->first();
         Notification::assertSentTo($dbUser, ConfirmEmail::class, function($notification, $channels) use ($emailConfirmation) {
             return $notification->token === $emailConfirmation->token;
         });
@@ -256,7 +261,7 @@ class AuthTest extends BrowserKitTest
             ->seePageIs('/settings/users');
 
             $userPassword = User::find($user->id)->password;
-            $this->assertTrue(\Hash::check('newpassword', $userPassword));
+            $this->assertTrue(Hash::check('newpassword', $userPassword));
     }
 
     public function test_user_deletion()
@@ -275,7 +280,7 @@ class AuthTest extends BrowserKitTest
 
     public function test_user_cannot_be_deleted_if_last_admin()
     {
-        $adminRole = \BookStack\Auth\Role::getRole('admin');
+        $adminRole = Role::getRole('admin');
 
         // Delete all but one admin user if there are more than one
         $adminUsers = $adminRole->users;
@@ -308,14 +313,13 @@ class AuthTest extends BrowserKitTest
 
     public function test_reset_password_flow()
     {
-
         Notification::fake();
 
         $this->visit('/login')->click('Forgot Password?')
             ->seePageIs('/password/email')
             ->type('[email protected]', 'email')
             ->press('Send Reset Link')
-            ->see('A password reset link has been sent to [email protected]');
+            ->see('A password reset link will be sent to [email protected] if that email address is found in the system.');
 
         $this->seeInDatabase('password_resets', [
             'email' => '[email protected]'
@@ -323,8 +327,8 @@ class AuthTest extends BrowserKitTest
 
         $user = User::where('email', '=', '[email protected]')->first();
 
-        Notification::assertSentTo($user, \BookStack\Notifications\ResetPassword::class);
-        $n = Notification::sent($user, \BookStack\Notifications\ResetPassword::class);
+        Notification::assertSentTo($user, ResetPassword::class);
+        $n = Notification::sent($user, ResetPassword::class);
 
         $this->visit('/password/reset/' . $n->first()->token)
             ->see('Reset Password')
@@ -336,6 +340,28 @@ class AuthTest extends BrowserKitTest
             ->see('Your password has been successfully reset');
     }
 
+    public function test_reset_password_flow_shows_success_message_even_if_wrong_password_to_prevent_user_discovery()
+    {
+        $this->visit('/login')->click('Forgot Password?')
+            ->seePageIs('/password/email')
+            ->type('[email protected]', 'email')
+            ->press('Send Reset Link')
+            ->see('A password reset link will be sent to [email protected] if that email address is found in the system.')
+            ->dontSee('We can\'t find a user');
+
+
+        $this->visit('/password/reset/arandometokenvalue')
+            ->see('Reset Password')
+            ->submitForm('Reset Password', [
+                'email' => '[email protected]',
+                'password' => 'randompass',
+                'password_confirmation' => 'randompass'
+            ])->followRedirects()
+            ->seePageIs('/password/reset/arandometokenvalue')
+            ->dontSee('We can\'t find a user')
+            ->see('The password reset token is invalid for this email address.');
+    }
+
     public function test_reset_password_page_shows_sign_links()
     {
         $this->setSettings(['registration-enabled' => 'true']);
index 324e3041fa5a6e29433116e1fb70a318bc08bcb5..de86b9fb68a2465860b71078778f0a65f526d79b 100644 (file)
@@ -1,10 +1,11 @@
-<?php namespace Tests;
+<?php namespace Tests\Auth;
 
 use BookStack\Auth\Access\LdapService;
 use BookStack\Auth\Role;
 use BookStack\Auth\Access\Ldap;
 use BookStack\Auth\User;
 use Mockery\MockInterface;
+use Tests\BrowserKitTest;
 
 class LdapTest extends BrowserKitTest
 {
index 9a3d6d8ecabb27acedb25957d2bef56920913009..d0da4529735adcb7e2dfe0229c768cac4552aa2e 100644 (file)
@@ -1,7 +1,8 @@
-<?php namespace Tests;
+<?php namespace Tests\Auth;
 
 use BookStack\Auth\Role;
 use BookStack\Auth\User;
+use Tests\TestCase;
 
 class Saml2Test extends TestCase
 {
index 526c0e199a184cf7ee0a7f74c49fcea0bf42cbba..d448b567e5ef1462bf168500bc2dc6b8ed1df2f2 100644 (file)
@@ -1,20 +1,26 @@
-<?php namespace Tests;
+<?php namespace Tests\Auth;
+
+use BookStack\Auth\User;
+use DB;
+use Laravel\Socialite\Contracts\Factory;
+use Laravel\Socialite\Contracts\Provider;
+use Mockery;
+use Tests\TestCase;
 
 class SocialAuthTest extends TestCase
 {
 
     public function test_social_registration()
     {
-        // http://docs.mockery.io/en/latest/reference/startup_methods.html
-        $user = factory(\BookStack\Auth\User::class)->make();
+        $user = factory(User::class)->make();
 
         $this->setSettings(['registration-enabled' => 'true']);
         config(['GOOGLE_APP_ID' => 'abc123', 'GOOGLE_APP_SECRET' => '123abc', 'APP_URL' => 'http://localhost']);
 
-        $mockSocialite = \Mockery::mock('Laravel\Socialite\Contracts\Factory');
-        $this->app['Laravel\Socialite\Contracts\Factory'] = $mockSocialite;
-        $mockSocialDriver = \Mockery::mock('Laravel\Socialite\Contracts\Provider');
-        $mockSocialUser = \Mockery::mock('\Laravel\Socialite\Contracts\User');
+        $mockSocialite = Mockery::mock(Factory::class);
+        $this->app[Factory::class] = $mockSocialite;
+        $mockSocialDriver = Mockery::mock(Provider::class);
+        $mockSocialUser = Mockery::mock(\Laravel\Socialite\Contracts\User::class);
 
         $mockSocialite->shouldReceive('driver')->twice()->with('google')->andReturn($mockSocialDriver);
         $mockSocialDriver->shouldReceive('redirect')->once()->andReturn(redirect('/'));
@@ -40,10 +46,10 @@ class SocialAuthTest extends TestCase
             'APP_URL' => 'http://localhost'
         ]);
 
-        $mockSocialite = \Mockery::mock('Laravel\Socialite\Contracts\Factory');
-        $this->app['Laravel\Socialite\Contracts\Factory'] = $mockSocialite;
-        $mockSocialDriver = \Mockery::mock('Laravel\Socialite\Contracts\Provider');
-        $mockSocialUser = \Mockery::mock('\Laravel\Socialite\Contracts\User');
+        $mockSocialite = Mockery::mock(Factory::class);
+        $this->app[Factory::class] = $mockSocialite;
+        $mockSocialDriver = Mockery::mock(Provider::class);
+        $mockSocialUser = Mockery::mock(\Laravel\Socialite\Contracts\User::class);
 
         $mockSocialUser->shouldReceive('getId')->twice()->andReturn('logintest123');
 
@@ -70,7 +76,7 @@ class SocialAuthTest extends TestCase
 
 
         // Test social callback with matching social account
-        \DB::table('social_accounts')->insert([
+        DB::table('social_accounts')->insert([
             'user_id' => $this->getAdmin()->id,
             'driver' => 'github',
             'driver_id' => 'logintest123'
@@ -86,11 +92,11 @@ class SocialAuthTest extends TestCase
             'APP_URL' => 'http://localhost'
         ]);
 
-        $user = factory(\BookStack\Auth\User::class)->make();
-        $mockSocialite = \Mockery::mock('Laravel\Socialite\Contracts\Factory');
-        $this->app['Laravel\Socialite\Contracts\Factory'] = $mockSocialite;
-        $mockSocialDriver = \Mockery::mock('Laravel\Socialite\Contracts\Provider');
-        $mockSocialUser = \Mockery::mock('\Laravel\Socialite\Contracts\User');
+        $user = factory(User::class)->make();
+        $mockSocialite = Mockery::mock(Factory::class);
+        $this->app[Factory::class] = $mockSocialite;
+        $mockSocialDriver = Mockery::mock(Provider::class);
+        $mockSocialUser = Mockery::mock(\Laravel\Socialite\Contracts\User::class);
 
         $mockSocialUser->shouldReceive('getId')->times(4)->andReturn(1);
         $mockSocialUser->shouldReceive('getEmail')->times(2)->andReturn($user->email);
@@ -125,11 +131,11 @@ class SocialAuthTest extends TestCase
             'APP_URL' => 'http://localhost', 'services.google.auto_register' => true, 'services.google.auto_confirm' => true
         ]);
 
-        $user = factory(\BookStack\Auth\User::class)->make();
-        $mockSocialite = \Mockery::mock('Laravel\Socialite\Contracts\Factory');
-        $this->app['Laravel\Socialite\Contracts\Factory'] = $mockSocialite;
-        $mockSocialDriver = \Mockery::mock('Laravel\Socialite\Contracts\Provider');
-        $mockSocialUser = \Mockery::mock('\Laravel\Socialite\Contracts\User');
+        $user = factory(User::class)->make();
+        $mockSocialite = Mockery::mock(Factory::class);
+        $this->app[Factory::class] = $mockSocialite;
+        $mockSocialDriver = Mockery::mock(Provider::class);
+        $mockSocialUser = Mockery::mock(\Laravel\Socialite\Contracts\User::class);
 
         $mockSocialUser->shouldReceive('getId')->times(3)->andReturn(1);
         $mockSocialUser->shouldReceive('getEmail')->times(2)->andReturn($user->email);
@@ -156,4 +162,32 @@ class SocialAuthTest extends TestCase
         $this->assertStringContainsString('prompt=select_account', $resp->headers->get('Location'));
     }
 
+    public function test_social_registration_with_no_name_uses_email_as_name()
+    {
+        $user = factory(User::class)->make(['email' => '[email protected]']);
+
+        $this->setSettings(['registration-enabled' => 'true']);
+        config(['GITHUB_APP_ID' => 'abc123', 'GITHUB_APP_SECRET' => '123abc', 'APP_URL' => 'http://localhost']);
+
+        $mockSocialite = Mockery::mock(Factory::class);
+        $this->app[Factory::class] = $mockSocialite;
+        $mockSocialDriver = Mockery::mock(Provider::class);
+        $mockSocialUser = Mockery::mock(\Laravel\Socialite\Contracts\User::class);
+
+        $mockSocialite->shouldReceive('driver')->twice()->with('github')->andReturn($mockSocialDriver);
+        $mockSocialDriver->shouldReceive('redirect')->once()->andReturn(redirect('/'));
+        $mockSocialDriver->shouldReceive('user')->once()->andReturn($mockSocialUser);
+
+        $mockSocialUser->shouldReceive('getId')->twice()->andReturn(1);
+        $mockSocialUser->shouldReceive('getEmail')->twice()->andReturn($user->email);
+        $mockSocialUser->shouldReceive('getName')->once()->andReturn('');
+        $mockSocialUser->shouldReceive('getAvatar')->once()->andReturn('avatar_placeholder');
+
+        $this->get('/register/service/github');
+        $this->get('/login/service/github/callback');
+        $this->assertDatabaseHas('users', ['name' => 'nonameuser', 'email' => $user->email]);
+        $user = $user->whereEmail($user->email)->first();
+        $this->assertDatabaseHas('social_accounts', ['user_id' => $user->id]);
+    }
+
 }
index d200134a5548707b52966d445d13dff1ef096316..f2a1d0e78177e94330515b37eb924e19770c9c95 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Tests;
+<?php namespace Tests\Auth;
 
 
 use BookStack\Auth\Access\UserInviteService;
@@ -8,6 +8,7 @@ use Carbon\Carbon;
 use DB;
 use Illuminate\Support\Str;
 use Notification;
+use Tests\TestCase;
 
 class UserInviteTest extends TestCase
 {
index 099af2939ddfd932aa1b5b9abb73544d3ce9adda..e55b047d49dfd7542ce160e466540c66d73ecf22 100644 (file)
@@ -5,6 +5,7 @@ use BookStack\Entities\Bookshelf;
 use BookStack\Entities\Page;
 use BookStack\Auth\User;
 use BookStack\Entities\Repos\PageRepo;
+use Symfony\Component\Console\Exception\RuntimeException;
 
 class CommandsTest extends TestCase
 {
@@ -166,4 +167,31 @@ class CommandsTest extends TestCase
         $this->assertDatabaseHas('entity_permissions', ['restrictable_id' => $child->id, 'action' => 'view', 'role_id' => $editorRole->id]);
         $this->assertDatabaseHas('entity_permissions', ['restrictable_id' => $child->id, 'action' => 'update', 'role_id' => $editorRole->id]);
     }
+
+    public function test_update_url_command_updates_page_content()
+    {
+        $page = Page::query()->first();
+        $page->html = '<a href="https://example.com/donkeys"></a>';
+        $page->save();
+
+        $this->artisan('bookstack:update-url https://example.com https://cats.example.com')
+            ->expectsQuestion("This will search for \"https://example.com\" in your database and replace it with  \"https://cats.example.com\".\nAre you sure you want to proceed?", 'y')
+            ->expectsQuestion("This operation could cause issues if used incorrectly. Have you made a backup of your existing database?", 'y');
+
+        $this->assertDatabaseHas('pages', [
+            'id' => $page->id,
+            'html' => '<a href="https://cats.example.com/donkeys"></a>'
+        ]);
+    }
+
+    public function test_update_url_command_requires_valid_url()
+    {
+        $badUrlMessage = "The given urls are expected to be full urls starting with http:// or https://";
+        $this->artisan('bookstack:update-url //example.com https://cats.example.com')->expectsOutput($badUrlMessage);
+        $this->artisan('bookstack:update-url https://example.com htts://cats.example.com')->expectsOutput($badUrlMessage);
+        $this->artisan('bookstack:update-url example.com https://cats.example.com')->expectsOutput($badUrlMessage);
+
+        $this->expectException(RuntimeException::class);
+        $this->artisan('bookstack:update-url https://cats.example.com');
+    }
 }
index a318ebe24e5be48cd29b7559c25679db6d02e44a..abee4d34a6e15e19b0f96c72f69be8f3c182e5d3 100644 (file)
@@ -1,10 +1,11 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Auth\User;
 use BookStack\Entities\Book;
 use BookStack\Entities\Bookshelf;
 use BookStack\Uploads\Image;
 use Illuminate\Support\Str;
+use Tests\TestCase;
 use Tests\Uploads\UsesImages;
 
 class BookShelfTest extends TestCase
@@ -263,4 +264,32 @@ class BookShelfTest extends TestCase
         $pageVisit->assertElementNotContains('.breadcrumbs', $shelf->getShortName());
     }
 
+    public function test_bookshelves_show_on_book()
+    {
+        // Create shelf
+        $shelfInfo = [
+            'name' => 'My test shelf' . Str::random(4),
+            'description' => 'Test shelf description ' . Str::random(10)
+        ];
+
+        $this->asEditor()->post('/shelves', $shelfInfo);
+        $shelf = Bookshelf::where('name', '=', $shelfInfo['name'])->first();
+
+        // Create book and add to shelf
+        $this->asEditor()->post($shelf->getUrl('/create-book'), [
+            'name' => 'Test book name',
+            'description' => 'Book in shelf description'
+        ]);
+
+        $newBook = Book::query()->orderBy('id', 'desc')->first();
+
+        $resp = $this->asEditor()->get($newBook->getUrl());
+        $resp->assertElementContains('.tri-layout-left-contents', $shelfInfo['name']);
+
+        // Remove shelf
+        $this->delete($shelf->getUrl());
+
+        $resp = $this->asEditor()->get($newBook->getUrl());
+        $resp->assertDontSee($shelfInfo['name']);
+    }
 }
index 967e550a735e6294faf970bcfc1a605b8a57c2f7..3c8cae68ccefefd1e28f0aca63884c28dfdf0b33 100644 (file)
@@ -1,28 +1,35 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
-class CommentSettingTest extends BrowserKitTest {
-  protected $page;
+use BookStack\Entities\Page;
+use Tests\BrowserKitTest;
 
-  public function setUp(): void {
-      parent::setUp();
-      $this->page = \BookStack\Entities\Page::first();
-  }
+class CommentSettingTest extends BrowserKitTest
+{
+    protected $page;
 
-  public function test_comment_disable () {
-    $this->asAdmin();
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->page = Page::first();
+    }
 
-    $this->setSettings(['app-disable-comments' => 'true']);
+    public function test_comment_disable()
+    {
+        $this->asAdmin();
 
-    $this->asAdmin()->visit($this->page->getUrl())
-    ->pageNotHasElement('.comments-list');
-  }
+        $this->setSettings(['app-disable-comments' => 'true']);
 
-  public function test_comment_enable () {
-    $this->asAdmin();
+        $this->asAdmin()->visit($this->page->getUrl())
+            ->pageNotHasElement('.comments-list');
+    }
 
-    $this->setSettings(['app-disable-comments' => 'false']);
+    public function test_comment_enable()
+    {
+        $this->asAdmin();
 
-    $this->asAdmin()->visit($this->page->getUrl())
-    ->pageHasElement('.comments-list');
-  }
+        $this->setSettings(['app-disable-comments' => 'false']);
+
+        $this->asAdmin()->visit($this->page->getUrl())
+            ->pageHasElement('.comments-list');
+    }
 }
\ No newline at end of file
index 2b943f96f18c853dfd36f805110f7eb0715b0666..a2126407b43d121b10f6c55cad07eda7d0455b25 100644 (file)
@@ -1,7 +1,8 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Page;
 use BookStack\Actions\Comment;
+use Tests\TestCase;
 
 class CommentTest extends TestCase
 {
index 34c3cd4a873dd14274884c558e3411e9b09511c9..72eb808dc4c581a84e03d85c74366ee79d3b238a 100644 (file)
@@ -1,10 +1,11 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Actions\Tag;
 use BookStack\Entities\Book;
 use BookStack\Entities\Bookshelf;
 use BookStack\Entities\Chapter;
 use BookStack\Entities\Page;
+use Tests\TestCase;
 
 class EntitySearchTest extends TestCase
 {
index 97684ea4d66fc174e82c8c8b81b55a35488193d7..d7e4ec61c741f8b0e0822ba1307d7130ce8923c8 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Bookshelf;
 use BookStack\Entities\Book;
@@ -7,6 +7,8 @@ use BookStack\Entities\Page;
 use BookStack\Auth\UserRepo;
 use BookStack\Entities\Repos\PageRepo;
 use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\BrowserKitTest;
 
 class EntityTest extends BrowserKitTest
 {
@@ -325,4 +327,34 @@ class EntityTest extends BrowserKitTest
             ->seePageIs($chapter->getUrl());
     }
 
+    public function test_page_delete_removes_entity_from_its_activity()
+    {
+        $page = Page::query()->first();
+
+        $this->asEditor()->put($page->getUrl(), [
+            'name' => 'My updated page',
+            'html' => '<p>updated content</p>',
+        ]);
+        $page->refresh();
+
+        $this->seeInDatabase('activities', [
+            'entity_id' => $page->id,
+            'entity_type' => $page->getMorphClass(),
+        ]);
+
+        $resp = $this->delete($page->getUrl());
+        $resp->assertResponseStatus(302);
+
+        $this->dontSeeInDatabase('activities', [
+            'entity_id' => $page->id,
+            'entity_type' => $page->getMorphClass(),
+        ]);
+
+        $this->seeInDatabase('activities', [
+            'extra' => 'My updated page',
+            'entity_id' => 0,
+            'entity_type' => '',
+        ]);
+    }
+
 }
index 9a2d32028e4b26887c7d231b68df2b1887668e3a..5a94adac91c4b8d8dc46866f897e45f7057c3808 100644 (file)
@@ -1,10 +1,11 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 
 use BookStack\Entities\Chapter;
 use BookStack\Entities\Page;
 use BookStack\Uploads\HttpFetcher;
 use Illuminate\Support\Str;
+use Tests\TestCase;
 
 class ExportTest extends TestCase
 {
index 5d3af4f6e26705b8fed3e617a78d9104fe3fb99d..452b4c07f379ed1a1ed4e7e1c747192ca541700c 100644 (file)
@@ -1,4 +1,6 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
+
+use Tests\BrowserKitTest;
 
 class MarkdownTest extends BrowserKitTest
 {
index 8a78c8ac019fd08de3cc37d50e7df50954c83f6e..d714c3229db7a8dfeecd587c67b0d9f41cde4457 100644 (file)
@@ -1,7 +1,8 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Managers\PageContent;
 use BookStack\Entities\Page;
+use Tests\TestCase;
 
 class PageContentTest extends TestCase
 {
index e83f78a10a8a8f2d566ece9586a115dd24d4c323..5c984940d32569ce3e0b5d1cdce60bef2bf9d1cb 100644 (file)
@@ -1,6 +1,7 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Repos\PageRepo;
+use Tests\BrowserKitTest;
 
 class PageDraftTest extends BrowserKitTest
 {
index 38193ec1a6b7bd09cadbe04e6a8bcb3ea8765f98..f8baccc5493f84e7ac0ce388bc81d837a8cdacf0 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Entity;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Page;
 use BookStack\Entities\Repos\PageRepo;
index 883de4a9f91f98f1b67dfcb83676c06d2a5489ae..8eba1355792f593be11a7431c6f6866eaa3732cc 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Entity;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Page;
 use Tests\TestCase;
index 7d67f05c6d6b0b77be7dde916d3c497c512d0482..28c3adf312682fa84783a78634eb946681c98e70 100644 (file)
@@ -1,9 +1,10 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Book;
 use BookStack\Entities\Chapter;
 use BookStack\Entities\Page;
 use BookStack\Entities\Repos\PageRepo;
+use Tests\TestCase;
 
 class SortTest extends TestCase
 {
index 13876410a0cddccaf4e3d04783e5735ccfd78697..87d57ea0bf547b8cf76bc6ca2c3a8bfd45f341c2 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Tests;
+<?php namespace Tests\Entity;
 
 use BookStack\Entities\Book;
 use BookStack\Entities\Chapter;
@@ -6,6 +6,7 @@ use BookStack\Actions\Tag;
 use BookStack\Entities\Entity;
 use BookStack\Entities\Page;
 use BookStack\Auth\Permissions\PermissionService;
+use Tests\BrowserKitTest;
 
 class TagTest extends BrowserKitTest
 {
index cd68756ae4365ad27ef4499f6a363b96570b474a..d5c6e453238ead0b3d82f0d805d23f7983fdf676 100644 (file)
@@ -11,7 +11,7 @@ class LanguageTest extends TestCase
     public function setUp(): void
     {
         parent::setUp();
-        $this->langs = array_diff(scandir(resource_path('lang')), ['..', '.', 'check.php', 'format.php']);
+        $this->langs = array_diff(scandir(resource_path('lang')), ['..', '.']);
     }
 
     public function test_locales_config_key_set_properly()
@@ -19,7 +19,21 @@ class LanguageTest extends TestCase
         $configLocales = config('app.locales');
         sort($configLocales);
         sort($this->langs);
-        $this->assertTrue(implode(':', $this->langs) === implode(':', $configLocales), 'app.locales configuration variable matches found lang files');
+        $this->assertEquals(implode(':', $configLocales), implode(':', $this->langs), 'app.locales configuration variable does not match those found in lang files');
+    }
+
+    // Not part of standard phpunit test runs since we sometimes expect non-added langs.
+    public function do_test_locales_all_have_language_dropdown_entry()
+    {
+        $dropdownLocales = array_keys(trans('settings.language_select', [], 'en'));
+        sort($dropdownLocales);
+        sort($this->langs);
+        $diffs = array_diff($this->langs, $dropdownLocales);
+        if (count($diffs) > 0) {
+            $diffText = implode(',', $diffs);
+            $this->addWarning("Languages: {$diffText} found in files but not in language select dropdown.");
+        }
+        $this->assertTrue(true);
     }
 
     public function test_correct_language_if_not_logged_in()
index d899c6396041a9d8a46d695efff0599ce0159a83..7d6c1831afdd0eeab6ecceb36b3b5f8127f61981 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Tests;
+<?php namespace Tests\Permissions;
 
 use BookStack\Entities\Book;
 use BookStack\Entities\Bookshelf;
@@ -6,6 +6,7 @@ use BookStack\Entities\Chapter;
 use BookStack\Entities\Entity;
 use BookStack\Auth\User;
 use BookStack\Entities\Page;
+use Tests\BrowserKitTest;
 
 class RestrictionsTest extends BrowserKitTest
 {
index 2ef72fb0aef8999403553d00819ae59ea9a2acf4..99080d354c4c239fae8261e8de53d06681b7e7fe 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Tests;
+<?php namespace Tests\Permissions;
 
 use BookStack\Entities\Bookshelf;
 use BookStack\Entities\Page;
@@ -6,6 +6,7 @@ use BookStack\Auth\Permissions\PermissionsRepo;
 use BookStack\Auth\Role;
 use Laravel\BrowserKitTesting\HttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Tests\BrowserKitTest;
 
 class RolesTest extends BrowserKitTest
 {
index 27b4822fa2bce01f5379b50e3558333c01846003..3670df87d39df58e28ea7383955e3f9db473ab7f 100644 (file)
@@ -1,16 +1,25 @@
 <?php namespace Tests;
 
+use Auth;
+use BookStack\Auth\Permissions\PermissionService;
+use BookStack\Auth\Permissions\RolePermission;
+use BookStack\Auth\Role;
+use BookStack\Auth\User;
+use BookStack\Entities\Book;
+use BookStack\Entities\Chapter;
+use BookStack\Entities\Page;
+
 class PublicActionTest extends BrowserKitTest
 {
 
     public function test_app_not_public()
     {
         $this->setSettings(['app-public' => 'false']);
-        $book = \BookStack\Entities\Book::orderBy('name', 'asc')->first();
+        $book = Book::orderBy('name', 'asc')->first();
         $this->visit('/books')->seePageIs('/login');
         $this->visit($book->getUrl())->seePageIs('/login');
 
-        $page = \BookStack\Entities\Page::first();
+        $page = Page::first();
         $this->visit($page->getUrl())->seePageIs('/login');
     }
 
@@ -35,7 +44,7 @@ class PublicActionTest extends BrowserKitTest
     public function test_books_viewable()
     {
         $this->setSettings(['app-public' => 'true']);
-        $books = \BookStack\Entities\Book::orderBy('name', 'asc')->take(10)->get();
+        $books = Book::orderBy('name', 'asc')->take(10)->get();
         $bookToVisit = $books[1];
 
         // Check books index page is showing
@@ -52,7 +61,7 @@ class PublicActionTest extends BrowserKitTest
     public function test_chapters_viewable()
     {
         $this->setSettings(['app-public' => 'true']);
-        $chapterToVisit = \BookStack\Entities\Chapter::first();
+        $chapterToVisit = Chapter::first();
         $pageToVisit = $chapterToVisit->pages()->first();
 
         // Check chapters index page is showing
@@ -70,15 +79,15 @@ class PublicActionTest extends BrowserKitTest
     public function test_public_page_creation()
     {
         $this->setSettings(['app-public' => 'true']);
-        $publicRole = \BookStack\Auth\Role::getSystemRole('public');
+        $publicRole = Role::getSystemRole('public');
         // Grant all permissions to public
         $publicRole->permissions()->detach();
-        foreach (\BookStack\Auth\Permissions\RolePermission::all() as $perm) {
+        foreach (RolePermission::all() as $perm) {
             $publicRole->attachPermission($perm);
         }
-        $this->app[\BookStack\Auth\Permissions\PermissionService::class]->buildJointPermissionForRole($publicRole);
+        $this->app[PermissionService::class]->buildJointPermissionForRole($publicRole);
 
-        $chapter = \BookStack\Entities\Chapter::first();
+        $chapter = Chapter::first();
         $this->visit($chapter->book->getUrl());
         $this->visit($chapter->getUrl())
             ->click('New Page')
@@ -89,7 +98,7 @@ class PublicActionTest extends BrowserKitTest
             'name' => 'My guest page'
         ])->seePageIs($chapter->book->getUrl('/page/my-guest-page/edit'));
 
-        $user = \BookStack\Auth\User::getDefault();
+        $user = User::getDefault();
         $this->seeInDatabase('pages', [
             'name' => 'My guest page',
             'chapter_id' => $chapter->id,
@@ -100,9 +109,9 @@ class PublicActionTest extends BrowserKitTest
 
     public function test_content_not_listed_on_404_for_public_users()
     {
-        $page = \BookStack\Entities\Page::first();
+        $page = Page::first();
         $this->asAdmin()->visit($page->getUrl());
-        \Auth::logout();
+        Auth::logout();
         view()->share('pageTitle', '');
         $this->forceVisit('/cats/dogs/hippos');
         $this->dontSee($page->name);
@@ -139,4 +148,36 @@ class PublicActionTest extends BrowserKitTest
         $this->seeText("User-agent: *\nDisallow: /");
     }
 
+    public function test_public_view_then_login_redirects_to_previous_content()
+    {
+        $this->setSettings(['app-public' => 'true']);
+        $book = Book::query()->first();
+        $this->visit($book->getUrl())
+            ->see($book->name)
+            ->visit('/login')
+            ->type('[email protected]', '#email')
+            ->type('password', '#password')
+            ->press('Log In')
+            ->seePageUrlIs($book->getUrl());
+    }
+
+    public function test_access_hidden_content_then_login_redirects_to_intended_content()
+    {
+        $this->setSettings(['app-public' => 'true']);
+        $book = Book::query()->first();
+        $this->setEntityRestrictions($book);
+
+        try {
+            $this->visit($book->getUrl());
+        } catch (\Exception $exception) {}
+
+        $this->see('Book not found')
+            ->dontSee($book->name)
+            ->visit('/login')
+            ->type('[email protected]', '#email')
+            ->type('password', '#password')
+            ->press('Log In')
+            ->seePageUrlIs($book->getUrl())
+            ->see($book->name);
+    }
 }
\ No newline at end of file
index c84305ad88112354a418f6e9c01a58cded82b9eb..69b737d7df4ac3a88b03b0fcbffa07467d516a6b 100644 (file)
@@ -1,4 +1,6 @@
-<?php namespace Tests;
+<?php namespace Tests\Unit;
+
+use Tests\TestCase;
 
 /**
  * Class ConfigTest
index c2386443c6fdacd9260cc8b5bfb7777c74a5c208..feff4797718baa4904dce7d80dcbaf4aca5180a6 100644 (file)
@@ -1,4 +1,6 @@
-<?php namespace Tests;
+<?php namespace Tests\Unit;
+
+use Tests\TestCase;
 
 class UrlTest extends TestCase
 {
index 12b254d00a4c84ac87877d8e3e49917163f7c071..e98a90b35d2034aaa701a726a42fcb5de4939b30 100644 (file)
@@ -1,8 +1,9 @@
-<?php namespace Tests;
+<?php namespace Tests\Uploads;
 
 use BookStack\Uploads\Attachment;
 use BookStack\Entities\Page;
 use BookStack\Auth\Permissions\PermissionService;
+use Tests\TestCase;
 
 class AttachmentTest extends TestCase
 {
diff --git a/tests/Uploads/DrawioTest.php b/tests/Uploads/DrawioTest.php
new file mode 100644 (file)
index 0000000..f940a0a
--- /dev/null
@@ -0,0 +1,79 @@
+<?php namespace Tests\Uploads;
+
+use BookStack\Entities\Page;
+use BookStack\Uploads\Image;
+use Tests\TestCase;
+
+class DrawioTest extends TestCase
+{
+    use UsesImages;
+
+    public function test_get_image_as_base64()
+    {
+        $page = Page::first();
+        $this->asAdmin();
+        $imageName = 'first-image.png';
+
+        $this->uploadImage($imageName, $page->id);
+        $image = Image::first();
+        $image->type = 'drawio';
+        $image->save();
+
+        $imageGet = $this->getJson("/images/drawio/base64/{$image->id}");
+        $imageGet->assertJson([
+            'content' => 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII='
+        ]);
+    }
+
+    public function test_drawing_base64_upload()
+    {
+        $page = Page::first();
+        $editor = $this->getEditor();
+        $this->actingAs($editor);
+
+        $upload = $this->postJson('images/drawio', [
+            'uploaded_to' => $page->id,
+            'image' => 'image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII='
+        ]);
+
+        $upload->assertStatus(200);
+        $upload->assertJson([
+            'type' => 'drawio',
+            'uploaded_to' => $page->id,
+            'created_by' => $editor->id,
+            'updated_by' => $editor->id,
+        ]);
+
+        $image = Image::where('type', '=', 'drawio')->first();
+        $this->assertTrue(file_exists(public_path($image->path)), 'Uploaded image not found at path: '. public_path($image->path));
+
+        $testImageData = file_get_contents($this->getTestImageFilePath());
+        $uploadedImageData = file_get_contents(public_path($image->path));
+        $this->assertTrue($testImageData === $uploadedImageData, "Uploaded image file data does not match our test image as expected");
+    }
+
+    public function test_drawio_url_can_be_configured()
+    {
+        config()->set('services.drawio', 'http://cats.com?dog=tree');
+        $page = Page::first();
+        $editor = $this->getEditor();
+
+        $resp = $this->actingAs($editor)->get($page->getUrl('/edit'));
+        $resp->assertSee('drawio-url="http://cats.com?dog=tree"');
+    }
+
+    public function test_drawio_url_can_be_disabled()
+    {
+        config()->set('services.drawio', true);
+        $page = Page::first();
+        $editor = $this->getEditor();
+
+        $resp = $this->actingAs($editor)->get($page->getUrl('/edit'));
+        $resp->assertSee('drawio-url="https://www.draw.io/?embed=1&amp;proto=json&amp;spin=1"');
+
+        config()->set('services.drawio', false);
+        $resp = $this->actingAs($editor)->get($page->getUrl('/edit'));
+        $resp->assertDontSee('drawio-url');
+    }
+
+}
\ No newline at end of file
index 3f6c021a7f0f86c74ad972c4166b0e64b485518a..416927ac93170bb1649429d7fdd354932befb6af 100644 (file)
@@ -278,50 +278,6 @@ class ImageTest extends TestCase
         $this->assertFalse(file_exists(public_path($relPath)), 'Uploaded image has not been deleted as expected');
     }
 
-    public function testBase64Get()
-    {
-        $page = Page::first();
-        $this->asAdmin();
-        $imageName = 'first-image.png';
-
-        $this->uploadImage($imageName, $page->id);
-        $image = Image::first();
-        $image->type = 'drawio';
-        $image->save();
-
-        $imageGet = $this->getJson("/images/drawio/base64/{$image->id}");
-        $imageGet->assertJson([
-            'content' => 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII='
-        ]);
-    }
-
-    public function test_drawing_base64_upload()
-    {
-        $page = Page::first();
-        $editor = $this->getEditor();
-        $this->actingAs($editor);
-
-        $upload = $this->postJson('images/drawio', [
-            'uploaded_to' => $page->id,
-            'image' => 'image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gEcDCo5iYNs+gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAFElEQVQI12O0jN/KgASYGFABqXwAZtoBV6Sl3hIAAAAASUVORK5CYII='
-        ]);
-
-        $upload->assertStatus(200);
-        $upload->assertJson([
-            'type' => 'drawio',
-            'uploaded_to' => $page->id,
-            'created_by' => $editor->id,
-            'updated_by' => $editor->id,
-        ]);
-
-        $image = Image::where('type', '=', 'drawio')->first();
-        $this->assertTrue(file_exists(public_path($image->path)), 'Uploaded image not found at path: '. public_path($image->path));
-
-        $testImageData = file_get_contents($this->getTestImageFilePath());
-        $uploadedImageData = file_get_contents(public_path($image->path));
-        $this->assertTrue($testImageData === $uploadedImageData, "Uploaded image file data does not match our test image as expected");
-    }
-
     protected function getTestProfileImage()
     {
         $imageName = 'profile.png';
index b24b483d945ec1e7f510ac621bdd6244fdec49a4..251a61c9f5841c2ad9513fbfc7140594b3adb4fc 100644 (file)
@@ -1,6 +1,5 @@
 <?php namespace Tests\Uploads;
 
-
 use BookStack\Entities\Page;
 use Illuminate\Http\UploadedFile;
 
index 7787e34fa94991722dbefadb08ed9079c7baa412..f738eb579e4f9a836bc7f818e7de39e59a78ace9 100644 (file)
@@ -1,4 +1,4 @@
-<?php namespace Test;
+<?php namespace Test\User;
 
 use BookStack\Api\ApiToken;
 use Carbon\Carbon;
index b8166427525dcf74006f3fdfa0b60dd2779eeea0..b70d52dfa85f3d3dea3a5d1d378d2c9cd17f5951 100644 (file)
@@ -1,4 +1,6 @@
-<?php namespace Tests;
+<?php namespace Test\User;
+
+use Tests\TestCase;
 
 class UserPreferencesTest extends TestCase
 {
index fc1a529ae43076f59d38d2d642c534c0ff816cd7..0a3a1a6b202fcf776457f9478ddba01e39cbd76b 100644 (file)
@@ -1,4 +1,9 @@
-<?php namespace Tests;
+<?php namespace Test\User;
+
+use Activity;
+use BookStack\Auth\User;
+use BookStack\Entities\Bookshelf;
+use Tests\BrowserKitTest;
 
 class UserProfileTest extends BrowserKitTest
 {
@@ -7,7 +12,7 @@ class UserProfileTest extends BrowserKitTest
     public function setUp(): void
     {
         parent::setUp();
-        $this->user = \BookStack\Auth\User::all()->last();
+        $this->user = User::all()->last();
     }
 
     public function test_profile_page_shows_name()
@@ -55,8 +60,8 @@ class UserProfileTest extends BrowserKitTest
         $newUser = $this->getNewBlankUser();
         $this->actingAs($newUser);
         $entities = $this->createEntityChainBelongingToUser($newUser, $newUser);
-        \Activity::add($entities['book'], 'book_update', $entities['book']->id);
-        \Activity::add($entities['page'], 'page_create', $entities['book']->id);
+        Activity::add($entities['book'], 'book_update', $entities['book']->id);
+        Activity::add($entities['page'], 'page_create', $entities['book']->id);
 
         $this->asAdmin()->visit('/user/' . $newUser->id)
             ->seeInElement('#recent-user-activity', 'updated book')
@@ -69,8 +74,8 @@ class UserProfileTest extends BrowserKitTest
         $newUser = $this->getNewBlankUser();
         $this->actingAs($newUser);
         $entities = $this->createEntityChainBelongingToUser($newUser, $newUser);
-        \Activity::add($entities['book'], 'book_update', $entities['book']->id);
-        \Activity::add($entities['page'], 'page_create', $entities['book']->id);
+        Activity::add($entities['book'], 'book_update', $entities['book']->id);
+        Activity::add($entities['page'], 'page_create', $entities['book']->id);
 
         $this->asAdmin()->visit('/')->clickInElement('#recent-activity', $newUser->name)
             ->seePageIs('/user/' . $newUser->id)
@@ -87,7 +92,7 @@ class UserProfileTest extends BrowserKitTest
 
     public function test_guest_profile_cannot_be_deleted()
     {
-        $guestUser = \BookStack\Auth\User::getDefault();
+        $guestUser = User::getDefault();
         $this->asAdmin()->visit('/settings/users/' . $guestUser->id . '/delete')
             ->see('Delete User')->see('Guest')
             ->press('Confirm')
@@ -116,4 +121,24 @@ class UserProfileTest extends BrowserKitTest
             ->pageHasElement('.featured-image-container');
     }
 
+    public function test_shelf_view_type_change()
+    {
+        $editor = $this->getEditor();
+        $shelf = Bookshelf::query()->first();
+        setting()->putUser($editor, 'bookshelf_view_type', 'list');
+
+        $this->actingAs($editor)->visit($shelf->getUrl())
+            ->pageNotHasElement('.featured-image-container')
+            ->pageHasElement('.content-wrap .entity-list-item')
+            ->see('Grid View');
+
+        $req = $this->patch("/settings/users/{$editor->id}/switch-shelf-view", ['view_type' => 'grid']);
+        $req->assertRedirectedTo($shelf->getUrl());
+
+        $this->actingAs($editor)->visit($shelf->getUrl())
+            ->pageHasElement('.featured-image-container')
+            ->pageNotHasElement('.content-wrap .entity-list-item')
+            ->see('List View');
+    }
+
 }