feat: refresh Calendar, Contacts and Files with F9 in the desktop app, and move through the calendar from Go

This commit is contained in:
Linus Rath
2026-11-04 13:57:46 +01:00
parent 49286649dd
commit 179d3994bb
35 changed files with 451 additions and 1 deletions
@@ -30,6 +30,7 @@ vi.mock('@/hooks/use-config', () => ({ useConfig: () => config }));
import { CalendarApp } from '../calendar-app';
import { requestAppCommand } from '@/lib/app-commands';
import { mergedDesktopState, resetDesktopCommands, runDesktopCommand } from '@/lib/desktop/commands';
vi.setConfig({ testTimeout: 30000 });
@@ -84,3 +85,32 @@ describe('Calendar in the desktop menus', () => {
expect(screen.queryByRole('dialog', { name: 'title' })).toBeNull();
});
});
// pim-p2-9 (2026-11-04): the desktop app's Go menu in Calendar moves through time
// (Today, Next period, Previous period) instead of offering Mail's folders.
describe('Calendar in the desktop Go menu', () => {
beforeEach(() => {
resetDesktopCommands();
(window as unknown as { bulwarkDesktop: unknown }).bulwarkDesktop = { version: 1, platform: 'win32', menu: { setState: vi.fn(), onCommand: vi.fn() } };
});
afterEach(() => {
delete (window as unknown as { bulwarkDesktop?: unknown }).bulwarkDesktop;
resetDesktopCommands();
});
it('offers Today, Next period and Previous period, and each moves the week', () => {
render(<CalendarApp />);
const state = mergedDesktopState();
expect(state['go.today']).toBe(true);
expect(state['go.nextPeriod']).toBe(true);
expect(state['go.previousPeriod']).toBe(true);
const day = () => useCalendarStore.getState().selectedDate.toDateString();
act(() => { expect(runDesktopCommand('go.nextPeriod')).toBe(true); });
expect(day()).toBe(new Date(2026, 9, 19).toDateString());
act(() => { runDesktopCommand('go.previousPeriod'); });
act(() => { runDesktopCommand('go.previousPeriod'); });
expect(day()).toBe(new Date(2026, 9, 5).toDateString());
act(() => { runDesktopCommand('go.today'); });
expect(day()).toBe(new Date().toDateString());
});
});
+8 -1
View File
@@ -1686,7 +1686,7 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
"new-task": () => { if (enableCalendarTasks) openCreateTaskModal(); },
"import-calendar": () => { if (!demoMode) setShowImportModal(true); },
}, true);
// Its View menu's Day, Week, Month and Agenda, and Edit > Search events.
// Its View menu's Day, Week, Month and Agenda, Go's Today and periods, and Edit > Search events.
const viewFromMenu = (mode: CalendarViewMode) => () => { setMobileReturnToMonth(false); leaveSearch(); setViewMode(mode); };
useDesktopCommands({
"view.calendar.day": viewFromMenu("day"),
@@ -1694,7 +1694,14 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
"view.calendar.month": viewFromMenu("month"),
"view.calendar.agenda": viewFromMenu("agenda"),
"edit.search": openSearch,
// Go > Today, Next period and Previous period: the toolbar's arrows and T.
"go.today": () => { leaveSearch(); goToToday(); },
"go.nextPeriod": () => { leaveSearch(); navigateNext(); },
"go.previousPeriod": () => { leaveSearch(); navigatePrev(); },
}, {
"go.today": normalizedViewMode !== "tasks",
"go.nextPeriod": normalizedViewMode !== "tasks",
"go.previousPeriod": normalizedViewMode !== "tasks",
"view.calendar.day": { enabled: true, checked: normalizedViewMode === "day" },
"view.calendar.week": { enabled: true, checked: normalizedViewMode === "week" },
"view.calendar.month": { enabled: true, checked: normalizedViewMode === "month" },
@@ -0,0 +1,42 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, act } from '@testing-library/react';
import { useRefreshGesture } from '@/hooks/use-refresh-gesture';
import { mergedDesktopState, resetDesktopCommands, runDesktopCommand } from '@/lib/desktop/commands';
/**
* pim-p2-9 (2026-11-04): in the desktop app View > Refresh (F9) was Mail's "Check
* for new mail" and greyed in Calendar, Contacts and Files. Each screen's own
* refresh (the one F5 and pull-to-refresh run) now answers the menu.
*/
function Screen({ onRefresh, enabled = true }: { onRefresh: () => void; enabled?: boolean }) {
const { indicator } = useRefreshGesture({ onRefresh, enabled });
return <div>{indicator}</div>;
}
describe('useRefreshGesture in the desktop app', () => {
beforeEach(() => {
resetDesktopCommands();
(window as unknown as { bulwarkDesktop: unknown }).bulwarkDesktop = { version: 1, platform: 'win32', menu: { setState: vi.fn(), onCommand: vi.fn() } };
});
afterEach(() => {
delete (window as unknown as { bulwarkDesktop?: unknown }).bulwarkDesktop;
resetDesktopCommands();
});
it('enables View > Refresh and runs the screen refresh from it', async () => {
const onRefresh = vi.fn();
render(<Screen onRefresh={onRefresh} />);
expect(mergedDesktopState()['view.refresh']).toBe(true);
await act(async () => {
expect(runDesktopCommand('view.refresh')).toBe(true);
});
expect(onRefresh).toHaveBeenCalledTimes(1);
});
it('offers nothing while the screen can not refresh', () => {
render(<Screen onRefresh={vi.fn()} enabled={false} />);
expect(mergedDesktopState()['view.refresh']).toBeUndefined();
expect(runDesktopCommand('view.refresh')).toBe(false);
});
});
+7
View File
@@ -3,6 +3,7 @@
import { useEffect, useMemo, useRef } from "react";
import { useTranslations } from "next-intl";
import { getDesktopBridge } from "@/lib/desktop/bridge";
import { useDesktopCommands } from "@/lib/desktop/commands";
import {
PullToRefreshIndicator,
createPullToRefreshStore,
@@ -93,8 +94,12 @@ export function useRefreshGesture({ onRefresh, enabled = true }: UseRefreshGestu
const t = useTranslations("common");
const onRefreshRef = useRef(onRefresh);
const runningRef = useRef(false);
const triggerRef = useRef<(() => void) | null>(null);
const store = useMemo(() => createPullToRefreshStore(), []);
// The desktop app's View > Refresh (F9, F5) runs the same refresh for the screen in front.
useDesktopCommands({ "view.refresh": () => triggerRef.current?.() }, { "view.refresh": enabled }, enabled);
useEffect(() => {
onRefreshRef.current = onRefresh;
}, [onRefresh]);
@@ -135,6 +140,7 @@ export function useRefreshGesture({ onRefresh, enabled = true }: UseRefreshGestu
}
})();
};
triggerRef.current = trigger;
const handleKeyDown = (event: KeyboardEvent) => {
const isReloadKey =
@@ -240,6 +246,7 @@ export function useRefreshGesture({ onRefresh, enabled = true }: UseRefreshGestu
window.removeEventListener("touchcancel", cancelPull);
timers.forEach(clearTimeout);
timers.clear();
if (triggerRef.current === trigger) triggerRef.current = null;
store.set({ phase: "idle", distance: 0 });
};
}, [enabled, store]);
+4
View File
@@ -91,6 +91,7 @@ export function shellLabels(t: (key: string, values?: Record<string, string>) =>
menuSelectAll: t('desktopUi.menu.select_all'),
menuSearch: t('desktopUi.menu.search'),
menuRefresh: t('desktopUi.menu.refresh'),
menuRefreshView: t('ux_p2_pim_cm.menu_refresh'),
menuReadingPane: t('desktopUi.menu.reading_pane'),
menuPaneRight: t('desktopUi.menu.pane_right'),
menuPaneBelow: t('desktopUi.menu.pane_below'),
@@ -112,6 +113,9 @@ export function shellLabels(t: (key: string, values?: Record<string, string>) =>
menuDelete: t('context_menu.delete'),
menuOpenInWindow: t('desktopUi.menu.open_in_window'),
menuGoInbox: t('sidebar.mailboxes.inbox'),
menuGoToday: t('ux_p2_pim_cm.menu_today'),
menuGoNextPeriod: t('ux_p2_pim_cm.menu_next_period'),
menuGoPreviousPeriod: t('ux_p2_pim_cm.menu_previous_period'),
menuGoSent: t('sidebar.mailboxes.sent'),
menuGoDrafts: t('sidebar.mailboxes.drafts'),
menuGoNext: t('desktopUi.menu.next_message'),
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "التقويم…",
"import_contacts": "جهات الاتصال…"
},
"ux_p2_pim_cm": {
"menu_refresh": "تحديث",
"menu_today": "اليوم",
"menu_next_period": "الفترة التالية",
"menu_previous_period": "الفترة السابقة",
"account_scope_label": "يعرض {address}. تبديل الحساب",
"account_scope_menu": "تبديل الحساب",
"merge_links": "روابط",
"merge_photo": "صورة",
"merge_kept": "محفوظ",
"import_show": "عرض"
},
"desktopEdit": {
"edit": "تعديل",
"edit_named": "تعديل {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendari…",
"import_contacts": "Contactes…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Actualitza",
"menu_today": "Avui",
"menu_next_period": "Període següent",
"menu_previous_period": "Període anterior",
"account_scope_label": "Es mostra {address}. Canvia de compte",
"account_scope_menu": "Canvia de compte",
"merge_links": "Enllaços",
"merge_photo": "Foto",
"merge_kept": "Es conserva",
"import_show": "Mostra"
},
"desktopEdit": {
"edit": "Edita",
"edit_named": "Edita {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalendář…",
"import_contacts": "Kontakty…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Obnovit",
"menu_today": "Dnes",
"menu_next_period": "Další období",
"menu_previous_period": "Předchozí období",
"account_scope_label": "Zobrazuje se {address}. Přepnout účet",
"account_scope_menu": "Přepnout účet",
"merge_links": "Odkazy",
"merge_photo": "Fotka",
"merge_kept": "Zůstane",
"import_show": "Zobrazit"
},
"desktopEdit": {
"edit": "Upravit",
"edit_named": "Upravit {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalender…",
"import_contacts": "Kontakter…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Opdater",
"menu_today": "I dag",
"menu_next_period": "Næste periode",
"menu_previous_period": "Forrige periode",
"account_scope_label": "Viser {address}. Skift konto",
"account_scope_menu": "Skift konto",
"merge_links": "Links",
"merge_photo": "Foto",
"merge_kept": "Beholdes",
"import_show": "Vis"
},
"desktopEdit": {
"edit": "Rediger",
"edit_named": "Rediger {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalender…",
"import_contacts": "Kontakte…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Aktualisieren",
"menu_today": "Heute",
"menu_next_period": "Nächster Zeitraum",
"menu_previous_period": "Vorheriger Zeitraum",
"account_scope_label": "Zeigt {address}. Konto wechseln",
"account_scope_menu": "Konto wechseln",
"merge_links": "Links",
"merge_photo": "Foto",
"merge_kept": "Bleibt erhalten",
"import_show": "Anzeigen"
},
"desktopEdit": {
"edit": "Bearbeiten",
"edit_named": "{name} bearbeiten",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendar…",
"import_contacts": "Contacts…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Refresh",
"menu_today": "Today",
"menu_next_period": "Next period",
"menu_previous_period": "Previous period",
"account_scope_label": "Showing {address}. Switch account",
"account_scope_menu": "Switch account",
"merge_links": "Links",
"merge_photo": "Photo",
"merge_kept": "Kept",
"import_show": "Show"
},
"desktopEdit": {
"edit": "Edit",
"edit_named": "Edit {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendario…",
"import_contacts": "Contactos…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Actualizar",
"menu_today": "Hoy",
"menu_next_period": "Periodo siguiente",
"menu_previous_period": "Periodo anterior",
"account_scope_label": "Se muestra {address}. Cambiar de cuenta",
"account_scope_menu": "Cambiar de cuenta",
"merge_links": "Enlaces",
"merge_photo": "Foto",
"merge_kept": "Se conserva",
"import_show": "Mostrar"
},
"desktopEdit": {
"edit": "Editar",
"edit_named": "Editar {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalender…",
"import_contacts": "Kontaktid…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Värskenda",
"menu_today": "Täna",
"menu_next_period": "Järgmine periood",
"menu_previous_period": "Eelmine periood",
"account_scope_label": "Kuvatakse {address}. Vaheta kontot",
"account_scope_menu": "Vaheta kontot",
"merge_links": "Lingid",
"merge_photo": "Foto",
"merge_kept": "Jääb alles",
"import_show": "Näita"
},
"desktopEdit": {
"edit": "Muuda",
"edit_named": "Muuda faili {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "تقویم…",
"import_contacts": "مخاطبین…"
},
"ux_p2_pim_cm": {
"menu_refresh": "بازخوانی",
"menu_today": "امروز",
"menu_next_period": "بازه بعدی",
"menu_previous_period": "بازه قبلی",
"account_scope_label": "نمایش {address}. تغییر حساب",
"account_scope_menu": "تغییر حساب",
"merge_links": "پیوندها",
"merge_photo": "عکس",
"merge_kept": "حفظ می‌شود",
"import_show": "نمایش"
},
"desktopEdit": {
"edit": "ویرایش",
"edit_named": "ویرایش {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendrier…",
"import_contacts": "Contacts…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Actualiser",
"menu_today": "Aujourd’hui",
"menu_next_period": "Période suivante",
"menu_previous_period": "Période précédente",
"account_scope_label": "Affiche {address}. Changer de compte",
"account_scope_menu": "Changer de compte",
"merge_links": "Liens",
"merge_photo": "Photo",
"merge_kept": "Conservé",
"import_show": "Afficher"
},
"desktopEdit": {
"edit": "Modifier",
"edit_named": "Modifier {name}",
+12
View File
@@ -7520,6 +7520,18 @@
"import_calendar": "לוח שנה…",
"import_contacts": "אנשי קשר…"
},
"ux_p2_pim_cm": {
"menu_refresh": "רענון",
"menu_today": "היום",
"menu_next_period": "התקופה הבאה",
"menu_previous_period": "התקופה הקודמת",
"account_scope_label": "מוצג {address}. החלפת חשבון",
"account_scope_menu": "החלפת חשבון",
"merge_links": "קישורים",
"merge_photo": "תמונה",
"merge_kept": "נשמר",
"import_show": "הצגה"
},
"desktopEdit": {
"edit": "עריכה",
"edit_named": "עריכת {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Naptár…",
"import_contacts": "Névjegyek…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Frissítés",
"menu_today": "Ma",
"menu_next_period": "Következő időszak",
"menu_previous_period": "Előző időszak",
"account_scope_label": "Látható: {address}. Fiókváltás",
"account_scope_menu": "Fiókváltás",
"merge_links": "Hivatkozások",
"merge_photo": "Fénykép",
"merge_kept": "Megmarad",
"import_show": "Megjelenítés"
},
"desktopEdit": {
"edit": "Szerkesztés",
"edit_named": "{name} szerkesztése",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendario…",
"import_contacts": "Contatti…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Aggiorna",
"menu_today": "Oggi",
"menu_next_period": "Periodo successivo",
"menu_previous_period": "Periodo precedente",
"account_scope_label": "Mostra {address}. Cambia account",
"account_scope_menu": "Cambia account",
"merge_links": "Link",
"merge_photo": "Foto",
"merge_kept": "Mantenuto",
"import_show": "Mostra"
},
"desktopEdit": {
"edit": "Modifica",
"edit_named": "Modifica {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "カレンダー…",
"import_contacts": "連絡先…"
},
"ux_p2_pim_cm": {
"menu_refresh": "更新",
"menu_today": "今日",
"menu_next_period": "次の期間",
"menu_previous_period": "前の期間",
"account_scope_label": "{address} を表示中。アカウントを切り替え",
"account_scope_menu": "アカウントを切り替え",
"merge_links": "リンク",
"merge_photo": "写真",
"merge_kept": "残ります",
"import_show": "表示"
},
"desktopEdit": {
"edit": "編集",
"edit_named": "{name} を編集",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "캘린더…",
"import_contacts": "연락처…"
},
"ux_p2_pim_cm": {
"menu_refresh": "새로 고침",
"menu_today": "오늘",
"menu_next_period": "다음 기간",
"menu_previous_period": "이전 기간",
"account_scope_label": "{address} 표시 중. 계정 전환",
"account_scope_menu": "계정 전환",
"merge_links": "링크",
"merge_photo": "사진",
"merge_kept": "유지됨",
"import_show": "보기"
},
"desktopEdit": {
"edit": "편집",
"edit_named": "{name} 편집",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalendārs…",
"import_contacts": "Kontakti…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Atsvaidzināt",
"menu_today": "Šodien",
"menu_next_period": "Nākamais periods",
"menu_previous_period": "Iepriekšējais periods",
"account_scope_label": "Rāda {address}. Pārslēgt kontu",
"account_scope_menu": "Pārslēgt kontu",
"merge_links": "Saites",
"merge_photo": "Foto",
"merge_kept": "Saglabājas",
"import_show": "Rādīt"
},
"desktopEdit": {
"edit": "Rediģēt",
"edit_named": "Rediģēt {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Хуанли…",
"import_contacts": "Харилцагчид…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Шинэчлэх",
"menu_today": "Өнөөдөр",
"menu_next_period": "Дараагийн үе",
"menu_previous_period": "Өмнөх үе",
"account_scope_label": "{address}-г харуулж байна. Бүртгэл солих",
"account_scope_menu": "Бүртгэл солих",
"merge_links": "Холбоосууд",
"merge_photo": "Зураг",
"merge_kept": "Хадгалагдана",
"import_show": "Харуулах"
},
"desktopEdit": {
"edit": "Засах",
"edit_named": "{name} засах",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalender…",
"import_contacts": "Kontakter…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Oppdater",
"menu_today": "I dag",
"menu_next_period": "Neste periode",
"menu_previous_period": "Forrige periode",
"account_scope_label": "Viser {address}. Bytt konto",
"account_scope_menu": "Bytt konto",
"merge_links": "Lenker",
"merge_photo": "Bilde",
"merge_kept": "Beholdes",
"import_show": "Vis"
},
"desktopEdit": {
"edit": "Rediger",
"edit_named": "Rediger {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Agenda…",
"import_contacts": "Contacten…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Vernieuwen",
"menu_today": "Vandaag",
"menu_next_period": "Volgende periode",
"menu_previous_period": "Vorige periode",
"account_scope_label": "Toont {address}. Ander account kiezen",
"account_scope_menu": "Ander account kiezen",
"merge_links": "Links",
"merge_photo": "Foto",
"merge_kept": "Blijft bewaard",
"import_show": "Tonen"
},
"desktopEdit": {
"edit": "Bewerken",
"edit_named": "{name} bewerken",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalendarz…",
"import_contacts": "Kontakty…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Odśwież",
"menu_today": "Dzisiaj",
"menu_next_period": "Następny okres",
"menu_previous_period": "Poprzedni okres",
"account_scope_label": "Wyświetlane: {address}. Przełącz konto",
"account_scope_menu": "Przełącz konto",
"merge_links": "Linki",
"merge_photo": "Zdjęcie",
"merge_kept": "Zostaje",
"import_show": "Pokaż"
},
"desktopEdit": {
"edit": "Edytuj",
"edit_named": "Edytuj {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendário…",
"import_contacts": "Contactos…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Atualizar",
"menu_today": "Hoje",
"menu_next_period": "Próximo período",
"menu_previous_period": "Período anterior",
"account_scope_label": "A mostrar {address}. Mudar de conta",
"account_scope_menu": "Mudar de conta",
"merge_links": "Ligações",
"merge_photo": "Foto",
"merge_kept": "Mantém-se",
"import_show": "Mostrar"
},
"desktopEdit": {
"edit": "Editar",
"edit_named": "Editar {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Calendar…",
"import_contacts": "Contacte…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Reîmprospătează",
"menu_today": "Astăzi",
"menu_next_period": "Perioada următoare",
"menu_previous_period": "Perioada anterioară",
"account_scope_label": "Se afișează {address}. Schimbă contul",
"account_scope_menu": "Schimbă contul",
"merge_links": "Linkuri",
"merge_photo": "Fotografie",
"merge_kept": "Se păstrează",
"import_show": "Afișează"
},
"desktopEdit": {
"edit": "Editează",
"edit_named": "Editează {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Календарь…",
"import_contacts": "Контакты…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Обновить",
"menu_today": "Сегодня",
"menu_next_period": "Следующий период",
"menu_previous_period": "Предыдущий период",
"account_scope_label": "Показан {address}. Сменить учётную запись",
"account_scope_menu": "Сменить учётную запись",
"merge_links": "Ссылки",
"merge_photo": "Фото",
"merge_kept": "Сохранится",
"import_show": "Показать"
},
"desktopEdit": {
"edit": "Изменить",
"edit_named": "Изменить {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Kalendár…",
"import_contacts": "Kontakty…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Obnoviť",
"menu_today": "Dnes",
"menu_next_period": "Ďalšie obdobie",
"menu_previous_period": "Predchádzajúce obdobie",
"account_scope_label": "Zobrazuje sa {address}. Prepnúť účet",
"account_scope_menu": "Prepnúť účet",
"merge_links": "Odkazy",
"merge_photo": "Fotka",
"merge_kept": "Zostane",
"import_show": "Zobraziť"
},
"desktopEdit": {
"edit": "Upraviť",
"edit_named": "Upraviť {name}",
+12
View File
@@ -7527,6 +7527,18 @@
"import_calendar": "ปฏิทิน…",
"import_contacts": "ผู้ติดต่อ…"
},
"ux_p2_pim_cm": {
"menu_refresh": "รีเฟรช",
"menu_today": "วันนี้",
"menu_next_period": "ช่วงถัดไป",
"menu_previous_period": "ช่วงก่อนหน้า",
"account_scope_label": "กำลังแสดง {address} สลับบัญชี",
"account_scope_menu": "สลับบัญชี",
"merge_links": "ลิงก์",
"merge_photo": "รูปภาพ",
"merge_kept": "เก็บไว้",
"import_show": "แสดง"
},
"desktopEdit": {
"edit": "แก้ไข",
"edit_named": "แก้ไข {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Takvim…",
"import_contacts": "Kişiler…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Yenile",
"menu_today": "Bugün",
"menu_next_period": "Sonraki dönem",
"menu_previous_period": "Önceki dönem",
"account_scope_label": "{address} gösteriliyor. Hesap değiştir",
"account_scope_menu": "Hesap değiştir",
"merge_links": "Bağlantılar",
"merge_photo": "Fotoğraf",
"merge_kept": "Korunur",
"import_show": "Göster"
},
"desktopEdit": {
"edit": "Düzenle",
"edit_named": "{name} dosyasını düzenle",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "Календар…",
"import_contacts": "Контакти…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Оновити",
"menu_today": "Сьогодні",
"menu_next_period": "Наступний період",
"menu_previous_period": "Попередній період",
"account_scope_label": "Показано {address}. Змінити обліковий запис",
"account_scope_menu": "Змінити обліковий запис",
"merge_links": "Посилання",
"merge_photo": "Фото",
"merge_kept": "Залишиться",
"import_show": "Показати"
},
"desktopEdit": {
"edit": "Редагувати",
"edit_named": "Редагувати {name}",
+12
View File
@@ -7531,6 +7531,18 @@
"import_calendar": "Lịch…",
"import_contacts": "Danh bạ…"
},
"ux_p2_pim_cm": {
"menu_refresh": "Làm mới",
"menu_today": "Hôm nay",
"menu_next_period": "Khoảng thời gian sau",
"menu_previous_period": "Khoảng thời gian trước",
"account_scope_label": "Đang hiển thị {address}. Chuyển tài khoản",
"account_scope_menu": "Chuyển tài khoản",
"merge_links": "Liên kết",
"merge_photo": "Ảnh",
"merge_kept": "Được giữ lại",
"import_show": "Hiển thị"
},
"desktopEdit": {
"edit": "Chỉnh sửa",
"edit_named": "Chỉnh sửa {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "行事曆…",
"import_contacts": "聯絡人…"
},
"ux_p2_pim_cm": {
"menu_refresh": "重新整理",
"menu_today": "今天",
"menu_next_period": "下一個期間",
"menu_previous_period": "上一個期間",
"account_scope_label": "正在顯示 {address}。切換帳號",
"account_scope_menu": "切換帳號",
"merge_links": "連結",
"merge_photo": "相片",
"merge_kept": "保留",
"import_show": "顯示"
},
"desktopEdit": {
"edit": "編輯",
"edit_named": "編輯 {name}",
+12
View File
@@ -7519,6 +7519,18 @@
"import_calendar": "日历…",
"import_contacts": "联系人…"
},
"ux_p2_pim_cm": {
"menu_refresh": "刷新",
"menu_today": "今天",
"menu_next_period": "下一时段",
"menu_previous_period": "上一时段",
"account_scope_label": "正在显示 {address}。切换账户",
"account_scope_menu": "切换账户",
"merge_links": "链接",
"merge_photo": "照片",
"merge_kept": "保留",
"import_show": "显示"
},
"desktopEdit": {
"edit": "编辑",
"edit_named": "编辑 {name}",