From f428b14ce99ce5906ae86efad9d44bfb4c88c129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Wed, 21 Oct 2026 22:01:50 +0200 Subject: [PATCH] fix(i18n): future tense for the Topics preview, settled German wording MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Topics preview describes what it will add, the workout-route detail says off for new accounts, and German reads 'Zurück zu den Modulen', 'Unter Module ändern', 'Unter Anordnung öffnen' and 'Erfassung' for the Tracking group. Strings that name the Insights area call it Insights; generic uses of Auswertung stay. --- messages/de.json | 22 ++++++------- messages/en.json | 4 +-- messages/es.json | 4 +-- messages/fr.json | 4 +-- messages/it.json | 4 +-- messages/ko.json | 4 +-- messages/nl.json | 4 +-- messages/pl.json | 4 +-- src/__tests__/settings-copy-tense.test.ts | 29 +++++++++++++++++ src/__tests__/settings-glossary-de.test.ts | 37 ++++++++++++++++++++++ 10 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 src/__tests__/settings-copy-tense.test.ts diff --git a/messages/de.json b/messages/de.json index f2372f6ae..4fe4a1817 100644 --- a/messages/de.json +++ b/messages/de.json @@ -845,7 +845,7 @@ "previousPage": "Vorherige Seite", "nextPage": "Nächste Seite", "dailyTotalCaption": "({count} Einzelwerte)", - "openMetricInsights": "{type}-Auswertung öffnen", + "openMetricInsights": "{type} in Insights öffnen", "sleepNapCaption": "inkl. {count} Nickerchen", "sleepAwakeningsCaption": "{count} Wachphasen", "expandDay": "Einzelwerte dieses Tages anzeigen", @@ -2406,7 +2406,7 @@ "create": "Hinzufügen", "limitReached": "Du hast die Grenze von 20 eigenen Kategorien erreicht.", "saveFailed": "Das wurde nicht gespeichert. Bitte versuch es noch einmal.", - "bpGateNote": "Die Blutdruck-Auswertung zählt nur Medikamente in der eingebauten Kategorie Blutdruck.", + "bpGateNote": "Die Blutdruck-Insights zählen nur Medikamente in der eingebauten Kategorie Blutdruck.", "manage": "Kategorien verwalten", "manageDescription": "Deine eigenen Kategorien, neben den eingebauten.", "hidden": "Ausgeblendet", @@ -5304,7 +5304,7 @@ "ai": "KI", "connectivity": "Konnektivität", "system": "System", - "tracking": "Tracking", + "tracking": "Erfassung", "arrangement": "Anordnung", "notifications": "Benachrichtigungen", "connections": "Verbindungen", @@ -5883,10 +5883,10 @@ "title": "Was du trackst", "description": "Deaktivierte Module verschwinden aus Navigation, Kacheln und Insights, deine Daten bleiben erhalten." }, - "manageIn": "In {section} verwalten", + "manageIn": "Unter {section} verwalten", "operatorDisabled": "Serverweit deaktiviert", "subtitle": "Lege fest, welche Tracking-Bereiche HealthLog überall anzeigt.", - "backToHub": "Zurück zu Module", + "backToHub": "Zurück zu den Modulen", "openModuleSettings": "Moduleinstellungen", "pages": { "medications": { @@ -5903,7 +5903,7 @@ }, "arrangementTitle": "Reihenfolge und Ansicht", "arrangementDescription": "Wie diese Liste sortiert und angezeigt wird, legst du unter Anordnung fest.", - "openArrangement": "In Anordnung öffnen", + "openArrangement": "Unter Anordnung öffnen", "moduleSettingsTitle": "Moduleinstellungen", "moduleSettingsDescription": "Alles außer Reihenfolge und Ansicht findest du auf der Seite des Moduls unter Module." } @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Trainingsrouten", "description": "Den GPS-Verlauf neuer Trainings aus der iPhone-App und dem Apple-Health-Export speichern.", - "detail": "Standardmäßig aus. Eine Route zeigt, wo du wohnst, arbeitest und trainierst, deshalb wird sie erst gespeichert, wenn du das einschaltest. Die Trainings selbst werden immer gespeichert, und keine KI-Funktion liest jemals eine Route. Ausschalten stoppt neue Routen; schon gespeicherte bleiben, bis du das Training löschst.", + "detail": "Für neue Konten aus. Eine Route zeigt, wo du wohnst, arbeitest und trainierst, deshalb wird sie erst gespeichert, wenn du das einschaltest. Die Trainings selbst werden immer gespeichert, und keine KI-Funktion liest jemals eine Route. Ausschalten stoppt neue Routen; schon gespeicherte bleiben, bis du das Training löschst.", "loadError": "Die Routen-Einstellung konnte nicht geladen werden." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Themen (Beta)", - "description": "Fügt einen eigenen Eintrag Themen hinzu, mit Übersichtsseiten über den einzelnen Insights-Seiten.", + "description": "Fügt einen eigenen Eintrag Themen hinzu, sobald die Übersichtsseiten über den einzelnen Insights-Seiten fertig sind.", "detail": "Deine Insights-Seiten, die Navigation und alle Links bleiben genau wie sie sind. Die Themenseiten kommen mit einem späteren Update; dieser Schalter legt fest, ob du sie siehst.", "savedOn": "Themen-Vorschau eingeschaltet.", "savedOff": "Themen-Vorschau ausgeschaltet." @@ -7551,7 +7551,7 @@ "moduleState": { "on": "An", "off": "Aus", - "change": "In Module ändern" + "change": "Unter Module ändern" }, "timezoneUseDevice": "Zeitzone dieses Geräts übernehmen ({zone})" }, @@ -7633,7 +7633,7 @@ "usageLevels": "Konten je KI-Stufe: {frugal} sparsam, {standard} Standard, {full} voll." }, "aiQuality": { - "title": "Auswertungs-Qualität", + "title": "Insights-Qualität", "loading": "Feedback-Zusammenfassung wird geladen…", "loadError": "Qualitätszusammenfassung konnte nicht geladen werden. Bitte die Seite neu laden.", "empty": "Noch kein Feedback. Der Aggregator läuft täglich um 04:00. Sobald Nutzer Empfehlungen bewerten, erscheinen hier die Hilfreich-Quoten.", @@ -12367,7 +12367,7 @@ "accessWriteDetail": "Sie kann Messwerte, Laborergebnisse, einen neuen Laborwert, einen Krankheitseintrag, eine Nebenwirkung zu einem Medikament und ein neues Medikament hinzufügen sowie eine Dosis als genommen oder ausgelassen markieren. Ändern oder löschen kann sie nichts, auch nicht das Eigene, und eine deiner Erinnerungen verschieben kann sie nicht. Das kannst nur du.", "accessManageLabel": "Darf verwalten", "accessManageCapability": "Sie kann Einträge anlegen, ändern und löschen, auch solche, die du selbst erfasst hast.", - "accessManageDetail": "Sie kann außerdem die daraus erzeugten Auswertungen lesen. Deine Anmeldung, deine Sicherheitseinstellungen, deine Verbindungen und den Zugriff anderer Personen kann sie nicht ändern. Du kannst das jederzeit beenden.", + "accessManageDetail": "Sie kann außerdem die daraus erzeugten Insights lesen. Deine Anmeldung, deine Sicherheitseinstellungen, deine Verbindungen und den Zugriff anderer Personen kann sie nicht ändern. Du kannst das jederzeit beenden.", "manageStepUpNote": "Das geht nur im Browser, und falls du einen zweiten Faktor eingerichtet hast, wird er abgefragt.", "scopeLegend": "Was die Person öffnen darf", "scopeAllLabel": "Gesamte Akte", diff --git a/messages/en.json b/messages/en.json index 2d14f363e..bfefe46ee 100644 --- a/messages/en.json +++ b/messages/en.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Workout routes", "description": "Keep the GPS track of new workouts from the iPhone app and the Apple Health export.", - "detail": "Off by default. A route shows where you live, work and train, so it is only kept once you turn this on. Workouts are kept either way, and no AI feature ever reads a route. Turning it off stops new routes; routes already kept stay until you delete the workout.", + "detail": "Off for new accounts. A route shows where you live, work and train, so it is only kept once you turn this on. Workouts are kept either way, and no AI feature ever reads a route. Turning it off stops new routes; routes already kept stay until you delete the workout.", "loadError": "The route setting could not be loaded." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Topics (beta)", - "description": "Adds a separate Topics entry with overview pages above the single-metric Insights pages.", + "description": "Will add a separate Topics entry with overview pages above the single-metric Insights pages once they are ready.", "detail": "Your Insights pages, navigation and links stay exactly as they are. The topic pages arrive in a later update; this switch decides whether you see them.", "savedOn": "Topics preview switched on.", "savedOff": "Topics preview switched off." diff --git a/messages/es.json b/messages/es.json index 1eaa503cc..949a677b4 100644 --- a/messages/es.json +++ b/messages/es.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Rutas de entrenamiento", "description": "Guardar el recorrido GPS de los entrenamientos nuevos de la app de iPhone y de la exportación de Apple Salud.", - "detail": "Desactivado por defecto. Una ruta muestra dónde vives, trabajas y entrenas, así que solo se guarda cuando lo activas. Los entrenamientos se guardan siempre y ninguna función de IA lee nunca una ruta. Al desactivarlo dejan de guardarse rutas nuevas; las ya guardadas se quedan hasta que borres el entrenamiento.", + "detail": "Desactivado en las cuentas nuevas. Una ruta muestra dónde vives, trabajas y entrenas, así que solo se guarda cuando lo activas. Los entrenamientos se guardan siempre y ninguna función de IA lee nunca una ruta. Al desactivarlo dejan de guardarse rutas nuevas; las ya guardadas se quedan hasta que borres el entrenamiento.", "loadError": "No se pudo cargar el ajuste de rutas." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Temas (beta)", - "description": "Añade una entrada aparte, Temas, con páginas de resumen por encima de las páginas de cada métrica.", + "description": "Añadirá una entrada aparte, Temas, con páginas de resumen por encima de las páginas de cada métrica cuando estén listas.", "detail": "Tus páginas de análisis, la navegación y los enlaces se quedan exactamente como están. Las páginas de temas llegan en una actualización posterior; este interruptor decide si las ves.", "savedOn": "Vista previa de Temas activada.", "savedOff": "Vista previa de Temas desactivada." diff --git a/messages/fr.json b/messages/fr.json index 4eb0009e4..0ec8901fa 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Parcours d’entraînement", "description": "Conserver le tracé GPS des nouveaux entraînements de l’app iPhone et de l’export Apple Santé.", - "detail": "Désactivé par défaut. Un parcours montre où vous habitez, travaillez et vous entraînez : il n’est donc conservé qu’une fois l’option activée. Les entraînements sont conservés dans tous les cas, et aucune fonction d’IA ne lit jamais un parcours. Désactiver l’option arrête les nouveaux parcours ; ceux déjà conservés restent jusqu’à la suppression de l’entraînement.", + "detail": "Désactivé pour les nouveaux comptes. Un parcours montre où vous habitez, travaillez et vous entraînez : il n’est donc conservé qu’une fois l’option activée. Les entraînements sont conservés dans tous les cas, et aucune fonction d’IA ne lit jamais un parcours. Désactiver l’option arrête les nouveaux parcours ; ceux déjà conservés restent jusqu’à la suppression de l’entraînement.", "loadError": "Impossible de charger le réglage des parcours." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Thèmes (bêta)", - "description": "Ajoute une entrée Thèmes distincte, avec des pages de synthèse au-dessus des pages par mesure.", + "description": "Ajoutera une entrée Thèmes distincte, avec des pages de synthèse au-dessus des pages par mesure, dès qu'elles seront prêtes.", "detail": "Vos pages d’analyse, la navigation et les liens restent exactement tels quels. Les pages de thèmes arrivent dans une mise à jour ultérieure ; cet interrupteur décide si vous les voyez.", "savedOn": "Aperçu des thèmes activé.", "savedOff": "Aperçu des thèmes désactivé." diff --git a/messages/it.json b/messages/it.json index 13d89eb9e..de5a63fa6 100644 --- a/messages/it.json +++ b/messages/it.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Percorsi degli allenamenti", "description": "Conserva il tracciato GPS dei nuovi allenamenti dall’app per iPhone e dall’esportazione di Apple Salute.", - "detail": "Disattivato di default. Un percorso mostra dove vivi, lavori e ti alleni, quindi viene conservato solo dopo averlo attivato. Gli allenamenti vengono conservati comunque e nessuna funzione IA legge mai un percorso. Disattivandolo si fermano i nuovi percorsi; quelli già conservati restano finché non elimini l’allenamento.", + "detail": "Disattivato per i nuovi account. Un percorso mostra dove vivi, lavori e ti alleni, quindi viene conservato solo dopo averlo attivato. Gli allenamenti vengono conservati comunque e nessuna funzione IA legge mai un percorso. Disattivandolo si fermano i nuovi percorsi; quelli già conservati restano finché non elimini l’allenamento.", "loadError": "Impossibile caricare l’impostazione dei percorsi." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Temi (beta)", - "description": "Aggiunge una voce Temi separata, con pagine di panoramica sopra le pagine delle singole metriche.", + "description": "Aggiungerà una voce Temi separata, con pagine di panoramica sopra le pagine delle singole metriche, appena saranno pronte.", "detail": "Le pagine delle analisi, la navigazione e i link restano esattamente come sono. Le pagine dei temi arrivano con un aggiornamento successivo; questo interruttore decide se le vedi.", "savedOn": "Anteprima dei temi attivata.", "savedOff": "Anteprima dei temi disattivata." diff --git a/messages/ko.json b/messages/ko.json index 4f02ccff3..f7a6044ca 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "운동 경로", "description": "iPhone 앱과 Apple 건강 내보내기에서 새 운동의 GPS 경로를 저장합니다.", - "detail": "기본값은 꺼짐입니다. 경로는 사는 곳, 일하는 곳, 운동하는 곳을 보여 주므로 이 설정을 켠 뒤에만 저장됩니다. 운동 기록은 항상 저장되며, 어떤 AI 기능도 경로를 읽지 않습니다. 끄면 새 경로 저장이 멈추고, 이미 저장된 경로는 운동을 삭제할 때까지 남습니다.", + "detail": "새 계정에서는 꺼져 있어요. 경로는 사는 곳, 일하는 곳, 운동하는 곳을 보여 주므로 이 설정을 켠 뒤에만 저장됩니다. 운동 기록은 항상 저장되며, 어떤 AI 기능도 경로를 읽지 않습니다. 끄면 새 경로 저장이 멈추고, 이미 저장된 경로는 운동을 삭제할 때까지 남습니다.", "loadError": "경로 설정을 불러오지 못했습니다." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "주제 (베타)", - "description": "개별 지표 페이지 위에 개요 페이지가 있는 별도의 주제 항목을 추가합니다.", + "description": "준비되면 개별 지표 페이지 위에 개요 페이지가 있는 별도의 주제 항목을 추가해요.", "detail": "인사이트 페이지, 메뉴, 링크는 지금 그대로 유지됩니다. 주제 페이지는 이후 업데이트에서 제공되며, 이 스위치로 표시 여부를 정합니다.", "savedOn": "주제 미리 보기를 켰습니다.", "savedOff": "주제 미리 보기를 껐습니다." diff --git a/messages/nl.json b/messages/nl.json index 5cf268024..962fed4d2 100644 --- a/messages/nl.json +++ b/messages/nl.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Trainingsroutes", "description": "Het GPS-spoor van nieuwe trainingen uit de iPhone-app en de Apple Gezondheid-export bewaren.", - "detail": "Standaard uit. Een route laat zien waar je woont, werkt en traint, dus hij wordt pas bewaard als je dit aanzet. Trainingen worden altijd bewaard en geen enkele AI-functie leest ooit een route. Uitzetten stopt nieuwe routes; al bewaarde routes blijven tot je de training verwijdert.", + "detail": "Uit voor nieuwe accounts. Een route laat zien waar je woont, werkt en traint, dus hij wordt pas bewaard als je dit aanzet. Trainingen worden altijd bewaard en geen enkele AI-functie leest ooit een route. Uitzetten stopt nieuwe routes; al bewaarde routes blijven tot je de training verwijdert.", "loadError": "De route-instelling kon niet worden geladen." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Onderwerpen (bèta)", - "description": "Voegt een apart item Onderwerpen toe, met overzichtspagina’s boven de pagina’s per meting.", + "description": "Voegt een apart item Onderwerpen toe, met overzichtspagina’s boven de pagina’s per meting, zodra die klaar zijn.", "detail": "Je inzichtpagina’s, navigatie en links blijven precies zoals ze zijn. De onderwerppagina’s komen met een latere update; deze schakelaar bepaalt of je ze ziet.", "savedOn": "Preview van onderwerpen ingeschakeld.", "savedOff": "Preview van onderwerpen uitgeschakeld." diff --git a/messages/pl.json b/messages/pl.json index 318f838c0..5842eae66 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -7222,7 +7222,7 @@ "workoutRoutes": { "title": "Trasy treningów", "description": "Zapisuj ślad GPS nowych treningów z aplikacji na iPhone’a i z eksportu Apple Zdrowie.", - "detail": "Domyślnie wyłączone. Trasa pokazuje, gdzie mieszkasz, pracujesz i trenujesz, więc zapisujemy ją dopiero po włączeniu. Treningi są zapisywane zawsze, a żadna funkcja AI nigdy nie odczytuje trasy. Wyłączenie zatrzymuje nowe trasy; już zapisane zostają do usunięcia treningu.", + "detail": "Wyłączone dla nowych kont. Trasa pokazuje, gdzie mieszkasz, pracujesz i trenujesz, więc zapisujemy ją dopiero po włączeniu. Treningi są zapisywane zawsze, a żadna funkcja AI nigdy nie odczytuje trasy. Wyłączenie zatrzymuje nowe trasy; już zapisane zostają do usunięcia treningu.", "loadError": "Nie udało się wczytać ustawienia tras." }, "retention": { @@ -7539,7 +7539,7 @@ "preview": { "topics": { "title": "Tematy (beta)", - "description": "Dodaje osobną pozycję Tematy ze stronami przeglądowymi nad stronami poszczególnych pomiarów.", + "description": "Doda osobną pozycję Tematy ze stronami przeglądowymi nad stronami poszczególnych pomiarów, gdy będą gotowe.", "detail": "Strony analiz, nawigacja i linki pozostają dokładnie takie, jakie są. Strony tematów pojawią się w późniejszej aktualizacji; ten przełącznik decyduje, czy je zobaczysz.", "savedOn": "Podgląd tematów włączony.", "savedOff": "Podgląd tematów wyłączony." diff --git a/src/__tests__/settings-copy-tense.test.ts b/src/__tests__/settings-copy-tense.test.ts new file mode 100644 index 000000000..31d44ea71 --- /dev/null +++ b/src/__tests__/settings-copy-tense.test.ts @@ -0,0 +1,29 @@ +/** + * Copy that promises something not yet shipped says so. + * + * The Topics preview switch exists before its pages do, so its description is + * in the future tense in every locale's source (English) and in German; and + * the workout-route switch is off for new accounts, which is what its detail + * says rather than "off by default": an account that already held tracks at + * the upgrade started with it on (migration 0434). + */ +import { describe, expect, it } from "vitest"; + +import en from "../../messages/en.json"; +import de from "../../messages/de.json"; + +describe("settings copy tense", () => { + it("describes the Topics preview as something it will add", () => { + expect(en.settings.preview.topics.description).toMatch(/^Will add /); + expect(de.settings.preview.topics.description).toMatch(/sobald/); + }); + + it("says workout routes are off for new accounts", () => { + expect(en.settings.privacy.workoutRoutes.detail).toMatch( + /^Off for new accounts\./, + ); + expect(de.settings.privacy.workoutRoutes.detail).toMatch( + /^Für neue Konten aus\./, + ); + }); +}); diff --git a/src/__tests__/settings-glossary-de.test.ts b/src/__tests__/settings-glossary-de.test.ts index 57f031d5d..f4cc6fb7b 100644 --- a/src/__tests__/settings-glossary-de.test.ts +++ b/src/__tests__/settings-glossary-de.test.ts @@ -53,3 +53,40 @@ describe("German Settings glossary", () => { expect(offenders).toEqual([]); }); }); + +describe("German wording settled in v1.44", () => { + const at = (path: string): string => + path + .split(".") + .reduce( + (node, key) => (node as Record | undefined)?.[key], + de, + ) as string; + + it("names the Tracking group with a German word", () => { + expect(at("settings.shell.groups.tracking")).toBe("Erfassung"); + }); + + it("points to another Settings page with 'Unter …' and returns to the Modules", () => { + expect(at("settings.sections.modules.backToHub")).toBe( + "Zurück zu den Modulen", + ); + expect(at("settings.moduleState.change")).toBe("Unter Module ändern"); + expect(at("settings.sections.modules.pages.openArrangement")).toBe( + "Unter Anordnung öffnen", + ); + expect(at("settings.sections.modules.manageIn")).toMatch(/^Unter /); + }); + + it("calls the Insights area Insights where a string names it", () => { + for (const key of [ + "measurements.openMetricInsights", + "medications.category.custom.bpGateNote", + "admin.aiQuality.title", + "recordSharing.invite.accessManageDetail", + ]) { + expect(at(key), key).not.toMatch(/Auswertung/); + expect(at(key), key).toMatch(/Insights/); + } + }); +});