feat(news): übersetzter Hinweis auf die englischen Notizen, optisch zurückgenommen

Wer die Oberfläche auf Japanisch stehen hat, sah einen japanischen Rahmen um
englische Sätze — das kann man für eine fehlende Übersetzung halten. Ein Satz
oben im Popup sagt jetzt, dass es Absicht ist, in allen neun Sprachen; klein
und grau, damit er hinter dem Inhalt zurücksteht, zu dem er gehört. Bei
englischer Oberfläche entfällt er.

SPEC §9 und D58-Nachtrag.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 12:56:16 +02:00
co-authored by Claude Opus 5
parent 312f2bf54f
commit 257aab08dd
4 changed files with 42 additions and 2 deletions
+17
View File
@@ -4185,3 +4185,20 @@ vollständig im Bild und wird an beiden Kanten getroffen (`elementFromPoint`),
die Kopfzeile bleibt einreihig. 20 neue Tests in `frontend/tests/news.test.js`, die Kopfzeile bleibt einreihig. 20 neue Tests in `frontend/tests/news.test.js`,
darunter einer, der die **ausgelieferte** `docs/CHANGELOG.md` liest — ist sie darunter einer, der die **ausgelieferte** `docs/CHANGELOG.md` liest — ist sie
unlesbar, stünde das Popup sonst leer da, ohne dass es jemand merkt. unlesbar, stünde das Popup sonst leer da, ohne dass es jemand merkt.
**Nachtrag — ein übersetzter Hinweis sagt, dass die Notizen englisch sind.**
Der Haupttext oben begründet die englischen Notizen und lässt den Betrachter
damit allein: Wer die Oberfläche auf Japanisch stehen hat, sieht einen
japanischen Rahmen um englische Sätze und kann das für einen Fehler halten —
für eine fehlende Übersetzung oder einen kaputten Sprachwechsel. Ein Satz
oben im Popup nimmt dem die Spitze: „Diese Übersicht wird leider nur auf
Englisch gepflegt", in allen neun Sprachen.
**Er tritt optisch zurück** (klein, grau, ohne Rahmen und ohne Fläche): Es ist
eine Fußnote zum Inhalt, nicht der Inhalt. Der bernsteinfarbene
Besuchsvergleich darunter bleibt damit das erste, worauf der Blick fällt.
**Bei englischer Oberfläche entfällt er** — dort wäre es eine Auskunft über
nichts. Der Schlüssel ist trotzdem in allen neun Sprachen angelegt, auch auf
Englisch: Ein Loch in der Tabelle lädt dazu ein, beim nächsten Durchsehen für
einen Fehler gehalten und „repariert" zu werden.
+5 -1
View File
@@ -690,7 +690,11 @@ gemerkt.
Die **Notizen sind englisch**, auch wenn die Oberfläche in einer anderen Sprache Die **Notizen sind englisch**, auch wenn die Oberfläche in einer anderen Sprache
steht: `docs/CHANGELOG.md` ist ein ausgeliefertes Artefakt mit weltweitem steht: `docs/CHANGELOG.md` ist ein ausgeliefertes Artefakt mit weltweitem
Publikum, wie der mitgelieferte Plan und `llms.md` (§13). Übersetzt ist alles Publikum, wie der mitgelieferte Plan und `llms.md` (§13). Übersetzt ist alles
übrige — Titel, Knöpfe und die Datumsangaben. Siehe D58. übrige — Titel, Knöpfe und die Datumsangaben. Damit das nicht wie ein Fehler
aussieht, steht **oben im Popup ein übersetzter Hinweis**, dass diese Übersicht
nur auf Englisch gepflegt wird; er ist klein und grau gehalten und tritt hinter
den Inhalt zurück, zu dem er gehört. Bei englischer Oberfläche entfällt er.
Siehe D58.
### Sprung zwischen Diagramm und Text ### Sprung zwischen Diagramm und Text
Jeder Knoten kennt seine Zeilennummer im Notationstext; beide Richtungen sind Jeder Knoten kennt seine Zeilennummer im Notationstext; beide Richtungen sind
+16 -1
View File
@@ -1906,6 +1906,7 @@ const I18N = {
freshTooltip:"Neu in Produktion seit dem letzten Ansehen: {n}.", freshTooltip:"Neu in Produktion seit dem letzten Ansehen: {n}.",
newsTooltip:"Neuigkeiten", newsTooltip:"Neuigkeiten",
newsTitle:"Neuigkeiten", newsTitle:"Neuigkeiten",
newsEnglish:"Diese Übersicht wird leider nur auf Englisch gepflegt.",
newsEmpty:"Keine Einträge.", newsEmpty:"Keine Einträge.",
newsUnseen:"Neuigkeiten aus {n} Tagen, die du noch nicht angesehen hast.", newsUnseen:"Neuigkeiten aus {n} Tagen, die du noch nicht angesehen hast.",
newsSince:"Seit deinem letzten Besuch: {n} neu in Produktion.", newsSince:"Seit deinem letzten Besuch: {n} neu in Produktion.",
@@ -2005,6 +2006,7 @@ const I18N = {
freshTooltip:"New in production since you last looked: {n}.", freshTooltip:"New in production since you last looked: {n}.",
newsTooltip:"What's new", newsTooltip:"What's new",
newsTitle:"What's new", newsTitle:"What's new",
newsEnglish:"This overview is only maintained in English.",
newsEmpty:"Nothing recorded.", newsEmpty:"Nothing recorded.",
newsUnseen:"News from {n} days you haven't looked at yet.", newsUnseen:"News from {n} days you haven't looked at yet.",
newsSince:"Since your last visit: {n} new in production.", newsSince:"Since your last visit: {n} new in production.",
@@ -2104,6 +2106,7 @@ const I18N = {
freshTooltip:"Nuevo en producción desde la última vez: {n}.", freshTooltip:"Nuevo en producción desde la última vez: {n}.",
newsTooltip:"Novedades", newsTooltip:"Novedades",
newsTitle:"Novedades", newsTitle:"Novedades",
newsEnglish:"Lamentablemente, este resumen solo se mantiene en inglés.",
newsEmpty:"Sin entradas.", newsEmpty:"Sin entradas.",
newsUnseen:"Novedades de {n} días que aún no has visto.", newsUnseen:"Novedades de {n} días que aún no has visto.",
newsSince:"Desde tu última visita: {n} nuevo en producción.", newsSince:"Desde tu última visita: {n} nuevo en producción.",
@@ -2203,6 +2206,7 @@ const I18N = {
freshTooltip:"Nouveau en production depuis votre dernière visite : {n}.", freshTooltip:"Nouveau en production depuis votre dernière visite : {n}.",
newsTooltip:"Nouveautés", newsTooltip:"Nouveautés",
newsTitle:"Nouveautés", newsTitle:"Nouveautés",
newsEnglish:"Cet aperçu n'est malheureusement tenu à jour qu'en anglais.",
newsEmpty:"Aucune entrée.", newsEmpty:"Aucune entrée.",
newsUnseen:"Nouveautés de {n} jours que vous n'avez pas encore consultées.", newsUnseen:"Nouveautés de {n} jours que vous n'avez pas encore consultées.",
newsSince:"Depuis votre dernière visite : {n} nouveau en production.", newsSince:"Depuis votre dernière visite : {n} nouveau en production.",
@@ -2302,6 +2306,7 @@ const I18N = {
freshTooltip:"Nowe na produkcji od ostatniego razu: {n}.", freshTooltip:"Nowe na produkcji od ostatniego razu: {n}.",
newsTooltip:"Nowości", newsTooltip:"Nowości",
newsTitle:"Nowości", newsTitle:"Nowości",
newsEnglish:"Niestety to zestawienie jest prowadzone tylko po angielsku.",
newsEmpty:"Brak wpisów.", newsEmpty:"Brak wpisów.",
newsUnseen:"Nowości z {n} dni, których jeszcze nie oglądałeś.", newsUnseen:"Nowości z {n} dni, których jeszcze nie oglądałeś.",
newsSince:"Od twojej ostatniej wizyty: {n} nowe na produkcji.", newsSince:"Od twojej ostatniej wizyty: {n} nowe na produkcji.",
@@ -2401,6 +2406,7 @@ const I18N = {
freshTooltip:"Новое в продакшене с прошлого раза: {n}.", freshTooltip:"Новое в продакшене с прошлого раза: {n}.",
newsTooltip:"Новости", newsTooltip:"Новости",
newsTitle:"Новости", newsTitle:"Новости",
newsEnglish:"К сожалению, этот обзор ведётся только на английском языке.",
newsEmpty:"Записей нет.", newsEmpty:"Записей нет.",
newsUnseen:"Новости за {n} дней, которые вы ещё не просматривали.", newsUnseen:"Новости за {n} дней, которые вы ещё не просматривали.",
newsSince:"С вашего последнего визита: {n} новых в продакшене.", newsSince:"С вашего последнего визита: {n} новых в продакшене.",
@@ -2500,6 +2506,7 @@ const I18N = {
freshTooltip:"पिछली बार से उत्पादन में नया: {n}।", freshTooltip:"पिछली बार से उत्पादन में नया: {n}।",
newsTooltip:"नया क्या है", newsTooltip:"नया क्या है",
newsTitle:"नया क्या है", newsTitle:"नया क्या है",
newsEnglish:"खेद है, यह विवरण केवल अंग्रेज़ी में ही रखा जाता है।",
newsEmpty:"कोई प्रविष्टि नहीं।", newsEmpty:"कोई प्रविष्टि नहीं।",
newsUnseen:"{n} दिनों की खबरें, जो आपने अभी तक नहीं देखीं।", newsUnseen:"{n} दिनों की खबरें, जो आपने अभी तक नहीं देखीं।",
newsSince:"आपकी पिछली यात्रा से: {n} उत्पादन में नए।", newsSince:"आपकी पिछली यात्रा से: {n} उत्पादन में नए।",
@@ -2599,6 +2606,7 @@ const I18N = {
freshTooltip:"自上次查看以来新上线:{n}。", freshTooltip:"自上次查看以来新上线:{n}。",
newsTooltip:"最新动态", newsTooltip:"最新动态",
newsTitle:"最新动态", newsTitle:"最新动态",
newsEnglish:"很抱歉,此更新列表仅以英文维护。",
newsEmpty:"暂无记录。", newsEmpty:"暂无记录。",
newsUnseen:"有 {n} 天的动态你还没有看过。", newsUnseen:"有 {n} 天的动态你还没有看过。",
newsSince:"自你上次访问以来:{n} 项新上线。", newsSince:"自你上次访问以来:{n} 项新上线。",
@@ -2698,6 +2706,7 @@ const I18N = {
freshTooltip:"前回以降に本番化されたもの:{n} 件。", freshTooltip:"前回以降に本番化されたもの:{n} 件。",
newsTooltip:"更新情報", newsTooltip:"更新情報",
newsTitle:"更新情報", newsTitle:"更新情報",
newsEnglish:"申し訳ありませんが、この一覧は英語でのみ更新されます。",
newsEmpty:"項目はありません。", newsEmpty:"項目はありません。",
newsUnseen:"まだ見ていない {n} 日分の更新があります。", newsUnseen:"まだ見ていない {n} 日分の更新があります。",
newsSince:"前回の訪問以降:{n} 件が本番化されました。", newsSince:"前回の訪問以降:{n} 件が本番化されました。",
@@ -3333,6 +3342,12 @@ function updateFreshBtn(){
} }
function renderNewsMenu(){ function renderNewsMenu(){
/* Die Notizen sind englisch (D58) — wer die Oberfläche auf Japanisch stehen
hat, soll wissen, dass das Absicht ist und kein Fehler. Nicht für
englische Oberflächen: Dort wäre es eine Auskunft über nichts. Und optisch
zurückgenommen — es ist eine Fußnote zum Inhalt, nicht der Inhalt. */
const hinweis = (lang !== 'en' && NEWS.length)
? `<div class="newsnote">${esc(t('newsEnglish'))}</div>` : '';
const seit = (!newsKeySet && freshDocId === activeId && freshSet.size) const seit = (!newsKeySet && freshDocId === activeId && freshSet.size)
? `<div class="newssince"><span>${esc(t('newsSince', {n: freshSet.size}))}</span>` ? `<div class="newssince"><span>${esc(t('newsSince', {n: freshSet.size}))}</span>`
+ `<button type="button" class="newsseen" id="newsSeenBtn">${esc(t('newsSeen'))}</button></div>` + `<button type="button" class="newsseen" id="newsSeenBtn">${esc(t('newsSeen'))}</button></div>`
@@ -3358,7 +3373,7 @@ function renderNewsMenu(){
newsMenu.innerHTML = `<div class="newshead"><span>${esc(t('newsTitle'))}</span>` newsMenu.innerHTML = `<div class="newshead"><span>${esc(t('newsTitle'))}</span>`
+ `<button type="button" class="newsclose" id="newsCloseBtn"` + `<button type="button" class="newsclose" id="newsCloseBtn"`
+ ` title="${esc(t('tipClose'))}" aria-label="${esc(t('tipClose'))}">×</button></div>` + ` title="${esc(t('tipClose'))}" aria-label="${esc(t('tipClose'))}">×</button></div>`
+ seit + (tage || `<div class="newsempty">${esc(t('newsEmpty'))}</div>`); + hinweis + seit + (tage || `<div class="newsempty">${esc(t('newsEmpty'))}</div>`);
} }
function openNewsMenu(){ function openNewsMenu(){
renderNewsMenu(); renderNewsMenu();
+4
View File
@@ -115,6 +115,10 @@
color:var(--muted);font-size:1rem;line-height:1;padding:2px 4px;border-radius:6px; color:var(--muted);font-size:1rem;line-height:1;padding:2px 4px;border-radius:6px;
} }
.newshead .newsclose:hover{color:var(--ink);background:rgba(36,52,71,.07)} .newshead .newsclose:hover{color:var(--ink);background:rgba(36,52,71,.07)}
/* Fußnote zur Sprache der Notizen (D58-Nachtrag): klein, grau, ohne Rahmen
und ohne Fläche — sie soll gelesen werden können, aber hinter dem Inhalt
zurückstehen, zu dem sie gehört. */
.newsnote{margin-top:7px;color:var(--muted);font-size:.73rem;line-height:1.45}
/* „Seit deinem letzten Besuch" (D28) — die persönliche Hälfte, deshalb /* „Seit deinem letzten Besuch" (D28) — die persönliche Hälfte, deshalb
bernstein abgesetzt und oben, vor der allgemeinen Chronik. */ bernstein abgesetzt und oben, vor der allgemeinen Chronik. */
.newssince{ .newssince{