From 7c3bde4ee0b6b78cbf4f7c1df81bdf9b3348d1cb Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Mon, 14 Sep 2026 16:44:40 +0200 Subject: [PATCH] Translate the four keys that render as their own name A sweep of every t("...") in the frontend against the locale files found five keys with no translation. Two of the seven matches were i18next plural forms and one was a JSDoc example; four were real. The visible one is the Settings > General language heading. It renders as the literal lower-case string "language", in all four languages, and its guard could not have helped: {t("language") || "Language"} i18next returns the key when it cannot find a translation, and "language" is truthy, so the fallback never ran. The same shape sits two hundred lines up on t("tray"), where it is harmless only because that key happens to exist. Both are gone now that the keys are there. clocks:capture reached an iconOnly button, where the Button component passes children through as aria-label. Nothing looked wrong; a screen reader simply said "capture". customers:editContract and projects:taskLabel used i18next's defaultValue argument, which does work, so they read correctly in English and were untranslated in the other three. The JSDoc example in ToggleField pointed at externalEditorEnableHint, which does not exist; the real key is externalEditorHelp. All four keys added in en, de, es and ru. Parity holds, and no t() in the source is now unresolved apart from the plural forms, which is what they should be. --- frontend/src/components/common/ToggleField.tsx | 2 +- frontend/src/components/settings/GeneralTab.tsx | 4 ++-- frontend/src/locales/de/clocks.json | 3 ++- frontend/src/locales/de/customers.json | 3 ++- frontend/src/locales/de/projects.json | 3 ++- frontend/src/locales/de/settings.json | 3 ++- frontend/src/locales/en/clocks.json | 3 ++- frontend/src/locales/en/customers.json | 3 ++- frontend/src/locales/en/projects.json | 3 ++- frontend/src/locales/en/settings.json | 3 ++- frontend/src/locales/es/clocks.json | 3 ++- frontend/src/locales/es/customers.json | 3 ++- frontend/src/locales/es/projects.json | 3 ++- frontend/src/locales/es/settings.json | 3 ++- frontend/src/locales/ru/clocks.json | 3 ++- frontend/src/locales/ru/customers.json | 3 ++- frontend/src/locales/ru/projects.json | 3 ++- frontend/src/locales/ru/settings.json | 3 ++- 18 files changed, 35 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/common/ToggleField.tsx b/frontend/src/components/common/ToggleField.tsx index a2dd8fbe..2617cafd 100644 --- a/frontend/src/components/common/ToggleField.tsx +++ b/frontend/src/components/common/ToggleField.tsx @@ -24,7 +24,7 @@ interface Props { * checked={enabled} * onChange={setEnabled} * label={t("externalEditorEnable")} - * description={t("externalEditorEnableHint")} + * description={t("externalEditorHelp")} * /> */ export function ToggleField({ diff --git a/frontend/src/components/settings/GeneralTab.tsx b/frontend/src/components/settings/GeneralTab.tsx index cb2de4e5..19af1099 100644 --- a/frontend/src/components/settings/GeneralTab.tsx +++ b/frontend/src/components/settings/GeneralTab.tsx @@ -762,7 +762,7 @@ function TraySection() { + "tracking-wider text-fg-muted mb-3" } > - {t("tray") || "System Tray"} + {t("tray")}