Skip to content

Commit bfa208f

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents f554886 + ae96a01 commit bfa208f

5 files changed

Lines changed: 119 additions & 23 deletions

File tree

frontend/scripts/check-hardcoded-i18n.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
77
// This list is an incremental ratchet: once a user-facing screen has been
88
// migrated, literal English UI copy must not return to it.
99
const guardedFiles = [
10+
'src/lib/dialogs/PomodoroSettingsModal.svelte',
1011
'src/lib/layout/DashboardCustomizationSidebar.svelte',
1112
'src/lib/pages/Homepage.svelte',
1213
'src/lib/features/workflows/WorkflowBuilder.svelte',

frontend/src/lib/dialogs/PomodoroSettingsModal.svelte

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
let form = $state({ ...defaultForm });
4040
4141
const projectOptions = $derived([
42-
{ value: '', label: 'Select a project...' },
42+
{ value: '', label: t('time.pomodoro.selectProject') },
4343
...projects
4444
.filter((project) => project.status === 'Active')
4545
.map((project) => ({
@@ -111,7 +111,7 @@
111111
loaded = true;
112112
} catch (err) {
113113
console.warn('[pomodoro-settings] failed to load settings:', err);
114-
error = `Failed to load settings: ${err?.message || err}`;
114+
error = t('time.pomodoro.loadError', { error: err?.message || err });
115115
} finally {
116116
loading = false;
117117
}
@@ -135,10 +135,10 @@
135135
try {
136136
const call = await getInvoke();
137137
await call('save_pomodoro_settings', { settings: toSettings(form) });
138-
status = 'Settings saved';
138+
status = t('time.pomodoro.settingsSaved');
139139
} catch (err) {
140140
console.warn('[pomodoro-settings] failed to save settings:', err);
141-
error = `Failed to save settings: ${err?.message || err}`;
141+
error = t('time.pomodoro.saveError', { error: err?.message || err });
142142
} finally {
143143
saving = false;
144144
}
@@ -171,34 +171,34 @@
171171
>
172172
<div class="flex items-center justify-between border-b px-6 py-4" style="border-color: var(--ds-border);">
173173
<div>
174-
<h2 id="pomodoro-settings-title" class="text-lg font-semibold">Pomodoro Settings</h2>
175-
<p class="mt-1 text-sm" style="color: var(--ds-text-subtle);">Configure desktop timer behavior and automatic time logging.</p>
174+
<h2 id="pomodoro-settings-title" class="text-lg font-semibold">{t('time.pomodoro.title')}</h2>
175+
<p class="mt-1 text-sm" style="color: var(--ds-text-subtle);">{t('time.pomodoro.subtitle')}</p>
176176
</div>
177177
<Button variant="ghost" icon={X} onclick={close} title={t('common.close')} />
178178
</div>
179179
180180
<div class="px-6 py-5">
181181
{#if loading}
182-
<p class="text-sm" style="color: var(--ds-text-subtle);">Loading settings...</p>
182+
<p class="text-sm" style="color: var(--ds-text-subtle);">{t('time.pomodoro.loadingSettings')}</p>
183183
{:else}
184184
<div class="grid gap-6 md:grid-cols-3">
185185
<section class="md:col-span-2">
186186
<div class="mb-3 flex items-center gap-2">
187187
<Clock class="h-5 w-5" style="color: var(--ds-icon);" />
188-
<h3 class="text-sm font-semibold uppercase tracking-wide" style="color: var(--ds-text-subtle);">Timer</h3>
188+
<h3 class="text-sm font-semibold uppercase tracking-wide" style="color: var(--ds-text-subtle);">{t('time.pomodoro.timer')}</h3>
189189
</div>
190190
191191
<div class="grid gap-x-4 md:grid-cols-2">
192-
<FormField label="Work duration" helper="Minutes per focus session">
192+
<FormField label={t('time.pomodoro.workDuration')} helper={t('time.pomodoro.workDurationHelper')}>
193193
<Input type="number" min="1" step="1" bind:value={form.work_duration_minutes} />
194194
</FormField>
195-
<FormField label="Short break" helper="Minutes between work sessions">
195+
<FormField label={t('time.pomodoro.shortBreak')} helper={t('time.pomodoro.shortBreakHelper')}>
196196
<Input type="number" min="1" step="1" bind:value={form.short_break_minutes} />
197197
</FormField>
198-
<FormField label="Long break" helper="Minutes after a completed cycle">
198+
<FormField label={t('time.pomodoro.longBreak')} helper={t('time.pomodoro.longBreakHelper')}>
199199
<Input type="number" min="1" step="1" bind:value={form.long_break_minutes} />
200200
</FormField>
201-
<FormField label="Sessions before long break" helper="Completed work sessions">
201+
<FormField label={t('time.pomodoro.sessionsBeforeLongBreak')} helper={t('time.pomodoro.sessionsBeforeLongBreakHelper')}>
202202
<Input type="number" min="1" step="1" bind:value={form.cycles_before_long_break} />
203203
</FormField>
204204
</div>
@@ -207,35 +207,35 @@
207207
<section>
208208
<div class="mb-3 flex items-center gap-2">
209209
<Play class="h-5 w-5" style="color: var(--ds-icon);" />
210-
<h3 class="text-sm font-semibold uppercase tracking-wide" style="color: var(--ds-text-subtle);">Behavior</h3>
210+
<h3 class="text-sm font-semibold uppercase tracking-wide" style="color: var(--ds-text-subtle);">{t('time.pomodoro.behavior')}</h3>
211211
</div>
212212
<div class="space-y-4 rounded border p-4" style="border-color: var(--ds-border); background-color: var(--ds-surface);">
213-
<Toggle bind:checked={form.auto_start_break} label="Auto-start breaks" />
214-
<Toggle bind:checked={form.auto_start_work} label="Auto-start work" />
213+
<Toggle bind:checked={form.auto_start_break} label={t('time.pomodoro.autoStartBreaks')} />
214+
<Toggle bind:checked={form.auto_start_work} label={t('time.pomodoro.autoStartWork')} />
215215
</div>
216216
</section>
217217
</div>
218218
219219
<section class="mt-6">
220220
<div class="mb-3 flex items-center gap-2">
221221
<FileText class="h-5 w-5" style="color: var(--ds-icon);" />
222-
<h3 class="text-sm font-semibold uppercase tracking-wide" style="color: var(--ds-text-subtle);">Logging</h3>
222+
<h3 class="text-sm font-semibold uppercase tracking-wide" style="color: var(--ds-text-subtle);">{t('time.pomodoro.logging')}</h3>
223223
</div>
224224
225225
<div class="rounded border p-4" style="border-color: var(--ds-border); background-color: var(--ds-surface);">
226-
<Toggle bind:checked={form.auto_log_enabled} label="Automatically log completed work sessions" />
226+
<Toggle bind:checked={form.auto_log_enabled} label={t('time.pomodoro.autoLogCompletedSessions')} />
227227
228228
{#if form.auto_log_enabled}
229229
<div class="mt-4 grid gap-x-4 md:grid-cols-2">
230-
<FormField label="Project" helper="Active time projects from this workspace server">
230+
<FormField label={t('time.pomodoro.project')} helper={t('time.pomodoro.projectHelper')}>
231231
<Select
232232
bind:value={form.log_project_id}
233233
options={projectOptions}
234-
placeholder={projectsLoaded ? 'Select a project...' : 'Loading projects...'}
234+
placeholder={projectsLoaded ? t('time.pomodoro.selectProject') : t('time.pomodoro.loadingProjects')}
235235
/>
236236
</FormField>
237-
<FormField label="Description" helper="Used for new worklog entries">
238-
<Input bind:value={form.log_description} placeholder="Pomodoro session" />
237+
<FormField label={t('time.pomodoro.description')} helper={t('time.pomodoro.descriptionHelper')}>
238+
<Input bind:value={form.log_description} placeholder={t('time.pomodoro.sessionPlaceholder')} />
239239
</FormField>
240240
</div>
241241
{/if}
@@ -255,8 +255,8 @@
255255
</div>
256256
257257
<div class="flex justify-end gap-3 border-t px-6 py-4" style="border-color: var(--ds-border);">
258-
<Button variant="default" size="small" onclick={close}>Cancel</Button>
259-
<Button variant="primary" size="small" onclick={save} loading={saving} disabled={loading}>Save Settings</Button>
258+
<Button variant="default" size="small" onclick={close}>{t('time.pomodoro.cancel')}</Button>
259+
<Button variant="primary" size="small" onclick={save} loading={saving} disabled={loading}>{t('time.pomodoro.saveSettings')}</Button>
260260
</div>
261261
</div>
262262
</ModalBackdrop>

frontend/src/lib/locales/de/time.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,37 @@ export default {
2929
end: 'Ende',
3030
duration: 'Dauer',
3131
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)',
32+
pomodoro: {
33+
title: 'Pomodoro-Einstellungen',
34+
subtitle: 'Konfigurieren Sie das Verhalten des Desktop-Timers und die automatische Zeiterfassung.',
35+
loadingSettings: 'Einstellungen werden geladen...',
36+
loadError: 'Einstellungen konnten nicht geladen werden: {error}',
37+
settingsSaved: 'Einstellungen gespeichert',
38+
saveError: 'Einstellungen konnten nicht gespeichert werden: {error}',
39+
timer: 'Timer',
40+
workDuration: 'Arbeitsdauer',
41+
workDurationHelper: 'Minuten pro Fokus-Sitzung',
42+
shortBreak: 'Kurze Pause',
43+
shortBreakHelper: 'Minuten zwischen Arbeitssitzungen',
44+
longBreak: 'Lange Pause',
45+
longBreakHelper: 'Minuten nach einem abgeschlossenen Zyklus',
46+
sessionsBeforeLongBreak: 'Sitzungen bis zur langen Pause',
47+
sessionsBeforeLongBreakHelper: 'Abgeschlossene Arbeitssitzungen',
48+
behavior: 'Verhalten',
49+
autoStartBreaks: 'Pausen automatisch starten',
50+
autoStartWork: 'Arbeit automatisch starten',
51+
logging: 'Zeiterfassung',
52+
autoLogCompletedSessions: 'Abgeschlossene Arbeitssitzungen automatisch erfassen',
53+
project: 'Projekt',
54+
projectHelper: 'Aktive Zeiterfassungsprojekte auf diesem Server',
55+
selectProject: 'Projekt auswählen...',
56+
loadingProjects: 'Projekte werden geladen...',
57+
description: 'Beschreibung',
58+
descriptionHelper: 'Wird für neue Zeiteinträge verwendet',
59+
sessionPlaceholder: 'Pomodoro-Sitzung',
60+
cancel: 'Abbrechen',
61+
saveSettings: 'Einstellungen speichern',
62+
},
3263
onboarding: {
3364
title: 'Zeiterfassung einrichten',
3465
subtitle: 'Lassen Sie uns Ihre erste Kundenorganisation und Ihr erstes Projekt erstellen',

frontend/src/lib/locales/en/time.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,38 @@ export default {
3232
durationHelperText:
3333
'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)',
3434

35+
pomodoro: {
36+
title: 'Pomodoro Settings',
37+
subtitle: 'Configure desktop timer behavior and automatic time logging.',
38+
loadingSettings: 'Loading settings...',
39+
loadError: 'Failed to load settings: {error}',
40+
settingsSaved: 'Settings saved',
41+
saveError: 'Failed to save settings: {error}',
42+
timer: 'Timer',
43+
workDuration: 'Work duration',
44+
workDurationHelper: 'Minutes per focus session',
45+
shortBreak: 'Short break',
46+
shortBreakHelper: 'Minutes between work sessions',
47+
longBreak: 'Long break',
48+
longBreakHelper: 'Minutes after a completed cycle',
49+
sessionsBeforeLongBreak: 'Sessions before long break',
50+
sessionsBeforeLongBreakHelper: 'Completed work sessions',
51+
behavior: 'Behavior',
52+
autoStartBreaks: 'Auto-start breaks',
53+
autoStartWork: 'Auto-start work',
54+
logging: 'Logging',
55+
autoLogCompletedSessions: 'Automatically log completed work sessions',
56+
project: 'Project',
57+
projectHelper: 'Active time projects from this workspace server',
58+
selectProject: 'Select a project...',
59+
loadingProjects: 'Loading projects...',
60+
description: 'Description',
61+
descriptionHelper: 'Used for new worklog entries',
62+
sessionPlaceholder: 'Pomodoro session',
63+
cancel: 'Cancel',
64+
saveSettings: 'Save Settings',
65+
},
66+
3567
// Timesheet
3668
timesheet: {
3769
title: 'Timesheet',

frontend/src/lib/locales/ru/time.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,38 @@ export default {
3131
durationHelperText:
3232
'Введите время начала и продолжительность (2h), чтобы рассчитать время окончания, или время начала и окончания, чтобы рассчитать продолжительность. Форматы: 1h, 30m, 1h30m, 2h15m, 1d (=8h)',
3333

34+
pomodoro: {
35+
title: 'Настройки Pomodoro',
36+
subtitle: 'Настройте поведение таймера в настольном приложении и автоматический учёт времени.',
37+
loadingSettings: 'Загрузка настроек…',
38+
loadError: 'Не удалось загрузить настройки: {error}',
39+
settingsSaved: 'Настройки сохранены',
40+
saveError: 'Не удалось сохранить настройки: {error}',
41+
timer: 'Таймер',
42+
workDuration: 'Длительность работы',
43+
workDurationHelper: 'Минут на один сеанс концентрации',
44+
shortBreak: 'Короткий перерыв',
45+
shortBreakHelper: 'Минут между рабочими сеансами',
46+
longBreak: 'Длинный перерыв',
47+
longBreakHelper: 'Минут после завершённого цикла',
48+
sessionsBeforeLongBreak: 'Сеансов до длинного перерыва',
49+
sessionsBeforeLongBreakHelper: 'Завершённые рабочие сеансы',
50+
behavior: 'Поведение',
51+
autoStartBreaks: 'Автоматически запускать перерывы',
52+
autoStartWork: 'Автоматически запускать работу',
53+
logging: 'Учёт времени',
54+
autoLogCompletedSessions: 'Автоматически записывать завершённые рабочие сеансы',
55+
project: 'Проект',
56+
projectHelper: 'Активные проекты учёта времени на сервере этого рабочего пространства',
57+
selectProject: 'Выберите проект…',
58+
loadingProjects: 'Загрузка проектов…',
59+
description: 'Описание',
60+
descriptionHelper: 'Используется для новых записей времени',
61+
sessionPlaceholder: 'Сеанс Pomodoro',
62+
cancel: 'Отмена',
63+
saveSettings: 'Сохранить настройки',
64+
},
65+
3466
timesheet: {
3567
title: 'Табель',
3668
subtitle: 'Обзор табеля за неделю',

0 commit comments

Comments
 (0)