From a62317ba630589c69fd8844148c4b32a5f87f040 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Wed, 28 Oct 2026 04:06:12 +0100 Subject: [PATCH] fix: translate the shell's resize, close, folder count and update labels, and announce a waiting update on the admin entry --- .../layout/__tests__/shell-strings.test.tsx | 55 +++++++++++++++++++ components/layout/inline-app-view.tsx | 13 ++--- components/layout/mv-top-bar.tsx | 5 +- components/layout/navigation-rail.tsx | 9 ++- components/layout/resize-handle.tsx | 4 +- components/layout/sidebar.tsx | 5 +- locales/ar/common.json | 7 +++ locales/ca/common.json | 7 +++ locales/cs/common.json | 7 +++ locales/da/common.json | 7 +++ locales/de/common.json | 7 +++ locales/en/common.json | 7 +++ locales/es/common.json | 7 +++ locales/et/common.json | 7 +++ locales/fa/common.json | 7 +++ locales/fr/common.json | 7 +++ locales/he/common.json | 7 +++ locales/hu/common.json | 7 +++ locales/it/common.json | 7 +++ locales/ja/common.json | 7 +++ locales/ko/common.json | 7 +++ locales/lv/common.json | 7 +++ locales/mn/common.json | 7 +++ locales/nb/common.json | 7 +++ locales/nl/common.json | 7 +++ locales/pl/common.json | 7 +++ locales/pt/common.json | 7 +++ locales/ro/common.json | 7 +++ locales/ru/common.json | 7 +++ locales/sk/common.json | 7 +++ locales/th/common.json | 7 +++ locales/tr/common.json | 7 +++ locales/uk/common.json | 7 +++ locales/zh-TW/common.json | 7 +++ locales/zh/common.json | 7 +++ 35 files changed, 280 insertions(+), 14 deletions(-) create mode 100644 components/layout/__tests__/shell-strings.test.tsx diff --git a/components/layout/__tests__/shell-strings.test.tsx b/components/layout/__tests__/shell-strings.test.tsx new file mode 100644 index 000000000..43d921dc7 --- /dev/null +++ b/components/layout/__tests__/shell-strings.test.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +// Shell labels come from the translations (keys in tests), and the admin +// entry says that an update is waiting instead of a dot nobody hears. + +vi.mock('../account-switcher', () => ({ AccountSwitcher: () => null })); +vi.mock('@/components/plugins/plugin-slot', () => ({ PluginSlot: () => null })); +vi.mock('@/components/keyboard-shortcuts-modal', () => ({ KeyboardShortcutsModal: () => null })); +vi.mock('@/components/search/search-box', () => ({ SearchBox: () => null })); +vi.mock('@/hooks/use-config', () => ({ useConfig: () => ({ appName: 'Mail' }) })); +vi.mock('@/hooks/use-stalwart-admin', () => ({ useStalwartAdmin: () => true })); +vi.mock('@/i18n/navigation', () => ({ + useRouter: () => ({ push: vi.fn(), back: vi.fn(), replace: vi.fn() }), + usePathname: () => '/', + Link: ({ children, href, ...rest }: { children: React.ReactNode; href: string }) => {children}, +})); + +const { NavigationRail } = await import('../navigation-rail'); +const { MvTopBar } = await import('../mv-top-bar'); +const { ResizeHandle } = await import('../resize-handle'); +const { InlineAppView } = await import('../inline-app-view'); +const { useUpdateStore } = await import('@/stores/update-store'); + +beforeEach(() => { + useUpdateStore.setState({ + startPolling: vi.fn(), + status: { updateAvailable: true, severity: 'security', current: process.env.NEXT_PUBLIC_APP_VERSION ?? '', latest: '9.9.9' }, + } as never); +}); + +describe('shell labels', () => { + it('names the admin entry with the waiting update, in the rail, the tab bar and Mountain View', () => { + const { unmount } = render(); + expect(screen.getByRole('link', { name: 'admin, update_important' })).toBeInTheDocument(); + unmount(); + const bar = render(); + expect(screen.getByRole('link', { name: /update_important/ })).toBeInTheDocument(); + bar.unmount(); + render(); + expect(screen.getByRole('link', { name: 'admin, update_important' })).toBeInTheDocument(); + }); + + it('translates the resize handle and the inline app close button', () => { + render( + <> + {}} /> + {}} /> + + ); + expect(screen.getByRole('separator', { name: 'resize' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'close' })).toBeInTheDocument(); + }); +}); diff --git a/components/layout/inline-app-view.tsx b/components/layout/inline-app-view.tsx index 368d49c55..c74296236 100644 --- a/components/layout/inline-app-view.tsx +++ b/components/layout/inline-app-view.tsx @@ -1,6 +1,8 @@ 'use client'; +import { useTranslations } from 'next-intl'; import { X } from '@/components/icons'; +import { IconButton } from '@/components/ui/icon-button'; import { cn } from '@/lib/utils'; import type { InlineAppState } from '@/hooks/use-sidebar-apps'; @@ -12,6 +14,7 @@ interface InlineAppViewProps { } export function InlineAppView({ apps, activeAppId, onClose, className }: InlineAppViewProps) { + const tCommon = useTranslations('common'); const activeApp = apps.find((a) => a.id === activeAppId); return ( @@ -19,13 +22,9 @@ export function InlineAppView({ apps, activeAppId, onClose, className }: InlineA {/* Header bar */}

