chore(web): more translations for user settings and admin pages (#10161)

* chore(web): more translations for user settings and admin pages

* JobSettings translations

* feedback

* missed one

* feedback
This commit is contained in:
Michel Heusschen 2024-06-12 12:54:40 +02:00 committed by GitHub
parent 0e1311e3d3
commit 9e5c52b7b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 300 additions and 160 deletions

View file

@ -76,13 +76,10 @@
</div>
{#if forceDelete}
<p class="text-immich-error">
WARNING: This will immediately remove the user and all assets. This cannot be undone and the files cannot be
recovered.
</p>
<p class="text-immich-error">{$t('admin.force_delete_user_warning')}</p>
<p class="immich-form-label text-sm" id="confirm-user-desc">
To confirm, type "{user.email}" below
{$t('admin.confirm_email_below', { values: { email: user.email } })}
</p>
<input

View file

@ -58,7 +58,7 @@
<Badge color="primary">
<div class="flex flex-row gap-1">
<span class="text-sm">
{jobCounts.failed.toLocaleString($locale)} failed
{$t('admin.jobs_failed', { values: { jobCount: jobCounts.failed.toLocaleString($locale) } })}
</span>
<CircleIconButton
color="primary"
@ -74,7 +74,7 @@
{#if jobCounts.delayed > 0}
<Badge color="secondary">
<span class="text-sm">
{jobCounts.delayed.toLocaleString($locale)} delayed
{$t('admin.jobs_delayed', { values: { jobCount: jobCounts.delayed.toLocaleString($locale) } })}
</span>
</Badge>
{/if}
@ -119,12 +119,14 @@
color="light-gray"
on:click={() => dispatch('command', { command: JobCommand.Start, force: false })}
>
<Icon path={mdiAlertCircle} size="36" /> DISABLED
<Icon path={mdiAlertCircle} size="36" />
{$t('disabled').toUpperCase()}
</JobTileButton>
{:else if !isIdle}
{#if waitingCount > 0}
<JobTileButton color="gray" on:click={() => dispatch('command', { command: JobCommand.Empty, force: false })}>
<Icon path={mdiClose} size="24" /> CLEAR
<Icon path={mdiClose} size="24" />
{$t('clear').toUpperCase()}
</JobTileButton>
{/if}
{#if queueStatus.isPaused}
@ -134,14 +136,16 @@
on:click={() => dispatch('command', { command: JobCommand.Resume, force: false })}
>
<!-- size property is not reactive, so have to use width and height -->
<Icon path={mdiFastForward} {size} /> RESUME
<Icon path={mdiFastForward} {size} />
{$t('resume').toUpperCase()}
</JobTileButton>
{:else}
<JobTileButton
color="light-gray"
on:click={() => dispatch('command', { command: JobCommand.Pause, force: false })}
>
<Icon path={mdiPause} size="24" /> PAUSE
<Icon path={mdiPause} size="24" />
{$t('pause').toUpperCase()}
</JobTileButton>
{/if}
{:else if allowForceCommand}
@ -161,7 +165,8 @@
color="light-gray"
on:click={() => dispatch('command', { command: JobCommand.Start, force: false })}
>
<Icon path={mdiPlay} size="48" /> START
<Icon path={mdiPlay} size="48" />
{$t('start').toUpperCase()}
</JobTileButton>
{/if}
</div>

View file

@ -43,7 +43,7 @@
if (dto.force) {
const isConfirmed = await dialogController.show({
id: 'confirm-reprocess-all-faces',
prompt: 'Are you sure you want to reprocess all faces? This will also clear named people.',
prompt: $t('admin.confirm_reprocess_all_faces'),
});
if (isConfirmed) {
@ -60,23 +60,23 @@
$: jobDetails = <Partial<Record<JobName, JobDetails>>>{
[JobName.ThumbnailGeneration]: {
icon: mdiFileJpgBox,
title: getJobName(JobName.ThumbnailGeneration),
title: $getJobName(JobName.ThumbnailGeneration),
subtitle: $t('admin.thumbnail_generation_job_description'),
},
[JobName.MetadataExtraction]: {
icon: mdiTable,
title: getJobName(JobName.MetadataExtraction),
title: $getJobName(JobName.MetadataExtraction),
subtitle: $t('admin.metadata_extraction_job_description'),
},
[JobName.Library]: {
icon: mdiLibraryShelves,
title: getJobName(JobName.Library),
title: $getJobName(JobName.Library),
subtitle: $t('admin.library_tasks_description'),
allText: $t('all').toUpperCase(),
missingText: $t('refresh').toUpperCase(),
},
[JobName.Sidecar]: {
title: getJobName(JobName.Sidecar),
title: $getJobName(JobName.Sidecar),
icon: mdiFileXmlBox,
subtitle: $t('admin.sidecar_job_description'),
allText: $t('sync').toUpperCase(),
@ -85,46 +85,44 @@
},
[JobName.SmartSearch]: {
icon: mdiImageSearch,
title: getJobName(JobName.SmartSearch),
title: $getJobName(JobName.SmartSearch),
subtitle: $t('admin.smart_search_job_description'),
disabled: !$featureFlags.smartSearch,
},
[JobName.DuplicateDetection]: {
icon: mdiContentDuplicate,
title: getJobName(JobName.DuplicateDetection),
title: $getJobName(JobName.DuplicateDetection),
subtitle: $t('admin.duplicate_detection_job_description'),
disabled: !$featureFlags.duplicateDetection,
},
[JobName.FaceDetection]: {
icon: mdiFaceRecognition,
title: getJobName(JobName.FaceDetection),
subtitle:
'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.',
title: $getJobName(JobName.FaceDetection),
subtitle: $t('admin.face_detection_description'),
handleCommand: handleConfirmCommand,
disabled: !$featureFlags.facialRecognition,
},
[JobName.FacialRecognition]: {
icon: mdiTagFaces,
title: getJobName(JobName.FacialRecognition),
subtitle:
'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.',
title: $getJobName(JobName.FacialRecognition),
subtitle: $t('admin.facial_recognition_job_description'),
handleCommand: handleConfirmCommand,
disabled: !$featureFlags.facialRecognition,
},
[JobName.VideoConversion]: {
icon: mdiVideo,
title: getJobName(JobName.VideoConversion),
title: $getJobName(JobName.VideoConversion),
subtitle: $t('admin.video_conversion_job_description'),
},
[JobName.StorageTemplateMigration]: {
icon: mdiFolderMove,
title: getJobName(JobName.StorageTemplateMigration),
title: $getJobName(JobName.StorageTemplateMigration),
allowForceCommand: false,
description: StorageMigrationDescription,
},
[JobName.Migration]: {
icon: mdiFolderMove,
title: getJobName(JobName.Migration),
title: $getJobName(JobName.Migration),
subtitle: $t('admin.migration_job_description'),
allowForceCommand: false,
},
@ -140,14 +138,14 @@
switch (jobCommand.command) {
case JobCommand.Empty: {
notificationController.show({
message: `Cleared jobs for: ${title}`,
message: $t('admin.cleared_jobs', { values: { job: title } }),
type: NotificationType.Info,
});
break;
}
}
} catch (error) {
handleError(error, `Command '${jobCommand.command}' failed for job: ${title}`);
handleError(error, $t('admin.failed_job_command', { values: { command: jobCommand.command, job: title } }));
}
}
</script>

View file

@ -110,7 +110,7 @@
{#if user.quotaSizeInBytes}
({((user.usage / user.quotaSizeInBytes) * 100).toFixed(0)}%)
{:else}
(Unlimited)
({$t('unlimited')})
{/if}
</span>
</td>

View file

@ -53,7 +53,7 @@
}
notificationController.show({
message: 'Reset settings to the recent saved settings',
message: $t('admin.reset_settings_to_recent_saved'),
type: NotificationType.Info,
});
};
@ -64,7 +64,7 @@
}
notificationController.show({
message: $t('reset_settings_to_default'),
message: $t('admin.reset_settings_to_default'),
type: NotificationType.Info,
});
};

View file

@ -270,7 +270,7 @@
},
{
value: TranscodeHWAccel.Disabled,
text: $t('admin.disabled'),
text: $t('disabled'),
},
]}
isEdited={config.ffmpeg.accel !== savedConfig.ffmpeg.accel}

View file

@ -9,6 +9,7 @@
import SettingInputField, {
SettingInputFieldType,
} from '$lib/components/shared-components/settings/setting-input-field.svelte';
import { t } from 'svelte-i18n';
export let savedConfig: SystemConfigDto;
export let defaultConfig: SystemConfigDto;
@ -45,7 +46,7 @@
<SettingInputField
inputType={SettingInputFieldType.NUMBER}
{disabled}
label="{getJobName(jobName)} Concurrency"
label={$t('admin.job_concurrency', { values: { job: $getJobName(jobName) } })}
desc=""
bind:value={config.job[jobName].concurrency}
required={true}
@ -54,11 +55,11 @@
{:else}
<SettingInputField
inputType={SettingInputFieldType.NUMBER}
label="{getJobName(jobName)} Concurrency"
label={$t('admin.job_concurrency', { values: { job: $getJobName(jobName) } })}
desc=""
value="1"
disabled={true}
title="This job is not concurrency-safe."
title={$t('admin.job_not_concurrency_safe')}
/>
{/if}
</div>