diff --git a/app/Actions/Album/ListAlbums.php b/app/Actions/Album/ListAlbums.php
index 30d0d2eb2f4..e7b9ec5a2f7 100644
--- a/app/Actions/Album/ListAlbums.php
+++ b/app/Actions/Album/ListAlbums.php
@@ -57,9 +57,9 @@ function ($q) use ($albumsFiltering) {
$flat_tree,
[
'id' => null,
- 'title' => __('lychee.ROOT'),
- 'original' => __('lychee.ROOT'),
- 'short_title' => __('lychee.ROOT'),
+ 'title' => __('gallery.root'),
+ 'original' => __('gallery.root'),
+ 'short_title' => __('gallery.root'),
'thumb' => URL::asset('img/no_images.svg'),
]
);
diff --git a/app/Actions/Diagnostics/Pipes/Checks/DBIntegrityCheck.php b/app/Actions/Diagnostics/Pipes/Checks/DBIntegrityCheck.php
index 2bd2c8dcbd2..b5282ce7d48 100644
--- a/app/Actions/Diagnostics/Pipes/Checks/DBIntegrityCheck.php
+++ b/app/Actions/Diagnostics/Pipes/Checks/DBIntegrityCheck.php
@@ -33,7 +33,7 @@ public function handle(array &$data, \Closure $next): array
->get();
foreach ($photos as $photo) {
- $data[] = 'Error: Photo without Original found -- ' . $photo->title . ' in ' . ($photo->album?->title ?? __('lychee.UNSORTED'));
+ $data[] = 'Error: Photo without Original found -- ' . $photo->title . ' in ' . ($photo->album?->title ?? __('gallery.smart_album.unsorted'));
}
return $next($data);
diff --git a/app/Enum/LicenseType.php b/app/Enum/LicenseType.php
index 94ede45654f..52a028741d8 100644
--- a/app/Enum/LicenseType.php
+++ b/app/Enum/LicenseType.php
@@ -54,7 +54,7 @@ public static function localized(): array
{
return [
self::NONE->value => 'None',
- self::RESERVED->value => __('lychee.ALBUM_RESERVED'),
+ self::RESERVED->value => __('gallery.album_reserved'),
self::CC0->value => 'CC0 - Public Domain',
self::CC_BY_1_0->value => 'CC Attribution 1.0',
self::CC_BY_2_0->value => 'CC Attribution 2.0',
diff --git a/app/Enum/MapProviders.php b/app/Enum/MapProviders.php
index 943e4107343..b8c9f5e3813 100644
--- a/app/Enum/MapProviders.php
+++ b/app/Enum/MapProviders.php
@@ -29,10 +29,10 @@ public function getAtributionHtml(): string
{
return match ($this) {
self::Wikimedia => 'Wikimedia',
- self::OpenStreetMapOrg => '© ' . __('lychee.OSM_CONTRIBUTORS') . '',
- self::OpenStreetMapDe => '© ' . __('lychee.OSM_CONTRIBUTORS') . '',
- self::OpenStreetMapFr => '© ' . __('lychee.OSM_CONTRIBUTORS') . '',
- self::RRZE => '© ' . __('lychee.OSM_CONTRIBUTORS') . '',
+ self::OpenStreetMapOrg => '© ' . __('gallery.map.osm_contributors') . '',
+ self::OpenStreetMapDe => '© ' . __('gallery.map.osm_contributors') . '',
+ self::OpenStreetMapFr => '© ' . __('gallery.map.osm_contributors') . '',
+ self::RRZE => '© ' . __('gallery.map.osm_contributors') . '',
};
}
}
diff --git a/app/Enum/SizeVariantType.php b/app/Enum/SizeVariantType.php
index 9c8d457cada..fc7079c00bf 100644
--- a/app/Enum/SizeVariantType.php
+++ b/app/Enum/SizeVariantType.php
@@ -45,14 +45,14 @@ public function name(): string
public function localization(): string
{
return match ($this) {
- self::PLACEHOLDER => __('lychee.PHOTO_PLACEHOLDER'),
- self::THUMB => __('lychee.PHOTO_THUMB'),
- self::THUMB2X => __('lychee.PHOTO_THUMB_HIDPI'),
- self::SMALL => __('lychee.PHOTO_SMALL'),
- self::SMALL2X => __('lychee.PHOTO_SMALL_HIDPI'),
- self::MEDIUM => __('lychee.PHOTO_MEDIUM'),
- self::MEDIUM2X => __('lychee.PHOTO_MEDIUM_HIDPI'),
- self::ORIGINAL => __('lychee.PHOTO_ORIGINAL'),
+ self::PLACEHOLDER => __('gallery.placeholder'),
+ self::THUMB => __('gallery.thumb'),
+ self::THUMB2X => __('gallery.thumb_hidpi'),
+ self::SMALL => __('gallery.small'),
+ self::SMALL2X => __('gallery.small_hidpi'),
+ self::MEDIUM => __('gallery.medium'),
+ self::MEDIUM2X => __('gallery.medium_hidpi'),
+ self::ORIGINAL => __('gallery.original'),
};
}
}
\ No newline at end of file
diff --git a/app/Http/Resources/GalleryConfigs/FooterConfig.php b/app/Http/Resources/GalleryConfigs/FooterConfig.php
index d17fdd1fec3..137e564aaa3 100644
--- a/app/Http/Resources/GalleryConfigs/FooterConfig.php
+++ b/app/Http/Resources/GalleryConfigs/FooterConfig.php
@@ -38,6 +38,6 @@ public function __construct()
$copy_right_year = $copy_right_year . '-' . $site_copyright_end;
}
- $this->copyright = $copy_right_year !== '' ? sprintf(__('lychee.FOOTER_COPYRIGHT'), $site_owner, $copy_right_year) : '';
+ $this->copyright = $copy_right_year !== '' ? sprintf(__('landing.copyright'), $site_owner, $copy_right_year) : '';
}
}
diff --git a/app/Http/Resources/Models/Utils/PreformattedPhotoData.php b/app/Http/Resources/Models/Utils/PreformattedPhotoData.php
index 3899b3a1143..f5fd4ca8d27 100644
--- a/app/Http/Resources/Models/Utils/PreformattedPhotoData.php
+++ b/app/Http/Resources/Models/Utils/PreformattedPhotoData.php
@@ -43,7 +43,7 @@ public function __construct(Photo $photo, ?SizeVariantResource $original = null)
$this->shutter = str_replace('s', 'sec', $photo->shutter ?? '');
$this->aperture = str_replace('f/', '', $photo->aperture ?? '');
- $this->iso = sprintf(__('lychee.PHOTO_ISO'), $photo->iso);
+ $this->iso = sprintf(__('gallery.photo.details.iso'), $photo->iso);
$this->lens = ($photo->lens === '' || $photo->lens === null) ? '' : sprintf('(%s)', $photo->lens);
$this->duration = Helpers::secondsToHMS(intval($photo->aperture));
diff --git a/app/Jobs/ProcessImageJob.php b/app/Jobs/ProcessImageJob.php
index cf14d0e7d15..126d2bda32b 100644
--- a/app/Jobs/ProcessImageJob.php
+++ b/app/Jobs/ProcessImageJob.php
@@ -52,7 +52,7 @@ public function __construct(
$this->originalBaseName = $file->getOriginalBasename();
$this->albumID = null;
- $album_name = __('lychee.UNSORTED');
+ $album_name = __('gallery.smart_album.unsorted');
if ($album instanceof AbstractAlbum) {
$this->albumID = $album->id;
diff --git a/app/Legacy/V1/Resources/Models/PhotoResource.php b/app/Legacy/V1/Resources/Models/PhotoResource.php
index 1454fe32e1e..5b4109e2732 100644
--- a/app/Legacy/V1/Resources/Models/PhotoResource.php
+++ b/app/Legacy/V1/Resources/Models/PhotoResource.php
@@ -127,7 +127,7 @@ private function preformatted(?SizeVariant $original): array
'shutter' => str_replace('s', 'sec', $this->resource->shutter ?? ''),
'aperture' => str_replace('f/', '', $this->resource->aperture ?? ''),
- 'iso' => sprintf(__('lychee.PHOTO_ISO'), $this->resource->iso),
+ 'iso' => sprintf(__('gallery.photo.details.iso'), $this->resource->iso),
'lens' => ($this->resource->lens === '' || $this->resource->lens === null) ? '' : sprintf('(%s)', $this->resource->lens),
'duration' => Helpers::secondsToHMS(intval($this->resource->aperture)),
diff --git a/app/SmartAlbums/BaseSmartAlbum.php b/app/SmartAlbums/BaseSmartAlbum.php
index 0fb9d9068d6..f3cd79d0fe1 100644
--- a/app/SmartAlbums/BaseSmartAlbum.php
+++ b/app/SmartAlbums/BaseSmartAlbum.php
@@ -57,7 +57,7 @@ protected function __construct(SmartAlbumType $id, \Closure $smartCondition)
try {
$this->photoQueryPolicy = resolve(PhotoQueryPolicy::class);
$this->id = $id->value;
- $this->title = __('lychee.' . $id->name) ?? $id->name;
+ $this->title = __('gallery.smart_album.' . strtolower($id->name)) ?? $id->name;
$this->smartPhotoCondition = $smartCondition;
/** @var AccessPermission|null $perm */
$perm = AccessPermission::query()->where('base_album_id', '=', $id->value)->first();
diff --git a/lang/cz/diagnostics.php b/lang/cz/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/cz/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/dialogs.php b/lang/cz/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/cz/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
- {{
- $t("lychee.HOSTED_WITH_LYCHEE")
- }}
+
+ {{ $t("landing.hosted_with_lychee") }}
+
{{ $t("lychee.TITLE_NEW_ALBUM") }} {{ $t("dialogs.new_album.info") }} {{ $t("lychee.NEW_TAG_ALBUM") }} {{ $t("dialogs.new_tag_album.info") }} {{ title }}
+ {{ sprintf($t("dialogs.delete_album.confirmation"), props.album.title) }}
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/fix-tree.php b/lang/cz/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/cz/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/gallery.php b/lang/cz/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/cz/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/jobs.php b/lang/cz/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/cz/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/cz/landing.php b/lang/cz/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/cz/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/cz/left-menu.php b/lang/cz/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/cz/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/cz/oauth.php b/lang/cz/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/cz/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/cz/profile.php b/lang/cz/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/cz/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/settings.php b/lang/cz/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/cz/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/sharing.php b/lang/cz/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/cz/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/statistics.php b/lang/cz/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/cz/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/toasts.php b/lang/cz/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/cz/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/cz/users.php b/lang/cz/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/cz/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/cz/validation.php b/lang/cz/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/cz/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/de/diagnostics.php b/lang/de/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/de/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/dialogs.php b/lang/de/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/de/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/fix-tree.php b/lang/de/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/de/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/gallery.php b/lang/de/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/de/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/jobs.php b/lang/de/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/de/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/de/landing.php b/lang/de/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/de/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/de/left-menu.php b/lang/de/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/de/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/de/oauth.php b/lang/de/oauth.php
deleted file mode 100644
index 418355fa27b..00000000000
--- a/lang/de/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth ist nicht verfügbar.',
- 'SET_UP_CREDENTIALS' => 'Richten Sie die Zugangsdaten in Ihrer .env ein',
- 'SET_UP_OAUTH' => 'Oauth-Authentifizierung einrichten',
- 'SET_UP' => '%s einrichten',
- 'TOKEN_REGISTERED' => 'Token %s registriert.',
- 'RESET' => 'zurücksetzen',
-];
\ No newline at end of file
diff --git a/lang/de/profile.php b/lang/de/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/de/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/settings.php b/lang/de/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/de/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/sharing.php b/lang/de/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/de/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/statistics.php b/lang/de/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/de/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/toasts.php b/lang/de/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/de/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/de/users.php b/lang/de/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/de/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/de/validation.php b/lang/de/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/de/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/el/diagnostics.php b/lang/el/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/el/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/dialogs.php b/lang/el/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/el/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/fix-tree.php b/lang/el/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/el/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/gallery.php b/lang/el/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/el/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/jobs.php b/lang/el/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/el/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/el/landing.php b/lang/el/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/el/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/el/left-menu.php b/lang/el/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/el/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/el/oauth.php b/lang/el/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/el/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/el/profile.php b/lang/el/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/el/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/settings.php b/lang/el/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/el/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/sharing.php b/lang/el/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/el/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/statistics.php b/lang/el/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/el/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/toasts.php b/lang/el/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/el/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/el/users.php b/lang/el/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/el/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/el/validation.php b/lang/el/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/el/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/en/diagnostics.php b/lang/en/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/en/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/dialogs.php b/lang/en/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/en/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/fix-tree.php b/lang/en/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/en/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/gallery.php b/lang/en/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/en/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/jobs.php b/lang/en/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/en/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/en/landing.php b/lang/en/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/en/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/en/left-menu.php b/lang/en/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/en/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/en/lychee.php b/lang/en/lychee.php
index bae26d41f9c..0d4967a5f20 100644
--- a/lang/en/lychee.php
+++ b/lang/en/lychee.php
@@ -3,6 +3,13 @@
/** @noinspection SpellCheckingInspection */
return [
+ /*
+ |--------------------------------------------------------------------------
+ | Those a LEGACY values used in the v3/v4/v5
+ |
+ | Do not use these values anymore. They will be removed in the future.
+ |--------------------------------------------------------------------------
+ */
'USERNAME' => 'Username',
'PASSWORD' => 'Password',
'ENTER' => 'Enter',
diff --git a/lang/en/maintenance.php b/lang/en/maintenance.php
index 391174f539d..818d977724c 100644
--- a/lang/en/maintenance.php
+++ b/lang/en/maintenance.php
@@ -3,7 +3,7 @@
return [
/*
|--------------------------------------------------------------------------
- | Update Page
+ | Maintenance Page
|--------------------------------------------------------------------------
*/
'title' => 'Maintenance',
diff --git a/lang/en/oauth.php b/lang/en/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/en/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/en/pagination.php.bck b/lang/en/pagination.php.bck
deleted file mode 100644
index 6f953a63317..00000000000
--- a/lang/en/pagination.php.bck
+++ /dev/null
@@ -1,17 +0,0 @@
- '« Previous',
- 'next' => 'Next »',
-];
diff --git a/lang/en/passwords.php.bck b/lang/en/passwords.php.bck
deleted file mode 100644
index 42c70109be9..00000000000
--- a/lang/en/passwords.php.bck
+++ /dev/null
@@ -1,20 +0,0 @@
- 'Passwords must be at least six characters and match the confirmation.',
- 'reset' => 'Your password has been reset!',
- 'sent' => 'We have e-mailed your password reset link!',
- 'token' => 'This password reset token is invalid.',
- 'user' => "We can't find a user with that e-mail address.",
-];
diff --git a/lang/en/profile.php b/lang/en/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/en/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/settings.php b/lang/en/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/en/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/sharing.php b/lang/en/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/en/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/statistics.php b/lang/en/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/en/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/toasts.php b/lang/en/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/en/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/en/users.php b/lang/en/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/en/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/en/validation.php b/lang/en/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/en/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/es/diagnostics.php b/lang/es/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/es/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/dialogs.php b/lang/es/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/es/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/fix-tree.php b/lang/es/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/es/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/gallery.php b/lang/es/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/es/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/jobs.php b/lang/es/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/es/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/es/landing.php b/lang/es/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/es/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/es/left-menu.php b/lang/es/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/es/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/es/oauth.php b/lang/es/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/es/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/es/profile.php b/lang/es/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/es/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/settings.php b/lang/es/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/es/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/sharing.php b/lang/es/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/es/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/statistics.php b/lang/es/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/es/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/toasts.php b/lang/es/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/es/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/es/users.php b/lang/es/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/es/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/es/validation.php b/lang/es/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/es/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/fr/diagnostics.php b/lang/fr/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/fr/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/dialogs.php b/lang/fr/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/fr/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/fix-tree.php b/lang/fr/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/fr/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/gallery.php b/lang/fr/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/fr/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/jobs.php b/lang/fr/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/fr/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/fr/landing.php b/lang/fr/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/fr/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/fr/left-menu.php b/lang/fr/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/fr/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/fr/oauth.php b/lang/fr/oauth.php
deleted file mode 100644
index 8d4454dc1ec..00000000000
--- a/lang/fr/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'L’authentication via Oauth n’est pas disponible',
- 'SET_UP_CREDENTIALS' => 'Définissez vos identifiants dans le fichier .env',
- 'SET_UP_OAUTH' => 'Utiliser l’authentication Oauth',
- 'SET_UP' => 'Connectez-vous avec %s',
- 'TOKEN_REGISTERED' => '%s connecté.',
- 'RESET' => 'oublier',
-];
\ No newline at end of file
diff --git a/lang/fr/profile.php b/lang/fr/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/fr/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/settings.php b/lang/fr/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/fr/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/sharing.php b/lang/fr/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/fr/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/statistics.php b/lang/fr/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/fr/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/toasts.php b/lang/fr/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/fr/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/fr/users.php b/lang/fr/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/fr/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/fr/validation.php b/lang/fr/validation.php
deleted file mode 100644
index 9c3a675c228..00000000000
--- a/lang/fr/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'Le champ :attribute doit être accepté.',
- 'active_url' => "Le champ :attribute n'est pas une URL valide.",
- 'after' => 'Le champ :attribute doit être une date postérieure au :date.',
- 'after_or_equal' => 'Le champ :attribute doit être une date postérieure ou égale au :date.',
- 'alpha' => 'Le champ :attribute doit contenir uniquement des lettres.',
- 'alpha_dash' => 'Le champ :attribute doit contenir uniquement des lettres, des chiffres et des tirets.',
- 'alpha_num' => 'Le champ :attribute doit contenir uniquement des chiffres et des lettres.',
- 'array' => 'Le champ :attribute doit être un tableau.',
- 'before' => 'Le champ :attribute doit être une date antérieure au :date.',
- 'before_or_equal' => 'Le champ :attribute doit être une date antérieure ou égale au :date.',
- 'between' => [
- 'array' => 'Le tableau :attribute doit contenir entre :min et :max éléments.',
- 'file' => 'La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être comprise entre :min et :max.',
- 'string' => 'Le texte :attribute doit contenir entre :min et :max caractères.',
- ],
- 'boolean' => 'Le champ :attribute doit être vrai ou faux.',
- 'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.',
- 'date' => "Le champ :attribute n'est pas une date valide.",
- 'date_format' => 'Le champ :attribute ne correspond pas au format :format.',
- 'different' => 'Les champs :attribute et :other doivent être différents.',
- 'digits' => 'Le champ :attribute doit contenir :digits chiffres.',
- 'digits_between' => 'Le champ :attribute doit contenir entre :min et :max chiffres.',
- 'dimensions' => "La taille de l'image :attribute n'est pas conforme.",
- 'distinct' => 'Le champ :attribute a une valeur en double.',
- 'email' => 'Le champ :attribute doit être une adresse e-mail valide.',
- 'exists' => 'Le champ :attribute sélectionné est invalide.',
- 'file' => 'Le champ :attribute doit être un fichier.',
- 'filled' => 'Le champ :attribute doit avoir une valeur.',
- 'gt' => [
- 'array' => 'Le tableau :attribute doit contenir plus de :value éléments.',
- 'file' => 'La taille du fichier de :attribute doit être supérieure à :value kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être supérieure à :value.',
- 'string' => 'Le texte :attribute doit contenir plus de :value caractères.',
- ],
- 'gte' => [
- 'array' => 'Le tableau :attribute doit contenir au moins :value éléments.',
- 'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :value kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :value.',
- 'string' => 'Le texte :attribute doit contenir au moins :value caractères.',
- ],
- 'image' => 'Le champ :attribute doit être une image.',
- 'in' => 'Le champ :attribute est invalide.',
- 'in_array' => "Le champ :attribute n'existe pas dans :other.",
- 'integer' => 'Le champ :attribute doit être un entier.',
- 'ip' => 'Le champ :attribute doit être une adresse IP valide.',
- 'ipv4' => 'Le champ :attribute doit être une adresse IPv4 valide.',
- 'ipv6' => 'Le champ :attribute doit être une adresse IPv6 valide.',
- 'json' => 'Le champ :attribute doit être un document JSON valide.',
- 'lt' => [
- 'array' => 'Le tableau :attribute doit contenir moins de :value éléments.',
- 'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être inférieure à :value.',
- 'string' => 'Le texte :attribute doit contenir moins de :value caractères.',
- ],
- 'lte' => [
- 'array' => 'Le tableau :attribute doit contenir au plus :value éléments.',
- 'file' => 'La taille du fichier de :attribute doit être inférieure ou égale à :value kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.',
- 'string' => 'Le texte :attribute doit contenir au plus :value caractères.',
- ],
- 'max' => [
- 'array' => 'Le tableau :attribute ne peut pas contenir plus que :max éléments.',
- 'file' => 'La taille du fichier de :attribute ne peut pas dépasser :max kilo-octets.',
- 'numeric' => 'La valeur de :attribute ne peut pas être supérieure à :max.',
- 'string' => 'Le texte de :attribute ne peut pas contenir plus de :max caractères.',
- ],
- 'mimes' => 'Le champ :attribute doit être un fichier de type : :values.',
- 'mimetypes' => 'Le champ :attribute doit être un fichier de type : :values.',
- 'min' => [
- 'array' => 'Le tableau :attribute doit contenir au moins :min éléments.',
- 'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :min kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.',
- 'string' => 'Le texte de :attribute doit contenir au moins :min caractères.',
- ],
- 'not_in' => "Le champ :attribute sélectionné n'est pas valide.",
- 'not_regex' => "Le format du champ :attribute n'est pas valide.",
- 'numeric' => 'Le champ :attribute doit contenir un nombre.',
- 'present' => 'Le champ :attribute doit être présent.',
- 'regex' => 'Le format du champ :attribute est invalide.',
- 'required' => 'Le champ :attribute est obligatoire.',
- 'required_if' => 'Le champ :attribute est obligatoire quand la valeur de :other est :value.',
- 'required_unless' => 'Le champ :attribute est obligatoire sauf si :other est :values.',
- 'required_with' => 'Le champ :attribute est obligatoire quand :values est présent.',
- 'required_with_all' => 'Le champ :attribute est obligatoire quand :values sont présents.',
- 'required_without' => "Le champ :attribute est obligatoire quand :values n'est pas présent.",
- 'required_without_all' => "Le champ :attribute est requis quand aucun de :values n'est présent.",
- 'same' => 'Les champs :attribute et :other doivent être identiques.',
- 'size' => [
- 'array' => 'Le tableau :attribute doit contenir :size éléments.',
- 'file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.',
- 'numeric' => 'La valeur de :attribute doit être :size.',
- 'string' => 'Le texte de :attribute doit contenir :size caractères.',
- ],
- 'string' => 'Le champ :attribute doit être une chaîne de caractères.',
- 'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.',
- 'unique' => 'La valeur du champ :attribute est déjà utilisée.',
- 'uploaded' => "Le fichier du champ :attribute n'a pu être téléversé.",
- 'url' => "Le format de l'URL de :attribute n'est pas valide.",
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/hu/diagnostics.php b/lang/hu/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/hu/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/dialogs.php b/lang/hu/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/hu/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/fix-tree.php b/lang/hu/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/hu/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/gallery.php b/lang/hu/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/hu/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/jobs.php b/lang/hu/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/hu/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/hu/landing.php b/lang/hu/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/hu/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/hu/left-menu.php b/lang/hu/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/hu/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/hu/oauth.php b/lang/hu/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/hu/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/hu/profile.php b/lang/hu/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/hu/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/settings.php b/lang/hu/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/hu/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/sharing.php b/lang/hu/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/hu/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/statistics.php b/lang/hu/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/hu/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/toasts.php b/lang/hu/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/hu/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/hu/users.php b/lang/hu/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/hu/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/hu/validation.php b/lang/hu/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/hu/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/it/diagnostics.php b/lang/it/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/it/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/dialogs.php b/lang/it/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/it/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/fix-tree.php b/lang/it/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/it/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/gallery.php b/lang/it/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/it/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/jobs.php b/lang/it/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/it/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/it/landing.php b/lang/it/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/it/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/it/left-menu.php b/lang/it/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/it/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/it/oauth.php b/lang/it/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/it/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/it/profile.php b/lang/it/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/it/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/settings.php b/lang/it/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/it/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/sharing.php b/lang/it/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/it/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/statistics.php b/lang/it/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/it/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/toasts.php b/lang/it/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/it/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/it/users.php b/lang/it/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/it/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/it/validation.php b/lang/it/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/it/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/ja/diagnostics.php b/lang/ja/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/ja/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/dialogs.php b/lang/ja/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/ja/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/fix-tree.php b/lang/ja/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/ja/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/gallery.php b/lang/ja/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/ja/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/jobs.php b/lang/ja/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/ja/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/ja/landing.php b/lang/ja/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/ja/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/ja/left-menu.php b/lang/ja/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/ja/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/ja/oauth.php b/lang/ja/oauth.php
deleted file mode 100644
index 1a7e7ed0685..00000000000
--- a/lang/ja/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth は利用可能ではありません。',
- 'SET_UP_CREDENTIALS' => '.env で資格情報を設定してください',
- 'SET_UP_OAUTH' => 'Oauth 認証を設定する',
- 'SET_UP' => '%s を設定する',
- 'TOKEN_REGISTERED' => '%s トークンが登録されました。',
- 'RESET' => 'リセット',
-];
\ No newline at end of file
diff --git a/lang/ja/profile.php b/lang/ja/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/ja/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/settings.php b/lang/ja/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/ja/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/sharing.php b/lang/ja/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/ja/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/statistics.php b/lang/ja/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/ja/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/toasts.php b/lang/ja/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/ja/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/ja/users.php b/lang/ja/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/ja/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ja/validation.php b/lang/ja/validation.php
deleted file mode 100644
index ca867db73fb..00000000000
--- a/lang/ja/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- ':attribute は承認される必要があります。',
- 'active_url' => ':attribute は適切な URL ではありません。',
- 'after' => ':attribute は :date より後の日付である必要があります。',
- 'after_or_equal' => ':attribute は :date またはその後の日付である必要があります。',
- 'alpha' => ':attribute には文字のみを含めることができます。',
- 'alpha_dash' => ':attribute には、文字、数字、ダッシュのみを含めることができます。',
- 'alpha_num' => ':attribute には文字と数字のみを含めることができます。',
- 'array' => ':attribute は配列である必要があります。',
- 'before' => ':attribute は :date より前の日付である必要があります。',
- 'before_or_equal' => ':attribute は :date またはその前の日付である必要があります。',
- 'between' => [
- 'numeric' => ':attribute は :min と :max の間になければなりません。',
- 'file' => ':attribute は :min kB から :max kB までの範囲でなければなりません。',
- 'string' => ':attribute は :min 文字から :max 文字までの範囲でなければなりません。',
- 'array' => ':attribute には :min から :max までの項目が必要です。',
- ],
- 'boolean' => ':attribute フィールドは true または false である必要があります。',
- 'confirmed' => ':attribute の確認が一致しません。',
- 'date' => ':attribute は有効な日付ではありません。',
- 'date_format' => ':attribute が形式 :format と一致しません。',
- 'different' => ':attribute と :other は異なる必要があります。',
- 'digits' => ':attribute は :digits 桁でなければなりません。',
- 'digits_between' => ':attribute は :min 桁から :max 桁までの範囲でなければなりません。',
- 'dimensions' => ':attribute の画像サイズが無効です。',
- 'distinct' => ':attribute フィールドに重複した値があります。',
- 'email' => ':attribute は有効なメールアドレスである必要があります。',
- 'exists' => '選択された:attributeは無効です。',
- 'file' => ':attribute はファイルである必要があります。',
- 'filled' => ':attribute フィールドには値が必要です。',
- 'gt' => [
- 'numeric' => ':attribute は :value より大きくなければなりません。',
- 'file' => ':attribute は :value kB より大きくなければなりません。',
- 'string' => ':attribute は :value 文字より大きくなければなりません。',
- 'array' => ':attribute には :value より多い項目が必要です。',
- ],
- 'gte' => [
- 'numeric' => ':attribute は :value 以上である必要があります。',
- 'file' => ':attribute は :value kB 以上である必要があります。',
- 'string' => ':attribute は :value 文字以上である必要があります。',
- 'array' => ':attribute には :value 項目以上が必要です。',
- ],
- 'image' => ':attribute は画像である必要があります。',
- 'in' => '選択された:attributeは無効です。',
- 'in_array' => ':attribute フィールドは :other に存在しません。',
- 'integer' => ':attribute は整数である必要があります。',
- 'ip' => ':attribute は有効な IP アドレスである必要があります。',
- 'ipv4' => ':attribute は有効な IPv4 アドレスである必要があります。',
- 'ipv6' => ':attribute は有効な IPv6 アドレスである必要があります。',
- 'json' => ':attribute は有効な JSON 文字列である必要があります。',
- 'lt' => [
- 'numeric' => ':attribute は :value より小さくなければなりません。',
- 'file' => ':attribute は :value kB 未満である必要があります。',
- 'string' => ':attribute は :value 文字未満である必要があります。',
- 'array' => ':attribute には :value 項目未満が必要です。',
- ],
- 'lte' => [
- 'numeric' => ':attribute は :value 以下でなければなりません。',
- 'file' => ':attribute は :value kB 以下である必要があります。',
- 'string' => ':attribute は :value 文字以下でなければなりません。',
- 'array' => ':attribute には :value 個を超える項目を含めることはできません。',
- ],
- 'max' => [
- 'numeric' => ':attribute は :max より大きくすることはできません。',
- 'file' => ':attribute は :max kB を超えることはできません。',
- 'string' => ':attribute は :max 文字数を超えることはできません。',
- 'array' => ':attribute には :max 個を超える項目を含めることはできません。',
- ],
- 'mimes' => ':attribute は、 :values タイプのファイルである必要があります。',
- 'mimetypes' => ':attribute は、 :values タイプファイルである必要があります。',
- 'min' => [
- 'numeric' => ':attribute は少なくとも :min である必要があります。',
- 'file' => ':attribute は少なくとも :min kB である必要があります。',
- 'string' => ':attribute は少なくとも :min 文字である必要があります。',
- 'array' => ':attribute には少なくとも :min 個の項目が必要です。',
- ],
- 'not_in' => '選択された:attributeは無効です。',
- 'not_regex' => ':attribute 形式が無効です。',
- 'numeric' => ':attribute は数値である必要があります。',
- 'present' => ':attribute フィールドが存在する必要があります。',
- 'regex' => ':attribute 形式が無効です。',
- 'required' => ':attribute フィールドは必須です。',
- 'required_if' => ':other が :value の場合、:attribute フィールドは必須です。',
- 'required_unless' => ':other が :values に含まれていない限り、:attribute フィールドは必須です。',
- 'required_with' => ':values が存在する場合、:attribute フィールドは必須です。',
- 'required_with_all' => ':values が存在する場合、:attribute フィールドは必須です。',
- 'required_without' => ':values が存在しない場合は、:attribute フィールドが必須です。',
- 'required_without_all' => ':values がいずれも存在しない場合は、:attribute フィールドが必須です。',
- 'same' => ':attribute と :other は一致する必要があります。',
- 'size' => [
- 'numeric' => ':attribute は :size である必要があります。',
- 'file' => ':attribute は :size kB である必要があります。',
- 'string' => ':attribute は :size 文字である必要があります。',
- 'array' => ':attribute には :size 項目が含まれている必要があります。',
- ],
- 'string' => ':attribute は文字列である必要があります。',
- 'timezone' => ':attribute は有効なゾーンである必要があります。',
- 'unique' => ':attribute はすでに使用されています。',
- 'uploaded' => ':attribute のアップロードに失敗しました。',
- 'url' => ':attribute 形式が無効です。',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/nl/diagnostics.php b/lang/nl/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/nl/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/dialogs.php b/lang/nl/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/nl/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/fix-tree.php b/lang/nl/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/nl/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/gallery.php b/lang/nl/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/nl/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/jobs.php b/lang/nl/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/nl/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/nl/landing.php b/lang/nl/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/nl/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/nl/left-menu.php b/lang/nl/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/nl/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/nl/oauth.php b/lang/nl/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/nl/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/nl/profile.php b/lang/nl/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/nl/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/settings.php b/lang/nl/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/nl/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/sharing.php b/lang/nl/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/nl/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/statistics.php b/lang/nl/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/nl/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/toasts.php b/lang/nl/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/nl/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/nl/users.php b/lang/nl/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/nl/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/nl/validation.php b/lang/nl/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/nl/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/no/diagnostics.php b/lang/no/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/no/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/dialogs.php b/lang/no/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/no/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/fix-tree.php b/lang/no/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/no/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/gallery.php b/lang/no/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/no/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/jobs.php b/lang/no/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/no/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/no/landing.php b/lang/no/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/no/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/no/left-menu.php b/lang/no/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/no/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/no/oauth.php b/lang/no/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/no/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/no/profile.php b/lang/no/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/no/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/settings.php b/lang/no/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/no/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/sharing.php b/lang/no/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/no/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/statistics.php b/lang/no/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/no/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/toasts.php b/lang/no/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/no/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/no/users.php b/lang/no/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/no/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/no/validation.php b/lang/no/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/no/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/pl/diagnostics.php b/lang/pl/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/pl/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/dialogs.php b/lang/pl/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/pl/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/fix-tree.php b/lang/pl/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/pl/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/gallery.php b/lang/pl/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/pl/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/jobs.php b/lang/pl/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/pl/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/pl/landing.php b/lang/pl/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/pl/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/pl/left-menu.php b/lang/pl/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/pl/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/pl/oauth.php b/lang/pl/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/pl/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/pl/profile.php b/lang/pl/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/pl/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/settings.php b/lang/pl/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/pl/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/sharing.php b/lang/pl/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/pl/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/statistics.php b/lang/pl/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/pl/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/toasts.php b/lang/pl/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/pl/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/pl/users.php b/lang/pl/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/pl/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pl/validation.php b/lang/pl/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/pl/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/pt/diagnostics.php b/lang/pt/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/pt/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/dialogs.php b/lang/pt/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/pt/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/fix-tree.php b/lang/pt/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/pt/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/gallery.php b/lang/pt/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/pt/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/jobs.php b/lang/pt/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/pt/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/pt/landing.php b/lang/pt/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/pt/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/pt/left-menu.php b/lang/pt/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/pt/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/pt/oauth.php b/lang/pt/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/pt/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/pt/profile.php b/lang/pt/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/pt/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/settings.php b/lang/pt/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/pt/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/sharing.php b/lang/pt/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/pt/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/statistics.php b/lang/pt/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/pt/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/toasts.php b/lang/pt/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/pt/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/pt/users.php b/lang/pt/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/pt/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/pt/validation.php b/lang/pt/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/pt/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/ru/diagnostics.php b/lang/ru/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/ru/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/dialogs.php b/lang/ru/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/ru/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/fix-tree.php b/lang/ru/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/ru/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/gallery.php b/lang/ru/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/ru/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/jobs.php b/lang/ru/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/ru/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/ru/landing.php b/lang/ru/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/ru/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/ru/left-menu.php b/lang/ru/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/ru/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/ru/oauth.php b/lang/ru/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/ru/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/ru/profile.php b/lang/ru/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/ru/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/settings.php b/lang/ru/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/ru/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/sharing.php b/lang/ru/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/ru/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/statistics.php b/lang/ru/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/ru/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/toasts.php b/lang/ru/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/ru/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/ru/users.php b/lang/ru/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/ru/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/ru/validation.php b/lang/ru/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/ru/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/sk/diagnostics.php b/lang/sk/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/sk/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/dialogs.php b/lang/sk/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/sk/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/fix-tree.php b/lang/sk/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/sk/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/gallery.php b/lang/sk/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/sk/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/jobs.php b/lang/sk/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/sk/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/sk/landing.php b/lang/sk/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/sk/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/sk/left-menu.php b/lang/sk/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/sk/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/sk/oauth.php b/lang/sk/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/sk/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/sk/profile.php b/lang/sk/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/sk/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/settings.php b/lang/sk/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/sk/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/sharing.php b/lang/sk/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/sk/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/statistics.php b/lang/sk/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/sk/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/toasts.php b/lang/sk/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/sk/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/sk/users.php b/lang/sk/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/sk/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sk/validation.php b/lang/sk/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/sk/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/sv/diagnostics.php b/lang/sv/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/sv/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/dialogs.php b/lang/sv/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/sv/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/fix-tree.php b/lang/sv/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/sv/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/gallery.php b/lang/sv/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/sv/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/jobs.php b/lang/sv/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/sv/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/sv/landing.php b/lang/sv/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/sv/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/sv/left-menu.php b/lang/sv/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/sv/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/sv/oauth.php b/lang/sv/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/sv/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/sv/profile.php b/lang/sv/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/sv/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/settings.php b/lang/sv/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/sv/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/sharing.php b/lang/sv/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/sv/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/statistics.php b/lang/sv/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/sv/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/toasts.php b/lang/sv/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/sv/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/sv/users.php b/lang/sv/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/sv/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/sv/validation.php b/lang/sv/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/sv/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/vi/diagnostics.php b/lang/vi/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/vi/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/dialogs.php b/lang/vi/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/vi/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/fix-tree.php b/lang/vi/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/vi/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/gallery.php b/lang/vi/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/vi/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/jobs.php b/lang/vi/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/vi/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/vi/landing.php b/lang/vi/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/vi/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/vi/left-menu.php b/lang/vi/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/vi/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/vi/oauth.php b/lang/vi/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/vi/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/vi/profile.php b/lang/vi/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/vi/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/settings.php b/lang/vi/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/vi/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/sharing.php b/lang/vi/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/vi/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/statistics.php b/lang/vi/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/vi/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/toasts.php b/lang/vi/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/vi/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/vi/users.php b/lang/vi/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/vi/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/vi/validation.php b/lang/vi/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/vi/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/zh_CN/diagnostics.php b/lang/zh_CN/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/zh_CN/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/dialogs.php b/lang/zh_CN/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/zh_CN/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/fix-tree.php b/lang/zh_CN/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/zh_CN/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/gallery.php b/lang/zh_CN/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/zh_CN/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/jobs.php b/lang/zh_CN/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/zh_CN/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/zh_CN/landing.php b/lang/zh_CN/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/zh_CN/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/zh_CN/left-menu.php b/lang/zh_CN/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/zh_CN/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/zh_CN/oauth.php b/lang/zh_CN/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/zh_CN/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/zh_CN/profile.php b/lang/zh_CN/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/zh_CN/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/settings.php b/lang/zh_CN/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/zh_CN/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/sharing.php b/lang/zh_CN/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/zh_CN/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/statistics.php b/lang/zh_CN/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/zh_CN/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/toasts.php b/lang/zh_CN/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/zh_CN/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/zh_CN/users.php b/lang/zh_CN/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/zh_CN/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_CN/validation.php b/lang/zh_CN/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/zh_CN/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/lang/zh_TW/diagnostics.php b/lang/zh_TW/diagnostics.php
new file mode 100644
index 00000000000..dd09ee8e36e
--- /dev/null
+++ b/lang/zh_TW/diagnostics.php
@@ -0,0 +1,24 @@
+ 'Diagnostics',
+
+ 'copy_to_clipboard' => 'Copy diagnostics to clipboard',
+ 'self-diagnosis' => 'Self-diagnosis',
+ 'info' => 'Info',
+ 'space' => 'Space',
+ 'load_space' => 'Load space usage.',
+ 'configuration' => 'Configuration',
+ 'loading' => 'Loading...',
+ 'identical_content' => 'Identical content',
+
+ 'toast' => [
+ 'info' => 'Info',
+ 'copy' => 'Diagnostics copied to clipboard!',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/dialogs.php b/lang/zh_TW/dialogs.php
new file mode 100644
index 00000000000..e6f9e133d57
--- /dev/null
+++ b/lang/zh_TW/dialogs.php
@@ -0,0 +1,209 @@
+ [
+ 'close' => 'Close',
+ 'cancel' => 'Cancel',
+ 'save' => 'Save',
+ 'delete' => 'Delete',
+ 'move' => 'Move',
+ ],
+ 'about' => [
+ 'subtitle' => 'Self-hosted photo-management done right',
+ 'description' => 'Lychee is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.',
+ 'update_available' => 'Update available!',
+ 'thank_you' => 'Thank you for your support!',
+ 'get_supporter_or_register' => 'Get exclusive features and support the development of Lychee.
Unlock the Supporter Edition or register your License key',
+ 'here' => 'here',
+ ],
+ 'dropbox' => [
+ 'not_configured' => 'Dropbox is not configured.',
+ ],
+ 'import_from_link' => [
+ 'instructions' => 'Please enter the direct link to a photo to import it:',
+ 'import' => 'Import',
+ ],
+ 'keybindings' => [
+ 'don_t_show_again' => 'Don\'t show this again',
+ 'side_wide' => 'Site-wide Shortcuts',
+ 'back_cancel' => 'Back/Cancel',
+ 'confirm' => 'Confirm',
+ 'login' => 'Login',
+ 'toggle_full_screen' => 'Toggle Full Screen',
+ 'toggle_sensitive_albums' => 'Toggle Sensitive Albums',
+
+ 'albums' => 'Albums Shortcuts',
+ 'new_album' => 'New Album',
+ 'upload_photos' => 'Upload Photos',
+ 'search' => 'Search',
+ 'show_this_modal' => 'Show this modal',
+ 'select_all' => 'Select All',
+ 'move_selection' => 'Move Selection',
+ 'delete_selection' => 'Delete Selection',
+
+ 'album' => 'Album Shortcuts',
+ 'slideshow' => 'Start/Stop Slideshow',
+ 'toggle' => 'Toggle panel',
+
+ 'photo' => 'Photo Shortcuts',
+ 'previous' => 'Previous photo',
+ 'next' => 'Next photo',
+ 'cycle' => 'Cycle overlay mode',
+ 'star' => 'Star the photo',
+ 'move' => 'Move the photo',
+ 'delete' => 'Delete the photo',
+ 'edit' => 'Edit information',
+ 'show_hide_meta' => 'Show information',
+
+ 'keep_hidden' => 'We will keep it hidden.',
+ ],
+ 'login' => [
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'unknown_invalid' => 'Unknown user or invalid password.',
+ 'signin' => 'Sign-In',
+ ],
+ 'register' => [
+ 'enter_license' => 'Enter your license key below:',
+ 'license_key' => 'License key',
+ 'invalid_license' => 'Invalid license key.',
+ 'register' => 'Register',
+ ],
+ 'share_album' => [
+ 'url_copied' => 'Copied URL to clipboard!',
+ ],
+ 'upload' => [
+ 'completed' => 'Completed',
+ 'uploaded' => 'Uploaded:',
+ 'release' => 'Release file to upload!',
+ 'select' => 'Click here to select files to upload',
+ 'drag' => '(Or drag files to the page)',
+ 'loading' => 'Loading',
+ 'resume' => 'Resume',
+ 'uploading' => 'Uploading',
+ 'finished' => 'Finished',
+ 'failed_error' => 'Upload failed. The server returned an error!',
+ ],
+ 'visibility' => [
+ 'public' => 'Public',
+ 'public_expl' => 'Anonymous users can access this album, subject to the restrictions below.',
+ 'full' => 'Original',
+ 'full_expl' => 'Anonymous users can view full-resolution photos.',
+ 'hidden' => 'Hidden',
+ 'hidden_expl' => 'Anonymous users need a direct link to access this album.',
+ 'downloadable' => 'Downloadable',
+ 'downloadable_expl' => 'Anonymous users can download this album.',
+ 'password' => 'Password',
+ 'password_prot' => 'Password protected',
+ 'password_prot_expl' => 'Anonymous users need a shared password to access this album.',
+ 'nsfw' => 'Sensitive',
+ 'nsfw_expl' => 'Album contains sensitive content.',
+ 'visibility_updated' => 'Visibility updated.',
+ ],
+ 'move_album' => [
+ 'confirm_single' => 'Are you sure you want to move the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to move all selected albums into the album “%s”?',
+ 'move_single' => 'Move Album',
+ 'move_to' => 'Move to',
+ 'move_to_single' => 'Move %s to:',
+ 'move_to_multiple' => 'Move %d albums to:',
+ 'no_album_target' => 'No album to move to',
+ 'moved_single' => 'Album moved!',
+ 'moved_single_details' => '%1$s moved to %2$s',
+ 'moved_details' => 'Album(s) moved to %s',
+ ],
+ 'new_album' => [
+ 'menu' => 'Create Album',
+ 'info' => 'Enter a title for the new album:',
+ 'title' => 'title',
+ 'create' => 'Create Album',
+ ],
+ 'new_tag_album' => [
+ 'menu' => 'Create Tag Album',
+ 'info' => 'Enter a title for the new tag album:',
+ 'title' => 'title',
+ 'set_tags' => 'Set tags to show',
+ 'warn' => 'Make sure to press enter after each tag',
+ 'create' => 'Create Tag Album',
+ ],
+ 'delete_album' => [
+ 'confirmation' => 'Are you sure you want to delete the album “%s” and all of the photos it contains?',
+ 'confirmation_multiple' => 'Are you sure you want to delete all %d selected albums and all of the photos they contain?',
+ 'warning' => 'This action can not be undone!',
+ 'delete' => 'Delete Album and Photos',
+ ],
+ 'transfer' => [
+ 'query' => 'Transfer ownership of album to',
+ 'confirmation' => 'Are you sure you want to transfer the ownership of album “%s” and all the photos it contains to "%s"?',
+ 'lost_access_warning' => 'Your access to this album will be lost.',
+ 'warning' => 'This action can not be undone!',
+ 'transfer' => 'Transfer ownership of album and photos',
+ ],
+ 'rename' => [
+ 'photo' => 'Enter a new title for this photo:',
+ 'album' => 'Enter a new title for this album:',
+ 'rename' => 'Rename',
+ ],
+ 'merge' => [
+ 'merge_to' => 'Merge %s to:',
+ 'merge_to_multiple' => 'Merge %d albums to:',
+ 'no_albums' => 'No albums to merge to.',
+ 'confirm' => 'Are you sure you want to merge the album “%1$s” into the album “%2$s”?',
+ 'confirm_multiple' => 'Are you sure you want to merge all selected albums into the album “%s”?',
+ 'merge' => 'Merge Albums',
+ 'merged' => 'Album(s) merged to %s!',
+ ],
+ 'unlock' => [
+ 'password_required' => 'This album is protected by a password. Enter the password below to view the photos of this album:',
+ 'password' => 'Password',
+ 'unlock' => 'Unlock',
+ ],
+ 'photo_tags' => [
+ 'question' => 'Enter your tags for this photo.',
+ 'question_multiple' => 'Enter your tags for all %d selected photos. Existing tags will be overwritten.',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'updated' => 'Tags updated!',
+ 'tags_override_info' => 'If this is unchecked, the tags will be added to the existing tags of the photo.',
+ ],
+ 'photo_copy' => [
+ 'no_albums' => 'No albums to copy to',
+ 'copy_to' => 'Copy %s to:',
+ 'copy_to_multiple' => 'Copy %d photos to:',
+ 'confirm' => 'Copy %s to %s.',
+ 'confirm_multiple' => 'Copy %d photos to %s.',
+ 'copy' => 'Copy',
+ 'copied' => 'Photo(s) copied!',
+ ],
+ 'photo_delete' => [
+ 'confirm' => 'Are you sure you want to delete the photo “%s”?',
+ 'confirm_multiple' => 'Are you sure you want to delete all %d selected photos?',
+ 'deleted' => 'Photo(s) deleted!',
+ ],
+ 'move_photo' => [
+ 'move_single' => 'Move %s to:',
+ 'move_multiple' => 'Move %d photos to:',
+ 'confirm' => 'Move %s to %s.',
+ 'confirm_multiple' => 'Move %d photos to %s.',
+ 'moved' => 'Photo(s) moved to %s!',
+ ],
+ 'target_user' => [
+ 'placeholder' => 'Select user',
+ ],
+ 'target_album' => [
+ 'placeholder' => 'Select album',
+ ],
+ 'webauthn' => [
+ 'u2f' => 'U2F',
+ 'success' => 'Authentication successful!',
+ 'error' => 'Whoops, it looks like something went wrong. Please reload the site and try again!',
+ ],
+ 'se' => [
+ 'available' => 'Available in the Supporter Edition',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/fix-tree.php b/lang/zh_TW/fix-tree.php
new file mode 100644
index 00000000000..1ede4afea9b
--- /dev/null
+++ b/lang/zh_TW/fix-tree.php
@@ -0,0 +1,49 @@
+ 'Maintenance',
+ 'intro' => 'This page allows you to re-order and fix your albums manually.
Before any modifications, we strongly recommend you to read about Nested Set tree structures.',
+ 'warning' => 'You can really break your Lychee installation here, modify values at your own risks.',
+
+ 'help' => [
+ 'header' => 'Help',
+ 'hover' => 'Hover ids or titles to highlight related albums.',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'convenience' => 'For your convenience, the and buttons allow you to change the values of %s and %s by respectively +1 and -1 with propagation.',
+ 'left-right-warn' => 'The and indicates that the value of %s (and respectively %s) is duplicated somewhere.',
+ 'parent-marked' => 'Marked Parent Id indicates that the %s and %s do not satisfy the Nest Set tree structures. Edit either the Parent Id or the %s/%s values.',
+ 'slowness' => 'This page will be slow with a large number of albums.',
+ ],
+
+ 'buttons' => [
+ 'reset' => 'Reset',
+ 'check' => 'Check',
+ 'apply' => 'Apply',
+ ],
+
+ 'table' => [
+ 'title' => 'Title',
+ 'left' => 'Left',
+ 'right' => 'Right',
+ 'id' => 'Id',
+ 'parent' => 'Parent Id',
+ ],
+
+ 'errors' => [
+ 'invalid' => 'Invalid tree!',
+ 'invalid_details' => 'We are not applying this as it is guaranteed to be a broken state.',
+ 'invalid_left' => 'Album %s has an invalid left value.',
+ 'invalid_right' => 'Album %s has an invalid right value.',
+ 'invalid_left_right' => 'Album %s has an invalid left/right values. Left should be strictly smaller than right: %s < %s.',
+ 'duplicate_left' => 'Album %s has a duplicate left value %s.',
+ 'duplicate_right' => 'Album %s has a duplicate right value %s.',
+ 'parent' => 'Album %s has an unexpected parent id %s.',
+ 'unknown' => 'Album %s has an unknown error.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/gallery.php b/lang/zh_TW/gallery.php
new file mode 100644
index 00000000000..f6c1013bca7
--- /dev/null
+++ b/lang/zh_TW/gallery.php
@@ -0,0 +1,235 @@
+ 'Gallery',
+
+ 'smart_albums' => 'Smart albums',
+ 'albums' => 'Albums',
+ 'root' => 'Albums',
+
+ 'original' => 'Original',
+ 'medium' => 'Medium',
+ 'medium_hidpi' => 'Medium HiDPI',
+ 'small' => 'Thumb',
+ 'small_hidpi' => 'Thumb HiDPI',
+ 'thumb' => 'Square thumb',
+ 'thumb_hidpi' => 'Square thumb HiDPI',
+ 'placeholder' => 'Low Quality Image Placeholder',
+ 'thumbnail' => 'Photo thumbnail',
+ 'live_video' => 'Video part of live-photo',
+
+ 'camera_data' => 'Camera date',
+ 'album_reserved' => 'All Rights Reserved',
+
+ 'map' => [
+ 'error_gpx' => 'Error loading GPX file',
+ 'osm_contributors' => 'OpenStreetMap contributors',
+ ],
+
+ 'search' => [
+ 'title' => 'Search',
+ 'searching' => 'Searching…',
+ 'no_results' => 'Nothing matches your search query.',
+ 'searchbox' => 'Search…',
+ 'minimum_chars' => 'Minimum %s characters required.',
+ 'photos' => 'Photos (%s)',
+ 'albums' => 'Albums (%s)',
+ ],
+
+ 'smart_album' => [
+ 'unsorted' => 'Unsorted',
+ 'starred' => 'Starred',
+ 'recent' => 'Recent',
+ 'public' => 'Public',
+ 'on_this_day' => 'On This Day',
+ ],
+
+ 'layout' => [
+ 'squares' => 'Square thumbnails',
+ 'justified' => 'With aspect, justified',
+ 'masonry' => 'With aspect, masonry',
+ 'grid' => 'With aspect, grid',
+ ],
+
+ 'overlay' => [
+ 'none' => 'None',
+ 'exif' => 'EXIF data',
+ 'description' => 'Description',
+ 'date' => 'Date taken',
+ ],
+
+ 'timeline' => [
+ 'default' => 'default',
+ 'disabled' => 'disabled',
+ 'year' => 'Year',
+ 'month' => 'Month',
+ 'day' => 'Day',
+ 'hour' => 'Hour',
+ ],
+
+ 'album' => [
+ 'header_albums' => 'Albums',
+ 'header_photos' => 'Photos',
+ 'no_results' => 'Nothing to see here',
+ 'upload' => 'Upload photos',
+
+ 'tabs' => [
+ 'about' => 'About Album',
+ 'share' => 'Share Album',
+ 'move' => 'Move Album',
+ 'danger' => 'DANGER ZONE',
+ ],
+
+ 'hero' => [
+ 'created' => 'Created',
+ 'copyright' => 'Copyright',
+ 'subalbums' => 'Subalbums',
+ 'images' => 'Photos',
+ 'download' => 'Download Album',
+ 'share' => 'Share Album',
+ 'stats_only_se' => 'Statistics available in the Supporter Edition',
+ ],
+
+ 'stats' => [
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter speed',
+ 'iso' => 'ISO',
+ 'model' => 'Model',
+ 'aperture' => 'Aperture',
+ 'no_data' => 'No data',
+ ],
+
+ 'properties' => [
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'photo_ordering' => 'Order photos by',
+ 'children_ordering' => 'Order albums by',
+ 'asc/desc' => 'asc/desc',
+ 'header' => 'Set album header',
+ 'compact_header' => 'Use compact header',
+ 'license' => 'Set license',
+ 'copyright' => 'Set copyright',
+ 'aspect_ratio' => 'Set album thumbs aspect ratio',
+ 'album_timeline' => 'Set album timeline mode',
+ 'photo_timeline' => 'Set photo timeline mode',
+ 'layout' => 'Set photo layout',
+ 'show_tags' => 'Set tags to show',
+ 'tags_required' => 'Tags are required.',
+ ],
+ ],
+
+ 'photo' => [
+ 'actions' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'set_album_header' => 'Set as album header',
+ 'move' => 'Move',
+ 'delete' => 'Delete',
+ 'header_set' => 'Header set',
+ ],
+
+ 'details' => [
+ 'about' => 'About',
+ 'basics' => 'Basics',
+ 'title' => 'Title',
+ 'uploaded' => 'Uploaded',
+ 'description' => 'Description',
+ 'license' => 'License',
+ 'reuse' => 'Reuse',
+ 'latitude' => 'Latitude',
+ 'longitude' => 'Longitude',
+ 'altitude' => 'Altitude',
+ 'location' => 'Location',
+ 'image' => 'Image',
+ 'video' => 'Video',
+ 'size' => 'Size',
+ 'format' => 'Format',
+ 'resolution' => 'Resolution',
+ 'duration' => 'Duration',
+ 'fps' => 'Frame rate',
+ 'tags' => 'Tags',
+ 'camera' => 'Camera',
+ 'captured' => 'Captured',
+ 'make' => 'Make',
+ 'type' => 'Type/Model',
+ 'lens' => 'Lens',
+ 'shutter' => 'Shutter Speed',
+ 'aperture' => 'Aperture',
+ 'focal' => 'Focal Length',
+ 'iso' => 'ISO %s',
+ ],
+
+ 'edit' => [
+ 'set_title' => 'Set Title',
+ 'set_description' => 'Set Description',
+ 'set_license' => 'Set License',
+ 'no_tags' => 'No Tags',
+ 'set_tags' => 'Set Tags',
+ 'set_created_at' => 'Set Upload Date',
+ ],
+ ],
+
+ 'nsfw' => [
+ 'header' => 'Sensitive content',
+ 'description' => 'This album contains sensitive content which some people may find offensive or disturbing.',
+ 'consent' => 'Tap to consent.',
+ ],
+
+ 'menus' => [
+ 'star' => 'Star',
+ 'unstar' => 'Unstar',
+ 'star_all' => 'Star Selected',
+ 'unstar_all' => 'Unstar Selected',
+ 'tag' => 'Tag',
+ 'tag_all' => 'Tag Selected',
+ 'set_cover' => 'Set Album Cover',
+ 'remove_header' => 'Remove Album Header',
+ 'set_header' => 'Set Album Header',
+ 'copy_to' => 'Copy to …',
+ 'copy_all_to' => 'Copy Selected to …',
+ 'rename' => 'Rename',
+ 'move' => 'Move',
+ 'move_all' => 'Move Selected',
+ 'delete' => 'Delete',
+ 'delete_all' => 'Delete Selected',
+ 'download' => 'Download',
+ 'download_all' => 'Download Selected',
+ 'merge' => 'Merge',
+ 'merge_all' => 'Merge Selected',
+
+ 'upload_photo' => 'Upload Photo',
+ 'import_link' => 'Import from Link',
+ 'import_dropbox' => 'Import from Dropbox',
+ 'new_album' => 'New Album',
+ 'new_tag_album' => 'New Tag Album',
+ 'upload_track' => 'Upload track',
+ 'delete_track' => 'Delete track',
+ ],
+
+ 'sort' => [
+ 'photo_select_1' => 'Upload Time',
+ 'photo_select_2' => 'Take Date',
+ 'photo_select_3' => 'Title',
+ 'photo_select_4' => 'Description',
+ 'photo_select_6' => 'Star',
+ 'photo_select_7' => 'Photo Format',
+ 'ascending' => 'Ascending',
+ 'descending' => 'Descending',
+ 'album_select_1' => 'Creation Time',
+ 'album_select_2' => 'Title',
+ 'album_select_3' => 'Description',
+ 'album_select_5' => 'Latest Take Date',
+ 'album_select_6' => 'Oldest Take Date',
+ ],
+
+ 'albums_protection' => [
+ 'private' => 'private',
+ 'public' => 'public',
+ 'inherit_from_parent' => 'inherit from parent',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/jobs.php b/lang/zh_TW/jobs.php
new file mode 100644
index 00000000000..d31ff03a514
--- /dev/null
+++ b/lang/zh_TW/jobs.php
@@ -0,0 +1,12 @@
+ 'Jobs',
+
+ 'no_data' => 'No Jobs have been executed yet.',
+];
\ No newline at end of file
diff --git a/lang/zh_TW/landing.php b/lang/zh_TW/landing.php
new file mode 100644
index 00000000000..38e776aa7e6
--- /dev/null
+++ b/lang/zh_TW/landing.php
@@ -0,0 +1,13 @@
+ 'Gallery',
+ 'access_gallery' => 'Access the gallery',
+ 'hosted_with_lychee' => 'Hosted with Lychee',
+ 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s',
+];
\ No newline at end of file
diff --git a/lang/zh_TW/left-menu.php b/lang/zh_TW/left-menu.php
new file mode 100644
index 00000000000..f174b4166f4
--- /dev/null
+++ b/lang/zh_TW/left-menu.php
@@ -0,0 +1,23 @@
+ 'Back to Gallery',
+
+ 'admin' => 'Admin',
+ 'clockwork' => 'Clockwork App',
+ 'logs' => 'Show Logs',
+ 'jobs' => 'Show Job History',
+ 'user' => 'User',
+
+ 'sign_out' => 'Sign Out',
+
+ 'about' => 'About',
+ 'api' => 'API Documentation',
+ 'source_code' => 'Source Code',
+ 'support' => 'Support',
+];
\ No newline at end of file
diff --git a/lang/zh_TW/oauth.php b/lang/zh_TW/oauth.php
deleted file mode 100644
index d338d47c26c..00000000000
--- a/lang/zh_TW/oauth.php
+++ /dev/null
@@ -1,12 +0,0 @@
- 'Oauth is not available.',
- 'SET_UP_CREDENTIALS' => 'Set up the credentials in your .env',
- 'SET_UP_OAUTH' => 'Set up Oauth authentication',
- 'SET_UP' => 'Set up %s',
- 'TOKEN_REGISTERED' => '%s token registered.',
- 'RESET' => 'reset',
-];
\ No newline at end of file
diff --git a/lang/zh_TW/profile.php b/lang/zh_TW/profile.php
new file mode 100644
index 00000000000..7639588294e
--- /dev/null
+++ b/lang/zh_TW/profile.php
@@ -0,0 +1,58 @@
+ 'Profile',
+
+ 'login' => [
+ 'header' => 'Profile',
+ 'enter_current_password' => 'Enter your current password:',
+ 'current_password' => 'Current password',
+ 'credentials_update' => 'Your credentials will be changed to the following:',
+ 'username' => 'Username',
+ 'new_password' => 'New password',
+ 'confirm_new_password' => 'Confirm new password',
+ 'email_instruction' => 'Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.',
+ 'email' => 'Email',
+ 'change' => 'Change Login',
+ 'api_token' => 'API Token ...',
+
+ 'missing_fields' => 'Missing fields',
+ ],
+
+ 'token' => [
+ 'unavailable' => 'You have already viewed this token.',
+ 'no_data' => 'No token API have been generated.',
+ 'disable' => 'Disable',
+ 'disabled' => 'Token disabled',
+ 'warning' => 'This token will not be displayed again. Copy it and keep it in a safe place.',
+ 'reset' => 'Reset the token',
+ 'create' => 'Create a new token',
+ ],
+
+ 'oauth' => [
+ 'header' => 'OAuth',
+ 'header_not_available' => 'OAuth is not available',
+ 'setup_env' => 'Set up the credentials in your .env',
+ 'token_registered' => '%s token registered.',
+ 'setup' => 'Set up %s',
+ 'reset' => 'reset',
+ 'credential_deleted' => 'Credential deleted!',
+ ],
+
+ 'u2f' => [
+ 'header' => 'Passkey/MFA/2FA',
+ 'info' => 'This only provides the ability to use WebAuthn to authenticate instead of username & password.',
+ 'empty' => 'Credentials list is empty!',
+ 'not_secure' => 'Environment not secured. U2F not available.',
+ 'new' => 'Register new device.',
+ 'credential_deleted' => 'Credential deleted!',
+ 'credential_updated' => 'Credential updated!',
+ 'credential_registred' => 'Registration successful!',
+ '5_chars' => 'At least 5 chars.',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/settings.php b/lang/zh_TW/settings.php
new file mode 100644
index 00000000000..c131c1bcc30
--- /dev/null
+++ b/lang/zh_TW/settings.php
@@ -0,0 +1,86 @@
+ 'Settings',
+ 'small_screen' => 'For better a experience on the Settings page,
we recommend you use a larger screen.',
+ 'tabs' => [
+ 'basic' => 'Basic',
+ 'all_settings' => 'All settings',
+ ],
+ 'toasts' => [
+ 'change_saved' => 'Change saved!',
+ 'details' => 'Settings have been modified as per request',
+ 'error' => 'Error!',
+ 'error_load_css' => 'Could not load dist/user.css',
+ 'error_load_js' => 'Could not load dist/custom.js',
+ 'error_save_css' => 'Could not save CSS',
+ 'error_save_js' => 'Could not save JS',
+ 'thank_you' => 'Thank you for your support.',
+ 'reload' => 'Reload your page for full functionalities.',
+ ],
+ 'system' => [
+ 'header' => 'System',
+ 'use_dark_mode' => 'Use dark mode for Lychee',
+ 'language' => 'Language used by Lychee',
+ 'nsfw_album_visibility' => 'Make Sensitive albums visible by default.',
+ 'nsfw_album_explanation' => 'If the album is public, it is still accessible, just hidden from the view and can be revealed by pressing H.',
+ ],
+ 'lychee_se' => [
+ 'header' => 'Lychee SE',
+ 'call4action' => 'Get exclusive features and support the development of Lychee. Unlock the SE edition.',
+ 'preview' => 'Enable preview of Lychee SE features',
+ 'hide_call4action' => 'Hide this Lychee SE registration form. I am happy with Lychee as-is. :)',
+ 'hide_warning' => 'If enabled, the only way to register your license key will be via the More tab above. Changes are applied on page reload.',
+ ],
+ 'dropbox' => [
+ 'header' => 'Dropbox',
+ 'instruction' => 'In order to import photos from your Dropbox, you need a valid drop-ins app key from their website.',
+ 'api_key' => 'Dropbox API Key',
+ 'set_key' => 'Set Dropbox Key',
+ ],
+ 'gallery' => [
+ 'header' => 'Gallery',
+ 'photo_order_column' => 'Default column used for sorting photos',
+ 'photo_order_direction' => 'Default order used for sorting photos',
+ 'album_order_column' => 'Default column used for sorting albums',
+ 'album_order_direction' => 'Default order used for sorting albums',
+ 'aspect_ratio' => 'Default aspect ratio for album thumbs',
+ 'photo_layout' => 'Layout for pictures',
+ 'album_decoration' => 'Show decorations on album cover (sub-album and/or photo count)',
+ 'album_decoration_direction' => 'Align album decorations horizontally or vertically',
+ 'photo_overlay' => 'Default image overlay information',
+ 'license_default' => 'Default license used for albums',
+ 'license_help' => 'Need help choosing?',
+ ],
+ 'geolocation' => [
+ 'header' => 'Geo-location',
+ 'map_display' => 'Display the map given GPS coordinates',
+ 'map_display_public' => 'Allow anonymous users to access the map',
+ 'map_provider' => 'Defines the map provider',
+ 'map_include_subalbums' => 'Includes pictures of the sub albums on the map',
+ 'location_decoding' => 'Use GPS location decoding',
+ 'location_show' => 'Show location extracted from GPS coordinates',
+ 'location_show_public' => 'Anonymous users can access the extracted location from GPS coordinates',
+ ],
+ 'advanced' => [
+ 'header' => 'Advanced Customization',
+ 'change_css' => 'Change CSS',
+ 'change_js' => 'Change JS',
+ ],
+ 'all' => [
+ 'old_setting_style' => 'Old setting style',
+ 'change_detected' => 'Some settings changed.',
+ 'save' => 'Save',
+ ],
+
+ 'tool_option' => [
+ 'disabled' => 'disabled',
+ 'enabled' => 'enabled',
+ 'discover' => 'discover',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/sharing.php b/lang/zh_TW/sharing.php
new file mode 100644
index 00000000000..4f1653c2c62
--- /dev/null
+++ b/lang/zh_TW/sharing.php
@@ -0,0 +1,27 @@
+ 'Sharing',
+
+ 'info' => 'This page gives an overview of and the ability to edit the sharing rights associated with albums.',
+ 'album_title' => 'Album title',
+ 'username' => 'Username',
+ 'no_data' => 'Sharing list is empty.',
+ 'share' => 'Share',
+ 'permission_deleted' => 'Permission deleted!',
+ 'permission_created' => 'Permission created!',
+
+ 'grants' => [
+ 'read' => 'Grants read access',
+ 'original' => 'Grants access to original photo',
+ 'download' => 'Grants download',
+ 'upload' => 'Grants upload',
+ 'edit' => 'Grants edit',
+ 'delete' => 'Grants delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/statistics.php b/lang/zh_TW/statistics.php
new file mode 100644
index 00000000000..bc601a6c9e5
--- /dev/null
+++ b/lang/zh_TW/statistics.php
@@ -0,0 +1,28 @@
+ 'Statistics',
+
+ 'preview_text' => 'This is a preview of the statistics page available in Lychee SE.
The data shown here are randomly generated and do not reflect your server.',
+ 'no_data' => 'User does not have data on server.',
+ 'collapse' => 'Collapse albums sizes',
+
+ 'total' => [
+ 'total' => 'Total',
+ 'albums' => 'Albums',
+ 'photos' => 'Photos',
+ 'size' => 'Size',
+ ],
+ 'table' => [
+ 'username' => 'Owner',
+ 'title' => 'Title',
+ 'photos' => 'Photos',
+ 'descendants' => 'Children',
+ 'size' => 'Size',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/toasts.php b/lang/zh_TW/toasts.php
new file mode 100644
index 00000000000..ed9974ed991
--- /dev/null
+++ b/lang/zh_TW/toasts.php
@@ -0,0 +1,11 @@
+ 'Error',
+ 'success' => 'Success',
+];
\ No newline at end of file
diff --git a/lang/zh_TW/users.php b/lang/zh_TW/users.php
new file mode 100644
index 00000000000..d26df77df17
--- /dev/null
+++ b/lang/zh_TW/users.php
@@ -0,0 +1,38 @@
+ 'Users',
+ 'description' => 'Here you can manage the users of your Lychee installation. You can create, edit and delete users.',
+ 'create' => 'Create a new user',
+ 'username' => 'Username',
+ 'password' => 'Password',
+ 'legend' => 'Legend',
+ 'upload_rights' => 'When selected, the user can upload content.',
+ 'edit_rights' => 'When selected, the user can modify their profile (username, password).',
+ 'quota' => 'When set, the user has a space quota for pictures (in kB).',
+
+ 'user_deleted' => 'User deleted',
+ 'user_created' => 'User created',
+ 'user_updated' => 'User updated',
+ 'change_saved' => 'Change saved!',
+
+ 'create_edit' => [
+ 'upload_rights' => 'User can upload content.',
+ 'edit_rights' => 'User can modify their profile (username, password).',
+ 'quota' => 'User has quota limit.',
+ 'quota_kb' => 'quota in kB (0 for default)',
+ 'note' => 'Admin note (not publically visible)',
+ 'create' => 'Create',
+ 'edit' => 'Edit',
+ ],
+ 'line' => [
+ 'admin' => 'admin user',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ ],
+];
\ No newline at end of file
diff --git a/lang/zh_TW/validation.php b/lang/zh_TW/validation.php
deleted file mode 100644
index 3009ff07f6d..00000000000
--- a/lang/zh_TW/validation.php
+++ /dev/null
@@ -1,144 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
- '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.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- '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.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- '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.',
- 'mimetypes' => '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.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- '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.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'attribute-name' => [
- 'rule-name' => 'custom-message',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap attribute place-holders
- | with something more reader friendly such as E-Mail Address instead
- | of "email". This simply helps us make messages a little cleaner.
- |
- */
-
- 'attributes' => [],
-];
diff --git a/resources/js/components/diagnostics/ConfigurationsDiagnostics.vue b/resources/js/components/diagnostics/ConfigurationsDiagnostics.vue
index a36dbf1883a..6bd934aa030 100644
--- a/resources/js/components/diagnostics/ConfigurationsDiagnostics.vue
+++ b/resources/js/components/diagnostics/ConfigurationsDiagnostics.vue
@@ -1,5 +1,5 @@
-
- {{ $t("lychee.ALBUM_ABOUT") }}
+ {{ $t("gallery.photo.details.about") }}
- {{ $t("lychee.PHOTO_BASICS") }}
+ {{ $t("gallery.photo.details.basics") }}
- {{ $t("lychee.PHOTO_TITLE") }}
+ {{ $t("gallery.photo.details.title") }}
{{ props.photo.title }}
- {{ $t("lychee.PHOTO_UPLOADED") }}
+ {{ $t("gallery.photo.details.uploaded") }}
{{ props.photo.preformatted.created_at }}
- {{
- $t("lychee.PHOTO_DESCRIPTION")
- }}
+
+ {{ $t("gallery.photo.details.description") }}
+
- {{ $t("lychee.PHOTO_VIDEO") }}
+ {{ $t("gallery.photo.details.video") }}
- {{ $t("lychee.PHOTO_IMAGE") }}
+ {{ $t("gallery.photo.details.image") }}
- {{ $t("lychee.PHOTO_SIZE") }}
+ {{ $t("gallery.photo.details.size") }}
{{ props.photo.preformatted.filesize }}
- {{ $t("lychee.PHOTO_FORMAT") }}
+ {{ $t("gallery.photo.details.format") }}
{{ props.photo.type }}
- {{ $t("lychee.PHOTO_RESOLUTION") }}
+ {{ $t("gallery.photo.details.resolution") }}
{{ props.photo.preformatted.resolution }}
{{
- $t("lychee.PHOTO_DURATION")
+ $t("gallery.photo.details.duration")
}}
{{
props.photo.preformatted.duration
}}
{{
- $t("lychee.PHOTO_FPS")
+ $t("gallery.photo.details.fps")
}}
{{
props.photo.preformatted.fps
}}
- {{ $t("lychee.PHOTO_TAGS") }}
+ {{ $t("gallery.photo.details.tags") }}
- {{ $t("lychee.PHOTO_CAMERA") }}
+ {{ $t("gallery.photo.details.camera") }}
- {{ $t("lychee.PHOTO_CAPTURED") }}
+ {{ $t("gallery.photo.details.captured") }}
{{ props.photo.preformatted.taken_at }}
- {{ $t("lychee.PHOTO_MAKE") }}
+ {{ $t("gallery.photo.details.make") }}
{{ props.photo.make }}
- {{ $t("lychee.PHOTO_TYPE") }}
+ {{ $t("gallery.photo.details.type") }}
{{ props.photo.model }}
- {{ $t("lychee.PHOTO_LENS") }}
+ {{ $t("gallery.photo.details.lens") }}
{{ props.photo.lens }}
- {{ $t("lychee.PHOTO_SHUTTER") }}
+ {{ $t("gallery.photo.details.shutter") }}
{{ props.photo.preformatted.shutter }}
- {{ $t("lychee.PHOTO_APERTURE") }}
+ {{ $t("gallery.photo.details.aperture") }}
ƒ / {{ props.photo.preformatted.aperture }}
- {{ $t("lychee.PHOTO_FOCAL") }}
+ {{ $t("gallery.photo.details.focal") }}
{{ props.photo.focal }}
- {{ sprintf($t("lychee.PHOTO_ISO"), "") }}
+ {{ sprintf($t("gallery.photo.details.iso"), "") }}
{{ props.photo.preformatted.iso }}
- {{ $t("lychee.PHOTO_LOCATION") }}
+ {{ $t("gallery.photo.details.location") }}
{{ $t("lychee.PHOTO_REUSE") }}
- {{ $t("lychee.PHOTO_LICENSE") }}
+ {{ $t("gallery.photo.details.reuse") }}
+ {{ $t("gallery.photo.details.license") }}
{{ props.photo.preformatted.license }}
+ {{ $t("dialogs.delete_album.warning") }}
+ Thank you for your support!
+ {{ $t("dialogs.about.thank_you") }}
- Enter your license key below:
+ {{ $t("dialogs.register.enter_license") }}
+ {{ $t("landing.access_gallery") }}
diff --git a/resources/js/views/Permissions.vue b/resources/js/views/Permissions.vue
index 5469dd07111..7ec6adf8e7e 100644
--- a/resources/js/views/Permissions.vue
+++ b/resources/js/views/Permissions.vue
@@ -7,7 +7,7 @@
- {{ $t("lychee.DIAGNOSTICS") }}
+ {{ $t("diagnostics.title") }}
@@ -20,7 +20,7 @@
{{ i }} - {{ left[i] }}
{{ i }} + {{ right[i] }}
- Identical content
+ {{ $t("diagnostics.identical_content") }}
Sharing list is empty
+{{ $t("sharing.no_data") }}
This page allows you to manage users.
+{{ $t("users.description") }}