fix: use sentence case and plain words in Calendar: Accept, Maybe and Decline, counted events, error titles that say what couldn't be done

This commit is contained in:
Linus Rath
2026-10-28 04:38:46 +01:00
parent 72d033bcb3
commit 28d169c8c4
35 changed files with 272 additions and 141 deletions
@@ -26,6 +26,8 @@ vi.mock('@/hooks/use-refresh-gesture', () => ({ useRefreshGesture: () => ({ indi
vi.mock('@/hooks/use-calendar-push-refresh', () => ({ useCalendarPushRefresh: () => {} }));
vi.mock('@/hooks/use-account-principal-emails', () => ({ useAccountPrincipalEmails: () => [] }));
vi.mock('../participant-availability', () => ({ ParticipantAvailability: () => null }));
const config = vi.hoisted(() => ({ demoMode: false }));
vi.mock('@/hooks/use-config', () => ({ useConfig: () => config }));
import { CalendarApp } from '../calendar-app';
import { useRegisteredCommandGroups } from '@/lib/command-registry';
@@ -563,3 +565,18 @@ describe('CalendarApp control names', () => {
expect(screen.getAllByRole('button', { name: /Trip/ })[0].getAttribute('aria-label')).toContain('events.all_day');
});
});
describe('CalendarApp in the demo', () => {
it('leaves Import and Subscribe out, which need a mail server', async () => {
config.demoMode = true;
try {
renderApp();
fireEvent.click(screen.getByRole('button', { name: 'toolbar.more' }));
expect(await screen.findByRole('menuitem', { name: 'refresh' })).toBeInTheDocument();
expect(screen.queryByRole('menuitem', { name: 'toolbar.import' })).toBeNull();
expect(screen.queryByRole('menuitem', { name: 'toolbar.subscribe' })).toBeNull();
} finally {
config.demoMode = false;
}
});
});
@@ -62,3 +62,21 @@ describe('import dialog from the keyboard', () => {
expect(screen.getByRole('button', { name: /select_file/ })).toBeInTheDocument();
});
});
describe('import preview', () => {
it('names a repeating event\'s rule in the app language', async () => {
const weekly = { title: 'Gym', start: '2026-10-12T18:00:00', duration: 'PT1H', recurrenceRules: [{ '@type': 'RecurrenceRule', frequency: 'weekly', interval: 1 }] };
const parsing = {
getAccountId: () => 'acct',
getCalendarsAccountId: () => 'acct',
uploadBlob: vi.fn().mockResolvedValue({ blobId: 'b1' }),
parseCalendarEvents: vi.fn().mockResolvedValue([weekly]),
} as unknown as IJMAPClient;
render(<ICalImportModal calendars={calendars} client={parsing} onClose={vi.fn()} />);
const file = new File(['BEGIN:VCALENDAR'], 'gym.ics', { type: 'text/calendar' });
fireEvent.change(document.querySelector('input[type="file"]')!, { target: { files: [file] } });
expect(await screen.findByText('Gym')).toBeInTheDocument();
expect(screen.queryByText('weekly')).toBeNull();
expect(screen.getByText('recurrence.weekly')).toBeInTheDocument();
});
});
@@ -9,20 +9,25 @@ import { ParticipantStatusBadge, RsvpButtons } from '../rsvp-buttons';
describe('participation status colours', () => {
it('writes answers in readable status shades, not the light fills', () => {
render(<RsvpButtons status={null} onRespond={vi.fn()} />);
const maybe = screen.getByRole('button', { name: 'participants.tentative' });
const maybe = screen.getByRole('button', { name: 'participants.maybe' });
expect(maybe.className).toContain('text-amber-600');
expect(maybe.className).not.toMatch(/\btext-warning\b/);
expect(screen.getByRole('button', { name: 'participants.accepted' }).className).toContain('text-green-700');
expect(screen.getByRole('button', { name: 'participants.accept' }).className).toContain('text-green-700');
});
it('puts dark text on the chosen yellow answer', () => {
render(<RsvpButtons status="tentative" onRespond={vi.fn()} />);
const maybe = screen.getByRole('button', { name: 'participants.tentative' });
const maybe = screen.getByRole('button', { name: 'participants.maybe' });
expect(maybe).toHaveAttribute('aria-pressed', 'true');
expect(maybe.className).toContain('text-neutral-950');
expect(maybe.className).not.toContain('text-warning-foreground');
});
it('labels the buttons with what they do, not the state', () => {
render(<RsvpButtons status={null} onRespond={vi.fn()} />);
expect(screen.getAllByRole('button').map((b) => b.textContent)).toEqual(['participants.accept', 'participants.maybe', 'participants.decline']);
});
it('colours a participant\'s answer the same way', () => {
render(<ParticipantStatusBadge status="accepted" />);
expect(screen.getByText('participants.accepted').className).toContain('text-green-700');
+7 -5
View File
@@ -102,6 +102,7 @@ import { calendarShortcutAction } from "@/lib/calendar-shortcuts";
import { isEditableEventTarget } from "@/lib/keyboard";
import { isContextMenuOpen } from "@/components/ui/context-menu";
import { useRegisterCommands } from "@/lib/command-registry";
import { useConfig } from "@/hooks/use-config";
// `fromEditor`: asked on the way out of the event editor, which stays open
// until a scope is picked, so Cancel goes back to it with the changes.
@@ -129,6 +130,7 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
const tSidebar = useTranslations("sidebar");
useDocumentTitle(tSidebar("calendar"));
const tWebcalAction = useTranslations("calendar.webcal_action");
const { demoMode } = useConfig();
const tDeepLink = useTranslations("deep_link");
const isMobile = useIsMobile();
const isDesktop = useIsDesktop();
@@ -1552,8 +1554,8 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
run: () => { setMobileReturnToMonth(false); setViewMode(mode); },
when: () => mode !== normalizedViewMode && (mode !== "tasks" || enableCalendarTasks),
})),
{ id: "import", label: t("toolbar.import"), icon: Upload, run: () => setShowImportModal(true) },
{ id: "subscribe", label: t("toolbar.subscribe"), icon: Globe, run: () => setShowSubscriptionModal(true) },
{ id: "import", label: t("toolbar.import"), icon: Upload, run: () => setShowImportModal(true), when: () => !demoMode },
{ id: "subscribe", label: t("toolbar.subscribe"), icon: Globe, run: () => setShowSubscriptionModal(true), when: () => !demoMode },
{ id: "refresh", label: tCommon("refresh"), icon: RefreshCw, shortcut: "F5", run: () => { void refreshCalendar(); } },
], isEmbedded ? isFocusedProTab : !proInterfaceActive);
@@ -1883,8 +1885,8 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
onViewModeChange={(mode) => { setMobileReturnToMonth(false); setViewMode(mode); }}
onCreateEvent={openCreateForView}
createLabel={createLabel}
onImport={() => setShowImportModal(true)}
onSubscribe={() => setShowSubscriptionModal(true)}
onImport={demoMode ? undefined : () => setShowImportModal(true)}
onSubscribe={demoMode ? undefined : () => setShowSubscriptionModal(true)}
onRefresh={() => { void refreshCalendar(); }}
isMobile={isMobile}
onNavigateBack={isMobile && mobileReturnToMonth && normalizedViewMode === "day" ? navigateBackToMonth : undefined}
@@ -2040,7 +2042,7 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
}
} : undefined}
onCreateCalendar={client ? () => setShowCreateCalendar(true) : undefined}
onSubscribe={() => setShowSubscriptionModal(true)}
onSubscribe={demoMode ? undefined : () => setShowSubscriptionModal(true)}
onEditSubscription={(subId) => setEditingSubscription(subId)}
client={client}
multiAccountMode={multiAccountEnabled && accountClients.length > 1}
+4 -2
View File
@@ -1,7 +1,8 @@
"use client";
import { useState, useCallback, useRef, useId } from "react";
import { useTranslations } from "next-intl";
import { useLocale, useTranslations } from "next-intl";
import { buildRecurrenceSummary } from "./recurrence-editor";
import { Button } from "@/components/ui/button";
import { Upload, Check, RefreshCw, Globe } from "@/components/icons";
import { Dialog } from "@/components/ui/dialog";
@@ -33,6 +34,7 @@ type ImportMode = "file" | "url";
export function ICalImportModal({ calendars, client, onClose, initialUrl }: ICalImportModalProps) {
const t = useTranslations("calendar.import");
const tCal = useTranslations("calendar");
const locale = useLocale();
const tForm = useTranslations("calendar.form");
const importEvents = useCalendarStore((s) => s.importEvents);
const timeFormat = useSettingsStore((s) => s.timeFormat);
@@ -388,7 +390,7 @@ export function ICalImportModal({ calendars, client, onClose, initialUrl }: ICal
{event.recurrenceRules && event.recurrenceRules.length > 0 && (
<span className="inline-flex items-center gap-0.5 text-xs text-muted-foreground bg-muted px-1.5 py-0.5 rounded">
<RefreshCw className="w-3 h-3" />
{event.recurrenceRules[0].frequency}
{buildRecurrenceSummary(event.recurrenceRules[0], tCal, locale) ?? tCal("recurrence.custom")}
</span>
)}
</div>
+3 -3
View File
@@ -46,9 +46,9 @@ const CHOSEN: Record<string, string> = {
};
const ANSWERS: { status: Status; label: string }[] = [
{ status: "accepted", label: "participants.accepted" },
{ status: "tentative", label: "participants.tentative" },
{ status: "declined", label: "participants.declined" },
{ status: "accepted", label: "participants.accept" },
{ status: "tentative", label: "participants.maybe" },
{ status: "declined", label: "participants.decline" },
];
/** The three answers to an invitation, the current one filled. */
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "حاضر",
"accepted": "مقبول",
"declined": "مرفوض",
"accept": "قبول",
"maybe": "ربما",
"decline": "رفض",
"tentative": "مبدئي",
"needs_action": "بحاجة إلى رد",
"remove": "إزالة",
@@ -3614,14 +3617,14 @@
"invalid_url": "يرجى إدخال رابط صالح",
"url_fetch_failed": "فشل جلب التقويم من الرابط",
"parsing": "جارٍ تحليل ملف التقويم...",
"parsed_events": "تم العثور على {count} حدث",
"parsed_events": "{count, plural, zero {لم يتم العثور على أي حدث} one {تم العثور على حدث واحد} two {تم العثور على حدثين} few {تم العثور على # أحداث} many {تم العثور على # حدثًا} other {تم العثور على # حدث}}",
"no_events": "لم يتم العثور على أحداث في الملف",
"select_all": "تحديد الكل",
"deselect_all": "إلغاء تحديد الكل",
"target_calendar": "الاستيراد إلى التقويم",
"import_button": "استيراد المحدد",
"importing": "جارٍ استيراد الأحداث...",
"success": "تم استيراد {count} حدث بنجاح",
"success": "{count, plural, zero {لم يُستورد أي حدث} one {تم استيراد حدث واحد} two {تم استيراد حدثين} few {تم استيراد # أحداث} many {تم استيراد # حدثًا} other {تم استيراد # حدث}}",
"error": "فشل استيراد التقويم",
"file_too_large": "الملف يتجاوز الحد الأقصى 10 ميغابايت",
"invalid_format": "تنسيق ملف التقويم غير صالح"
@@ -3656,7 +3659,7 @@
"default_updated": "تم تحديث التقويم الافتراضي",
"error_default": "فشل تعيين التقويم الافتراضي",
"clear_events": "مسح الأحداث",
"events_cleared": "تم مسح {count} حدث",
"events_cleared": "{count, plural, zero {لم يُمسح أي حدث} one {تم مسح حدث واحد} two {تم مسح حدثين} few {تم مسح # أحداث} many {تم مسح # حدثًا} other {تم مسح # حدث}}",
"error_clear": "فشل مسح أحداث التقويم",
"calendar_created": "تم إنشاء التقويم",
"calendar_updated": "تم تحديث التقويم",
@@ -3668,7 +3671,7 @@
"caldav_url": "رابط CalDAV",
"copy_url": "نسخ رابط CalDAV",
"url_copied": "تم نسخ رابط CalDAV إلى الحافظة",
"share": "مشاركة التقويم",
"share": "مشاركة التقويم…",
"new_event_in_calendar": "حدث جديد في هذا التقويم",
"shared_with": "مشترك مع {names}",
"shared_with_count": "{count, plural, zero {غير مشترك مع أحد} one {مشترك مع شخص واحد} two {مشترك مع شخصين} few {مشترك مع # أشخاص} many {مشترك مع # شخصًا} other {مشترك مع # شخص}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Assistent",
"accepted": "Acceptat",
"declined": "Rebutjat",
"accept": "Accepta",
"maybe": "Potser",
"decline": "Rebutja",
"tentative": "Provisional",
"needs_action": "Cal resposta",
"remove": "Elimina",
@@ -3614,14 +3617,14 @@
"invalid_url": "Introduïu un URL vàlid",
"url_fetch_failed": "No s'ha pogut obtenir el calendari des de l'URL",
"parsing": "Analitzant el fitxer del calendari...",
"parsed_events": "{count} esdeveniments trobats",
"parsed_events": "{count, plural, one {# esdeveniment trobat} other {# esdeveniments trobats}}",
"no_events": "No s'ha trobat cap esdeveniment al fitxer",
"select_all": "Selecciona-ho tot",
"deselect_all": "Desselecciona-ho tot",
"target_calendar": "Importa al calendari",
"import_button": "Importa la selecció",
"importing": "Important els esdeveniments...",
"success": "{count} esdeveniments importats correctament",
"success": "{count, plural, one {# esdeveniment importat} other {# esdeveniments importats}}",
"error": "No s'ha pogut importar el calendari",
"file_too_large": "El fitxer supera el límit de 10 MB",
"invalid_format": "Format de fitxer de calendari no vàlid"
@@ -3656,7 +3659,7 @@
"default_updated": "Calendari predeterminat actualitzat",
"error_default": "No s'ha pogut establir el calendari predeterminat",
"clear_events": "Esborra els esdeveniments",
"events_cleared": "{count} esdeveniments esborrats",
"events_cleared": "{count, plural, one {# esdeveniment esborrat} other {# esdeveniments esborrats}}",
"error_clear": "No s'han pogut esborrar els esdeveniments del calendari",
"calendar_created": "Calendari creat",
"calendar_updated": "Calendari actualitzat",
@@ -3668,7 +3671,7 @@
"caldav_url": "URL de CalDAV",
"copy_url": "Copia l'URL de CalDAV",
"url_copied": "URL de CalDAV copiat al porta-retalls",
"share": "Comparteix el calendari",
"share": "Comparteix el calendari…",
"new_event_in_calendar": "Esdeveniment nou en aquest calendari",
"shared_with": "Compartit amb {names}",
"shared_with_count": "{count, plural, one {Compartit amb 1 persona} other {Compartit amb # persones}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Účastník",
"accepted": "Přijato",
"declined": "Odmítnuto",
"accept": "Přijmout",
"maybe": "Možná",
"decline": "Odmítnout",
"tentative": "Nezávazně",
"needs_action": "Vyžaduje akci",
"remove": "Odstranit",
@@ -3585,14 +3588,14 @@
"invalid_url": "Zadejte platnou adresu URL",
"url_fetch_failed": "Načtení kalendáře z adresy URL selhalo",
"parsing": "Analyzování souboru kalendáře...",
"parsed_events": "Nalezeno {count} událostí",
"parsed_events": "{count, plural, one {Nalezena # událost} few {Nalezeny # události} many {Nalezeno # události} other {Nalezeno # událostí}}",
"no_events": "V souboru nebyly nalezeny žádné události",
"select_all": "Vybrat vše",
"deselect_all": "Zrušit výběr všeho",
"target_calendar": "Importovat do kalendáře",
"import_button": "Importovat vybrané",
"importing": "Importování událostí...",
"success": "Úspěšně importováno {count} událostí",
"success": "{count, plural, one {Importována # událost} few {Importovány # události} many {Importováno # události} other {Importováno # událostí}}",
"error": "Import kalendáře selhal",
"file_too_large": "Soubor překračuje limit 10 MB",
"invalid_format": "Neplatný formát souboru kalendáře"
@@ -3627,7 +3630,7 @@
"default_updated": "Výchozí kalendář aktualizován",
"error_default": "Nepodařilo se nastavit výchozí kalendář",
"clear_events": "Vymazat události",
"events_cleared": "Vymazáno {count} událostí",
"events_cleared": "{count, plural, one {Vymazána # událost} few {Vymazány # události} many {Vymazáno # události} other {Vymazáno # událostí}}",
"error_clear": "Vymazání událostí kalendáře selhalo",
"calendar_created": "Kalendář byl vytvořen",
"calendar_updated": "Kalendář byl aktualizován",
@@ -3639,7 +3642,7 @@
"caldav_url": "URL CalDAV",
"copy_url": "Kopírovat URL CalDAV",
"url_copied": "URL CalDAV zkopírováno do schránky",
"share": "Sdílet kalendář",
"share": "Sdílet kalendář…",
"new_event_in_calendar": "Nová událost v tomto kalendáři",
"shared_with": "Sdíleno s: {names}",
"shared_with_count": "{count, plural, one {Sdíleno s 1 osobou} few {Sdíleno s # osobami} many {Sdíleno s # osoby} other {Sdíleno s # osobami}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Deltager",
"accepted": "Accepteret",
"declined": "Afslået",
"accept": "Acceptér",
"maybe": "Måske",
"decline": "Afvis",
"tentative": "Foreløbig",
"needs_action": "Kræver handling",
"remove": "Fjern",
@@ -3611,14 +3614,14 @@
"invalid_url": "Indtast en gyldig URL",
"url_fetch_failed": "Kunne ikke hente kalender fra URL",
"parsing": "Parser kalenderfil...",
"parsed_events": "{count} begivenheder fundet",
"parsed_events": "{count, plural, one {# begivenhed fundet} other {# begivenheder fundet}}",
"no_events": "Ingen begivenheder fundet i filen",
"select_all": "Vælg alle",
"deselect_all": "Fravælg alle",
"target_calendar": "Importér til kalender",
"import_button": "Importér valgte",
"importing": "Importerer begivenheder...",
"success": "{count} begivenheder importeret",
"success": "{count, plural, one {# begivenhed importeret} other {# begivenheder importeret}}",
"error": "Kunne ikke importere kalender",
"file_too_large": "Filen overstiger 10 MB grænsen",
"invalid_format": "Ugyldigt kalenderfilformat"
@@ -3653,7 +3656,7 @@
"default_updated": "Standardkalender opdateret",
"error_default": "Kunne ikke angive standardkalender",
"clear_events": "Ryd begivenheder",
"events_cleared": "{count} begivenheder ryddet",
"events_cleared": "{count, plural, one {# begivenhed ryddet} other {# begivenheder ryddet}}",
"error_clear": "Kunne ikke rydde kalenderbegivenheder",
"calendar_created": "Kalender oprettet",
"calendar_updated": "Kalender opdateret",
@@ -3665,7 +3668,7 @@
"caldav_url": "CalDAV-URL",
"copy_url": "Kopier CalDAV-URL",
"url_copied": "CalDAV-URL kopieret til udklipsholder",
"share": "Del kalender",
"share": "Del kalender…",
"new_event_in_calendar": "Ny begivenhed i denne kalender",
"shared_with": "Delt med {names}",
"shared_with_count": "{count, plural, one {Delt med 1 person} other {Delt med # personer}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Teilnehmer",
"accepted": "Zugesagt",
"declined": "Abgelehnt",
"accept": "Zusagen",
"maybe": "Vielleicht",
"decline": "Absagen",
"tentative": "Vorläufig",
"needs_action": "Antwort ausstehend",
"remove": "Entfernen",
@@ -3585,14 +3588,14 @@
"invalid_url": "Bitte geben Sie eine gültige URL ein",
"url_fetch_failed": "Kalender konnte nicht von der URL abgerufen werden",
"parsing": "Kalenderdatei wird analysiert...",
"parsed_events": "{count} Termine gefunden",
"parsed_events": "{count, plural, one {# Termin gefunden} other {# Termine gefunden}}",
"no_events": "Keine Termine in der Datei gefunden",
"select_all": "Alle auswählen",
"deselect_all": "Alle abwählen",
"target_calendar": "In Kalender importieren",
"import_button": "Auswahl importieren",
"importing": "Termine werden importiert...",
"success": "{count} Termine erfolgreich importiert",
"success": "{count, plural, one {# Termin importiert} other {# Termine importiert}}",
"error": "Kalender konnte nicht importiert werden",
"file_too_large": "Datei überschreitet das 10-MB-Limit",
"invalid_format": "Ungültiges Kalenderdateiformat"
@@ -3637,9 +3640,9 @@
"default_updated": "Standardkalender aktualisiert",
"error_default": "Standardkalender konnte nicht festgelegt werden",
"clear_events": "Ereignisse löschen",
"events_cleared": "{count} Ereignisse gelöscht",
"events_cleared": "{count, plural, one {# Termin gelöscht} other {# Termine gelöscht}}",
"error_clear": "Kalenderereignisse konnten nicht gelöscht werden",
"share": "Kalender freigeben",
"share": "Kalender freigeben…",
"new_event_in_calendar": "Neuer Termin in diesem Kalender",
"shared_with": "Geteilt mit {names}",
"shared_with_count": "{count, plural, one {Mit 1 Person geteilt} other {Mit # Personen geteilt}}",
+38 -35
View File
@@ -3303,7 +3303,7 @@
"go_to_today": "Go to today"
},
"detail": {
"add_note": "Add a note...",
"add_note": "Add a note…",
"save_note": "Save",
"note_saved": "Note added",
"open_link": "Open link",
@@ -3345,6 +3345,9 @@
"attendee": "Attendee",
"accepted": "Accepted",
"declined": "Declined",
"accept": "Accept",
"maybe": "Maybe",
"decline": "Decline",
"tentative": "Tentative",
"needs_action": "Needs action",
"remove": "Remove",
@@ -3563,8 +3566,8 @@
"task_update_error": "Couldn't update task",
"calendar_created": "Calendar created",
"calendar_deleted": "Calendar deleted",
"event_move_error": "Failed to move event",
"event_resize_error": "Failed to resize event",
"event_move_error": "Couldn't move event",
"event_resize_error": "Couldn't resize event",
"alert_title": "Upcoming event",
"alert_now": "Starting now",
"alert_in_minutes": "In {count} min",
@@ -3573,18 +3576,18 @@
"invitations_denied": "The server refused to send the invitations: {reason}. Save the event without sending them?",
"save_without_invitations": "Save without invitations",
"rsvp_updated": "Response updated",
"rsvp_error": "Failed to update response",
"rsvp_error": "Couldn't send your response",
"participant_limit": "The server allows at most {max, plural, one {# participant} other {# participants}} per event, including the organizer, so it refused this change. An administrator can raise the limit.",
"event_duplicated": "Event duplicated",
"event_error": "Failed to save event",
"event_error": "Couldn't save event",
"task_due": "Task due",
"event_exported": "Event exported",
"title_copied": "Title copied",
"link_copied": "Link copied"
},
"status": {
"loading_calendars": "Loading calendars...",
"loading_events": "Loading events...",
"loading_calendars": "Loading calendars…",
"loading_events": "Loading events…",
"events_load_failed": "Couldn't load events. The calendar may be out of date.",
"tasks_load_failed": "Couldn't load tasks. The list may be out of date.",
"retry": "Try again"
@@ -3601,7 +3604,7 @@
"nav_hide_sidebar": "Hide sidebar",
"nav_show_sidebar": "Show sidebar",
"import": {
"title": "Import Calendar",
"title": "Import calendar",
"tab_file": "File",
"tab_url": "URL",
"select_file": "Select .ics file",
@@ -3612,17 +3615,17 @@
"url_hint": "Supports iCalendar (.ics) URLs",
"fetch": "Fetch",
"invalid_url": "Please enter a valid URL",
"url_fetch_failed": "Failed to fetch calendar from URL",
"parsing": "Parsing calendar file...",
"parsed_events": "{count} events found",
"url_fetch_failed": "Couldn't fetch the calendar from this URL",
"parsing": "Reading the calendar file…",
"parsed_events": "{count, plural, one {# event found} other {# events found}}",
"no_events": "No events found in file",
"select_all": "Select all",
"deselect_all": "Deselect all",
"target_calendar": "Import to calendar",
"import_button": "Import selected",
"importing": "Importing events...",
"success": "{count} events imported successfully",
"error": "Failed to import calendar",
"importing": "Importing events…",
"success": "{count, plural, one {# event imported} other {# events imported}}",
"error": "Couldn't import calendar",
"file_too_large": "File exceeds 10MB limit",
"invalid_format": "Invalid calendar file format"
},
@@ -3636,7 +3639,7 @@
"cancel": "Cancel"
},
"management": {
"title": "Calendar Management",
"title": "Calendar management",
"description": "Create, rename, and customize your calendars. Right-click a calendar in the sidebar to quickly change its color.",
"name": "Name",
"name_placeholder": "Calendar name",
@@ -3654,21 +3657,21 @@
"confirm_clear": "Clear all events from \"{name}\"? This cannot be undone.",
"set_default": "Set as default",
"default_updated": "Default calendar updated",
"error_default": "Failed to set default calendar",
"error_default": "Couldn't set default calendar",
"clear_events": "Clear events",
"events_cleared": "{count} events cleared",
"error_clear": "Failed to clear calendar events",
"events_cleared": "{count, plural, one {# event cleared} other {# events cleared}}",
"error_clear": "Couldn't clear calendar events",
"calendar_created": "Calendar created",
"calendar_updated": "Calendar updated",
"calendar_deleted": "Calendar deleted",
"color_updated": "Calendar color updated",
"error_create": "Failed to create calendar",
"error_update": "Failed to update calendar",
"error_delete": "Failed to delete calendar",
"error_create": "Couldn't create calendar",
"error_update": "Couldn't update calendar",
"error_delete": "Couldn't delete calendar",
"caldav_url": "CalDAV URL",
"copy_url": "Copy CalDAV URL",
"url_copied": "CalDAV URL copied to clipboard",
"share": "Share calendar",
"share": "Share calendar…",
"new_event_in_calendar": "New event in this calendar",
"shared_with": "Shared with {names}",
"shared_with_count": "{count, plural, one {Shared with 1 person} other {Shared with # people}}",
@@ -3687,8 +3690,8 @@
"default_alerts_updated": "Default reminders updated"
},
"subscription": {
"title": "iCal Subscription",
"section_title": "iCal Subscriptions",
"title": "iCal subscription",
"section_title": "iCal subscriptions",
"description": "Subscribe to an external iCalendar feed. Events will be synced automatically into their own calendar. Supports https:// and webcal:// URLs.",
"url_label": "Calendar URL",
"url_placeholder": "https://example.com/calendar.ics or webcal://...",
@@ -3702,23 +3705,23 @@
"interval_360": "Every 6 hours",
"interval_1440": "Every day",
"subscribe": "Subscribe",
"subscribing": "Subscribing...",
"subscribing": "Subscribing…",
"save": "Save changes",
"saving": "Saving...",
"saving": "Saving…",
"edit": "Edit",
"edit_title": "Edit Subscription",
"edit_title": "Edit subscription",
"updated": "Updated \"{name}\"",
"update_error": "Failed to update subscription",
"update_error": "Couldn't update subscription",
"invalid_url": "Please enter a valid URL",
"success": "Subscribed to \"{name}\"",
"error": "Failed to add subscription",
"error": "Couldn't add subscription",
"refresh": "Refresh now",
"refresh_success": "Subscription refreshed",
"refresh_error": "Failed to refresh subscription",
"refresh_error": "Couldn't refresh subscription",
"unsubscribe": "Unsubscribe",
"confirm_delete": "Unsubscribe from \"{name}\"? The calendar and all its events will be removed.",
"deleted": "Subscription removed",
"delete_error": "Failed to remove subscription",
"delete_error": "Couldn't remove subscription",
"last_refreshed": "Last updated: {time}"
},
"tasks": {
@@ -3731,10 +3734,10 @@
"filter_pending": "Pending",
"filter_completed": "Completed",
"filter_overdue": "Overdue",
"create": "New Task",
"edit": "Edit Task",
"create": "New task",
"edit": "Edit task",
"title_placeholder": "Task title",
"description_placeholder": "Add a description...",
"description_placeholder": "Add a description…",
"due_date": "Due date",
"include_time": "Include time",
"priority": "Priority",
@@ -3759,7 +3762,7 @@
"delete": "Delete",
"cancel": "Cancel",
"save": "Save",
"quick_add_placeholder": "Add a task...",
"quick_add_placeholder": "Add a task…",
"due_today": "Today",
"due_tomorrow": "Tomorrow",
"overdue": "Overdue"
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Participante",
"accepted": "Aceptado",
"declined": "Rechazado",
"accept": "Aceptar",
"maybe": "Quizás",
"decline": "Rechazar",
"tentative": "Provisional",
"needs_action": "Pendiente de respuesta",
"remove": "Eliminar",
@@ -3585,14 +3588,14 @@
"invalid_url": "Introduce una URL válida",
"url_fetch_failed": "No se pudo obtener el calendario desde la URL",
"parsing": "Analizando archivo de calendario...",
"parsed_events": "{count} eventos encontrados",
"parsed_events": "{count, plural, one {# evento encontrado} other {# eventos encontrados}}",
"no_events": "No se encontraron eventos en el archivo",
"select_all": "Seleccionar todo",
"deselect_all": "Deseleccionar todo",
"target_calendar": "Importar al calendario",
"import_button": "Importar selección",
"importing": "Importando eventos...",
"success": "{count} eventos importados correctamente",
"success": "{count, plural, one {# evento importado} other {# eventos importados}}",
"error": "Error al importar el calendario",
"file_too_large": "El archivo supera el límite de 10 MB",
"invalid_format": "Formato de archivo de calendario no válido"
@@ -3637,9 +3640,9 @@
"default_updated": "Calendario predeterminado actualizado",
"error_default": "Error al establecer el calendario predeterminado",
"clear_events": "Borrar eventos",
"events_cleared": "{count} eventos borrados",
"events_cleared": "{count, plural, one {# evento borrado} other {# eventos borrados}}",
"error_clear": "No se pudieron borrar los eventos del calendario",
"share": "Compartir calendario",
"share": "Compartir calendario…",
"new_event_in_calendar": "Nuevo evento en este calendario",
"shared_with": "Compartido con {names}",
"shared_with_count": "{count, plural, one {Compartido con 1 persona} other {Compartido con # personas}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Osaleja",
"accepted": "Nõustunud",
"declined": "Keeldunud",
"accept": "Nõustu",
"maybe": "Võib-olla",
"decline": "Keeldu",
"tentative": "Esialgne",
"needs_action": "Vajab vastust",
"remove": "Eemalda",
@@ -3614,14 +3617,14 @@
"invalid_url": "Palun sisesta kehtiv URL",
"url_fetch_failed": "Kalendri laadimine URL-ilt ebaõnnestus",
"parsing": "Kalendrifaili töötlemine...",
"parsed_events": "Leiti {count} sündmust",
"parsed_events": "{count, plural, one {Leiti # sündmus} other {Leiti # sündmust}}",
"no_events": "Failist ei leitud sündmusi",
"select_all": "Vali kõik",
"deselect_all": "Tühista kõigi valik",
"target_calendar": "Impordi kalendrisse",
"import_button": "Impordi valitud",
"importing": "Sündmuste importimine...",
"success": "{count} sündmust imporditi edukalt",
"success": "{count, plural, one {Imporditi # sündmus} other {Imporditi # sündmust}}",
"error": "Kalendri importimine ebaõnnestus",
"file_too_large": "Fail ületab 10 MB piirangu",
"invalid_format": "Vale kalendrifaili vorming"
@@ -3656,7 +3659,7 @@
"default_updated": "Vaikekalender uuendatud",
"error_default": "Vaikekalendri määramine ebaõnnestus",
"clear_events": "Tühjenda sündmused",
"events_cleared": "{count} sündmust tühjendatud",
"events_cleared": "{count, plural, one {# sündmus tühjendatud} other {# sündmust tühjendatud}}",
"error_clear": "Kalendrisündmuste tühjendamine ebaõnnestus",
"calendar_created": "Kalender loodud",
"calendar_updated": "Kalender uuendatud",
@@ -3668,7 +3671,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "Kopeeri CalDAV URL",
"url_copied": "CalDAV URL kopeeriti lõikelauale",
"share": "Jaga kalendrit",
"share": "Jaga kalendrit…",
"new_event_in_calendar": "Uus sündmus selles kalendris",
"shared_with": "Jagatud: {names}",
"shared_with_count": "{count, plural, one {Jagatud 1 inimesega} other {Jagatud # inimesega}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "شرکت‌کننده",
"accepted": "پذیرفته شد",
"declined": "رد شد",
"accept": "پذیرفتن",
"maybe": "شاید",
"decline": "رد کردن",
"tentative": "احتمالی",
"needs_action": "نیاز به اقدام",
"remove": "حذف",
@@ -3621,7 +3624,7 @@
"target_calendar": "وارد کردن به تقویم",
"import_button": "وارد کردن انتخاب‌شده‌ها",
"importing": "در حال وارد کردن رویدادها...",
"success": "{count} رویداد با موفقیت وارد شد",
"success": "{count} رویداد وارد شد",
"error": "وارد کردن تقویم ناموفق بود",
"file_too_large": "حجم فایل بیش از ۱۰ مگابایت است",
"invalid_format": "فرمت فایل تقویم نامعتبر است"
@@ -3668,7 +3671,7 @@
"caldav_url": "آدرس CalDAV",
"copy_url": "کپی آدرس CalDAV",
"url_copied": "آدرس CalDAV در کلیپ‌بورد کپی شد",
"share": "اشتراک‌گذاری تقویم",
"share": "اشتراک‌گذاری تقویم…",
"new_event_in_calendar": "رویداد جدید در این تقویم",
"shared_with": "به اشتراک گذاشته شده با {names}",
"shared_with_count": "{count, plural, one {با ۱ نفر به اشتراک گذاشته شده} other {با # نفر به اشتراک گذاشته شده}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Participant",
"accepted": "Accepté",
"declined": "Refusé",
"accept": "Accepter",
"maybe": "Peut-être",
"decline": "Refuser",
"tentative": "Provisoire",
"needs_action": "En attente de réponse",
"remove": "Retirer",
@@ -3611,14 +3614,14 @@
"invalid_url": "Veuillez entrer une URL valide",
"url_fetch_failed": "Impossible de récupérer le calendrier depuis l'URL",
"parsing": "Analyse du fichier en cours...",
"parsed_events": "{count} événements trouvés",
"parsed_events": "{count, plural, one {# événement trouvé} other {# événements trouvés}}",
"no_events": "Aucun événement trouvé dans le fichier",
"select_all": "Tout sélectionner",
"deselect_all": "Tout désélectionner",
"target_calendar": "Importer dans le calendrier",
"import_button": "Importer la sélection",
"importing": "Importation en cours...",
"success": "{count} événements importés avec succès",
"success": "{count, plural, one {# événement importé} other {# événements importés}}",
"error": "Échec de l'importation du calendrier",
"file_too_large": "Le fichier dépasse la limite de 10 Mo",
"invalid_format": "Format de fichier calendrier invalide"
@@ -3663,9 +3666,9 @@
"default_updated": "Calendrier par défaut mis à jour",
"error_default": "Échec de la définition du calendrier par défaut",
"clear_events": "Supprimer les événements",
"events_cleared": "{count} événements supprimés",
"events_cleared": "{count, plural, one {# événement supprimé} other {# événements supprimés}}",
"error_clear": "Impossible de supprimer les événements du calendrier",
"share": "Partager le calendrier",
"share": "Partager le calendrier…",
"new_event_in_calendar": "Nouvel événement dans ce calendrier",
"shared_with": "Partagé avec {names}",
"shared_with_count": "{count, plural, one {Partagé avec 1 personne} other {Partagé avec # personnes}}",
+7 -4
View File
@@ -3263,6 +3263,9 @@
"attendee": "משתתף",
"accepted": "התקבל",
"declined": "נדחה",
"accept": "אישור",
"maybe": "אולי",
"decline": "דחייה",
"tentative": "טנטטיבי",
"needs_action": "צריך פעולה",
"remove": "הסר",
@@ -3503,14 +3506,14 @@
"invalid_url": "אנא הזן כתובת אתר חוקית",
"url_fetch_failed": "אחזור היומן מ-URL נכשל",
"parsing": "מנתח קובץ לוח שנה...",
"parsed_events": "נמצאו אירועים של{count}",
"parsed_events": "{count, plural, one {נמצא אירוע אחד} other {נמצאו # אירועים}}",
"no_events": "לא נמצאו אירועים בקובץ",
"select_all": "בחר הכל",
"deselect_all": "בטל את הבחירה בכולם",
"target_calendar": "ייבא ליומן",
"import_button": "ייבא נבחר",
"importing": "מייבא אירועים...",
"success": "אירועי{count}יובאו בהצלחה",
"success": "{count, plural, one {אירוע אחד יובא} other {# אירועים יובאו}}",
"error": "ייבוא היומן נכשל",
"file_too_large": "הקובץ חורג ממגבלת 10MB",
"invalid_format": "פורמט קובץ לוח שנה לא חוקי"
@@ -3532,7 +3535,7 @@
"confirm_delete": "למחוק את \"{name}\"? כל האירועים בלוח השנה הזה יוסרו.",
"confirm_clear": "לנקות את כל האירועים מ-\"{name}\"? לא ניתן לבטל זאת.",
"clear_events": "נקה אירועים",
"events_cleared": "אירועי{count}נוקו",
"events_cleared": "{count, plural, one {אירוע אחד נוקה} other {# אירועים נוקו}}",
"error_clear": "נכשל ניקוי אירועים ביומן",
"calendar_created": "יומן נוצר",
"calendar_updated": "לוח השנה עודכן",
@@ -3548,7 +3551,7 @@
"set_default": "הגדר כברירת מחדל",
"default_updated": "לוח שנה ברירת המחדל עודכן",
"error_default": "נכשל בהגדרת לוח שנה ברירת מחדל",
"share": "שתף לוח שנה",
"share": "שתף לוח שנה…",
"new_event_in_calendar": "אירוע חדש בלוח שנה זה",
"shared_with": "משותף עם {names}",
"shared_with_count": "{count, plural, one {משותף עם אדם אחד} two {משותף עם שני אנשים} other {משותף עם # אנשים}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "Résztvevő",
"accepted": "Elfogadva",
"declined": "Elutasítva",
"accept": "Elfogadás",
"maybe": "Talán",
"decline": "Elutasítás",
"tentative": "Előzetes",
"needs_action": "Művelet szükséges",
"remove": "Eltávolítás",
@@ -3621,7 +3624,7 @@
"target_calendar": "Importálás ebbe a naptárba",
"import_button": "Kijelöltek importálása",
"importing": "Események importálása...",
"success": "{count} esemény sikeresen importálva",
"success": "{count} esemény importálva",
"error": "Nem sikerült importálni a naptárt",
"file_too_large": "A fájl meghaladja a 10 MB korlátot",
"invalid_format": "Érvénytelen naptár fájl formátum"
@@ -3668,7 +3671,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "CalDAV URL másolása",
"url_copied": "CalDAV URL a vágólapra másolva",
"share": "Naptár megosztása",
"share": "Naptár megosztása…",
"new_event_in_calendar": "Új esemény ebben a naptárban",
"shared_with": "Megosztva: {names}",
"shared_with_count": "{count, plural, one {Megosztva 1 személlyel} other {Megosztva # személlyel}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Partecipante",
"accepted": "Accettato",
"declined": "Rifiutato",
"accept": "Accetta",
"maybe": "Forse",
"decline": "Rifiuta",
"tentative": "Provvisorio",
"needs_action": "In attesa di risposta",
"remove": "Rimuovi",
@@ -3585,14 +3588,14 @@
"invalid_url": "Inserisci un URL valido",
"url_fetch_failed": "Impossibile recuperare il calendario dall'URL",
"parsing": "Analisi del file in corso...",
"parsed_events": "{count} eventi trovati",
"parsed_events": "{count, plural, one {# evento trovato} other {# eventi trovati}}",
"no_events": "Nessun evento trovato nel file",
"select_all": "Seleziona tutto",
"deselect_all": "Deseleziona tutto",
"target_calendar": "Importa nel calendario",
"import_button": "Importa selezionati",
"importing": "Importazione eventi...",
"success": "{count} eventi importati con successo",
"success": "{count, plural, one {# evento importato} other {# eventi importati}}",
"error": "Importazione del calendario fallita",
"file_too_large": "Il file supera il limite di 10 MB",
"invalid_format": "Formato del file calendario non valido"
@@ -3637,9 +3640,9 @@
"default_updated": "Calendario predefinito aggiornato",
"error_default": "Impossibile impostare il calendario predefinito",
"clear_events": "Cancella eventi",
"events_cleared": "{count} eventi cancellati",
"events_cleared": "{count, plural, one {# evento cancellato} other {# eventi cancellati}}",
"error_clear": "Impossibile cancellare gli eventi del calendario",
"share": "Condividi calendario",
"share": "Condividi calendario…",
"new_event_in_calendar": "Nuovo evento in questo calendario",
"shared_with": "Condiviso con {names}",
"shared_with_count": "{count, plural, one {Condiviso con 1 persona} other {Condiviso con # persone}}",
+4 -1
View File
@@ -3345,6 +3345,9 @@
"attendee": "参加者",
"accepted": "承諾",
"declined": "辞退",
"accept": "承諾",
"maybe": "未定",
"decline": "辞退",
"tentative": "仮承諾",
"needs_action": "未回答",
"remove": "削除",
@@ -3639,7 +3642,7 @@
"clear_events": "イベントを削除",
"events_cleared": "{count}件のイベントを削除しました",
"error_clear": "カレンダーイベントの削除に失敗しました",
"share": "カレンダーを共有",
"share": "カレンダーを共有…",
"new_event_in_calendar": "このカレンダーに新規イベント",
"shared_with": "{names} と共有",
"shared_with_count": "{count, plural, other {#人と共有}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "참석자",
"accepted": "수락함",
"declined": "거절함",
"accept": "수락",
"maybe": "미정",
"decline": "거절",
"tentative": "미정",
"needs_action": "응답 필요",
"remove": "삭제",
@@ -3592,7 +3595,7 @@
"target_calendar": "저장할 캘린더",
"import_button": "선택 항목 가져오기",
"importing": "일정을 가져오는 중...",
"success": "{count}개의 일정을 성공적으로 가져왔어요",
"success": "{count}개의 일정을 가져왔어요",
"error": "캘린더를 가져오지 못했어요",
"file_too_large": "파일이 10MB 제한을 넘었어요",
"invalid_format": "캘린더 파일 형식이 올바르지 않아요"
@@ -3639,7 +3642,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "CalDAV URL 복사",
"url_copied": "CalDAV URL이 클립보드에 복사되었어요",
"share": "캘린더 공유",
"share": "캘린더 공유…",
"new_event_in_calendar": "이 캘린더에 새 일정",
"shared_with": "공유 대상: {names}",
"shared_with_count": "{count, plural, other {#명과 공유됨}}",
+7 -4
View File
@@ -3344,6 +3344,9 @@
"attendee": "Dalībnieks",
"accepted": "Pieņemts",
"declined": "Noraidīts",
"accept": "Pieņemt",
"maybe": "Varbūt",
"decline": "Noraidīt",
"tentative": "Pagaidām",
"needs_action": "Nepieciešama atbilde",
"remove": "Noņemt",
@@ -3584,14 +3587,14 @@
"invalid_url": "Ievadiet derīgu URL",
"url_fetch_failed": "Neizdevās iegūt kalendāru no saites",
"parsing": "Nolasa kalendāra failu...",
"parsed_events": "Atrasti {count} pasākumi",
"parsed_events": "{count, plural, zero {Atrasti # pasākumi} one {Atrasts # pasākums} other {Atrasti # pasākumi}}",
"no_events": "Failā netika atrasti pasākumi",
"select_all": "Atlasīt visus",
"deselect_all": "Noņemt atlasi",
"target_calendar": "Importēt kalendārā",
"import_button": "Importēt atlasītos",
"importing": "Importē pasākumus...",
"success": "{count} pasākumi veiksmīgi importēti",
"success": "{count, plural, zero {Importēti # pasākumi} one {Importēts # pasākums} other {Importēti # pasākumi}}",
"error": "Neizdevās importēt kalendāru",
"file_too_large": "Fails pārsniedz 10 MB limitu",
"invalid_format": "Nederīgs kalendāra faila formāts"
@@ -3626,7 +3629,7 @@
"default_updated": "Noklusējuma kalendārs atjaunināts",
"error_default": "Neizdevās iestatīt noklusējuma kalendāru",
"clear_events": "Iztīrīt pasākumus",
"events_cleared": "Iztīrīti {count} pasākumi",
"events_cleared": "{count, plural, zero {Iztīrīti # pasākumi} one {Iztīrīts # pasākums} other {Iztīrīti # pasākumi}}",
"error_clear": "Neizdevās iztīrīt kalendāra pasākumus",
"calendar_created": "Kalendārs izveidots",
"calendar_updated": "Kalendārs atjaunināts",
@@ -3638,7 +3641,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "Kopēt CalDAV URL",
"url_copied": "CalDAV URL nokopēts starpliktuvē",
"share": "Kopīgot kalendāru",
"share": "Kopīgot kalendāru…",
"new_event_in_calendar": "Jauns notikums šajā kalendārā",
"shared_with": "Kopīgots ar: {names}",
"shared_with_count": "{count, plural, zero {Kopīgots ar # personām} one {Kopīgots ar # personu} other {Kopīgots ar # personām}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "Оролцогч",
"accepted": "Хүлээн зөвшөөрсөн",
"declined": "Татгалзсан",
"accept": "Зөвшөөрөх",
"maybe": "Магадгүй",
"decline": "Татгалзах",
"tentative": "Урьдчилсан",
"needs_action": "Арга хэмжээ авах шаардлагатай",
"remove": "Устгах",
@@ -3621,7 +3624,7 @@
"target_calendar": "Хуанли руу импортлох",
"import_button": "Импортыг сонгосон",
"importing": "Үйл явдал импортлож байна...",
"success": "{count} арга хэмжээг амжилттай импортолсон",
"success": "{count} арга хэмжээг импортолсон",
"error": "Хуанли импорт хийж чадсангүй",
"file_too_large": "Файл 10МБ-ын хязгаараас хэтэрсэн байна",
"invalid_format": "Хуанли файлын формат буруу байна"
@@ -3668,7 +3671,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "CalDAV URL-г хуулах",
"url_copied": "CalDAV URL-г санах ой руу хуулсан",
"share": "Хуанлигаа хуваалцах",
"share": "Хуанлигаа хуваалцах…",
"new_event_in_calendar": "Энэ хуанли дахь шинэ арга хэмжээ",
"shared_with": "Хуваалцсан: {names}",
"shared_with_count": "{count, plural, one {1 хүнтэй хуваалцсан} other {# хүнтэй хуваалцсан}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Deltaker",
"accepted": "Godtatt",
"declined": "Avslått",
"accept": "Godta",
"maybe": "Kanskje",
"decline": "Avslå",
"tentative": "Kanskje",
"needs_action": "Har ikke svart",
"remove": "Fjern",
@@ -3614,14 +3617,14 @@
"invalid_url": "Skriv inn en gyldig URL",
"url_fetch_failed": "Kunne ikke hente kalenderen fra nettadressen",
"parsing": "Leser kalenderfilen...",
"parsed_events": "Hendelser funnet: {count}",
"parsed_events": "{count, plural, one {# hendelse funnet} other {# hendelser funnet}}",
"no_events": "Ingen hendelser funnet i filen",
"select_all": "Velg alle",
"deselect_all": "Fjern alle markeringer",
"target_calendar": "Importer til kalender",
"import_button": "Importer valgte hendelser",
"importing": "Importerer hendelser...",
"success": "Importerte hendelser: {count}",
"success": "{count, plural, one {# hendelse importert} other {# hendelser importert}}",
"error": "Kunne ikke importere kalenderen",
"file_too_large": "Filen er større enn grensen på 10 MB",
"invalid_format": "Ugyldig kalenderfilformat"
@@ -3656,7 +3659,7 @@
"default_updated": "Standardkalenderen er oppdatert",
"error_default": "Kunne ikke angi standardkalender",
"clear_events": "Fjern alle hendelser",
"events_cleared": "Hendelser fjernet: {count}",
"events_cleared": "{count, plural, one {# hendelse fjernet} other {# hendelser fjernet}}",
"error_clear": "Kunne ikke fjerne kalenderhendelsene",
"calendar_created": "Kalenderen er opprettet",
"calendar_updated": "Kalenderen er oppdatert",
@@ -3668,7 +3671,7 @@
"caldav_url": "CalDAV-URL",
"copy_url": "Kopier CalDAV-URL",
"url_copied": "CalDAV-URL kopiert til utklippstavlen",
"share": "Del kalender",
"share": "Del kalender…",
"new_event_in_calendar": "Ny hendelse i denne kalenderen",
"shared_with": "Delt med {names}",
"shared_with_count": "{count, plural, one {Delt med 1 person} other {Delt med # personer}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Deelnemer",
"accepted": "Geaccepteerd",
"declined": "Geweigerd",
"accept": "Accepteren",
"maybe": "Misschien",
"decline": "Weigeren",
"tentative": "Voorlopig",
"needs_action": "Reactie vereist",
"remove": "Verwijderen",
@@ -3585,14 +3588,14 @@
"invalid_url": "Voer een geldige URL in",
"url_fetch_failed": "Kan agenda niet ophalen van URL",
"parsing": "Agendabestand wordt verwerkt...",
"parsed_events": "{count} evenementen gevonden",
"parsed_events": "{count, plural, one {# afspraak gevonden} other {# afspraken gevonden}}",
"no_events": "Geen evenementen gevonden in bestand",
"select_all": "Alles selecteren",
"deselect_all": "Alles deselecteren",
"target_calendar": "Importeren in agenda",
"import_button": "Selectie importeren",
"importing": "Evenementen importeren...",
"success": "{count} evenementen succesvol geïmporteerd",
"success": "{count, plural, one {# afspraak geïmporteerd} other {# afspraken geïmporteerd}}",
"error": "Agenda importeren mislukt",
"file_too_large": "Bestand overschrijdt de limiet van 10 MB",
"invalid_format": "Ongeldig agendabestandsformaat"
@@ -3637,9 +3640,9 @@
"default_updated": "Standaardagenda bijgewerkt",
"error_default": "Standaardagenda instellen mislukt",
"clear_events": "Afspraken verwijderen",
"events_cleared": "{count} afspraken verwijderd",
"events_cleared": "{count, plural, one {# afspraak verwijderd} other {# afspraken verwijderd}}",
"error_clear": "Kan agendagebeurtenissen niet verwijderen",
"share": "Agenda delen",
"share": "Agenda delen…",
"new_event_in_calendar": "Nieuwe afspraak in deze agenda",
"shared_with": "Gedeeld met {names}",
"shared_with_count": "{count, plural, one {Gedeeld met 1 persoon} other {Gedeeld met # personen}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Uczestnik",
"accepted": "Zaakceptowano",
"declined": "Odrzucono",
"accept": "Akceptuj",
"maybe": "Może",
"decline": "Odrzuć",
"tentative": "Wstępnie",
"needs_action": "Wymaga działania",
"remove": "Usuń",
@@ -3585,14 +3588,14 @@
"invalid_url": "Wprowadź prawidłowy adres URL",
"url_fetch_failed": "Nie udało się pobrać kalendarza z adresu URL",
"parsing": "Analizowanie pliku kalendarza...",
"parsed_events": "Znaleziono {count} wydarzeń",
"parsed_events": "{count, plural, one {Znaleziono # wydarzenie} few {Znaleziono # wydarzenia} many {Znaleziono # wydarzeń} other {Znaleziono # wydarzenia}}",
"no_events": "Nie znaleziono wydarzeń w pliku",
"select_all": "Zaznacz wszystko",
"deselect_all": "Odznacz wszystko",
"target_calendar": "Importuj do kalendarza",
"import_button": "Importuj zaznaczone",
"importing": "Importowanie wydarzeń...",
"success": "Pomyślnie zaimportowano {count} wydarzeń",
"success": "{count, plural, one {Zaimportowano # wydarzenie} few {Zaimportowano # wydarzenia} many {Zaimportowano # wydarzeń} other {Zaimportowano # wydarzenia}}",
"error": "Nie udało się zaimportować kalendarza",
"file_too_large": "Plik przekracza limit 10 MB",
"invalid_format": "Nieprawidłowy format pliku kalendarza"
@@ -3627,7 +3630,7 @@
"default_updated": "Zaktualizowano domyślny kalendarz",
"error_default": "Nie udało się ustawić domyślnego kalendarza",
"clear_events": "Wyczyść wydarzenia",
"events_cleared": "Wyczyszczono {count} wydarzeń",
"events_cleared": "{count, plural, one {Wyczyszczono # wydarzenie} few {Wyczyszczono # wydarzenia} many {Wyczyszczono # wydarzeń} other {Wyczyszczono # wydarzenia}}",
"error_clear": "Nie udało się wyczyścić wydarzeń kalendarza",
"calendar_created": "Kalendarz utworzono",
"calendar_updated": "Kalendarz zaktualizowano",
@@ -3639,7 +3642,7 @@
"caldav_url": "Adres URL CalDAV",
"copy_url": "Kopiuj adres URL CalDAV",
"url_copied": "Adres URL CalDAV skopiowano do schowka",
"share": "Udostępnij kalendarz",
"share": "Udostępnij kalendarz…",
"new_event_in_calendar": "Nowe wydarzenie w tym kalendarzu",
"shared_with": "Udostępniono: {names}",
"shared_with_count": "{count, plural, one {Udostępniono 1 osobie} few {Udostępniono # osobom} many {Udostępniono # osobom} other {Udostępniono # osoby}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Participante",
"accepted": "Aceito",
"declined": "Recusado",
"accept": "Aceitar",
"maybe": "Talvez",
"decline": "Recusar",
"tentative": "Provisório",
"needs_action": "Aguardando resposta",
"remove": "Remover",
@@ -3611,14 +3614,14 @@
"invalid_url": "Insira uma URL válida",
"url_fetch_failed": "Não foi possível buscar o calendário da URL",
"parsing": "Analisando arquivo de calendário...",
"parsed_events": "{count} eventos encontrados",
"parsed_events": "{count, plural, one {# evento encontrado} other {# eventos encontrados}}",
"no_events": "Nenhum evento encontrado no arquivo",
"select_all": "Selecionar tudo",
"deselect_all": "Desmarcar tudo",
"target_calendar": "Importar para o calendário",
"import_button": "Importar selecionados",
"importing": "Importando eventos...",
"success": "{count} eventos importados com sucesso",
"success": "{count, plural, one {# evento importado} other {# eventos importados}}",
"error": "Falha ao importar calendário",
"file_too_large": "Arquivo excede o limite de 10 MB",
"invalid_format": "Formato de arquivo de calendário inválido"
@@ -3663,9 +3666,9 @@
"default_updated": "Calendário padrão atualizado",
"error_default": "Falha ao definir calendário padrão",
"clear_events": "Limpar eventos",
"events_cleared": "{count} eventos removidos",
"events_cleared": "{count, plural, one {# evento removido} other {# eventos removidos}}",
"error_clear": "Falha ao limpar os eventos do calendário",
"share": "Compartilhar calendário",
"share": "Compartilhar calendário…",
"new_event_in_calendar": "Novo evento neste calendário",
"shared_with": "Compartilhado com {names}",
"shared_with_count": "{count, plural, one {Compartilhado com 1 pessoa} other {Compartilhado com # pessoas}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Participant",
"accepted": "Acceptat",
"declined": "Respins",
"accept": "Acceptă",
"maybe": "Poate",
"decline": "Refuză",
"tentative": "Provizoriu",
"needs_action": "Necesită acțiune",
"remove": "Eliminați",
@@ -3614,14 +3617,14 @@
"invalid_url": "Vă rugăm să introduceți o adresă de e-mail validă URL",
"url_fetch_failed": "Nu s-a putut prelua calendarul de la URL",
"parsing": "Se analizează fișierul de calendar...",
"parsed_events": "{count} evenimente găsite",
"parsed_events": "{count, plural, one {# eveniment găsit} few {# evenimente găsite} other {# de evenimente găsite}}",
"no_events": "Nu s-au găsit evenimente în fișier",
"select_all": "Selectează tot",
"deselect_all": "Deselectați tot",
"target_calendar": "Import în calendar",
"import_button": "Importați elementele selectate",
"importing": "Se importă evenimente...",
"success": "{count} evenimentele au fost importate cu succes",
"success": "{count, plural, one {# eveniment importat} few {# evenimente importate} other {# de evenimente importate}}",
"error": "Importul calendarului a eșuat",
"file_too_large": "Fișierul depășește limita de 10 MB",
"invalid_format": "Format de fișier calendar invalid"
@@ -3656,7 +3659,7 @@
"default_updated": "Calendarul implicit a fost actualizat",
"error_default": "Nu s-a reușit setarea calendarului implicit",
"clear_events": "Ștergeți evenimentele",
"events_cleared": "{count} evenimente șterse",
"events_cleared": "{count, plural, one {# eveniment șters} few {# evenimente șterse} other {# de evenimente șterse}}",
"error_clear": "Nu s-au șters evenimentele din calendar",
"calendar_created": "Calendar creat",
"calendar_updated": "Calendar actualizat",
@@ -3668,7 +3671,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "Copiați CalDAV URL",
"url_copied": "CalDAV URL copiat în clipboard",
"share": "Partajare calendar",
"share": "Partajare calendar…",
"new_event_in_calendar": "Eveniment nou în acest calendar",
"shared_with": "Partajat cu {names}",
"shared_with_count": "{count, plural, one {Partajat cu 1 persoană} few {Partajat cu # persoane} other {Partajat cu # de persoane}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Участник",
"accepted": "Принято",
"declined": "Отклонено",
"accept": "Принять",
"maybe": "Может быть",
"decline": "Отклонить",
"tentative": "Предварительно",
"needs_action": "Требует ответа",
"remove": "Удалить",
@@ -3585,14 +3588,14 @@
"invalid_url": "Введите корректный URL",
"url_fetch_failed": "Не удалось получить календарь по URL",
"parsing": "Разбор файла календаря...",
"parsed_events": "Найдено {count} событий",
"parsed_events": "{count, plural, one {Найдено # событие} few {Найдено # события} many {Найдено # событий} other {Найдено # события}}",
"no_events": "События в файле не найдены",
"select_all": "Выбрать все",
"deselect_all": "Снять выделение",
"target_calendar": "Импортировать в календарь",
"import_button": "Импортировать выбранные",
"importing": "Импортирование событий...",
"success": "{count} событий успешно импортировано",
"success": "{count, plural, one {Импортировано # событие} few {Импортировано # события} many {Импортировано # событий} other {Импортировано # события}}",
"error": "Не удалось импортировать календарь",
"file_too_large": "Файл превышает лимит 10 МБ",
"invalid_format": "Неверный формат файла календаря"
@@ -3627,7 +3630,7 @@
"default_updated": "Календарь по умолчанию обновлён",
"error_default": "Не удалось установить календарь по умолчанию",
"clear_events": "Очистить события",
"events_cleared": "{count} событий очищено",
"events_cleared": "{count, plural, one {Очищено # событие} few {Очищено # события} many {Очищено # событий} other {Очищено # события}}",
"error_clear": "Не удалось очистить события календаря",
"calendar_created": "Календарь создан",
"calendar_updated": "Календарь обновлён",
@@ -3639,7 +3642,7 @@
"caldav_url": "URL CalDAV",
"copy_url": "Скопировать CalDAV URL",
"url_copied": "CalDAV URL скопирован в буфер обмена",
"share": "Поделиться календарём",
"share": "Поделиться календарём…",
"new_event_in_calendar": "Новое событие в этом календаре",
"shared_with": "Доступ открыт: {names}",
"shared_with_count": "{count, plural, one {Доступ открыт # человеку} few {Доступ открыт # людям} many {Доступ открыт # людям} other {Доступ открыт # человека}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Účastník",
"accepted": "Prijaté",
"declined": "Odmietnuté",
"accept": "Prijať",
"maybe": "Možno",
"decline": "Odmietnuť",
"tentative": "Nezáväzne",
"needs_action": "Vyžaduje akciu",
"remove": "Odstrániť",
@@ -3614,14 +3617,14 @@
"invalid_url": "Zadajte platnú URL adresu",
"url_fetch_failed": "Načítanie kalendára z URL adresy zlyhalo",
"parsing": "Analyzovanie súboru kalendára...",
"parsed_events": "Nájdených {count} udalostí",
"parsed_events": "{count, plural, one {Nájdená # udalosť} few {Nájdené # udalosti} many {Nájdenej # udalosti} other {Nájdených # udalostí}}",
"no_events": "V súbore neboli nájdené žiadne udalosti",
"select_all": "Vybrať všetko",
"deselect_all": "Zrušiť výber všetkého",
"target_calendar": "Importovať do kalendára",
"import_button": "Importovať vybrané",
"importing": "Importovanie udalostí...",
"success": "Úspešne importovaných {count} udalostí",
"success": "{count, plural, one {Importovaná # udalosť} few {Importované # udalosti} many {Importovanej # udalosti} other {Importovaných # udalostí}}",
"error": "Import kalendára zlyhal",
"file_too_large": "Súbor prekračuje limit 10 MB",
"invalid_format": "Neplatný formát súboru kalendára"
@@ -3656,7 +3659,7 @@
"default_updated": "Predvolený kalendár aktualizovaný",
"error_default": "Nepodarilo sa nastaviť predvolený kalendár",
"clear_events": "Vymazať udalosti",
"events_cleared": "Vymazaných {count} udalostí",
"events_cleared": "{count, plural, one {Vymazaná # udalosť} few {Vymazané # udalosti} many {Vymazanej # udalosti} other {Vymazaných # udalostí}}",
"error_clear": "Vymazanie udalostí kalendára zlyhalo",
"calendar_created": "Kalendár bol vytvorený",
"calendar_updated": "Kalendár bol aktualizovaný",
@@ -3668,7 +3671,7 @@
"caldav_url": "URL CalDAV",
"copy_url": "Kopírovať URL CalDAV",
"url_copied": "URL CalDAV skopírovaná do schránky",
"share": "Zdieľať kalendár",
"share": "Zdieľať kalendár…",
"new_event_in_calendar": "Nová udalosť v tomto kalendári",
"shared_with": "Zdieľané s: {names}",
"shared_with_count": "{count, plural, one {Zdieľané s 1 osobou} few {Zdieľané s # osobami} many {Zdieľané s # osoby} other {Zdieľané s # osobami}}",
+5 -2
View File
@@ -2659,6 +2659,9 @@
"attendee": "ผู้เข้าร่วม",
"accepted": "ยอมรับแล้ว",
"declined": "ปฏิเสธแล้ว",
"accept": "ตอบรับ",
"maybe": "อาจจะ",
"decline": "ปฏิเสธ",
"tentative": "อาจจะไป",
"needs_action": "รอการตอบรับ",
"remove": "ลบออก",
@@ -2935,7 +2938,7 @@
"target_calendar": "นำเข้าไปยังปฏิทิน",
"import_button": "นำเข้ารายการที่เลือก",
"importing": "กำลังนำเข้ากิจกรรม...",
"success": "นำเข้ากิจกรรมสำเร็จ {count} รายการ",
"success": "นำเข้ากิจกรรมแล้ว {count} รายการ",
"error": "นำเข้าปฏิทินไม่สำเร็จ",
"file_too_large": "ไฟล์มีขนาดเกิน 10 MB",
"invalid_format": "รูปแบบไฟล์ปฏิทินไม่ถูกต้อง"
@@ -2982,7 +2985,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "คัดลอก CalDAV URL",
"url_copied": "คัดลอก CalDAV URL ไปยังคลิปบอร์ดแล้ว",
"share": "แชร์ปฏิทิน",
"share": "แชร์ปฏิทิน…",
"new_event_in_calendar": "กิจกรรมใหม่ในปฏิทินนี้",
"shared_with": "แชร์กับ {names}",
"shared_with_count": "{count, plural, one {แชร์กับบุคคล 1 คน} other {แชร์กับบุคคล # คน}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "Katılımcı",
"accepted": "Kabul edildi",
"declined": "Reddedildi",
"accept": "Kabul et",
"maybe": "Belki",
"decline": "Reddet",
"tentative": "Geçici",
"needs_action": "İşlem gerekiyor",
"remove": "Kaldır",
@@ -3618,7 +3621,7 @@
"target_calendar": "Takvime içe aktar",
"import_button": "Seçilenleri içe aktar",
"importing": "Etkinlikler içe aktarılıyor...",
"success": "{count} etkinlik başarıyla içe aktarıldı",
"success": "{count} etkinlik içe aktarıldı",
"error": "Takvim içe aktarılamadı",
"file_too_large": "Dosya 10 MB sınırını aşıyor",
"invalid_format": "Geçersiz takvim dosyası biçimi"
@@ -3665,7 +3668,7 @@
"caldav_url": "CalDAV URL'si",
"copy_url": "CalDAV URL'sini kopyala",
"url_copied": "CalDAV URL'si panoya kopyalandı",
"share": "Takvimi paylaş",
"share": "Takvimi paylaş…",
"new_event_in_calendar": "Bu takvimde yeni etkinlik",
"shared_with": "Paylaşılan kişiler: {names}",
"shared_with_count": "{count, plural, one {1 kişiyle paylaşıldı} other {# kişiyle paylaşıldı}}",
+7 -4
View File
@@ -3345,6 +3345,9 @@
"attendee": "Присутній",
"accepted": "прийнято",
"declined": "Відхилено",
"accept": "Прийняти",
"maybe": "Можливо",
"decline": "Відхилити",
"tentative": "Орієнтовний",
"needs_action": "Потребує дії",
"remove": "видалити",
@@ -3585,14 +3588,14 @@
"invalid_url": "Введіть дійсну URL-адресу",
"url_fetch_failed": "Не вдалося отримати календар з URL-адреси",
"parsing": "Розбір файлу календаря...",
"parsed_events": "Знайдено подій: {count}",
"parsed_events": "{count, plural, one {Знайдено # подію} few {Знайдено # події} many {Знайдено # подій} other {Знайдено # події}}",
"no_events": "У файлі не знайдено подій",
"select_all": "Вибрати все",
"deselect_all": "Зняти вибір із усіх",
"target_calendar": "Імпорт до календаря",
"import_button": "Вибраний імпорт",
"importing": "Імпорт подій...",
"success": "{count} подій успішно імпортовано",
"success": "{count, plural, one {Імпортовано # подію} few {Імпортовано # події} many {Імпортовано # подій} other {Імпортовано # події}}",
"error": "Не вдалося імпортувати календар",
"file_too_large": "Файл перевищує обмеження в 10 Мб",
"invalid_format": "Недійсний формат файлу календаря"
@@ -3627,7 +3630,7 @@
"default_updated": "Типовий календар оновлено",
"error_default": "Не вдалося встановити типовий календар",
"clear_events": "Ясні події",
"events_cleared": "{count} подій видалено",
"events_cleared": "{count, plural, one {Видалено # подію} few {Видалено # події} many {Видалено # подій} other {Видалено # події}}",
"error_clear": "Не вдалося очистити події календаря",
"calendar_created": "Календар створено",
"calendar_updated": "Календар оновлено",
@@ -3639,7 +3642,7 @@
"caldav_url": "URL-адреса CalDAV",
"copy_url": "Скопіюйте URL-адресу CalDAV",
"url_copied": "URL-адресу CalDAV скопійовано в буфер обміну",
"share": "Поділитися календарем",
"share": "Поділитися календарем…",
"new_event_in_calendar": "Нова подія в цьому календарі",
"shared_with": "Доступ надано: {names}",
"shared_with_count": "{count, plural, one {Доступ надано # особі} few {Доступ надано # особам} many {Доступ надано # особам} other {Доступ надано # особи}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "與會者",
"accepted": "已接受",
"declined": "已拒絕",
"accept": "接受",
"maybe": "暫定",
"decline": "拒絕",
"tentative": "暫定",
"needs_action": "待處理",
"remove": "移除",
@@ -3621,7 +3624,7 @@
"target_calendar": "匯入到行事曆",
"import_button": "匯入選取項目",
"importing": "正在匯入活動…",
"success": "{count} 個活動已成功匯入",
"success": "已匯入 {count} 個活動",
"error": "匯入行事曆失敗",
"file_too_large": "檔案超過 10 MB 上限",
"invalid_format": "行事曆檔案格式無效"
@@ -3668,7 +3671,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "複製 CalDAV URL",
"url_copied": "CalDAV URL 已複製到剪貼簿",
"share": "分享行事曆",
"share": "分享行事曆…",
"new_event_in_calendar": "在此行事曆中新增活動",
"shared_with": "已與 {names} 共用",
"shared_with_count": "{count, plural, other {已與 # 人共用}}",
+5 -2
View File
@@ -3345,6 +3345,9 @@
"attendee": "出席者",
"accepted": "已接受",
"declined": "已拒绝",
"accept": "接受",
"maybe": "暂定",
"decline": "拒绝",
"tentative": "暂定",
"needs_action": "待处理",
"remove": "移除",
@@ -3592,7 +3595,7 @@
"target_calendar": "导入到日历",
"import_button": "导入所选",
"importing": "正在导入活动...",
"success": "{count} 个活动已成功导入",
"success": "已导入 {count} 个活动",
"error": "导入日历失败",
"file_too_large": "文件超过 10MB 限制",
"invalid_format": "日历文件格式无效"
@@ -3639,7 +3642,7 @@
"caldav_url": "CalDAV URL",
"copy_url": "复制 CalDAV URL",
"url_copied": "CalDAV URL 已复制到剪贴板",
"share": "共享日历",
"share": "共享日历…",
"new_event_in_calendar": "在此日历中新建事件",
"shared_with": "已与 {names} 共享",
"shared_with_count": "{count, plural, other {已与 # 人共享}}",