diff --git a/frontend/scripts/check-hardcoded-i18n.js b/frontend/scripts/check-hardcoded-i18n.js index 02a8077b..6891cb35 100644 --- a/frontend/scripts/check-hardcoded-i18n.js +++ b/frontend/scripts/check-hardcoded-i18n.js @@ -7,6 +7,7 @@ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); // This list is an incremental ratchet: once a user-facing screen has been // migrated, literal English UI copy must not return to it. const guardedFiles = [ + 'src/lib/dialogs/PomodoroSettingsModal.svelte', 'src/lib/layout/DashboardCustomizationSidebar.svelte', 'src/lib/pages/Homepage.svelte', 'src/lib/features/workflows/WorkflowBuilder.svelte', diff --git a/frontend/src/lib/dialogs/PomodoroSettingsModal.svelte b/frontend/src/lib/dialogs/PomodoroSettingsModal.svelte index a1f532b3..1d956f1f 100644 --- a/frontend/src/lib/dialogs/PomodoroSettingsModal.svelte +++ b/frontend/src/lib/dialogs/PomodoroSettingsModal.svelte @@ -39,7 +39,7 @@ let form = $state({ ...defaultForm }); const projectOptions = $derived([ - { value: '', label: 'Select a project...' }, + { value: '', label: t('time.pomodoro.selectProject') }, ...projects .filter((project) => project.status === 'Active') .map((project) => ({ @@ -111,7 +111,7 @@ loaded = true; } catch (err) { console.warn('[pomodoro-settings] failed to load settings:', err); - error = `Failed to load settings: ${err?.message || err}`; + error = t('time.pomodoro.loadError', { error: err?.message || err }); } finally { loading = false; } @@ -135,10 +135,10 @@ try { const call = await getInvoke(); await call('save_pomodoro_settings', { settings: toSettings(form) }); - status = 'Settings saved'; + status = t('time.pomodoro.settingsSaved'); } catch (err) { console.warn('[pomodoro-settings] failed to save settings:', err); - error = `Failed to save settings: ${err?.message || err}`; + error = t('time.pomodoro.saveError', { error: err?.message || err }); } finally { saving = false; } @@ -171,34 +171,34 @@ >
-

Pomodoro Settings

-

Configure desktop timer behavior and automatic time logging.

+

{t('time.pomodoro.title')}

+

{t('time.pomodoro.subtitle')}

