fix(i18n): die Zwei-Fenster-Warnung nennt die zuletzt gespeicherte Änderung, nicht den letzten Tastendruck

Nutzer-Rückfrage: „Was für ein letzter Tastendruck?" — die Formulierung
liest sich, als zähle nur Tippen. Tut es nicht: Umklappen im Diagramm
schreibt die Faltmarke in den Text (D38-Nachtrag 2) und damit in den
Speicher, nimmt also am selben Wettlauf teil. Nachgemessen mit zwei
Fenstern: A klappt zu, im Speicher steht `- > Ast A (M)`, B's Editor und
Diagramm bleiben unverändert — und B's nächster Tastendruck überschreibt
den Speicher, A's Faltung ist weg.

Beide Texte in allen neun Sprachen umformuliert (tabConflictWarn,
docLockText); der Dialogtext nennt das Falten ausdrücklich. SPEC §9 sagt
jetzt dazu, dass das andere Fenster nichts nachzieht und dass ein
Dokumentwechsel dort nicht mitwandert — `werkbaum-active` entscheidet erst
wieder, was ein Neustart öffnet (auch das eine Nutzer-Rückfrage,
nachgemessen). D94-Nachtrag 2 und CHANGELOG nachgezogen.

Benannt, nicht behoben: Wer „trotzdem hier bearbeiten" gewählt hat, behält
die Warnung, auch wenn das andere Fenster das Dokument längst verlassen
hat — dieser Ausweg fordert die Sperre bewusst nicht mehr an.

