From 62ab48aee4e512557e252fd348a373e533dee358 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Wed, 28 Oct 2026 10:19:10 +0100 Subject: [PATCH] fix: ask "discard changes?" with keep editing and discard in settings editors and the admin pages, as in calendar and contacts --- .../__tests__/unsaved-changes-guard.test.tsx | 26 +++++++++--------- app/(main)/admin/_unsaved-changes-guard.tsx | 12 ++++----- lib/__tests__/settings-wording.test.ts | 27 +++++++++++++++++++ locales/ar/common.json | 4 +-- locales/ca/common.json | 4 +-- locales/cs/common.json | 4 +-- locales/da/common.json | 4 +-- locales/de/common.json | 4 +-- locales/en/common.json | 4 +-- locales/es/common.json | 2 +- locales/et/common.json | 4 +-- locales/fa/common.json | 6 ++--- locales/fr/common.json | 2 +- locales/he/common.json | 12 ++++----- locales/hu/common.json | 4 +-- locales/it/common.json | 8 +++--- locales/ja/common.json | 4 +-- locales/ko/common.json | 14 +++++----- locales/lv/common.json | 4 +-- locales/mn/common.json | 12 ++++----- locales/nb/common.json | 4 +-- locales/nl/common.json | 2 +- locales/pl/common.json | 4 +-- locales/pt/common.json | 2 +- locales/ro/common.json | 6 ++--- locales/ru/common.json | 8 +++--- locales/sk/common.json | 8 +++--- locales/th/common.json | 4 +-- locales/tr/common.json | 8 +++--- locales/uk/common.json | 6 ++--- locales/zh-TW/common.json | 6 ++--- locales/zh/common.json | 6 ++--- 32 files changed, 126 insertions(+), 99 deletions(-) diff --git a/app/(main)/admin/__tests__/unsaved-changes-guard.test.tsx b/app/(main)/admin/__tests__/unsaved-changes-guard.test.tsx index 7e5a92e95..160bd435a 100644 --- a/app/(main)/admin/__tests__/unsaved-changes-guard.test.tsx +++ b/app/(main)/admin/__tests__/unsaved-changes-guard.test.tsx @@ -21,27 +21,27 @@ describe('admin unsaved changes guard (#1255)', () => { expect(screen.queryByRole('alertdialog')).toBeNull(); }); - it('asks before leaving with unsaved edits; Stay keeps the admin on the page', () => { + it('asks before leaving with unsaved edits; Keep editing keeps the admin on the page', () => { render(<>); const action = vi.fn(); act(() => useAdminUnsavedStore.getState().requestLeave(action)); - expect(screen.getByRole('alertdialog')).toBeTruthy(); - fireEvent.click(screen.getByRole('button', { name: 'Stay' })); + expect(screen.getByRole('alertdialog', { name: 'Discard changes?' })).toBeTruthy(); + fireEvent.click(screen.getByRole('button', { name: 'Keep editing' })); expect(action).not.toHaveBeenCalled(); expect(screen.queryByRole('alertdialog')).toBeNull(); expect(useAdminUnsavedStore.getState().dirty).toEqual({ settings: true }); }); - it('Leave runs the action and drops the unsaved flag', () => { + it('Discard runs the action and drops the unsaved flag', () => { render(<>); const action = vi.fn(); act(() => useAdminUnsavedStore.getState().requestLeave(action)); - fireEvent.click(screen.getByRole('button', { name: 'Leave' })); + fireEvent.click(screen.getByRole('button', { name: 'Discard' })); expect(action).toHaveBeenCalledTimes(1); expect(useAdminUnsavedStore.getState().dirty).toEqual({}); }); - it('Escape closes the prompt like Stay', () => { + it('Escape closes the prompt like Keep editing', () => { render(<>); const action = vi.fn(); act(() => useAdminUnsavedStore.getState().requestLeave(action)); @@ -58,12 +58,12 @@ describe('admin unsaved changes guard (#1255)', () => { act(() => useAdminUnsavedStore.getState().setDirty('plugin-config', true)); act(() => useAdminUnsavedStore.getState().requestLeave(back, 'plugin-config')); - fireEvent.click(screen.getByRole('button', { name: 'Leave' })); + fireEvent.click(screen.getByRole('button', { name: 'Discard' })); expect(back).toHaveBeenCalledTimes(2); expect(useAdminUnsavedStore.getState().dirty).toEqual({ plugins: true }); }); - it('holds a link click until the admin picks Leave', () => { + it('holds a link click until the admin picks Discard', () => { const onLinkClick = vi.fn((e: React.MouseEvent) => e.preventDefault()); render( <> @@ -76,7 +76,7 @@ describe('admin unsaved changes guard (#1255)', () => { expect(onLinkClick).not.toHaveBeenCalled(); expect(screen.getByRole('alertdialog')).toBeTruthy(); - fireEvent.click(screen.getByRole('button', { name: 'Leave' })); + fireEvent.click(screen.getByRole('button', { name: 'Discard' })); expect(onLinkClick).toHaveBeenCalledTimes(1); }); @@ -103,7 +103,7 @@ describe('admin unsaved changes guard on Back', () => { await act(async () => { await done; }); }; - it('keeps the page and asks when Back is pressed with unsaved edits; Stay keeps guarding', async () => { + it('keeps the page and asks when Back is pressed with unsaved edits; Keep editing keeps guarding', async () => { window.history.pushState(null, '', '/admin/policy'); window.history.pushState(null, '', '/admin/telemetry'); render(<>); @@ -112,7 +112,7 @@ describe('admin unsaved changes guard on Back', () => { expect(window.location.pathname).toBe('/admin/telemetry'); expect(screen.getByRole('alertdialog')).toBeTruthy(); - fireEvent.click(screen.getByRole('button', { name: 'Stay' })); + fireEvent.click(screen.getByRole('button', { name: 'Keep editing' })); expect(useAdminUnsavedStore.getState().dirty).toEqual({ settings: true }); // Back asks again: the page is still guarded. @@ -121,14 +121,14 @@ describe('admin unsaved changes guard on Back', () => { expect(screen.getByRole('alertdialog')).toBeTruthy(); }); - it('Leave goes back to the previous page', async () => { + it('Discard goes back to the previous page', async () => { window.history.pushState(null, '', '/admin/policy'); window.history.pushState(null, '', '/admin/telemetry'); render(<>); await back(); const done = popped(); - fireEvent.click(screen.getByRole('button', { name: 'Leave' })); + fireEvent.click(screen.getByRole('button', { name: 'Discard' })); await act(async () => { await done; }); expect(window.location.pathname).toBe('/admin/policy'); expect(useAdminUnsavedStore.getState().dirty).toEqual({}); diff --git a/app/(main)/admin/_unsaved-changes-guard.tsx b/app/(main)/admin/_unsaved-changes-guard.tsx index bb1a63124..4f3d452b8 100644 --- a/app/(main)/admin/_unsaved-changes-guard.tsx +++ b/app/(main)/admin/_unsaved-changes-guard.tsx @@ -49,8 +49,8 @@ export function UnsavedChangesGuard() { // Back and the back gesture are a same-document popstate (the pages switch // through pushState), which can't be cancelled. So while something is // unsaved a copy of the page's entry sits on top: Back only takes that - // one off, the page stays, and the prompt asks. Stay puts the copy back; - // Leave goes back past the page for real. + // one off, the page stays, and the prompt asks. Keep editing puts the + // copy back; Discard goes back past the page for real. // The mark on the page entry the copy was put on top of. const guard = useRef(null); useEffect(() => { @@ -124,10 +124,10 @@ export function UnsavedChangesGuard() { isOpen={isOpen} onClose={cancelLeave} onConfirm={confirmLeave} - title="Unsaved changes" - message="You have changes that haven't been saved. If you leave now, they will be lost." - cancelText="Stay" - confirmText="Leave" + title="Discard changes?" + message="Your changes haven't been saved." + cancelText="Keep editing" + confirmText="Discard" variant="destructive" /> ); diff --git a/lib/__tests__/settings-wording.test.ts b/lib/__tests__/settings-wording.test.ts index 25bddb1f9..c9245cf69 100644 --- a/lib/__tests__/settings-wording.test.ts +++ b/lib/__tests__/settings-wording.test.ts @@ -1,4 +1,6 @@ import { describe, expect, it } from 'vitest'; +import { readdirSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; import en from '@/locales/en/common.json'; import { getByPath } from '../settings-search'; @@ -59,6 +61,31 @@ describe('settings wording', () => { expect(text('notifications.filters_saved')).toBe('Filters saved'); }); + // R5: every editor asks the same question with the same buttons, in every + // language: Settings and Contacts say what Calendar says. + it('asks "Discard changes?" with Keep editing / Discard everywhere', () => { + expect(text('calendar.discard.title')).toBe('Discard changes?'); + const mismatches: string[] = []; + for (const locale of readdirSync(join(process.cwd(), 'locales'))) { + const messages = JSON.parse(readFileSync(join(process.cwd(), 'locales', locale, 'common.json'), 'utf8')); + const ref = getByPath(messages, 'calendar.discard') as Record; + const expected: Record = { + 'settings.discard_changes': ref.title, + 'settings.unsaved_changes': ref.message, + 'settings.keep_editing': ref.keep, + 'settings.discard': ref.confirm, + 'contacts.form.discard_title': ref.title, + 'contacts.form.discard_message': ref.message, + 'contacts.form.keep_editing': ref.keep, + 'contacts.form.discard': ref.confirm, + }; + for (const [key, value] of Object.entries(expected)) { + if (getByPath(messages, key) !== value) mismatches.push(`${locale} ${key}`); + } + } + expect(mismatches).toEqual([]); + }); + it('does not repeat the debug section title as its only row', () => { expect(text('settings.advanced.debug_mode.toggle')).not.toBe(text('settings.advanced.debug_mode.label')); }); diff --git a/locales/ar/common.json b/locales/ar/common.json index 83f3d75c0..031813254 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -1118,8 +1118,8 @@ "import_success": "تم استيراد الإعدادات بنجاح", "import_error": "فشل استيراد الإعدادات", "reset_confirm": "هل أنت متأكد أنك تريد إعادة تعيين جميع الإعدادات إلى الافتراضية؟", - "unsaved_changes": "لديك تغييرات غير محفوظة", - "discard_changes": "تجاهل التغييرات غير المحفوظة؟", + "unsaved_changes": "لم يتم حفظ تغييراتك.", + "discard_changes": "تجاهل التغييرات؟", "discard": "تجاهل", "keep_editing": "متابعة التعديل", "search_placeholder": "بحث في الإعدادات", diff --git a/locales/ca/common.json b/locales/ca/common.json index 24d600073..b0624d8a4 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -1118,8 +1118,8 @@ "import_success": "Configuració importada correctament", "import_error": "No s'ha pogut importar la configuració", "reset_confirm": "Segur que voleu restablir tota la configuració als valors per defecte?", - "unsaved_changes": "Teniu canvis sense desar", - "discard_changes": "Voleu descartar els canvis sense desar?", + "unsaved_changes": "Els canvis no s'han desat.", + "discard_changes": "Voleu descartar els canvis?", "discard": "Descarta", "keep_editing": "Continua editant", "search_placeholder": "Cerca a la configuració", diff --git a/locales/cs/common.json b/locales/cs/common.json index 5a47c65dd..76fc49c44 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -1118,8 +1118,8 @@ "import_success": "Nastavení bylo importováno", "import_error": "Import nastavení selhal", "reset_confirm": "Opravdu chcete obnovit výchozí nastavení?", - "unsaved_changes": "Máte neuložené změny", - "discard_changes": "Zahodit neuložené změny?", + "unsaved_changes": "Vaše změny nebyly uloženy.", + "discard_changes": "Zahodit změny?", "discard": "Zahodit", "keep_editing": "Pokračovat v úpravách", "tabs": { diff --git a/locales/da/common.json b/locales/da/common.json index 39b3577c3..f062a2935 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -1118,8 +1118,8 @@ "import_success": "Indstillinger importeret succesfuldt", "import_error": "Kunne ikke importere indstillinger", "reset_confirm": "Er du sikker på, at du vil nulstille alle indstillinger til standard?", - "unsaved_changes": "Du har ugemte ændringer", - "discard_changes": "Kassér ugemte ændringer?", + "unsaved_changes": "Dine ændringer er ikke gemt.", + "discard_changes": "Kassér ændringer?", "discard": "Kassér", "keep_editing": "Fortsæt redigering", "search_placeholder": "Søg i indstillinger", diff --git a/locales/de/common.json b/locales/de/common.json index f674d50e4..3bfcd34b0 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -1118,7 +1118,7 @@ "import_success": "Einstellungen erfolgreich importiert", "import_error": "Import der Einstellungen fehlgeschlagen", "reset_confirm": "Sind Sie sicher, dass Sie alle Einstellungen auf die Standardwerte zurücksetzen möchten?", - "unsaved_changes": "Sie haben ungespeicherte Änderungen", + "unsaved_changes": "Ihre Änderungen wurden noch nicht gespeichert.", "discard_changes": "Änderungen verwerfen?", "discard": "Verwerfen", "keep_editing": "Weiter bearbeiten", @@ -3468,7 +3468,7 @@ "save": "Speichern", "cancel": "Abbrechen", "discard_title": "Änderungen verwerfen?", - "discard_message": "Ihre Änderungen wurden nicht gespeichert.", + "discard_message": "Ihre Änderungen wurden noch nicht gespeichert.", "discard": "Verwerfen", "keep_editing": "Weiter bearbeiten", "remove_entry": "Entfernen", diff --git a/locales/en/common.json b/locales/en/common.json index a52ffa489..4ffa2b423 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -1118,8 +1118,8 @@ "import_success": "Settings imported", "import_error": "Couldn't import settings", "reset_confirm": "Are you sure you want to reset all settings to defaults?", - "unsaved_changes": "You have unsaved changes", - "discard_changes": "Discard unsaved changes?", + "unsaved_changes": "Your changes haven't been saved.", + "discard_changes": "Discard changes?", "discard": "Discard", "keep_editing": "Keep editing", "search_placeholder": "Search settings", diff --git a/locales/es/common.json b/locales/es/common.json index ea405fcf4..86ad684d7 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -1118,7 +1118,7 @@ "import_success": "Configuración importada exitosamente", "import_error": "Error al importar la configuración", "reset_confirm": "¿Está seguro de que desea restablecer toda la configuración a los valores predeterminados?", - "unsaved_changes": "Tienes cambios sin guardar", + "unsaved_changes": "Tus cambios no se han guardado.", "discard_changes": "¿Descartar los cambios?", "discard": "Descartar", "keep_editing": "Seguir editando", diff --git a/locales/et/common.json b/locales/et/common.json index f10aef617..4e366c410 100644 --- a/locales/et/common.json +++ b/locales/et/common.json @@ -1118,8 +1118,8 @@ "import_success": "Seaded imporditud", "import_error": "Seadete importimine ebaõnnestus", "reset_confirm": "Kas soovid kindlasti lähtestada kõik seaded vaikeväärtustele?", - "unsaved_changes": "Sul on salvestamata muudatusi", - "discard_changes": "Kas loobuda salvestamata muudatustest?", + "unsaved_changes": "Teie muudatusi pole salvestatud.", + "discard_changes": "Kas loobuda muudatustest?", "discard": "Loobu", "keep_editing": "Jätka muutmist", "search_placeholder": "Otsi seadetest", diff --git a/locales/fa/common.json b/locales/fa/common.json index cadc5cfc5..cb36a4136 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -1118,8 +1118,8 @@ "import_success": "تنظیمات با موفقیت وارد شد", "import_error": "وارد کردن تنظیمات ناموفق بود", "reset_confirm": "آیا از بازنشانی همه تنظیمات اطمینان دارید؟", - "unsaved_changes": "تغییرات ذخیره نشده دارید", - "discard_changes": "دور انداختن تغییرات ذخیره نشده؟", + "unsaved_changes": "تغییرات شما ذخیره نشده است.", + "discard_changes": "تغییرات دور انداخته شود؟", "discard": "دور انداختن", "keep_editing": "ادامه ویرایش", "search_placeholder": "جستجوی تنظیمات", @@ -3469,7 +3469,7 @@ "add_phone": "افزودن تلفن", "save": "ذخیره", "cancel": "انصراف", - "discard_title": "تغییرات دور انداخته شوند؟", + "discard_title": "تغییرات دور انداخته شود؟", "discard_message": "تغییرات شما ذخیره نشده است.", "discard": "دور انداختن", "keep_editing": "ادامه ویرایش", diff --git a/locales/fr/common.json b/locales/fr/common.json index ff049af3a..efb7c7e71 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -1118,7 +1118,7 @@ "import_success": "Paramètres importés avec succès", "import_error": "Échec de l'importation des paramètres", "reset_confirm": "Êtes-vous sûr de vouloir réinitialiser tous les paramètres ?", - "unsaved_changes": "Vous avez des modifications non enregistrées", + "unsaved_changes": "Vos modifications n'ont pas été enregistrées.", "discard_changes": "Abandonner les modifications ?", "discard": "Abandonner", "keep_editing": "Continuer l'édition", diff --git a/locales/he/common.json b/locales/he/common.json index 7b6b96707..107d33578 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -1083,10 +1083,10 @@ "import_success": "ההגדרות יובאו בהצלחה", "import_error": "ייבוא ההגדרות נכשל", "reset_confirm": "האם אתה בטוח שברצונך לאפס את כל ההגדרות לברירות מחדל?", - "unsaved_changes": "יש לך שינויים שלא נשמרו", - "discard_changes": "למחוק שינויים שלא נשמרו?", - "discard": "לזרוק", - "keep_editing": "תמשיך לערוך", + "unsaved_changes": "השינויים שלך לא נשמרו.", + "discard_changes": "לבטל את השינויים?", + "discard": "לבטל שינויים", + "keep_editing": "להמשיך לערוך", "tabs": { "appearance": "מראה", "account": "חשבון", @@ -3373,8 +3373,8 @@ "cancel": "לְבַטֵל", "discard_title": "לבטל את השינויים?", "discard_message": "השינויים שלך לא נשמרו.", - "discard": "בטל", - "keep_editing": "המשך לערוך", + "discard": "לבטל שינויים", + "keep_editing": "להמשיך לערוך", "remove_entry": "הסר", "close": "סגור", "remove_category": "הסר את {name}", diff --git a/locales/hu/common.json b/locales/hu/common.json index 46ec89dd6..bd808f20c 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -1118,8 +1118,8 @@ "import_success": "Beállítások sikeresen importálva", "import_error": "Nem sikerült importálni a beállításokat", "reset_confirm": "Biztosan vissza akarod állítani az összes beállítást az alapértelmezettre?", - "unsaved_changes": "Nem mentett változtatások vannak", - "discard_changes": "Nem mentett változtatások elvetése?", + "unsaved_changes": "A változtatásai nincsenek mentve.", + "discard_changes": "Elveti a változtatásokat?", "discard": "Elvetés", "keep_editing": "Szerkesztés folytatása", "search_placeholder": "Beállítások keresése", diff --git a/locales/it/common.json b/locales/it/common.json index 1ae4ac6bd..23c75e930 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -1118,9 +1118,9 @@ "import_success": "Impostazioni importate con successo", "import_error": "Impossibile importare le impostazioni", "reset_confirm": "Sei sicuro di voler ripristinare tutte le impostazioni ai valori predefiniti?", - "unsaved_changes": "Hai modifiche non salvate", + "unsaved_changes": "Le modifiche non sono state salvate.", "discard_changes": "Annullare le modifiche?", - "discard": "Annulla", + "discard": "Annulla modifiche", "keep_editing": "Continua a modificare", "tabs": { "appearance": "Aspetto", @@ -3467,9 +3467,9 @@ "add_phone": "Aggiungi telefono", "save": "Salva", "cancel": "Annulla", - "discard_title": "Eliminare le modifiche?", + "discard_title": "Annullare le modifiche?", "discard_message": "Le modifiche non sono state salvate.", - "discard": "Elimina", + "discard": "Annulla modifiche", "keep_editing": "Continua a modificare", "remove_entry": "Rimuovi", "close": "Chiudi", diff --git a/locales/ja/common.json b/locales/ja/common.json index c8fdb02e0..88ca69f23 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -1118,7 +1118,7 @@ "import_success": "設定をインポートしました", "import_error": "設定のインポートに失敗しました", "reset_confirm": "すべての設定をデフォルトにリセットしてもよろしいですか?", - "unsaved_changes": "保存されていない変更があります", + "unsaved_changes": "変更はまだ保存されていません。", "discard_changes": "変更を破棄しますか?", "discard": "破棄", "keep_editing": "編集を続ける", @@ -3468,7 +3468,7 @@ "save": "保存", "cancel": "キャンセル", "discard_title": "変更を破棄しますか?", - "discard_message": "変更は保存されていません。", + "discard_message": "変更はまだ保存されていません。", "discard": "破棄", "keep_editing": "編集を続ける", "remove_entry": "削除", diff --git a/locales/ko/common.json b/locales/ko/common.json index 0d47cdbdd..d60cb13aa 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -1118,9 +1118,9 @@ "import_success": "설정을 성공적으로 가져왔어요", "import_error": "설정 가져오기에 실패했어요", "reset_confirm": "모든 설정을 기본값으로 되돌릴까요?", - "unsaved_changes": "저장되지 않은 변경 사항이 있어요", - "discard_changes": "변경 사항을 취소할까요?", - "discard": "취소하기", + "unsaved_changes": "변경 사항이 아직 저장되지 않았습니다.", + "discard_changes": "변경 사항을 버릴까요?", + "discard": "버리기", "keep_editing": "계속 수정하기", "tabs": { "appearance": "화면 설정", @@ -3467,10 +3467,10 @@ "add_phone": "전화번호 추가", "save": "저장", "cancel": "취소", - "discard_title": "변경 사항을 삭제할까요?", - "discard_message": "변경 사항이 저장되지 않았습니다.", - "discard": "삭제", - "keep_editing": "계속 편집", + "discard_title": "변경 사항을 버릴까요?", + "discard_message": "변경 사항이 아직 저장되지 않았습니다.", + "discard": "버리기", + "keep_editing": "계속 수정하기", "remove_entry": "제거", "close": "닫기", "remove_category": "{name} 제거", diff --git a/locales/lv/common.json b/locales/lv/common.json index 576cf389f..b043b1a6c 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -1118,8 +1118,8 @@ "import_success": "Iestatījumi veiksmīgi importēti", "import_error": "Neizdevās importēt iestatījumus", "reset_confirm": "Vai tiešām vēlaties atiestatīt visus iestatījumus uz noklusējuma vērtībām?", - "unsaved_changes": "Jums ir nesaglabātas izmaiņas", - "discard_changes": "Atmest nesaglabātās izmaiņas?", + "unsaved_changes": "Jūsu izmaiņas nav saglabātas.", + "discard_changes": "Atmest izmaiņas?", "discard": "Atmest", "keep_editing": "Turpināt rediģēšanu", "tabs": { diff --git a/locales/mn/common.json b/locales/mn/common.json index fe6f07f32..103d1523a 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -1118,10 +1118,10 @@ "import_success": "Тохиргоог амжилттай импортоллоо", "import_error": "Тохиргоог оруулж чадсангүй", "reset_confirm": "Та бүх тохиргоог өгөгдмөл рүү буцаахдаа итгэлтэй байна уу?", - "unsaved_changes": "Танд хадгалагдаагүй өөрчлөлтүүд байна", - "discard_changes": "Хадгалагдаагүй өөрчлөлтүүдийг устгах уу?", - "discard": "Хасах", - "keep_editing": "Засварлаж байгаарай", + "unsaved_changes": "Таны өөрчлөлтүүд хадгалагдаагүй байна.", + "discard_changes": "Өөрчлөлтүүдийг хаях уу?", + "discard": "Хаях", + "keep_editing": "Үргэлжлүүлэн засах", "search_placeholder": "Хайлтын тохиргоо", "search_clear": "Хайлтыг арилгах", "search_no_results": "Тохирох тохиргоо байхгүй", @@ -3469,8 +3469,8 @@ "add_phone": "Утас нэмэх", "save": "Хадгалах", "cancel": "Цуцлах", - "discard_title": "Өөрчлөлтийг хаях уу?", - "discard_message": "Таны өөрчлөлт хадгалагдаагүй байна.", + "discard_title": "Өөрчлөлтүүдийг хаях уу?", + "discard_message": "Таны өөрчлөлтүүд хадгалагдаагүй байна.", "discard": "Хаях", "keep_editing": "Үргэлжлүүлэн засах", "remove_entry": "Хасах", diff --git a/locales/nb/common.json b/locales/nb/common.json index dbad27796..35692689d 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -1118,8 +1118,8 @@ "import_success": "Innstillingene er importert", "import_error": "Kunne ikke importere innstillinger", "reset_confirm": "Vil du tilbakestille alle innstillingene?", - "unsaved_changes": "Du har ulagrede endringer", - "discard_changes": "Vil du forkaste ulagrede endringer?", + "unsaved_changes": "Endringene dine er ikke lagret.", + "discard_changes": "Vil du forkaste endringene?", "discard": "Forkast", "keep_editing": "Fortsett å redigere", "search_placeholder": "Søk i innstillinger", diff --git a/locales/nl/common.json b/locales/nl/common.json index 666ab2471..3d0a27361 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -1118,7 +1118,7 @@ "import_success": "Instellingen succesvol geïmporteerd", "import_error": "Kan instellingen niet importeren", "reset_confirm": "Weet je zeker dat je alle instellingen wilt resetten naar de standaardwaarden?", - "unsaved_changes": "U heeft niet-opgeslagen wijzigingen", + "unsaved_changes": "Je wijzigingen zijn niet opgeslagen.", "discard_changes": "Wijzigingen verwerpen?", "discard": "Verwerpen", "keep_editing": "Doorgaan met bewerken", diff --git a/locales/pl/common.json b/locales/pl/common.json index cd950fcc8..4ba98decb 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -1118,8 +1118,8 @@ "import_success": "Ustawienia zostały zaimportowane", "import_error": "Nie udało się zaimportować ustawień", "reset_confirm": "Czy na pewno chcesz przywrócić domyślne ustawienia?", - "unsaved_changes": "Masz niezapisane zmiany", - "discard_changes": "Odrzucić niezapisane zmiany?", + "unsaved_changes": "Twoje zmiany nie zostały zapisane.", + "discard_changes": "Odrzucić zmiany?", "discard": "Odrzuć", "keep_editing": "Kontynuuj edycję", "tabs": { diff --git a/locales/pt/common.json b/locales/pt/common.json index 31b7da9b2..ad28659db 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -1118,7 +1118,7 @@ "import_success": "Configurações importadas com sucesso", "import_error": "Falha ao importar configurações", "reset_confirm": "Tem certeza de que deseja redefinir todas as configurações para os padrões?", - "unsaved_changes": "Você tem alterações não salvas", + "unsaved_changes": "Suas alterações não foram salvas.", "discard_changes": "Descartar alterações?", "discard": "Descartar", "keep_editing": "Continuar editando", diff --git a/locales/ro/common.json b/locales/ro/common.json index 2ff1964e4..f5034810f 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -1118,9 +1118,9 @@ "import_success": "Setările au fost importate cu succes", "import_error": "Nu s-au putut importa setările", "reset_confirm": "Sunteți sigur că doriți să resetați toate setările la valorile implicite?", - "unsaved_changes": "Aveți modificări nesalvate", - "discard_changes": "Doriți să renunțați la modificările nesalvate?", - "discard": "Ignorați", + "unsaved_changes": "Modificările dvs. nu au fost salvate.", + "discard_changes": "Renunțați la modificări?", + "discard": "Renunțați", "keep_editing": "Continuați editarea", "search_placeholder": "Setări de căutare", "search_clear": "Șterge căutarea", diff --git a/locales/ru/common.json b/locales/ru/common.json index 42dd04851..41f180584 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -1118,9 +1118,9 @@ "import_success": "Настройки успешно импортированы", "import_error": "Не удалось импортировать настройки", "reset_confirm": "Вы уверены, что хотите сбросить все настройки до значений по умолчанию?", - "unsaved_changes": "У вас есть несохранённые изменения", - "discard_changes": "Отменить несохранённые изменения?", - "discard": "Отменить", + "unsaved_changes": "Ваши изменения не сохранены.", + "discard_changes": "Отменить изменения?", + "discard": "Отменить изменения", "keep_editing": "Продолжить редактирование", "tabs": { "appearance": "Внешний вид", @@ -3469,7 +3469,7 @@ "cancel": "Отмена", "discard_title": "Отменить изменения?", "discard_message": "Ваши изменения не сохранены.", - "discard": "Отменить", + "discard": "Отменить изменения", "keep_editing": "Продолжить редактирование", "remove_entry": "Убрать", "close": "Закрыть", diff --git a/locales/sk/common.json b/locales/sk/common.json index f58a0f303..9bcf26ed2 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -1118,9 +1118,9 @@ "import_success": "Nastavenia boli úspešne importované", "import_error": "Import nastavení zlyhal", "reset_confirm": "Naozaj chcete obnoviť všetky nastavenia na predvolené?", - "unsaved_changes": "Máte neuložené zmeny", - "discard_changes": "Zahoditť neuložené zmeny?", - "discard": "Zahoditť", + "unsaved_changes": "Vaše zmeny neboli uložené.", + "discard_changes": "Zahodiť zmeny?", + "discard": "Zahodiť", "keep_editing": "Pokračovať v úprave", "search_placeholder": "Hľadať nastavenia", "search_clear": "Vymazať hľadanie", @@ -3472,7 +3472,7 @@ "discard_title": "Zahodiť zmeny?", "discard_message": "Vaše zmeny neboli uložené.", "discard": "Zahodiť", - "keep_editing": "Pokračovať v úpravách", + "keep_editing": "Pokračovať v úprave", "remove_entry": "Odstrániť", "close": "Zavrieť", "remove_category": "Odstrániť {name}", diff --git a/locales/th/common.json b/locales/th/common.json index 181a7ec8e..44a9fe238 100644 --- a/locales/th/common.json +++ b/locales/th/common.json @@ -3297,8 +3297,8 @@ "import_success": "นำเข้าการตั้งค่าเรียบร้อยแล้ว", "import_error": "นำเข้าการตั้งค่าไม่สำเร็จ", "reset_confirm": "คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตการตั้งค่าทั้งหมดกลับเป็นค่าเริ่มต้น?", - "unsaved_changes": "คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก", - "discard_changes": "ละทิ้งการเปลี่ยนแปลงที่ยังไม่ได้บันทึกหรือไม่?", + "unsaved_changes": "การเปลี่ยนแปลงของคุณยังไม่ได้บันทึก", + "discard_changes": "ละทิ้งการเปลี่ยนแปลงหรือไม่?", "discard": "ละทิ้ง", "keep_editing": "แก้ไขต่อ", "search_placeholder": "ค้นหาการตั้งค่า", diff --git a/locales/tr/common.json b/locales/tr/common.json index eb80b9fc9..85a78614e 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -1118,9 +1118,9 @@ "import_success": "Ayarlar başarıyla içe aktarıldı", "import_error": "Ayarlar içe aktarılamadı", "reset_confirm": "Tüm ayarları varsayılanlara sıfırlamak istediğinizden emin misiniz?", - "unsaved_changes": "Kaydedilmemiş değişiklikleriniz var", - "discard_changes": "Kaydedilmemiş değişiklikler atılsın mı?", - "discard": "Atla", + "unsaved_changes": "Değişiklikleriniz kaydedilmedi.", + "discard_changes": "Değişiklikler atılsın mı?", + "discard": "Değişiklikleri at", "keep_editing": "Düzenlemeye devam et", "tabs": { "appearance": "Görünüm", @@ -3469,7 +3469,7 @@ "cancel": "İptal", "discard_title": "Değişiklikler atılsın mı?", "discard_message": "Değişiklikleriniz kaydedilmedi.", - "discard": "At", + "discard": "Değişiklikleri at", "keep_editing": "Düzenlemeye devam et", "remove_entry": "Kaldır", "close": "Kapat", diff --git a/locales/uk/common.json b/locales/uk/common.json index d1162c2ea..7fbdeaae5 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -1118,10 +1118,10 @@ "import_success": "Налаштування успішно імпортовано", "import_error": "Не вдалося імпортувати налаштування", "reset_confirm": "Ви впевнені, що бажаєте скинути всі налаштування до стандартних?", - "unsaved_changes": "У вас є незбережені зміни", - "discard_changes": "Скасувати незбережені зміни?", + "unsaved_changes": "Ваші зміни не збережено.", + "discard_changes": "Відкинути зміни?", "discard": "Відкинути", - "keep_editing": "Продовжуйте редагувати", + "keep_editing": "Продовжити редагування", "tabs": { "appearance": "Зовнішній вигляд", "account": "Обліковий запис", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 16779b94c..828e6255e 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -1118,8 +1118,8 @@ "import_success": "已成功匯入設定", "import_error": "無法匯入設定", "reset_confirm": "您確定要將所有設定重設為預設值嗎?", - "unsaved_changes": "您有尚未儲存的變更", - "discard_changes": "要捨棄尚未儲存的變更嗎?", + "unsaved_changes": "你的變更尚未儲存。", + "discard_changes": "要捨棄變更嗎?", "discard": "捨棄", "keep_editing": "繼續編輯", "search_placeholder": "搜尋設定", @@ -3470,7 +3470,7 @@ "save": "儲存", "cancel": "取消", "discard_title": "要捨棄變更嗎?", - "discard_message": "您的變更尚未儲存。", + "discard_message": "你的變更尚未儲存。", "discard": "捨棄", "keep_editing": "繼續編輯", "remove_entry": "移除", diff --git a/locales/zh/common.json b/locales/zh/common.json index b1626b7df..6a0577260 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -1118,8 +1118,8 @@ "import_success": "设置导入成功", "import_error": "导入设置失败", "reset_confirm": "您确定要将所有设置重置为默认值吗?", - "unsaved_changes": "您有未保存的更改", - "discard_changes": "放弃未保存的更改?", + "unsaved_changes": "你的更改尚未保存。", + "discard_changes": "放弃更改?", "discard": "放弃", "keep_editing": "继续编辑", "tabs": { @@ -3468,7 +3468,7 @@ "save": "保存", "cancel": "取消", "discard_title": "放弃更改?", - "discard_message": "您的更改尚未保存。", + "discard_message": "你的更改尚未保存。", "discard": "放弃", "keep_editing": "继续编辑", "remove_entry": "移除",