diff --git a/messages/de.json b/messages/de.json index c0f43f7b2..712c80243 100644 --- a/messages/de.json +++ b/messages/de.json @@ -12497,5 +12497,12 @@ "title": "Lebensereignis löschen?", "body": "Titel und Notiz sind danach nicht mehr da." } + }, + "aboutPage": { + "eyebrow": "Info", + "title": "Über HealthLog", + "lastUpdated": "Zuletzt aktualisiert: {date}", + "project": "Projekt", + "credits": "Danksagungen" } } diff --git a/messages/en.json b/messages/en.json index 2b4d08d79..e94ccfa96 100644 --- a/messages/en.json +++ b/messages/en.json @@ -12497,5 +12497,12 @@ "title": "Delete this life event?", "body": "Its title and note will be gone." } + }, + "aboutPage": { + "eyebrow": "About", + "title": "About HealthLog", + "lastUpdated": "Last updated: {date}", + "project": "Project", + "credits": "Credits" } } diff --git a/messages/es.json b/messages/es.json index 2c0901a0b..4816ec62e 100644 --- a/messages/es.json +++ b/messages/es.json @@ -12497,5 +12497,12 @@ "title": "¿Eliminar este acontecimiento vital?", "body": "Su título y su nota desaparecerán." } + }, + "aboutPage": { + "eyebrow": "Información", + "title": "Acerca de HealthLog", + "lastUpdated": "Última actualización: {date}", + "project": "Proyecto", + "credits": "Créditos" } } diff --git a/messages/fr.json b/messages/fr.json index 6627cc1c4..47293067c 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -12497,5 +12497,12 @@ "title": "Supprimer cet événement de vie ?", "body": "Son titre et sa note disparaîtront." } + }, + "aboutPage": { + "eyebrow": "À propos", + "title": "À propos de HealthLog", + "lastUpdated": "Dernière mise à jour : {date}", + "project": "Projet", + "credits": "Crédits" } } diff --git a/messages/it.json b/messages/it.json index 5dc38aa73..1861817da 100644 --- a/messages/it.json +++ b/messages/it.json @@ -12497,5 +12497,12 @@ "title": "Eliminare questo evento di vita?", "body": "Titolo e nota non ci saranno più." } + }, + "aboutPage": { + "eyebrow": "Informazioni", + "title": "Informazioni su HealthLog", + "lastUpdated": "Ultimo aggiornamento: {date}", + "project": "Progetto", + "credits": "Riconoscimenti" } } diff --git a/messages/ko.json b/messages/ko.json index 9ddb7604e..95744e729 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -12497,5 +12497,12 @@ "title": "이 삶의 사건을 삭제할까요?", "body": "제목과 메모가 사라져요." } + }, + "aboutPage": { + "eyebrow": "정보", + "title": "HealthLog 정보", + "lastUpdated": "마지막 업데이트: {date}", + "project": "프로젝트", + "credits": "크레딧" } } diff --git a/messages/pl.json b/messages/pl.json index de6cd01aa..4f1b2aa9a 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -12497,5 +12497,12 @@ "title": "Usunąć to wydarzenie życiowe?", "body": "Tytuł i notatka znikną." } + }, + "aboutPage": { + "eyebrow": "Informacje", + "title": "O HealthLog", + "lastUpdated": "Ostatnia aktualizacja: {date}", + "project": "Projekt", + "credits": "Podziękowania" } } diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 9d039b5e6..cbfe211f5 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,6 +1,10 @@ import type { Metadata } from "next"; import Link from "next/link"; +import { resolveIntlLocale } from "@/lib/format-locale"; +import { resolveServerLocale } from "@/lib/i18n/server-locale"; +import { getServerTranslator } from "@/lib/i18n/server-translator"; + /** * v1.4.27 B3 — Public about / credits page. * @@ -67,7 +71,17 @@ function Section({ ); } -export default function AboutPage() { +export default async function AboutPage() { + // The headings, the date and the sign-in link follow the reader's locale; + // the body is the attribution text the licences ask for and stays as + // written. + const locale = await resolveServerLocale(); + const { t } = getServerTranslator(locale); + const lastUpdated = new Intl.DateTimeFormat(resolveIntlLocale(locale), { + dateStyle: "medium", + timeZone: "UTC", + }).format(new Date(`${LAST_UPDATED}T12:00:00Z`)); + return (
- About + {t("aboutPage.eyebrow")}
- Last updated: {LAST_UPDATED} +
HealthLog is an open-source, self-hostable personal-health-tracking application. The source code lives at{" "} @@ -127,7 +143,7 @@ export default function AboutPage() {
HealthLog stands on a number of open-source libraries and public
data sources. The list below covers the third-party assets that ship
diff --git a/src/app/privacy/__tests__/page.test.tsx b/src/app/privacy/__tests__/page.test.tsx
index 8bef1084e..18805bd10 100644
--- a/src/app/privacy/__tests__/page.test.tsx
+++ b/src/app/privacy/__tests__/page.test.tsx
@@ -20,9 +20,10 @@ import PrivacyPage from "../page";
* enumerated verbatim by identifier. Drift from the iOS source
* (`HealthKitWireConverter.swift` + `HealthKitService.swift`)
* would be a compliance hole.
- * 4. The numbered section headings are all present (English form, so
- * the scannable spine matches the in-app `Settings → Privacy`
- * link target and the table of contents above each section).
+ * 4. The numbered section headings are all present, German first with
+ * the English title beside it, so the scannable spine still matches
+ * the in-app `Settings → Privacy` link target and the table of
+ * contents.
* 5. v1.4.40 SB-3 additions — consent receipt endpoint, TLS 1.3,
* operator email + deletion-route disclosure, retention windows.
*/
@@ -46,31 +47,53 @@ describe("
- Deutsch — {titleDe}
+ Deutsch
- {`${numberLabel}. ${titleEn}`}
+ {`${numberLabel}. ${titleDe}`}
+
+ {` / ${titleEn}`}
+
- Last updated: {LAST_UPDATED} · Stand: {LAST_UPDATED} +
Diese Erklärung ist deutsch-englisch geführt. Jeder Abschnitt @@ -253,7 +276,7 @@ export default function PrivacyPage() { className="hover:text-foreground hover:underline" href="#intro" > - 1. Overview / Überblick + 1. Überblick / Overview