- {user.name}'s account and assets will be queued for permanent deletion immediately.
+
+ {message}
+
{:else}
- {user.name}'s account and assets will be scheduled for permanent deletion in {$serverConfig.userDeleteDelay}
- days.
+
+ {message}
+
{/if}
diff --git a/web/src/lib/components/admin-page/jobs/storage-migration-description.svelte b/web/src/lib/components/admin-page/jobs/storage-migration-description.svelte
index f4392ac1360..8b0a0f312a3 100644
--- a/web/src/lib/components/admin-page/jobs/storage-migration-description.svelte
+++ b/web/src/lib/components/admin-page/jobs/storage-migration-description.svelte
@@ -1,13 +1,18 @@
-Apply the current
-
- {$t('admin.storage_template_settings')}
-
-to previously uploaded assets
+
+ {message}
+
+
diff --git a/web/src/lib/components/admin-page/restore-dialogue.svelte b/web/src/lib/components/admin-page/restore-dialogue.svelte
index 82c28ef9314..4232aabdf98 100644
--- a/web/src/lib/components/admin-page/restore-dialogue.svelte
+++ b/web/src/lib/components/admin-page/restore-dialogue.svelte
@@ -1,9 +1,10 @@
+
+
+ {#if tag === 'b'}
+ {message}
+ {/if}
+
diff --git a/web/src/lib/components/i18n/format-message.svelte b/web/src/lib/components/i18n/format-message.svelte
new file mode 100644
index 00000000000..5bf3c14c326
--- /dev/null
+++ b/web/src/lib/components/i18n/format-message.svelte
@@ -0,0 +1,57 @@
+
+
+{#each parts as { tag, message }}
+ {#if tag}
+ {message}
+ {:else}
+ {message}
+ {/if}
+{/each}
diff --git a/web/src/lib/components/onboarding-page/onboarding-storage-template.svelte b/web/src/lib/components/onboarding-page/onboarding-storage-template.svelte
index a2af6c5c1dc..193adb3e4dd 100644
--- a/web/src/lib/components/onboarding-page/onboarding-storage-template.svelte
+++ b/web/src/lib/components/onboarding-page/onboarding-storage-template.svelte
@@ -9,7 +9,8 @@
import Button from '../elements/buttons/button.svelte';
import Icon from '../elements/icon.svelte';
import OnboardingCard from './onboarding-card.svelte';
- import { t } from 'svelte-i18n';
+ import { json, t } from 'svelte-i18n';
+ import FormatMessage from '$lib/components/i18n/format-message.svelte';
const dispatch = createEventDispatcher<{
done: void;
@@ -29,9 +30,9 @@
- When enabled, this feature will auto-organize files based on a user-defined template. Due to stability issues the
- feature has been turned off by default. For more information, please see the
- documentation.
+
+ {message}
+
{#if config && $user}
diff --git a/web/src/lib/components/shared-components/version-announcement-box.svelte b/web/src/lib/components/shared-components/version-announcement-box.svelte
index 211f7ce06ef..5f4b5557dd5 100644
--- a/web/src/lib/components/shared-components/version-announcement-box.svelte
+++ b/web/src/lib/components/shared-components/version-announcement-box.svelte
@@ -3,7 +3,8 @@
import type { ServerVersionResponseDto } from '@immich/sdk';
import Button from '../elements/buttons/button.svelte';
import FullScreenModal from './full-screen-modal.svelte';
- import { t } from 'svelte-i18n';
+ import { json, t } from 'svelte-i18n';
+ import FormatMessage from '$lib/components/i18n/format-message.svelte';
let showModal = false;
@@ -36,14 +37,17 @@
{#if showModal}
(showModal = false)}>
- Hi friend, there is a new version of the application please take your time to visit the
- release notes
- and ensure your docker-compose, and .env setup is up-to-date to prevent any misconfigurations,
- especially if you use WatchTower or any mechanism that handles updating your application automatically.
+
+ {#if tag === 'link'}
+
+
+ {message}
+
+
+ {:else if tag === 'code'}
+ {message}
+ {/if}
+
Your friend, Alex
diff --git a/web/src/lib/i18n/en.json b/web/src/lib/i18n/en.json
index 058e790d895..589bfd5b071 100644
--- a/web/src/lib/i18n/en.json
+++ b/web/src/lib/i18n/en.json
@@ -25,6 +25,7 @@
"add_exclusion_pattern_description": "Add exclusion patterns. Globbing using *, **, and ? is supported. To ignore all files in any directory named \"Raw\", use \"**/Raw/**\". To ignore all files ending in \".tif\", use \"**/*.tif\". To ignore an absolute path, use \"/path/to/ignore/**\".",
"authentication_settings": "Authentication Settings",
"authentication_settings_description": "Manage password, OAuth, and other authentication settings",
+ "authentication_settings_reenable": "To re-enable, use a Server Command.",
"background_task_job": "Background Tasks",
"check_all": "Check All",
"config_set_by_file": "Config is currently set by a config file",
@@ -33,7 +34,6 @@
"confirm_email_below": "To confirm, type \"{email}\" below",
"confirm_reprocess_all_faces": "Are you sure you want to reprocess all faces? This will also clear named people.",
"confirm_user_password_reset": "Are you sure you want to reset {user}'s password?",
- "crontab_guru": "Crontab Guru",
"disable_login": "Disable login",
"duplicate_detection_job_description": "Run machine learning on assets to detect similar images. Relies on Smart Search",
"exclusion_pattern_description": "Exclusion patterns lets you ignore files and folders when scanning your library. This is useful if you have folders that contain files you don't want to import, such as RAW files.",
@@ -68,6 +68,7 @@
"jobs_failed": "{jobCount} failed",
"library_created": "Created library: {library}",
"library_cron_expression": "Cron expression",
+ "library_cron_expression_description": "Set the scanning interval using the cron format. For more information please refer to e.g. Crontab Guru",
"library_cron_expression_presets": "Cron expression presets",
"library_deleted": "Library deleted",
"library_import_path_description": "Specify a folder to import. This folder, including subfolders, will be scanned for images and videos.",
@@ -84,6 +85,7 @@
"logging_level_description": "When enabled, what log level to use.",
"logging_settings": "Logging",
"machine_learning_clip_model": "CLIP model",
+ "machine_learning_clip_model_description": "The name of a CLIP model listed here. Note that you must re-run the 'Smart Search' job for all images upon changing a model.",
"machine_learning_duplicate_detection": "Duplicate Detection",
"machine_learning_duplicate_detection_enabled": "Enable duplicate detection",
"machine_learning_duplicate_detection_enabled_description": "If disabled, exactly identical assets will still be de-duplicated.",
@@ -162,6 +164,7 @@
"oauth_scope": "Scope",
"oauth_settings": "OAuth",
"oauth_settings_description": "Manage OAuth login settings",
+ "oauth_settings_more_details": "For more details about this feature, refer to the docs.",
"oauth_signing_algorithm": "Signing algorithm",
"oauth_storage_label_claim": "Storage label claim",
"oauth_storage_label_claim_description": "Automatically set the user's storage label to the value of this claim.",
@@ -201,9 +204,15 @@
"storage_template_hash_verification_enabled": "Hash verification failed",
"storage_template_hash_verification_enabled_description": "Enables hash verification, don't disable this unless you're certain of the implications",
"storage_template_migration": "Storage template migration",
+ "storage_template_migration_description": "Apply the current {template} to previously uploaded assets",
+ "storage_template_migration_info": "Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the {job}.",
"storage_template_migration_job": "Storage Migration Job",
+ "storage_template_more_details": "For more details about this feature, refer to the Storage Template and its implications",
+ "storage_template_onboarding_description": "When enabled, this feature will auto-organize files based on a user-defined template. Due to stability issues the feature has been turned off by default. For more information, please see the documentation.",
+ "storage_template_path_length": "Approximate path length limit: {length, number}/{limit, number}",
"storage_template_settings": "Storage Template",
"storage_template_settings_description": "Manage the folder structure and file name of the upload asset",
+ "storage_template_user_label": "{label} is the user's Storage Label",
"system_settings": "System Settings",
"theme_custom_css_settings": "Custom CSS",
"theme_custom_css_settings_description": "Cascading Style Sheets allow the design of Immich to be customized.",
@@ -226,6 +235,7 @@
"transcoding_audio_codec": "Audio codec",
"transcoding_audio_codec_description": "Opus is the highest quality option, but has lower compatibility with old devices or software.",
"transcoding_bitrate_description": "Videos higher than max bitrate or not in an accepted format",
+ "transcoding_codecs_learn_more": "To learn more about the terminology used here, refer to FFmpeg documentation for H.264 codec, HEVC codec and VP9 codec.",
"transcoding_constant_quality_mode": "Constant quality mode",
"transcoding_constant_quality_mode_description": "ICQ is better than CQP, but some hardware acceleration devices do not support this mode. Setting this option will prefer the specified mode when using quality-based encoding. Ignored by NVENC as it does not support ICQ.",
"transcoding_constant_rate_factor": "Constant rate factor (-crf)",
@@ -275,11 +285,14 @@
"trash_settings_description": "Manage trash settings",
"untracked_files": "Untracked Files",
"untracked_files_description": "These files are not tracked by the application. They can be the results of failed moves, interrupted uploads, or left behind due to a bug",
+ "user_delete_delay": "{user}'s account and assets will be scheduled for permanent deletion in {delay, plural, one {# day} other {# days}}.",
"user_delete_delay_settings": "Delete delay",
"user_delete_delay_settings_description": "Number of days after removal to permanently delete a user's account and assets. The user deletion job runs at midnight to check for users that are ready for deletion. Changes to this setting will be evaluated at the next execution.",
+ "user_delete_immediately": "{user}'s account and assets will be queued for permanent deletion immediately.",
"user_management": "User Management",
"user_password_has_been_reset": "The user's password has been reset:",
"user_password_reset_description": "Please provide the temporary password to the user and inform them they will need to change the password at their next login.",
+ "user_restore_description": "{user}'s account will be restored.",
"user_settings": "User Settings",
"user_settings_description": "Manage user settings",
"user_successfully_removed": "User {email} has been successfully removed.",
@@ -902,6 +915,7 @@
"validate": "Validate",
"variables": "Variables",
"version": "Version",
+ "version_announcement_message": "Hi friend, there is a new version of the application please take your time to visit the release notes and ensure your docker-compose.yml, and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your application automatically.",
"video": "Video",
"video_hover_setting": "Play video thumbnail on hover",
"video_hover_setting_description": "Play video thumbnail when mouse is hovering over item. Even when disabled, playback can be started by hovering over the play icon.",