{#if loading} -

Loading settings...

+

{t('time.pomodoro.loadingSettings')}

{:else}
-

Timer

+

{t('time.pomodoro.timer')}

- + - + - + - +
@@ -207,11 +207,11 @@
-

Behavior

+

{t('time.pomodoro.behavior')}

- - + +
@@ -219,23 +219,23 @@
-

Logging

+

{t('time.pomodoro.logging')}

- + {#if form.auto_log_enabled}
- + + +
{/if} @@ -255,8 +255,8 @@
- - + +
diff --git a/frontend/src/lib/locales/de/time.js b/frontend/src/lib/locales/de/time.js index 4ce9f9d8..6206a391 100644 --- a/frontend/src/lib/locales/de/time.js +++ b/frontend/src/lib/locales/de/time.js @@ -29,6 +29,37 @@ export default { end: 'Ende', duration: 'Dauer', durationHelperText: 'Geben Sie Startzeit + Dauer (2h) ein, um die Endzeit automatisch zu berechnen, oder geben Sie Start + Ende ein, um die Dauer automatisch zu berechnen. Zeitformate: 1h, 30m, 1h30m, 2h15m, 1d (=8h)', + pomodoro: { + title: 'Pomodoro-Einstellungen', + subtitle: 'Konfigurieren Sie das Verhalten des Desktop-Timers und die automatische Zeiterfassung.', + loadingSettings: 'Einstellungen werden geladen...', + loadError: 'Einstellungen konnten nicht geladen werden: {error}', + settingsSaved: 'Einstellungen gespeichert', + saveError: 'Einstellungen konnten nicht gespeichert werden: {error}', + timer: 'Timer', + workDuration: 'Arbeitsdauer', + workDurationHelper: 'Minuten pro Fokus-Sitzung', + shortBreak: 'Kurze Pause', + shortBreakHelper: 'Minuten zwischen Arbeitssitzungen', + longBreak: 'Lange Pause', + longBreakHelper: 'Minuten nach einem abgeschlossenen Zyklus', + sessionsBeforeLongBreak: 'Sitzungen bis zur langen Pause', + sessionsBeforeLongBreakHelper: 'Abgeschlossene Arbeitssitzungen', + behavior: 'Verhalten', + autoStartBreaks: 'Pausen automatisch starten', + autoStartWork: 'Arbeit automatisch starten', + logging: 'Zeiterfassung', + autoLogCompletedSessions: 'Abgeschlossene Arbeitssitzungen automatisch erfassen', + project: 'Projekt', + projectHelper: 'Aktive Zeiterfassungsprojekte auf diesem Server', + selectProject: 'Projekt auswählen...', + loadingProjects: 'Projekte werden geladen...', + description: 'Beschreibung', + descriptionHelper: 'Wird für neue Zeiteinträge verwendet', + sessionPlaceholder: 'Pomodoro-Sitzung', + cancel: 'Abbrechen', + saveSettings: 'Einstellungen speichern', + }, onboarding: { title: 'Zeiterfassung einrichten', subtitle: 'Lassen Sie uns Ihre erste Kundenorganisation und Ihr erstes Projekt erstellen', diff --git a/frontend/src/lib/locales/en/time.js b/frontend/src/lib/locales/en/time.js index d7d50e68..c00837d9 100644 --- a/frontend/src/lib/locales/en/time.js +++ b/frontend/src/lib/locales/en/time.js @@ -32,6 +32,38 @@ export default { durationHelperText: 'Enter start time + duration (2h) to auto-calculate end time, or enter start + end times to auto-calculate duration. Time formats: 1h, 30m, 1h30m, 2h15m, 1d (=8h)', + pomodoro: { + title: 'Pomodoro Settings', + subtitle: 'Configure desktop timer behavior and automatic time logging.', + loadingSettings: 'Loading settings...', + loadError: 'Failed to load settings: {error}', + settingsSaved: 'Settings saved', + saveError: 'Failed to save settings: {error}', + timer: 'Timer', + workDuration: 'Work duration', + workDurationHelper: 'Minutes per focus session', + shortBreak: 'Short break', + shortBreakHelper: 'Minutes between work sessions', + longBreak: 'Long break', + longBreakHelper: 'Minutes after a completed cycle', + sessionsBeforeLongBreak: 'Sessions before long break', + sessionsBeforeLongBreakHelper: 'Completed work sessions', + behavior: 'Behavior', + autoStartBreaks: 'Auto-start breaks', + autoStartWork: 'Auto-start work', + logging: 'Logging', + autoLogCompletedSessions: 'Automatically log completed work sessions', + project: 'Project', + projectHelper: 'Active time projects from this workspace server', + selectProject: 'Select a project...', + loadingProjects: 'Loading projects...', + description: 'Description', + descriptionHelper: 'Used for new worklog entries', + sessionPlaceholder: 'Pomodoro session', + cancel: 'Cancel', + saveSettings: 'Save Settings', + }, + // Timesheet timesheet: { title: 'Timesheet', diff --git a/frontend/src/lib/locales/ru/time.js b/frontend/src/lib/locales/ru/time.js index 3b212ce4..bc45e927 100644 --- a/frontend/src/lib/locales/ru/time.js +++ b/frontend/src/lib/locales/ru/time.js @@ -31,6 +31,38 @@ export default { durationHelperText: 'Введите время начала и продолжительность (2h), чтобы рассчитать время окончания, или время начала и окончания, чтобы рассчитать продолжительность. Форматы: 1h, 30m, 1h30m, 2h15m, 1d (=8h)', + pomodoro: { + title: 'Настройки Pomodoro', + subtitle: 'Настройте поведение таймера в настольном приложении и автоматический учёт времени.', + loadingSettings: 'Загрузка настроек…', + loadError: 'Не удалось загрузить настройки: {error}', + settingsSaved: 'Настройки сохранены', + saveError: 'Не удалось сохранить настройки: {error}', + timer: 'Таймер', + workDuration: 'Длительность работы', + workDurationHelper: 'Минут на один сеанс концентрации', + shortBreak: 'Короткий перерыв', + shortBreakHelper: 'Минут между рабочими сеансами', + longBreak: 'Длинный перерыв', + longBreakHelper: 'Минут после завершённого цикла', + sessionsBeforeLongBreak: 'Сеансов до длинного перерыва', + sessionsBeforeLongBreakHelper: 'Завершённые рабочие сеансы', + behavior: 'Поведение', + autoStartBreaks: 'Автоматически запускать перерывы', + autoStartWork: 'Автоматически запускать работу', + logging: 'Учёт времени', + autoLogCompletedSessions: 'Автоматически записывать завершённые рабочие сеансы', + project: 'Проект', + projectHelper: 'Активные проекты учёта времени на сервере этого рабочего пространства', + selectProject: 'Выберите проект…', + loadingProjects: 'Загрузка проектов…', + description: 'Описание', + descriptionHelper: 'Используется для новых записей времени', + sessionPlaceholder: 'Сеанс Pomodoro', + cancel: 'Отмена', + saveSettings: 'Сохранить настройки', + }, + timesheet: { title: 'Табель', subtitle: 'Обзор табеля за неделю',