{activeApp?.name}

- + + +
{/* Iframes - active one visible, rest hidden but alive */}
diff --git a/components/layout/mv-top-bar.tsx b/components/layout/mv-top-bar.tsx index f3e74cf9a..9694e6763 100644 --- a/components/layout/mv-top-bar.tsx +++ b/components/layout/mv-top-bar.tsx @@ -117,6 +117,7 @@ export function MvTopBar({ }: MvTopBarProps) { const t = useTranslations("sidebar"); const tSearch = useTranslations("advanced_search"); + const tShell = useTranslations("shell"); const pathname = usePathname(); const router = useRouter(); const allInboxesReachable = useAllInboxesReachable(); @@ -289,7 +290,7 @@ export function MvTopBar({ href={`${getPathPrefix()}/admin`} className="relative grid place-items-center w-12 h-12 rounded-full text-muted-foreground hover:bg-muted hover:text-foreground transition-colors" title={t("admin")} - aria-label={t("admin")} + aria-label={hasUpdate ? `${t("admin")}, ${tShell(updateImportant ? "update_important" : "update_available")}` : t("admin")} > {hasUpdate && ( @@ -298,7 +299,7 @@ export function MvTopBar({ "absolute top-3 end-3 w-2 h-2 rounded-full ring-2 ring-background", updateImportant ? "bg-red-500" : "bg-amber-500", )} - aria-label={updateImportant ? "Important update available" : "Update available"} + aria-hidden="true" /> )} diff --git a/components/layout/navigation-rail.tsx b/components/layout/navigation-rail.tsx index 1ea2ad81f..c3c0af96b 100644 --- a/components/layout/navigation-rail.tsx +++ b/components/layout/navigation-rail.tsx @@ -253,6 +253,9 @@ export function NavigationRail({ const startUpdatePolling = useUpdateStore((s) => s.startPolling); useEffect(() => { startUpdatePolling(); }, [startUpdatePolling]); const updateImportant = updateSeverity === 'security' || updateSeverity === 'deprecated'; + const tShell = useTranslations("shell"); + // Said with the admin entry; its dot alone is not announced. + const updateLabel = hasUpdate ? tShell(updateImportant ? "update_important" : "update_available") : null; // Account list for rail const accounts = useAccountStore((s) => s.accounts); @@ -501,11 +504,12 @@ export function NavigationRail({ "absolute -top-0.5 -end-0.5 w-2 h-2 rounded-full ring-2 ring-background", updateImportant ? "bg-red-500" : "bg-amber-500", )} - aria-label={updateImportant ? "Important update available" : "Update available"} + aria-hidden="true" /> )} {t("admin") || "Admin"} + {updateLabel && {`, ${updateLabel}`}} )} @@ -729,6 +733,7 @@ export function NavigationRail({ adminActive ? "bg-primary/10 text-primary" : "text-muted-foreground hover:text-foreground hover:bg-muted", )} title={t("admin") || "Admin"} + aria-label={updateLabel ? `${t("admin") || "Admin"}, ${updateLabel}` : undefined} aria-current={adminActive ? "page" : undefined} > @@ -738,7 +743,7 @@ export function NavigationRail({ "absolute top-2 end-2 w-2 h-2 rounded-full ring-2 ring-background", updateImportant ? "bg-red-500" : "bg-amber-500", )} - aria-label={updateImportant ? "Important update available" : "Update available"} + aria-hidden="true" /> )} diff --git a/components/layout/resize-handle.tsx b/components/layout/resize-handle.tsx index 81915c038..33e853d90 100644 --- a/components/layout/resize-handle.tsx +++ b/components/layout/resize-handle.tsx @@ -1,6 +1,7 @@ "use client"; import { useCallback, useEffect, useRef } from "react"; +import { useTranslations } from "next-intl"; import { cn } from "@/lib/utils"; interface ResizeHandleProps { @@ -17,6 +18,7 @@ interface ResizeHandleProps { const KEYBOARD_STEP = 10; export function ResizeHandle({ onResizeStart, onResize, onResizeEnd, onDoubleClick, orientation = "vertical", className, testId }: ResizeHandleProps) { + const t = useTranslations("shell"); const handleRef = useRef(null); // Id of the pointer that started the drag, or null when idle. Only that // pointer may move or end the drag, so a second finger or button can't @@ -120,7 +122,7 @@ export function ResizeHandle({ onResizeStart, onResize, onResizeEnd, onDoubleCli ref={handleRef} role="separator" aria-orientation={isHorizontal ? "horizontal" : "vertical"} - aria-label="Resize" + aria-label={t("resize")} data-testid={testId} tabIndex={0} onPointerDown={handlePointerDown} diff --git a/components/layout/sidebar.tsx b/components/layout/sidebar.tsx index 2ae285a74..f8d48490d 100644 --- a/components/layout/sidebar.tsx +++ b/components/layout/sidebar.tsx @@ -222,6 +222,7 @@ function SidebarRowCounts({ isSelected: boolean; onUnreadClick?: () => void; }) { + const tShell = useTranslations('shell'); const showFolderTotalCount = useSettingsStore(s => s.showFolderTotalCount); const mountainView = useSettingsStore(s => s.interfaceLayout === 'mountain-view'); // Per-folder override from the folder settings (#982). @@ -272,7 +273,7 @@ function SidebarRowCounts({ } }} className={cn(unreadClass, "cursor-pointer hover:underline")} - title={`${unreadCount} unread`} + title={tShell("folder_unread", { count: unreadCount })} > {unreadCount} @@ -284,7 +285,7 @@ function SidebarRowCounts({ return ( 0 ? `${unreadCount} unread / ${totalCount} total` : `${unreadCount} unread`} + title={totalCount > 0 ? tShell("folder_counts", { unread: unreadCount, total: totalCount }) : tShell("folder_unread", { count: unreadCount })} data-testid="folder-counts" data-unread={unreadCount} data-total={totalCount} diff --git a/locales/ar/common.json b/locales/ar/common.json index 9680a164b..fb4ddec8d 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "خيارات أخرى" }, + "shell": { + "resize": "تغيير الحجم", + "update_available": "يتوفر تحديث", + "update_important": "يتوفر تحديث مهم", + "folder_unread": "{count} غير مقروءة", + "folder_counts": "{unread} غير مقروءة، {total} إجمالًا" + }, "plugin_pages": { "loading": "جارٍ تحميل الصفحة", "not_available_title": "هذه الصفحة غير متاحة", diff --git a/locales/ca/common.json b/locales/ca/common.json index 76cc628b9..e765a488e 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Més opcions" }, + "shell": { + "resize": "Canvia la mida", + "update_available": "Hi ha una actualització", + "update_important": "Hi ha una actualització important", + "folder_unread": "{count} sense llegir", + "folder_counts": "{unread} sense llegir, {total} en total" + }, "plugin_pages": { "loading": "S'està carregant la pàgina", "not_available_title": "Aquesta pàgina no està disponible", diff --git a/locales/cs/common.json b/locales/cs/common.json index b2a16fcb7..5acec63ea 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Další možnosti" }, + "shell": { + "resize": "Změnit velikost", + "update_available": "Je k dispozici aktualizace", + "update_important": "Je k dispozici důležitá aktualizace", + "folder_unread": "Nepřečteno: {count}", + "folder_counts": "Nepřečteno: {unread}, celkem: {total}" + }, "plugin_pages": { "loading": "Načítání stránky", "not_available_title": "Tato stránka není k dispozici", diff --git a/locales/da/common.json b/locales/da/common.json index 6ba2d2f33..5cfebcf04 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Flere muligheder" }, + "shell": { + "resize": "Tilpas størrelse", + "update_available": "Opdatering tilgængelig", + "update_important": "Vigtig opdatering tilgængelig", + "folder_unread": "{count} ulæste", + "folder_counts": "{unread} ulæste, {total} i alt" + }, "plugin_pages": { "loading": "Indlæser side", "not_available_title": "Denne side er ikke tilgængelig", diff --git a/locales/de/common.json b/locales/de/common.json index 1461e4a8b..ba45b371c 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Weitere Optionen" }, + "shell": { + "resize": "Größe ändern", + "update_available": "Update verfügbar", + "update_important": "Wichtiges Update verfügbar", + "folder_unread": "{count} ungelesen", + "folder_counts": "{unread} ungelesen, {total} insgesamt" + }, "plugin_pages": { "loading": "Seite wird geladen", "not_available_title": "Diese Seite ist nicht verfügbar", diff --git a/locales/en/common.json b/locales/en/common.json index 78719b817..b34cacbbf 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "More options" }, + "shell": { + "resize": "Resize", + "update_available": "Update available", + "update_important": "Important update available", + "folder_unread": "{count} unread", + "folder_counts": "{unread} unread, {total} total" + }, "plugin_pages": { "loading": "Loading page", "not_available_title": "This page is not available", diff --git a/locales/es/common.json b/locales/es/common.json index c98e82ab6..672e7a0fc 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Más opciones" }, + "shell": { + "resize": "Cambiar tamaño", + "update_available": "Actualización disponible", + "update_important": "Actualización importante disponible", + "folder_unread": "{count} sin leer", + "folder_counts": "{unread} sin leer, {total} en total" + }, "plugin_pages": { "loading": "Cargando la página", "not_available_title": "Esta página no está disponible", diff --git a/locales/et/common.json b/locales/et/common.json index eaca8757c..e726eeff0 100644 --- a/locales/et/common.json +++ b/locales/et/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Rohkem valikuid" }, + "shell": { + "resize": "Muuda suurust", + "update_available": "Saadaval on värskendus", + "update_important": "Saadaval on oluline värskendus", + "folder_unread": "Lugemata: {count}", + "folder_counts": "Lugemata: {unread}, kokku: {total}" + }, "plugin_pages": { "loading": "Lehe laadimine", "not_available_title": "See leht pole saadaval", diff --git a/locales/fa/common.json b/locales/fa/common.json index 2ee1e9747..1840ca58d 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "گزینه‌های بیشتر" }, + "shell": { + "resize": "تغییر اندازه", + "update_available": "به‌روزرسانی موجود است", + "update_important": "به‌روزرسانی مهم موجود است", + "folder_unread": "{count} خوانده‌نشده", + "folder_counts": "{unread} خوانده‌نشده، {total} در مجموع" + }, "plugin_pages": { "loading": "در حال بارگذاری صفحه", "not_available_title": "این صفحه در دسترس نیست", diff --git a/locales/fr/common.json b/locales/fr/common.json index 051a31a6c..421f256f9 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Plus d'options" }, + "shell": { + "resize": "Redimensionner", + "update_available": "Mise à jour disponible", + "update_important": "Mise à jour importante disponible", + "folder_unread": "{count} non lus", + "folder_counts": "{unread} non lus, {total} au total" + }, "plugin_pages": { "loading": "Chargement de la page", "not_available_title": "Cette page n'est pas disponible", diff --git a/locales/he/common.json b/locales/he/common.json index bfa7059f4..1fd39b1d0 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -4581,6 +4581,13 @@ "top_bar": { "more": "אפשרויות נוספות" }, + "shell": { + "resize": "שינוי גודל", + "update_available": "יש עדכון", + "update_important": "יש עדכון חשוב", + "folder_unread": "{count} שלא נקראו", + "folder_counts": "{unread} שלא נקראו, {total} בסך הכול" + }, "plugin_pages": { "loading": "טוען את הדף", "not_available_title": "הדף הזה אינו זמין", diff --git a/locales/hu/common.json b/locales/hu/common.json index 9efe67330..b7a1127e6 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "További lehetőségek" }, + "shell": { + "resize": "Átméretezés", + "update_available": "Frissítés érhető el", + "update_important": "Fontos frissítés érhető el", + "folder_unread": "{count} olvasatlan", + "folder_counts": "{unread} olvasatlan, összesen {total}" + }, "plugin_pages": { "loading": "Oldal betöltése", "not_available_title": "Ez az oldal nem érhető el", diff --git a/locales/it/common.json b/locales/it/common.json index 38c756512..0b3a2be92 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Altre opzioni" }, + "shell": { + "resize": "Ridimensiona", + "update_available": "Aggiornamento disponibile", + "update_important": "Aggiornamento importante disponibile", + "folder_unread": "{count} non letti", + "folder_counts": "{unread} non letti, {total} in totale" + }, "plugin_pages": { "loading": "Caricamento della pagina", "not_available_title": "Questa pagina non è disponibile", diff --git a/locales/ja/common.json b/locales/ja/common.json index d4978091c..8424924fb 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "その他のオプション" }, + "shell": { + "resize": "サイズを変更", + "update_available": "アップデートがあります", + "update_important": "重要なアップデートがあります", + "folder_unread": "未読 {count} 件", + "folder_counts": "未読 {unread} 件 / 全 {total} 件" + }, "plugin_pages": { "loading": "ページを読み込んでいます", "not_available_title": "このページは利用できません", diff --git a/locales/ko/common.json b/locales/ko/common.json index a74721f69..e3d897ad0 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "추가 옵션" }, + "shell": { + "resize": "크기 조정", + "update_available": "업데이트가 있습니다", + "update_important": "중요한 업데이트가 있습니다", + "folder_unread": "읽지 않음 {count}개", + "folder_counts": "읽지 않음 {unread}개, 전체 {total}개" + }, "plugin_pages": { "loading": "페이지를 불러오는 중", "not_available_title": "이 페이지를 사용할 수 없습니다", diff --git a/locales/lv/common.json b/locales/lv/common.json index 5cb9cbe76..f7d1846c6 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Citas iespējas" }, + "shell": { + "resize": "Mainīt izmēru", + "update_available": "Pieejams atjauninājums", + "update_important": "Pieejams svarīgs atjauninājums", + "folder_unread": "Nelasīti: {count}", + "folder_counts": "Nelasīti: {unread}, kopā: {total}" + }, "plugin_pages": { "loading": "Ielādē lapu", "not_available_title": "Šī lapa nav pieejama", diff --git a/locales/mn/common.json b/locales/mn/common.json index 5b62a975f..38c52b3fa 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Бусад сонголт" }, + "shell": { + "resize": "Хэмжээ өөрчлөх", + "update_available": "Шинэчлэл гарсан", + "update_important": "Чухал шинэчлэл гарсан", + "folder_unread": "{count} уншаагүй", + "folder_counts": "{unread} уншаагүй, нийт {total}" + }, "plugin_pages": { "loading": "Хуудсыг ачаалж байна", "not_available_title": "Энэ хуудас боломжгүй байна", diff --git a/locales/nb/common.json b/locales/nb/common.json index 1d646f905..31a86f917 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Flere alternativer" }, + "shell": { + "resize": "Endre størrelse", + "update_available": "Oppdatering tilgjengelig", + "update_important": "Viktig oppdatering tilgjengelig", + "folder_unread": "{count} uleste", + "folder_counts": "{unread} uleste, {total} totalt" + }, "plugin_pages": { "loading": "Laster inn siden", "not_available_title": "Denne siden er ikke tilgjengelig", diff --git a/locales/nl/common.json b/locales/nl/common.json index f4e4dd7f3..0f0255bb9 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Meer opties" }, + "shell": { + "resize": "Formaat wijzigen", + "update_available": "Update beschikbaar", + "update_important": "Belangrijke update beschikbaar", + "folder_unread": "{count} ongelezen", + "folder_counts": "{unread} ongelezen, {total} totaal" + }, "plugin_pages": { "loading": "Pagina laden", "not_available_title": "Deze pagina is niet beschikbaar", diff --git a/locales/pl/common.json b/locales/pl/common.json index 4a7f4ea29..b4ac17fbb 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Więcej opcji" }, + "shell": { + "resize": "Zmień rozmiar", + "update_available": "Dostępna aktualizacja", + "update_important": "Dostępna ważna aktualizacja", + "folder_unread": "Nieprzeczytane: {count}", + "folder_counts": "Nieprzeczytane: {unread}, łącznie: {total}" + }, "plugin_pages": { "loading": "Wczytywanie strony", "not_available_title": "Ta strona jest niedostępna", diff --git a/locales/pt/common.json b/locales/pt/common.json index 344c3d826..b629709cb 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Mais opções" }, + "shell": { + "resize": "Redimensionar", + "update_available": "Atualização disponível", + "update_important": "Atualização importante disponível", + "folder_unread": "{count} não lidas", + "folder_counts": "{unread} não lidas, {total} no total" + }, "plugin_pages": { "loading": "Carregando a página", "not_available_title": "Esta página não está disponível", diff --git a/locales/ro/common.json b/locales/ro/common.json index 6daa65529..252f848be 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Mai multe opțiuni" }, + "shell": { + "resize": "Redimensionează", + "update_available": "Actualizare disponibilă", + "update_important": "Actualizare importantă disponibilă", + "folder_unread": "{count} necitite", + "folder_counts": "{unread} necitite, {total} în total" + }, "plugin_pages": { "loading": "Se încarcă pagina", "not_available_title": "Această pagină nu este disponibilă", diff --git a/locales/ru/common.json b/locales/ru/common.json index bba4f47b5..9b671594a 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Другие действия" }, + "shell": { + "resize": "Изменить размер", + "update_available": "Доступно обновление", + "update_important": "Доступно важное обновление", + "folder_unread": "Непрочитанных: {count}", + "folder_counts": "Непрочитанных: {unread}, всего: {total}" + }, "plugin_pages": { "loading": "Загрузка страницы", "not_available_title": "Эта страница недоступна", diff --git a/locales/sk/common.json b/locales/sk/common.json index 2f686d928..7a52faaec 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Ďalšie možnosti" }, + "shell": { + "resize": "Zmeniť veľkosť", + "update_available": "K dispozícii je aktualizácia", + "update_important": "K dispozícii je dôležitá aktualizácia", + "folder_unread": "Neprečítané: {count}", + "folder_counts": "Neprečítané: {unread}, spolu: {total}" + }, "plugin_pages": { "loading": "Načítava sa stránka", "not_available_title": "Táto stránka nie je k dispozícii", diff --git a/locales/th/common.json b/locales/th/common.json index 896b8b600..65fc76c51 100644 --- a/locales/th/common.json +++ b/locales/th/common.json @@ -41,6 +41,13 @@ "top_bar": { "more": "ตัวเลือกเพิ่มเติม" }, + "shell": { + "resize": "ปรับขนาด", + "update_available": "มีอัปเดต", + "update_important": "มีอัปเดตสำคัญ", + "folder_unread": "ยังไม่ได้อ่าน {count}", + "folder_counts": "ยังไม่ได้อ่าน {unread} จากทั้งหมด {total}" + }, "date": { "today": "วันนี้", "yesterday": "เมื่อวานนี้", diff --git a/locales/tr/common.json b/locales/tr/common.json index 284279d5a..57c52ea3b 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Diğer seçenekler" }, + "shell": { + "resize": "Yeniden boyutlandır", + "update_available": "Güncelleme var", + "update_important": "Önemli güncelleme var", + "folder_unread": "{count} okunmamış", + "folder_counts": "{unread} okunmamış, toplam {total}" + }, "plugin_pages": { "loading": "Sayfa yükleniyor", "not_available_title": "Bu sayfa kullanılamıyor", diff --git a/locales/uk/common.json b/locales/uk/common.json index a44d9612d..fa1fbdb0e 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "Інші дії" }, + "shell": { + "resize": "Змінити розмір", + "update_available": "Доступне оновлення", + "update_important": "Доступне важливе оновлення", + "folder_unread": "Непрочитаних: {count}", + "folder_counts": "Непрочитаних: {unread}, усього: {total}" + }, "plugin_pages": { "loading": "Завантаження сторінки", "not_available_title": "Ця сторінка недоступна", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index caf616f90..c50de1edc 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "更多選項" }, + "shell": { + "resize": "調整大小", + "update_available": "有可用的更新", + "update_important": "有重要更新", + "folder_unread": "{count} 封未讀", + "folder_counts": "{unread} 封未讀,共 {total} 封" + }, "plugin_pages": { "loading": "正在載入頁面", "not_available_title": "此頁面無法使用", diff --git a/locales/zh/common.json b/locales/zh/common.json index 303e158b4..706996c36 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -4580,6 +4580,13 @@ "top_bar": { "more": "更多选项" }, + "shell": { + "resize": "调整大小", + "update_available": "有可用更新", + "update_important": "有重要更新", + "folder_unread": "{count} 封未读", + "folder_counts": "{unread} 封未读,共 {total} 封" + }, "plugin_pages": { "loading": "正在加载页面", "not_available_title": "此页面不可用",