refactor: fold the layout and themes tabs into appearance as sections

This commit is contained in:
Linus Rath
2026-10-19 17:33:39 +02:00
parent 988416aa3d
commit 1025c1973d
36 changed files with 1018 additions and 323 deletions
+110 -90
View File
@@ -4,6 +4,8 @@ import { useTranslations } from 'next-intl';
import { useThemeStore } from '@/stores/theme-store';
import { useSettingsStore, type Density } from '@/stores/settings-store';
import { SettingsSection, SettingItem, RadioGroup, ToggleSwitch } from './settings-section';
import { ThemesSettings } from './themes-settings';
import { LayoutSection, SidebarSection, MultipleAccountsSection, ExperimentalSection } from './layout-settings';
import { cn } from '@/lib/utils';
import { useTour } from '@/components/tour/tour-provider';
import { Button } from '@/components/ui/button';
@@ -66,6 +68,11 @@ function DensityPreview({ density }: { density: Density }) {
);
}
/**
* The Appearance page: theme, text and motion, layout, sidebar, how several
* accounts show together, and the experimental Pro interface. The former
* Layout and Themes tabs live here as sections.
*/
export function AppearanceSettings() {
const t = useTranslations('settings.appearance');
const tAdvanced = useTranslations('settings.advanced');
@@ -74,108 +81,121 @@ export function AppearanceSettings() {
const { fontSize, density, animationsEnabled, senderFavicons, showAvatarsInJunk, showOnboardingOnNewDevices, updateSetting } = useSettingsStore();
const { startTour, resetTourCompletion } = useTour();
const refreshFavicons = useFaviconRefreshStore((s) => s.refresh);
const { isSettingLocked, isSettingHidden, getColorModePolicy } = usePolicyStore();
const { isSettingLocked, isSettingHidden, getColorModePolicy, isFeatureEnabled } = usePolicyStore();
return (
<SettingsSection title={t('title')} description={t('description')}>
<SettingItem label={t('theme.label')} description={t('theme.description')} locked={getColorModePolicy().locked}>
<RadioGroup
value={theme}
onChange={(value) => setTheme(value as 'light' | 'dark' | 'system')}
options={[
{ value: 'light', label: t('theme.light') },
{ value: 'dark', label: t('theme.dark') },
{ value: 'system', label: t('theme.system') },
]}
/>
</SettingItem>
{!isSettingHidden('fontSize') && (
<SettingItem label={t('font_size.label')} description={t('font_size.description')} locked={isSettingLocked('fontSize')}>
<RadioGroup
value={fontSize}
onChange={(value) => updateSetting('fontSize', value as 'small' | 'medium' | 'large')}
options={[
{ value: 'small', label: t('font_size.small') },
{ value: 'medium', label: t('font_size.medium') },
{ value: 'large', label: t('font_size.large') },
]}
/>
</SettingItem>
)}
{!isSettingHidden('density') && (
<SettingItem label={t('list_density.label')} description={t('list_density.description')} locked={isSettingLocked('density')}>
<RadioGroup
value={density}
onChange={(value) =>
updateSetting('density', value as Density)
}
options={[
{ value: 'extra-compact', label: t('list_density.extra_compact') },
{ value: 'compact', label: t('list_density.compact') },
{ value: 'regular', label: t('list_density.regular') },
{ value: 'comfortable', label: t('list_density.comfortable') },
]}
/>
<DensityPreview density={density} />
</SettingItem>
)}
<MessageListOrderSettings />
{!isSettingHidden('animationsEnabled') && (
<SettingItem label={t('animations.label')} description={t('animations.description')} locked={isSettingLocked('animationsEnabled')}>
<ToggleSwitch
checked={animationsEnabled}
onChange={(checked) => updateSetting('animationsEnabled', checked)}
/>
</SettingItem>
)}
{/* Sender favicons come from the /api/favicon proxy, absent in the static Lite build (components/ui/avatar.tsx). */}
{!IS_LITE && (
<SettingItem label={tAdvanced('sender_favicons.label')} description={tAdvanced('sender_favicons.description')}>
<ToggleSwitch checked={senderFavicons} onChange={(checked) => updateSetting('senderFavicons', checked)} />
<div className="space-y-8">
<SettingsSection id="theme" title={t('title')} description={t('description')}>
<SettingItem label={t('theme.label')} description={t('theme.description')} locked={getColorModePolicy().locked}>
<RadioGroup
value={theme}
onChange={(value) => setTheme(value as 'light' | 'dark' | 'system')}
options={[
{ value: 'light', label: t('theme.light') },
{ value: 'dark', label: t('theme.dark') },
{ value: 'system', label: t('theme.system') },
]}
/>
</SettingItem>
)}
{isFeatureEnabled('themesEnabled') && <ThemesSettings embedded />}
</SettingsSection>
{!IS_LITE && senderFavicons && (
<SettingItem label={tAdvanced('sender_favicons.refresh_label')} description={tAdvanced('sender_favicons.refresh_description')}>
<SettingsSection id="text" title={t('sections.text')}>
{!isSettingHidden('fontSize') && (
<SettingItem label={t('font_size.label')} description={t('font_size.description')} locked={isSettingLocked('fontSize')}>
<RadioGroup
value={fontSize}
onChange={(value) => updateSetting('fontSize', value as 'small' | 'medium' | 'large')}
options={[
{ value: 'small', label: t('font_size.small') },
{ value: 'medium', label: t('font_size.medium') },
{ value: 'large', label: t('font_size.large') },
]}
/>
</SettingItem>
)}
{!isSettingHidden('density') && (
<SettingItem label={t('list_density.label')} description={t('list_density.description')} locked={isSettingLocked('density')}>
<RadioGroup
value={density}
onChange={(value) =>
updateSetting('density', value as Density)
}
options={[
{ value: 'extra-compact', label: t('list_density.extra_compact') },
{ value: 'compact', label: t('list_density.compact') },
{ value: 'regular', label: t('list_density.regular') },
{ value: 'comfortable', label: t('list_density.comfortable') },
]}
/>
<DensityPreview density={density} />
</SettingItem>
)}
{!isSettingHidden('animationsEnabled') && (
<SettingItem label={t('animations.label')} description={t('animations.description')} locked={isSettingLocked('animationsEnabled')}>
<ToggleSwitch
checked={animationsEnabled}
onChange={(checked) => updateSetting('animationsEnabled', checked)}
/>
</SettingItem>
)}
<MessageListOrderSettings />
{/* Sender favicons come from the /api/favicon proxy, absent in the static Lite build (components/ui/avatar.tsx). */}
{!IS_LITE && (
<SettingItem label={tAdvanced('sender_favicons.label')} description={tAdvanced('sender_favicons.description')}>
<ToggleSwitch checked={senderFavicons} onChange={(checked) => updateSetting('senderFavicons', checked)} />
</SettingItem>
)}
{!IS_LITE && senderFavicons && (
<SettingItem nested label={tAdvanced('sender_favicons.refresh_label')} description={tAdvanced('sender_favicons.refresh_description')}>
<Button
variant="outline"
size="sm"
onClick={() => { refreshFavicons(); toast.success(tAdvanced('sender_favicons.refresh_done')); }}
className="text-xs h-7"
>
<RefreshCw className="w-3.5 h-3.5 me-1" />
{tAdvanced('sender_favicons.refresh_button')}
</Button>
</SettingItem>
)}
<SettingItem label={tAdvanced('show_avatars_in_junk.label')} description={tAdvanced('show_avatars_in_junk.description')} advanced>
<ToggleSwitch checked={showAvatarsInJunk} onChange={(checked) => updateSetting('showAvatarsInJunk', checked)} />
</SettingItem>
</SettingsSection>
<LayoutSection />
<SidebarSection />
<MultipleAccountsSection />
<SettingsSection id="tour" title={tTour('settings_section')}>
<SettingItem label={tTour('restart_title')} description={tTour('restart_desc')}>
<Button
variant="outline"
size="sm"
onClick={() => { refreshFavicons(); toast.success(tAdvanced('sender_favicons.refresh_done')); }}
onClick={() => { resetTourCompletion(); startTour(); }}
className="text-xs h-7"
>
<RefreshCw className="w-3.5 h-3.5 me-1" />
{tAdvanced('sender_favicons.refresh_button')}
<PlayCircle className="w-3.5 h-3.5 me-1" />
{tTour('restart_button')}
</Button>
</SettingItem>
)}
<SettingItem label={tAdvanced('show_avatars_in_junk.label')} description={tAdvanced('show_avatars_in_junk.description')}>
<ToggleSwitch checked={showAvatarsInJunk} onChange={(checked) => updateSetting('showAvatarsInJunk', checked)} />
</SettingItem>
<SettingItem label={tTour('show_on_new_devices_title')} description={tTour('show_on_new_devices_desc')} advanced>
<ToggleSwitch
checked={showOnboardingOnNewDevices}
onChange={(checked) => updateSetting('showOnboardingOnNewDevices', checked)}
/>
</SettingItem>
</SettingsSection>
<SettingItem label={tTour('restart_title')} description={tTour('restart_desc')}>
<Button
variant="outline"
size="sm"
onClick={() => { resetTourCompletion(); startTour(); }}
className="text-xs h-7"
>
<PlayCircle className="w-3.5 h-3.5 me-1" />
{tTour('restart_button')}
</Button>
</SettingItem>
<SettingItem label={tTour('show_on_new_devices_title')} description={tTour('show_on_new_devices_desc')}>
<ToggleSwitch
checked={showOnboardingOnNewDevices}
onChange={(checked) => updateSetting('showOnboardingOnNewDevices', checked)}
/>
</SettingItem>
</SettingsSection>
<ExperimentalSection />
</div>
);
}
+206 -166
View File
@@ -116,73 +116,21 @@ function MailLayoutPreview({
);
}
export function LayoutSettings() {
/**
* The Appearance page's Layout section: where the interface, the reading
* pane and the toolbars sit.
*/
export function LayoutSection() {
const t = useTranslations('settings.appearance');
const tEmail = useTranslations('settings.email_behavior');
const { toolbarPosition, showToolbarLabels, hideAccountSwitcher, showRailAccountList, enableUnifiedMailbox, includeGroupInUnified, unifiedCrossAccount, allMailFolderIds, enableCrossUnreadView, enableCrossStarredView, enableCrossAllView, colorfulSidebarIcons, tintListRowsByTag, tintListRowsByAccount, showAccountDot, showFolderTotalCount, faviconUnreadBadge, mailLayout, listColumns, proInterface, interfaceLayout, updateSetting } = useSettingsStore();
const { isSettingLocked, isSettingHidden, isFeatureEnabled } = usePolicyStore();
const accounts = useAccountStore(s => s.accounts);
const activeAccountId = useAccountStore(s => s.activeAccountId);
const mailboxes = useEmailStore(s => s.mailboxes);
const hasGroupInboxes = useMemo(() => mailboxes.some(m => m.isShared), [mailboxes]);
const showSharedMailAccounts = useSettingsStore(s => s.showSharedMailAccounts);
const hiddenSharedMailAccounts = useSettingsStore(s => s.hiddenSharedMailAccounts);
const hiddenSharedIds = hiddenSharedMailIds(hiddenSharedMailAccounts, activeAccountId);
const sharedMailAccounts = useMemo(() => {
const byId = new Map<string, string>();
for (const m of mailboxes) {
if (m.isShared && m.accountId && !byId.has(m.accountId)) byId.set(m.accountId, m.accountName || m.accountId);
}
return Array.from(byId, ([id, name]) => ({ id, name }));
}, [mailboxes]);
const connectedAccountCount = useMemo(() => accounts.filter(a => a.isConnected).length, [accounts]);
const unifiedCrossAccountAllowed = isFeatureEnabled('unifiedCrossAccountEnabled');
// Unified Mailbox entries (All mail / Unread / Starred), each gated independently
// by the admin. Scope (single account vs. cross-account) is governed by
// `unifiedCrossAccount`; the folder picker below narrows which own folders feed them.
const crossViews = [
{ setting: 'enableCrossUnreadView', value: enableCrossUnreadView, allowed: isFeatureEnabled('crossUnreadViewEnabled'), labelKey: 'cross_unread.label', descKey: 'cross_unread.description' },
{ setting: 'enableCrossStarredView', value: enableCrossStarredView, allowed: isFeatureEnabled('crossStarredViewEnabled'), labelKey: 'cross_starred.label', descKey: 'cross_starred.description' },
{ setting: 'enableCrossAllView', value: enableCrossAllView, allowed: isFeatureEnabled('crossAllViewEnabled'), labelKey: 'cross_all.label', descKey: 'cross_all.description' },
] as const;
// The folder picker narrows the own folders included in the entries above; show
// it once the user has enabled at least one of them.
const anyCrossEnabled = enableCrossUnreadView || enableCrossStarredView || enableCrossAllView;
const anyCrossAllowed = crossViews.some(c => c.allowed);
// Own (non-shared) folders and the active account's All Mail selection. The
// selection is per account: a missing entry = never configured, which
// defaults to all no-role folders; an explicit [] = no folders.
const ownMailboxes = useMemo(() => mailboxes.filter(m => !m.isShared), [mailboxes]);
const currentAllMailEntry = activeAccountId ? allMailFolderIds[activeAccountId] : undefined;
const allMailSelected = new Set(
currentAllMailEntry === undefined
? ownMailboxes.filter(m => !m.role).map(m => m.id)
: currentAllMailEntry
);
const toggleAllMailFolder = (id: string) => {
if (!activeAccountId) return;
const next = new Set(allMailSelected);
if (next.has(id)) next.delete(id);
else next.add(id);
updateSetting('allMailFolderIds', {
...allMailFolderIds,
[activeAccountId]: ownMailboxes.filter(m => next.has(m.id)).map(m => m.id),
});
};
// Name the account the selection applies to, but only when more than one is
// logged in (otherwise it's unambiguous).
const activeAccount = accounts.find(a => a.id === activeAccountId);
const allMailAccountHint = accounts.length > 1 && activeAccount
? t('all_mail.account_hint', { account: activeAccount.displayName || activeAccount.email })
: null;
const { toolbarPosition, showToolbarLabels, mailLayout, listColumns, interfaceLayout, updateSetting } = useSettingsStore();
const { isSettingLocked, isSettingHidden } = usePolicyStore();
const mountainView = interfaceLayout === 'mountain-view';
return (
<SettingsSection title={t('title')} description={t('description')}>
<SettingsSection id="layout" title={t('sections.layout')}>
{/* The interface layout decides where search, navigation and toolbars
go - a layout choice, so it leads the Layout tab. */}
go - a layout choice, so it leads the section. */}
{!isSettingHidden('interfaceLayout') && (
<SettingItem label={t('interface_layout.label')} description={t('interface_layout.description')} locked={isSettingLocked('interfaceLayout')}>
<RadioGroup
@@ -243,21 +191,19 @@ export function LayoutSettings() {
/>
</SettingItem>
)}
</SettingsSection>
);
}
<SettingItem label={t('hide_account_switcher.label')} description={t('hide_account_switcher.description')}>
<ToggleSwitch
checked={hideAccountSwitcher}
onChange={(checked) => updateSetting('hideAccountSwitcher', checked)}
/>
</SettingItem>
<SettingItem label={t('show_rail_account_list.label')} description={t('show_rail_account_list.description')}>
<ToggleSwitch
checked={showRailAccountList}
onChange={(checked) => updateSetting('showRailAccountList', checked)}
/>
</SettingItem>
/** The Appearance page's Sidebar section: what the folder sidebar and rail show. */
export function SidebarSection() {
const t = useTranslations('settings.appearance');
const { hideAccountSwitcher, showRailAccountList, colorfulSidebarIcons, showFolderTotalCount, faviconUnreadBadge, updateSetting } = useSettingsStore();
const accounts = useAccountStore(s => s.accounts);
const multiAccount = accounts.length > 1;
return (
<SettingsSection id="sidebar" title={t('sections.sidebar')}>
<SettingItem label={t('colorful_sidebar_icons.label')} description={t('colorful_sidebar_icons.description')}>
<ToggleSwitch
checked={colorfulSidebarIcons}
@@ -265,27 +211,6 @@ export function LayoutSettings() {
/>
</SettingItem>
<SettingItem label={t('tint_list_rows.label')} description={t('tint_list_rows.description')}>
<ToggleSwitch
checked={tintListRowsByTag}
onChange={(checked) => updateSetting('tintListRowsByTag', checked)}
/>
</SettingItem>
<SettingItem label={t('show_account_dot.label')} description={t('show_account_dot.description')}>
<ToggleSwitch
checked={showAccountDot}
onChange={(checked) => updateSetting('showAccountDot', checked)}
/>
</SettingItem>
<SettingItem label={t('tint_list_rows_by_account.label')} description={t('tint_list_rows_by_account.description')}>
<ToggleSwitch
checked={tintListRowsByAccount}
onChange={(checked) => updateSetting('tintListRowsByAccount', checked)}
/>
</SettingItem>
<SettingItem label={t('show_folder_total_count.label')} description={t('show_folder_total_count.description')}>
<ToggleSwitch
checked={showFolderTotalCount}
@@ -293,42 +218,106 @@ export function LayoutSettings() {
/>
</SettingItem>
{/* The account switcher and the rail avatars only mean something with
a second account; a single-account user never sees either. */}
{multiAccount && (
<SettingItem label={t('hide_account_switcher.label')} description={t('hide_account_switcher.description')}>
<ToggleSwitch
checked={hideAccountSwitcher}
onChange={(checked) => updateSetting('hideAccountSwitcher', checked)}
/>
</SettingItem>
)}
{multiAccount && (
<SettingItem label={t('show_rail_account_list.label')} description={t('show_rail_account_list.description')}>
<ToggleSwitch
checked={showRailAccountList}
onChange={(checked) => updateSetting('showRailAccountList', checked)}
/>
</SettingItem>
)}
<SettingItem label={t('favicon_unread_badge.label')} description={t('favicon_unread_badge.description')}>
<ToggleSwitch
checked={faviconUnreadBadge}
onChange={(checked) => updateSetting('faviconUnreadBadge', checked)}
/>
</SettingItem>
</SettingsSection>
);
}
{sharedMailAccounts.length > 0 && !isSettingHidden('showSharedMailAccounts') && (
<SettingItem
label={t('show_shared_mail_accounts.label')}
description={t('show_shared_mail_accounts.description')}
locked={isSettingLocked('showSharedMailAccounts')}
>
<ToggleSwitch
checked={showSharedMailAccounts}
onChange={(v) => updateSetting('showSharedMailAccounts', v)}
/>
</SettingItem>
)}
/**
* How several accounts and shared mailboxes appear together: the unified
* mailbox and its entries, shared mailboxes, and how rows tell accounts
* apart. Only rendered once there is something to combine.
*/
export function MultipleAccountsSection() {
const t = useTranslations('settings.appearance');
const { enableUnifiedMailbox, includeGroupInUnified, unifiedCrossAccount, allMailFolderIds, enableCrossUnreadView, enableCrossStarredView, enableCrossAllView, tintListRowsByAccount, showAccountDot, updateSetting } = useSettingsStore();
const { isSettingLocked, isSettingHidden, isFeatureEnabled } = usePolicyStore();
const accounts = useAccountStore(s => s.accounts);
const activeAccountId = useAccountStore(s => s.activeAccountId);
const mailboxes = useEmailStore(s => s.mailboxes);
const hasGroupInboxes = useMemo(() => mailboxes.some(m => m.isShared), [mailboxes]);
const showSharedMailAccounts = useSettingsStore(s => s.showSharedMailAccounts);
const hiddenSharedMailAccounts = useSettingsStore(s => s.hiddenSharedMailAccounts);
const hiddenSharedIds = hiddenSharedMailIds(hiddenSharedMailAccounts, activeAccountId);
const sharedMailAccounts = useMemo(() => {
const byId = new Map<string, string>();
for (const m of mailboxes) {
if (m.isShared && m.accountId && !byId.has(m.accountId)) byId.set(m.accountId, m.accountName || m.accountId);
}
return Array.from(byId, ([id, name]) => ({ id, name }));
}, [mailboxes]);
const connectedAccountCount = useMemo(() => accounts.filter(a => a.isConnected).length, [accounts]);
const unifiedCrossAccountAllowed = isFeatureEnabled('unifiedCrossAccountEnabled');
// Unified Mailbox entries (All mail / Unread / Starred), each gated independently
// by the admin. Scope (single account vs. cross-account) is governed by
// unifiedCrossAccount; the folder picker below narrows which own folders feed them.
const crossViews = [
{ setting: 'enableCrossUnreadView', value: enableCrossUnreadView, allowed: isFeatureEnabled('crossUnreadViewEnabled'), labelKey: 'cross_unread.label', descKey: 'cross_unread.description' },
{ setting: 'enableCrossStarredView', value: enableCrossStarredView, allowed: isFeatureEnabled('crossStarredViewEnabled'), labelKey: 'cross_starred.label', descKey: 'cross_starred.description' },
{ setting: 'enableCrossAllView', value: enableCrossAllView, allowed: isFeatureEnabled('crossAllViewEnabled'), labelKey: 'cross_all.label', descKey: 'cross_all.description' },
] as const;
// The folder picker narrows the own folders included in the entries above; show
// it once the user has enabled at least one of them.
const anyCrossEnabled = enableCrossUnreadView || enableCrossStarredView || enableCrossAllView;
const anyCrossAllowed = crossViews.some(c => c.allowed);
{sharedMailAccounts.length > 0 && showSharedMailAccounts && activeAccountId && !isSettingHidden('showSharedMailAccounts') && (
<div className="ms-4 border-s-2 border-border ps-4 -mt-2" data-testid="shared-mail-account-list">
{sharedMailAccounts.map(({ id, name }) => (
<SettingItem key={id} label={name}>
<ToggleSwitch
checked={!hiddenSharedIds.includes(id)}
onChange={(v) => updateSetting(
'hiddenSharedMailAccounts',
setSharedMailAccountHidden(hiddenSharedMailAccounts, activeAccountId, id, !v),
)}
/>
</SettingItem>
))}
</div>
)}
// Own (non-shared) folders and the active account's All Mail selection. The
// selection is per account: a missing entry = never configured, which
// defaults to all no-role folders; an explicit [] = no folders.
const ownMailboxes = useMemo(() => mailboxes.filter(m => !m.isShared), [mailboxes]);
const currentAllMailEntry = activeAccountId ? allMailFolderIds[activeAccountId] : undefined;
const allMailSelected = new Set(
currentAllMailEntry === undefined
? ownMailboxes.filter(m => !m.role).map(m => m.id)
: currentAllMailEntry
);
const toggleAllMailFolder = (id: string) => {
if (!activeAccountId) return;
const next = new Set(allMailSelected);
if (next.has(id)) next.delete(id);
else next.add(id);
updateSetting('allMailFolderIds', {
...allMailFolderIds,
[activeAccountId]: ownMailboxes.filter(m => next.has(m.id)).map(m => m.id),
});
};
// Name the account the selection applies to, but only when more than one is
// logged in (otherwise it's unambiguous).
const activeAccount = accounts.find(a => a.id === activeAccountId);
const allMailAccountHint = accounts.length > 1 && activeAccount
? t('all_mail.account_hint', { account: activeAccount.displayName || activeAccount.email })
: null;
// Nothing to combine: one account, no shared mailboxes, no group inboxes.
if (connectedAccountCount < 2 && sharedMailAccounts.length === 0 && !hasGroupInboxes) return null;
return (
<SettingsSection id="accounts" title={t('sections.accounts')} description={t('sections.accounts_description')}>
{!isSettingHidden('enableUnifiedMailbox') && (
<SettingItem
label={t('unified_mailbox.label')}
@@ -343,59 +332,52 @@ export function LayoutSettings() {
)}
{enableUnifiedMailbox && connectedAccountCount > 1 && unifiedCrossAccountAllowed && !isSettingHidden('unifiedCrossAccount') && (
<div className="ml-4 border-l-2 border-border pl-4 -mt-2">
<SettingItem
label={t('unified_mailbox.cross_account.label')}
description={t('unified_mailbox.cross_account.description')}
locked={isSettingLocked('unifiedCrossAccount')}
>
<ToggleSwitch
checked={unifiedCrossAccount}
onChange={(v) => updateSetting('unifiedCrossAccount', v)}
/>
</SettingItem>
</div>
<SettingItem
nested
label={t('unified_mailbox.cross_account.label')}
description={t('unified_mailbox.cross_account.description')}
locked={isSettingLocked('unifiedCrossAccount')}
>
<ToggleSwitch
checked={unifiedCrossAccount}
onChange={(v) => updateSetting('unifiedCrossAccount', v)}
/>
</SettingItem>
)}
{enableUnifiedMailbox && hasGroupInboxes && !isSettingHidden('includeGroupInUnified') && (
<div className="ms-4 border-s-2 border-border ps-4 -mt-2">
<SettingItem
nested
label={t('unified_mailbox.include_group.label')}
description={t('unified_mailbox.include_group.description')}
locked={isSettingLocked('includeGroupInUnified')}
>
<ToggleSwitch
checked={includeGroupInUnified}
onChange={(v) => updateSetting('includeGroupInUnified', v)}
/>
</SettingItem>
)}
{enableUnifiedMailbox && anyCrossAllowed && crossViews.map(({ setting, value, allowed, labelKey, descKey }) => (
allowed && !isSettingHidden(setting) && (
<SettingItem
label={t('unified_mailbox.include_group.label')}
description={t('unified_mailbox.include_group.description')}
locked={isSettingLocked('includeGroupInUnified')}
key={setting}
nested
label={t(labelKey)}
description={t(descKey)}
locked={isSettingLocked(setting)}
>
<ToggleSwitch
checked={includeGroupInUnified}
onChange={(v) => updateSetting('includeGroupInUnified', v)}
checked={value}
onChange={(v) => updateSetting(setting, v)}
/>
</SettingItem>
</div>
)}
{enableUnifiedMailbox && anyCrossAllowed && (
<div className="ms-4 border-s-2 border-border ps-4 -mt-2 space-y-2">
{crossViews.map(({ setting, value, allowed, labelKey, descKey }) => (
allowed && !isSettingHidden(setting) && (
<SettingItem
key={setting}
label={t(labelKey)}
description={t(descKey)}
locked={isSettingLocked(setting)}
>
<ToggleSwitch
checked={value}
onChange={(v) => updateSetting(setting, v)}
/>
</SettingItem>
)
))}
</div>
)}
)
))}
{enableUnifiedMailbox && anyCrossAllowed && anyCrossEnabled && (
<div className="ms-4 border-s-2 border-border ps-4 -mt-2 space-y-2">
<div className="ms-4 border-s-2 border-border ps-3 space-y-2 py-2">
<div>
<div className="text-sm font-medium text-foreground">{t('all_mail.folders_label')}</div>
<div className="text-xs text-muted-foreground">{t('all_mail.folders_description')}</div>
@@ -434,7 +416,65 @@ export function LayoutSettings() {
</div>
)}
<SettingItem label={t('pro_interface.label')} description={t('pro_interface.description')}>
{/* In unified views a row needs to say which account it came from:
a coloured dot, or the whole row tinted. One choice, not two
toggles that override each other. */}
{connectedAccountCount > 1 && (
<SettingItem label={t('account_marker.label')} description={t('account_marker.description')}>
<RadioGroup
value={tintListRowsByAccount ? 'tint' : showAccountDot ? 'dot' : 'none'}
onChange={(value) => {
updateSetting('tintListRowsByAccount', value === 'tint');
updateSetting('showAccountDot', value === 'dot');
}}
options={[
{ value: 'dot', label: t('account_marker.dot') },
{ value: 'tint', label: t('account_marker.tint') },
{ value: 'none', label: t('account_marker.none') },
]}
/>
</SettingItem>
)}
{sharedMailAccounts.length > 0 && !isSettingHidden('showSharedMailAccounts') && (
<SettingItem
label={t('show_shared_mail_accounts.label')}
description={t('show_shared_mail_accounts.description')}
locked={isSettingLocked('showSharedMailAccounts')}
>
<ToggleSwitch
checked={showSharedMailAccounts}
onChange={(v) => updateSetting('showSharedMailAccounts', v)}
/>
</SettingItem>
)}
{sharedMailAccounts.length > 0 && showSharedMailAccounts && activeAccountId && !isSettingHidden('showSharedMailAccounts') && (
<div data-testid="shared-mail-account-list">
{sharedMailAccounts.map(({ id, name }) => (
<SettingItem key={id} nested label={name}>
<ToggleSwitch
checked={!hiddenSharedIds.includes(id)}
onChange={(v) => updateSetting(
'hiddenSharedMailAccounts',
setSharedMailAccountHidden(hiddenSharedMailAccounts, activeAccountId, id, !v),
)}
/>
</SettingItem>
))}
</div>
)}
</SettingsSection>
);
}
/** Experimental: the Pro interface. Advanced, since it swaps the whole shell. */
export function ExperimentalSection() {
const t = useTranslations('settings.appearance');
const { proInterface, updateSetting } = useSettingsStore();
return (
<SettingsSection id="experimental" title={t('sections.experimental')} advanced>
<SettingItem label={t('pro_interface.label')} description={t('pro_interface.description')} advanced>
<ToggleSwitch
checked={proInterface}
onChange={(v) => updateSetting('proInterface', v)}
+10 -15
View File
@@ -24,7 +24,6 @@ import {
PanelLeftClose,
Bell,
Puzzle,
LayoutGrid,
Link as LinkIcon,
BookOpen,
PenLine,
@@ -32,7 +31,6 @@ import {
Languages,
Info,
Bug,
SwatchBook,
Download,
X,
type AppIcon,
@@ -41,7 +39,6 @@ import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { AppearanceSettings } from '@/components/settings/appearance-settings';
import { AppTopBannerSlot } from '@/components/plugins/app-top-banner-slot';
import { LayoutSettings } from '@/components/settings/layout-settings';
import { LanguageSettings } from '@/components/settings/language-settings';
import { ReadingSettings } from '@/components/settings/reading-settings';
import { ComposingSettings } from '@/components/settings/composing-settings';
@@ -64,7 +61,6 @@ import { DownloadsSettings } from '@/components/settings/downloads-settings';
import { ContactsSettings } from '@/components/settings/contacts-settings';
import { SidebarAppsSettings } from '@/components/settings/sidebar-apps-settings';
import { NotificationSettings } from '@/components/settings/notification-settings';
import { ThemesSettings } from '@/components/settings/themes-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';
@@ -134,7 +130,6 @@ const tabIcons: Record<Tab, AppIcon> = {
language: Languages,
notifications: Bell,
appearance: Palette,
layout: LayoutGrid,
reading: BookOpen,
composing: PenLine,
downloads: Download,
@@ -152,17 +147,20 @@ const tabIcons: Record<Tab, AppIcon> = {
protocol_handlers: LinkIcon,
sidebar_apps: PanelLeftClose,
about_data: Info,
themes: SwatchBook,
plugins: Puzzle,
debug: Bug,
};
const tabGroupOrder: TabGroup[] = ['general', 'appearance', 'mail', 'privacy', 'apps', 'plugins', 'advanced'];
// Map legacy tab IDs to current ones; runs once on read of localStorage.
const LEGACY_TAB_MAP: Record<string, Tab> = {
// Map legacy tab IDs to current ones; runs once on read of localStorage and
// for every deep link, so old bookmarks, connector links and sidebar gears
// land on the page that now holds the setting.
export const LEGACY_TAB_MAP: Record<string, Tab> = {
email: 'reading',
advanced: 'about_data',
layout: 'appearance',
themes: 'appearance',
};
function readPersistedTab(): SettingsTabId {
@@ -350,11 +348,12 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
});
subs.plugins = [...(subs.plugins ?? []), ...pluginSubs];
}
// Themes are a section of Appearance now, so installed themes match there.
if (installedThemes.length) {
const text = installedThemes.map((th) => `${th.name} ${th.description} ${th.author}`).join(' ');
haystacks.themes = `${haystacks.themes ?? ''} ${text}`.toLowerCase();
subs.themes = [
...(subs.themes ?? []),
haystacks.appearance = `${haystacks.appearance ?? ''} ${text}`.toLowerCase();
subs.appearance = [
...(subs.appearance ?? []),
...installedThemes.map((th) => ({ label: th.name, description: th.description })),
];
}
@@ -565,8 +564,6 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
// Appearance
{ id: 'appearance', label: t('tabs.appearance'), icon: tabIcons.appearance, group: 'appearance' },
{ id: 'layout', label: t('tabs.layout'), icon: tabIcons.layout, group: 'appearance' },
...(isFeatureEnabled('themesEnabled') ? [{ id: 'themes' as Tab, label: t('tabs.themes'), icon: tabIcons.themes, group: 'appearance' as TabGroup }] : []),
// Mail
{ id: 'reading', label: t('tabs.reading'), icon: tabIcons.reading, group: 'mail' },
@@ -713,7 +710,6 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
{effectiveActiveTab === 'language' && <LanguageSettings />}
{effectiveActiveTab === 'notifications' && <NotificationSettings />}
{effectiveActiveTab === 'appearance' && <AppearanceSettings />}
{effectiveActiveTab === 'layout' && <LayoutSettings />}
{effectiveActiveTab === 'reading' && <ReadingSettings />}
{effectiveActiveTab === 'composing' && <ComposingSettings />}
{effectiveActiveTab === 'downloads' && <DownloadsSettings />}
@@ -739,7 +735,6 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
{effectiveActiveTab === 'protocol_handlers' && <ProtocolHandlerSettings supportsCalendar={supportsCalendar} />}
{effectiveActiveTab === 'sidebar_apps' && <SidebarAppsSettings />}
{effectiveActiveTab === 'about_data' && <AboutDataSettings />}
{effectiveActiveTab === 'themes' && <ThemesSettings />}
{effectiveActiveTab === 'plugins' && <PluginsSettings />}
{effectiveActiveTab === 'debug' && <DebugSettings />}
{effectiveActiveTab.startsWith('plugin:') && (
+24 -4
View File
@@ -9,7 +9,12 @@ import { Check, Lock } from '@/components/icons';
import { toast } from '@/stores/toast-store';
import { usePolicyStore } from '@/stores/policy-store';
export function ThemesSettings() {
/**
* The theme gallery. On its own it is a section; `embedded` draws only the
* grid (with its lock notice) inside the Appearance page's Theme section,
* right under the light/dark choice.
*/
export function ThemesSettings({ embedded }: { embedded?: boolean } = {}) {
const t = useTranslations('settings.themes');
const { installedThemes, activeThemeId, activateTheme } = useThemeStore();
const { isThemeDisabled, getThemePolicy, getForcedThemeId, isThemeForceEnabled } = usePolicyStore();
@@ -63,9 +68,8 @@ export function ThemesSettings() {
toast.success(id ? t('activated') : t('default_restored'));
};
return (
<SettingsSection title={t('title')} description={t('description')}>
const grid = (
<>
{forcedThemeId && (
<div className="mb-4 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800 dark:border-amber-900/40 dark:bg-amber-950/20 dark:text-amber-300">
{t('locked')}
@@ -110,6 +114,22 @@ export function ThemesSettings() {
);
})}
</div>
</>
);
if (embedded) {
return (
<div data-search-label={t('title')} className="py-3">
<div className="text-sm font-medium text-foreground">{t('title')}</div>
<p className="text-xs text-muted-foreground mt-1 mb-3">{t('description')}</p>
{grid}
</div>
);
}
return (
<SettingsSection title={t('title')} description={t('description')}>
{grid}
</SettingsSection>
);
}
+5 -1
View File
@@ -462,7 +462,11 @@ export async function calendarRows(
*/
export async function enableProInterface(page: Page): Promise<void> {
await page.locator('a[href$="/settings"]').first().click();
await page.locator('[data-testid="settings-tab-layout"]').first().click();
await page.locator('[data-testid="settings-tab-appearance"]').first().click();
// The Pro interface is an advanced setting, hidden until the switch is on.
const advanced = page.locator('[data-testid="settings-advanced-switch"]').first();
await advanced.waitFor({ state: 'visible', timeout: 30000 });
if ((await advanced.getAttribute('aria-checked')) !== 'true') await advanced.click();
const toggle = page.locator('[data-testid="setting-pro-interface"]').first();
await toggle.waitFor({ state: 'visible', timeout: 30000 });
if ((await toggle.getAttribute('aria-checked')) !== 'true') {
+3 -1
View File
@@ -90,7 +90,9 @@ describe('settings search index (English messages)', () => {
expect(labelsFor('composing')).toContain('Undo send / send delay');
expect(labelsFor('composing')).toContain('Request read receipts by default');
expect(labelsFor('appearance')).toContain('Message list order');
expect(labelsFor('layout')).toContain('Pro Interface (Experimental)');
expect(labelsFor('appearance')).toContain('Pro Interface (Experimental)');
expect(labelsFor('appearance')).toContain('Tell accounts apart');
expect(labelsFor('appearance')).toContain('Themes');
expect(labelsFor('language')).toContain('Time zone');
});
+11 -4
View File
@@ -32,13 +32,20 @@ import type { SettingsSearchTab } from '@/lib/settings-search';
import { buildSettingsPath, buildFilesPath } from '@/lib/deep-links';
import { RELEASE_VERSION } from '@/lib/release-version';
/** Mirrors `SettingsSearchTab`. Listed so an unknown tab is refused here. */
const SETTINGS_TABS: readonly SettingsSearchTab[] = [
'account', 'language', 'notifications', 'appearance', 'layout', 'reading',
/**
* Mirrors `SettingsSearchTab`, plus the ids of tabs that have since been
* folded into another page: a connector link made for an old tab still
* 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'] as const;
const SETTINGS_TABS: readonly (SettingsSearchTab | typeof LEGACY_SETTINGS_TABS[number])[] = [
'account', 'language', 'notifications', 'appearance', 'reading',
'composing', 'downloads', 'identities', 'vacation', 'filters', 'templates',
'folders', 'keywords', 'security', 'content_senders', 'calendar', 'contacts',
'files', 'protocol_handlers', 'sidebar_apps', 'about_data', 'themes',
'files', 'protocol_handlers', 'sidebar_apps', 'about_data',
'plugins', 'debug',
...LEGACY_SETTINGS_TABS,
];
const CALENDAR_VIEWS = ['month', 'week', 'day', 'agenda', 'tasks'] as const;
+11 -14
View File
@@ -7,7 +7,6 @@ export type SettingsSearchTab =
| 'language'
| 'notifications'
| 'appearance'
| 'layout'
| 'reading'
| 'composing'
| 'downloads'
@@ -25,7 +24,6 @@ export type SettingsSearchTab =
| 'protocol_handlers'
| 'sidebar_apps'
| 'about_data'
| 'themes'
| 'plugins'
| 'debug';
@@ -50,31 +48,33 @@ export const tabSearchPaths: Record<Tab, string[]> = {
notifications: ['settings.notifications'],
appearance: [
'settings.appearance.theme',
'settings.themes',
'settings.appearance.font_size',
'settings.appearance.list_density',
'settings.appearance.animations',
'settings.appearance.message_list_order',
'settings.advanced.sender_favicons',
'settings.advanced.show_avatars_in_junk',
],
layout: [
'settings.appearance.interface_layout',
'settings.email_behavior.mail_layout',
'settings.email_behavior.list_columns',
'settings.appearance.toolbar_position',
'settings.appearance.toolbar_labels',
'settings.appearance.colorful_sidebar_icons',
'settings.appearance.show_folder_total_count',
'settings.appearance.hide_account_switcher',
'settings.appearance.show_rail_account_list',
'settings.appearance.favicon_unread_badge',
'settings.appearance.unified_mailbox',
'settings.appearance.cross_unread',
'settings.appearance.cross_starred',
'settings.appearance.cross_all',
'settings.appearance.all_mail',
'settings.appearance.colorful_sidebar_icons',
'settings.appearance.tint_list_rows',
'settings.appearance.show_folder_total_count',
'settings.appearance.favicon_unread_badge',
'settings.appearance.account_marker',
'settings.appearance.show_shared_mail_accounts',
'tour.restart_title',
'tour.show_on_new_devices_title',
'settings.appearance.pro_interface',
'settings.email_behavior.mail_layout',
'settings.email_behavior.list_columns',
],
reading: [
'settings.email_behavior.mark_read',
@@ -131,7 +131,6 @@ export const tabSearchPaths: Record<Tab, string[]> = {
protocol_handlers: ['protocol_handlers'],
sidebar_apps: ['settings.sidebar_apps', 'sidebar_apps'],
about_data: ['settings.advanced'],
themes: ['settings.themes'],
plugins: [],
debug: ['settings.advanced'],
};
@@ -145,8 +144,7 @@ export const tabKeywords: Record<Tab, string> = {
account: 'profile email password user signin signout reorder rearrange drag dropdown switcher multi-account',
language: 'locale region timezone date time format',
notifications: 'sound alert push badge',
appearance: 'theme dark light font size accent color animation density',
layout: 'toolbar sidebar account switcher unified mailbox icons rail',
appearance: 'theme dark light font size accent color animation density custom theme css skin toolbar sidebar account switcher unified mailbox icons rail layout reading pane tour',
reading: 'mark read preview thread conversation archive delete attachment open monospace mono font plain text',
composing: 'editor signature plain text reply forward draft compose',
downloads: 'download filename template eml attachment save export',
@@ -164,7 +162,6 @@ export const tabKeywords: Record<Tab, string> = {
protocol_handlers: 'mailto webcal links default app protocol handler',
sidebar_apps: 'apps webview iframe',
about_data: 'export import storage quota privacy backup',
themes: 'custom theme css skin appearance',
plugins: 'extensions addons',
debug: 'logs developer console diagnostic',
};
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "كل البريد",
"description": "إظهار عنصر \"كل البريد\" في صندوق البريد الموحّد يسرد كل البريد عبر المجلدات المحددة."
},
"sections": {
"text": "النص والحركة",
"layout": "التخطيط",
"sidebar": "الشريط الجانبي",
"accounts": "حسابات متعددة",
"accounts_description": "كيف تظهر حساباتك وصناديق البريد المشتركة معًا.",
"experimental": "تجريبي"
},
"account_marker": {
"label": "تمييز الحسابات",
"description": "في العروض الموحدة، وسم كل رسالة بلون الحساب الذي جاءت منه.",
"dot": "نقطة ملونة",
"tint": "صف ملون",
"none": "لا شيء"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "معاينة"
}
},
"advanced_switch": {
"label": "إظهار الإعدادات المتقدمة",
"show": "إظهار الإعدادات المتقدمة",
"badge": "متقدم",
"hidden_count": "{count, plural, zero {لا توجد إعدادات متقدمة مخفية في هذه الصفحة.} one {إعداد متقدم واحد مخفي في هذه الصفحة.} two {إعدادان متقدمان مخفيان في هذه الصفحة.} few {# إعدادات متقدمة مخفية في هذه الصفحة.} many {# إعدادًا متقدمًا مخفيًا في هذه الصفحة.} other {# إعداد متقدم مخفي في هذه الصفحة.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "أدوات التحكم التجريبية",
"demo_banner_desc": "أنت في الوضع التجريبي - يبقى كل شيء في متصفحك. اضغط \"إعادة تعيين التجربة\" في أي وقت للبدء من جديد ببيانات نموذجية نظيفة.",
"quota_title": "استخدام التخزين",
"quota_desc": "تتبّع حجم صندوق بريدك هنا. تمتلئ الدائرة كلما استخدمت مساحة أكبر."
"quota_desc": "تتبّع حجم صندوق بريدك هنا. تمتلئ الدائرة كلما استخدمت مساحة أكبر.",
"settings_section": "البداية"
},
"unified_mailbox": {
"search_unavailable": "البحث غير متاح في العرض الموحّد"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Tot el correu",
"description": "Mostra una entrada de Tot el correu a la bústia unificada amb tot el correu de les carpetes seleccionades."
},
"sections": {
"text": "Text i moviment",
"layout": "Disposició",
"sidebar": "Barra lateral",
"accounts": "Diversos comptes",
"accounts_description": "Com es mostren junts els vostres comptes i bústies compartides.",
"experimental": "Experimental"
},
"account_marker": {
"label": "Distingir els comptes",
"description": "A les vistes unificades, marca cada missatge amb el color del compte d'on prové.",
"dot": "Punt de color",
"tint": "Fila tenyida",
"none": "Res"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "Previsualització"
}
},
"advanced_switch": {
"label": "Mostra la configuració avançada",
"show": "Mostra la configuració avançada",
"badge": "Avançat",
"hidden_count": "{count, plural, one {1 configuració avançada està amagada en aquesta pàgina.} other {# configuracions avançades estan amagades en aquesta pàgina.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Controls de la demo",
"demo_banner_desc": "Esteu en mode de demostració: tot es queda al navegador. Premeu «Reinicia la demo» en qualsevol moment per començar de nou amb dades d'exemple netes.",
"quota_title": "Ús de l'emmagatzematge",
"quota_desc": "Feu un seguiment de la mida de la bústia aquí. El cercle s'omple a mesura que utilitzeu més espai."
"quota_desc": "Feu un seguiment de la mida de la bústia aquí. El cercle s'omple a mesura que utilitzeu més espai.",
"settings_section": "Primers passos"
},
"unified_mailbox": {
"search_unavailable": "La cerca no està disponible a la vista unificada"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Všechny účty: Veškerá pošta",
"description": "Zobrazí v sekci Všechny účty položku s veškerou poštou ze všech účtů, napříč všemi složkami kromě spamu, odeslané, archivu, koše a konceptů."
},
"sections": {
"text": "Text a animace",
"layout": "Rozvržení",
"sidebar": "Postranní panel",
"accounts": "Více účtů",
"accounts_description": "Jak se vaše účty a sdílené schránky zobrazují společně.",
"experimental": "Experimentální"
},
"account_marker": {
"label": "Rozlišení účtů",
"description": "Ve sjednocených zobrazeních označit každou zprávu barvou účtu, ze kterého pochází.",
"dot": "Barevná tečka",
"tint": "Podbarvený řádek",
"none": "Nic"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Zpět na můj účet",
"managing": "Správa: {name}"
},
"advanced_switch": {
"label": "Zobrazit pokročilá nastavení",
"show": "Zobrazit pokročilá nastavení",
"badge": "Pokročilé",
"hidden_count": "{count, plural, one {1 pokročilé nastavení je na této stránce skryté.} few {# pokročilá nastavení jsou na této stránce skrytá.} many {# pokročilého nastavení je na této stránce skrytého.} other {# pokročilých nastavení je na této stránce skrytých.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Ovládání demoverze",
"demo_banner_desc": "Nacházíte se v demo režimu - vše zůstává ve vašem prohlížeči. Kdykoli klikněte na „Resetovat“, abyste začali znovu s čistými ukázkovými daty.",
"quota_title": "Využití úložiště",
"quota_desc": "Zde můžete sledovat velikost své poštovní schránky. Kruh se plní podle využití kapacity."
"quota_desc": "Zde můžete sledovat velikost své poštovní schránky. Kruh se plní podle využití kapacity.",
"settings_section": "Začínáme"
},
"unified_mailbox": {
"search_unavailable": "Vyhledávání není ve sjednoceném zobrazení k dispozici"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Alle konti: Al post",
"description": "Viser en post i sektionen Alle konti med al post fra alle konti, på tværs af alle mapper undtagen spam, sendt, arkiv, papirkurv og kladder."
},
"sections": {
"text": "Tekst og animation",
"layout": "Layout",
"sidebar": "Sidepanel",
"accounts": "Flere konti",
"accounts_description": "Hvordan dine konti og delte postkasser vises sammen.",
"experimental": "Eksperimentelt"
},
"account_marker": {
"label": "Skeln mellem konti",
"description": "Markér hver besked i de samlede visninger med farven på den konto, den kom fra.",
"dot": "Farvet prik",
"tint": "Farvet række",
"none": "Intet"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Tilbage til min konto",
"managing": "Administrerer: {name}"
},
"advanced_switch": {
"label": "Vis avancerede indstillinger",
"show": "Vis avancerede indstillinger",
"badge": "Avanceret",
"hidden_count": "{count, plural, one {1 avanceret indstilling er skjult på denne side.} other {# avancerede indstillinger er skjult på denne side.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Demo-kontroller",
"demo_banner_desc": "Du er i demo-tilstand - alt forbliver i din browser. Tryk 'Nulstil demo' når som helst for at starte forfra med rent eksempeldata.",
"quota_title": "Lagerforbrug",
"quota_desc": "Spor din postkassestørrelse her. Cirklen fyldes op, efterhånden som du bruger mere plads."
"quota_desc": "Spor din postkassestørrelse her. Cirklen fyldes op, efterhånden som du bruger mere plads.",
"settings_section": "Kom godt i gang"
},
"unified_mailbox": {
"search_unavailable": "Søgning er ikke tilgængelig i den samlede visning"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Alle Konten: Alle Mails",
"description": "Zeigt in der Sektion „All accounts“ einen Eintrag mit allen Mails über alle Konten, über alle Ordner außer Junk, Gesendet, Archiv, Papierkorb und Entwürfe."
},
"sections": {
"text": "Text & Animation",
"layout": "Layout",
"sidebar": "Seitenleiste",
"accounts": "Mehrere Konten",
"accounts_description": "Wie Ihre Konten und freigegebenen Postfächer gemeinsam erscheinen.",
"experimental": "Experimentell"
},
"account_marker": {
"label": "Konten unterscheiden",
"description": "In den vereinten Ansichten jede Nachricht mit der Farbe ihres Kontos kennzeichnen.",
"dot": "Farbpunkt",
"tint": "Eingefärbte Zeile",
"none": "Nichts"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Zurück zu meinem Konto",
"managing": "Verwaltung: {name}"
},
"advanced_switch": {
"label": "Erweiterte Einstellungen anzeigen",
"show": "Erweiterte Einstellungen anzeigen",
"badge": "Erweitert",
"hidden_count": "{count, plural, one {1 erweiterte Einstellung ist auf dieser Seite ausgeblendet.} other {# erweiterte Einstellungen sind auf dieser Seite ausgeblendet.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Demo-Steuerung",
"demo_banner_desc": "Sie sind im Demo-Modus - alles bleibt in Ihrem Browser. Klicken Sie jederzeit auf 'Demo zurücksetzen'.",
"quota_title": "Speichernutzung",
"quota_desc": "Verfolgen Sie Ihre Postfachgröße hier. Der Kreis füllt sich mit zunehmendem Verbrauch."
"quota_desc": "Verfolgen Sie Ihre Postfachgröße hier. Der Kreis füllt sich mit zunehmendem Verbrauch.",
"settings_section": "Erste Schritte"
},
"unified_mailbox": {
"search_unavailable": "Die Suche ist in der vereinheitlichten Ansicht nicht verfügbar"
+17 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "All mail",
"description": "Show an All mail entry in the Unified Mailbox listing all mail across the selected folders."
},
"sections": {
"text": "Text & motion",
"layout": "Layout",
"sidebar": "Sidebar",
"accounts": "Multiple accounts",
"accounts_description": "How your accounts and shared mailboxes appear together.",
"experimental": "Experimental"
},
"account_marker": {
"label": "Tell accounts apart",
"description": "In the unified views, mark each message with the color of the account it came from.",
"dot": "Colored dot",
"tint": "Tinted row",
"none": "Nothing"
}
},
"keywords": {
@@ -4052,7 +4067,8 @@
"demo_banner_title": "Demo controls",
"demo_banner_desc": "You're in demo mode - everything stays in your browser. Hit 'Reset Demo' anytime to start fresh with clean sample data.",
"quota_title": "Storage usage",
"quota_desc": "Track your mailbox size here. The circle fills up as you use more space."
"quota_desc": "Track your mailbox size here. The circle fills up as you use more space.",
"settings_section": "Getting started"
},
"unified_mailbox": {
"search_unavailable": "Search is not available in the unified view"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Todas las cuentas: Todo el correo",
"description": "Muestra una entrada en la sección Todas las cuentas con todo el correo de todas las cuentas, abarcando todas las carpetas excepto spam, enviados, archivo, papelera y borradores."
},
"sections": {
"text": "Texto y animaciones",
"layout": "Diseño",
"sidebar": "Barra lateral",
"accounts": "Varias cuentas",
"accounts_description": "Cómo se muestran juntos sus cuentas y buzones compartidos.",
"experimental": "Experimental"
},
"account_marker": {
"label": "Distinguir las cuentas",
"description": "En las vistas unificadas, marcar cada mensaje con el color de la cuenta de la que procede.",
"dot": "Punto de color",
"tint": "Fila coloreada",
"none": "Nada"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Volver a mi cuenta",
"managing": "Gestionando: {name}"
},
"advanced_switch": {
"label": "Mostrar ajustes avanzados",
"show": "Mostrar ajustes avanzados",
"badge": "Avanzado",
"hidden_count": "{count, plural, one {1 ajuste avanzado está oculto en esta página.} other {# ajustes avanzados están ocultos en esta página.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Controles de demo",
"demo_banner_desc": "Estás en modo demo - todo permanece en tu navegador. Haz clic en 'Restablecer demo' en cualquier momento.",
"quota_title": "Uso de almacenamiento",
"quota_desc": "Controla el tamaño de tu buzón aquí. El círculo se llena a medida que usas más espacio."
"quota_desc": "Controla el tamaño de tu buzón aquí. El círculo se llena a medida que usas más espacio.",
"settings_section": "Primeros pasos"
},
"unified_mailbox": {
"search_unavailable": "La búsqueda no está disponible en la vista unificada"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Kõik kirjad",
"description": "Kuva ühendatud postkastis kirje Kõik kirjad, mis loetleb kõik valitud kaustade kirjad."
},
"sections": {
"text": "Tekst ja liikumine",
"layout": "Paigutus",
"sidebar": "Külgriba",
"accounts": "Mitu kontot",
"accounts_description": "Kuidas sinu kontod ja jagatud postkastid koos kuvatakse.",
"experimental": "Katseline"
},
"account_marker": {
"label": "Kontode eristamine",
"description": "Ühendatud vaadetes märgi iga kiri selle konto värviga, kust see tuli.",
"dot": "Värviline täpp",
"tint": "Toonitud rida",
"none": "Mitte midagi"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "Eelvaade"
}
},
"advanced_switch": {
"label": "Kuva täpsemad seaded",
"show": "Kuva täpsemad seaded",
"badge": "Täpsem",
"hidden_count": "{count, plural, one {Sellel lehel on peidetud 1 täpsem seade.} other {Sellel lehel on peidetud # täpsemat seadet.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Demorežiimi juhtnupud",
"demo_banner_desc": "Oled demorežiimis - kõik jääb sinu brauserisse. Vajuta igal ajal 'Lähtesta demo', et alustada puhta näidisandmestikuga otsast peale.",
"quota_title": "Mahu kasutus",
"quota_desc": "Jälgi siin oma postkasti suurust. Ring täitub, mida rohkem ruumi kasutad."
"quota_desc": "Jälgi siin oma postkasti suurust. Ring täitub, mida rohkem ruumi kasutad.",
"settings_section": "Alustamine"
},
"unified_mailbox": {
"search_unavailable": "Otsing pole ühendatud vaates saadaval"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_unread": {
"label": "همه حساب‌ها: خوانده‌نشده",
"description": "نمایش یک مورد در بخش همه حساب‌ها که ایمیل‌های خوانده‌نشده همه حساب‌ها را فهرست می‌کند، شامل همه پوشه‌ها به جز هرزنامه، ارسال‌شده، بایگانی، زباله‌دان و پیش‌نویس‌ها."
},
"sections": {
"text": "متن و پویانمایی",
"layout": "چیدمان",
"sidebar": "نوار کناری",
"accounts": "چند حساب",
"accounts_description": "نحوه نمایش حساب‌ها و صندوق‌های مشترک در کنار هم.",
"experimental": "آزمایشی"
},
"account_marker": {
"label": "تشخیص حساب‌ها",
"description": "در نماهای یکپارچه، هر پیام را با رنگ حسابی که از آن آمده علامت‌گذاری کنید.",
"dot": "نقطه رنگی",
"tint": "ردیف رنگی",
"none": "هیچ"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "پیش‌نمایش"
}
},
"advanced_switch": {
"label": "نمایش تنظیمات پیشرفته",
"show": "نمایش تنظیمات پیشرفته",
"badge": "پیشرفته",
"hidden_count": "{count, plural, one {۱ تنظیم پیشرفته در این صفحه پنهان است.} other {# تنظیم پیشرفته در این صفحه پنهان است.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "کنترل‌های نسخه آزمایشی",
"demo_banner_desc": "شما در حالت آزمایشی هستید. هر زمان \"بازنشانی نسخه آزمایشی\" را بزنید.",
"quota_title": "مصرف فضا",
"quota_desc": "مصرف صندوق پستی خود را اینجا پیگیری کنید."
"quota_desc": "مصرف صندوق پستی خود را اینجا پیگیری کنید.",
"settings_section": "شروع کار"
},
"unified_mailbox": {
"search_unavailable": "جستجو در نمای یکپارچه در دسترس نیست"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Tous les comptes : Tout le courrier",
"description": "Affiche une entrée dans la section Tous les comptes répertoriant tout le courrier de tous les comptes, couvrant tous les dossiers sauf indésirables, envoyés, archives, corbeille et brouillons."
},
"sections": {
"text": "Texte et animations",
"layout": "Disposition",
"sidebar": "Barre latérale",
"accounts": "Plusieurs comptes",
"accounts_description": "Comment vos comptes et boîtes partagées apparaissent ensemble.",
"experimental": "Expérimental"
},
"account_marker": {
"label": "Distinguer les comptes",
"description": "Dans les vues unifiées, marquer chaque message avec la couleur du compte dont il provient.",
"dot": "Point coloré",
"tint": "Ligne teintée",
"none": "Rien"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Retour à mon compte",
"managing": "Gestion : {name}"
},
"advanced_switch": {
"label": "Afficher les paramètres avancés",
"show": "Afficher les paramètres avancés",
"badge": "Avancé",
"hidden_count": "{count, plural, one {1 paramètre avancé est masqué sur cette page.} other {# paramètres avancés sont masqués sur cette page.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Contrôles de démo",
"demo_banner_desc": "Vous êtes en mode démo - tout reste dans votre navigateur. Cliquez sur 'Réinitialiser la démo' à tout moment pour repartir avec des données fraîches.",
"quota_title": "Utilisation du stockage",
"quota_desc": "Suivez la taille de votre boîte mail ici. Le cercle se remplit au fur et à mesure que vous utilisez plus d'espace."
"quota_desc": "Suivez la taille de votre boîte mail ici. Le cercle se remplit au fur et à mesure que vous utilisez plus d'espace.",
"settings_section": "Premiers pas"
},
"unified_mailbox": {
"search_unavailable": "La recherche n'est pas disponible dans la vue unifiée"
+23 -1
View File
@@ -1207,6 +1207,21 @@
"cross_all": {
"label": "כל החשבונות: כל הדוא״ל",
"description": "הצג ערך בסעיף כל החשבונות המפרט את כל הדוא״ל בכל חשבון, המשתרע על כל התיקיות למעט זבל, נשלח, ארכיון, אשפה וטיוטות."
},
"sections": {
"text": "טקסט ותנועה",
"layout": "פריסה",
"sidebar": "סרגל צד",
"accounts": "כמה חשבונות",
"accounts_description": "איך החשבונות ותיבות הדואר המשותפות שלך מוצגים יחד.",
"experimental": "ניסיוני"
},
"account_marker": {
"label": "הבחנה בין חשבונות",
"description": "בתצוגות המאוחדות, לסמן כל הודעה בצבע החשבון שממנו הגיעה.",
"dot": "נקודה צבעונית",
"tint": "שורה צבועה",
"none": "ללא"
}
},
"keywords": {
@@ -2498,6 +2513,12 @@
"archive": "העבר לארכיון",
"trash": "העבר לאשפה"
}
},
"advanced_switch": {
"label": "הצגת הגדרות מתקדמות",
"show": "הצגת הגדרות מתקדמות",
"badge": "מתקדם",
"hidden_count": "{count, plural, one {הגדרה מתקדמת אחת מוסתרת בדף זה.} two {שתי הגדרות מתקדמות מוסתרות בדף זה.} other {# הגדרות מתקדמות מוסתרות בדף זה.}}"
}
},
"errors": {
@@ -3922,7 +3943,8 @@
"quota_title": "שימוש באחסון",
"quota_desc": "עקוב אחר גודל תיבת הדואר שלך כאן. העיגול מתמלא ככל שאתה מנצל יותר מקום.",
"show_on_new_devices_title": "הצג בהתקנים חדשים",
"show_on_new_devices_desc": "הפעל מחדש את בר הברכה ושיוך את הסיור בפעם הראשונה שאתה נכנס בהתקן חדש, גם אם כבר השלמת אותו במקום אחר"
"show_on_new_devices_desc": "הפעל מחדש את בר הברכה ושיוך את הסיור בפעם הראשונה שאתה נכנס בהתקן חדש, גם אם כבר השלמת אותו במקום אחר",
"settings_section": "צעדים ראשונים"
},
"meta_description": "לקוח webmail מינימליסטי באמצעות פרוטוקול JMAP",
"protocol_handlers": {
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Összes fiók: Összes levél",
"description": "Megjelenít egy bejegyzést az Összes fiók szakaszban, amely az összes fiók összes levelét listázza, a levélszemét, elküldött, archívum, kuka és piszkozatok mappák kivételével minden mappára kiterjedően."
},
"sections": {
"text": "Szöveg és animáció",
"layout": "Elrendezés",
"sidebar": "Oldalsáv",
"accounts": "Több fiók",
"accounts_description": "Hogyan jelennek meg együtt a fiókjai és a megosztott postaládák.",
"experimental": "Kísérleti"
},
"account_marker": {
"label": "Fiókok megkülönböztetése",
"description": "Az egyesített nézetekben minden üzenetet jelöljön annak a fióknak a színével, amelyből érkezett.",
"dot": "Színes pont",
"tint": "Színezett sor",
"none": "Semmi"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Vissza a saját fiókomhoz",
"managing": "Kezelés: {name}"
},
"advanced_switch": {
"label": "Speciális beállítások megjelenítése",
"show": "Speciális beállítások megjelenítése",
"badge": "Speciális",
"hidden_count": "{count, plural, one {1 speciális beállítás rejtve van ezen az oldalon.} other {# speciális beállítás rejtve van ezen az oldalon.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Demó vezérlők",
"demo_banner_desc": "Demó módban vagy - minden a böngésződben marad. Nyomd meg a 'Demó visszaállítása' gombot bármikor a tiszta mintaadatokkal való újrakezdéshez.",
"quota_title": "Tárhely használat",
"quota_desc": "Kövesd nyomon a postafiókod méretét itt. A kör kitöltődik, ahogy egyre több helyet használsz."
"quota_desc": "Kövesd nyomon a postafiókod méretét itt. A kör kitöltődik, ahogy egyre több helyet használsz.",
"settings_section": "Első lépések"
},
"unified_mailbox": {
"search_unavailable": "A keresés nem érhető el az egységes nézetben"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Tutti gli account: Tutta la posta",
"description": "Mostra una voce nella sezione Tutti gli account che elenca tutta la posta di tutti gli account, in tutte le cartelle tranne posta indesiderata, inviata, archivio, cestino e bozze."
},
"sections": {
"text": "Testo e animazioni",
"layout": "Layout",
"sidebar": "Barra laterale",
"accounts": "Più account",
"accounts_description": "Come appaiono insieme i tuoi account e le caselle condivise.",
"experimental": "Sperimentale"
},
"account_marker": {
"label": "Distinguere gli account",
"description": "Nelle viste unificate, contrassegna ogni messaggio con il colore dell'account da cui proviene.",
"dot": "Punto colorato",
"tint": "Riga colorata",
"none": "Niente"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Torna al mio account",
"managing": "Gestione: {name}"
},
"advanced_switch": {
"label": "Mostra impostazioni avanzate",
"show": "Mostra impostazioni avanzate",
"badge": "Avanzato",
"hidden_count": "{count, plural, one {1 impostazione avanzata è nascosta in questa pagina.} other {# impostazioni avanzate sono nascoste in questa pagina.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Controlli demo",
"demo_banner_desc": "Sei in modalità demo - tutto rimane nel tuo browser. Premi 'Reimposta Demo' in qualsiasi momento per ricominciare con dati puliti.",
"quota_title": "Utilizzo dello spazio",
"quota_desc": "Monitora le dimensioni della tua casella qui. Il cerchio si riempie man mano che utilizzi più spazio."
"quota_desc": "Monitora le dimensioni della tua casella qui. Il cerchio si riempie man mano che utilizzi più spazio.",
"settings_section": "Per iniziare"
},
"unified_mailbox": {
"search_unavailable": "La ricerca non è disponibile nella vista unificata"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "すべてのアカウント: すべてのメール",
"description": "「すべてのアカウント」セクションに、すべてのアカウントのすべてのメールを一覧表示する項目を表示します。迷惑メール、送信済み、アーカイブ、ゴミ箱、下書きを除くすべてのフォルダーが対象です。"
},
"sections": {
"text": "文字とアニメーション",
"layout": "レイアウト",
"sidebar": "サイドバー",
"accounts": "複数のアカウント",
"accounts_description": "複数のアカウントと共有メールボックスをまとめて表示する方法。",
"experimental": "実験的な機能"
},
"account_marker": {
"label": "アカウントの見分け方",
"description": "統合ビューで、各メッセージを送信元アカウントの色で示します。",
"dot": "色付きの点",
"tint": "行に色を付ける",
"none": "なし"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "自分のアカウントに戻る",
"managing": "管理中: {name}"
},
"advanced_switch": {
"label": "詳細設定を表示",
"show": "詳細設定を表示",
"badge": "詳細",
"hidden_count": "{count, plural, other {このページでは # 件の詳細設定が非表示です。}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "デモコントロール",
"demo_banner_desc": "デモモードです。すべてブラウザ内に保存されます。「デモをリセット」をクリックすると、いつでもクリーンなサンプルデータで再開できます。",
"quota_title": "ストレージ使用量",
"quota_desc": "メールボックスのサイズをここで確認できます。使用量が増えるとサークルが満たされます。"
"quota_desc": "メールボックスのサイズをここで確認できます。使用量が増えるとサークルが満たされます。",
"settings_section": "はじめに"
},
"unified_mailbox": {
"search_unavailable": "統合ビューでは検索を利用できません"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "모든 계정: 모든 메일",
"description": "모든 계정 섹션에 모든 계정의 모든 메일을 나열하는 항목을 표시합니다. 스팸, 보낸편지함, 보관함, 휴지통, 임시보관함을 제외한 모든 폴더가 대상입니다."
},
"sections": {
"text": "텍스트 및 애니메이션",
"layout": "레이아웃",
"sidebar": "사이드바",
"accounts": "여러 계정",
"accounts_description": "계정과 공유 사서함을 함께 표시하는 방식입니다.",
"experimental": "실험적 기능"
},
"account_marker": {
"label": "계정 구분",
"description": "통합 보기에서 각 메시지를 해당 계정의 색상으로 표시합니다.",
"dot": "색상 점",
"tint": "행 색조",
"none": "없음"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "내 계정으로 돌아가기",
"managing": "관리 중: {name}"
},
"advanced_switch": {
"label": "고급 설정 표시",
"show": "고급 설정 표시",
"badge": "고급",
"hidden_count": "{count, plural, other {이 페이지에서 고급 설정 #개가 숨겨져 있습니다.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "데모 컨트롤러",
"demo_banner_desc": "현재 데모 모드예요. 모든 작업은 브라우저 안에서만 이뤄집니다. 언제든 '초기화'를 누르면 처음의 깨끗한 샘플 데이터로 돌아가요.",
"quota_title": "저장 공간 사용량",
"quota_desc": "편지함 용량을 여기서 확인하세요. 공간을 많이 쓸수록 원이 점점 채워질 거예요."
"quota_desc": "편지함 용량을 여기서 확인하세요. 공간을 많이 쓸수록 원이 점점 채워질 거예요.",
"settings_section": "시작하기"
},
"unified_mailbox": {
"search_unavailable": "통합 보기에서는 검색을 사용할 수 없습니다"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Visi konti: Visas vēstules",
"description": "Rāda ierakstu sadaļā “Visi konti”, kas uzskaita visas vēstules no visiem kontiem, aptverot visas mapes, izņemot mēstules, nosūtītās, arhīvu, miskasti un melnrakstus."
},
"sections": {
"text": "Teksts un animācija",
"layout": "Izkārtojums",
"sidebar": "Sānjosla",
"accounts": "Vairāki konti",
"accounts_description": "Kā jūsu konti un koplietotās pastkastes tiek rādītas kopā.",
"experimental": "Eksperimentāli"
},
"account_marker": {
"label": "Kontu atšķiršana",
"description": "Apvienotajos skatos atzīmēt katru ziņu ar tā konta krāsu, no kura tā nākusi.",
"dot": "Krāsains punkts",
"tint": "Tonēta rinda",
"none": "Nekas"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Atpakaļ uz manu kontu",
"managing": "Pārvalda: {name}"
},
"advanced_switch": {
"label": "Rādīt papildu iestatījumus",
"show": "Rādīt papildu iestatījumus",
"badge": "Papildu",
"hidden_count": "{count, plural, zero {Šajā lapā nav paslēptu papildu iestatījumu.} one {Šajā lapā ir paslēpts # papildu iestatījums.} other {Šajā lapā ir paslēpti # papildu iestatījumi.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Demo vadība",
"demo_banner_desc": "Jūs esat demo režīmā - visi dati paliek jūsu pārlūkā. Nospiediet «Atiestatīt demo», lai sāktu no jauna.",
"quota_title": "Krātuves izmantošana",
"quota_desc": "Sekojiet līdzi savas pastkastes aizpildījumam šeit."
"quota_desc": "Sekojiet līdzi savas pastkastes aizpildījumam šeit.",
"settings_section": "Darba sākšana"
},
"unified_mailbox": {
"search_unavailable": "Meklēšana nav pieejama apvienotajā skatā"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Бүх шуудан",
"description": "Нэгдсэн шуудангийн хайрцганд сонгогдсон фолдер дээрх бүх имэйлийг жагсаасан Бүх имэйлийн оруулгыг харуул."
},
"sections": {
"text": "Текст ба хөдөлгөөн",
"layout": "Байрлал",
"sidebar": "Хажуугийн самбар",
"accounts": "Олон бүртгэл",
"accounts_description": "Таны бүртгэл болон хуваалцсан шуудангийн хайрцгууд хэрхэн хамт харагдах.",
"experimental": "Туршилтын"
},
"account_marker": {
"label": "Бүртгэлүүдийг ялгах",
"description": "Нэгдсэн харагдацад мессеж бүрийг ирсэн бүртгэлийн өнгөөр тэмдэглэнэ.",
"dot": "Өнгөт цэг",
"tint": "Өнгөт мөр",
"none": "Юу ч үгүй"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "Урьдчилан харах"
}
},
"advanced_switch": {
"label": "Нарийвчилсан тохиргоог харуулах",
"show": "Нарийвчилсан тохиргоог харуулах",
"badge": "Нарийвчилсан",
"hidden_count": "{count, plural, one {Энэ хуудсанд 1 нарийвчилсан тохиргоо нуугдсан байна.} other {Энэ хуудсанд # нарийвчилсан тохиргоо нуугдсан байна.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Демо удирдлага",
"demo_banner_desc": "Та демо горимд байна. Бүх өгөгдөл зөвхөн таны хөтөч дээр хадгалагдана. Хүссэн үедээ Reset Demo дарж дахин эхлүүлж болно.",
"quota_title": "Хадгалалтын ашиглалт",
"quota_desc": "Энд таны шуудангийн хайрцгийн ашиглаж буй хэмжээг харуулна. Илүү их зай ашиглах тусам тойрог дүүрнэ."
"quota_desc": "Энд таны шуудангийн хайрцгийн ашиглаж буй хэмжээг харуулна. Илүү их зай ашиглах тусам тойрог дүүрнэ.",
"settings_section": "Эхлэх"
},
"unified_mailbox": {
"search_unavailable": "Нэгдсэн харагдац дээр хайлт ашиглах боломжгүй"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "All e-post",
"description": "Vis All e-post i den samlede postkassen, med all e-post fra de valgte mappene."
},
"sections": {
"text": "Tekst og animasjon",
"layout": "Oppsett",
"sidebar": "Sidepanel",
"accounts": "Flere kontoer",
"accounts_description": "Hvordan kontoene og de delte postkassene dine vises sammen.",
"experimental": "Eksperimentelt"
},
"account_marker": {
"label": "Skill kontoene fra hverandre",
"description": "Marker hver melding i de samlede visningene med fargen til kontoen den kom fra.",
"dot": "Farget prikk",
"tint": "Farget rad",
"none": "Ingenting"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "Forhåndsvisning"
}
},
"advanced_switch": {
"label": "Vis avanserte innstillinger",
"show": "Vis avanserte innstillinger",
"badge": "Avansert",
"hidden_count": "{count, plural, one {1 avansert innstilling er skjult på denne siden.} other {# avanserte innstillinger er skjult på denne siden.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Demokontroller",
"demo_banner_desc": "Du er i demomodus – alt forblir i nettleseren. Trykk på «Tilbakestill demo» når som helst for å begynne på nytt med nye eksempeldata.",
"quota_title": "Lagringsbruk",
"quota_desc": "Følg med på størrelsen på postkassen her. Sirkelen fylles opp etter hvert som du bruker mer plass."
"quota_desc": "Følg med på størrelsen på postkassen her. Sirkelen fylles opp etter hvert som du bruker mer plass.",
"settings_section": "Kom i gang"
},
"unified_mailbox": {
"search_unavailable": "Søk er ikke tilgjengelig i den samlede visningen"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Alle accounts: Alle e-mail",
"description": "Toont een item in de sectie Alle accounts met alle e-mail van alle accounts, in alle mappen behalve ongewenst, verzonden, archief, prullenbak en concepten."
},
"sections": {
"text": "Tekst en animatie",
"layout": "Indeling",
"sidebar": "Zijbalk",
"accounts": "Meerdere accounts",
"accounts_description": "Hoe uw accounts en gedeelde postvakken samen worden getoond.",
"experimental": "Experimenteel"
},
"account_marker": {
"label": "Accounts onderscheiden",
"description": "Markeer in de gecombineerde weergaven elk bericht met de kleur van het account waar het vandaan komt.",
"dot": "Gekleurde stip",
"tint": "Gekleurde rij",
"none": "Niets"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Terug naar mijn account",
"managing": "Beheren: {name}"
},
"advanced_switch": {
"label": "Geavanceerde instellingen tonen",
"show": "Geavanceerde instellingen tonen",
"badge": "Geavanceerd",
"hidden_count": "{count, plural, one {1 geavanceerde instelling is verborgen op deze pagina.} other {# geavanceerde instellingen zijn verborgen op deze pagina.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Demo-bediening",
"demo_banner_desc": "U bent in demomodus - alles blijft in uw browser. Klik op 'Demo resetten' om opnieuw te beginnen met schone voorbeeldgegevens.",
"quota_title": "Opslaggebruik",
"quota_desc": "Volg de grootte van uw mailbox hier. De cirkel vult zich naarmate u meer ruimte gebruikt."
"quota_desc": "Volg de grootte van uw mailbox hier. De cirkel vult zich naarmate u meer ruimte gebruikt.",
"settings_section": "Aan de slag"
},
"unified_mailbox": {
"search_unavailable": "Zoeken is niet beschikbaar in de gecombineerde weergave"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Wszystkie konta: Cała poczta",
"description": "Pokazuje pozycję w sekcji Wszystkie konta z całą pocztą ze wszystkich kont, obejmującą wszystkie foldery oprócz spamu, wysłanych, archiwum, kosza i roboczych."
},
"sections": {
"text": "Tekst i animacje",
"layout": "Układ",
"sidebar": "Pasek boczny",
"accounts": "Wiele kont",
"accounts_description": "Jak Twoje konta i udostępnione skrzynki są wyświetlane razem.",
"experimental": "Eksperymentalne"
},
"account_marker": {
"label": "Rozróżnianie kont",
"description": "W widokach połączonych oznaczaj każdą wiadomość kolorem konta, z którego pochodzi.",
"dot": "Kolorowa kropka",
"tint": "Podbarwiony wiersz",
"none": "Nic"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Powrót do mojego konta",
"managing": "Zarządzanie: {name}"
},
"advanced_switch": {
"label": "Pokaż ustawienia zaawansowane",
"show": "Pokaż ustawienia zaawansowane",
"badge": "Zaawansowane",
"hidden_count": "{count, plural, one {1 ustawienie zaawansowane jest ukryte na tej stronie.} few {# ustawienia zaawansowane są ukryte na tej stronie.} many {# ustawień zaawansowanych jest ukrytych na tej stronie.} other {# ustawienia zaawansowanego jest ukryte na tej stronie.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Sterowanie wersją demo",
"demo_banner_desc": "Jesteś w trybie demo - wszystko pozostaje w Twojej przeglądarce. W każdej chwili kliknij „Reset Demo”, aby zacząć od nowa z czystymi danymi przykładowymi.",
"quota_title": "Wykorzystanie miejsca",
"quota_desc": "Tutaj możesz śledzić rozmiar swojej skrzynki pocztowej. Okrąg wypełnia się wraz ze wzrostem użycia przestrzeni."
"quota_desc": "Tutaj możesz śledzić rozmiar swojej skrzynki pocztowej. Okrąg wypełnia się wraz ze wzrostem użycia przestrzeni.",
"settings_section": "Pierwsze kroki"
},
"unified_mailbox": {
"search_unavailable": "Wyszukiwanie jest niedostępne w widoku ujednoliconym"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Todas as contas: Todo o correio",
"description": "Mostra uma entrada na seção Todas as contas listando todo o correio de todas as contas, abrangendo todas as pastas exceto spam, enviados, arquivo, lixeira e rascunhos."
},
"sections": {
"text": "Texto e animações",
"layout": "Disposição",
"sidebar": "Barra lateral",
"accounts": "Várias contas",
"accounts_description": "Como as suas contas e caixas partilhadas aparecem em conjunto.",
"experimental": "Experimental"
},
"account_marker": {
"label": "Distinguir as contas",
"description": "Nas vistas unificadas, marcar cada mensagem com a cor da conta de onde veio.",
"dot": "Ponto colorido",
"tint": "Linha colorida",
"none": "Nada"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Voltar para minha conta",
"managing": "Gerenciando: {name}"
},
"advanced_switch": {
"label": "Mostrar definições avançadas",
"show": "Mostrar definições avançadas",
"badge": "Avançado",
"hidden_count": "{count, plural, one {1 definição avançada está oculta nesta página.} other {# definições avançadas estão ocultas nesta página.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Controles de demonstração",
"demo_banner_desc": "Está no modo de demonstração - tudo permanece no seu navegador. Clique em 'Repor Demonstração' a qualquer momento para recomeçar com dados limpos.",
"quota_title": "Utilização do armazenamento",
"quota_desc": "Acompanhe o tamanho da sua caixa de correio aqui. O círculo preenche-se à medida que utiliza mais espaço."
"quota_desc": "Acompanhe o tamanho da sua caixa de correio aqui. O círculo preenche-se à medida que utiliza mais espaço.",
"settings_section": "Primeiros passos"
},
"unified_mailbox": {
"search_unavailable": "A pesquisa não está disponível na vista unificada"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Toate conturile: Toată poșta",
"description": "Afișează în secțiunea Toate conturile o intrare cu toată poșta din toate conturile, în toate folderele cu excepția spam, trimise, arhivă, coș și ciorne."
},
"sections": {
"text": "Text și animații",
"layout": "Aspect",
"sidebar": "Bară laterală",
"accounts": "Mai multe conturi",
"accounts_description": "Cum apar împreună conturile și căsuțele partajate.",
"experimental": "Experimental"
},
"account_marker": {
"label": "Deosebirea conturilor",
"description": "În vizualizările unificate, marchează fiecare mesaj cu culoarea contului din care provine.",
"dot": "Punct colorat",
"tint": "Rând colorat",
"none": "Nimic"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "Previzualizare"
}
},
"advanced_switch": {
"label": "Afișează setările avansate",
"show": "Afișează setările avansate",
"badge": "Avansat",
"hidden_count": "{count, plural, one {1 setare avansată este ascunsă pe această pagină.} few {# setări avansate sunt ascunse pe această pagină.} other {# de setări avansate sunt ascunse pe această pagină.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Controale demo",
"demo_banner_desc": "Vă aflați în modul demo – totul rămâne în browserul dvs. Apăsați „Resetare demo” oricând pentru a începe de la zero cu date de exemplu curate.",
"quota_title": "Utilizarea spațiului de stocare",
"quota_desc": "Urmăriți aici dimensiunea căsuței dvs. de e-mail. Cercul se umple pe măsură ce utilizați mai mult spațiu."
"quota_desc": "Urmăriți aici dimensiunea căsuței dvs. de e-mail. Cercul se umple pe măsură ce utilizați mai mult spațiu.",
"settings_section": "Primii pași"
},
"unified_mailbox": {
"search_unavailable": "Funcția de căutare nu este disponibilă în vizualizarea unificată"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Все аккаунты: Вся почта",
"description": "Показывает в разделе «Все аккаунты» запись со всеми письмами из всех аккаунтов, по всем папкам, кроме спама, отправленных, архива, корзины и черновиков."
},
"sections": {
"text": "Текст и анимация",
"layout": "Расположение",
"sidebar": "Боковая панель",
"accounts": "Несколько учётных записей",
"accounts_description": "Как ваши учётные записи и общие ящики отображаются вместе.",
"experimental": "Экспериментальное"
},
"account_marker": {
"label": "Различать учётные записи",
"description": "В объединённых представлениях отмечать каждое письмо цветом учётной записи, из которой оно пришло.",
"dot": "Цветная точка",
"tint": "Подкрашенная строка",
"none": "Ничего"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Назад к моей учётной записи",
"managing": "Управление: {name}"
},
"advanced_switch": {
"label": "Показывать расширенные настройки",
"show": "Показать расширенные настройки",
"badge": "Расширенное",
"hidden_count": "{count, plural, one {# расширенная настройка скрыта на этой странице.} few {# расширенные настройки скрыты на этой странице.} many {# расширенных настроек скрыто на этой странице.} other {# расширенной настройки скрыто на этой странице.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Элементы управления демо",
"demo_banner_desc": "Вы в демо-режиме - всё остаётся в вашем браузере. Нажмите «Сбросить демо» в любое время, чтобы начать заново с чистыми данными.",
"quota_title": "Использование хранилища",
"quota_desc": "Отслеживайте размер вашего почтового ящика здесь. Круг заполняется по мере использования пространства."
"quota_desc": "Отслеживайте размер вашего почтового ящика здесь. Круг заполняется по мере использования пространства.",
"settings_section": "Начало работы"
},
"unified_mailbox": {
"search_unavailable": "Поиск недоступен в объединённом представлении"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "Všetky účty: Všetka pošta",
"description": "Zobraziť položku v sekcii Všetky účty so všetkou poštou zo všetkých účtov."
},
"sections": {
"text": "Text a animácie",
"layout": "Rozloženie",
"sidebar": "Bočný panel",
"accounts": "Viac účtov",
"accounts_description": "Ako sa vaše účty a zdieľané schránky zobrazujú spolu.",
"experimental": "Experimentálne"
},
"account_marker": {
"label": "Rozlíšenie účtov",
"description": "V zjednotených zobrazeniach označiť každú správu farbou účtu, z ktorého pochádza.",
"dot": "Farebná bodka",
"tint": "Podfarbený riadok",
"none": "Nič"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "Náhľad"
}
},
"advanced_switch": {
"label": "Zobraziť rozšírené nastavenia",
"show": "Zobraziť rozšírené nastavenia",
"badge": "Rozšírené",
"hidden_count": "{count, plural, one {1 rozšírené nastavenie je na tejto stránke skryté.} few {# rozšírené nastavenia sú na tejto stránke skryté.} many {# rozšíreného nastavenia je na tejto stránke skrytého.} other {# rozšírených nastavení je na tejto stránke skrytých.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Ovládanie dema",
"demo_banner_desc": "Nachádzate sa v demo režime – všetko zostáva vo vašom prehliadači.",
"quota_title": "Využitie úložiska",
"quota_desc": "Tu môžete sledovať veľkosť svojej poštovej schránky."
"quota_desc": "Tu môžete sledovať veľkosť svojej poštovej schránky.",
"settings_section": "Začíname"
},
"unified_mailbox": {
"search_unavailable": "Vyhľadávanie nie je v zjednotenom zobrazení k dispozícii"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Tüm hesaplar: Tüm postalar",
"description": "Tüm hesaplar bölümünde, tüm hesaplardaki tüm postaları listeleyen bir giriş gösterir; önemsiz, gönderilmiş, arşiv, çöp ve taslaklar dışındaki tüm klasörleri kapsar."
},
"sections": {
"text": "Metin ve hareket",
"layout": "Düzen",
"sidebar": "Kenar çubuğu",
"accounts": "Birden çok hesap",
"accounts_description": "Hesaplarınızın ve paylaşılan posta kutularının birlikte nasıl göründüğü.",
"experimental": "Deneysel"
},
"account_marker": {
"label": "Hesapları ayırt etme",
"description": "Birleşik görünümlerde her iletiyi geldiği hesabın rengiyle işaretle.",
"dot": "Renkli nokta",
"tint": "Renkli satır",
"none": "Hiçbiri"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Hesabıma geri dön",
"managing": "Yönetiliyor: {name}"
},
"advanced_switch": {
"label": "Gelişmiş ayarları göster",
"show": "Gelişmiş ayarları göster",
"badge": "Gelişmiş",
"hidden_count": "{count, plural, one {Bu sayfada 1 gelişmiş ayar gizli.} other {Bu sayfada # gelişmiş ayar gizli.}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "Demo kontrolleri",
"demo_banner_desc": "Demo modundasınız - her şey tarayıcınızda kalır. Temiz örnek verilerle yeniden başlamak için istediğiniz zaman 'Demoyu Sıfırla'ya basın.",
"quota_title": "Depolama kullanımı",
"quota_desc": "Posta kutusu boyutunuzu buradan takip edin. Daha fazla alan kullandıkça daire dolmaya başlar."
"quota_desc": "Posta kutusu boyutunuzu buradan takip edin. Daha fazla alan kullandıkça daire dolmaya başlar.",
"settings_section": "Başlarken"
},
"unified_mailbox": {
"search_unavailable": "Birleşik görünümde arama kullanılamaz"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "Усі облікові записи: Уся пошта",
"description": "Показує у розділі «Усі облікові записи» запис з усіма листами з усіх облікових записів, по всіх теках, окрім спаму, надісланих, архіву, кошика та чернеток."
},
"sections": {
"text": "Текст і анімація",
"layout": "Розташування",
"sidebar": "Бічна панель",
"accounts": "Кілька облікових записів",
"accounts_description": "Як ваші облікові записи та спільні скриньки відображаються разом.",
"experimental": "Експериментальне"
},
"account_marker": {
"label": "Розрізняти облікові записи",
"description": "В об'єднаних поданнях позначати кожен лист кольором облікового запису, з якого він надійшов.",
"dot": "Кольорова крапка",
"tint": "Підфарбований рядок",
"none": "Нічого"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "Назад до мого облікового запису",
"managing": "Керування: {name}"
},
"advanced_switch": {
"label": "Показувати розширені налаштування",
"show": "Показати розширені налаштування",
"badge": "Розширене",
"hidden_count": "{count, plural, one {# розширене налаштування приховано на цій сторінці.} few {# розширені налаштування приховано на цій сторінці.} many {# розширених налаштувань приховано на цій сторінці.} other {# розширеного налаштування приховано на цій сторінці.}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "Демонстраційні елементи керування",
"demo_banner_desc": "Ви в демонстраційному режимі - все залишається у вашому браузері. Будь-коли натисніть «Скинути демонстрацію», щоб почати заново з чистими зразками даних.",
"quota_title": "Використання сховища",
"quota_desc": "Відстежуйте розмір своєї поштової скриньки тут. Коло заповнюється, коли ви використовуєте більше місця."
"quota_desc": "Відстежуйте розмір своєї поштової скриньки тут. Коло заповнюється, коли ви використовуєте більше місця.",
"settings_section": "Початок роботи"
},
"unified_mailbox": {
"search_unavailable": "Пошук недоступний в об'єднаному перегляді"
+23 -1
View File
@@ -1245,6 +1245,21 @@
"cross_all": {
"label": "所有郵件",
"description": "在整合信箱顯示「所有郵件」項目,列出所選信件匣中的所有郵件。"
},
"sections": {
"text": "文字與動畫",
"layout": "版面配置",
"sidebar": "側邊欄",
"accounts": "多個帳號",
"accounts_description": "您的帳號與共用信箱如何一起顯示。",
"experimental": "實驗性"
},
"account_marker": {
"label": "區分帳號",
"description": "在統一檢視中,以來源帳號的顏色標記每封郵件。",
"dot": "彩色圓點",
"tint": "列著色",
"none": "無"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"preview": {
"label": "預覽"
}
},
"advanced_switch": {
"label": "顯示進階設定",
"show": "顯示進階設定",
"badge": "進階",
"hidden_count": "{count, plural, other {此頁面隱藏了 # 項進階設定。}}"
}
},
"errors": {
@@ -4046,7 +4067,8 @@
"demo_banner_title": "示範控制",
"demo_banner_desc": "目前處於示範模式,所有資料都保留在瀏覽器中。隨時點擊「重設示範」即可用全新的範例資料重新開始。",
"quota_title": "儲存使用情況",
"quota_desc": "在這裡查看信箱的儲存空間使用量。使用的空間越多,圓形指示器就會填得越滿。"
"quota_desc": "在這裡查看信箱的儲存空間使用量。使用的空間越多,圓形指示器就會填得越滿。",
"settings_section": "新手入門"
},
"unified_mailbox": {
"search_unavailable": "整合檢視中無法使用搜尋"
+23 -1
View File
@@ -1242,6 +1242,21 @@
"cross_all": {
"label": "所有账户:全部邮件",
"description": "在“所有账户”部分显示一个条目,列出所有账户的全部邮件,涵盖除垃圾邮件、已发送、归档、废纸篓和草稿之外的所有文件夹。"
},
"sections": {
"text": "文字与动画",
"layout": "布局",
"sidebar": "侧边栏",
"accounts": "多个账户",
"accounts_description": "您的账户和共享邮箱如何一起显示。",
"experimental": "实验性"
},
"account_marker": {
"label": "区分账户",
"description": "在统一视图中,用来源账户的颜色标记每封邮件。",
"dot": "彩色圆点",
"tint": "行着色",
"none": "无"
}
},
"keywords": {
@@ -2532,6 +2547,12 @@
"scoped": {
"back": "返回我的账户",
"managing": "管理:{name}"
},
"advanced_switch": {
"label": "显示高级设置",
"show": "显示高级设置",
"badge": "高级",
"hidden_count": "{count, plural, other {此页面隐藏了 # 项高级设置。}}"
}
},
"errors": {
@@ -4004,7 +4025,8 @@
"demo_banner_title": "演示控制",
"demo_banner_desc": "当前为演示模式,所有数据仅保存在浏览器中。随时点击\"重置演示\"即可恢复初始示例数据。",
"quota_title": "存储使用情况",
"quota_desc": "在这里查看邮箱的存储使用情况。随着空间使用增加,进度圆环会逐渐填满。"
"quota_desc": "在这里查看邮箱的存储使用情况。随着空间使用增加,进度圆环会逐渐填满。",
"settings_section": "新手入门"
},
"unified_mailbox": {
"search_unavailable": "统一视图中无法使用搜索"