diff --git a/app/Auth/User.php b/app/Auth/User.php
index 259b8eec0..e5a8a3931 100644
--- a/app/Auth/User.php
+++ b/app/Auth/User.php
@@ -168,14 +168,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function getAvatar($size = 50)
{
- $default = baseUrl('/user_avatar.png');
+ $default = url('/user_avatar.png');
$imageId = $this->image_id;
if ($imageId === 0 || $imageId === '0' || $imageId === null) {
return $default;
}
try {
- $avatar = $this->avatar ? baseUrl($this->avatar->getThumb($size, $size, false)) : $default;
+ $avatar = $this->avatar ? url($this->avatar->getThumb($size, $size, false)) : $default;
} catch (\Exception $err) {
$avatar = $default;
}
@@ -197,7 +197,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function getEditUrl()
{
- return baseUrl('/settings/users/' . $this->id);
+ return url('/settings/users/' . $this->id);
}
/**
@@ -206,7 +206,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function getProfileUrl()
{
- return baseUrl('/user/' . $this->id);
+ return url('/user/' . $this->id);
}
/**
diff --git a/app/Config/app.php b/app/Config/app.php
index aaeafb98d..88052e94c 100755
--- a/app/Config/app.php
+++ b/app/Config/app.php
@@ -52,7 +52,7 @@ return [
'locale' => env('APP_LANG', 'en'),
// Locales available
- 'locales' => ['en', 'ar', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'cs', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW'],
+ 'locales' => ['en', 'ar', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'hu', 'nl', 'pt_BR', 'sk', 'cs', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW'],
// Application Fallback Locale
'fallback_locale' => 'en',
diff --git a/app/Entities/Book.php b/app/Entities/Book.php
index decdde9dc..7d3d5e4ae 100644
--- a/app/Entities/Book.php
+++ b/app/Entities/Book.php
@@ -25,9 +25,9 @@ class Book extends Entity
public function getUrl($path = false)
{
if ($path !== false) {
- return baseUrl('/books/' . urlencode($this->slug) . '/' . trim($path, '/'));
+ return url('/books/' . urlencode($this->slug) . '/' . trim($path, '/'));
}
- return baseUrl('/books/' . urlencode($this->slug));
+ return url('/books/' . urlencode($this->slug));
}
/**
@@ -44,7 +44,7 @@ class Book extends Entity
}
try {
- $cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default;
+ $cover = $this->cover ? url($this->cover->getThumb($width, $height, false)) : $default;
} catch (\Exception $err) {
$cover = $default;
}
diff --git a/app/Entities/Bookshelf.php b/app/Entities/Bookshelf.php
index c8f8b990c..db6685688 100644
--- a/app/Entities/Bookshelf.php
+++ b/app/Entities/Bookshelf.php
@@ -39,9 +39,9 @@ class Bookshelf extends Entity
public function getUrl($path = false)
{
if ($path !== false) {
- return baseUrl('/shelves/' . urlencode($this->slug) . '/' . trim($path, '/'));
+ return url('/shelves/' . urlencode($this->slug) . '/' . trim($path, '/'));
}
- return baseUrl('/shelves/' . urlencode($this->slug));
+ return url('/shelves/' . urlencode($this->slug));
}
/**
@@ -59,7 +59,7 @@ class Bookshelf extends Entity
}
try {
- $cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default;
+ $cover = $this->cover ? url($this->cover->getThumb($width, $height, false)) : $default;
} catch (\Exception $err) {
$cover = $default;
}
diff --git a/app/Entities/Chapter.php b/app/Entities/Chapter.php
index 936404758..b204f1903 100644
--- a/app/Entities/Chapter.php
+++ b/app/Entities/Chapter.php
@@ -42,10 +42,13 @@ class Chapter extends Entity
public function getUrl($path = false)
{
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
+ $fullPath = '/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug);
+
if ($path !== false) {
- return baseUrl('/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug) . '/' . trim($path, '/'));
+ $fullPath .= '/' . trim($path, '/');
}
- return baseUrl('/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug));
+
+ return url($fullPath);
}
/**
diff --git a/app/Entities/Page.php b/app/Entities/Page.php
index 1c2cc5cff..c32417418 100644
--- a/app/Entities/Page.php
+++ b/app/Entities/Page.php
@@ -96,10 +96,10 @@ class Page extends Entity
$idComponent = $this->draft ? $this->id : urlencode($this->slug);
if ($path !== false) {
- return baseUrl('/books/' . urlencode($bookSlug) . $midText . $idComponent . '/' . trim($path, '/'));
+ return url('/books/' . urlencode($bookSlug) . $midText . $idComponent . '/' . trim($path, '/'));
}
- return baseUrl('/books/' . urlencode($bookSlug) . $midText . $idComponent);
+ return url('/books/' . urlencode($bookSlug) . $midText . $idComponent);
}
/**
diff --git a/app/Entities/Repos/EntityRepo.php b/app/Entities/Repos/EntityRepo.php
index 4edd61723..aad9a1205 100644
--- a/app/Entities/Repos/EntityRepo.php
+++ b/app/Entities/Repos/EntityRepo.php
@@ -760,13 +760,13 @@ class EntityRepo
$xPath = new DOMXPath($doc);
// Remove standard script tags
- $scriptElems = $xPath->query('//body//*//script');
+ $scriptElems = $xPath->query('//script');
foreach ($scriptElems as $scriptElem) {
$scriptElem->parentNode->removeChild($scriptElem);
}
// Remove 'on*' attributes
- $onAttributes = $xPath->query('//body//*/@*[starts-with(name(), \'on\')]');
+ $onAttributes = $xPath->query('//@*[starts-with(name(), \'on\')]');
foreach ($onAttributes as $attr) {
/** @var \DOMAttr $attr*/
$attrName = $attr->nodeName;
diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php
index 78a8d33c0..c739fd9a3 100644
--- a/app/Http/Controllers/Auth/LoginController.php
+++ b/app/Http/Controllers/Auth/LoginController.php
@@ -53,8 +53,8 @@ class LoginController extends Controller
$this->socialAuthService = $socialAuthService;
$this->ldapService = $ldapService;
$this->userRepo = $userRepo;
- $this->redirectPath = baseUrl('/');
- $this->redirectAfterLogout = baseUrl('/login');
+ $this->redirectPath = url('/');
+ $this->redirectAfterLogout = url('/login');
parent::__construct();
}
@@ -106,9 +106,7 @@ class LoginController extends Controller
$this->ldapService->syncGroups($user, $request->get($this->username()));
}
- $path = session()->pull('url.intended', '/');
- $path = baseUrl($path, true);
- return redirect($path);
+ return redirect()->intended('/');
}
/**
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
index d57105b62..a285899cc 100644
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ b/app/Http/Controllers/Auth/RegisterController.php
@@ -2,17 +2,23 @@
namespace BookStack\Http\Controllers\Auth;
+use BookStack\Auth\Access\EmailConfirmationService;
+use BookStack\Auth\Access\SocialAuthService;
use BookStack\Auth\SocialAccount;
use BookStack\Auth\User;
use BookStack\Auth\UserRepo;
+use BookStack\Exceptions\SocialDriverNotConfigured;
use BookStack\Exceptions\SocialSignInAccountNotUsed;
use BookStack\Exceptions\SocialSignInException;
use BookStack\Exceptions\UserRegistrationException;
use BookStack\Http\Controllers\Controller;
use Exception;
use Illuminate\Foundation\Auth\RegistersUsers;
+use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
+use Illuminate\Routing\Redirector;
+use Illuminate\View\View;
use Laravel\Socialite\Contracts\User as SocialUser;
use Validator;
@@ -46,18 +52,18 @@ class RegisterController extends Controller
/**
* Create a new controller instance.
*
- * @param \BookStack\Auth\Access\SocialAuthService $socialAuthService
+ * @param SocialAuthService $socialAuthService
* @param \BookStack\Auth\EmailConfirmationService $emailConfirmationService
- * @param \BookStack\Auth\UserRepo $userRepo
+ * @param UserRepo $userRepo
*/
- public function __construct(\BookStack\Auth\Access\SocialAuthService $socialAuthService, \BookStack\Auth\Access\EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
+ public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
{
$this->middleware('guest')->only(['getRegister', 'postRegister', 'socialRegister']);
$this->socialAuthService = $socialAuthService;
$this->emailConfirmationService = $emailConfirmationService;
$this->userRepo = $userRepo;
- $this->redirectTo = baseUrl('/');
- $this->redirectPath = baseUrl('/');
+ $this->redirectTo = url('/');
+ $this->redirectPath = url('/');
parent::__construct();
}
@@ -101,8 +107,8 @@ class RegisterController extends Controller
/**
* Handle a registration request for the application.
- * @param Request|\Illuminate\Http\Request $request
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @param Request|Request $request
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
public function postRegister(Request $request)
@@ -117,7 +123,7 @@ class RegisterController extends Controller
/**
* Create a new user instance after a valid registration.
* @param array $data
- * @return \BookStack\Auth\User
+ * @return User
*/
protected function create(array $data)
{
@@ -133,7 +139,7 @@ class RegisterController extends Controller
* @param array $userData
* @param bool|false|SocialAccount $socialAccount
* @param bool $emailVerified
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
protected function registerUser(array $userData, $socialAccount = false, $emailVerified = false)
@@ -182,7 +188,7 @@ class RegisterController extends Controller
/**
* Confirms an email via a token and logs the user into the system.
* @param $token
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
public function confirmEmail($token)
@@ -200,7 +206,7 @@ class RegisterController extends Controller
/**
* Shows a notice that a user's email address has not been confirmed,
* Also has the option to re-send the confirmation email.
- * @return \Illuminate\View\View
+ * @return View
*/
public function showAwaitingConfirmation()
{
@@ -210,7 +216,7 @@ class RegisterController extends Controller
/**
* Resend the confirmation email
* @param Request $request
- * @return \Illuminate\View\View
+ * @return View
*/
public function resendConfirmation(Request $request)
{
@@ -235,7 +241,7 @@ class RegisterController extends Controller
* @param $socialDriver
* @return mixed
* @throws UserRegistrationException
- * @throws \BookStack\Exceptions\SocialDriverNotConfigured
+ * @throws SocialDriverNotConfigured
*/
public function socialRegister($socialDriver)
{
@@ -248,10 +254,10 @@ class RegisterController extends Controller
* The callback for social login services.
* @param $socialDriver
* @param Request $request
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws SocialSignInException
* @throws UserRegistrationException
- * @throws \BookStack\Exceptions\SocialDriverNotConfigured
+ * @throws SocialDriverNotConfigured
*/
public function socialCallback($socialDriver, Request $request)
{
@@ -292,7 +298,7 @@ class RegisterController extends Controller
/**
* Detach a social account from a user.
* @param $socialDriver
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
*/
public function detachSocialAccount($socialDriver)
{
@@ -303,7 +309,7 @@ class RegisterController extends Controller
* Register a new user after a registration callback.
* @param string $socialDriver
* @param SocialUser $socialUser
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
protected function socialRegisterCallback(string $socialDriver, SocialUser $socialUser)
diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php
index 16a7d5a5e..89fb83fd9 100644
--- a/app/Http/Controllers/PageController.php
+++ b/app/Http/Controllers/PageController.php
@@ -541,7 +541,7 @@ class PageController extends Controller
public function showRecentlyUpdated()
{
// TODO - Still exist?
- $pages = $this->pageRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(baseUrl('/pages/recently-updated'));
+ $pages = $this->pageRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(url('/pages/recently-updated'));
return view('pages.detailed-listing', [
'title' => trans('entities.recently_updated_pages'),
'pages' => $pages
diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php
index 4bcf7b40e..1691ee9b0 100644
--- a/app/Http/Controllers/SearchController.php
+++ b/app/Http/Controllers/SearchController.php
@@ -48,7 +48,7 @@ class SearchController extends Controller
$this->setPageTitle(trans('entities.search_for_term', ['term' => $searchTerm]));
$page = intval($request->get('page', '0')) ?: 1;
- $nextPageLink = baseUrl('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1));
+ $nextPageLink = url('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1));
$results = $this->searchService->searchEntities($searchTerm, 'all', $page, 20);
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
index 1a3384367..d840a9b2e 100644
--- a/app/Http/Middleware/Authenticate.php
+++ b/app/Http/Middleware/Authenticate.php
@@ -41,7 +41,7 @@ class Authenticate
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
- return redirect()->guest(baseUrl('/login'));
+ return redirect()->guest(url('/login'));
}
}
diff --git a/app/Http/Request.php b/app/Http/Request.php
new file mode 100644
index 000000000..bd2761a0b
--- /dev/null
+++ b/app/Http/Request.php
@@ -0,0 +1,26 @@
+getScheme().'://'.$this->getHttpHost();
+ }
+
+ return $base;
+ }
+
+}
\ No newline at end of file
diff --git a/app/Notifications/ConfirmEmail.php b/app/Notifications/ConfirmEmail.php
index 7ecadc298..229408f5c 100644
--- a/app/Notifications/ConfirmEmail.php
+++ b/app/Notifications/ConfirmEmail.php
@@ -26,6 +26,6 @@ class ConfirmEmail extends MailNotification
->subject(trans('auth.email_confirm_subject', $appName))
->greeting(trans('auth.email_confirm_greeting', $appName))
->line(trans('auth.email_confirm_text'))
- ->action(trans('auth.email_confirm_action'), baseUrl('/register/confirm/' . $this->token));
+ ->action(trans('auth.email_confirm_action'), url('/register/confirm/' . $this->token));
}
}
diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php
index 305a7da72..208752764 100644
--- a/app/Notifications/ResetPassword.php
+++ b/app/Notifications/ResetPassword.php
@@ -29,7 +29,7 @@ class ResetPassword extends MailNotification
return $this->newMailMessage()
->subject(trans('auth.email_reset_subject', ['appName' => setting('app-name')]))
->line(trans('auth.email_reset_text'))
- ->action(trans('auth.reset_password'), baseUrl('password/reset/' . $this->token))
+ ->action(trans('auth.reset_password'), url('password/reset/' . $this->token))
->line(trans('auth.email_reset_not_requested'));
}
}
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index e45a0be92..a2fc673f4 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use Schema;
+use URL;
use Validator;
class AppServiceProvider extends ServiceProvider
@@ -23,6 +24,9 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
+ // Set root URL
+ URL::forceRootUrl(config('app.url'));
+
// Custom validation methods
Validator::extend('image_extension', function ($attribute, $value, $parameters, $validator) {
$validImageExtensions = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'tiff', 'webp'];
diff --git a/app/Providers/PaginationServiceProvider.php b/app/Providers/PaginationServiceProvider.php
index 3a695c5e3..1c982b82e 100644
--- a/app/Providers/PaginationServiceProvider.php
+++ b/app/Providers/PaginationServiceProvider.php
@@ -18,7 +18,7 @@ class PaginationServiceProvider extends IlluminatePaginationServiceProvider
});
Paginator::currentPathResolver(function () {
- return baseUrl($this->app['request']->path());
+ return url($this->app['request']->path());
});
Paginator::currentPageResolver(function ($pageName = 'page') {
diff --git a/app/Uploads/Attachment.php b/app/Uploads/Attachment.php
index eb9a0fe68..8720d3c09 100644
--- a/app/Uploads/Attachment.php
+++ b/app/Uploads/Attachment.php
@@ -37,6 +37,6 @@ class Attachment extends Ownable
if ($this->external && strpos($this->path, 'http') !== 0) {
return $this->path;
}
- return baseUrl('/attachments/' . $this->id);
+ return url('/attachments/' . $this->id);
}
}
diff --git a/app/Uploads/ImageService.php b/app/Uploads/ImageService.php
index 71fd2cd4e..860230d00 100644
--- a/app/Uploads/ImageService.php
+++ b/app/Uploads/ImageService.php
@@ -417,7 +417,7 @@ class ImageService extends UploadService
$isLocal = strpos(trim($uri), 'http') !== 0;
// Attempt to find local files even if url not absolute
- $base = baseUrl('/');
+ $base = url('/');
if (!$isLocal && strpos($uri, $base) === 0) {
$isLocal = true;
$uri = str_replace($base, '', $uri);
@@ -442,7 +442,12 @@ class ImageService extends UploadService
return null;
}
- return 'data:image/' . pathinfo($uri, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageData);
+ $extension = pathinfo($uri, PATHINFO_EXTENSION);
+ if ($extension === 'svg') {
+ $extension = 'svg+xml';
+ }
+
+ return 'data:image/' . $extension . ';base64,' . base64_encode($imageData);
}
/**
@@ -469,7 +474,7 @@ class ImageService extends UploadService
$this->storageUrl = $storageUrl;
}
- $basePath = ($this->storageUrl == false) ? baseUrl('/') : $this->storageUrl;
+ $basePath = ($this->storageUrl == false) ? url('/') : $this->storageUrl;
return rtrim($basePath, '/') . $filePath;
}
}
diff --git a/app/helpers.php b/app/helpers.php
index 8cb3fa3f4..9bbfcfbf0 100644
--- a/app/helpers.php
+++ b/app/helpers.php
@@ -1,8 +1,9 @@
user() ?: \BookStack\Auth\User::getDefault();
+ return auth()->user() ?: User::getDefault();
}
/**
@@ -63,9 +64,9 @@ function hasAppAccess() : bool
* that particular item.
* @param string $permission
* @param Ownable $ownable
- * @return mixed
+ * @return bool
*/
-function userCan(string $permission, Ownable $ownable = null)
+function userCan(string $permission, Ownable $ownable = null) : bool
{
if ($ownable === null) {
return user() && user()->can($permission);
@@ -83,7 +84,7 @@ function userCan(string $permission, Ownable $ownable = null)
* @param string|null $entityClass
* @return bool
*/
-function userCanOnAny(string $permission, string $entityClass = null)
+function userCanOnAny(string $permission, string $entityClass = null) : bool
{
$permissionService = app(PermissionService::class);
return $permissionService->checkUserHasPermissionOnAnything($permission, $entityClass);
@@ -93,83 +94,27 @@ function userCanOnAny(string $permission, string $entityClass = null)
* Helper to access system settings.
* @param $key
* @param bool $default
- * @return bool|string|\BookStack\Settings\SettingService
+ * @return bool|string|SettingService
*/
function setting($key = null, $default = false)
{
- $settingService = resolve(\BookStack\Settings\SettingService::class);
+ $settingService = resolve(SettingService::class);
if (is_null($key)) {
return $settingService;
}
return $settingService->get($key, $default);
}
-/**
- * Helper to create url's relative to the applications root path.
- * @param string $path
- * @param bool $forceAppDomain
- * @return string
- */
-function baseUrl($path, $forceAppDomain = false)
-{
- $isFullUrl = strpos($path, 'http') === 0;
- if ($isFullUrl && !$forceAppDomain) {
- return $path;
- }
-
- $path = trim($path, '/');
- $base = rtrim(config('app.url'), '/');
-
- // Remove non-specified domain if forced and we have a domain
- if ($isFullUrl && $forceAppDomain) {
- if (!empty($base) && strpos($path, $base) === 0) {
- $path = mb_substr($path, mb_strlen($base));
- } else {
- $explodedPath = explode('/', $path);
- $path = implode('/', array_splice($explodedPath, 3));
- }
- }
-
- // Return normal url path if not specified in config
- if (config('app.url') === '') {
- return url($path);
- }
-
- return $base . '/' . ltrim($path, '/');
-}
-
-/**
- * Get an instance of the redirector.
- * Overrides the default laravel redirect helper.
- * Ensures it redirects even when the app is in a subdirectory.
- *
- * @param string|null $to
- * @param int $status
- * @param array $headers
- * @param bool $secure
- * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
- */
-function redirect($to = null, $status = 302, $headers = [], $secure = null)
-{
- if (is_null($to)) {
- return app('redirect');
- }
-
- $to = baseUrl($to);
-
- return app('redirect')->to($to, $status, $headers, $secure);
-}
-
/**
* Get a path to a theme resource.
* @param string $path
- * @return string|boolean
+ * @return string
*/
-function theme_path($path = '')
+function theme_path($path = '') : string
{
$theme = config('view.theme');
if (!$theme) {
- return false;
+ return '';
}
return base_path('themes/' . $theme .($path ? DIRECTORY_SEPARATOR.$path : $path));
@@ -241,5 +186,5 @@ function sortUrl($path, $data, $overrideData = [])
return $path;
}
- return baseUrl($path . '?' . implode('&', $queryStringSections));
+ return url($path . '?' . implode('&', $queryStringSections));
}
diff --git a/public/index.php b/public/index.php
index ad378d7e0..820576472 100644
--- a/public/index.php
+++ b/public/index.php
@@ -34,6 +34,7 @@ require __DIR__.'/../bootstrap/init.php';
*/
$app = require_once __DIR__.'/../bootstrap/app.php';
+$app->alias('request', \BookStack\Http\Request::class);
/*
|--------------------------------------------------------------------------
@@ -50,7 +51,7 @@ $app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
- $request = Illuminate\Http\Request::capture()
+ $request = \BookStack\Http\Request::capture()
);
$response->send();
diff --git a/readme.md b/readme.md
index ccbd41ab8..276a3de20 100644
--- a/readme.md
+++ b/readme.md
@@ -63,7 +63,7 @@ npm run production
npm run dev
```
-BookStack has many integration tests that use Laravel's built-in testing capabilities which makes use of PHPUnit. To use you will need PHPUnit 6 installed and accessible via command line, Directly running the composer-installed version will not work. There is a `mysql_testing` database defined within the app config which is what is used by PHPUnit. This database is set with the following database name, user name and password defined as `bookstack-test`. You will have to create that database and credentials before testing.
+BookStack has many integration tests that use Laravel's built-in testing capabilities which makes use of PHPUnit. There is a `mysql_testing` database defined within the app config which is what is used by PHPUnit. This database is set with the database name, user name and password all defined as `bookstack-test`. You will have to create that database and that set of credentials before testing.
The testing database will also need migrating and seeding beforehand. This can be done with the following commands:
@@ -72,7 +72,7 @@ php artisan migrate --database=mysql_testing
php artisan db:seed --class=DummyContentSeeder --database=mysql_testing
```
-Once done you can run `phpunit` in the application root directory to run all tests.
+Once done you can run `php vendor/bin/phpunit` in the application root directory to run all tests.
## Translations
diff --git a/resources/assets/sass/_header.scss b/resources/assets/sass/_header.scss
index c4ca4607a..adb014f4a 100644
--- a/resources/assets/sass/_header.scss
+++ b/resources/assets/sass/_header.scss
@@ -16,7 +16,7 @@ header .grid {
header {
position: relative;
display: block;
- z-index: 6;
+ z-index: 11;
top: 0;
background-color: $primary-dark;
color: #fff;
diff --git a/resources/assets/sass/_pages.scss b/resources/assets/sass/_pages.scss
index 7f2dad147..be0cc381c 100755
--- a/resources/assets/sass/_pages.scss
+++ b/resources/assets/sass/_pages.scss
@@ -20,6 +20,10 @@
}
}
+body.mce-fullscreen .page-editor .edit-area {
+ z-index: 12;
+}
+
@include smaller-than($s) {
.page-edit-toolbar {
overflow-x: scroll;
diff --git a/resources/lang/de/activities.php b/resources/lang/de/activities.php
index be2eb54b8..35b2c9f8a 100644
--- a/resources/lang/de/activities.php
+++ b/resources/lang/de/activities.php
@@ -17,7 +17,6 @@ return [
'page_restore' => 'stellt Seite wieder her',
'page_restore_notification' => 'Die Seite wurde erfolgreich wiederhergestellt.',
'page_move' => 'verschiebt Seite',
- 'page_move_notification' => 'Die Seite wurde erfolgreich verschoben.',
// Chapters
'chapter_create' => 'erstellt Kapitel',
diff --git a/resources/lang/de/auth.php b/resources/lang/de/auth.php
index 7b1ebec6e..46d4070b8 100644
--- a/resources/lang/de/auth.php
+++ b/resources/lang/de/auth.php
@@ -30,6 +30,8 @@ return [
'remember_me' => 'Angemeldet bleiben',
'ldap_email_hint' => 'Bitte geben Sie eine E-Mail-Adresse ein, um diese mit dem Account zu nutzen.',
'create_account' => 'Account registrieren',
+ 'already_have_account' => 'Bereits ein Konto erstellt?',
+ 'dont_have_account' => 'Noch kein Konto erstellt?',
'social_login' => 'Mit Sozialem Netzwerk anmelden',
'social_registration' => 'Mit Sozialem Netzwerk registrieren',
'social_registration_text' => 'Mit einer dieser Dienste registrieren oder anmelden',
diff --git a/resources/lang/de/common.php b/resources/lang/de/common.php
index 5579a488a..97b48ce4d 100644
--- a/resources/lang/de/common.php
+++ b/resources/lang/de/common.php
@@ -10,6 +10,7 @@ return [
'save' => 'Speichern',
'continue' => 'Weiter',
'select' => 'Auswählen',
+ 'toggle_all' => 'Alle umschalten',
'more' => 'Mehr',
/**
@@ -26,6 +27,7 @@ return [
*/
'actions' => 'Aktionen',
'view' => 'Anzeigen',
+ 'view_all' => 'Alle anzeigen',
'create' => 'Anlegen',
'update' => 'Aktualisieren',
'edit' => 'Bearbeiten',
@@ -40,6 +42,11 @@ return [
'remove' => 'Entfernen',
'add' => 'Hinzufügen',
+ // Sort Options
+ 'sort_name' => 'Name',
+ 'sort_created_at' => 'Erstellungsdatum',
+ 'sort_updated_at' => 'Aktualisierungsdatum',
+
/**
* Misc
*/
@@ -52,6 +59,7 @@ return [
'details' => 'Details',
'grid_view' => 'Gitteransicht',
'list_view' => 'Listenansicht',
+ 'default' => 'Voreinstellung',
/**
* Header
@@ -59,6 +67,10 @@ return [
'view_profile' => 'Profil ansehen',
'edit_profile' => 'Profil bearbeiten',
+ // Layout tabs
+ 'tab_info' => 'Info',
+ 'tab_content' => 'Inhalt',
+
/**
* Email Content
*/
diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php
index 07a92e2c7..d67419543 100644
--- a/resources/lang/de/entities.php
+++ b/resources/lang/de/entities.php
@@ -8,6 +8,7 @@ return [
'recently_updated_pages' => 'Kürzlich aktualisierte Seiten',
'recently_created_chapters' => 'Kürzlich angelegte Kapitel',
'recently_created_books' => 'Kürzlich angelegte Bücher',
+ 'recently_created_shelves' => 'Kürzlich angelegte Regale',
'recently_update' => 'Kürzlich aktualisiert',
'recently_viewed' => 'Kürzlich angesehen',
'recent_activity' => 'Kürzliche Aktivität',
@@ -49,28 +50,32 @@ return [
'search_content_type' => 'Inhaltstyp',
'search_exact_matches' => 'Exakte Treffer',
'search_tags' => 'Nach Schlagwort suchen',
+ 'search_options' => 'Optionen',
'search_viewed_by_me' => 'Schon von mir angesehen',
'search_not_viewed_by_me' => 'Noch nicht von mir angesehen',
'search_permissions_set' => 'Berechtigungen gesetzt',
'search_created_by_me' => 'Von mir erstellt',
'search_updated_by_me' => 'Von mir aktualisiert',
+ 'search_date_options' => 'Datums Optionen',
'search_updated_before' => 'Aktualisiert vor',
'search_updated_after' => 'Aktualisiert nach',
'search_created_before' => 'Erstellt vor',
'search_created_after' => 'Erstellt nach',
'search_set_date' => 'Datum auswählen',
'search_update' => 'Suche aktualisieren',
-
+
/*
* Shelves
*/
'shelf' => 'Regal',
'shelves' => 'Regale',
+ 'x_shelves' => ':count Regal|:count Regale',
'shelves_long' => 'Bücherregal',
'shelves_empty' => 'Es wurden noch keine Regale angelegt',
'shelves_create' => 'Erzeuge ein Regal',
'shelves_popular' => 'Beliebte Regale',
'shelves_new' => 'Kürzlich erstellte Regale',
+ 'shelves_new_action' => 'Neues Regal',
'shelves_popular_empty' => 'Die beliebtesten Regale werden hier angezeigt.',
'shelves_new_empty' => 'Die neusten Regale werden hier angezeigt.',
'shelves_save' => 'Regal speichern',
@@ -92,7 +97,7 @@ return [
'shelves_copy_permissions' => 'Berechtigungen kopieren',
'shelves_copy_permissions_explain' => 'Hiermit werden die Berechtigungen des aktuellen Regals auf alle enthaltenen Bücher übertragen. Überprüfen Sie vor der Aktivierung, ob alle Berechtigungsänderungen am aktuellen Regal gespeichert wurden.',
'shelves_copy_permission_success' => 'Regal-Berechtigungen wurden zu :count Büchern kopiert',
-
+
/**
* Books
*/
@@ -103,6 +108,7 @@ return [
'books_popular' => 'Beliebte Bücher',
'books_recent' => 'Kürzlich angesehene Bücher',
'books_new' => 'Neue Bücher',
+ 'books_new_action' => 'Neues Buch',
'books_popular_empty' => 'Die beliebtesten Bücher werden hier angezeigt.',
'books_new_empty' => 'Die neusten Bücher werden hier angezeigt.',
'books_create' => 'Neues Buch erstellen',
@@ -118,7 +124,6 @@ return [
'books_permissions_updated' => 'Buch-Berechtigungen aktualisiert',
'books_empty_contents' => 'Es sind noch keine Seiten oder Kapitel zu diesem Buch hinzugefügt worden.',
'books_empty_create_page' => 'Neue Seite anlegen',
- 'books_empty_or' => 'oder',
'books_empty_sort_current_book' => 'Aktuelles Buch sortieren',
'books_empty_add_chapter' => 'Neues Kapitel hinzufügen',
'books_permissions_active' => 'Buch-Berechtigungen aktiv',
@@ -126,6 +131,11 @@ return [
'books_navigation' => 'Buchnavigation',
'books_sort' => 'Buchinhalte sortieren',
'books_sort_named' => 'Buch ":bookName" sortieren',
+ 'books_sort_name' => 'Sortieren nach Namen',
+ 'books_sort_created' => 'Sortieren nach Erstellungsdatum',
+ 'books_sort_updated' => 'Sortieren nach Aktualisierungsdatum',
+ 'books_sort_chapters_first' => 'Kapitel zuerst',
+ 'books_sort_chapters_last' => 'Kapitel zuletzt',
'books_sort_show_other' => 'Andere Bücher anzeigen',
'books_sort_save' => 'Neue Reihenfolge speichern',
/**
@@ -232,6 +242,7 @@ return [
'page_tags' => 'Seiten-Schlagwörter',
'chapter_tags' => 'Kapitel-Schlagwörter',
'book_tags' => 'Buch-Schlagwörter',
+ 'shelf_tags' => 'Regal-Schlagwörter',
'tag' => 'Schlagwort',
'tags' => 'Schlagwörter',
'tag_value' => 'Inhalt (Optional)',
@@ -270,6 +281,7 @@ return [
'profile_not_created_pages' => ':userName hat noch keine Seiten erstellt.',
'profile_not_created_chapters' => ':userName hat noch keine Kapitel erstellt.',
'profile_not_created_books' => ':userName hat noch keine Bücher erstellt.',
+ 'profile_not_created_shelves' => ':userName hat noch keine Regale erstellt.',
/**
* Comments
*/
@@ -294,6 +306,7 @@ return [
* Revision
*/
'revision_delete_confirm' => 'Sind Sie sicher, dass Sie diese Revision löschen wollen?',
+ 'revision_restore_confirm' => 'Sind Sie sicher, dass Sie diese Revision wiederherstellen wollen? Der aktuelle Seiteninhalt wird ersetzt.',
'revision_delete_success' => 'Revision gelöscht',
'revision_cannot_delete_latest' => 'Die letzte Version kann nicht gelöscht werden.'
];
diff --git a/resources/lang/de/errors.php b/resources/lang/de/errors.php
index dc95d1d2b..362641bc8 100644
--- a/resources/lang/de/errors.php
+++ b/resources/lang/de/errors.php
@@ -30,6 +30,7 @@ return [
'cannot_get_image_from_url' => 'Bild konnte nicht von der URL :url geladen werden.',
'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfen Sie, ob die GD PHP-Erweiterung installiert ist.',
'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.',
+ 'uploaded' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.',
'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.',
'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.',
'file_upload_timeout' => 'Der Upload der Datei ist abgelaufen.',
@@ -43,6 +44,7 @@ return [
// Entities
'entity_not_found' => 'Eintrag nicht gefunden',
'book_not_found' => 'Buch nicht gefunden',
+ 'bookshelf_not_found' => 'Regal nicht gefunden',
'page_not_found' => 'Seite nicht gefunden',
'chapter_not_found' => 'Kapitel nicht gefunden',
'selected_book_not_found' => 'Das gewählte Buch wurde nicht gefunden.',
@@ -55,6 +57,8 @@ return [
'role_cannot_be_edited' => 'Diese Rolle kann nicht bearbeitet werden.',
'role_system_cannot_be_deleted' => 'Dies ist eine Systemrolle und kann nicht gelöscht werden',
'role_registration_default_cannot_delete' => 'Diese Rolle kann nicht gelöscht werden, solange sie als Standardrolle für neue Registrierungen gesetzt ist',
+ 'role_cannot_remove_only_admin' => 'Dieser Benutzer ist der einzige Benutzer, welchem die Administratorrolle zugeordnet ist. Ordnen Sie die Administratorrolle einem anderen Benutzer zu, bevor Sie versuchen, sie hier zu entfernen.',
+
// Comments
'comment_list' => 'Beim Abrufen der Kommentare ist ein Fehler aufgetreten.',
'cannot_add_comment_to_draft' => 'Du kannst keine Kommentare zu einem Entwurf hinzufügen.',
diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php
index 0a8d50d05..11050924e 100644
--- a/resources/lang/de/settings.php
+++ b/resources/lang/de/settings.php
@@ -11,10 +11,16 @@ return [
/**
* App settings
*/
- 'app_settings' => 'Anwendungseinstellungen',
+ 'app_customization' => 'Personalisierung',
+ 'app_features_security' => 'Funktionen & Sicherheit',
'app_name' => 'Anwendungsname',
'app_name_desc' => 'Dieser Name wird im Header und in E-Mails angezeigt.',
'app_name_header' => 'Anwendungsname im Header anzeigen?',
+ 'app_public_access' => 'Öffentlicher Zugriff',
+ 'app_public_access_desc' => 'Wenn Sie diese Option aktivieren, können Besucher, die nicht angemeldet sind, auf Inhalte in Ihrer BookStack-Instanz zugreifen.',
+ 'app_public_access_desc_guest' => 'Der Zugang für öffentliche Besucher kann über den Benutzer "Guest" gesteuert werden.',
+ '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_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.',
@@ -28,22 +34,25 @@ return [
'app_primary_color_desc' => "Dies sollte ein HEX Wert sein.\nWenn Sie nicht eingeben, wird die Anwendung auf die Standardfarbe zurückgesetzt.",
'app_homepage' => 'Startseite der Anwendung',
'app_homepage_desc' => 'Wählen Sie eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.',
- 'app_homepage_default' => 'Ausgewählte Startseite',
- 'app_homepage_books' => 'Oder wähle die Buch-Übersicht als Startseite. Das wird die Seiten-Auswahl überschreiben.',
+ 'app_homepage_select' => 'Wählen Sie eine Seite aus',
'app_disable_comments' => 'Kommentare deaktivieren',
+ 'app_disable_comments_toggle' => 'Kommentare deaktivieren',
'app_disable_comments_desc' => 'Deaktiviert Kommentare über alle Seiten in der Anwendung. Vorhandene Kommentare werden nicht angezeigt.',
/**
* Registration settings
*/
'reg_settings' => 'Registrierungseinstellungen',
- 'reg_allow' => 'Registrierung erlauben?',
+ 'reg_enable' => 'Registrierung erlauben?',
+ '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_confirm_email' => 'Bestätigung per E-Mail erforderlich?',
+ '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.',
'reg_confirm_restrict_domain' => 'Registrierung auf bestimmte Domains einschränken',
'reg_confirm_restrict_domain_desc' => "Fügen sie eine durch Komma getrennte Liste von Domains hinzu, auf die die Registrierung eingeschränkt werden soll. Benutzern wird eine E-Mail gesendet, um ihre E-Mail Adresse zu bestätigen, bevor sie diese Anwendung nutzen können.\nHinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung ändern.",
'reg_confirm_restrict_domain_placeholder' => 'Keine Einschränkung gesetzt',
-
+
/**
* Maintenance settings
*/
@@ -74,6 +83,7 @@ return [
'role_details' => 'Rollendetails',
'role_name' => 'Rollenname',
'role_desc' => 'Kurzbeschreibung der Rolle',
+ 'role_external_auth_id' => 'Externe Authentifizierungs-IDs',
'role_system' => 'System-Berechtigungen',
'role_manage_users' => 'Benutzer verwalten',
'role_manage_roles' => 'Rollen und Rollen-Berechtigungen verwalten',
@@ -82,6 +92,7 @@ return [
'role_manage_settings' => 'Globaleinstellungen verwalten',
'role_asset' => 'Berechtigungen',
'role_asset_desc' => 'Diese Berechtigungen gelten für den Standard-Zugriff innerhalb des Systems. Berechtigungen für Bücher, Kapitel und Seiten überschreiben diese Berechtigungenen.',
+ 'role_asset_admins' => 'Administratoren erhalten automatisch Zugriff auf alle Inhalte, aber diese Optionen können Oberflächenoptionen ein- oder ausblenden.',
'role_all' => 'Alle',
'role_own' => 'Eigene',
'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt',
@@ -96,8 +107,15 @@ return [
'user_profile' => 'Benutzerprofil',
'users_add_new' => 'Benutzer hinzufügen',
'users_search' => 'Benutzer suchen',
+ 'users_details' => 'Benutzerdetails',
+ 'users_details_desc' => 'Legen Sie für diesen Benutzer einen Anzeigenamen und eine E-Mail-Adresse fest. Die E-Mail-Adresse wird bei der Anmeldung verwendet.',
+ 'users_details_desc_no_email' => 'Legen Sie für diesen Benutzer einen Anzeigenamen fest, damit andere ihn erkennen können.',
'users_role' => 'Benutzerrollen',
+ '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_external_auth_id' => 'Externe Authentifizierungs-ID',
+ 'users_external_auth_id_desc' => 'Dies ist die ID, die verwendet wird, um diesen Benutzer bei der Kommunikation mit Ihrem LDAP-System abzugleichen.',
'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',
@@ -111,6 +129,7 @@ return [
'users_avatar' => 'Benutzer-Bild',
'users_avatar_desc' => 'Das Bild sollte eine Auflösung von 256x256px haben.',
'users_preferred_language' => 'Bevorzugte Sprache',
+ 'users_preferred_language_desc' => 'Diese Option ändert die Sprache, die für die Benutzeroberfläche der Anwendung verwendet wird. Dies hat keinen Einfluss auf von Benutzern erstellte Inhalte.',
'users_social_accounts' => 'Social-Media Konten',
'users_social_accounts_info' => 'Hier können Sie andere Social-Media-Konten für eine schnellere und einfachere Anmeldung verknüpfen. Wenn Sie ein Social-Media Konto lösen, bleibt der Zugriff erhalten. Entfernen Sie in diesem Falle die Berechtigung in Ihren Profil-Einstellungen des verknüpften Social-Media-Kontos.',
'users_social_connect' => 'Social-Media-Konto verknüpfen',
diff --git a/resources/lang/de/validation.php b/resources/lang/de/validation.php
index 5ac4b1b27..84faeebb7 100644
--- a/resources/lang/de/validation.php
+++ b/resources/lang/de/validation.php
@@ -38,6 +38,7 @@ return [
'filled' => ':attribute ist erforderlich.',
'exists' => ':attribute ist ungültig.',
'image' => ':attribute muss ein Bild sein.',
+ 'image_extension' => ':attribute muss eine gültige und unterstützte Bild-Dateiendung haben.',
'in' => ':attribute ist ungültig.',
'integer' => ':attribute muss eine Zahl sein.',
'ip' => ':attribute muss eine valide IP-Adresse sein.',
@@ -54,6 +55,7 @@ return [
'string' => ':attribute muss mindestens :min Zeichen lang sein.',
'array' => ':attribute muss mindesten :min Elemente enthalten.',
],
+ 'no_double_extension' => ':attribute darf nur eine gültige Dateiendung',
'not_in' => ':attribute ist ungültig.',
'numeric' => ':attribute muss eine Zahl sein.',
'regex' => ':attribute ist in einem ungültigen Format.',
@@ -74,6 +76,7 @@ return [
'timezone' => ':attribute muss eine valide zeitzone sein.',
'unique' => ':attribute wird bereits verwendet.',
'url' => ':attribute ist kein valides Format.',
+ 'uploaded' => 'Die Datei konnte nicht hochgeladen werden. Der Server akzeptiert möglicherweise keine Dateien dieser Größe.',
/*
|--------------------------------------------------------------------------
@@ -90,6 +93,9 @@ return [
'attribute-name' => [
'rule-name' => 'custom-message',
],
+ 'password-confirm' => [
+ 'required_with' => 'Passwortbestätigung erforderlich',
+ ],
],
/*
diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php
index 3ef53a247..78f86b68e 100755
--- a/resources/lang/en/settings.php
+++ b/resources/lang/en/settings.php
@@ -157,7 +157,8 @@ return [
'ru' => 'Русский',
'uk' => 'Українська',
'zh_CN' => '简体中文',
- 'zh_TW' => '繁體中文'
+ 'zh_TW' => '繁體中文',
+ 'hu' => 'Magyar'
]
//!////////////////////////////////
];
diff --git a/resources/lang/fr/auth.php b/resources/lang/fr/auth.php
index 934dd56da..c9ce6a4d7 100644
--- a/resources/lang/fr/auth.php
+++ b/resources/lang/fr/auth.php
@@ -32,6 +32,8 @@ return [
'remember_me' => 'Se souvenir de moi',
'ldap_email_hint' => "Merci d'entrer une adresse e-mail pour ce compte",
'create_account' => 'Créer un compte',
+ 'already_have_account' => 'Vous avez déjà un compte?',
+ 'dont_have_account' => 'Vous n\'avez pas de compte?',
'social_login' => 'Social Login',
'social_registration' => 'Enregistrement Social',
'social_registration_text' => "S'inscrire et se connecter avec un réseau social",
@@ -73,4 +75,4 @@ return [
'email_not_confirmed_click_link' => 'Merci de cliquer sur le lien dans l\'e-mail qui vous a été envoyé après l\'enregistrement.',
'email_not_confirmed_resend' => 'Si vous ne retrouvez plus l\'e-mail, vous pouvez renvoyer un e-mail de confirmation en utilisant le formulaire ci-dessous.',
'email_not_confirmed_resend_button' => 'Renvoyez l\'e-mail de confirmation',
-];
\ No newline at end of file
+];
diff --git a/resources/lang/fr/common.php b/resources/lang/fr/common.php
index 3bff2841b..1cf6e716f 100644
--- a/resources/lang/fr/common.php
+++ b/resources/lang/fr/common.php
@@ -10,6 +10,7 @@ return [
'save' => 'Enregistrer',
'continue' => 'Continuer',
'select' => 'Sélectionner',
+ 'toggle_all' => 'Tout sélectionner',
'more' => 'Montrer plus',
/**
@@ -19,13 +20,14 @@ return [
'description' => 'Description',
'role' => 'Rôle',
'cover_image' => 'Image de couverture',
- 'cover_image_description' => 'Cette image doit être environ 300x170px.',
+ 'cover_image_description' => 'Cette image doit être environ 440x250px.',
/**
* Actions
*/
'actions' => 'Actions',
'view' => 'Voir',
+ 'view_all' => 'Tout afficher',
'create' => 'Créer',
'update' => 'Modifier',
'edit' => 'Editer',
@@ -40,6 +42,13 @@ return [
'remove' => 'Enlever',
'add' => 'Ajouter',
+ /**
+ * Sort Options
+ */
+ 'sort_name' => 'Nom',
+ 'sort_created_at' => 'Date de création',
+ 'sort_updated_at' => 'Date de mise à jour',
+
/**
* Misc
*/
@@ -65,4 +74,4 @@ return [
*/
'email_action_help' => 'Si vous rencontrez des problèmes pour cliquer sur le bouton ":actionText", copiez et collez l\'adresse ci-dessous dans votre navigateur :',
'email_rights' => 'Tous droits réservés',
-];
\ No newline at end of file
+];
diff --git a/resources/lang/fr/entities.php b/resources/lang/fr/entities.php
index b07a5c465..4ba1a36e3 100644
--- a/resources/lang/fr/entities.php
+++ b/resources/lang/fr/entities.php
@@ -9,6 +9,7 @@ return [
'recently_updated_pages' => 'Pages mises à jour récemment',
'recently_created_chapters' => 'Chapitres créés récemment',
'recently_created_books' => 'Livres créés récemment',
+ 'recently_created_shelves' => 'Étagères créés récemment',
'recently_update' => 'Mis à jour récemment',
'recently_viewed' => 'Vus récemment',
'recent_activity' => 'Activité récente',
@@ -71,11 +72,13 @@ return [
*/
'shelf' => 'Étagère',
'shelves' => 'Étagères',
+ 'x_shelves' => ':count Étagère|:count Étagères',
'shelves_long' => 'Étagères',
'shelves_empty' => 'Aucune étagère n\'a été créée',
'shelves_create' => 'Créer une nouvelle étagère',
'shelves_popular' => 'Étagères populaires',
'shelves_new' => 'Nouvelles Étagères',
+ 'shelves_new_action' => 'Nouvelle Étagère',
'shelves_popular_empty' => 'Les étagères les plus populaires apparaîtront ici.',
'shelves_new_empty' => 'Les étagères les plus récentes apparaitront ici.',
'shelves_save' => 'Enregistrer l\'étagère',
@@ -108,6 +111,7 @@ return [
'books_popular' => 'Livres populaires',
'books_recent' => 'Livres récents',
'books_new' => 'Nouveaux livres',
+ 'books_new_action' => 'Nouveau livre',
'books_popular_empty' => 'Les livres les plus populaires apparaîtront ici.',
'books_new_empty' => 'Les livres les plus récents apparaitront ici.',
'books_create' => 'Créer un nouveau livre',
@@ -131,6 +135,11 @@ return [
'books_navigation' => 'Navigation dans le livre',
'books_sort' => 'Trier les contenus du livre',
'books_sort_named' => 'Trier le livre :bookName',
+ 'books_sort_name' => 'Trier par le nom',
+ 'books_sort_created' => 'Trier par la date de création',
+ 'books_sort_updated' => 'Trier par la date de mise à jour',
+ 'books_sort_chapters_first' => 'Les chapitres en premier',
+ 'books_sort_chapters_last' => 'Les chapitres en dernier',
'books_sort_show_other' => 'Afficher d\'autres livres',
'books_sort_save' => 'Enregistrer l\'ordre',
@@ -281,6 +290,7 @@ return [
'profile_not_created_pages' => ':userName n\'a pas créé de page',
'profile_not_created_chapters' => ':userName n\'a pas créé de chapitre',
'profile_not_created_books' => ':userName n\'a pas créé de livre',
+ 'profile_not_created_shelves' => ':userName n\'a pas créé d\'étagère',
/**
* Comments
@@ -308,4 +318,4 @@ return [
'revision_delete_confirm' => 'Êtes-vous sûr de vouloir supprimer cette révision?',
'revision_delete_success' => 'Révision supprimée',
'revision_cannot_delete_latest' => 'Impossible de supprimer la dernière révision.'
-];
\ No newline at end of file
+];
diff --git a/resources/lang/fr/settings.php b/resources/lang/fr/settings.php
index 4251fe87d..f978114c5 100644
--- a/resources/lang/fr/settings.php
+++ b/resources/lang/fr/settings.php
@@ -16,12 +16,18 @@ return [
* App settings
*/
- 'app_settings' => 'Préférences de l\'application',
+ 'app_customization' => 'Personnalisation',
+ 'app_features_security' => 'Fonctionnalités et sécurité',
'app_name' => 'Nom de l\'application',
'app_name_desc' => 'Ce nom est affiché dans l\'en-tête et les e-mails.',
'app_name_header' => 'Afficher le nom dans l\'en-tête ?',
+ 'app_public_access' => 'Accès public',
+ 'app_public_access_desc' => 'L\'activation de cette option permettra aux visiteurs, qui ne sont pas connectés, d\'accéder au contenu de votre instance BookStack.',
+ 'app_public_access_desc_guest' => 'L\'accès pour les visiteurs publics peut être contrôlé par l\'utilisateur "Guest".',
+ 'app_public_access_toggle' => 'Autoriser l\'accès public',
'app_public_viewing' => 'Accepter le visionnage public des pages ?',
'app_secure_images' => 'Activer l\'ajout d\'image sécurisé ?',
+ 'app_secure_images_toggle' => 'Activer l\'ajout d\'image sécurisé',
'app_secure_images_desc' => 'Pour des questions de performances, toutes les images sont publiques. Cette option ajoute une chaîne aléatoire difficile à deviner dans les URLs des images.',
'app_editor' => 'Editeur des pages',
'app_editor_desc' => 'Sélectionnez l\'éditeur qui sera utilisé pour modifier les pages.',
@@ -35,6 +41,7 @@ return [
'app_homepage_desc' => 'Choisissez une page à afficher sur la page d\'accueil au lieu de la vue par défaut. Les permissions sont ignorées pour les pages sélectionnées.',
'app_homepage_select' => 'Choisissez une page',
'app_disable_comments' => 'Désactiver les commentaires',
+ 'app_disable_comments_toggle' => 'Désactiver les commentaires',
'app_disable_comments_desc' => 'Désactive les commentaires sur toutes les pages de l\'application. Les commentaires existants ne sont pas affichés.',
/**
@@ -42,9 +49,12 @@ return [
*/
'reg_settings' => 'Préférence pour l\'inscription',
- 'reg_allow' => 'Accepter l\'inscription ?',
+ 'reg_enable' => 'Activer l\'inscription',
+ '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_confirm_email' => 'Obliger la confirmation par e-mail ?',
+ '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.',
'reg_confirm_restrict_domain' => 'Restreindre l\'inscription à un domaine',
'reg_confirm_restrict_domain_desc' => 'Entrez une liste de domaines acceptés lors de l\'inscription, séparés par une virgule. Les utilisateurs recevront un e-mail de confirmation à cette adresse.
Les utilisateurs pourront changer leur adresse après inscription s\'ils le souhaitent.',
@@ -107,8 +117,15 @@ return [
'user_profile' => 'Profil d\'utilisateur',
'users_add_new' => 'Ajouter un nouvel utilisateur',
'users_search' => 'Chercher les utilisateurs',
- 'users_role' => 'Rôles des utilisateurs',
+ 'users_details' => 'Informations de l\'utilisateur',
+ 'users_details_desc' => 'Définissez un nom et une adresse e-mail pour cet utilisateur. L\'adresse e-mail sera utilisée pour se connecter à l\'application.',
+ 'users_details_desc_no_email' => 'Définissez un nom d\'affichage pour cet utilisateur afin que les autres puissent le reconnaître.',
+ 'users_role' => 'Rôles de l\'utilisateur',
+ 'users_role_desc' => 'Sélectionnez les rôles auxquels cet utilisateur sera affecté. Si un utilisateur est affecté à plusieurs rôles, les permissions de ces rôles s\'empileront et ils recevront toutes les capacités des rôles affectés.',
+ 'users_password' => 'Mot de passe de l\'utilisateur',
+ 'users_password_desc' => 'Définissez un mot de passe utilisé pour vous connecter à l\'application. Il doit comporter au moins 5 caractères.',
'users_external_auth_id' => 'Identifiant d\'authentification externe',
+ 'users_external_auth_id_desc' => 'Il s\'agit de l\'identifiant utilisé pour appairer cet utilisateur lors de la communication avec votre système LDAP.',
'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',
@@ -122,6 +139,7 @@ return [
'users_avatar' => 'Avatar de l\'utilisateur',
'users_avatar_desc' => 'Cette image doit être un carré d\'environ 256px.',
'users_preferred_language' => 'Langue préférée',
+ 'users_preferred_language_desc' => 'Cette option changera la langue utilisée pour l\'interface utilisateur de l\'application. Ceci n\'affectera aucun contenu créé par l\'utilisateur.',
'users_social_accounts' => 'Comptes sociaux',
'users_social_accounts_info' => 'Vous pouvez connecter des réseaux sociaux à votre compte pour vous connecter plus rapidement. Déconnecter un compte n\'enlèvera pas les accès autorisés précédemment sur votre compte de réseau social.',
'users_social_connect' => 'Connecter le compte',
diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php
index 9204f4e2d..4be55df4f 100644
--- a/resources/lang/fr/validation.php
+++ b/resources/lang/fr/validation.php
@@ -38,6 +38,7 @@ return [
'filled' => ':attribute est un champ requis.',
'exists' => 'L\'attribut :attribute est invalide.',
'image' => ':attribute doit être une image.',
+ 'image_extension' => ':attribute doit avoir une extension d\'image valide et supportée.',
'in' => 'L\'attribut :attribute est invalide.',
'integer' => ':attribute doit être un chiffre entier.',
'ip' => ':attribute doit être une adresse IP valide.',
@@ -54,6 +55,7 @@ return [
'string' => ':attribute doit contenir au moins :min caractères.',
'array' => ':attribute doit contenir au moins :min éléments.',
],
+ 'no_double_extension' => ':attribute ne doit avoir qu\'une seule extension de fichier.',
'not_in' => 'L\'attribut sélectionné :attribute est invalide.',
'numeric' => ':attribute doit être un nombre.',
'regex' => ':attribute a un format invalide.',
@@ -74,6 +76,7 @@ return [
'timezone' => ':attribute doit être une zone valide.',
'unique' => ':attribute est déjà utilisé.',
'url' => ':attribute a un format invalide.',
+ 'uploaded' => 'Le fichier n\'a pas pu être envoyé. Le serveur peut ne pas accepter des fichiers de cette taille.',
/*
|--------------------------------------------------------------------------
diff --git a/resources/lang/hu/activities.php b/resources/lang/hu/activities.php
new file mode 100644
index 000000000..575e9e509
--- /dev/null
+++ b/resources/lang/hu/activities.php
@@ -0,0 +1,48 @@
+ 'létrehozta az oldalt:',
+ 'page_create_notification' => 'Oldal sikeresen létrehozva',
+ 'page_update' => 'frissítette az oldalt:',
+ 'page_update_notification' => 'Oldal sikeresen frissítve',
+ 'page_delete' => 'törölte az oldalt:',
+ 'page_delete_notification' => 'Oldal sikeresen törölve',
+ 'page_restore' => 'visszaállította az oldalt:',
+ 'page_restore_notification' => 'Oldal sikeresen visszaállítva',
+ 'page_move' => 'áthelyezte az oldalt:',
+
+ // Chapters
+ 'chapter_create' => 'létrehozta a fejezetet:',
+ 'chapter_create_notification' => 'Fejezet sikeresen létrehozva',
+ 'chapter_update' => 'frissítette a fejezetet:',
+ 'chapter_update_notification' => 'Fejezet sikeresen frissítve',
+ 'chapter_delete' => 'törölte a fejezetet:',
+ 'chapter_delete_notification' => 'Fejezet sikeresen törölve',
+ 'chapter_move' => 'áthelyezte a fejezetet:',
+
+ // Books
+ 'book_create' => 'létrehozott egy könyvet:',
+ 'book_create_notification' => 'Könyv sikeresen létrehozva',
+ 'book_update' => 'frissítette a könyvet:',
+ 'book_update_notification' => 'Könyv sikeresen frissítve',
+ 'book_delete' => 'törölte a könyvet:',
+ 'book_delete_notification' => 'Könyv sikeresen törölve',
+ 'book_sort' => 'átrendezte a könyvet:',
+ 'book_sort_notification' => 'Könyv sikeresen újrarendezve',
+
+ // Bookshelves
+ 'bookshelf_create' => 'létrehozta a könyvespolcot:',
+ 'bookshelf_create_notification' => 'Könyvespolc sikeresen létrehozva',
+ 'bookshelf_update' => 'frissítette a könyvespolcot:',
+ 'bookshelf_update_notification' => 'Könyvespolc sikeresen frissítve',
+ 'bookshelf_delete' => 'törölte a könyvespolcot:',
+ 'bookshelf_delete_notification' => 'Könyvespolc sikeresen törölve',
+
+ // Other
+ 'commented_on' => 'megjegyzést fűzött hozzá:',
+];
diff --git a/resources/lang/hu/auth.php b/resources/lang/hu/auth.php
new file mode 100644
index 000000000..1a7ba0b34
--- /dev/null
+++ b/resources/lang/hu/auth.php
@@ -0,0 +1,67 @@
+ 'Ezek a hitelesítő adatok nem egyeznek a rögzítettekkel.',
+ 'throttle' => 'Túl sok bejelentkezési próbálkozás. :seconds múlva lehet újra megpróbálni.',
+
+ // Login & Register
+ 'sign_up' => 'Regisztráció',
+ 'log_in' => 'Bejelentkezés',
+ 'log_in_with' => 'Bejelentkezés ezzel: :socialDriver',
+ 'sign_up_with' => 'Regisztráció ezzel: :socialDriver',
+ 'logout' => 'Kijelentkezés',
+
+ 'name' => 'Név',
+ 'username' => 'Felhasználónév',
+ 'email' => 'Email',
+ 'password' => 'Jelszó',
+ 'password_confirm' => 'Jelszó megerősítése',
+ 'password_hint' => 'Öt karakternél hosszabbnak kell lennie',
+ 'forgot_password' => 'Elfelejtett jelszó?',
+ 'remember_me' => 'Emlékezzen rám',
+ 'ldap_email_hint' => 'A fiókhoz használt email cím megadása.',
+ 'create_account' => 'Fiók létrehozása',
+ 'already_have_account' => 'Korábban volt beállítva fiók?',
+ 'dont_have_account' => 'Még nincs beállítva fiók?',
+ 'social_login' => 'Közösségi bejelentkezés',
+ 'social_registration' => 'Közösségi regisztráció',
+ 'social_registration_text' => 'Regisztráció és bejelentkezés másik szolgáltatással.',
+
+ 'register_thanks' => 'Köszönjük a regisztrációt!',
+ 'register_confirm' => 'Ellenőrizni kell a megadott email címet és a megerősítő gombra kell kattintani :appName eléréséhez.',
+ 'registrations_disabled' => 'A regisztráció jelenleg le van tiltva',
+ 'registration_email_domain_invalid' => 'Ebből az email tartományról nem lehet hozzáférni ehhez az alkalmazáshoz',
+ 'register_success' => 'Köszönjük a regisztrációt! A regisztráció és a bejelentkezés megtörtént.',
+
+
+ // Password Reset
+ 'reset_password' => 'Jelszó visszaállítása',
+ 'reset_password_send_instructions' => 'Meg kell adni az email címet amire egy jelszó visszaállító hivatkozás lesz elküldve.',
+ 'reset_password_send_button' => 'Visszaállító hivatkozás elküldése',
+ 'reset_password_sent_success' => 'Jelszó visszaállító hivatkozás elküldve :email címre.',
+ 'reset_password_success' => 'A jelszó sikeresen visszaállítva.',
+ 'email_reset_subject' => ':appName jelszó visszaállítása',
+ 'email_reset_text' => 'Ezt az emailt azért küldtük mert egy jelszó visszaállításra vonatkozó kérést kaptunk ebből a fiókból.',
+ 'email_reset_not_requested' => 'Ha nem történt jelszó visszaállításra vonatkozó kérés, akkor nincs szükség további intézkedésre.',
+
+
+ // Email Confirmation
+ 'email_confirm_subject' => ':appName alklamazásban beállított email címet meg kell erősíteni',
+ 'email_confirm_greeting' => ':appName köszöni a csatlakozást!',
+ 'email_confirm_text' => 'Az email címet a lenti gombra kattintva lehet megerősíteni:',
+ 'email_confirm_action' => 'Email megerősítése',
+ 'email_confirm_send_error' => 'Az email megerősítés kötelező, de a rendszer nem tudta elküldeni az emailt. Fel kell venni a kapcsolatot az adminisztrátorral és meg kell győződni róla, hogy az email beállítások megfelelőek.',
+ 'email_confirm_success' => 'Az email cím megerősítve!',
+ 'email_confirm_resent' => 'Megerősítő email újraküldve. Ellenőrizni kell a bejövő üzeneteket.',
+
+ 'email_not_confirmed' => 'Az email cím nincs megerősítve',
+ 'email_not_confirmed_text' => 'Az email cím még nincs megerősítve.',
+ 'email_not_confirmed_click_link' => 'Rá kell kattintani a regisztráció után nem sokkal elküldött emailben található hivatkozásra.',
+ 'email_not_confirmed_resend' => 'Ha nem érkezik meg a megerősítő email, a lenti űrlap beküldésével újra lehet küldeni.',
+ 'email_not_confirmed_resend_button' => 'Megerősítő email újraküldése',
+];
\ No newline at end of file
diff --git a/resources/lang/hu/common.php b/resources/lang/hu/common.php
new file mode 100644
index 000000000..4e72d5f94
--- /dev/null
+++ b/resources/lang/hu/common.php
@@ -0,0 +1,70 @@
+ 'Mégsem',
+ 'confirm' => 'Megerősítés',
+ 'back' => 'Vissza',
+ 'save' => 'Mentés',
+ 'continue' => 'Tovább',
+ 'select' => 'Kiválasztás',
+ 'toggle_all' => 'Összes átkapcsolása',
+ 'more' => 'Több',
+
+ // Form Labels
+ 'name' => 'Név',
+ 'description' => 'Leírás',
+ 'role' => 'Szerepkör',
+ 'cover_image' => 'Borítókép',
+ 'cover_image_description' => 'A kép méretének kb. 440x250px-nek kell lennie.',
+
+ // Actions
+ 'actions' => 'Műveletek',
+ 'view' => 'Megtekintés',
+ 'view_all' => 'Összes megtekintése',
+ 'create' => 'Létrehozás',
+ 'update' => 'Frissítés',
+ 'edit' => 'Szerkesztés',
+ 'sort' => 'Rendezés',
+ 'move' => 'Áthelyezés',
+ 'copy' => 'Másolás',
+ 'reply' => 'Válasz',
+ 'delete' => 'Törlés',
+ 'search' => 'Keresés',
+ 'search_clear' => 'Keresés törlése',
+ 'reset' => 'Visszaállítás',
+ 'remove' => 'Eltávolítás',
+ 'add' => 'Hozzáadás',
+
+ // Sort Options
+ 'sort_name' => 'Név',
+ 'sort_created_at' => 'Létrehozás dátuma',
+ 'sort_updated_at' => 'Frissítés dátuma',
+
+ // Misc
+ 'deleted_user' => 'Törölt felhasználó',
+ 'no_activity' => 'Nincs megjeleníthető aktivitás',
+ 'no_items' => 'Nincsenek elérhető elemek',
+ 'back_to_top' => 'Oldal eleje',
+ 'toggle_details' => 'Részletek átkapcsolása',
+ 'toggle_thumbnails' => 'Bélyegképek átkapcsolása',
+ 'details' => 'Részletek',
+ 'grid_view' => 'Rács nézet',
+ 'list_view' => 'Lista nézet',
+ 'default' => 'Alapértelmezés szerinti',
+
+ // Header
+ 'view_profile' => 'Profil megtekintése',
+ 'edit_profile' => 'Profil szerkesztése',
+
+ // Layout tabs
+ 'tab_info' => 'Információ',
+ 'tab_content' => 'Tartalom',
+
+ // Email Content
+ 'email_action_help' => 'Probléma esetén a lenti ":actionText" gombra kell kattintani, majd ki kell másolni a lenti webcímet és be kell illeszteni egy böngészőbe:',
+ 'email_rights' => 'Minden jog fenntartva',
+];
diff --git a/resources/lang/hu/components.php b/resources/lang/hu/components.php
new file mode 100644
index 000000000..1f98df2df
--- /dev/null
+++ b/resources/lang/hu/components.php
@@ -0,0 +1,33 @@
+ 'Kép kiválasztása',
+ 'image_all' => 'Összes',
+ 'image_all_title' => 'Összes kép megtekintése',
+ 'image_book_title' => 'A könyv feltöltött képek megtekintése',
+ 'image_page_title' => 'Az oldalra feltöltött képek megtekintése',
+ 'image_search_hint' => 'Keresés kép neve alapján',
+ 'image_uploaded' => 'Feltöltve ekkor: :uploadedDate',
+ 'image_load_more' => 'Több betöltése',
+ 'image_image_name' => 'Kép neve',
+ 'image_delete_used' => 'Ez a kép a lenti oldalakon van használatban.',
+ 'image_delete_confirm' => 'A kép törléséhez ismét rá kell kattintani a törlésre.',
+ 'image_select_image' => 'Kép kiválasztása',
+ 'image_dropzone' => 'Képek feltöltése ejtéssel vagy kattintással',
+ 'images_deleted' => 'Képek törölve',
+ 'image_preview' => 'Kép előnézete',
+ 'image_upload_success' => 'Kép sikeresen feltöltve',
+ 'image_update_success' => 'Kép részletei sikeresen frissítve',
+ 'image_delete_success' => 'Kép sikeresen törölve',
+ 'image_upload_remove' => 'Eltávolítás',
+
+ // Code Editor
+ 'code_editor' => 'Kód szerkesztése',
+ 'code_language' => 'Kód nyelve',
+ 'code_content' => 'Kód tartalom',
+ 'code_save' => 'Kód mentése',
+];
diff --git a/resources/lang/hu/entities.php b/resources/lang/hu/entities.php
new file mode 100644
index 000000000..5bd865dd5
--- /dev/null
+++ b/resources/lang/hu/entities.php
@@ -0,0 +1,305 @@
+ 'Legutóbb létrehozott',
+ 'recently_created_pages' => 'Legutóbb létrehozott oldalak',
+ 'recently_updated_pages' => 'Legutóbb frissített oldalak',
+ 'recently_created_chapters' => 'Legutóbb létrehozott fejezetek',
+ 'recently_created_books' => 'Legutóbb létrehozott könyvek',
+ 'recently_created_shelves' => 'Legutóbb létrehozott polcok',
+ 'recently_update' => 'Legutóbb frissített',
+ 'recently_viewed' => 'Legutóbb megtekintett',
+ 'recent_activity' => 'Legutóbbi tevékenység',
+ 'create_now' => 'Létrehozás most',
+ 'revisions' => 'Változatok',
+ 'meta_revision' => 'Változat #:revisionCount',
+ 'meta_created' => 'Létrehozva :timeLength',
+ 'meta_created_name' => ':user hozta létre :timeLength',
+ 'meta_updated' => 'Frissítve :timeLength',
+ 'meta_updated_name' => ':user frissítette :timeLength',
+ 'entity_select' => 'Entitás kiválasztása',
+ 'images' => 'Képek',
+ 'my_recent_drafts' => 'Legutóbbi vázlataim',
+ 'my_recently_viewed' => 'Általam legutóbb megtekintett',
+ 'no_pages_viewed' => 'Még nincsenek általam megtekintett oldalak',
+ 'no_pages_recently_created' => 'Nincsenek legutóbb létrehozott oldalak',
+ 'no_pages_recently_updated' => 'Nincsenek legutóbb frissített oldalak',
+ 'export' => 'Exportálás',
+ 'export_html' => 'Webfájlt tartalmaz',
+ 'export_pdf' => 'PDF fájl',
+ 'export_text' => 'Egyszerű szövegfájl',
+
+ // Permissions and restrictions
+ 'permissions' => 'Jogosultságok',
+ 'permissions_intro' => 'Ha engedélyezett, ezek a jogosultságok elsőbbséget élveznek bármely beállított szerepkör jogosultsággal szemben.',
+ 'permissions_enable' => 'Egyéni jogosultságok engedélyezése',
+ 'permissions_save' => 'Jogosultságok mentése',
+
+ // Search
+ 'search_results' => 'Keresési eredmények',
+ 'search_total_results_found' => ':count találat|összesen :count találat',
+ 'search_clear' => 'Keresés törlése',
+ 'search_no_pages' => 'Nincsenek a keresésnek megfelelő oldalak',
+ 'search_for_term' => ':term keresése',
+ 'search_more' => 'További eredmények',
+ 'search_filters' => 'Keresési szűrők',
+ 'search_content_type' => 'Tartalomtípus',
+ 'search_exact_matches' => 'Pontos egyezések',
+ 'search_tags' => 'Címke keresések',
+ 'search_options' => 'Beállítások',
+ 'search_viewed_by_me' => 'Általam megtekintett',
+ 'search_not_viewed_by_me' => 'Általam nem megtekintett',
+ 'search_permissions_set' => 'Jogosultságok beállítva',
+ 'search_created_by_me' => 'Általam létrehozott',
+ 'search_updated_by_me' => 'Általam frissített',
+ 'search_date_options' => 'Dátum beállítások',
+ 'search_updated_before' => 'Frissítve ez előtt',
+ 'search_updated_after' => 'Frissítve ez után',
+ 'search_created_before' => 'Létrehozva ez előtt',
+ 'search_created_after' => 'Létrehozva ez után',
+ 'search_set_date' => 'Dátum beállítása',
+ 'search_update' => 'Keresés frissítése',
+
+ // Shelves
+ 'shelf' => 'Polc',
+ 'shelves' => 'Polcok',
+ 'x_shelves' => ':count polc|:count polcok',
+ 'shelves_long' => 'Könyvespolcok',
+ 'shelves_empty' => 'Nincsenek könyvespolcok létrehozva',
+ 'shelves_create' => 'Új polc létrehozása',
+ 'shelves_popular' => 'Népszerű polcok',
+ 'shelves_new' => 'Új polcok',
+ 'shelves_new_action' => 'Új polc',
+ 'shelves_popular_empty' => 'A legnépszerűbb polcok itt fognak megjelenni.',
+ 'shelves_new_empty' => 'A legutoljára létrehozott polcok itt fognak megjelenni.',
+ 'shelves_save' => 'Polc mentése',
+ 'shelves_books' => 'Könyvek ezen a polcon',
+ 'shelves_add_books' => 'Könyvek hozzáadása ehhez a polchoz',
+ 'shelves_drag_books' => 'Könyveket áthúzással lehet elhelyezni ezen a polcon',
+ 'shelves_empty_contents' => 'Ehhez a polchoz nincsenek könyvek rendelve',
+ 'shelves_edit_and_assign' => 'Polc szerkesztése könyvek hozzárendeléséhez',
+ 'shelves_edit_named' => ':name könyvespolc szerkesztése',
+ 'shelves_edit' => 'Könyvespolc szerkesztése',
+ 'shelves_delete' => 'Könyvespolc törlése',
+ 'shelves_delete_named' => ':name könyvespolc törlése',
+ 'shelves_delete_explain' => "':name'. nevű könyvespolc ezzel le lesz törölve. A benne található könyvek nem lesznek törölve.",
+ 'shelves_delete_confirmation' => 'Biztosan törölhető ez a könyvespolc?',
+ 'shelves_permissions' => 'Könyvespolc jogosultság',
+ 'shelves_permissions_updated' => 'Könyvespolc jogosultságok frissítve',
+ 'shelves_permissions_active' => 'Könyvespolc jogosultságok aktívak',
+ 'shelves_copy_permissions_to_books' => 'Jogosultság másolása könyvekre',
+ 'shelves_copy_permissions' => 'Jogosultság másolása',
+ 'shelves_copy_permissions_explain' => 'Ez alkalmazni fogja ennek a könyvespolcnak az aktuális jogosultság beállításait az összes benne található könyvön. Aktiválás előtt ellenőrizni kell, hogy a könyvespolc jogosultságain végzett összes módosítás el lett mentve.',
+ 'shelves_copy_permission_success' => 'Könyvespolc jogosultságok átmásolva :count könyvre',
+
+ // Books
+ 'book' => 'Könyv',
+ 'books' => 'Könyvek',
+ 'x_books' => ':count könyv|:count könyv',
+ 'books_empty' => 'Nincsenek könyvek létrehozva',
+ 'books_popular' => 'Népszerű könyvek',
+ 'books_recent' => 'Legutóbbi könyvek',
+ 'books_new' => 'Új könyvek',
+ 'books_new_action' => 'Új könyv',
+ 'books_popular_empty' => 'A legnépszerűbb könyvek itt fognak megjelenni.',
+ 'books_new_empty' => 'A legutoljára létrehozott könyvek itt fognak megjelenni.',
+ 'books_create' => 'Új könyv létrehozása',
+ 'books_delete' => 'Könyv törlése',
+ 'books_delete_named' => ':bookName könyv törlése',
+ 'books_delete_explain' => '\':bookName\' nevű könyv törölve lesz. Minden oldal és fejezet el lesz távolítva.',
+ 'books_delete_confirmation' => 'Biztosan törölhető ez a könyv?',
+ 'books_edit' => 'Könyv szerkesztése',
+ 'books_edit_named' => ':bookName könyv szerkesztése',
+ 'books_form_book_name' => 'Könyv neve',
+ 'books_save' => 'Könyv mentése',
+ 'books_permissions' => 'Könyv jogosultságok',
+ 'books_permissions_updated' => 'Könyv jogosultságok frissítve',
+ 'books_empty_contents' => 'Ehhez a könyvhöz nincsenek oldalak vagy fejezetek létrehozva.',
+ 'books_empty_create_page' => 'Új oldal létrehozása',
+ 'books_empty_sort_current_book' => 'Aktuális könyv rendezése',
+ 'books_empty_add_chapter' => 'Fejezet hozzáadása',
+ 'books_permissions_active' => 'Könyv jogosultságok aktívak',
+ 'books_search_this' => 'Keresés ebben a könyvben',
+ 'books_navigation' => 'Könyv navigáció',
+ 'books_sort' => 'Könyv tartalmak rendezése',
+ 'books_sort_named' => ':bookName könyv rendezése',
+ 'books_sort_name' => 'Rendezés név szerint',
+ 'books_sort_created' => 'Rendezés létrehozás dátuma szerint',
+ 'books_sort_updated' => 'Rendezés frissítés dátuma szerint',
+ 'books_sort_chapters_first' => 'Fejezetek elől',
+ 'books_sort_chapters_last' => 'Fejezetek hátul',
+ 'books_sort_show_other' => 'Egyéb könyvek mutatása',
+ 'books_sort_save' => 'Új elrendezés mentése',
+
+ // Chapters
+ 'chapter' => 'Fejezet',
+ 'chapters' => 'Fejezetek',
+ 'x_chapters' => ':count fejezet|:count fejezetek',
+ 'chapters_popular' => 'Népszerű fejezetek',
+ 'chapters_new' => 'Új fejezet',
+ 'chapters_create' => 'Új fejezet létrehozása',
+ 'chapters_delete' => 'Fejezet törlése',
+ 'chapters_delete_named' => ':chapterName fejezet törlése',
+ 'chapters_delete_explain' => '\':chapterName\' nevű fejezet törölve lesz. Minden oldal el lesz távolítva és közvetlenül a szülő könyvhöz lesz hozzáadva.',
+ 'chapters_delete_confirm' => 'Biztosan törölhető ez a fejezet?',
+ 'chapters_edit' => 'Fejezet szerkesztése',
+ 'chapters_edit_named' => ':chapterName fejezet szerkesztése',
+ 'chapters_save' => 'Fejezet mentése',
+ 'chapters_move' => 'Fejezet áthelyezése',
+ 'chapters_move_named' => ':chapterName fejezet áthelyezése',
+ 'chapter_move_success' => 'Fejezet áthelyezve :bookName könyvbe',
+ 'chapters_permissions' => 'Fejezet jogosultságok',
+ 'chapters_empty' => 'Jelenleg nincsenek oldalak ebben a fejezetben.',
+ 'chapters_permissions_active' => 'Fejezet jogosultságok aktívak',
+ 'chapters_permissions_success' => 'Fejezet jogosultságok frissítve',
+ 'chapters_search_this' => 'Keresés ebben a fejezetben',
+
+ // Pages
+ 'page' => 'Oldal',
+ 'pages' => 'Oldalak',
+ 'x_pages' => ':count oldal|:count oldalak',
+ 'pages_popular' => 'Népszerű oldalak',
+ 'pages_new' => 'Új oldal',
+ 'pages_attachments' => 'Csatolmányok',
+ 'pages_navigation' => 'Oldal navigáció',
+ 'pages_delete' => 'Oldal törlése',
+ 'pages_delete_named' => ':pageName oldal törlése',
+ 'pages_delete_draft_named' => ':pageName vázlat oldal törlése',
+ 'pages_delete_draft' => 'Vázlat oldal törlése',
+ 'pages_delete_success' => 'Oldal törölve',
+ 'pages_delete_draft_success' => 'Vázlat oldal törölve',
+ 'pages_delete_confirm' => 'Biztosan törölhető ez az oldal?',
+ 'pages_delete_draft_confirm' => 'Biztosan törölhető ez a vázlatoldal?',
+ 'pages_editing_named' => ':pageName oldal szerkesztése',
+ 'pages_edit_toggle_header' => 'Fejléc átkapcsolása',
+ 'pages_edit_save_draft' => 'Vázlat mentése',
+ 'pages_edit_draft' => 'Oldal vázlat szerkesztése',
+ 'pages_editing_draft' => 'Vázlat szerkesztése',
+ 'pages_editing_page' => 'Oldal szerkesztése',
+ 'pages_edit_draft_save_at' => 'Vázlat elmentve:',
+ 'pages_edit_delete_draft' => 'Vázlat törlése',
+ 'pages_edit_discard_draft' => 'Vázlat elvetése',
+ 'pages_edit_set_changelog' => 'Változásnapló beállítása',
+ 'pages_edit_enter_changelog_desc' => 'A végrehajtott módosítások rövid leírása',
+ 'pages_edit_enter_changelog' => 'Változásnapló megadása',
+ 'pages_save' => 'Oldal mentése',
+ 'pages_title' => 'Oldal címe',
+ 'pages_name' => 'Oldal neve',
+ 'pages_md_editor' => 'Szerkesztő',
+ 'pages_md_preview' => 'Előnézet',
+ 'pages_md_insert_image' => 'Kép beillesztése',
+ 'pages_md_insert_link' => 'Entitás hivatkozás beillesztése',
+ 'pages_md_insert_drawing' => 'Rajz beillesztése',
+ 'pages_not_in_chapter' => 'Az oldal nincs fejezetben',
+ 'pages_move' => 'Oldal áthelyezése',
+ 'pages_move_success' => 'Oldal áthelyezve ide: ":parentName"',
+ 'pages_copy' => 'Oldal másolása',
+ 'pages_copy_desination' => 'Másolás célja',
+ 'pages_copy_success' => 'Oldal sikeresen lemásolva',
+ 'pages_permissions' => 'Oldal jogosultságok',
+ 'pages_permissions_success' => 'Oldal jogosultságok frissítve',
+ 'pages_revision' => 'Változat',
+ 'pages_revisions' => 'Oldal változatai',
+ 'pages_revisions_named' => ':pageName oldal változatai',
+ 'pages_revision_named' => ':pageName oldal változata',
+ 'pages_revisions_created_by' => 'Létrehozta:',
+ 'pages_revisions_date' => 'Változat dátuma',
+ 'pages_revisions_number' => '#',
+ 'pages_revisions_numbered' => 'Változat #:id',
+ 'pages_revisions_numbered_changes' => '#:id változat módosításai',
+ 'pages_revisions_changelog' => 'Változásnapló',
+ 'pages_revisions_changes' => 'Módosítások',
+ 'pages_revisions_current' => 'Aktuális verzió',
+ 'pages_revisions_preview' => 'Előnézet',
+ 'pages_revisions_restore' => 'Visszaállítás',
+ 'pages_revisions_none' => 'Ennek az oldalnak nincsenek változatai',
+ 'pages_copy_link' => 'Hivatkozás másolása',
+ 'pages_edit_content_link' => 'Tartalom szerkesztése',
+ 'pages_permissions_active' => 'Oldal jogosultságok aktívak',
+ 'pages_initial_revision' => 'Kezdeti közzététel',
+ 'pages_initial_name' => 'Új oldal',
+ 'pages_editing_draft_notification' => 'A jelenleg szerkesztett vázlat legutóbb ekkor volt elmentve: :timeDiff.',
+ 'pages_draft_edited_notification' => 'Ezt az oldalt azóta már frissítették. Javasolt ennek a vázlatnak az elvetése.',
+ 'pages_draft_edit_active' => [
+ 'start_a' => ':count felhasználók kezdte el szerkeszteni ezt az oldalt',
+ 'start_b' => ':userName elkezdte szerkeszteni ezt az oldalt',
+ 'time_a' => 'mióta az oldal utoljára frissítve volt',
+ 'time_b' => 'az utolsó :minCount percben',
+ 'message' => ':start :time. Ügyeljen arra, hogy ne írjuk felül egymás frissítéseit!',
+ ],
+ 'pages_draft_discarded' => 'Vázlat elvetve, a szerkesztő frissítve lesz az oldal aktuális tartalmával',
+ 'pages_specific' => 'Egy bizonyos oldal',
+
+ // Editor Sidebar
+ 'page_tags' => 'Oldal címkék',
+ 'chapter_tags' => 'Fejezet címkék',
+ 'book_tags' => 'Könyv címkék',
+ 'shelf_tags' => 'Polc címkék',
+ 'tag' => 'Címke',
+ 'tags' => 'Címkék',
+ 'tag_value' => 'Címke érték (nem kötelező)',
+ 'tags_explain' => "Címkék hozzáadása a tartalom jobb kategorizálásához.\nA mélyebb szervezettség megvalósításához hozzá lehet rendelni egy értéket a címkéhez.",
+ 'tags_add' => 'Másik címke hozzáadása',
+ 'attachments' => 'Csatolmányok',
+ 'attachments_explain' => 'Az oldalon megjelenő fájlok feltöltése vagy hivatkozások csatolása. Az oldal oldalsávjában fognak megjelenni.',
+ 'attachments_explain_instant_save' => 'Az itt történt módosítások azonnal el lesznek mentve.',
+ 'attachments_items' => 'Csatolt elemek',
+ 'attachments_upload' => 'Fájlfeltöltés',
+ 'attachments_link' => 'Hivatkozás csatolása',
+ 'attachments_set_link' => 'Hivatkozás beállítása',
+ 'attachments_delete_confirm' => 'A csatolmány törléséhez ismét rá kell kattintani a törlésre.',
+ 'attachments_dropzone' => 'Fájlok csatolása ejtéssel vagy kattintással',
+ 'attachments_no_files' => 'Nincsenek fájlok feltöltve',
+ 'attachments_explain_link' => 'Fájl feltöltése helyett hozzá lehet kapcsolni egy hivatkozást. Ez egy hivatkozás lesz egy másik oldalra vagy egy fájlra a felhőben.',
+ 'attachments_link_name' => 'Hivatkozás neve',
+ 'attachment_link' => 'Csatolmány hivatkozás',
+ 'attachments_link_url' => 'Hivatkozás fájlra',
+ 'attachments_link_url_hint' => 'Weboldal vagy fájl webcíme',
+ 'attach' => 'Csatolás',
+ 'attachments_edit_file' => 'Fájl szerkesztése',
+ 'attachments_edit_file_name' => 'Fájl neve',
+ 'attachments_edit_drop_upload' => 'Feltöltés és felülírás ejtéssel vagy kattintással',
+ 'attachments_order_updated' => 'Csatolmány sorrend frissítve',
+ 'attachments_updated_success' => 'Csatolmány részletei frissítve',
+ 'attachments_deleted' => 'Csatolmány törölve',
+ 'attachments_file_uploaded' => 'Fájl sikeresen feltöltve',
+ 'attachments_file_updated' => 'Fájl sikeresen frissítve',
+ 'attachments_link_attached' => 'Hivatkozás sikeresen hozzácsatolva az oldalhoz',
+
+ // Profile View
+ 'profile_user_for_x' => 'Felhasználó ez óta: :time',
+ 'profile_created_content' => 'Létrehozott tartalom',
+ 'profile_not_created_pages' => ':userName még nem hozott létre oldalt',
+ 'profile_not_created_chapters' => ':userName még nem hozott létre fejezetet',
+ 'profile_not_created_books' => ':userName még nem hozott létre könyvet',
+ 'profile_not_created_shelves' => ':userName még nem hozott létre polcot',
+
+ // Comments
+ 'comment' => 'Megjegyzés',
+ 'comments' => 'Megjegyzések',
+ 'comment_add' => 'Megjegyzés hozzáadása',
+ 'comment_placeholder' => 'Megjegyzés írása',
+ 'comment_count' => '{0} Nincs megjegyzés|{1} 1 megjegyzés|[2,*] :count megjegyzés',
+ 'comment_save' => 'Megjegyzés mentése',
+ 'comment_saving' => 'Megjegyzés mentése...',
+ 'comment_deleting' => 'Megjegyzés törlése...',
+ 'comment_new' => 'Új megjegyzés',
+ 'comment_created' => 'megjegyzést fűzött hozzá :createDiff',
+ 'comment_updated' => 'Frissítve :updateDiff :username által',
+ 'comment_deleted_success' => 'Megjegyzés törölve',
+ 'comment_created_success' => 'Megjegyzés hozzáadva',
+ 'comment_updated_success' => 'Megjegyzés frissítve',
+ 'comment_delete_confirm' => 'Biztosan törölhető ez a megjegyzés?',
+ 'comment_in_reply_to' => 'Válasz erre: :commentId',
+
+ // Revision
+ 'revision_delete_confirm' => 'Biztosan törölhető ez a változat?',
+ 'revision_restore_confirm' => 'Biztosan visszaállítható ez a változat? A oldal jelenlegi tartalma le lesz cserélve.',
+ 'revision_delete_success' => 'Változat törölve',
+ 'revision_cannot_delete_latest' => 'A legutolsó változat nem törölhető.'
+];
\ No newline at end of file
diff --git a/resources/lang/hu/errors.php b/resources/lang/hu/errors.php
new file mode 100644
index 000000000..679142804
--- /dev/null
+++ b/resources/lang/hu/errors.php
@@ -0,0 +1,84 @@
+ 'Nincs jogosultság a kért oldal eléréséhez.',
+ 'permissionJson' => 'Nincs jogosultság a kért művelet végrehajtásához.',
+
+ // Auth
+ 'error_user_exists_different_creds' => ':email címmel már létezik felhasználó, de más hitelesítő adatokkal.',
+ 'email_already_confirmed' => 'Az email cím már meg van erősítve, meg lehet próbálni a bejelentkezést.',
+ 'email_confirmation_invalid' => 'A megerősítő vezérjel nem érvényes vagy használva volt. Meg kell próbálni újraregisztrálni.',
+ 'email_confirmation_expired' => 'A megerősítő vezérjel lejárt. Egy új megerősítő email lett elküldve.',
+ 'ldap_fail_anonymous' => 'Nem sikerült az LDAP elérése névtelen csatlakozással',
+ 'ldap_fail_authed' => 'Az LDAP hozzáférés nem sikerült a megadott DN és jelszó beállításokkal',
+ 'ldap_extension_not_installed' => 'LDAP PHP kiterjesztés nincs telepítve',
+ 'ldap_cannot_connect' => 'Nem lehet kapcsolódni az LDAP kiszolgálóhoz, a kezdeti kapcsolatfelvétel nem sikerült',
+ 'social_no_action_defined' => 'Nincs művelet meghatározva',
+ 'social_login_bad_response' => "Hiba történt :socialAccount bejelentkezés közben:\n:error",
+ 'social_account_in_use' => ':socialAccount fiók már használatban van. :socialAccount opción keresztül érdemes megpróbálni a bejelentkezést.',
+ 'social_account_email_in_use' => ':email email cím már használatban van. Ha már van fiók létrehozva, :egy socialAccount fiókot hozzá lehet csatolni a profil beállításainál.',
+ 'social_account_existing' => ':socialAccount már hozzá van kapcsolva a fiókhoz.',
+ 'social_account_already_used_existing' => ':socialAccount fiókot már egy másik felhasználó használja.',
+ 'social_account_not_used' => ':socialAccount fiók nincs felhasználóhoz kapcsolva. A hozzákapcsolást a profil oldalon lehet elvégezni. ',
+ 'social_account_register_instructions' => ':socialAccount beállítása használatával is lehet fiókot regisztrálni, ha még nem volt fiók létrehozva.',
+ 'social_driver_not_found' => 'Közösségi meghajtó nem található',
+ 'social_driver_not_configured' => ':socialAccount közösségi beállítások nem megfelelőek.',
+
+ // System
+ 'path_not_writable' => ':filePath elérési út nem tölthető fel. Ellenőrizni kell, hogy az útvonal a kiszolgáló számára írható.',
+ 'cannot_get_image_from_url' => 'Nem lehet lekérni a képet innen: :url',
+ 'cannot_create_thumbs' => 'A kiszolgáló nem tud létrehozni bélyegképeket. Ellenőrizni kell, hogy telepítve van-a a GD PHP kiterjesztés.',
+ 'server_upload_limit' => 'A kiszolgáló nem engedélyez ilyen méretű feltöltéseket. Kisebb fájlmérettel kell próbálkozni.',
+ 'uploaded' => 'A kiszolgáló nem engedélyez ilyen méretű feltöltéseket. Kisebb fájlmérettel kell próbálkozni.',
+ 'image_upload_error' => 'Hiba történt a kép feltöltése közben',
+ 'image_upload_type_error' => 'A feltöltött kép típusa érvénytelen',
+ 'file_upload_timeout' => 'A fáj feltöltése időtúllépést okozott.',
+
+ // Attachments
+ 'attachment_page_mismatch' => 'Oldal eltárás csatolmány frissítése közben',
+ 'attachment_not_found' => 'Csatolmány nem található',
+
+ // Pages
+ 'page_draft_autosave_fail' => 'Nem sikerült a vázlat mentése. Mentés előtt meg kell róla győződni, hogy van internetkapcsolat',
+ 'page_custom_home_deletion' => 'Nem lehet oldalt törölni ha kezdőlapnak van beállítva',
+
+ // Entities
+ 'entity_not_found' => 'Entitás nem található',
+ 'bookshelf_not_found' => 'Könyvespolc nem található',
+ 'book_not_found' => 'Könyv nem található',
+ 'page_not_found' => 'Oldal nem található',
+ 'chapter_not_found' => 'Fejezet nem található',
+ 'selected_book_not_found' => 'A kiválasztott könyv nem található',
+ 'selected_book_chapter_not_found' => 'A kiválasztott könyv vagy fejezet nem található',
+ 'guests_cannot_save_drafts' => 'Vendégek nem menthetnek el vázlatokat',
+
+ // Users
+ 'users_cannot_delete_only_admin' => 'Nem lehet törölni az egyetlen adminisztrátort',
+ 'users_cannot_delete_guest' => 'A vendég felhasználót nem lehet törölni',
+
+ // Roles
+ 'role_cannot_be_edited' => 'Ezt a szerepkört nem lehet szerkeszteni',
+ 'role_system_cannot_be_deleted' => 'Ez a szerepkör egy rendszer szerepkör ezért nem törölhető',
+ 'role_registration_default_cannot_delete' => 'Ezt a szerepkört nem lehet törölni amíg alapértelmezés szerinti regisztrációs szerepkörnek van beállítva',
+ 'role_cannot_remove_only_admin' => 'Ez a felhasználó az egyetlen, az adminisztrátor szerepkörhöz rendelt felhasználó. Eltávolítása előtt az adminisztrátor szerepkört át kell ruházni egy másik felhasználóra.',
+
+ // Comments
+ 'comment_list' => 'Hiba történt a megjegyzések lekérése közben.',
+ 'cannot_add_comment_to_draft' => 'Vázlathoz nem lehet megjegyzéseket fűzni.',
+ 'comment_add' => 'Hiba történt a megjegyzés hozzáadása / frissítése közben.',
+ 'comment_delete' => 'Hiba történt a megjegyzés törlése közben.',
+ 'empty_comment' => 'Üres megjegyzést nem lehet hozzáadni.',
+
+ // Error pages
+ '404_page_not_found' => 'Oldal nem található',
+ 'sorry_page_not_found' => 'Sajnáljuk, a keresett oldal nem található.',
+ 'return_home' => 'Vissza a kezdőlapra',
+ 'error_occurred' => 'Hiba örtént',
+ 'app_down' => ':appName jelenleg nem üzemel',
+ 'back_soon' => 'Hamarosan újra elérhető lesz.',
+
+];
diff --git a/resources/lang/hu/pagination.php b/resources/lang/hu/pagination.php
new file mode 100644
index 000000000..87be04cf4
--- /dev/null
+++ b/resources/lang/hu/pagination.php
@@ -0,0 +1,12 @@
+ '« Előző',
+ 'next' => 'Következő »',
+
+];
diff --git a/resources/lang/hu/passwords.php b/resources/lang/hu/passwords.php
new file mode 100644
index 000000000..bacc08b08
--- /dev/null
+++ b/resources/lang/hu/passwords.php
@@ -0,0 +1,15 @@
+ 'A jelszónak legalább hat karakterből kell állnia és egyeznie kell a megerősítéssel.',
+ 'user' => "Nem található felhasználó ezzel az e-mail címmel.",
+ 'token' => 'Ez a jelszó visszaállító vezérjel érvénytelen.',
+ 'sent' => 'E-mailben elküldtük a jelszó visszaállító hivatkozást!',
+ 'reset' => 'A jelszó visszaállítva!',
+
+];
diff --git a/resources/lang/hu/settings.php b/resources/lang/hu/settings.php
new file mode 100644
index 000000000..efebb4a10
--- /dev/null
+++ b/resources/lang/hu/settings.php
@@ -0,0 +1,161 @@
+ 'Beállítások',
+ 'settings_save' => 'Beállítások mentése',
+ 'settings_save_success' => 'Beállítások elmentve',
+
+ // App Settings
+ 'app_customization' => 'Személyre szabás',
+ 'app_features_security' => 'Jellemzők és biztonság',
+ 'app_name' => 'Alkalmazás neve',
+ 'app_name_desc' => 'Ez a név meg fog jelenni a fejlécben és minden a rendszer által küldött emailben.',
+ 'app_name_header' => 'Név mutatása a fejlécben',
+ 'app_public_access' => 'Nyilvános hozzáférés',
+ 'app_public_access_desc' => 'Ha engedélyezett, a nem bejelentkezett felhasználók is hozzá tudnak férni a BookStack példány tartalmaihoz.',
+ 'app_public_access_desc_guest' => 'A nyilvános látogatók hozzáférése a "Guest" felhasználón keresztül irányítható.',
+ 'app_public_access_toggle' => 'Nyilvános hozzáférés engedélyezése',
+ 'app_public_viewing' => 'Nyilvános megtekintés engedélyezve?',
+ 'app_secure_images' => 'Magasabb biztonságú képfeltöltés',
+ 'app_secure_images_toggle' => 'Magasabb biztonságú képfeltöltés engedélyezése',
+ 'app_secure_images_desc' => 'Teljesítmény optimalizálási okokból minden kép nyilvános. Ez a beállítás egy véletlenszerű, nehezen kitalálható karakterláncot illeszt a képek útvonalának elejére. Meg kell győződni róla, hogy a könnyű hozzáférés megakadályozása érdekében a könyvtár indexek nincsenek engedélyezve.',
+ 'app_editor' => 'Oldalszerkesztő',
+ 'app_editor_desc' => 'Annak kiválasztása, hogy a felhasználók melyik szerkesztőt használhatják az oldalak szerkesztéséhez.',
+ 'app_custom_html' => 'Egyéni HTML fejléc tartalom',
+ 'app_custom_html_desc' => 'Az itt hozzáadott bármilyen tartalom be lesz illesztve minden oldal