chore(web): standardize settings labels (#10303)

* chore(web): standardize settings labels

- spelling out "max" and "min" in full
- accordions use title case
- labels for settings all use sentence case
- remove the "Enable"/"Enabled"/"ENABLED" titles for toggles, in favor
  of just using the description
- change any gray labels to be immich blue, to match the look and feel
  of the other settings

* chore: update user settings toggle, remove unused "enable" strings
This commit is contained in:
Ben 2024-06-14 07:32:41 +00:00 committed by GitHub
parent e1731fe316
commit 211451d234
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 105 additions and 118 deletions

View File

@ -88,8 +88,7 @@
<SettingSwitch <SettingSwitch
{disabled} {disabled}
title={$t('enable').toUpperCase()} title={$t('admin.oauth_enable_description')}
subtitle={$t('admin.oauth_enable_description')}
bind:checked={config.oauth.enabled} bind:checked={config.oauth.enabled}
/> />
@ -223,9 +222,8 @@
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<div class="ml-4 mt-4 flex flex-col"> <div class="ml-4 mt-4 flex flex-col">
<SettingSwitch <SettingSwitch
title={$t('enabled')} title={$t('admin.password_enable_description')}
{disabled} {disabled}
subtitle={$t('admin.password_enable_description')}
bind:checked={config.passwordLogin.enabled} bind:checked={config.passwordLogin.enabled}
/> />
</div> </div>

View File

@ -82,7 +82,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.transcoding_audio_codec').toUpperCase()} label={$t('admin.transcoding_audio_codec')}
{disabled} {disabled}
desc={$t('admin.transcoding_audio_codec_description')} desc={$t('admin.transcoding_audio_codec_description')}
bind:value={config.ffmpeg.targetAudioCodec} bind:value={config.ffmpeg.targetAudioCodec}
@ -100,7 +100,7 @@
/> />
<SettingCheckboxes <SettingCheckboxes
label={$t('admin.transcoding_accepted_audio_codecs').toUpperCase()} label={$t('admin.transcoding_accepted_audio_codecs')}
{disabled} {disabled}
desc={$t('admin.transcoding_accepted_audio_codecs_description')} desc={$t('admin.transcoding_accepted_audio_codecs_description')}
bind:value={config.ffmpeg.acceptedAudioCodecs} bind:value={config.ffmpeg.acceptedAudioCodecs}
@ -114,7 +114,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.transcoding_video_codec').toUpperCase()} label={$t('admin.transcoding_video_codec')}
{disabled} {disabled}
desc={$t('admin.transcoding_video_codec_description')} desc={$t('admin.transcoding_video_codec_description')}
bind:value={config.ffmpeg.targetVideoCodec} bind:value={config.ffmpeg.targetVideoCodec}
@ -130,7 +130,7 @@
/> />
<SettingCheckboxes <SettingCheckboxes
label={$t('admin.transcoding_accepted_video_codecs').toUpperCase()} label={$t('admin.transcoding_accepted_video_codecs')}
{disabled} {disabled}
desc={$t('admin.transcoding_accepted_video_codecs_description')} desc={$t('admin.transcoding_accepted_video_codecs_description')}
bind:value={config.ffmpeg.acceptedVideoCodecs} bind:value={config.ffmpeg.acceptedVideoCodecs}
@ -145,7 +145,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.transcoding_target_resolution').toUpperCase()} label={$t('admin.transcoding_target_resolution')}
{disabled} {disabled}
desc={$t('admin.transcoding_target_resolution_description')} desc={$t('admin.transcoding_target_resolution_description')}
bind:value={config.ffmpeg.targetResolution} bind:value={config.ffmpeg.targetResolution}
@ -164,7 +164,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
{disabled} {disabled}
label={$t('admin.transcoding_max_bitrate').toUpperCase()} label={$t('admin.transcoding_max_bitrate')}
desc={$t('admin.transcoding_max_bitrate_description')} desc={$t('admin.transcoding_max_bitrate_description')}
bind:value={config.ffmpeg.maxBitrate} bind:value={config.ffmpeg.maxBitrate}
isEdited={config.ffmpeg.maxBitrate !== savedConfig.ffmpeg.maxBitrate} isEdited={config.ffmpeg.maxBitrate !== savedConfig.ffmpeg.maxBitrate}
@ -173,14 +173,14 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
{disabled} {disabled}
label={$t('admin.transcoding_threads').toUpperCase()} label={$t('admin.transcoding_threads')}
desc={$t('admin.transcoding_threads_description')} desc={$t('admin.transcoding_threads_description')}
bind:value={config.ffmpeg.threads} bind:value={config.ffmpeg.threads}
isEdited={config.ffmpeg.threads !== savedConfig.ffmpeg.threads} isEdited={config.ffmpeg.threads !== savedConfig.ffmpeg.threads}
/> />
<SettingSelect <SettingSelect
label={$t('admin.transcoding_transcode_policy').toUpperCase()} label={$t('admin.transcoding_transcode_policy')}
{disabled} {disabled}
desc={$t('admin.transcoding_transcode_policy_description')} desc={$t('admin.transcoding_transcode_policy_description')}
bind:value={config.ffmpeg.transcode} bind:value={config.ffmpeg.transcode}
@ -208,7 +208,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.transcoding_tone_mapping').toUpperCase()} label={$t('admin.transcoding_tone_mapping')}
{disabled} {disabled}
desc={$t('admin.transcoding_tone_mapping_description')} desc={$t('admin.transcoding_tone_mapping_description')}
bind:value={config.ffmpeg.tonemap} bind:value={config.ffmpeg.tonemap}
@ -235,7 +235,7 @@
/> />
<SettingSwitch <SettingSwitch
title={$t('admin.transcoding_two_pass_encoding').toUpperCase()} title={$t('admin.transcoding_two_pass_encoding')}
{disabled} {disabled}
subtitle={$t('admin.transcoding_two_pass_encoding_setting_description')} subtitle={$t('admin.transcoding_two_pass_encoding_setting_description')}
bind:checked={config.ffmpeg.twoPass} bind:checked={config.ffmpeg.twoPass}
@ -249,7 +249,7 @@
> >
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSelect <SettingSelect
label={$t('admin.transcoding_acceleration_api').toUpperCase()} label={$t('admin.transcoding_acceleration_api')}
{disabled} {disabled}
desc={$t('admin.transcoding_acceleration_api_description')} desc={$t('admin.transcoding_acceleration_api_description')}
bind:value={config.ffmpeg.accel} bind:value={config.ffmpeg.accel}
@ -277,7 +277,7 @@
/> />
<SettingSwitch <SettingSwitch
title={$t('admin.transcoding_hardware_decoding').toUpperCase()} title={$t('admin.transcoding_hardware_decoding')}
{disabled} {disabled}
subtitle={$t('admin.transcoding_hardware_decoding_setting_description')} subtitle={$t('admin.transcoding_hardware_decoding_setting_description')}
bind:checked={config.ffmpeg.accelDecode} bind:checked={config.ffmpeg.accelDecode}
@ -285,7 +285,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.transcoding_constant_quality_mode').toUpperCase()} label={$t('admin.transcoding_constant_quality_mode')}
desc={$t('admin.transcoding_constant_quality_mode_description')} desc={$t('admin.transcoding_constant_quality_mode_description')}
bind:value={config.ffmpeg.cqMode} bind:value={config.ffmpeg.cqMode}
options={[ options={[
@ -298,7 +298,7 @@
/> />
<SettingSwitch <SettingSwitch
title={$t('admin.transcoding_temporal_aq').toUpperCase()} title={$t('admin.transcoding_temporal_aq')}
{disabled} {disabled}
subtitle={$t('admin.transcoding_temporal_aq_description')} subtitle={$t('admin.transcoding_temporal_aq_description')}
bind:checked={config.ffmpeg.temporalAQ} bind:checked={config.ffmpeg.temporalAQ}
@ -307,7 +307,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('admin.transcoding_preferred_hardware_device').toUpperCase()} label={$t('admin.transcoding_preferred_hardware_device')}
desc={$t('admin.transcoding_preferred_hardware_device_description')} desc={$t('admin.transcoding_preferred_hardware_device_description')}
bind:value={config.ffmpeg.preferredHwDevice} bind:value={config.ffmpeg.preferredHwDevice}
isEdited={config.ffmpeg.preferredHwDevice !== savedConfig.ffmpeg.preferredHwDevice} isEdited={config.ffmpeg.preferredHwDevice !== savedConfig.ffmpeg.preferredHwDevice}
@ -324,7 +324,7 @@
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.transcoding_tone_mapping_npl').toUpperCase()} label={$t('admin.transcoding_tone_mapping_npl')}
desc={$t('admin.transcoding_tone_mapping_npl_description')} desc={$t('admin.transcoding_tone_mapping_npl_description')}
bind:value={config.ffmpeg.npl} bind:value={config.ffmpeg.npl}
isEdited={config.ffmpeg.npl !== savedConfig.ffmpeg.npl} isEdited={config.ffmpeg.npl !== savedConfig.ffmpeg.npl}
@ -333,7 +333,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.transcoding_max_b_frames').toUpperCase()} label={$t('admin.transcoding_max_b_frames')}
desc={$t('admin.transcoding_max_b_frames_description')} desc={$t('admin.transcoding_max_b_frames_description')}
bind:value={config.ffmpeg.bframes} bind:value={config.ffmpeg.bframes}
isEdited={config.ffmpeg.bframes !== savedConfig.ffmpeg.bframes} isEdited={config.ffmpeg.bframes !== savedConfig.ffmpeg.bframes}
@ -342,7 +342,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.transcoding_reference_frames').toUpperCase()} label={$t('admin.transcoding_reference_frames')}
desc={$t('admin.transcoding_reference_frames_description')} desc={$t('admin.transcoding_reference_frames_description')}
bind:value={config.ffmpeg.refs} bind:value={config.ffmpeg.refs}
isEdited={config.ffmpeg.refs !== savedConfig.ffmpeg.refs} isEdited={config.ffmpeg.refs !== savedConfig.ffmpeg.refs}
@ -351,7 +351,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.transcoding_max_keyframe_interval').toUpperCase()} label={$t('admin.transcoding_max_keyframe_interval')}
desc={$t('admin.transcoding_max_keyframe_interval_description')} desc={$t('admin.transcoding_max_keyframe_interval_description')}
bind:value={config.ffmpeg.gopSize} bind:value={config.ffmpeg.gopSize}
isEdited={config.ffmpeg.gopSize !== savedConfig.ffmpeg.gopSize} isEdited={config.ffmpeg.gopSize !== savedConfig.ffmpeg.gopSize}

View File

@ -26,7 +26,7 @@
<form autocomplete="off" on:submit|preventDefault> <form autocomplete="off" on:submit|preventDefault>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSelect <SettingSelect
label={$t('admin.image_thumbnail_format').toUpperCase()} label={$t('admin.image_thumbnail_format')}
desc={$t('admin.image_format_description')} desc={$t('admin.image_format_description')}
bind:value={config.image.thumbnailFormat} bind:value={config.image.thumbnailFormat}
options={[ options={[
@ -39,7 +39,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.image_thumbnail_resolution').toUpperCase()} label={$t('admin.image_thumbnail_resolution')}
desc={$t('admin.image_thumbnail_resolution_description')} desc={$t('admin.image_thumbnail_resolution_description')}
number number
bind:value={config.image.thumbnailSize} bind:value={config.image.thumbnailSize}
@ -56,7 +56,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.image_preview_format').toUpperCase()} label={$t('admin.image_preview_format')}
desc={$t('admin.image_format_description')} desc={$t('admin.image_format_description')}
bind:value={config.image.previewFormat} bind:value={config.image.previewFormat}
options={[ options={[
@ -69,7 +69,7 @@
/> />
<SettingSelect <SettingSelect
label={$t('admin.image_preview_resolution').toUpperCase()} label={$t('admin.image_preview_resolution')}
desc={$t('admin.image_preview_resolution_description')} desc={$t('admin.image_preview_resolution_description')}
number number
bind:value={config.image.previewSize} bind:value={config.image.previewSize}
@ -86,7 +86,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.image_quality').toUpperCase()} label={$t('admin.image_quality')}
desc={$t('admin.image_quality_description')} desc={$t('admin.image_quality_description')}
bind:value={config.image.quality} bind:value={config.image.quality}
isEdited={config.image.quality !== savedConfig.image.quality} isEdited={config.image.quality !== savedConfig.image.quality}
@ -94,7 +94,7 @@
/> />
<SettingSwitch <SettingSwitch
title={$t('admin.image_prefer_wide_gamut').toUpperCase()} title={$t('admin.image_prefer_wide_gamut')}
subtitle={$t('admin.image_prefer_wide_gamut_setting_description')} subtitle={$t('admin.image_prefer_wide_gamut_setting_description')}
checked={config.image.colorspace === Colorspace.P3} checked={config.image.colorspace === Colorspace.P3}
on:toggle={(e) => (config.image.colorspace = e.detail ? Colorspace.P3 : Colorspace.Srgb)} on:toggle={(e) => (config.image.colorspace = e.detail ? Colorspace.P3 : Colorspace.Srgb)}
@ -103,7 +103,7 @@
/> />
<SettingSwitch <SettingSwitch
title={$t('admin.image_prefer_embedded_preview').toUpperCase()} title={$t('admin.image_prefer_embedded_preview')}
subtitle={$t('admin.image_prefer_embedded_preview_setting_description')} subtitle={$t('admin.image_prefer_embedded_preview_setting_description')}
checked={config.image.extractEmbedded} checked={config.image.extractEmbedded}
on:toggle={() => (config.image.extractEmbedded = !config.image.extractEmbedded)} on:toggle={() => (config.image.extractEmbedded = !config.image.extractEmbedded)}

View File

@ -38,9 +38,8 @@
<form autocomplete="off" on:submit|preventDefault> <form autocomplete="off" on:submit|preventDefault>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enable')} title={$t('admin.library_watching_enable_description')}
{disabled} {disabled}
subtitle={$t('admin.library_watching_enable_description')}
bind:checked={config.library.watch.enabled} bind:checked={config.library.watch.enabled}
/> />
</div> </div>
@ -65,14 +64,18 @@
<form autocomplete="off" on:submit|preventDefault> <form autocomplete="off" on:submit|preventDefault>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.library_scanning_enable_description')}
{disabled} {disabled}
subtitle={$t('admin.library_scanning_enable_description')}
bind:checked={config.library.scan.enabled} bind:checked={config.library.scan.enabled}
/> />
<div class="flex flex-col my-2 dark:text-immich-dark-fg"> <div class="flex flex-col my-2 dark:text-immich-dark-fg">
<label class="text-sm" for="expression-select">{$t('admin.library_cron_expression_presets')}</label> <label
class="font-medium text-immich-primary dark:text-immich-dark-primary text-sm"
for="expression-select"
>
{$t('admin.library_cron_expression_presets')}
</label>
<select <select
class="p-2 mt-2 text-sm rounded-lg bg-slate-200 hover:cursor-pointer dark:bg-gray-600" class="p-2 mt-2 text-sm rounded-lg bg-slate-200 hover:cursor-pointer dark:bg-gray-600"
disabled={disabled || !config.library.scan.enabled} disabled={disabled || !config.library.scan.enabled}

View File

@ -22,13 +22,12 @@
<form autocomplete="off" on:submit|preventDefault> <form autocomplete="off" on:submit|preventDefault>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.logging_enable_description')}
{disabled} {disabled}
subtitle={$t('admin.logging_enable_description')}
bind:checked={config.logging.enabled} bind:checked={config.logging.enabled}
/> />
<SettingSelect <SettingSelect
label={$t('level').toUpperCase()} label={$t('level')}
desc={$t('admin.logging_level_description')} desc={$t('admin.logging_level_description')}
bind:value={config.logging.level} bind:value={config.logging.level}
options={[ options={[

View File

@ -27,7 +27,7 @@
<form autocomplete="off" on:submit|preventDefault class="mx-4 mt-4"> <form autocomplete="off" on:submit|preventDefault class="mx-4 mt-4">
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.machine_learning_enabled')}
subtitle={$t('admin.machine_learning_enabled_description')} subtitle={$t('admin.machine_learning_enabled_description')}
{disabled} {disabled}
bind:checked={config.machineLearning.enabled} bind:checked={config.machineLearning.enabled}
@ -37,7 +37,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('url').toUpperCase()} label={$t('url')}
desc={$t('admin.machine_learning_url_description')} desc={$t('admin.machine_learning_url_description')}
bind:value={config.machineLearning.url} bind:value={config.machineLearning.url}
required={true} required={true}
@ -53,7 +53,7 @@
> >
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.machine_learning_smart_search_enabled')}
subtitle={$t('admin.machine_learning_smart_search_enabled_description')} subtitle={$t('admin.machine_learning_smart_search_enabled_description')}
bind:checked={config.machineLearning.clip.enabled} bind:checked={config.machineLearning.clip.enabled}
disabled={disabled || !config.machineLearning.enabled} disabled={disabled || !config.machineLearning.enabled}
@ -63,7 +63,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('admin.machine_learning_clip_model').toUpperCase()} label={$t('admin.machine_learning_clip_model')}
bind:value={config.machineLearning.clip.modelName} bind:value={config.machineLearning.clip.modelName}
required={true} required={true}
disabled={disabled || !config.machineLearning.enabled || !config.machineLearning.clip.enabled} disabled={disabled || !config.machineLearning.enabled || !config.machineLearning.clip.enabled}
@ -84,7 +84,7 @@
> >
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.machine_learning_duplicate_detection_enabled')}
subtitle={$t('admin.machine_learning_duplicate_detection_enabled_description')} subtitle={$t('admin.machine_learning_duplicate_detection_enabled_description')}
bind:checked={config.machineLearning.duplicateDetection.enabled} bind:checked={config.machineLearning.duplicateDetection.enabled}
disabled={disabled || !config.machineLearning.enabled || !config.machineLearning.clip.enabled} disabled={disabled || !config.machineLearning.enabled || !config.machineLearning.clip.enabled}
@ -94,7 +94,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.machine_learning_max_detection_distance').toUpperCase()} label={$t('admin.machine_learning_max_detection_distance')}
bind:value={config.machineLearning.duplicateDetection.maxDistance} bind:value={config.machineLearning.duplicateDetection.maxDistance}
step="0.0005" step="0.0005"
min={0.001} min={0.001}
@ -114,7 +114,7 @@
> >
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.machine_learning_facial_recognition_setting')}
subtitle={$t('admin.machine_learning_facial_recognition_setting_description')} subtitle={$t('admin.machine_learning_facial_recognition_setting_description')}
bind:checked={config.machineLearning.facialRecognition.enabled} bind:checked={config.machineLearning.facialRecognition.enabled}
disabled={disabled || !config.machineLearning.enabled} disabled={disabled || !config.machineLearning.enabled}
@ -123,7 +123,7 @@
<hr /> <hr />
<SettingSelect <SettingSelect
label={$t('admin.machine_learning_facial_recognition_model').toUpperCase()} label={$t('admin.machine_learning_facial_recognition_model')}
desc={$t('admin.machine_learning_facial_recognition_model_description')} desc={$t('admin.machine_learning_facial_recognition_model_description')}
name="facial-recognition-model" name="facial-recognition-model"
bind:value={config.machineLearning.facialRecognition.modelName} bind:value={config.machineLearning.facialRecognition.modelName}
@ -140,7 +140,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.machine_learning_min_detection_score').toUpperCase()} label={$t('admin.machine_learning_min_detection_score')}
desc={$t('admin.machine_learning_min_detection_score_description')} desc={$t('admin.machine_learning_min_detection_score_description')}
bind:value={config.machineLearning.facialRecognition.minScore} bind:value={config.machineLearning.facialRecognition.minScore}
step="0.1" step="0.1"
@ -153,7 +153,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.machine_learning_max_recognition_distance').toUpperCase()} label={$t('admin.machine_learning_max_recognition_distance')}
desc={$t('admin.machine_learning_max_recognition_distance_description')} desc={$t('admin.machine_learning_max_recognition_distance_description')}
bind:value={config.machineLearning.facialRecognition.maxDistance} bind:value={config.machineLearning.facialRecognition.maxDistance}
step="0.1" step="0.1"
@ -166,7 +166,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
label={$t('admin.machine_learning_min_recognized_faces').toUpperCase()} label={$t('admin.machine_learning_min_recognized_faces')}
desc={$t('admin.machine_learning_min_recognized_faces_description')} desc={$t('admin.machine_learning_min_recognized_faces_description')}
bind:value={config.machineLearning.facialRecognition.minFaces} bind:value={config.machineLearning.facialRecognition.minFaces}
step="1" step="1"

View File

@ -26,12 +26,7 @@
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<SettingAccordion key="map" title={$t('admin.map_settings')} subtitle={$t('admin.map_settings_description')}> <SettingAccordion key="map" title={$t('admin.map_settings')} subtitle={$t('admin.map_settings_description')}>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch title={$t('admin.map_enable_description')} {disabled} bind:checked={config.map.enabled} />
title={$t('enabled').toUpperCase()}
{disabled}
subtitle={$t('admin.map_enable_description')}
bind:checked={config.map.enabled}
/>
<hr /> <hr />
@ -67,9 +62,8 @@
</svelte:fragment> </svelte:fragment>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.map_reverse_geocoding_enable_description')}
{disabled} {disabled}
subtitle={$t('admin.map_reverse_geocoding_enable_description')}
bind:checked={config.reverseGeocoding.enabled} bind:checked={config.reverseGeocoding.enabled}
/> />
</div></SettingAccordion </div></SettingAccordion

View File

@ -21,8 +21,7 @@
<form autocomplete="off" on:submit|preventDefault> <form autocomplete="off" on:submit|preventDefault>
<div class="ml-4 mt-4"> <div class="ml-4 mt-4">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.version_check_enabled_description')}
subtitle={$t('admin.version_check_enabled_description')}
bind:checked={config.newVersionCheck.enabled} bind:checked={config.newVersionCheck.enabled}
{disabled} {disabled}
/> />

View File

@ -71,8 +71,7 @@
<SettingAccordion key="email" title={$t('email')} subtitle={$t('admin.notification_email_setting_description')}> <SettingAccordion key="email" title={$t('email')} subtitle={$t('admin.notification_email_setting_description')}>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch
title={$t('enabled')} title={$t('admin.notification_enable_email_notifications')}
subtitle={$t('admin.notification_enable_email_notifications')}
{disabled} {disabled}
bind:checked={config.notifications.smtp.enabled} bind:checked={config.notifications.smtp.enabled}
/> />

View File

@ -24,7 +24,7 @@
<div class="mt-4 ml-4"> <div class="mt-4 ml-4">
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('admin.server_external_domain_settings').toUpperCase()} label={$t('admin.server_external_domain_settings')}
desc={$t('admin.server_external_domain_settings_description')} desc={$t('admin.server_external_domain_settings_description')}
bind:value={config.server.externalDomain} bind:value={config.server.externalDomain}
isEdited={config.server.externalDomain !== savedConfig.server.externalDomain} isEdited={config.server.externalDomain !== savedConfig.server.externalDomain}
@ -32,7 +32,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('admin.server_welcome_message').toUpperCase()} label={$t('admin.server_welcome_message')}
desc={$t('admin.server_welcome_message_description')} desc={$t('admin.server_welcome_message_description')}
bind:value={config.server.loginPageMessage} bind:value={config.server.loginPageMessage}
isEdited={config.server.loginPageMessage !== savedConfig.server.loginPageMessage} isEdited={config.server.loginPageMessage !== savedConfig.server.loginPageMessage}

View File

@ -108,16 +108,15 @@
{#await getTemplateOptions() then} {#await getTemplateOptions() then}
<div id="directory-path-builder" class="flex flex-col gap-4 {minified ? '' : 'ml-4 mt-4'}"> <div id="directory-path-builder" class="flex flex-col gap-4 {minified ? '' : 'ml-4 mt-4'}">
<SettingSwitch <SettingSwitch
title={$t('enabled').toUpperCase()} title={$t('admin.storage_template_enable_description')}
{disabled} {disabled}
subtitle={$t('admin.storage_template_enable_description')}
bind:checked={config.storageTemplate.enabled} bind:checked={config.storageTemplate.enabled}
isEdited={!(config.storageTemplate.enabled === savedConfig.storageTemplate.enabled)} isEdited={!(config.storageTemplate.enabled === savedConfig.storageTemplate.enabled)}
/> />
{#if !minified} {#if !minified}
<SettingSwitch <SettingSwitch
title={$t('admin.storage_template_hash_verification_enabled').toUpperCase()} title={$t('admin.storage_template_hash_verification_enabled')}
{disabled} {disabled}
subtitle={$t('admin.storage_template_hash_verification_enabled_description')} subtitle={$t('admin.storage_template_hash_verification_enabled_description')}
bind:checked={config.storageTemplate.hashVerificationEnabled} bind:checked={config.storageTemplate.hashVerificationEnabled}
@ -173,7 +172,9 @@
<form autocomplete="off" class="flex flex-col" on:submit|preventDefault> <form autocomplete="off" class="flex flex-col" on:submit|preventDefault>
<div class="flex flex-col my-2"> <div class="flex flex-col my-2">
<label class="text-sm" for="preset-select">{$t('preset').toUpperCase()}</label> <label class="font-medium text-immich-primary dark:text-immich-dark-primary text-sm" for="preset-select">
{$t('preset')}
</label>
<select <select
class="immich-form-input p-2 mt-2 text-sm rounded-lg bg-slate-200 hover:cursor-pointer dark:bg-gray-600" class="immich-form-input p-2 mt-2 text-sm rounded-lg bg-slate-200 hover:cursor-pointer dark:bg-gray-600"
disabled={disabled || !config.storageTemplate.enabled} disabled={disabled || !config.storageTemplate.enabled}
@ -189,7 +190,7 @@
</div> </div>
<div class="flex gap-2 align-bottom"> <div class="flex gap-2 align-bottom">
<SettingInputField <SettingInputField
label={$t('template').toUpperCase()} label={$t('template')}
disabled={disabled || !config.storageTemplate.enabled} disabled={disabled || !config.storageTemplate.enabled}
required required
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}

View File

@ -23,12 +23,7 @@
<div in:fade={{ duration: 500 }}> <div in:fade={{ duration: 500 }}>
<form autocomplete="off" on:submit|preventDefault> <form autocomplete="off" on:submit|preventDefault>
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingSwitch <SettingSwitch title={$t('admin.trash_enabled_description')} {disabled} bind:checked={config.trash.enabled} />
title={$t('enabled').toUpperCase()}
{disabled}
subtitle={$t('admin.trash_enabled_description')}
bind:checked={config.trash.enabled}
/>
<hr /> <hr />

View File

@ -26,7 +26,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.NUMBER} inputType={SettingInputFieldType.NUMBER}
min={1} min={1}
label={$t('admin.user_delete_delay_settings').toUpperCase()} label={$t('admin.user_delete_delay_settings')}
desc={$t('admin.user_delete_delay_settings_description')} desc={$t('admin.user_delete_delay_settings_description')}
bind:value={config.user.deleteDelay} bind:value={config.user.deleteDelay}
isEdited={config.user.deleteDelay !== savedConfig.user.deleteDelay} isEdited={config.user.deleteDelay !== savedConfig.user.deleteDelay}

View File

@ -18,7 +18,9 @@
<div class="mb-4 w-full"> <div class="mb-4 w-full">
<div class={`flex h-[26px] place-items-center gap-1`}> <div class={`flex h-[26px] place-items-center gap-1`}>
<label class={`immich-form-label text-sm`} for="{name}-select">{label}</label> <label class="font-medium text-immich-primary dark:text-immich-dark-primary text-sm" for="{name}-select">
{label}
</label>
{#if isEdited} {#if isEdited}
<div <div

View File

@ -16,7 +16,7 @@
<div class="mb-4 w-full"> <div class="mb-4 w-full">
<div class={`flex h-[26px] place-items-center gap-1`}> <div class={`flex h-[26px] place-items-center gap-1`}>
<label class={`immich-form-label text-sm`} for={label}>{label}</label> <label class="font-medium text-immich-primary dark:text-immich-dark-primary text-sm" for={label}>{label}</label>
{#if required} {#if required}
<div class="text-red-400">*</div> <div class="text-red-400">*</div>
{/if} {/if}

View File

@ -45,7 +45,7 @@
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.PASSWORD} inputType={SettingInputFieldType.PASSWORD}
label={$t('password').toUpperCase()} label={$t('password')}
bind:value={password} bind:value={password}
required={true} required={true}
passwordAutocomplete="current-password" passwordAutocomplete="current-password"
@ -53,7 +53,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.PASSWORD} inputType={SettingInputFieldType.PASSWORD}
label={$t('new_password').toUpperCase()} label={$t('new_password')}
bind:value={newPassword} bind:value={newPassword}
required={true} required={true}
passwordAutocomplete="new-password" passwordAutocomplete="new-password"
@ -61,7 +61,7 @@
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.PASSWORD} inputType={SettingInputFieldType.PASSWORD}
label={$t('confirm_password').toUpperCase()} label={$t('confirm_password')}
bind:value={confirmPassword} bind:value={confirmPassword}
required={true} required={true}
passwordAutocomplete="new-password" passwordAutocomplete="new-password"

View File

@ -45,8 +45,7 @@
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<div class="ml-4"> <div class="ml-4">
<SettingSwitch <SettingSwitch
title={$t('enable')} title={$t('notification_toggle_setting_description')}
subtitle={$t('notification_toggle_setting_description')}
bind:checked={emailNotificationsEnabled} bind:checked={emailNotificationsEnabled}
/> />
</div> </div>

View File

@ -44,27 +44,23 @@
<div class="ml-4 mt-4 flex flex-col gap-4"> <div class="ml-4 mt-4 flex flex-col gap-4">
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('user_id').toUpperCase()} label={$t('user_id')}
bind:value={editedUser.id} bind:value={editedUser.id}
disabled={true} disabled={true}
/> />
<SettingInputField <SettingInputField inputType={SettingInputFieldType.EMAIL} label={$t('email')} bind:value={editedUser.email} />
inputType={SettingInputFieldType.EMAIL}
label={$t('email').toUpperCase()}
bind:value={editedUser.email}
/>
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('name').toUpperCase()} label={$t('name')}
bind:value={editedUser.name} bind:value={editedUser.name}
required={true} required={true}
/> />
<SettingInputField <SettingInputField
inputType={SettingInputFieldType.TEXT} inputType={SettingInputFieldType.TEXT}
label={$t('storage_label').toUpperCase()} label={$t('storage_label')}
disabled={true} disabled={true}
value={editedUser.storageLabel || ''} value={editedUser.storageLabel || ''}
required={false} required={false}

View File

@ -39,7 +39,7 @@
"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.", "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.",
"external_library_created_at": "External library (created on {date})", "external_library_created_at": "External library (created on {date})",
"external_library_management": "External Library Management", "external_library_management": "External Library Management",
"face_detection": "Face Detection", "face_detection": "Face detection",
"face_detection_description": "Detect the faces in assets using machine learning. For videos, only the thumbnail is considered. \"All\" (re-)processes all assets. \"Missing\" queues assets that haven't been processed yet. Detected faces will be queued for Facial Recognition after Face Detection is complete, grouping them into existing or new people.", "face_detection_description": "Detect the faces in assets using machine learning. For videos, only the thumbnail is considered. \"All\" (re-)processes all assets. \"Missing\" queues assets that haven't been processed yet. Detected faces will be queued for Facial Recognition after Face Detection is complete, grouping them into existing or new people.",
"facial_recognition_job_description": "Group detected faces into people. This step runs after Face Detection is complete. \"All\" (re-)clusters all faces. \"Missing\" queues faces that don't have a person assigned.", "facial_recognition_job_description": "Group detected faces into people. This step runs after Face Detection is complete. \"All\" (re-)clusters all faces. \"Missing\" queues faces that don't have a person assigned.",
"force_delete_user_warning": "WARNING: This will immediately remove the user and all assets. This cannot be undone and the files cannot be recovered.", "force_delete_user_warning": "WARNING: This will immediately remove the user and all assets. This cannot be undone and the files cannot be recovered.",
@ -59,7 +59,7 @@
"image_thumbnail_format": "Thumbnail format", "image_thumbnail_format": "Thumbnail format",
"image_thumbnail_resolution": "Thumbnail resolution", "image_thumbnail_resolution": "Thumbnail resolution",
"image_thumbnail_resolution_description": "Used when viewing groups of photos (main timeline, album view, etc.). Higher resolutions can preserve more detail but take longer to encode, have larger file sizes, and can reduce app responsiveness.", "image_thumbnail_resolution_description": "Used when viewing groups of photos (main timeline, album view, etc.). Higher resolutions can preserve more detail but take longer to encode, have larger file sizes, and can reduce app responsiveness.",
"job_concurrency": "{job} Concurrency", "job_concurrency": "{job} concurrency",
"job_not_concurrency_safe": "This job is not concurrency-safe.", "job_not_concurrency_safe": "This job is not concurrency-safe.",
"job_settings": "Job Settings", "job_settings": "Job Settings",
"job_settings_description": "Manage job concurrency", "job_settings_description": "Manage job concurrency",
@ -67,8 +67,8 @@
"jobs_delayed": "{jobCount} delayed", "jobs_delayed": "{jobCount} delayed",
"jobs_failed": "{jobCount} failed", "jobs_failed": "{jobCount} failed",
"library_created": "Created library: {library}", "library_created": "Created library: {library}",
"library_cron_expression": "Cron Expression", "library_cron_expression": "Cron expression",
"library_cron_expression_presets": "Cron Expression Presets", "library_cron_expression_presets": "Cron expression presets",
"library_deleted": "Library deleted", "library_deleted": "Library deleted",
"library_import_path_description": "Specify a folder to import. This folder, including subfolders, will be scanned for images and videos.", "library_import_path_description": "Specify a folder to import. This folder, including subfolders, will be scanned for images and videos.",
"library_scanning": "Periodic Scanning", "library_scanning": "Periodic Scanning",
@ -83,28 +83,32 @@
"logging_enable_description": "Enable logging", "logging_enable_description": "Enable logging",
"logging_level_description": "When enabled, what log level to use.", "logging_level_description": "When enabled, what log level to use.",
"logging_settings": "Logging", "logging_settings": "Logging",
"machine_learning_clip_model": "Clip Model", "machine_learning_clip_model": "CLIP model",
"machine_learning_duplicate_detection": "Duplicate Detection", "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.", "machine_learning_duplicate_detection_enabled_description": "If disabled, exactly identical assets will still be de-duplicated.",
"machine_learning_duplicate_detection_setting_description": "Use CLIP embeddings to find likely duplicates", "machine_learning_duplicate_detection_setting_description": "Use CLIP embeddings to find likely duplicates",
"machine_learning_enabled": "Enable machine learning",
"machine_learning_enabled_description": "If disabled, all ML features will be disabled regardless of the below settings.", "machine_learning_enabled_description": "If disabled, all ML features will be disabled regardless of the below settings.",
"machine_learning_facial_recognition": "Facial Recognition", "machine_learning_facial_recognition": "Facial Recognition",
"machine_learning_facial_recognition_description": "Detect, recognize and group faces in images", "machine_learning_facial_recognition_description": "Detect, recognize and group faces in images",
"machine_learning_facial_recognition_model": "Facial recognition model", "machine_learning_facial_recognition_model": "Facial recognition model",
"machine_learning_facial_recognition_model_description": "Models are listed in descending order of size. Larger models are slower and use more memory, but produce better results. Note that you must re-run the Face Detection job for all images upon changing a model.", "machine_learning_facial_recognition_model_description": "Models are listed in descending order of size. Larger models are slower and use more memory, but produce better results. Note that you must re-run the Face Detection job for all images upon changing a model.",
"machine_learning_facial_recognition_setting": "Enable facial recognition",
"machine_learning_facial_recognition_setting_description": "If disabled, images will not be encoded for facial recognition and will not populate the People section in the Explore page.", "machine_learning_facial_recognition_setting_description": "If disabled, images will not be encoded for facial recognition and will not populate the People section in the Explore page.",
"machine_learning_max_detection_distance": "Max detection distance", "machine_learning_max_detection_distance": "Maximum detection distance",
"machine_learning_max_detection_distance_description": "Maximum distance between two images to consider them duplicates, ranging from 0.001-0.1. Higher values will detect more duplicates, but may result in false positives.", "machine_learning_max_detection_distance_description": "Maximum distance between two images to consider them duplicates, ranging from 0.001-0.1. Higher values will detect more duplicates, but may result in false positives.",
"machine_learning_max_recognition_distance": "Max recognition distance", "machine_learning_max_recognition_distance": "Maximum recognition distance",
"machine_learning_max_recognition_distance_description": "Maximum distance between two faces to be considered the same person, ranging from 0-2. Lowering this can prevent labeling two people as the same person, while raising it can prevent labeling the same person as two different people. Note that it is easier to merge two people than to split one person in two, so err on the side of a lower threshold when possible.", "machine_learning_max_recognition_distance_description": "Maximum distance between two faces to be considered the same person, ranging from 0-2. Lowering this can prevent labeling two people as the same person, while raising it can prevent labeling the same person as two different people. Note that it is easier to merge two people than to split one person in two, so err on the side of a lower threshold when possible.",
"machine_learning_min_detection_score": "Min detection score", "machine_learning_min_detection_score": "Minimum detection score",
"machine_learning_min_detection_score_description": "Minimum confidence score for a face to be detected from 0-1. Lower values will detect more faces but may result in false positives.", "machine_learning_min_detection_score_description": "Minimum confidence score for a face to be detected from 0-1. Lower values will detect more faces but may result in false positives.",
"machine_learning_min_recognized_faces": "Min recognized faces", "machine_learning_min_recognized_faces": "Minimum recognized faces",
"machine_learning_min_recognized_faces_description": "The minimum number of recognized faces for a person to be created. Increasing this makes Facial Recognition more precise at the cost of increasing the chance that a face is not assigned to a person.", "machine_learning_min_recognized_faces_description": "The minimum number of recognized faces for a person to be created. Increasing this makes Facial Recognition more precise at the cost of increasing the chance that a face is not assigned to a person.",
"machine_learning_settings": "Machine Learning Settings", "machine_learning_settings": "Machine Learning Settings",
"machine_learning_settings_description": "Manage machine learning features and settings", "machine_learning_settings_description": "Manage machine learning features and settings",
"machine_learning_smart_search": "Smart Search", "machine_learning_smart_search": "Smart Search",
"machine_learning_smart_search_description": "Search for images semantically using CLIP embeddings", "machine_learning_smart_search_description": "Search for images semantically using CLIP embeddings",
"machine_learning_smart_search_enabled": "Enable smart search",
"machine_learning_smart_search_enabled_description": "If disabled, images will not be encoded for smart search.", "machine_learning_smart_search_enabled_description": "If disabled, images will not be encoded for smart search.",
"machine_learning_url_description": "URL of the machine learning server", "machine_learning_url_description": "URL of the machine learning server",
"manage_concurrency": "Manage Concurrency", "manage_concurrency": "Manage Concurrency",
@ -118,7 +122,7 @@
"map_settings": "Map & GPS Settings", "map_settings": "Map & GPS Settings",
"map_settings_description": "Manage map settings", "map_settings_description": "Manage map settings",
"map_style_description": "URL to a style.json map theme", "map_style_description": "URL to a style.json map theme",
"metadata_extraction_job": "Extract Metadata", "metadata_extraction_job": "Extract metadata",
"metadata_extraction_job_description": "Extract metadata information from each asset, such as GPS and resolution", "metadata_extraction_job_description": "Extract metadata information from each asset, such as GPS and resolution",
"migration_job": "Migration", "migration_job": "Migration",
"migration_job_description": "Migrate thumbnails for assets and faces to the latest folder structure", "migration_job_description": "Migrate thumbnails for assets and faces to the latest folder structure",
@ -186,18 +190,18 @@
"server_external_domain_settings_description": "Domain for public shared links, including http(s)://", "server_external_domain_settings_description": "Domain for public shared links, including http(s)://",
"server_settings": "Server Settings", "server_settings": "Server Settings",
"server_settings_description": "Manage server settings", "server_settings_description": "Manage server settings",
"server_welcome_message": "Welcome Message", "server_welcome_message": "Welcome message",
"server_welcome_message_description": "A message that is displayed on the login page.", "server_welcome_message_description": "A message that is displayed on the login page.",
"sidecar_job": "Sidecar Metadata", "sidecar_job": "Sidecar metadata",
"sidecar_job_description": "Discover or synchronize sidecar metadata from the filesystem", "sidecar_job_description": "Discover or synchronize sidecar metadata from the filesystem",
"slideshow_duration_description": "Number of seconds to display each image", "slideshow_duration_description": "Number of seconds to display each image",
"smart_search_job_description": "Run machine learning on assets to support smart search", "smart_search_job_description": "Run machine learning on assets to support smart search",
"storage_template_enable_description": "Enable storage template engine", "storage_template_enable_description": "Enable storage template engine",
"storage_template_hash_verification_enabled": "Hash verification failed", "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_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": "Storage template migration",
"storage_template_migration_job": "Storage Migration Job", "storage_template_migration_job": "Storage Migration Job",
"storage_template_settings": "Storage template", "storage_template_settings": "Storage Template",
"storage_template_settings_description": "Manage the folder structure and file name of the upload asset", "storage_template_settings_description": "Manage the folder structure and file name of the upload asset",
"system_settings": "System Settings", "system_settings": "System Settings",
"theme_custom_css_settings": "Custom CSS", "theme_custom_css_settings": "Custom CSS",
@ -231,16 +235,16 @@
"transcoding_hardware_decoding": "Hardware decoding", "transcoding_hardware_decoding": "Hardware decoding",
"transcoding_hardware_decoding_setting_description": "Applies only to NVENC and RKMPP. Enables end-to-end acceleration instead of only accelerating encoding. May not work on all videos.", "transcoding_hardware_decoding_setting_description": "Applies only to NVENC and RKMPP. Enables end-to-end acceleration instead of only accelerating encoding. May not work on all videos.",
"transcoding_hevc_codec": "HEVC codec", "transcoding_hevc_codec": "HEVC codec",
"transcoding_max_b_frames": "Max B-Frames", "transcoding_max_b_frames": "Maximum B-frames",
"transcoding_max_b_frames_description": "Higher values improve compression efficiency, but slow down encoding. May not be compatible with hardware acceleration on older devices. 0 disables B-frames, while -1 sets this value automatically.", "transcoding_max_b_frames_description": "Higher values improve compression efficiency, but slow down encoding. May not be compatible with hardware acceleration on older devices. 0 disables B-frames, while -1 sets this value automatically.",
"transcoding_max_bitrate": "Max bitrate", "transcoding_max_bitrate": "Maximum bitrate",
"transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600k for VP9 or HEVC, or 4500k for H.264. Disabled if set to 0.", "transcoding_max_bitrate_description": "Setting a max bitrate can make file sizes more predictable at a minor cost to quality. At 720p, typical values are 2600k for VP9 or HEVC, or 4500k for H.264. Disabled if set to 0.",
"transcoding_max_keyframe_interval": "Max keyframe interval", "transcoding_max_keyframe_interval": "Maximum keyframe interval",
"transcoding_max_keyframe_interval_description": "Sets the maximum frame distance between keyframes. Lower values worsen compression efficiency, but improve seek times and may improve quality in scenes with fast movement. 0 sets this value automatically.", "transcoding_max_keyframe_interval_description": "Sets the maximum frame distance between keyframes. Lower values worsen compression efficiency, but improve seek times and may improve quality in scenes with fast movement. 0 sets this value automatically.",
"transcoding_optimal_description": "Videos higher than target resolution or not in an accepted format", "transcoding_optimal_description": "Videos higher than target resolution or not in an accepted format",
"transcoding_preferred_hardware_device": "Preferred hardware device", "transcoding_preferred_hardware_device": "Preferred hardware device",
"transcoding_preferred_hardware_device_description": "Applies only to VAAPI and QSV. Sets the dri node used for hardware transcoding.", "transcoding_preferred_hardware_device_description": "Applies only to VAAPI and QSV. Sets the dri node used for hardware transcoding.",
"transcoding_preset_preset": "PRESET (-preset)", "transcoding_preset_preset": "Preset (-preset)",
"transcoding_preset_preset_description": "Compression speed. Slower presets produce smaller files, and increase quality when targeting a certain bitrate. VP9 ignores speeds above `faster`.", "transcoding_preset_preset_description": "Compression speed. Slower presets produce smaller files, and increase quality when targeting a certain bitrate. VP9 ignores speeds above `faster`.",
"transcoding_reference_frames": "Reference frames", "transcoding_reference_frames": "Reference frames",
"transcoding_reference_frames_description": "The number of frames to reference when compressing a given frame. Higher values improve compression efficiency, but slow down encoding. 0 sets this value automatically.", "transcoding_reference_frames_description": "The number of frames to reference when compressing a given frame. Higher values improve compression efficiency, but slow down encoding. 0 sets this value automatically.",
@ -253,13 +257,13 @@
"transcoding_temporal_aq_description": "Applies only to NVENC. Increases quality of high-detail, low-motion scenes. May not be compatible with older devices.", "transcoding_temporal_aq_description": "Applies only to NVENC. Increases quality of high-detail, low-motion scenes. May not be compatible with older devices.",
"transcoding_threads": "Threads", "transcoding_threads": "Threads",
"transcoding_threads_description": "Higher values lead to faster encoding, but leave less room for the server to process other tasks while active. This value should not be more than the number of CPU cores. Maximizes utilization if set to 0.", "transcoding_threads_description": "Higher values lead to faster encoding, but leave less room for the server to process other tasks while active. This value should not be more than the number of CPU cores. Maximizes utilization if set to 0.",
"transcoding_tone_mapping": "TONE-MAPPING", "transcoding_tone_mapping": "Tone-mapping",
"transcoding_tone_mapping_description": "Attempts to preserve the appearance of HDR videos when converted to SDR. Each algorithm makes different tradeoffs for color, detail and brightness. Hable preserves detail, Mobius preserves color, and Reinhard preserves brightness.", "transcoding_tone_mapping_description": "Attempts to preserve the appearance of HDR videos when converted to SDR. Each algorithm makes different tradeoffs for color, detail and brightness. Hable preserves detail, Mobius preserves color, and Reinhard preserves brightness.",
"transcoding_tone_mapping_npl": "TONE-MAPPING NPL", "transcoding_tone_mapping_npl": "Tone-mapping NPL",
"transcoding_tone_mapping_npl_description": "Colors will be adjusted to look normal for a display of this brightness. Counter-intuitively, lower values increase the brightness of the video and vice versa since it compensates for the brightness of the display. 0 sets this value automatically.", "transcoding_tone_mapping_npl_description": "Colors will be adjusted to look normal for a display of this brightness. Counter-intuitively, lower values increase the brightness of the video and vice versa since it compensates for the brightness of the display. 0 sets this value automatically.",
"transcoding_transcode_policy": "Transcode policy", "transcoding_transcode_policy": "Transcode policy",
"transcoding_transcode_policy_description": "Policy for when a video should be transcoded. HDR videos will always be transcoded (except if transcoding is disabled).", "transcoding_transcode_policy_description": "Policy for when a video should be transcoded. HDR videos will always be transcoded (except if transcoding is disabled).",
"transcoding_two_pass_encoding": "TWO-PASS ENCODING", "transcoding_two_pass_encoding": "Two-pass encoding",
"transcoding_two_pass_encoding_setting_description": "Transcode in two passes to produce better encoded videos. When max bitrate is enabled (required for it to work with H.264 and HEVC), this mode uses a bitrate range based on the max bitrate and ignores CRF. For VP9, CRF can be used if max bitrate is disabled.", "transcoding_two_pass_encoding_setting_description": "Transcode in two passes to produce better encoded videos. When max bitrate is enabled (required for it to work with H.264 and HEVC), this mode uses a bitrate range based on the max bitrate and ignores CRF. For VP9, CRF can be used if max bitrate is disabled.",
"transcoding_video_codec": "Video Codec", "transcoding_video_codec": "Video Codec",
"transcoding_video_codec_description": "VP9 has high efficiency and web compatibility, but takes longer to transcode. HEVC performs similarly, but has lower web compatibility. H.264 is widely compatible and quick to transcode, but produces much larger files. AV1 is the most efficient codec but lacks support on older devices.", "transcoding_video_codec_description": "VP9 has high efficiency and web compatibility, but takes longer to transcode. HEVC performs similarly, but has lower web compatibility. H.264 is widely compatible and quick to transcode, but produces much larger files. AV1 is the most efficient codec but lacks support on older devices.",
@ -281,7 +285,7 @@
"version_check_enabled_description": "Enable periodic requests to GitHub to check for new releases", "version_check_enabled_description": "Enable periodic requests to GitHub to check for new releases",
"version_check_settings": "Version Check", "version_check_settings": "Version Check",
"version_check_settings_description": "Enable/disable the new version notification", "version_check_settings_description": "Enable/disable the new version notification",
"video_conversion_job": "Transcode Videos", "video_conversion_job": "Transcode videos",
"video_conversion_job_description": "Transcode videos for wider compatibility with browsers and devices" "video_conversion_job_description": "Transcode videos for wider compatibility with browsers and devices"
}, },
"admin_email": "Admin Email", "admin_email": "Admin Email",
@ -350,7 +354,7 @@
"confirm": "Confirm", "confirm": "Confirm",
"confirm_admin_password": "Confirm Admin Password", "confirm_admin_password": "Confirm Admin Password",
"confirm_delete_shared_link": "Are you sure you want to delete this shared link?", "confirm_delete_shared_link": "Are you sure you want to delete this shared link?",
"confirm_password": "Confirm Password", "confirm_password": "Confirm password",
"contain": "Contain", "contain": "Contain",
"context": "Context", "context": "Context",
"continue": "Continue", "continue": "Continue",
@ -439,8 +443,6 @@
"email": "Email", "email": "Email",
"empty_album": "Empty Album", "empty_album": "Empty Album",
"empty_trash": "Empty trash", "empty_trash": "Empty trash",
"enable": "Enable",
"enabled": "Enabled",
"end_date": "End date", "end_date": "End date",
"error": "Error", "error": "Error",
"error_loading_image": "Error loading image", "error_loading_image": "Error loading image",
@ -624,7 +626,7 @@
"name_or_nickname": "Name or nickname", "name_or_nickname": "Name or nickname",
"never": "Never", "never": "Never",
"new_api_key": "New API Key", "new_api_key": "New API Key",
"new_password": "New Password", "new_password": "New password",
"new_person": "New person", "new_person": "New person",
"new_user_created": "New user created", "new_user_created": "New user created",
"newest_first": "Newest first", "newest_first": "Newest first",
@ -647,7 +649,7 @@
"note_apply_storage_label_to_previously_uploaded assets": "Note: To apply the Storage Label to previously uploaded assets, run the", "note_apply_storage_label_to_previously_uploaded assets": "Note: To apply the Storage Label to previously uploaded assets, run the",
"note_unlimited_quota": "Note: Enter 0 for unlimited quota", "note_unlimited_quota": "Note: Enter 0 for unlimited quota",
"notes": "Notes", "notes": "Notes",
"notification_toggle_setting_description": "Toggle email notifications", "notification_toggle_setting_description": "Enable email notifications",
"notifications": "Notifications", "notifications": "Notifications",
"notifications_setting_description": "Manage notifications", "notifications_setting_description": "Manage notifications",
"oauth": "OAuth", "oauth": "OAuth",
@ -833,7 +835,7 @@
"stop_photo_sharing_description": "{partner} will no longer be able to access your photos.", "stop_photo_sharing_description": "{partner} will no longer be able to access your photos.",
"stop_sharing_photos_with_user": "Stop sharing your photos with this user", "stop_sharing_photos_with_user": "Stop sharing your photos with this user",
"storage": "Storage", "storage": "Storage",
"storage_label": "Storage Label", "storage_label": "Storage label",
"storage_usage": "{used} of {available} used", "storage_usage": "{used} of {available} used",
"submit": "Submit", "submit": "Submit",
"suggestions": "Suggestions", "suggestions": "Suggestions",