666 Tests grün; die neuen Texte im laufenden Editor nachgesehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-09-02 20:21:29 +02:00
co-authored by Claude Opus 5
parent 7f4c2a3e6a
commit 2a58951138
4 changed files with 59 additions and 19 deletions
+18 -18
View File
@@ -3550,11 +3550,11 @@ const I18N = {
sourceLoadWarn:"„{url}“ konnte nicht geladen werden ({error}). Die Datei muss per http(s) erreichbar sein und CORS erlauben (Access-Control-Allow-Origin).",
padGoneWarn:"Dieser Link zeigt auf ein Etherpad-Pad. Die Etherpad-Anbindung gibt es nicht mehr — gemeinsames Arbeiten läuft jetzt über ein Werkbaum-Backend (?live=…). Der Text des Pads lässt sich dort einmal einfügen und dann zu zweit bearbeiten.",
storeFailedWarn:"Speichern im Browser fehlgeschlagen — vermutlich ist der Speicher voll. Änderungen können beim Neuladen verloren gehen; Platz schaffen: nicht mehr gebrauchte Dokumente oder frühere Stände löschen.",
tabConflictWarn:"„{name}“ wird in einem anderen Fenster ({where}) bearbeitet — der letzte Tastendruck gewinnt.",
tabConflictWarn:"„{name}“ wird in einem anderen Fenster ({where}) bearbeitet — die zuletzt gespeicherte Änderung gewinnt.",
liveUnsentWarn:"Deine Änderungen sind seit {min} Minuten NICHT auf dem Server angekommen — sie existieren nur in diesem Fenster. Vor dem Schließen sichern (Strg+S oder Kamera-Knopf).",
liveEndedWarn:"Die Live-Verbindung zu diesem Server-Dokument ist getrennt — Werkbaum verbindet automatisch neu. Bis dahin bleiben Änderungen nur in diesem Fenster.",
docLockTitle:"„{name}“ ist in einem anderen Fenster geöffnet",
docLockText:"Ein anderes Fenster bearbeitet dieses Dokument gerade — der letzte Tastendruck gewinnt. Was willst du tun?",
docLockText:"Ein anderes Fenster bearbeitet dieses Dokument gerade — die zuletzt gespeicherte Änderung gewinnt, auch das Falten im Diagramm. Was willst du tun?",
docLockOpenOther:"Anderes Dokument öffnen:",
docLockViewOnly:"Hier nur ansehen",
docLockEditAnyway:"Trotzdem hier bearbeiten",
@@ -3692,11 +3692,11 @@ const I18N = {
sourceLoadWarn:"Could not load “{url}” ({error}). The file must be reachable via http(s) and allow CORS (Access-Control-Allow-Origin).",
padGoneWarn:"This link points at an Etherpad pad. The Etherpad connection is gone — collaboration now runs through a Werkbaum backend (?live=…). Paste the pads text there once, then edit it together.",
storeFailedWarn:"Saving in the browser failed — its storage is probably full. Changes may be lost on reload; free space by deleting unused documents or earlier states.",
tabConflictWarn:"“{name}” is being edited in another window ({where}) — the last keystroke wins.",
tabConflictWarn:"“{name}” is being edited in another window ({where}) — whichever change is saved last wins.",
liveUnsentWarn:"Your changes have NOT reached the server for {min} minutes — they exist only in this window. Save before closing (Ctrl+S or the camera button).",
liveEndedWarn:"The live connection to this server document is down — Werkbaum reconnects automatically. Until then, changes stay in this window only.",
docLockTitle:"“{name}” is open in another window",
docLockText:"Another window is editing this document right now — the last keystroke wins. What would you like to do?",
docLockText:"Another window is editing this document right now — whichever change is saved last wins, folding in the diagram included. What would you like to do?",
docLockOpenOther:"Open another document:",
docLockViewOnly:"View only here",
docLockEditAnyway:"Edit here anyway",
@@ -3834,11 +3834,11 @@ const I18N = {
sourceLoadWarn:"No se pudo cargar «{url}» ({error}). El archivo debe ser accesible por http(s) y permitir CORS (Access-Control-Allow-Origin).",
padGoneWarn:"Este enlace apunta a un pad de Etherpad. La conexión con Etherpad ya no existe: ahora se colabora a través de un backend de Werkbaum (?live=…). Pega allí el texto del pad una vez y editadlo juntos.",
storeFailedWarn:"No se pudo guardar en el navegador: su almacenamiento probablemente está lleno. Los cambios pueden perderse al recargar; libera espacio borrando documentos sin uso o estados anteriores.",
tabConflictWarn:"«{name}» se está editando en otra ventana ({where}) — gana la última tecla.",
tabConflictWarn:"«{name}» se está editando en otra ventana ({where}) — gana el último cambio guardado.",
liveUnsentWarn:"Tus cambios NO han llegado al servidor desde hace {min} minutos — solo existen en esta ventana. Guarda antes de cerrar (Ctrl+S o el botón de cámara).",
liveEndedWarn:"La conexión en vivo con este documento del servidor se ha perdido — Werkbaum se reconecta automáticamente. Hasta entonces, los cambios quedan solo en esta ventana.",
docLockTitle:"«{name}» está abierto en otra ventana",
docLockText:"Otra ventana está editando este documento ahora mismo — la última tecla gana. ¿Qué quieres hacer?",
docLockText:"Otra ventana está editando este documento ahora mismo — gana el último cambio guardado, incluido el plegado en el diagrama. ¿Qué quieres hacer?",
docLockOpenOther:"Abrir otro documento:",
docLockViewOnly:"Solo ver aquí",
docLockEditAnyway:"Editar aquí de todos modos",
@@ -3976,11 +3976,11 @@ const I18N = {
sourceLoadWarn:"Impossible de charger « {url} » ({error}). Le fichier doit être accessible en http(s) et autoriser CORS (Access-Control-Allow-Origin).",
padGoneWarn:"Ce lien pointe vers un pad Etherpad. La connexion Etherpad nexiste plus — la collaboration passe désormais par un backend Werkbaum (?live=…). Collez-y une fois le texte du pad, puis modifiez-le à plusieurs.",
storeFailedWarn:"L'enregistrement dans le navigateur a échoué — son stockage est probablement plein. Les modifications peuvent être perdues au rechargement ; libérez de l'espace en supprimant des documents inutilisés ou des états antérieurs.",
tabConflictWarn:"« {name} » est modifié dans une autre fenêtre ({where}) — le dernier à taper gagne.",
tabConflictWarn:"« {name} » est modifié dans une autre fenêtre ({where}) — la dernière modification enregistrée gagne.",
liveUnsentWarn:"Tes modifications ne sont PAS arrivées au serveur depuis {min} minutes — elles n'existent que dans cette fenêtre. Enregistre avant de fermer (Ctrl+S ou le bouton appareil photo).",
liveEndedWarn:"La connexion en direct à ce document serveur est interrompue — Werkbaum se reconnecte automatiquement. D'ici là, les modifications restent dans cette fenêtre.",
docLockTitle:"« {name} » est ouvert dans une autre fenêtre",
docLockText:"Une autre fenêtre modifie ce document en ce moment — le dernier à taper gagne. Que veux-tu faire ?",
docLockText:"Une autre fenêtre modifie ce document en ce moment — la dernière modification enregistrée gagne, y compris le pliage dans le diagramme. Que veux-tu faire ?",
docLockOpenOther:"Ouvrir un autre document :",
docLockViewOnly:"Consulter seulement ici",
docLockEditAnyway:"Modifier quand même ici",
@@ -4118,11 +4118,11 @@ const I18N = {
sourceLoadWarn:"Nie udało się wczytać „{url}” ({error}). Plik musi być dostępny przez http(s) i zezwalać na CORS (Access-Control-Allow-Origin).",
padGoneWarn:"Ten link prowadzi do pada Etherpad. Połączenia z Etherpadem już nie ma — wspólna praca odbywa się teraz przez backend Werkbaum (?live=…). Wklej tam raz tekst pada i edytujcie go razem.",
storeFailedWarn:"Zapis w przeglądarce nie powiódł się — jego pamięć jest zapewne pełna. Zmiany mogą przepaść przy przeładowaniu; zwolnij miejsce, usuwając nieużywane dokumenty lub wcześniejsze stany.",
tabConflictWarn:"„{name}” jest edytowany w innym oknie ({where}) — wygrywa ostatni klawisz.",
tabConflictWarn:"„{name}” jest edytowany w innym oknie ({where}) — wygrywa ostatnia zapisana zmiana.",
liveUnsentWarn:"Twoje zmiany NIE dotarły na serwer od {min} minut — istnieją tylko w tym oknie. Zapisz przed zamknięciem (Ctrl+S lub przycisk aparatu).",
liveEndedWarn:"Połączenie na żywo z tym dokumentem serwera zostało przerwane — Werkbaum łączy się ponownie automatycznie. Do tego czasu zmiany pozostają tylko w tym oknie.",
docLockTitle:"„{name}” jest otwarte w innym oknie",
docLockText:"Inne okno właśnie edytuje ten dokument — wygrywa ostatni klawisz. Co chcesz zrobić?",
docLockText:"Inne okno właśnie edytuje ten dokument — wygrywa ostatnia zapisana zmiana, także zwijanie w diagramie. Co chcesz zrobić?",
docLockOpenOther:"Otwórz inny dokument:",
docLockViewOnly:"Tylko podgląd",
docLockEditAnyway:"Edytuj mimo to",
@@ -4260,11 +4260,11 @@ const I18N = {
sourceLoadWarn:"Не удалось загрузить «{url}» ({error}). Файл должен быть доступен по http(s) и разрешать CORS (Access-Control-Allow-Origin).",
padGoneWarn:"Эта ссылка ведёт на пад Etherpad. Подключения к Etherpad больше нет — совместная работа теперь идёт через бэкенд Werkbaum (?live=…). Вставьте туда текст пада один раз и редактируйте вместе.",
storeFailedWarn:"Не удалось сохранить в браузере — его хранилище, вероятно, заполнено. Изменения могут потеряться при перезагрузке; освободите место, удалив ненужные документы или прежние состояния.",
tabConflictWarn:"«{name}» редактируется в другом окне ({where}) — побеждает последнее нажатие.",
tabConflictWarn:"«{name}» редактируется в другом окне ({where}) — побеждает последнее сохранённое изменение.",
liveUnsentWarn:"Ваши изменения НЕ доходят до сервера уже {min} мин — они существуют только в этом окне. Сохраните перед закрытием (Ctrl+S или кнопка камеры).",
liveEndedWarn:"Живое соединение с этим серверным документом прервано — Werkbaum переподключается автоматически. До тех пор изменения остаются только в этом окне.",
docLockTitle:"«{name}» открыт в другом окне",
docLockText:"Другое окно сейчас редактирует этот документ — побеждает последнее нажатие. Что вы хотите сделать?",
docLockText:"Другое окно сейчас редактирует этот документ — побеждает последнее сохранённое изменение, включая сворачивание в диаграмме. Что вы хотите сделать?",
docLockOpenOther:"Открыть другой документ:",
docLockViewOnly:"Только просмотр",
docLockEditAnyway:"Всё равно редактировать здесь",
@@ -4402,11 +4402,11 @@ const I18N = {
sourceLoadWarn:"„{url}“ लोड नहीं हो सका ({error})। फ़ाइल http(s) से उपलब्ध होनी चाहिए और CORS की अनुमति देनी चाहिए (Access-Control-Allow-Origin)।",
padGoneWarn:"यह लिंक एक Etherpad पैड की ओर इशारा करता है। Etherpad कनेक्शन अब नहीं है — साझा काम अब Werkbaum बैकएंड (?live=…) से होता है। पैड का टेक्स्ट वहाँ एक बार चिपकाएँ और मिलकर संपादित करें।",
storeFailedWarn:"ब्राउज़र में सहेजना विफल रहा — संभवतः उसका संग्रहण भर गया है। पुनः लोड करने पर बदलाव खो सकते हैं; अनुपयोगी दस्तावेज़ या पिछली स्थितियाँ हटाकर जगह बनाएँ।",
tabConflictWarn:"„{name}“ दूसरी विंडो में संपादित हो रहा है ({where}) — अंतिम कीस्ट्रोक जीतता है।",
tabConflictWarn:"„{name}“ दूसरी विंडो में संपादित हो रहा है ({where}) — अंत में सहेजा गया बदलाव जीतता है।",
liveUnsentWarn:"आपके बदलाव {min} मिनट से सर्वर तक नहीं पहुँचे — वे केवल इस विंडो में मौजूद हैं। बंद करने से पहले सहेजें (Ctrl+S या कैमरा बटन)।",
liveEndedWarn:"इस सर्वर दस्तावेज़ से लाइव कनेक्शन टूट गया है — Werkbaum अपने आप फिर जुड़ता है। तब तक बदलाव केवल इसी विंडो में रहते हैं।",
docLockTitle:"„{name}“ दूसरी विंडो में खुला है",
docLockText:"दूसरी विंडो इस दस्तावेज़ को अभी संपादित कर रही है — अंतिम कीस्ट्रोक जीतता है। आप क्या करना चाहेंगे?",
docLockText:"दूसरी विंडो इस दस्तावेज़ को अभी संपादित कर रही है — अंत में सहेजा गया बदलाव जीतता है, आरेख में मोड़ना भी। आप क्या करना चाहेंगे?",
docLockOpenOther:"दूसरा दस्तावेज़ खोलें:",
docLockViewOnly:"यहाँ केवल देखें",
docLockEditAnyway:"फिर भी यहाँ संपादित करें",
@@ -4544,11 +4544,11 @@ const I18N = {
sourceLoadWarn:"无法加载“{url}”({error})。该文件必须可通过 http(s) 访问并允许 CORSAccess-Control-Allow-Origin)。",
padGoneWarn:"此链接指向一个 Etherpad pad。Etherpad 连接已移除——协作现在通过 Werkbaum 后端(?live=…)进行。把 pad 的文本粘贴过去一次,然后一起编辑。",
storeFailedWarn:"无法保存到浏览器——其存储空间可能已满。重新加载时更改可能丢失;请删除不再使用的文档或以前的状态以腾出空间。",
tabConflictWarn:"“{name}”正在另一个窗口中编辑({where})——最后按键者生效。",
tabConflictWarn:"“{name}”正在另一个窗口中编辑({where})——最后保存的更改生效。",
liveUnsentWarn:"你的更改已有 {min} 分钟未到达服务器——它们只存在于此窗口中。关闭前请先保存(Ctrl+S 或相机按钮)。",
liveEndedWarn:"与此服务器文档的实时连接已断开——Werkbaum 会自动重连。在此之前,更改只保留在此窗口中。",
docLockTitle:"“{name}”已在另一个窗口中打开",
docLockText:"另一个窗口正在编辑此文档——最后按键者生效。您想怎么做?",
docLockText:"另一个窗口正在编辑此文档——最后保存的更改生效,包括在图中折叠节点。您想怎么做?",
docLockOpenOther:"打开其他文档:",
docLockViewOnly:"仅在此查看",
docLockEditAnyway:"仍要在此编辑",
@@ -4686,11 +4686,11 @@ const I18N = {
sourceLoadWarn:"「{url}」を読み込めませんでした({error})。ファイルは http(s) でアクセス可能で、CORSAccess-Control-Allow-Origin)を許可する必要があります。",
padGoneWarn:"このリンクは Etherpad のパッドを指しています。Etherpad 連携は廃止されました。共同編集は Werkbaum バックエンド(?live=…)で行います。パッドの本文を一度貼り付ければ、複数人で編集できます。",
storeFailedWarn:"ブラウザーへの保存に失敗しました — ストレージが満杯の可能性があります。再読み込みで変更が失われることがあります。不要なドキュメントや以前の状態を削除して空きを作ってください。",
tabConflictWarn:"「{name}」は別のウィンドウで編集中です({where})— 最後のキー操作が優先されます。",
tabConflictWarn:"「{name}」は別のウィンドウで編集中です({where})— 最後に保存された変更が優先されます。",
liveUnsentWarn:"変更が {min} 分間サーバーに届いていません — この変更はこのウィンドウにしか存在しません。閉じる前に保存してください(Ctrl+S またはカメラボタン)。",
liveEndedWarn:"このサーバー文書とのライブ接続が切れています — Werkbaum は自動的に再接続します。それまで変更はこのウィンドウにのみ残ります。",
docLockTitle:"「{name}」は別のウィンドウで開かれています",
docLockText:"別のウィンドウがこのドキュメントを編集中です — 最後のキー操作が優先されます。どうしますか?",
docLockText:"別のウィンドウがこのドキュメントを編集中です — 最後に保存された変更が優先されます(図の折りたたみも含む)。どうしますか?",
docLockOpenOther:"別のドキュメントを開く:",
docLockViewOnly:"ここでは閲覧のみ",
docLockEditAnyway:"それでもここで編集する",