diff --git a/components/settings/settings-app.tsx b/components/settings/settings-app.tsx index df34f9725..ceae16365 100644 --- a/components/settings/settings-app.tsx +++ b/components/settings/settings-app.tsx @@ -542,7 +542,7 @@ 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: 'Themes', icon: tabIcons.themes, group: 'appearance' as TabGroup }] : []), + ...(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' }, diff --git a/locales/ar/common.json b/locales/ar/common.json index 1b9c2d4e2..930666709 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "تطبيقات الشريط الجانبي", "notifications": "الإشعارات", "layout": "التخطيط", + "themes": "السمات", "reading": "القراءة", "composing": "الكتابة", "downloads": "التنزيلات", diff --git a/locales/ca/common.json b/locales/ca/common.json index a98dd9045..096b08fdd 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Aplicacions de la barra lateral", "notifications": "Notificacions", "layout": "Disposició", + "themes": "Temes", "reading": "Lectura", "composing": "Redacció", "downloads": "Baixades", diff --git a/locales/cs/common.json b/locales/cs/common.json index bc6dce733..5eb8ae5b5 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Aplikace postranního panelu", "notifications": "Oznámení", "layout": "Vzhled", + "themes": "Motivy", "reading": "Čtení", "composing": "Psaní", "downloads": "Stažené", diff --git a/locales/da/common.json b/locales/da/common.json index 9172193db..1abedc890 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Sidepanel-apps", "notifications": "Notifikationer", "layout": "Layout", + "themes": "Temaer", "reading": "Læsning", "composing": "Skrivning", "downloads": "Downloads", diff --git a/locales/de/common.json b/locales/de/common.json index 8f5b90468..a37c77866 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Sidebar-Apps", "notifications": "Benachrichtigungen", "layout": "Layout", + "themes": "Designs", "reading": "Lesen", "composing": "Verfassen", "downloads": "Downloads", diff --git a/locales/en/common.json b/locales/en/common.json index b90d24d0d..6fa79348f 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Sidebar Apps", "notifications": "Notifications", "layout": "Layout", + "themes": "Themes", "reading": "Reading", "composing": "Composing", "downloads": "Downloads", diff --git a/locales/es/common.json b/locales/es/common.json index dcb460f37..8b62ca304 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Apps de barra lateral", "notifications": "Notificaciones", "layout": "Diseño", + "themes": "Temas", "reading": "Lectura", "composing": "Redacción", "downloads": "Descargas", diff --git a/locales/fa/common.json b/locales/fa/common.json index 4693c60b9..76fdd1268 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "برنامه‌های نوار کناری", "notifications": "اعلان‌ها", "layout": "چیدمان", + "themes": "پوسته‌ها", "reading": "خواندن", "composing": "نوشتن", "downloads": "دانلودها", diff --git a/locales/fr/common.json b/locales/fr/common.json index 9d5c85d2f..1473e1f76 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Apps de la barre latérale", "notifications": "Notifications", "layout": "Mise en page", + "themes": "Thèmes", "reading": "Lecture", "composing": "Rédaction", "downloads": "Téléchargements", diff --git a/locales/he/common.json b/locales/he/common.json index 6d6073bc2..12b5cffbb 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -892,6 +892,7 @@ "notifications": "התראות", "protocol_handlers": "יישומים ברירת מחדל", "layout": "פריסה", + "themes": "ערכות נושא", "reading": "קריאה", "composing": "הרכבה", "downloads": "הורדות", diff --git a/locales/hu/common.json b/locales/hu/common.json index c50a4b9d4..f409e488d 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Oldalsáv alkalmazások", "notifications": "Értesítések", "layout": "Elrendezés", + "themes": "Témák", "reading": "Olvasás", "composing": "Írás", "downloads": "Letöltések", diff --git a/locales/it/common.json b/locales/it/common.json index 099959e29..f547a3e8f 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "App nella barra laterale", "notifications": "Notifiche", "layout": "Layout", + "themes": "Temi", "reading": "Lettura", "composing": "Composizione", "downloads": "Download", diff --git a/locales/ja/common.json b/locales/ja/common.json index c2b555b11..13b5d9420 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "サイドバーアプリ", "notifications": "通知", "layout": "レイアウト", + "themes": "テーマ", "reading": "閲覧", "composing": "作成", "downloads": "ダウンロード", diff --git a/locales/ko/common.json b/locales/ko/common.json index b1c0817d4..14bdbc68d 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "사이드바 앱", "notifications": "알림", "layout": "레이아웃", + "themes": "테마", "reading": "읽기", "composing": "작성", "downloads": "다운로드", diff --git a/locales/lv/common.json b/locales/lv/common.json index 8899bae12..56c7d11d5 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Sānu joslas lietotnes", "notifications": "Paziņojumi", "layout": "Izkārtojums", + "themes": "Tēmas", "reading": "Lasīšana", "composing": "Rakstīšana", "downloads": "Lejupielādes", diff --git a/locales/mn/common.json b/locales/mn/common.json index f348b48a4..4e73fbd80 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Хажуугийн аппууд", "notifications": "Мэдэгдэл", "layout": "Байршил", + "themes": "Сэдэв", "reading": "Унших", "composing": "Зохиоглох", "downloads": "Татаж авах", diff --git a/locales/nb/common.json b/locales/nb/common.json index 67e2cf1be..9833f8c9a 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Apper i sidefeltet", "notifications": "Varsler", "layout": "Oppsett", + "themes": "Temaer", "reading": "Lesing", "composing": "Skriving", "downloads": "Nedlastinger", diff --git a/locales/nl/common.json b/locales/nl/common.json index c96c2b9ec..43190bf60 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Zijbalk-apps", "notifications": "Meldingen", "layout": "Indeling", + "themes": "Thema's", "reading": "Lezen", "composing": "Opstellen", "downloads": "Downloads", diff --git a/locales/pl/common.json b/locales/pl/common.json index 3022543f7..2a10f1cd4 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Aplikacje paska bocznego", "notifications": "Powiadomienia", "layout": "Układ", + "themes": "Motywy", "reading": "Czytanie", "composing": "Tworzenie", "downloads": "Pobrane", diff --git a/locales/pt/common.json b/locales/pt/common.json index d9938c0f9..226d5aa58 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -142,8 +142,8 @@ "unified_all_unread": "Tudo não lido", "unified_all_starred": "Tudo com estrela", "unified_all_mail": "Todo o correio", - "remove_account": "Remove account", - "remove_account_confirm": "Remove {account} from this device? You can add it back later." + "remove_account": "Remover conta", + "remove_account_confirm": "Remover {account} desse dispositivo? Você pode adicioná-la de volta depois." }, "protocol_handlers": { "title": "Aplicativos padrão", @@ -296,7 +296,7 @@ "forward": "Encaminhar", "delete": "Excluir", "archive": "Arquivar", - "archive_mailbox_not_found": "Archive mailbox not found - cannot archive email", + "archive_mailbox_not_found": "Caixa de arquivos não encontrada - não é possível arquivar e-mail", "star": "Adicionar Estrela", "unstar": "Remover Estrela", "mark_unread": "Marcar como não lido", @@ -608,8 +608,8 @@ "send": "Enviar", "cancel": "Cancelar", "attach": "Anexar", - "attach_photos": "Photos & Videos", - "attach_files": "Files", + "attach_photos": "Fotos & Vídeos", + "attach_files": "Arquivos", "discard": "Descartar", "discard_draft_title": "Descartar rascunho?", "discard_draft_confirm": "Você tem alterações não salvas. Deseja descartar este rascunho?", @@ -620,8 +620,8 @@ "cc_placeholder": "Destinatários CC", "bcc_placeholder": "Destinatários CCO", "subject_placeholder": "Assunto", - "cc_label": "CC:", - "bcc_label": "CCO:", + "cc_label": "Cc:", + "bcc_label": "Cco:", "subject_label": "Assunto:", "file_size_kb": "KB", "prefix": { @@ -927,6 +927,7 @@ "sidebar_apps": "Apps da barra lateral", "notifications": "Notificações", "layout": "Layout", + "themes": "Temas", "reading": "Leitura", "composing": "Composição", "downloads": "Downloads", @@ -1050,8 +1051,8 @@ "label": "Caixa de correio unificada", "description": "Mostrar pastas combinadas (Entrada, Enviados, etc.) de todas as contas conectadas", "cross_account": { - "label": "Across all accounts", - "description": "Merge the unified mailbox across every connected account instead of staying within the active account." + "label": "Todas as contas", + "description": "Unifique a caixa de correio em todas as contas conectadas, em vez de permanecer apenas na conta ativa." }, "include_group": { "label": "Incluir caixas de grupo", @@ -1059,26 +1060,26 @@ } }, "all_mail": { - "folders_label": "Folders in All Mail", - "folders_description": "Choose which folders are merged into the All Mail view.", - "account_hint": "Applies to {account}.", - "no_folders": "No folders available." + "folders_label": "Pastas em Todos os E-mails", + "folders_description": "Escolha quais pastas serão mescladas na visualização de Todos os E-mails.", + "account_hint": "Aplica-se a {account}.", + "no_folders": "Nenhuma pasta disponível." }, "colorful_sidebar_icons": { "label": "Ícones coloridos na barra lateral", "description": "Colorir ícones de pastas e etiquetas por tipo (Caixa de entrada azul, Spam vermelho, Enviados verde, etc.). Desative para uma barra lateral monocromática." }, "tint_list_rows": { - "label": "Tint List Rows by Tag Color", - "description": "Shade each message row with its first tag color. Disable to keep rows plain; tag dots and chips still show the color." + "label": "Colorir as linhas da lista de acordo com a cor da etiqueta", + "description": "Aplicar sombreado a cada linha de mensagem com a cor da primeira etiqueta. Desative essa opção para manter as linhas sem sombreado; os pontos e os ícones das etiquetas continuarão exibindo a cor." }, "show_folder_total_count": { "label": "Mostrar contagem total de mensagens", "description": "Mostra a contagem total de mensagens ao lado de pastas e etiquetas, além da contagem de não lidas. Desative para mostrar apenas as não lidas." }, "favicon_unread_badge": { - "label": "Unread Count on Tab Icon", - "description": "Show the inbox unread count as a badge on the browser tab icon, so new mail is visible when the tab is not focused. Disable to keep the icon unbadged." + "label": "Contagem de não lidos no Ícone da Aba", + "description": "Mostra a contagem de e-mails não lidos na aba do navegador, para que novos e-mails sejam visíveis mesmo quando a aba não estiver em foco. Desative para manter o ícone sem marca." }, "pro_interface": { "label": "Interface Pro (experimental)", @@ -1166,8 +1167,8 @@ "enabled_desc": "Mostrar notificações quando novos e-mails chegarem", "sound": "Som de notificação", "sound_desc": "Reproduzir um som quando novos e-mails chegarem", - "inbox_only": "Inbox only", - "inbox_only_desc": "Only notify for mail that lands in the Inbox; skip mail a filter files into another folder" + "inbox_only": "Apenas Caixa de Entrada", + "inbox_only_desc": "Notificar apenas pelos e-mails que chegarem à Caixa de Entrada; pular e-mails que forem filtrados para outra pasta" }, "calendar": { "title": "Notificações de calendário", @@ -1196,7 +1197,7 @@ "status_busy": "Processando…", "status_inactive": "Não ativado neste dispositivo", "status_unsupported": "Este navegador não oferece suporte a Web Push", - "status_lite": "Web Push is not available in Bulwark Lite; it needs the Bulwark server.", + "status_lite": "O Web Push não está disponível no Bulwark Lite; ele requer o servidor do Bulwark.", "title": "Notificações em segundo plano", "devices_title": "Dispositivos registrados", "devices_desc": "Todos os dispositivos registrados para receber notificações em segundo plano desta conta. Revogar um deles interrompe o recebimento imediatamente.", @@ -1236,12 +1237,12 @@ "preview_older": "Mais antigo:" }, "date_locale": { - "label": "Date format region", - "description": "How numeric dates are ordered (day, month, year)", - "auto": "Automatic (match language)", - "iso": "ISO 8601 (YYYY-MM-DD)", - "dmy": "Day/Month/Year", - "mdy": "Month/Day/Year" + "label": "Formato de data da região", + "description": "Como as datas numéricas são ordenadas (dia, mês, ano)", + "auto": "Automático (corresponder ao idioma)", + "iso": "ISO 8601 (AAAA-MM-DD)", + "dmy": "Dia/Mês/Ano", + "mdy": "Mês/Dia/Ano" }, "time_format": { "label": "Formato de Hora", @@ -1256,10 +1257,10 @@ "monday": "Segunda-feira" }, "time_zone": { - "label": "Time zone", - "description": "Show email and calendar times in this time zone instead of the one reported by your browser", - "auto": "Automatic ({zone})", - "preview_now": "Now:" + "label": "Fuso horário", + "description": "Mostrar os horários dos e-mails e da agenda neste fuso horário, em vez daquele informado pelo seu navegador", + "auto": "Automático ({zone})", + "preview_now": "Agora:" } }, "email_behavior": { @@ -1459,7 +1460,7 @@ "keywords_label": "Palavras-chave de ativação", "keywords_description": "Palavras ou frases que ativam o lembrete quando encontradas na sua mensagem", "add_placeholder": "Adicionar palavra-chave...", - "add": "Add", + "add": "Adicionar", "remove": "Remover" }, "empty_subject_warning": { @@ -1800,8 +1801,8 @@ "role_trash": "Lixeira", "role_junk": "Spam / Lixo eletrônico", "role_archive": "Arquivo", - "role_scheduled": "Scheduled", - "role_snoozed": "Snoozed", + "role_scheduled": "Programado", + "role_snoozed": "Adiado", "role_none": "Nenhum", "create_folder": "Criar pasta", "create_subfolder": "Criar subpasta", @@ -1874,9 +1875,9 @@ "button": "Ver Atalhos" }, "refresh_cache": { - "label": "Refresh cached data", - "description": "Reload contacts, calendars, and folders from the server. Keeps your accounts and sessions — fixes a stale or wrong view without signing out.", - "button": "Refresh" + "label": "Atualizar dados armazenados em cache", + "description": "Atualize os contatos, calendários e pastas do servidor. Mantém suas contas e sessões — corrige uma visualização desatualizada ou incorreta sem precisar sair da conta.", + "button": "Recarregar" }, "reset_settings": { "label": "Redefinir Configurações", @@ -2546,31 +2547,31 @@ "cert_imported": "Certificado importado", "cert_import_failed": "Falha ao importar o certificado", "section_contact": "Detalhes do contato", - "section_work": "Work", - "section_personal": "Personal", - "email_default_label": "Email", - "phone_default_label": "Phone", - "address_default_label": "Address", + "section_work": "Trabalho", + "section_personal": "Pessoal", + "email_default_label": "E-mail", + "phone_default_label": "Telefone", + "address_default_label": "Endereço", "online_service_default_label": "Online", - "organization_label": "Organization", - "title_label": "Title", - "role_label": "Role", - "language_label": "Language", - "related_default_label": "Related", + "organization_label": "Organização", + "title_label": "Título", + "role_label": "Função", + "language_label": "Idioma", + "related_default_label": "Relacionado", "more_actions": "Mais ações", "age_years": "{count, plural, one {1 ano} other {# anos}}", "years_since": "{count, plural, one {há 1 ano} other {há # anos}}" }, "activity": { - "recent_emails": "Recent Emails", - "upcoming_events": "Upcoming Events", - "no_emails": "No recent emails", - "no_events": "No upcoming events", - "no_subject": "(No subject)", - "no_title": "(No title)", - "load_failed": "Failed to load", - "unknown_sender": "Unknown sender", - "all_day": "All day" + "recent_emails": "E-mails recentes", + "upcoming_events": "Eventos futuros", + "no_emails": "Nenhum e-mail recente", + "no_events": "Nenhum evento futuro", + "no_subject": "(Sem assunto)", + "no_title": "(Sem título)", + "load_failed": "Falha ao carregar", + "unknown_sender": "Remetente desconhecido", + "all_day": "Dia todo" }, "form": { "create_title": "Novo contato", @@ -2592,7 +2593,7 @@ "nickname": "Apelido", "nickname_placeholder": "Apelido", "email": "E-mail", - "email_placeholder": "email@example.com", + "email_placeholder": "email@examplo.com.br", "phone": "Telefone", "phone_placeholder": "+55 11 1234 5678", "phone_type": "Tipo", @@ -2691,11 +2692,11 @@ "search_members": "Pesquisar contatos para adicionar...", "no_members": "Nenhum membro neste grupo", "member_count": "{count, plural, =0 {Nenhum membro} one {1 membro} other {# membros}}", - "send_email": "Send email to group", - "send_email_to": "To", + "send_email": "Enviar e-mail para o grupo", + "send_email_to": "Para", "send_email_cc": "Cc", - "send_email_bcc": "Bcc", - "no_member_emails": "This group has no members with an email address." + "send_email_bcc": "Cco", + "no_member_emails": "Este grupo não tem membros com endereço de e-mail." }, "import": { "title": "Importar contatos", @@ -3351,10 +3352,10 @@ "duplicate": "Duplicar", "duplicate_success": "Duplicado com sucesso", "duplicate_error": "Falha ao duplicar", - "share": "Share", - "shared": "Shared", - "shared_with_me": "Shared with me", - "shared_by": "Shared by {name}", + "share": "Compartilhar", + "shared": "Compartilhado", + "shared_with_me": "Compartilhado comigo", + "shared_by": "Compartilhado por {name}", "create_file_success": "Arquivo criado", "create_file_error": "Falha ao criar arquivo", "favorites": "Favoritos", diff --git a/locales/ro/common.json b/locales/ro/common.json index 60d58bd31..b9d069918 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Aplicații din bara laterală", "notifications": "Notificări", "layout": "Aspect", + "themes": "Teme", "reading": "Citire", "composing": "Redactarea", "downloads": "Descărcări", diff --git a/locales/ru/common.json b/locales/ru/common.json index 3232e5c29..f4bec98ad 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Приложения боковой панели", "notifications": "Уведомления", "layout": "Макет", + "themes": "Темы", "reading": "Чтение", "composing": "Написание", "downloads": "Загрузки", diff --git a/locales/sk/common.json b/locales/sk/common.json index 2577ded34..8b7de04f0 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "Aplikácie postranného panela", "notifications": "Oznámenia", "layout": "Rozloženie", + "themes": "Motívy", "reading": "Čítanie", "composing": "Pisanie", "downloads": "Stiahnuté", diff --git a/locales/tr/common.json b/locales/tr/common.json index 0ce9db316..ad003718f 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -927,6 +927,7 @@ "protocol_handlers": "Varsayılan uygulamalar", "notifications": "Bildirimler", "layout": "Düzen", + "themes": "Temalar", "reading": "Okuma", "composing": "Yazma", "downloads": "İndirilenler", diff --git a/locales/uk/common.json b/locales/uk/common.json index df85cb3a3..031e8cb89 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "Програми бічної панелі", "notifications": "Сповіщення", "layout": "Макет", + "themes": "Теми", "reading": "Читання", "composing": "Написання", "downloads": "Завантаження", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 9514cbb22..924634b4c 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -930,6 +930,7 @@ "sidebar_apps": "側邊欄應用程式", "notifications": "通知", "layout": "版面配置", + "themes": "主题", "reading": "閱讀", "composing": "撰寫", "downloads": "下載", diff --git a/locales/zh/common.json b/locales/zh/common.json index 5b2281191..974eef900 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -927,6 +927,7 @@ "sidebar_apps": "侧边栏应用", "notifications": "通知", "layout": "布局", + "themes": "主题", "reading": "阅读", "composing": "撰写", "downloads": "下载", diff --git a/vitest.setup.ts b/vitest.setup.ts index 73bc77b86..c40182095 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -18,6 +18,32 @@ if (typeof window !== 'undefined' && typeof window.matchMedia !== 'function') { }) as unknown as MediaQueryList; } +// jsdom 28 (resolved by the ^27 caret in package.json) no longer provides a +// localStorage implementation; the zustand persist middleware writes through +// it on every setState and several stores read from it directly. Provide a +// minimal in-memory Storage so store-backed components render under test. +if (typeof window !== 'undefined' && typeof window.localStorage === 'undefined') { + const backing = new Map(); + const localStorage: Storage = { + get length() { + return backing.size; + }, + clear: () => backing.clear(), + getItem: (key: string) => backing.get(key) ?? null, + key: (index: number) => [...backing.keys()][index] ?? null, + removeItem: (key: string) => { + backing.delete(key); + }, + setItem: (key: string, value: string) => { + backing.set(key, String(value)); + }, + }; + Object.defineProperty(window, 'localStorage', { + value: localStorage, + configurable: true, + }); +} + vi.mock('next-intl', () => ({ useTranslations: () => (key: string) => key, useLocale: () => 'en',