diff --git a/components/settings/about-data-settings.tsx b/components/settings/about-data-settings.tsx index 2d20dcb0a..4cd109ab2 100644 --- a/components/settings/about-data-settings.tsx +++ b/components/settings/about-data-settings.tsx @@ -13,6 +13,7 @@ import { cn } from '@/lib/utils'; import { getPathPrefix, withBasePath } from '@/lib/browser-navigation'; import { clearCachedData } from '@/lib/clear-cached-data'; import { SpamSiegeGame } from './spam-siege-game'; +import { DebugSettings } from './debug-settings'; const APP_VERSION = process.env.NEXT_PUBLIC_APP_VERSION || "0.0.0"; const GIT_COMMIT = process.env.NEXT_PUBLIC_GIT_COMMIT || "unknown"; @@ -49,24 +50,20 @@ function VersionUpdateTag() { ); } -export function AboutDataSettings() { +/** + * The About card, in the settings sidebar's footer: logo, version with the + * update tag, and the source link. A modified build must offer its own + * source (AGPL-3.0 §13), so a configured URL replaces the upstream link. + * Three clicks on the logo open Spam Siege, as before. + */ +export function AboutFooter() { const t = useTranslations('settings.advanced'); - const tCommon = useTranslations('common'); - const tSettings = useTranslations('settings'); - const { settingsSyncDisabled, updateSetting, resetToDefaults, exportSettings, importSettings } = - useSettingsStore(); - // A modified build must offer its own source (AGPL-3.0 §13), so a - // configured URL replaces the upstream repository link. - const { settingsSyncEnabled, sourceCodeUrl, appName, appLogoLightUrl, appLogoDarkUrl } = useConfig(); + const { sourceCodeUrl, appName, appLogoLightUrl, appLogoDarkUrl } = useConfig(); // A branded deployment (APP_NAME / APP_LOGO_*) shows its own name and logo // here; without them the card keeps the Bulwark mark and title. (#1160) const branded = appName && appName !== 'Webmail'; const logoLight = withBasePath(appLogoLightUrl || appLogoDarkUrl) || `${getPathPrefix()}/branding/Bulwark_Logo_Color.svg`; const logoDark = withBasePath(appLogoDarkUrl || appLogoLightUrl) || `${getPathPrefix()}/branding/Bulwark_Logo_White.svg`; - const [showResetConfirm, setShowResetConfirm] = useState(false); - const [showRefreshConfirm, setShowRefreshConfirm] = useState(false); - const fileInputRef = useRef(null); - const { isFeatureEnabled } = usePolicyStore(); const [showGame, setShowGame] = useState(false); const logoClickCount = useRef(0); const logoClickTimer = useRef | null>(null); @@ -82,6 +79,58 @@ export function AboutDataSettings() { } }; + return ( +
+ {showGame && setShowGame(false)} />} +
+ + + {sourceCodeUrl ? t('about.source_code') : 'GitHub'} + +
+
+ ); +} + +/** + * The Backup & reset page: keep settings (sync, export, import), fix a stale + * view, start over, and (Advanced, where the admin allows it) debug logging. + * The About card moved to the settings sidebar's footer. + */ +export function AboutDataSettings() { + const t = useTranslations('settings.advanced'); + const tCommon = useTranslations('common'); + const tSettings = useTranslations('settings'); + const { settingsSyncDisabled, updateSetting, resetToDefaults, exportSettings, importSettings } = + useSettingsStore(); + const { settingsSyncEnabled } = useConfig(); + const [showResetConfirm, setShowResetConfirm] = useState(false); + const [showRefreshConfirm, setShowRefreshConfirm] = useState(false); + const fileInputRef = useRef(null); + const { isFeatureEnabled } = usePolicyStore(); const handleExport = () => { const settingsJson = exportSettings(); const blob = new Blob([settingsJson], { type: 'application/json' }); @@ -137,45 +186,8 @@ export function AboutDataSettings() { }; return ( - <> - {showGame && setShowGame(false)} />} -
-
- - - {sourceCodeUrl ? t('about.source_code') : 'GitHub'} - -
-
- - +
+ {settingsSyncEnabled && ( updateSetting('settingsSyncDisabled', !checked)} /> @@ -206,7 +218,9 @@ export function AboutDataSettings() { )} + +
); } diff --git a/components/settings/addons-settings.tsx b/components/settings/addons-settings.tsx new file mode 100644 index 000000000..f3ad6bddf --- /dev/null +++ b/components/settings/addons-settings.tsx @@ -0,0 +1,20 @@ +"use client"; + +import { SidebarAppsSettings } from './sidebar-apps-settings'; +import { PluginsSettings } from './plugins-settings'; +import { usePolicyStore } from '@/stores/policy-store'; + +/** + * The Add-ons page: sidebar apps and plugins, the two ways to add things to + * Bulwark. Plugins with a page of their own appear under this entry in the + * sidebar instead of forming a group. + */ +export function AddonsSettings() { + const { isFeatureEnabled } = usePolicyStore(); + return ( +
+ {isFeatureEnabled('sidebarAppsEnabled') && } + {isFeatureEnabled('pluginsEnabled') && } +
+ ); +} diff --git a/components/settings/debug-settings.tsx b/components/settings/debug-settings.tsx index e1a481c0d..38ec9c3e1 100644 --- a/components/settings/debug-settings.tsx +++ b/components/settings/debug-settings.tsx @@ -10,16 +10,12 @@ export function DebugSettings() { const { debugMode, debugCategories, updateSetting } = useSettingsStore(); const { isSettingLocked, isSettingHidden, isFeatureEnabled } = usePolicyStore(); - if (isSettingHidden('debugMode') || !isFeatureEnabled('debugModeEnabled')) { - return ( - -

{t('debug_mode.description')}

-
- ); - } + // A section of the Backup & reset page now; nothing to show when the admin + // keeps debug logging off. + if (isSettingHidden('debugMode') || !isFeatureEnabled('debugModeEnabled')) return null; return ( - + updateSetting('debugMode', checked)} /> diff --git a/components/settings/plugins-settings.tsx b/components/settings/plugins-settings.tsx index 9188fdd79..4c2c15df5 100644 --- a/components/settings/plugins-settings.tsx +++ b/components/settings/plugins-settings.tsx @@ -112,6 +112,7 @@ export function PluginsSettings() { return ( diff --git a/components/settings/settings-app.tsx b/components/settings/settings-app.tsx index be4d8282a..add8d103b 100644 --- a/components/settings/settings-app.tsx +++ b/components/settings/settings-app.tsx @@ -18,14 +18,12 @@ import { FolderOpen, HardDrive, BookUser, - PanelLeftClose, Bell, Puzzle, BookOpen, PenLine, LayoutList, - Info, - Bug, + Database, X, type AppIcon, } from '@/components/icons'; @@ -43,15 +41,13 @@ import { CalendarSettings } from '@/components/settings/calendar-settings'; import { CalendarManagementSettings } from '@/components/settings/calendar-management-settings'; import { AddressBookManagementSettings } from '@/components/settings/address-book-management-settings'; import { FilterSettings } from '@/components/settings/filter-settings'; -import { AboutDataSettings } from '@/components/settings/about-data-settings'; -import { DebugSettings } from '@/components/settings/debug-settings'; +import { AboutDataSettings, AboutFooter } from '@/components/settings/about-data-settings'; import { OrganizeSettings } from '@/components/settings/organize-settings'; import { AccountSecuritySettings } from '@/components/settings/account-security-settings'; import { FilesSettingsComponent } from '@/components/settings/files-settings'; import { ContactsSettings } from '@/components/settings/contacts-settings'; -import { SidebarAppsSettings } from '@/components/settings/sidebar-apps-settings'; +import { AddonsSettings } from '@/components/settings/addons-settings'; import { NotificationSettings } from '@/components/settings/notification-settings'; -import { PluginsSettings } from '@/components/settings/plugins-settings'; import { PluginIframeSlot } from '@/components/plugins/plugin-iframe-slot'; import { offersForSlot as pluginOffersForSlot, subscribe as pluginRegistrySubscribe, get as getActivePlugin } from '@/lib/plugin-sandbox/registry'; import { AdvancedSettingsProvider, AdvancedSettingsSwitch } from '@/components/settings/settings-section'; @@ -128,10 +124,8 @@ const tabIcons: Record = { calendar: Calendar, contacts: BookUser, files: HardDrive, - sidebar_apps: PanelLeftClose, - about_data: Info, - plugins: Puzzle, - debug: Bug, + addons: Puzzle, + backup: Database, }; const tabGroupOrder: TabGroup[] = ['general', 'appearance', 'mail', 'privacy', 'apps', 'plugins', 'advanced']; @@ -141,7 +135,7 @@ const tabGroupOrder: TabGroup[] = ['general', 'appearance', 'mail', 'privacy', ' // land on the page that now holds the setting. export const LEGACY_TAB_MAP: Record = { email: 'reading', - advanced: 'about_data', + advanced: 'backup', layout: 'appearance', themes: 'appearance', content_senders: 'reading', @@ -152,6 +146,10 @@ export const LEGACY_TAB_MAP: Record = { folders: 'organize', keywords: 'organize', downloads: 'reading', + sidebar_apps: 'addons', + plugins: 'addons', + about_data: 'backup', + debug: 'backup', }; function readPersistedTab(): SettingsTabId { @@ -323,7 +321,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = : ''; return `${p.name} ${p.description} ${p.author} ${fieldText}`; }).join(' '); - haystacks.plugins = `${haystacks.plugins ?? ''} ${haystackText}`.toLowerCase(); + haystacks.addons = `${haystacks.addons ?? ''} ${haystackText}`.toLowerCase(); const pluginSubs: SubResult[] = installedPlugins.flatMap((p) => { const items: SubResult[] = [{ label: p.name, description: p.description }]; if (p.settingsSchema) { @@ -337,7 +335,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = } return items; }); - subs.plugins = [...(subs.plugins ?? []), ...pluginSubs]; + subs.addons = [...(subs.addons ?? []), ...pluginSubs]; } // Themes are a section of Appearance now, so installed themes match there. if (installedThemes.length) { @@ -350,9 +348,9 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = } if (sidebarAppsList.length) { const text = sidebarAppsList.map((a) => `${a.name} ${a.url}`).join(' '); - haystacks.sidebar_apps = `${haystacks.sidebar_apps ?? ''} ${text}`.toLowerCase(); - subs.sidebar_apps = [ - ...(subs.sidebar_apps ?? []), + haystacks.addons = `${haystacks.addons ?? ''} ${text}`.toLowerCase(); + subs.addons = [ + ...(subs.addons ?? []), ...sidebarAppsList.map((a) => ({ label: a.name, description: a.url })), ]; } @@ -569,7 +567,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = ...(supportsCalendar && isFeatureEnabled('calendarEnabled') ? [{ id: 'calendar' as Tab, label: t('tabs.calendar'), icon: tabIcons.calendar, group: 'apps' as TabGroup }] : []), ...(isFeatureEnabled('contactsEnabled') ? [{ id: 'contacts' as Tab, label: t('tabs.contacts'), icon: tabIcons.contacts, group: 'apps' as TabGroup }] : []), ...(supportsFiles && isFeatureEnabled('filesEnabled') ? [{ id: 'files' as Tab, label: t('tabs.files'), icon: tabIcons.files, group: 'apps' as TabGroup }] : []), - ...(isFeatureEnabled('sidebarAppsEnabled') ? [{ id: 'sidebar_apps' as Tab, label: t('tabs.sidebar_apps'), icon: tabIcons.sidebar_apps, group: 'apps' as TabGroup }] : []), + ...(isFeatureEnabled('sidebarAppsEnabled') || isFeatureEnabled('pluginsEnabled') ? [{ id: 'addons' as Tab, label: t('tabs.addons'), icon: tabIcons.addons, group: 'apps' as TabGroup }] : []), // Plugin-contributed settings pages: one entry per active plugin that // offers a `settings-section` slot (e.g. S/MIME key & certificate manager). // A plugin that also has a page of its own gets that entry only, with the @@ -590,9 +588,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = })), // Advanced - { id: 'about_data', label: t('tabs.about_data'), icon: tabIcons.about_data, group: 'advanced' }, - ...(isFeatureEnabled('pluginsEnabled') ? [{ id: 'plugins' as Tab, label: 'Plugins', icon: tabIcons.plugins, group: 'advanced' as TabGroup }] : []), - ...(isFeatureEnabled('debugModeEnabled') ? [{ id: 'debug' as Tab, label: t('tabs.debug'), icon: tabIcons.debug, group: 'advanced' as TabGroup }] : []), + { id: 'backup', label: t('tabs.backup'), icon: tabIcons.backup, group: 'advanced' }, ]; // In scoped (shared-account) mode, restrict to the account-relevant tabs the @@ -713,10 +709,8 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps = : <>
)} {effectiveActiveTab === 'files' && } - {effectiveActiveTab === 'sidebar_apps' && } - {effectiveActiveTab === 'about_data' && } - {effectiveActiveTab === 'plugins' && } - {effectiveActiveTab === 'debug' && } + {effectiveActiveTab === 'addons' && } + {effectiveActiveTab === 'backup' && } {effectiveActiveTab.startsWith('plugin:') && ( +
diff --git a/components/settings/sidebar-apps-settings.tsx b/components/settings/sidebar-apps-settings.tsx index f0f965a32..ea7546282 100644 --- a/components/settings/sidebar-apps-settings.tsx +++ b/components/settings/sidebar-apps-settings.tsx @@ -194,7 +194,7 @@ function ManagedAppsSection() { if (managedApps.length === 0) return null; return ( - +
{managedApps.map((app) => { const AppIcon = iconForName(app.icon); @@ -289,18 +289,7 @@ export function SidebarAppsSettings() { return ( <> - - - updateSetting("keepAppsLoaded", v)} - /> - - - - - - +
{sidebarApps.length === 0 && !showAddForm && (

{tApps("no_apps_hint")}

@@ -387,8 +376,17 @@ export function SidebarAppsSettings() { )}
+ + + updateSetting("keepAppsLoaded", v)} + /> +
+ + ); diff --git a/lib/connector/registry.ts b/lib/connector/registry.ts index bc2f7da1e..bc37d2487 100644 --- a/lib/connector/registry.ts +++ b/lib/connector/registry.ts @@ -38,13 +38,12 @@ import { RELEASE_VERSION } from '@/lib/release-version'; * opens the page that holds the setting now (the settings page migrates * the id). Listed so an unknown tab is refused here. */ -const LEGACY_SETTINGS_TABS = ['layout', 'themes', 'content_senders', 'identities', 'language', 'protocol_handlers', 'templates', 'folders', 'keywords', 'downloads'] as const; +const LEGACY_SETTINGS_TABS = ['layout', 'themes', 'content_senders', 'identities', 'language', 'protocol_handlers', 'templates', 'folders', 'keywords', 'downloads', 'sidebar_apps', 'about_data', 'plugins', 'debug'] as const; const SETTINGS_TABS: readonly (SettingsSearchTab | typeof LEGACY_SETTINGS_TABS[number])[] = [ 'account', 'general', 'notifications', 'appearance', 'message_list', 'reading', 'composing', 'vacation', 'filters', 'organize', 'security', 'calendar', 'contacts', - 'files', 'sidebar_apps', 'about_data', - 'plugins', 'debug', + 'files', 'addons', 'backup', ...LEGACY_SETTINGS_TABS, ]; diff --git a/lib/settings-search.ts b/lib/settings-search.ts index 9ae5dcb66..da8e2d7bd 100644 --- a/lib/settings-search.ts +++ b/lib/settings-search.ts @@ -17,10 +17,8 @@ export type SettingsSearchTab = | 'calendar' | 'contacts' | 'files' - | 'sidebar_apps' - | 'about_data' - | 'plugins' - | 'debug'; + | 'addons' + | 'backup'; type Tab = SettingsSearchTab; @@ -125,10 +123,8 @@ export const tabSearchPaths: Record = { calendar: ['calendar.settings', 'calendar.management'], contacts: ['settings.contacts', 'contacts'], files: ['settings.files'], - sidebar_apps: ['settings.sidebar_apps', 'sidebar_apps'], - about_data: ['settings.advanced'], - plugins: [], - debug: ['settings.advanced'], + addons: ['settings.sidebar_apps', 'sidebar_apps', 'plugins.settings'], + backup: ['settings.advanced'], }; // Extra English keywords per tab so common search terms hit even when the @@ -151,10 +147,8 @@ export const tabKeywords: Record = { calendar: 'event schedule appointment meeting timezone invitation ics tasks birthday working hours', contacts: 'address book contact', files: 'attachments cloud drive storage upload', - sidebar_apps: 'apps webview iframe', - about_data: 'export import storage quota privacy backup', - plugins: 'extensions addons', - debug: 'logs developer console diagnostic', + addons: 'apps webview iframe plugins extensions addons sidebar', + backup: 'export import storage quota privacy backup reset sync cache about version debug logs developer console diagnostic', }; export function flattenStrings(node: unknown, sink: string[]): void { diff --git a/locales/ar/common.json b/locales/ar/common.json index 8552c5812..e38eac0b7 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -1053,7 +1053,9 @@ "debug": "التصحيح", "message_list": "قائمة الرسائل", "general": "عام", - "organize": "المجلدات والوسوم" + "organize": "المجلدات والوسوم", + "addons": "الإضافات", + "backup": "النسخ الاحتياطي وإعادة الضبط" }, "themes": { "title": "السمات", @@ -2236,6 +2238,12 @@ "delivered": "مُسلَّمة", "mistakes": "أخطاء" } + }, + "sections": { + "backup": "نسخة احتياطية من الإعدادات", + "backup_description": "احتفظ بإعداداتك عبر المتصفحات والأجهزة.", + "fix": "إصلاح المشكلات", + "fix_description": "عندما يبدو العرض قديمًا أو خاطئًا، أو عندما تريد البدء من جديد." } }, "sidebar_apps": { diff --git a/locales/ca/common.json b/locales/ca/common.json index bf8aee8f5..ab4afd426 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -1053,7 +1053,9 @@ "debug": "Depuració", "message_list": "Llista de missatges", "general": "General", - "organize": "Carpetes i etiquetes" + "organize": "Carpetes i etiquetes", + "addons": "Complements", + "backup": "Còpia de seguretat i restabliment" }, "themes": { "title": "Temes", @@ -2236,6 +2238,12 @@ "delivered": "Lliurats", "mistakes": "Errors" } + }, + "sections": { + "backup": "Còpia de seguretat de la configuració", + "backup_description": "Conserveu la configuració entre navegadors i dispositius.", + "fix": "Solucionar problemes", + "fix_description": "Quan una vista sembla antiga o incorrecta, o voleu començar de nou." } }, "sidebar_apps": { diff --git a/locales/cs/common.json b/locales/cs/common.json index e9ff9a0d0..49ac64b08 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -1050,7 +1050,9 @@ "debug": "Ladění", "message_list": "Seznam zpráv", "general": "Obecné", - "organize": "Složky a štítky" + "organize": "Složky a štítky", + "addons": "Doplňky", + "backup": "Záloha a obnovení" }, "themes": { "title": "Motivy", @@ -2229,6 +2231,12 @@ "delivered": "Doručeno", "mistakes": "Chyby" } + }, + "sections": { + "backup": "Záloha nastavení", + "backup_description": "Zachovejte nastavení napříč prohlížeči a zařízeními.", + "fix": "Řešení potíží", + "fix_description": "Když zobrazení vypadá zastarale nebo chybně, nebo chcete začít znovu." } }, "sidebar_apps": { diff --git a/locales/da/common.json b/locales/da/common.json index 98d2fed34..12d8f07cb 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -1053,7 +1053,9 @@ "debug": "Debug", "message_list": "Beskedliste", "general": "Generelt", - "organize": "Mapper og tags" + "organize": "Mapper og tags", + "addons": "Tilføjelser", + "backup": "Sikkerhedskopi og nulstilling" }, "themes": { "title": "Temaer", @@ -2232,6 +2234,12 @@ "delivered": "Leveret", "mistakes": "Fejl" } + }, + "sections": { + "backup": "Sikkerhedskopi af indstillinger", + "backup_description": "Behold dine indstillinger på tværs af browsere og enheder.", + "fix": "Løs problemer", + "fix_description": "Når en visning ser forældet eller forkert ud, eller du vil starte forfra." } }, "sidebar_apps": { diff --git a/locales/de/common.json b/locales/de/common.json index 96d3c8191..4d445f612 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -1050,7 +1050,9 @@ "debug": "Debug", "message_list": "Nachrichtenliste", "general": "Allgemein", - "organize": "Ordner & Tags" + "organize": "Ordner & Tags", + "addons": "Erweiterungen", + "backup": "Sicherung & Zurücksetzen" }, "themes": { "title": "Designs", @@ -2229,6 +2231,12 @@ "delivered": "Zugestellt", "mistakes": "Fehler" } + }, + "sections": { + "backup": "Einstellungen sichern", + "backup_description": "Ihre Einstellungen über Browser und Geräte hinweg behalten.", + "fix": "Probleme beheben", + "fix_description": "Wenn eine Ansicht veraltet oder falsch aussieht oder Sie neu anfangen möchten." } }, "sidebar_apps": { diff --git a/locales/en/common.json b/locales/en/common.json index c8604db7d..b73077b3c 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -1053,7 +1053,9 @@ "debug": "Debug", "message_list": "Message list", "general": "General", - "organize": "Folders & tags" + "organize": "Folders & tags", + "addons": "Add-ons", + "backup": "Backup & reset" }, "themes": { "title": "Themes", @@ -2236,6 +2238,12 @@ "delivered": "Delivered", "mistakes": "Mistakes" } + }, + "sections": { + "backup": "Settings backup", + "backup_description": "Keep your settings across browsers and devices.", + "fix": "Fix problems", + "fix_description": "When a view looks stale or wrong, or you want to start over." } }, "sidebar_apps": { diff --git a/locales/es/common.json b/locales/es/common.json index 5bdf444f8..90b465a50 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -1050,7 +1050,9 @@ "debug": "Depuración", "message_list": "Lista de mensajes", "general": "General", - "organize": "Carpetas y etiquetas" + "organize": "Carpetas y etiquetas", + "addons": "Complementos", + "backup": "Copia de seguridad y restablecer" }, "themes": { "title": "Temas", @@ -2229,6 +2231,12 @@ "delivered": "Entregados", "mistakes": "Errores" } + }, + "sections": { + "backup": "Copia de seguridad de los ajustes", + "backup_description": "Conserve sus ajustes entre navegadores y dispositivos.", + "fix": "Solucionar problemas", + "fix_description": "Cuando una vista parece desactualizada o incorrecta, o quiere empezar de cero." } }, "sidebar_apps": { diff --git a/locales/et/common.json b/locales/et/common.json index 0abe3a888..3cba3293d 100644 --- a/locales/et/common.json +++ b/locales/et/common.json @@ -1053,7 +1053,9 @@ "debug": "Silumine", "message_list": "Kirjade loend", "general": "Üldine", - "organize": "Kaustad ja sildid" + "organize": "Kaustad ja sildid", + "addons": "Lisad", + "backup": "Varundus ja lähtestamine" }, "themes": { "title": "Teemad", @@ -2236,6 +2238,12 @@ "delivered": "Kohale jõudnud", "mistakes": "Vead" } + }, + "sections": { + "backup": "Seadete varundus", + "backup_description": "Säilita oma seaded brauserite ja seadmete vahel.", + "fix": "Probleemide lahendamine", + "fix_description": "Kui vaade tundub aegunud või vale või soovid otsast alustada." } }, "sidebar_apps": { diff --git a/locales/fa/common.json b/locales/fa/common.json index 191747ccd..7f7cc8f53 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -1053,7 +1053,9 @@ "debug": "اشکال‌زدایی", "message_list": "فهرست پیام‌ها", "general": "عمومی", - "organize": "پوشه‌ها و برچسب‌ها" + "organize": "پوشه‌ها و برچسب‌ها", + "addons": "افزونه‌ها", + "backup": "پشتیبان‌گیری و بازنشانی" }, "themes": { "title": "پوسته‌ها", @@ -2236,6 +2238,12 @@ "delivered": "تحویل‌شده", "mistakes": "اشتباه‌ها" } + }, + "sections": { + "backup": "پشتیبان تنظیمات", + "backup_description": "تنظیمات خود را در مرورگرها و دستگاه‌های مختلف حفظ کنید.", + "fix": "رفع مشکلات", + "fix_description": "وقتی نمایی قدیمی یا نادرست به نظر می‌رسد یا می‌خواهید از نو شروع کنید." } }, "sidebar_apps": { diff --git a/locales/fr/common.json b/locales/fr/common.json index 6cb0e704f..c6b81bf20 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -1050,7 +1050,9 @@ "debug": "Débogage", "message_list": "Liste des messages", "general": "Général", - "organize": "Dossiers et étiquettes" + "organize": "Dossiers et étiquettes", + "addons": "Extensions", + "backup": "Sauvegarde et réinitialisation" }, "themes": { "title": "Thèmes", @@ -2229,6 +2231,12 @@ "delivered": "Distribués", "mistakes": "Erreurs" } + }, + "sections": { + "backup": "Sauvegarde des paramètres", + "backup_description": "Conservez vos paramètres d'un navigateur et d'un appareil à l'autre.", + "fix": "Résoudre les problèmes", + "fix_description": "Quand une vue semble obsolète ou incorrecte, ou pour repartir de zéro." } }, "sidebar_apps": { diff --git a/locales/he/common.json b/locales/he/common.json index ac47ba34f..afb8b04fd 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -1015,7 +1015,9 @@ "debug": "ניפוי שגיאות", "message_list": "רשימת הודעות", "general": "כללי", - "organize": "תיקיות ותגיות" + "organize": "תיקיות ותגיות", + "addons": "תוספים", + "backup": "גיבוי ואיפוס" }, "themes": { "title": "ערכות נושא", @@ -2195,6 +2197,12 @@ "show_avatars_in_junk": { "label": "הצג אווטרים בתיקייה זבל", "description": "הצג תמונות פרופיל וייקוני אתרים עבור שולחים בתיקייה זבל. מושבת כברירת מחדל כדי להימנע מהענקת לגיטימציה חזותית לניסיונות דיוג." + }, + "sections": { + "backup": "גיבוי הגדרות", + "backup_description": "שמירת ההגדרות שלך בין דפדפנים ומכשירים.", + "fix": "פתרון בעיות", + "fix_description": "כשתצוגה נראית מיושנת או שגויה, או כשרוצים להתחיל מחדש." } }, "sidebar_apps": { diff --git a/locales/hu/common.json b/locales/hu/common.json index 6fe2bc709..6e0defbc9 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -1053,7 +1053,9 @@ "debug": "Hibakeresés", "message_list": "Üzenetlista", "general": "Általános", - "organize": "Mappák és címkék" + "organize": "Mappák és címkék", + "addons": "Bővítmények", + "backup": "Biztonsági mentés és visszaállítás" }, "themes": { "title": "Témák", @@ -2232,6 +2234,12 @@ "delivered": "Kézbesítve", "mistakes": "Hibák" } + }, + "sections": { + "backup": "Beállítások mentése", + "backup_description": "Őrizze meg beállításait böngészők és eszközök között.", + "fix": "Hibák elhárítása", + "fix_description": "Ha egy nézet elavultnak vagy hibásnak tűnik, vagy elölről szeretné kezdeni." } }, "sidebar_apps": { diff --git a/locales/it/common.json b/locales/it/common.json index c06b71db6..becf32561 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -1050,7 +1050,9 @@ "debug": "Debug", "message_list": "Elenco messaggi", "general": "Generale", - "organize": "Cartelle ed etichette" + "organize": "Cartelle ed etichette", + "addons": "Componenti aggiuntivi", + "backup": "Backup e ripristino" }, "themes": { "title": "Temi", @@ -2229,6 +2231,12 @@ "delivered": "Consegnati", "mistakes": "Errori" } + }, + "sections": { + "backup": "Backup delle impostazioni", + "backup_description": "Conserva le impostazioni tra browser e dispositivi.", + "fix": "Risolvere i problemi", + "fix_description": "Quando una vista sembra obsoleta o sbagliata, o vuoi ricominciare da capo." } }, "sidebar_apps": { diff --git a/locales/ja/common.json b/locales/ja/common.json index 58bd9e65c..c2f1dcc45 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -1050,7 +1050,9 @@ "debug": "デバッグ", "message_list": "メッセージ一覧", "general": "一般", - "organize": "フォルダーとタグ" + "organize": "フォルダーとタグ", + "addons": "アドオン", + "backup": "バックアップとリセット" }, "themes": { "title": "テーマ", @@ -2229,6 +2231,12 @@ "delivered": "配信", "mistakes": "ミス" } + }, + "sections": { + "backup": "設定のバックアップ", + "backup_description": "ブラウザーやデバイスをまたいで設定を保持します。", + "fix": "問題の解決", + "fix_description": "表示が古い、または正しくないとき、あるいは最初からやり直したいときに。" } }, "sidebar_apps": { diff --git a/locales/ko/common.json b/locales/ko/common.json index 7b8987298..6ad0caa4f 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -1050,7 +1050,9 @@ "debug": "디버그", "message_list": "메시지 목록", "general": "일반", - "organize": "폴더 및 태그" + "organize": "폴더 및 태그", + "addons": "추가 기능", + "backup": "백업 및 초기화" }, "themes": { "title": "테마", @@ -2229,6 +2231,12 @@ "delivered": "배달", "mistakes": "실수" } + }, + "sections": { + "backup": "설정 백업", + "backup_description": "브라우저와 기기 간에 설정을 유지합니다.", + "fix": "문제 해결", + "fix_description": "보기가 오래되었거나 잘못되었을 때, 또는 처음부터 다시 시작하고 싶을 때." } }, "sidebar_apps": { diff --git a/locales/lv/common.json b/locales/lv/common.json index dd6cac2d4..29532b607 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -1050,7 +1050,9 @@ "debug": "Atkļūdošana", "message_list": "Ziņu saraksts", "general": "Vispārīgi", - "organize": "Mapes un tagi" + "organize": "Mapes un tagi", + "addons": "Papildinājumi", + "backup": "Dublēšana un atiestatīšana" }, "themes": { "title": "Tēmas", @@ -2229,6 +2231,12 @@ "delivered": "Piegādātas", "mistakes": "Kļūdas" } + }, + "sections": { + "backup": "Iestatījumu dublējums", + "backup_description": "Saglabājiet iestatījumus dažādās pārlūkprogrammās un ierīcēs.", + "fix": "Problēmu novēršana", + "fix_description": "Ja skats izskatās novecojis vai nepareizs, vai vēlaties sākt no jauna." } }, "sidebar_apps": { diff --git a/locales/mn/common.json b/locales/mn/common.json index 730373b07..15e61132d 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -1053,7 +1053,9 @@ "debug": "Дабаглах", "message_list": "Мессежийн жагсаалт", "general": "Ерөнхий", - "organize": "Хавтас ба шошго" + "organize": "Хавтас ба шошго", + "addons": "Нэмэлтүүд", + "backup": "Нөөцлөлт ба дахин тохируулах" }, "themes": { "title": "Сэдэв", @@ -2236,6 +2238,12 @@ "delivered": "Хүргэсэн", "mistakes": "Алдаа" } + }, + "sections": { + "backup": "Тохиргооны нөөцлөлт", + "backup_description": "Хөтөч болон төхөөрөмж хооронд тохиргоогоо хадгална.", + "fix": "Асуудал засах", + "fix_description": "Харагдац хуучирсан эсвэл буруу харагдах, эсвэл шинээр эхлэхийг хүсвэл." } }, "sidebar_apps": { diff --git a/locales/nb/common.json b/locales/nb/common.json index 14a04b4a1..afc02dac1 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -1053,7 +1053,9 @@ "debug": "Feilsøking", "message_list": "Meldingsliste", "general": "Generelt", - "organize": "Mapper og etiketter" + "organize": "Mapper og etiketter", + "addons": "Tillegg", + "backup": "Sikkerhetskopi og tilbakestilling" }, "themes": { "title": "Temaer", @@ -2236,6 +2238,12 @@ "delivered": "Levert", "mistakes": "Feil" } + }, + "sections": { + "backup": "Sikkerhetskopi av innstillinger", + "backup_description": "Behold innstillingene dine på tvers av nettlesere og enheter.", + "fix": "Løs problemer", + "fix_description": "Når en visning ser utdatert eller feil ut, eller du vil starte på nytt." } }, "sidebar_apps": { diff --git a/locales/nl/common.json b/locales/nl/common.json index 4c9aef26b..6cadbd498 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -1050,7 +1050,9 @@ "debug": "Debuggen", "message_list": "Berichtenlijst", "general": "Algemeen", - "organize": "Mappen en tags" + "organize": "Mappen en tags", + "addons": "Add-ons", + "backup": "Back-up en herstel" }, "themes": { "title": "Thema's", @@ -2229,6 +2231,12 @@ "delivered": "Bezorgd", "mistakes": "Fouten" } + }, + "sections": { + "backup": "Back-up van instellingen", + "backup_description": "Bewaar uw instellingen over browsers en apparaten heen.", + "fix": "Problemen oplossen", + "fix_description": "Als een weergave verouderd of onjuist lijkt, of u opnieuw wilt beginnen." } }, "sidebar_apps": { diff --git a/locales/pl/common.json b/locales/pl/common.json index a67ec5ca1..5c16a314f 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -1050,7 +1050,9 @@ "debug": "Debugowanie", "message_list": "Lista wiadomości", "general": "Ogólne", - "organize": "Foldery i tagi" + "organize": "Foldery i tagi", + "addons": "Dodatki", + "backup": "Kopia zapasowa i reset" }, "themes": { "title": "Motywy", @@ -2229,6 +2231,12 @@ "delivered": "Dostarczone", "mistakes": "Błędy" } + }, + "sections": { + "backup": "Kopia zapasowa ustawień", + "backup_description": "Zachowaj ustawienia w różnych przeglądarkach i na różnych urządzeniach.", + "fix": "Rozwiązywanie problemów", + "fix_description": "Gdy widok wygląda na nieaktualny lub błędny albo chcesz zacząć od nowa." } }, "sidebar_apps": { diff --git a/locales/pt/common.json b/locales/pt/common.json index 337406201..1a0d2ca13 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -1050,7 +1050,9 @@ "debug": "Depuração", "message_list": "Lista de mensagens", "general": "Geral", - "organize": "Pastas e etiquetas" + "organize": "Pastas e etiquetas", + "addons": "Extras", + "backup": "Cópia de segurança e reposição" }, "themes": { "title": "Temas", @@ -2229,6 +2231,12 @@ "delivered": "Entregues", "mistakes": "Erros" } + }, + "sections": { + "backup": "Cópia de segurança das definições", + "backup_description": "Mantenha as suas definições entre navegadores e dispositivos.", + "fix": "Resolver problemas", + "fix_description": "Quando uma vista parece desatualizada ou errada, ou quer recomeçar." } }, "sidebar_apps": { diff --git a/locales/ro/common.json b/locales/ro/common.json index 013630858..d462fad0f 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -1053,7 +1053,9 @@ "debug": "Depanare", "message_list": "Lista de mesaje", "general": "General", - "organize": "Dosare și etichete" + "organize": "Dosare și etichete", + "addons": "Suplimente", + "backup": "Copie de rezervă și resetare" }, "themes": { "title": "Teme", @@ -2236,6 +2238,12 @@ "delivered": "Livrate", "mistakes": "Greșeli" } + }, + "sections": { + "backup": "Copie de rezervă a setărilor", + "backup_description": "Păstrați-vă setările între browsere și dispozitive.", + "fix": "Rezolvarea problemelor", + "fix_description": "Când o vizualizare pare învechită sau greșită, sau vreți să o luați de la capăt." } }, "sidebar_apps": { diff --git a/locales/ru/common.json b/locales/ru/common.json index 3e8b4e241..1e879f706 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -1050,7 +1050,9 @@ "debug": "Отладка", "message_list": "Список писем", "general": "Общие", - "organize": "Папки и метки" + "organize": "Папки и метки", + "addons": "Дополнения", + "backup": "Резервная копия и сброс" }, "themes": { "title": "Темы", @@ -2229,6 +2231,12 @@ "delivered": "Доставлено", "mistakes": "Ошибки" } + }, + "sections": { + "backup": "Резервная копия настроек", + "backup_description": "Сохраняйте настройки в разных браузерах и на разных устройствах.", + "fix": "Устранение проблем", + "fix_description": "Если данные выглядят устаревшими или неверными, или вы хотите начать заново." } }, "sidebar_apps": { diff --git a/locales/sk/common.json b/locales/sk/common.json index a912b1047..00fac14ce 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -1053,7 +1053,9 @@ "debug": "Ladenie", "message_list": "Zoznam správ", "general": "Všeobecné", - "organize": "Priečinky a štítky" + "organize": "Priečinky a štítky", + "addons": "Doplnky", + "backup": "Záloha a obnovenie" }, "themes": { "title": "Motívy", @@ -2236,6 +2238,12 @@ "delivered": "Doručené", "mistakes": "Chyby" } + }, + "sections": { + "backup": "Záloha nastavení", + "backup_description": "Zachovajte nastavenia naprieč prehliadačmi a zariadeniami.", + "fix": "Riešenie problémov", + "fix_description": "Keď zobrazenie vyzerá zastarano alebo chybne, alebo chcete začať odznova." } }, "sidebar_apps": { diff --git a/locales/tr/common.json b/locales/tr/common.json index 11f7fefbd..c58aafd33 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -1050,7 +1050,9 @@ "debug": "Hata Ayıklama", "message_list": "İleti listesi", "general": "Genel", - "organize": "Klasörler ve etiketler" + "organize": "Klasörler ve etiketler", + "addons": "Eklentiler", + "backup": "Yedekleme ve sıfırlama" }, "themes": { "title": "Temalar", @@ -2229,6 +2231,12 @@ "delivered": "Teslim edilen", "mistakes": "Hatalar" } + }, + "sections": { + "backup": "Ayar yedeği", + "backup_description": "Ayarlarınızı tarayıcılar ve cihazlar arasında koruyun.", + "fix": "Sorunları giderme", + "fix_description": "Bir görünüm eski ya da yanlış göründüğünde ya da baştan başlamak istediğinizde." } }, "sidebar_apps": { diff --git a/locales/uk/common.json b/locales/uk/common.json index 1290dafb1..9b48c841b 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -1050,7 +1050,9 @@ "debug": "Налагодження", "message_list": "Список листів", "general": "Загальні", - "organize": "Теки та мітки" + "organize": "Теки та мітки", + "addons": "Додатки", + "backup": "Резервна копія та скидання" }, "themes": { "title": "Теми", @@ -2229,6 +2231,12 @@ "delivered": "Доставлено", "mistakes": "Помилки" } + }, + "sections": { + "backup": "Резервна копія налаштувань", + "backup_description": "Зберігайте налаштування в різних браузерах і на різних пристроях.", + "fix": "Усунення проблем", + "fix_description": "Якщо дані виглядають застарілими чи неправильними, або ви хочете почати спочатку." } }, "sidebar_apps": { diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 94882c399..9ada05e44 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -1053,7 +1053,9 @@ "debug": "除錯", "message_list": "郵件清單", "general": "一般", - "organize": "資料夾與標籤" + "organize": "資料夾與標籤", + "addons": "附加元件", + "backup": "備份與重設" }, "themes": { "title": "主題", @@ -2236,6 +2238,12 @@ "delivered": "已送達", "mistakes": "失誤" } + }, + "sections": { + "backup": "設定備份", + "backup_description": "在瀏覽器與裝置之間保留您的設定。", + "fix": "修正問題", + "fix_description": "當檢視看起來過時或有誤,或者您想重新開始時。" } }, "sidebar_apps": { diff --git a/locales/zh/common.json b/locales/zh/common.json index 6a2055835..60cf3d402 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -1050,7 +1050,9 @@ "debug": "调试", "message_list": "邮件列表", "general": "常规", - "organize": "文件夹与标签" + "organize": "文件夹与标签", + "addons": "附加组件", + "backup": "备份与重置" }, "themes": { "title": "主题", @@ -2229,6 +2231,12 @@ "delivered": "已送达", "mistakes": "失误" } + }, + "sections": { + "backup": "设置备份", + "backup_description": "在浏览器和设备之间保留您的设置。", + "fix": "修复问题", + "fix_description": "当视图看起来过时或有误,或者您想重新开始时。" } }, "sidebar_apps": {