diff --git a/frontend/js/calendar.js b/frontend/js/calendar.js index 960210e..9758f9c 100644 --- a/frontend/js/calendar.js +++ b/frontend/js/calendar.js @@ -6,7 +6,7 @@ import { renderAgenda } from './views/agenda.js'; import { renderQuarter } from './views/quarter.js'; import { openColorPicker } from './color-picker.js'; import { openDatePicker, formatDtDisplay } from './date-picker.js'; -import { t, setLang, getLang } from './i18n.js'; +import { t, setLang, getLocale } from './i18n.js'; import { DEFAULT_COLORS, SETTING_GROUPS, SYNCABLE_KEYS, loadLocal, saveLocal, mergeEffective, baseColor, setInstanceDefaults } from './settings-sync.js'; import { loadInstance, reloadInstance, instanceConfig } from './instance.js'; import { APP_VERSION } from './version.js'; @@ -1912,7 +1912,7 @@ function setDtValue(id, isoStr, mode) { const display = document.getElementById(id + '-display'); if (display) { display.querySelector('.dt-display-text').textContent = - formatDtDisplay(isoStr, mode, getLang()); + formatDtDisplay(isoStr, mode); } } @@ -3963,7 +3963,7 @@ function renderBirthdaySettings() { const rowEl = document.createElement('div'); rowEl.className = 'form-hint'; rowEl.style.margin = '0 0 2px'; - const when = d.last_sync ? new Date(d.last_sync).toLocaleDateString() : ''; + const when = d.last_sync ? new Date(d.last_sync).toLocaleDateString(getLocale()) : ''; rowEl.textContent = `${d.device_name} — ${t('birthday_devices_count', { n: d.count })}${when ? ' · ' + when : ''}`; devicesWrap.appendChild(rowEl); }); @@ -4937,7 +4937,7 @@ function initAppPasswords() { appPwList.innerHTML = rows.length ? rows.map(r => `
${t('app_pw_none')}
`; @@ -5138,10 +5138,10 @@ export function showToast(msg, isError = false) { // ── Helpers ─────────────────────────────────────────────── function fmtTime(d) { - return d.toLocaleTimeString('de', { hour: '2-digit', minute: '2-digit' }); + return d.toLocaleTimeString(getLocale(), { hour: '2-digit', minute: '2-digit' }); } function fmtDatetime(d) { - return d.toLocaleString('de', { weekday:'short', day:'2-digit', month:'short', hour:'2-digit', minute:'2-digit' }); + return d.toLocaleString(getLocale(), { weekday:'short', day:'2-digit', month:'short', hour:'2-digit', minute:'2-digit' }); } function escHtml(s) { return String(s).replace(/&/g,'&').replace(//g,'>'); diff --git a/frontend/js/date-picker.js b/frontend/js/date-picker.js index ac9c98d..9afd307 100644 --- a/frontend/js/date-picker.js +++ b/frontend/js/date-picker.js @@ -5,7 +5,7 @@ * value : ISO string ("YYYY-MM-DDTHH:MM" | "YYYY-MM-DD") or "" * mode : 'datetime' | 'date' */ -import { t } from './i18n.js'; +import { t, getLocale } from './i18n.js'; const ITEM_H = 40; // px per scroll item const VISIBLE = 3; // visible items in time scroller @@ -250,16 +250,16 @@ export function openDatePicker(anchor, value, mode = 'datetime') { /** * Format an ISO value for display in the UI * mode: 'datetime' | 'date' - * lang: 'de' | 'en' + * Formatting follows the active UI language via the i18n locale registry. */ -export function formatDtDisplay(isoStr, mode, lang = 'de') { +export function formatDtDisplay(isoStr, mode) { if (!isoStr) return '—'; try { const d = mode === 'datetime' ? new Date(isoStr.replace(' ', 'T')) : new Date(isoStr + 'T00:00:00'); if (isNaN(d)) return isoStr; - const locale = lang === 'en' ? 'en-GB' : 'de-CH'; + const locale = getLocale(); if (mode === 'datetime') { return d.toLocaleString(locale, { day: '2-digit', month: '2-digit', year: 'numeric', diff --git a/frontend/js/i18n.js b/frontend/js/i18n.js index 93e6396..c8c37b3 100644 --- a/frontend/js/i18n.js +++ b/frontend/js/i18n.js @@ -391,9 +391,400 @@ const translations = { // Color picker color_select: 'Auswählen', + }, - // Locale for time formatting - locale: 'de', + ch: { + // Common + save: 'Speicherä', cancel: 'Abbräche', close: 'Schlüsse', + create: 'Erstellä', delete: 'Löschä', edit: 'Bearbeitä', + name: 'Namä', username: 'Benutzername', password: 'Passwort', + email: 'E-Mail', color: 'Farb', color_pick: 'Farb wähle', + loading: 'Ladä', connecting: 'Verbindä…', + unknown_error: 'Unbekanntä Fähler', + + // Setup + setup_title: 'Erschtirichtig', + setup_subtitle: 'Erstell din Admin-Account', + setup_email: 'E-Mail (optional)', + setup_pw_confirm: 'Passwort wiederholä', + setup_submit: 'Admin-Account erstellä', + setup_pw_mismatch: 'Passwörter stimmed nöd überein', + setup_pw_short: 'Passwort muess mindestens 6 Zeichä ha', + + // Login + login_tagline: 'de minimalistischi Kalender', + login_submit: 'Anmeldä', + login_2fa_ph: '6-stelligä Code', + + // Topbar + btn_today: 'Hüt', + view_month: 'Moent', view_week: 'Wuche', view_day: 'Tag', view_quarter: 'Quartal', view_agenda: 'Terminä', + btn_profile: 'Profil', btn_logout: 'Abmeldä', + + // Sidebar + btn_create: 'Erstellä', + my_calendars: 'Min Kalender', + add_calendar: 'Kalender hinzufügä', + cal_local: 'Lokalä Kalender', cal_caldav: 'CalDAV-Konto', + cal_ical: 'iCal-URL abonnierä', cal_google: 'Google Kalender', + + // Event modal + event_create_title: 'Termin erstellä', event_edit_title: 'Termin bearbeitä', + event_title_ph: 'Titel hinzufüegä', event_allday: 'Ganztägig', + event_start: 'Start', event_end: 'Endi', event_calendar: 'Kalender', + event_location: 'Ort', event_location_ph: 'Ort hinzufüegä', + event_description: 'Beschriebig', event_description_ph: 'Beschriebig hinzufüegä', + + // CalDAV modal + caldav_add_title: 'CalDAV-Konto hinzufüegä', + caldav_display_name: 'Ahzeigename', caldav_display_name_ph: 'z.B. Mini Nextcloud', + caldav_url: 'CalDAV-URL', caldav_connect: 'Verbindä', + + // Local calendar modal + localcal_create_title: 'Lokalä Kalender erstellä', + localcal_name_ph: 'z.B. Persönlich', + + // iCal modal + ical_title: 'iCal-URL abonnierä', ical_name_ph: 'z.B. Fiirtig', + ical_url_label: 'iCal-URL', ical_refresh: 'Aktualisierig', + ical_15min: 'Alli 15 Minutä', ical_30min: 'Alli 30 Minutä', + ical_hourly: 'Stündlich', ical_6h: 'Alli 6 Stund', ical_daily: 'Täglich', + ical_subscribe: 'Abonnierä', + + // Settings + settings_title: 'Istellige', + settings_nav_appearance: 'Darstellig', + settings_nav_profile: 'Profil', + settings_nav_view: 'Ahsicht', + settings_nav_calendars: 'Kalender', + settings_nav_google: 'Google Kontene', + settings_nav_users: 'Benutzerverwaltig', + settings_nav_admin: 'Admin', + admin_default_theme: 'Standard-Theme', + admin_default_theme_desc: 'Gilt für alli Nutzer ohni eigeni Farb. „Zrugg“ bi ere Farb springt uf dä Standard.', + admin_theme_save: 'Standard speicherä', + admin_theme_import: 'Theme importierä', + admin_theme_imported: '{count} Farbä importiert – zum Übernäh speicherä', + admin_theme_discard: 'Verwerfä', + admin_theme_saved: 'Standard-Theme gspeichert', + admin_logo_dims: 'PNG/JPEG/WebP · Ahzeig max. 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (quadratisch)', + admin_branding: 'Branding', + admin_branding_desc: 'Eiges Logo (obe links) und Favicon für di ganzi Instanz. PNG/JPEG/WebP, max. 5 MB.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Ufeladä', + admin_remove: 'Entfernä', + admin_brand_default: 'Standard', + admin_branding_saved: 'Branding gspeichert', + admin_branding_removed: 'Branding entfernt', + settings_sync_all: 'Alli synchronisierä', + settings_sync_all_desc: 'Die Istellige zwüschet dine Grät teilä', + settings_sync_this: 'Zwüschet Grät synchronisierä', + settings_share_icon: 'Teilä-Symbol', + settings_colors: 'Farbä', + settings_primary_color: 'Primärfarb', settings_accent_color: 'Akzentfarb', + settings_today_color: 'Hütige-Tag-Farb', + settings_month_divider_color: 'Monetswächsel-Linie', + settings_month_label_color: 'Monetskürzel-Farb', + settings_text_color: 'Schriftfarb', + settings_line_color: 'Linienfarb', + settings_bg_color: 'Hintergrundfarb', + settings_surface_color: 'Siteliiste-/Oberflächefarb', + settings_hover_highlight_color: 'Hover-Highlight (Buttons, Menüs)', + settings_icon_inactive_color: 'Sidebar-Icons inaktiv (Rueh/us)', + settings_icon_active_color: 'Sidebar-Icons aktiv (Hover/ah)', + settings_day_hover_color: 'Kalendertag Hover', + settings_day_selected_color: 'Uusgwählte Tag', + settings_day_bg_color: 'Tag-Hintergrund', + settings_today_bg_color: 'Hütige Tag Hintergrund', + theme_export: 'Theme exportierä', + theme_import: 'Theme importierä', + theme_imported: 'Theme importiert – zum Übernäh speicherä', + theme_imported_saved: '{count} Parameter importiert & gspeichert', + theme_import_invalid: 'Ungültigi Theme-Datei', + theme_docs_hint: 'Erklärig vo de Theme-Parameter', + theme_unknown_title: 'Unbekannti Parameter', + theme_unknown_params: 'Die Theme-Datei hät {count} Parameter, wo die Version nöd kennt ({names}). De Rescht trotzdem importierä?', + theme_import_rest: 'Rescht importierä', + confirm_generic_title: 'Bestätigä', + confirm: 'OK', + confirm_delete_cal_title: 'Kalender löschä', + confirm_remove_ical_title: 'Abo entfernä', + confirm_ha_disconnect: 'Home Assistant Konto würkli trennä?', + reset: 'Reset', + settings_text_contrast: 'Schriftkontrast', + settings_text_contrast_desc: 'Helligkeit vo de Beschriftige und de Text', + contrast_dark: 'Dunkel', contrast_medium: 'Mittel', + contrast_light: 'Hell', contrast_max: 'Maximum', + settings_line_contrast: 'Liniekontrascht', + settings_line_contrast_desc: 'Sichtbarkeit von de Trennlinie und de Rahme', + line_barely: 'Chuum', line_subtle: 'Subtil', + line_normal: 'Normal', line_strong: 'Starch', + settings_calendar_view: 'Kalenderahsicht', + settings_default_view: 'Standardahsicht', + settings_week_start: 'Erste Wuchentag', + week_start_monday: 'Mäntag', week_start_sunday: 'Sunntag', + settings_dim_past: 'Vergangeni Termine uusgraue', + settings_month_mode: 'Monetswächsel', + settings_month_mode_scroll: 'Fortlaufend scrollä (Wuche)', + settings_month_mode_paged: 'Sitewiis blätterä (Monet)', + settings_default_duration: 'Standard-Terminduur', + settings_privacy: 'Privatsphäre', + settings_private_visibility: 'Privati Termine für Gruppenmitglieder', + settings_private_visibility_desc: 'Wie privati Termine für anderi Gruppenmitglieder erschiine', + settings_directory_hidden: 'Profil verstecke (nöd i de Teilä-/Gruppä-Uswahl ahzeige)', + settings_directory_hidden_desc: 'Anderi Nutzer chönd di denn nöd uswähle, zum Kalender teilä oder di zu Gruppä hinzuefüegä. I de Admin-Benutzerverwaltig bliibsch sichtbar.', + private_visibility_busy: 'Als „Beschäftigt“ ahzeige', + private_visibility_hidden: 'Usblendä', + created_by: 'Erstellt vo: {name}', + event_private: 'Privat', + reminders: 'Benachrichtigunge', + reminder_add: 'Benachrichtigung hinzufügä', + reminder_at_start: 'Zu de Startziit', + reminder_minutes: '{n} Minutä vorher', + reminder_hour_one: '1 Stund vorher', + reminder_hours: '{n} Stund vorher', + reminder_day_one: '1 Tag vorher', + reminder_days: '{n} Täg vorher', + reminder_week_one: '1 Wuche vorher', + reminder_weeks: '{n} Wuche vorher', + reminder_custom: 'Benutzerdefiniert…', + reminder_unit_minutes: 'Minutä', + reminder_unit_hours: 'Stundä', + reminder_unit_days: 'Täg', + reminder_unit_weeks: 'Wuche', + reminder_before: 'vorher', + reminders_calendar_off: 'Für dä Kalender sind Benachrichtigunge deaktiviert – Erinnerige werded nöd usgfüert.', + calendar_reminders_on: 'Benachrichtigunge aktiviert', + calendar_reminders_off: 'Benachrichtigunge deaktiviert', + copy: 'Kopierä', + caldav_publish: 'CalDAV veröffentlichä', + caldav_unpublish: 'CalDAV deaktivierä', + caldav_published_url: 'CalDAV-URL (ohni Login):', + caldav_url_copied: 'CalDAV-URL kopiert', + caldav_token_rotate: 'Token neu generierä', + caldav_token_rotated: 'Neuä Token erzügt – alti Abos müend neu ihgrichtet werdä', + caldav_rotate_confirm: 'Neuä Token erzüge? Di bisherig URL wird ungültig und bestehendi Abos müend mit de neue URL neu ihgrichtet werdä.', + caldav_hint: 'Jedä mit dere URL cha dä Kalender abonnierä und bearbeitä – kei Login nötig. Über CalDAV-fähigi Clients (Apple Kalender, Thunderbird, DAVx5) ihbindä.', + caldav_login_url: 'CalDAV-URL (mit Login):', + caldav_login_hint: 'Alternativ im Client es „CalDAV-Konto“ mit dere Server-URL sowie dim Benutzernamä und App-Passwort hinzuefüegä – denn werded alli dini veröffentlichte Kalender gfunde.', + app_pw_title: 'App-Passwörter (CalDAV)', + app_pw_desc: 'Eigeni Passwörter für CalDAV-Clients. Bi aktivem 2FA nötig, wil Apps kein 2FA-Code chönd ihgä. Jederziit widerruefbar.', + app_pw_label_ph: 'Namä (z.B. iPhone)', + app_pw_create: 'Erstellä', + app_pw_new_label: 'Neus App-Passwort (nur jetzt sichtbar):', + app_pw_last_used: 'zletscht', + app_pw_never_used: 'no nie brucht', + app_pw_revoke: 'Widerruefä', + app_pw_none: 'No kei App-Passwörter.', + app_pw_copied: 'App-Passwort kopiert', + app_pw_revoke_confirm: "Das App-Passwort widerruefä? Clients wo's bruuched, verlüred de Zuegriff.", + share: 'Teilä', + import: 'Importierä', + export: 'Exportierä', + importing: 'Importierä…', + import_result: '{imported} importiert, {skipped} übersprungä', + shared_by: 'teilt vo(m) {name}', + share_title: 'Kalender teilä', + share_current: 'Aktuelle Freigabe', + share_add: 'Benutzer hinzufügä', + share_search: 'Benutzer suechen…', + share_none: 'Nonig teilt', + share_no_users: 'Kei Benutzer gfunde', + perm_read: 'Nur läse', + perm_read_write: 'Läse & schriibe', + remove: 'Entfernä', + done: 'Fertig', + groups_title: 'Gruppä', + groups_none: 'No kei Gruppene', + group_create: 'Gruppä erstellä', + group_manage: 'Gruppä verwaltä', + group_name: 'Namä', + group_name_ph: 'Gruppennamä', + group_members: 'Mitglieder', + group_delete: 'Gruppä löschä', + group_delete_confirm: 'Die Gruppä und ihrä Gruppenkalender würkli löschä?', + group_deleted: 'Gruppä glöscht', + group_saved: 'Gruppä gspeichert', + group_created: 'Gruppä erstellt', + group_view_label: 'Gruppäahsicht: {name}', + group_exit: 'Gruppäahsicht verlah', + group_calendar: 'Gruppäkalender', + group_icon: 'Icon', + group_visible_flag: 'Für diini Gruppä sichtbar', + group_new_event: '+ Gruppätermin', + group_member_colors: "Farbe d'Mitglieder", + only_owner_color: "Nur für de Bsitzer chan d'Farb änderä", + upload_too_large: "Datei isch z'gross (Server-Limit). Bitte s'Upload-Limit erhöchä.", + shared_with_me: 'Mit dir teilt', + settings_calendars: 'Kalender', + settings_group_visible: 'Für Gruppä sichtbarä Kalender', + settings_group_visible_desc: 'Wähl, welä vo dine Kalender für diini Gruppenmitglieder sichtbar isch', + group_visible_none: 'Keinä', + drag_reorder: 'Zum Sortierä zieh', + profile_account: 'Konto', + profile_display_name: 'Anzeigenamä', + profile_display_name_ph: 'Anzeigenamä', + profile_login_name: 'Login-Namä', + profile_login_name_desc: 'Chli gschribe, fürs Ahmeldä. Gross-/Chliischriebig isch egal.', + settings_hour_height: 'Stundehöchi (Wuche- & Tagesahsicht)', + settings_hour_height_desc: 'Wie viel Platz söll e Stund in de Ziitraschterahsicht inneh?', + hour_compact: 'Kompakt', hour_normal: 'Normal', + hour_comfort: 'Komfort', hour_large: 'Gross', + settings_language: 'Sprach', + settings_hidden_cals: 'Usblendeti Kalender', + settings_no_hidden_cals: 'Kei usblendeti Kalender', + settings_no_google: 'Kei Google-Kontenä verbundä', + settings_nav_accounts: 'Konte', + settings_accounts_caldav: 'CalDAV-Konten', + settings_accounts_local: 'Lokali Kalender', + settings_accounts_ical: 'iCal-Abonnements', + settings_accounts_google: 'Google-Konte', + settings_no_caldav_accounts: 'Keine CalDAV-Konte', + settings_no_local_cals: 'Kei lokali Kalender', + settings_no_ical_subs: 'Kei Abonnements', + settings_no_google_accounts: 'Kei Google-Kontenä', + confirm_caldav_disconnect: 'CalDAV-Konto würkli trennä?', + caldav_disconnected: 'CalDAV-Konto isch trännt worde', + + // User management + users_add: 'Benutzer hinzufüegä', users_is_admin: 'Adminischtrator', + users_make_admin: 'Zum Admin machä', users_revoke_admin: 'Admin entzieh', + + // Profile + profile_title: 'Profil', profile_upload: 'Bild ufelade', + profile_remove_avatar: 'Entfernä', + profile_email_ph: 'Kei E-Mailadresse hinterleit', + profile_change_pw: 'Passwort änderä', + profile_pw_current: 'Aktuells Passwort', profile_pw_new: 'Neus Passwort', + profile_pw_confirm: 'Neus Passwort wiederholä', + profile_2fa: 'Zwei-Faktor-Authentifizierig', + profile_2fa_disabled_text: '2FA isch deaktiviert. Schütz diis Konto mit eme Authenticator.', + profile_2fa_setup: '2FA ihrichte', + profile_2fa_scan: 'Scann de QR-Code mit dinere Authenticator-App (z.B. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Oder gib dä Schlüssel manuell ih', + profile_2fa_copy: 'Kopierä', profile_2fa_code_label: 'Bestätigungscode ihngebä', + profile_2fa_ph: '6-stelligä Code', profile_2fa_activate: 'Aktivierä', + profile_2fa_enabled_text: '2FA isch aktiviert.', + profile_2fa_pw_disable: 'Passwort zum Deaktivierä', + profile_2fa_disable: '2FA deaktivierä', + profile_my_calendars: 'Mini Kalender', + + // Avatar crop + crop_title: 'Bildusschnitt wählä', crop_submit: 'Zueschniidä & ufeladä', + + // Impressum + impressum_title: 'Impressum', + impressum_desc: 'Software & Webentwicklig', + impressum_about: 'Die Software isch vo Scarriffleservices mit grösster Sorgfalt entwickelt und bereitgstellt worde. Alli Recht vorbeahlte © 2026 Scarriffleservices.', + impressum_data_title: 'Datenspeicherig', + impressum_data_text: 'Alle Anwendigsdatä werden uf dem Server gspeichert und verarbeitet wo die Calendarr-Instanz betriebä wird. Der Speicherort hanget drum vom Serverbetriieber ab. Bi de Nutzig vo de Google Kalender-Anbindig werded Datä über dGoogle API usgetuuscht; für die Datä gelted dDatenschutzbestimmige vo Google. Bi de Nutzig vo de Home Assistant-Anbindig werded Datä mit de jewiilige Home Assistant-Instanz ustuscht. Home Assistant isch es Projekt vo de Open Home Foundation.', + impressum_disclaimer_title: 'Haftigsusschluss', + impressum_disclaimer_text: 'Trotz sorgfältigä Erstellig wird keine Haftig für dRichtigkeit, Vollständigkeit oder Aktualität vo de bereitgstellten Inhält überno. DNutzig erfolgt uf eigeni Verantwortig.', + impressum_contact: 'Kontakt', + + // Toast / confirms + error_load_events: 'Fehler bim Laden de Terminä', + error_no_calendars: 'Kei Kalender', + confirm_delete_local_cal: 'Lokale Kalender wirkli löschä?', + confirm_remove_ical: 'Abonnement würkli entfernä?', + google_not_configured: 'Google OAuth isch nöd konfiguriert (Admin muess GOOGLE_CLIENT_ID/SECRET setzä)', + error_enter_title: 'Bitte Titel ihgä', + error_enter_date: 'Bitte Datum ihgä', + error_enter_start: 'Bitte Start-Ziit ihgä', + error_end_before_start: 'Endi chan nöd vor em Start ligge', + ctx_create_event: 'Neueä Termin erstellä', + event_readonly: 'Abonnierti Termine chönd nöd bearbeitet werdä', + ha_create_not_supported: 'Termine chönd i Home Assistant Kalender nöd direkt erstellt werdä', + rec_label: 'Wiederholig', + rec_none: 'Keini', rec_daily: 'Täglich', rec_weekly: 'Wüchentlich', + rec_monthly: 'Monatlich', rec_yearly: 'Jährlich', rec_custom: 'Benutzerdefiniert…', + rec_every: 'Alli', rec_days: 'Täg', rec_weeks: 'Wuche', rec_months: 'Mönet', + rec_ends: 'Endet', rec_never: 'Nie', rec_after_count: 'Nach Ahzahl', + rec_on_date: 'Am Datum', rec_occurrences: 'Termine', + copy_to_calendar: 'Kopierä nach…', event_copied: 'Termin kopiert', + edit_before_copy: 'Vor em Kopierä bearbeitä', + event_updated: 'Termin aktualisiert', event_created: 'Termin erstellt', + confirm_delete_event: '"{title}" würkli löschä?', + confirm_delete_title: 'Termin löschä', + delete_single: 'Nur dä Termin', + delete_all_series: 'Alli Termine vo dere Serie', + event_deleted: 'Termin glöscht', + error_fill_all: 'Bitte alli Felder usfülleä', + account_added: 'Konto "{name}" hinzugfüegt', + error_enter_name: 'Bitte Name ihgä', + calendar_created: 'Kalender "{name}" erstellt', + // Birthdays + create_event_option: 'Neuä Termin', + birthday_new: 'Neuä Geburtstag', + birthday_modal_title: 'Neuä Geburtstag hinzuefüegä', + birthday_calendar: 'Geburtstagskalender', + birthday_calendar_hint: 'Ganztägigi, jährlichi Termine mit Alter und Geburtstags-Icon.', + birthday_notify: 'Erinnerig', + birthday_notify_off: 'Us', + birthday_notify_same_day: 'Am Tag', + birthday_notify_one_day: '1 Tag vorher', + birthday_notify_days: '{n} Täg vorher', + birthday_person: 'Namä', + birthday_person_ph: 'Namä vo de Person', + birthday_date: 'Geburtstag', + birthday_year_unknown: 'Jahr unbekannt', + birthday_target: 'Geburtstagskalender', + birthday_no_calendars: 'Kei Geburtstagskalender vorhandä. Erstell zerscht en Kalender und aktivier „Geburtstagskalender“.', + birthday_created: 'Geburtstag „{name}“ hinzuegfüegt', + birthday_calendar_name: 'Geburtstäg', + birthday_activate: 'Geburtstagskalender aktivierä', + birthday_activate_hint: 'Aktivier de Geburtstagskalender, zum Geburtstäg ahlegä. Er erschiint als eigenä Kalender i de Siteliiste.', + birthday_active: 'Geburtstagskalender aktiv', + birthday_year_ph: 'Jahr', + birthday_settings_title: 'Geburtstäg', + birthday_color_hint: 'Farb und Sichtbarkeit änderisch i de Siteliiste.', + birthday_devices_title: 'Geburtstäg chömed vo dene Grät:', + birthday_devices_count: '{n} Geburtstäg', + birthday_calendar_type: 'Geburtstagskalender', + birthday_add_btn: '+ Geburtstäg', + birthday_calendar_exists: 'Geburtstagskalender existiert scho', + birthday_settings_hint: 'Leg en Geburtstagskalender über „+ Geburtstäg“ obe ah.', + error_name_url: 'Bitte Name und URL ihgä', + ical_subscribed: '"{name}" abonniert', + google_synced: 'Kalender synchronisiert', + confirm_google_disconnect: 'Google-Konto würkli trennä?', + google_disconnected: 'Google-Konto trännt', + error_username_password: 'Benutzernamä und Passwort erforderlich', + user_created: 'Benutzer "{name}" erstellt', + settings_saved: 'Istellige gespeichert', + no_caldav: 'Kei CalDAV-Kontene verbunden.', + profile_saved: 'Profil gspeichert', + avatar_removed: 'Profilbild entfernt', + avatar_uploaded: 'Profilbild ufeglade', + error_pw_mismatch: 'Passwörter stimmed nöd überein', + error_pw_length: 'Mindeschtens 6 Zeichä', + password_changed: 'Passwort gändert', + key_copied: 'Schlüssel kopiert', + error_enter_6digit: 'Bitte 6-stelligä Code igäh', + totp_enabled: '2FA aktiviert', totp_disabled: '2FA deaktiviert', + error_enter_password: 'Bitte Passwort igäh', + confirm_delete_user: 'Benutzer löschä?', + show_cal: 'Ihblendä', hide_cal: 'Usblendeä', + remove_cal: 'Kalender entfernen', remove_ical_sub: 'Abo entfernä', + change_color: 'Farb änderä', + sync: 'Sync', disconnect: 'Trennä', + + // Calendar / date + months: ['Januar','Februar','März','April','Mai','Juni','Juli','Auguscht','Septämber','Oktober','Novämber','Dezämber'], + months_short: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'], + days_long: ['Sunntig','Mäntig','Ziistig','Mittwuch','Dunnstig','Friitig','Samstig'], + dow_monday: ['Mo','Di','Mi','Do','Fr','Sa','So'], + dow_sunday: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dow_index: ['So','Mo','Di','Mi','Do','Fr','Sa'], + week_abbr: 'KW', + allday: 'ganztägig', allday_cap: 'Ganztägig', + no_events: 'Kei Termine im ahzeigte Ziitruum', + more_events: '+{n} wiiteri', + + // Color picker + color_select: 'Auswähle', }, en: { @@ -788,38 +1179,2837 @@ const translations = { // Color picker color_select: 'Select', + }, - // Locale for time formatting - locale: 'en', + fr: { + // Common + save: 'Enregistrer', cancel: 'Annuler', close: 'Fermer', + create: 'Créer', delete: 'Supprimer', edit: 'Modifier', + name: 'Nom', username: 'Nom d’utilisateur', password: 'Mot de passe', + email: 'E-mail', color: 'Couleur', color_pick: 'Choisir une couleur', + loading: 'Chargement…', connecting: 'Connexion…', + unknown_error: 'Erreur inconnue', + + // Setup + setup_title: 'Configuration initiale', + setup_subtitle: 'Créez le compte administrateur', + setup_email: 'E-mail (facultatif)', + setup_pw_confirm: 'Confirmer le mot de passe', + setup_submit: 'Créer le compte admin', + setup_pw_mismatch: 'Les mots de passe ne correspondent pas', + setup_pw_short: 'Le mot de passe doit contenir au moins 6 caractères', + + // Login + login_tagline: 'l’agenda minimaliste', + login_submit: 'Se connecter', + login_2fa_ph: 'Code à 6 chiffres', + + // Topbar + btn_today: 'Aujourd’hui', + view_month: 'Mois', view_week: 'Semaine', view_day: 'Jour', view_quarter: 'Trimestre', view_agenda: 'Événements', + btn_profile: 'Profil', btn_logout: 'Se déconnecter', + + // Sidebar + btn_create: 'Créer', + my_calendars: 'Mes agendas', + add_calendar: 'Ajouter un agenda', + cal_local: 'Agenda local', cal_caldav: 'Compte CalDAV', + cal_ical: 'S’abonner à une URL iCal', cal_google: 'Google Agenda', + + // Event modal + event_create_title: 'Créer un événement', event_edit_title: 'Modifier l’événement', + event_title_ph: 'Ajouter un titre', event_allday: 'Toute la journée', + event_start: 'Début', event_end: 'Fin', event_calendar: 'Agenda', + event_location: 'Lieu', event_location_ph: 'Ajouter un lieu', + event_description: 'Description', event_description_ph: 'Ajouter une description', + + // CalDAV modal + caldav_add_title: 'Ajouter un compte CalDAV', + caldav_display_name: 'Nom affiché', caldav_display_name_ph: 'p. ex. Mon Nextcloud', + caldav_url: 'URL CalDAV', caldav_connect: 'Connecter', + + // Local calendar modal + localcal_create_title: 'Créer un agenda local', + localcal_name_ph: 'p. ex. Personnel', + + // iCal modal + ical_title: 'S’abonner à une URL iCal', ical_name_ph: 'p. ex. Jours fériés', + ical_url_label: 'URL iCal', ical_refresh: 'Fréquence d’actualisation', + ical_15min: 'Toutes les 15 minutes', ical_30min: 'Toutes les 30 minutes', + ical_hourly: 'Toutes les heures', ical_6h: 'Toutes les 6 heures', ical_daily: 'Tous les jours', + ical_subscribe: 'S’abonner', + + // Settings + settings_title: 'Paramètres', + settings_nav_appearance: 'Apparence', + settings_nav_profile: 'Profil', + settings_nav_view: 'Affichage', + settings_nav_calendars: 'Agendas', + settings_nav_google: 'Comptes Google', + settings_nav_users: 'Gestion des utilisateurs', + settings_nav_admin: 'Admin', + admin_default_theme: 'Thème par défaut', + admin_default_theme_desc: 'S’applique à tous les utilisateurs qui n’ont pas défini leur propre couleur. « Réinitialiser » sur une couleur revient à ce thème.', + admin_theme_save: 'Enregistrer par défaut', + admin_theme_import: 'Importer un thème', + admin_theme_imported: '{count} couleurs importées – enregistrez pour appliquer', + admin_theme_discard: 'Abandonner', + admin_theme_saved: 'Thème par défaut enregistré', + admin_logo_dims: 'PNG/JPEG/WebP · affiché en 150 × 40 px max.', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (carré)', + admin_branding: 'Personnalisation', + admin_branding_desc: 'Logo personnalisé (en haut à gauche) et favicon pour toute l’instance. PNG/JPEG/WebP, 5 Mo max.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Téléverser', + admin_remove: 'Supprimer', + admin_brand_default: 'Par défaut', + admin_branding_saved: 'Personnalisation enregistrée', + admin_branding_removed: 'Personnalisation supprimée', + settings_sync_all: 'Tout synchroniser', + settings_sync_all_desc: 'Partager ces paramètres entre vos appareils', + settings_sync_this: 'Synchroniser entre les appareils', + settings_share_icon: 'Icône de partage', + settings_colors: 'Couleurs', + settings_primary_color: 'Couleur principale', settings_accent_color: 'Couleur d’accent', + settings_today_color: 'Couleur du jour', + settings_month_divider_color: 'Ligne de séparation des mois', + settings_month_label_color: 'Couleur du libellé de mois', + settings_text_color: 'Couleur du texte', + settings_line_color: 'Couleur des lignes', + settings_bg_color: 'Couleur d’arrière-plan', + settings_surface_color: 'Couleur de la barre latérale / surface', + settings_hover_highlight_color: 'Surbrillance au survol (boutons, menus)', + settings_icon_inactive_color: 'Icônes latérales inactives (au repos)', + settings_icon_active_color: 'Icônes latérales actives (survol/activé)', + settings_day_hover_color: 'Survol d’un jour', + settings_day_selected_color: 'Jour sélectionné', + settings_day_bg_color: 'Arrière-plan du jour', + settings_today_bg_color: 'Arrière-plan d’aujourd’hui', + theme_export: 'Exporter le thème', + theme_import: 'Importer un thème', + theme_imported: 'Thème importé – enregistrez pour appliquer', + theme_imported_saved: '{count} paramètres importés et enregistrés', + theme_import_invalid: 'Fichier de thème invalide', + theme_docs_hint: 'Explication des paramètres de thème', + theme_unknown_title: 'Paramètres inconnus', + theme_unknown_params: 'Ce fichier de thème contient {count} paramètres que cette version ne connaît pas ({names}). Importer le reste quand même ?', + theme_import_rest: 'Importer le reste', + confirm_generic_title: 'Confirmer', + confirm: 'OK', + confirm_delete_cal_title: 'Supprimer l’agenda', + confirm_remove_ical_title: 'Retirer l’abonnement', + confirm_ha_disconnect: 'Vraiment déconnecter le compte Home Assistant ?', + reset: 'Réinitialiser', + settings_text_contrast: 'Contraste du texte', + settings_text_contrast_desc: 'Luminosité des libellés et des textes', + contrast_dark: 'Sombre', contrast_medium: 'Moyen', + contrast_light: 'Clair', contrast_max: 'Maximum', + settings_line_contrast: 'Contraste des lignes', + settings_line_contrast_desc: 'Visibilité des bordures et séparateurs', + line_barely: 'À peine', line_subtle: 'Subtil', + line_normal: 'Normal', line_strong: 'Fort', + settings_calendar_view: 'Vue de l’agenda', + settings_default_view: 'Vue par défaut', + settings_week_start: 'Premier jour de la semaine', + week_start_monday: 'Lundi', week_start_sunday: 'Dimanche', + settings_dim_past: 'Atténuer les événements passés', + settings_month_mode: 'Changement de mois', + settings_month_mode_scroll: 'Défilement continu (semaine)', + settings_month_mode_paged: 'Page par page (mois)', + settings_default_duration: 'Durée par défaut d’un événement', + settings_privacy: 'Confidentialité', + settings_private_visibility: 'Événements privés pour les membres du groupe', + settings_private_visibility_desc: 'Comment vos événements privés apparaissent aux autres membres du groupe', + settings_directory_hidden: 'Masquer mon profil (ne pas m’afficher dans les sélecteurs de partage/groupe)', + settings_directory_hidden_desc: 'Les autres utilisateurs ne pourront alors plus vous choisir pour partager des agendas ni vous ajouter à des groupes. Vous restez visible dans la gestion des utilisateurs.', + private_visibility_busy: 'Afficher comme « Occupé »', + private_visibility_hidden: 'Masquer complètement', + created_by: 'Créé par : {name}', + event_private: 'Privé', + reminders: 'Rappels', + reminder_add: 'Ajouter un rappel', + reminder_at_start: 'À l’heure de début', + reminder_minutes: '{n} minutes avant', + reminder_hour_one: '1 heure avant', + reminder_hours: '{n} heures avant', + reminder_day_one: '1 jour avant', + reminder_days: '{n} jours avant', + reminder_week_one: '1 semaine avant', + reminder_weeks: '{n} semaines avant', + reminder_custom: 'Personnalisé…', + reminder_unit_minutes: 'minutes', + reminder_unit_hours: 'heures', + reminder_unit_days: 'jours', + reminder_unit_weeks: 'semaines', + reminder_before: 'avant', + reminders_calendar_off: 'Les rappels sont désactivés pour cet agenda – ils ne se déclencheront pas.', + calendar_reminders_on: 'Rappels activés', + calendar_reminders_off: 'Rappels désactivés', + copy: 'Copier', + caldav_publish: 'Publier via CalDAV', + caldav_unpublish: 'Dépublier CalDAV', + caldav_published_url: 'URL CalDAV (sans connexion) :', + caldav_url_copied: 'URL CalDAV copiée', + caldav_token_rotate: 'Régénérer le jeton', + caldav_token_rotated: 'Nouveau jeton généré – les abonnements existants doivent être recréés', + caldav_rotate_confirm: 'Générer un nouveau jeton ? L’URL actuelle cessera de fonctionner et les abonnements existants devront être recréés avec la nouvelle URL.', + caldav_hint: 'Toute personne disposant de cette URL peut s’abonner à cet agenda et le modifier — aucune connexion requise. À ajouter dans un client compatible CalDAV (Apple Calendrier, Thunderbird, DAVx5).', + caldav_login_url: 'URL CalDAV (avec connexion) :', + caldav_login_hint: 'Vous pouvez aussi ajouter un « compte CalDAV » dans votre client avec cette URL de serveur, votre nom d’utilisateur et un mot de passe d’application — tous vos agendas publiés seront détectés.', + app_pw_title: 'Mots de passe d’application (CalDAV)', + app_pw_desc: 'Mots de passe dédiés aux clients CalDAV. Nécessaires lorsque la 2FA est active, car les applications ne peuvent pas saisir de code 2FA. Révocables à tout moment.', + app_pw_label_ph: 'Nom (p. ex. iPhone)', + app_pw_create: 'Créer', + app_pw_new_label: 'Nouveau mot de passe d’application (visible uniquement maintenant) :', + app_pw_last_used: 'dernière utilisation', + app_pw_never_used: 'jamais utilisé', + app_pw_revoke: 'Révoquer', + app_pw_none: 'Aucun mot de passe d’application.', + app_pw_copied: 'Mot de passe d’application copié', + app_pw_revoke_confirm: 'Révoquer ce mot de passe d’application ? Les clients qui l’utilisent perdront l’accès.', + share: 'Partager', + import: 'Importer', + export: 'Exporter', + importing: 'Importation…', + import_result: '{imported} importés, {skipped} ignorés', + shared_by: 'partagé par {name}', + share_title: 'Partager l’agenda', + share_current: 'Partages actuels', + share_add: 'Ajouter un utilisateur', + share_search: 'Rechercher des utilisateurs…', + share_none: 'Pas encore partagé', + share_no_users: 'Aucun utilisateur trouvé', + perm_read: 'Lecture seule', + perm_read_write: 'Lecture et écriture', + remove: 'Retirer', + done: 'Terminé', + groups_title: 'Groupes', + groups_none: 'Aucun groupe', + group_create: 'Créer un groupe', + group_manage: 'Gérer le groupe', + group_name: 'Nom', + group_name_ph: 'Nom du groupe', + group_members: 'Membres', + group_delete: 'Supprimer le groupe', + group_delete_confirm: 'Vraiment supprimer ce groupe et son agenda de groupe ?', + group_deleted: 'Groupe supprimé', + group_saved: 'Groupe enregistré', + group_created: 'Groupe créé', + group_view_label: 'Vue de groupe : {name}', + group_exit: 'Quitter la vue de groupe', + group_calendar: 'Agenda de groupe', + group_icon: 'Icône', + group_visible_flag: 'Visible pour vos groupes', + group_new_event: '+ Événement de groupe', + group_member_colors: 'Couleurs des membres', + only_owner_color: 'Seul le propriétaire peut changer la couleur', + upload_too_large: 'Fichier trop volumineux (limite du serveur). Veuillez augmenter la limite de téléversement.', + shared_with_me: 'Partagé avec moi', + settings_calendars: 'Agendas', + settings_group_visible: 'Agenda visible par les groupes', + settings_group_visible_desc: 'Choisissez lequel de vos agendas les membres de vos groupes peuvent voir', + group_visible_none: 'Aucun', + drag_reorder: 'Glisser pour réordonner', + profile_account: 'Compte', + profile_display_name: 'Nom affiché', + profile_display_name_ph: 'Nom affiché', + profile_login_name: 'Identifiant', + profile_login_name_desc: 'En minuscules, sert à se connecter. Insensible à la casse.', + settings_hour_height: 'Hauteur d’une heure (vues semaine et jour)', + settings_hour_height_desc: 'Espace occupé par une heure dans la grille horaire', + hour_compact: 'Compact', hour_normal: 'Normal', + hour_comfort: 'Confort', hour_large: 'Grand', + settings_language: 'Langue', + settings_hidden_cals: 'Agendas masqués', + settings_no_hidden_cals: 'Aucun agenda masqué', + settings_no_google: 'Aucun compte Google connecté', + settings_nav_accounts: 'Comptes', + settings_accounts_caldav: 'Comptes CalDAV', + settings_accounts_local: 'Agendas locaux', + settings_accounts_ical: 'Abonnements iCal', + settings_accounts_google: 'Comptes Google', + settings_no_caldav_accounts: 'Aucun compte CalDAV', + settings_no_local_cals: 'Aucun agenda local', + settings_no_ical_subs: 'Aucun abonnement', + settings_no_google_accounts: 'Aucun compte Google', + confirm_caldav_disconnect: 'Vraiment déconnecter le compte CalDAV ?', + caldav_disconnected: 'Compte CalDAV déconnecté', + + // User management + users_add: 'Ajouter un utilisateur', users_is_admin: 'Administrateur', + users_make_admin: 'Nommer admin', users_revoke_admin: 'Retirer les droits admin', + + // Profile + profile_title: 'Profil', profile_upload: 'Téléverser une image', + profile_remove_avatar: 'Supprimer', + profile_email_ph: 'Aucun e-mail défini', + profile_change_pw: 'Changer le mot de passe', + profile_pw_current: 'Mot de passe actuel', profile_pw_new: 'Nouveau mot de passe', + profile_pw_confirm: 'Confirmer le nouveau mot de passe', + profile_2fa: 'Authentification à deux facteurs', + profile_2fa_disabled_text: 'La 2FA est désactivée. Protégez votre compte avec une application d’authentification.', + profile_2fa_setup: 'Configurer la 2FA', + profile_2fa_scan: 'Scannez le code QR avec votre application d’authentification (p. ex. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Ou saisissez cette clé manuellement', + profile_2fa_copy: 'Copier', profile_2fa_code_label: 'Saisissez le code de vérification', + profile_2fa_ph: 'Code à 6 chiffres', profile_2fa_activate: 'Activer', + profile_2fa_enabled_text: 'La 2FA est activée.', + profile_2fa_pw_disable: 'Mot de passe pour désactiver', + profile_2fa_disable: 'Désactiver la 2FA', + profile_my_calendars: 'Mes agendas', + + // Avatar crop + crop_title: 'Recadrer l’image', crop_submit: 'Recadrer et téléverser', + + // Impressum + impressum_title: 'Mentions légales', + impressum_desc: 'Logiciel et développement web', + impressum_about: 'Ce logiciel a été développé et mis à disposition par Scarriffleservices avec le plus grand soin. Tous droits réservés © 2026 Scarriffleservices.', + impressum_data_title: 'Stockage des données', + impressum_data_text: 'Toutes les données de l’application sont stockées et traitées sur le serveur qui héberge cette instance Calendarr. Le lieu de stockage dépend donc de l’exploitant de ce serveur. Lors de l’utilisation de l’intégration Google Agenda, des données sont échangées via l’API Google ; la politique de confidentialité de Google s’applique à ces données. Lors de l’utilisation de l’intégration Home Assistant, des données sont échangées avec l’instance Home Assistant concernée. Home Assistant est un projet de l’Open Home Foundation.', + impressum_disclaimer_title: 'Clause de non-responsabilité', + impressum_disclaimer_text: 'Malgré un soin attentif, aucune responsabilité n’est assumée quant à l’exactitude, l’exhaustivité ou l’actualité des contenus fournis. L’utilisation se fait à vos propres risques.', + impressum_contact: 'Contact', + + // Toast / confirms + error_load_events: 'Erreur lors du chargement des événements', + error_no_calendars: 'Aucun agenda', + confirm_delete_local_cal: 'Vraiment supprimer l’agenda local ?', + confirm_remove_ical: 'Vraiment retirer l’abonnement ?', + google_not_configured: 'Google OAuth n’est pas configuré (l’admin doit définir GOOGLE_CLIENT_ID/SECRET)', + error_enter_title: 'Veuillez saisir un titre', + error_enter_date: 'Veuillez saisir une date', + error_enter_start: 'Veuillez saisir une heure de début', + error_end_before_start: 'La fin ne peut pas précéder le début', + ctx_create_event: 'Créer un nouvel événement', + event_readonly: 'Les événements abonnés ne peuvent pas être modifiés', + ha_create_not_supported: 'Impossible de créer des événements directement dans les agendas Home Assistant', + rec_label: 'Récurrence', + rec_none: 'Aucune', rec_daily: 'Quotidienne', rec_weekly: 'Hebdomadaire', + rec_monthly: 'Mensuelle', rec_yearly: 'Annuelle', rec_custom: 'Personnalisée…', + rec_every: 'Tous les', rec_days: 'jours', rec_weeks: 'semaines', rec_months: 'mois', + rec_ends: 'Fin', rec_never: 'Jamais', rec_after_count: 'Après un nombre', + rec_on_date: 'À une date', rec_occurrences: 'occurrences', + copy_to_calendar: 'Copier vers…', event_copied: 'Événement copié', + edit_before_copy: 'Modifier avant de copier', + event_updated: 'Événement mis à jour', event_created: 'Événement créé', + confirm_delete_event: 'Vraiment supprimer « {title} » ?', + confirm_delete_title: 'Supprimer l’événement', + delete_single: 'Seulement cette occurrence', + delete_all_series: 'Tous les événements de la série', + event_deleted: 'Événement supprimé', + error_fill_all: 'Veuillez remplir tous les champs', + account_added: 'Compte « {name} » ajouté', + error_enter_name: 'Veuillez saisir un nom', + calendar_created: 'Agenda « {name} » créé', + // Birthdays + create_event_option: 'Nouvel événement', + birthday_new: 'Nouvel anniversaire', + birthday_modal_title: 'Ajouter un anniversaire', + birthday_calendar: 'Agenda des anniversaires', + birthday_calendar_hint: 'Événements annuels sur toute la journée, avec l’âge et une icône d’anniversaire.', + birthday_notify: 'Rappel', + birthday_notify_off: 'Désactivé', + birthday_notify_same_day: 'Le jour même', + birthday_notify_one_day: '1 jour avant', + birthday_notify_days: '{n} jours avant', + birthday_person: 'Nom', + birthday_person_ph: 'Nom de la personne', + birthday_date: 'Anniversaire', + birthday_year_unknown: 'Année inconnue', + birthday_target: 'Agenda des anniversaires', + birthday_no_calendars: 'Aucun agenda d’anniversaires. Créez d’abord un agenda et activez « Agenda des anniversaires ».', + birthday_created: 'Anniversaire « {name} » ajouté', + birthday_calendar_name: 'Anniversaires', + birthday_activate: 'Activer l’agenda des anniversaires', + birthday_activate_hint: 'Activez l’agenda des anniversaires pour en ajouter. Il apparaît comme un agenda distinct dans la barre latérale.', + birthday_active: 'Agenda des anniversaires actif', + birthday_year_ph: 'Année', + birthday_settings_title: 'Anniversaires', + birthday_color_hint: 'La couleur et la visibilité se modifient dans la barre latérale.', + birthday_devices_title: 'Les anniversaires proviennent de ces appareils :', + birthday_devices_count: '{n} anniversaires', + birthday_calendar_type: 'Agenda des anniversaires', + birthday_add_btn: '+ Anniversaires', + birthday_calendar_exists: 'L’agenda des anniversaires existe déjà', + birthday_settings_hint: 'Ajoutez un agenda des anniversaires via « + Anniversaires » ci-dessus.', + error_name_url: 'Veuillez saisir un nom et une URL', + ical_subscribed: 'Abonnement à « {name} » effectué', + google_synced: 'Agenda synchronisé', + confirm_google_disconnect: 'Vraiment déconnecter le compte Google ?', + google_disconnected: 'Compte Google déconnecté', + error_username_password: 'Nom d’utilisateur et mot de passe requis', + user_created: 'Utilisateur « {name} » créé', + settings_saved: 'Paramètres enregistrés', + no_caldav: 'Aucun compte CalDAV connecté.', + profile_saved: 'Profil enregistré', + avatar_removed: 'Photo de profil supprimée', + avatar_uploaded: 'Photo de profil téléversée', + error_pw_mismatch: 'Les mots de passe ne correspondent pas', + error_pw_length: 'Au moins 6 caractères requis', + password_changed: 'Mot de passe modifié', + key_copied: 'Clé copiée', + error_enter_6digit: 'Veuillez saisir un code à 6 chiffres', + totp_enabled: '2FA activée', totp_disabled: '2FA désactivée', + error_enter_password: 'Veuillez saisir votre mot de passe', + confirm_delete_user: 'Supprimer l’utilisateur ?', + show_cal: 'Afficher', hide_cal: 'Masquer', + remove_cal: 'Retirer l’agenda', remove_ical_sub: 'Retirer l’abonnement', + change_color: 'Changer la couleur', + sync: 'Sync', disconnect: 'Déconnecter', + + // Calendar / date + months: ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'], + months_short: ['janv.','févr.','mars','avr.','mai','juin','juil.','août','sept.','oct.','nov.','déc.'], + days_long: ['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'], + dow_monday: ['lun','mar','mer','jeu','ven','sam','dim'], + dow_sunday: ['dim','lun','mar','mer','jeu','ven','sam'], + dow_index: ['dim','lun','mar','mer','jeu','ven','sam'], + week_abbr: 'sem.', + allday: 'toute la journée', allday_cap: 'Toute la journée', + no_events: 'Aucun événement sur la période affichée', + more_events: '+{n} de plus', + + // Color picker + color_select: 'Sélectionner', + }, + + it: { + // Common + save: 'Salva', cancel: 'Annulla', close: 'Chiudi', + create: 'Crea', delete: 'Elimina', edit: 'Modifica', + name: 'Nome', username: 'Nome utente', password: 'Password', + email: 'E-mail', color: 'Colore', color_pick: 'Scegli colore', + loading: 'Caricamento…', connecting: 'Connessione…', + unknown_error: 'Errore sconosciuto', + + // Setup + setup_title: 'Configurazione iniziale', + setup_subtitle: 'Crea l’account amministratore', + setup_email: 'E-mail (facoltativa)', + setup_pw_confirm: 'Conferma password', + setup_submit: 'Crea account admin', + setup_pw_mismatch: 'Le password non coincidono', + setup_pw_short: 'La password deve contenere almeno 6 caratteri', + + // Login + login_tagline: 'il calendario minimalista', + login_submit: 'Accedi', + login_2fa_ph: 'Codice a 6 cifre', + + // Topbar + btn_today: 'Oggi', + view_month: 'Mese', view_week: 'Settimana', view_day: 'Giorno', view_quarter: 'Trimestre', view_agenda: 'Eventi', + btn_profile: 'Profilo', btn_logout: 'Esci', + + // Sidebar + btn_create: 'Crea', + my_calendars: 'I miei calendari', + add_calendar: 'Aggiungi calendario', + cal_local: 'Calendario locale', cal_caldav: 'Account CalDAV', + cal_ical: 'Iscriviti a un URL iCal', cal_google: 'Google Calendar', + + // Event modal + event_create_title: 'Crea evento', event_edit_title: 'Modifica evento', + event_title_ph: 'Aggiungi titolo', event_allday: 'Tutto il giorno', + event_start: 'Inizio', event_end: 'Fine', event_calendar: 'Calendario', + event_location: 'Luogo', event_location_ph: 'Aggiungi luogo', + event_description: 'Descrizione', event_description_ph: 'Aggiungi descrizione', + + // CalDAV modal + caldav_add_title: 'Aggiungi account CalDAV', + caldav_display_name: 'Nome visualizzato', caldav_display_name_ph: 'es. Il mio Nextcloud', + caldav_url: 'URL CalDAV', caldav_connect: 'Connetti', + + // Local calendar modal + localcal_create_title: 'Crea calendario locale', + localcal_name_ph: 'es. Personale', + + // iCal modal + ical_title: 'Iscriviti a un URL iCal', ical_name_ph: 'es. Festività', + ical_url_label: 'URL iCal', ical_refresh: 'Frequenza di aggiornamento', + ical_15min: 'Ogni 15 minuti', ical_30min: 'Ogni 30 minuti', + ical_hourly: 'Ogni ora', ical_6h: 'Ogni 6 ore', ical_daily: 'Ogni giorno', + ical_subscribe: 'Iscriviti', + + // Settings + settings_title: 'Impostazioni', + settings_nav_appearance: 'Aspetto', + settings_nav_profile: 'Profilo', + settings_nav_view: 'Visualizzazione', + settings_nav_calendars: 'Calendari', + settings_nav_google: 'Account Google', + settings_nav_users: 'Gestione utenti', + settings_nav_admin: 'Admin', + admin_default_theme: 'Tema predefinito', + admin_default_theme_desc: 'Vale per tutti gli utenti senza un colore proprio. «Reimposta» su un colore riporta a questo tema.', + admin_theme_save: 'Salva predefinito', + admin_theme_import: 'Importa tema', + admin_theme_imported: '{count} colori importati – salva per applicare', + admin_theme_discard: 'Scarta', + admin_theme_saved: 'Tema predefinito salvato', + admin_logo_dims: 'PNG/JPEG/WebP · visualizzato max 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (quadrato)', + admin_branding: 'Branding', + admin_branding_desc: 'Logo personalizzato (in alto a sinistra) e favicon per l’intera istanza. PNG/JPEG/WebP, max 5 MB.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Carica', + admin_remove: 'Rimuovi', + admin_brand_default: 'Predefinito', + admin_branding_saved: 'Branding salvato', + admin_branding_removed: 'Branding rimosso', + settings_sync_all: 'Sincronizza tutto', + settings_sync_all_desc: 'Condividi queste impostazioni tra i tuoi dispositivi', + settings_sync_this: 'Sincronizza tra dispositivi', + settings_share_icon: 'Icona di condivisione', + settings_colors: 'Colori', + settings_primary_color: 'Colore primario', settings_accent_color: 'Colore d’accento', + settings_today_color: 'Colore di oggi', + settings_month_divider_color: 'Linea di separazione dei mesi', + settings_month_label_color: 'Colore etichetta mese', + settings_text_color: 'Colore del testo', + settings_line_color: 'Colore delle linee', + settings_bg_color: 'Colore di sfondo', + settings_surface_color: 'Colore barra laterale / superficie', + settings_hover_highlight_color: 'Evidenziazione al passaggio (pulsanti, menu)', + settings_icon_inactive_color: 'Icone laterali inattive (a riposo)', + settings_icon_active_color: 'Icone laterali attive (hover/on)', + settings_day_hover_color: 'Giorno del calendario al passaggio', + settings_day_selected_color: 'Giorno selezionato', + settings_day_bg_color: 'Sfondo del giorno', + settings_today_bg_color: 'Sfondo di oggi', + theme_export: 'Esporta tema', + theme_import: 'Importa tema', + theme_imported: 'Tema importato – salva per applicare', + theme_imported_saved: '{count} parametri importati e salvati', + theme_import_invalid: 'File del tema non valido', + theme_docs_hint: 'Spiegazione dei parametri del tema', + theme_unknown_title: 'Parametri sconosciuti', + theme_unknown_params: 'Questo file del tema contiene {count} parametri che questa versione non conosce ({names}). Importare comunque il resto?', + theme_import_rest: 'Importa il resto', + confirm_generic_title: 'Conferma', + confirm: 'OK', + confirm_delete_cal_title: 'Elimina calendario', + confirm_remove_ical_title: 'Rimuovi iscrizione', + confirm_ha_disconnect: 'Disconnettere davvero l’account Home Assistant?', + reset: 'Reimposta', + settings_text_contrast: 'Contrasto del testo', + settings_text_contrast_desc: 'Luminosità di etichette e testi', + contrast_dark: 'Scuro', contrast_medium: 'Medio', + contrast_light: 'Chiaro', contrast_max: 'Massimo', + settings_line_contrast: 'Contrasto delle linee', + settings_line_contrast_desc: 'Visibilità di bordi e separatori', + line_barely: 'Appena', line_subtle: 'Sottile', + line_normal: 'Normale', line_strong: 'Forte', + settings_calendar_view: 'Vista calendario', + settings_default_view: 'Vista predefinita', + settings_week_start: 'Primo giorno della settimana', + week_start_monday: 'Lunedì', week_start_sunday: 'Domenica', + settings_dim_past: 'Attenua gli eventi passati', + settings_month_mode: 'Cambio mese', + settings_month_mode_scroll: 'Scorrimento continuo (settimana)', + settings_month_mode_paged: 'Pagina per pagina (mese)', + settings_default_duration: 'Durata predefinita dell’evento', + settings_privacy: 'Privacy', + settings_private_visibility: 'Eventi privati per i membri del gruppo', + settings_private_visibility_desc: 'Come appaiono i tuoi eventi privati agli altri membri del gruppo', + settings_directory_hidden: 'Nascondi il mio profilo (non mostrarmi nei selettori di condivisione/gruppo)', + settings_directory_hidden_desc: 'Gli altri utenti non potranno più selezionarti per condividere calendari né aggiungerti ai gruppi. Rimani visibile nella gestione utenti dell’admin.', + private_visibility_busy: 'Mostra come «Occupato»', + private_visibility_hidden: 'Nascondi completamente', + created_by: 'Creato da: {name}', + event_private: 'Privato', + reminders: 'Promemoria', + reminder_add: 'Aggiungi promemoria', + reminder_at_start: 'All’ora di inizio', + reminder_minutes: '{n} minuti prima', + reminder_hour_one: '1 ora prima', + reminder_hours: '{n} ore prima', + reminder_day_one: '1 giorno prima', + reminder_days: '{n} giorni prima', + reminder_week_one: '1 settimana prima', + reminder_weeks: '{n} settimane prima', + reminder_custom: 'Personalizzato…', + reminder_unit_minutes: 'minuti', + reminder_unit_hours: 'ore', + reminder_unit_days: 'giorni', + reminder_unit_weeks: 'settimane', + reminder_before: 'prima', + reminders_calendar_off: 'I promemoria sono disattivati per questo calendario – non verranno attivati.', + calendar_reminders_on: 'Promemoria attivati', + calendar_reminders_off: 'Promemoria disattivati', + copy: 'Copia', + caldav_publish: 'Pubblica via CalDAV', + caldav_unpublish: 'Annulla pubblicazione CalDAV', + caldav_published_url: 'URL CalDAV (senza login):', + caldav_url_copied: 'URL CalDAV copiato', + caldav_token_rotate: 'Rigenera token', + caldav_token_rotated: 'Nuovo token generato – le iscrizioni esistenti vanno ricreate', + caldav_rotate_confirm: 'Generare un nuovo token? L’URL attuale smetterà di funzionare e le iscrizioni esistenti dovranno essere ricreate con il nuovo URL.', + caldav_hint: 'Chiunque abbia questo URL può iscriversi a questo calendario e modificarlo — nessun login richiesto. Aggiungilo in un client compatibile CalDAV (Calendario Apple, Thunderbird, DAVx5).', + caldav_login_url: 'URL CalDAV (con login):', + caldav_login_hint: 'In alternativa aggiungi un «account CalDAV» nel tuo client con questo URL del server, il tuo nome utente e una password per app — verranno rilevati tutti i tuoi calendari pubblicati.', + app_pw_title: 'Password per app (CalDAV)', + app_pw_desc: 'Password dedicate ai client CalDAV. Necessarie con la 2FA attiva, poiché le app non possono inserire un codice 2FA. Revocabili in qualsiasi momento.', + app_pw_label_ph: 'Nome (es. iPhone)', + app_pw_create: 'Crea', + app_pw_new_label: 'Nuova password per app (visibile solo ora):', + app_pw_last_used: 'ultimo utilizzo', + app_pw_never_used: 'mai usata', + app_pw_revoke: 'Revoca', + app_pw_none: 'Nessuna password per app.', + app_pw_copied: 'Password per app copiata', + app_pw_revoke_confirm: 'Revocare questa password per app? I client che la usano perderanno l’accesso.', + share: 'Condividi', + import: 'Importa', + export: 'Esporta', + importing: 'Importazione…', + import_result: '{imported} importati, {skipped} saltati', + shared_by: 'condiviso da {name}', + share_title: 'Condividi calendario', + share_current: 'Condivisioni attuali', + share_add: 'Aggiungi utente', + share_search: 'Cerca utenti…', + share_none: 'Non ancora condiviso', + share_no_users: 'Nessun utente trovato', + perm_read: 'Sola lettura', + perm_read_write: 'Lettura e scrittura', + remove: 'Rimuovi', + done: 'Fatto', + groups_title: 'Gruppi', + groups_none: 'Nessun gruppo', + group_create: 'Crea gruppo', + group_manage: 'Gestisci gruppo', + group_name: 'Nome', + group_name_ph: 'Nome del gruppo', + group_members: 'Membri', + group_delete: 'Elimina gruppo', + group_delete_confirm: 'Eliminare davvero questo gruppo e il suo calendario di gruppo?', + group_deleted: 'Gruppo eliminato', + group_saved: 'Gruppo salvato', + group_created: 'Gruppo creato', + group_view_label: 'Vista gruppo: {name}', + group_exit: 'Esci dalla vista gruppo', + group_calendar: 'Calendario di gruppo', + group_icon: 'Icona', + group_visible_flag: 'Visibile ai tuoi gruppi', + group_new_event: '+ Evento di gruppo', + group_member_colors: 'Colori dei membri', + only_owner_color: 'Solo il proprietario può cambiare il colore', + upload_too_large: 'File troppo grande (limite del server). Aumenta il limite di caricamento.', + shared_with_me: 'Condivisi con me', + settings_calendars: 'Calendari', + settings_group_visible: 'Calendario visibile ai gruppi', + settings_group_visible_desc: 'Scegli quale dei tuoi calendari possono vedere i membri dei tuoi gruppi', + group_visible_none: 'Nessuno', + drag_reorder: 'Trascina per riordinare', + profile_account: 'Account', + profile_display_name: 'Nome visualizzato', + profile_display_name_ph: 'Nome visualizzato', + profile_login_name: 'Nome di accesso', + profile_login_name_desc: 'In minuscolo, serve per accedere. Non fa distinzione tra maiuscole e minuscole.', + settings_hour_height: 'Altezza dell’ora (viste settimana e giorno)', + settings_hour_height_desc: 'Quanto spazio occupa un’ora nella griglia oraria', + hour_compact: 'Compatta', hour_normal: 'Normale', + hour_comfort: 'Comoda', hour_large: 'Grande', + settings_language: 'Lingua', + settings_hidden_cals: 'Calendari nascosti', + settings_no_hidden_cals: 'Nessun calendario nascosto', + settings_no_google: 'Nessun account Google collegato', + settings_nav_accounts: 'Account', + settings_accounts_caldav: 'Account CalDAV', + settings_accounts_local: 'Calendari locali', + settings_accounts_ical: 'Iscrizioni iCal', + settings_accounts_google: 'Account Google', + settings_no_caldav_accounts: 'Nessun account CalDAV', + settings_no_local_cals: 'Nessun calendario locale', + settings_no_ical_subs: 'Nessuna iscrizione', + settings_no_google_accounts: 'Nessun account Google', + confirm_caldav_disconnect: 'Disconnettere davvero l’account CalDAV?', + caldav_disconnected: 'Account CalDAV disconnesso', + + // User management + users_add: 'Aggiungi utente', users_is_admin: 'Amministratore', + users_make_admin: 'Rendi admin', users_revoke_admin: 'Revoca admin', + + // Profile + profile_title: 'Profilo', profile_upload: 'Carica immagine', + profile_remove_avatar: 'Rimuovi', + profile_email_ph: 'Nessuna e-mail impostata', + profile_change_pw: 'Cambia password', + profile_pw_current: 'Password attuale', profile_pw_new: 'Nuova password', + profile_pw_confirm: 'Conferma nuova password', + profile_2fa: 'Autenticazione a due fattori', + profile_2fa_disabled_text: 'La 2FA è disattivata. Proteggi il tuo account con un’app di autenticazione.', + profile_2fa_setup: 'Configura la 2FA', + profile_2fa_scan: 'Scansiona il codice QR con la tua app di autenticazione (es. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Oppure inserisci questa chiave manualmente', + profile_2fa_copy: 'Copia', profile_2fa_code_label: 'Inserisci il codice di verifica', + profile_2fa_ph: 'Codice a 6 cifre', profile_2fa_activate: 'Attiva', + profile_2fa_enabled_text: 'La 2FA è attiva.', + profile_2fa_pw_disable: 'Password per disattivare', + profile_2fa_disable: 'Disattiva la 2FA', + profile_my_calendars: 'I miei calendari', + + // Avatar crop + crop_title: 'Ritaglia immagine', crop_submit: 'Ritaglia e carica', + + // Impressum + impressum_title: 'Note legali', + impressum_desc: 'Software e sviluppo web', + impressum_about: 'Questo software è stato sviluppato e fornito da Scarriffleservices con la massima cura. Tutti i diritti riservati © 2026 Scarriffleservices.', + impressum_data_title: 'Archiviazione dei dati', + impressum_data_text: 'Tutti i dati dell’applicazione sono archiviati ed elaborati sul server che ospita questa istanza di Calendarr. Il luogo di archiviazione dipende quindi da chi gestisce tale server. Utilizzando l’integrazione con Google Calendar, i dati vengono scambiati tramite l’API di Google; a questi dati si applica l’informativa sulla privacy di Google. Utilizzando l’integrazione con Home Assistant, i dati vengono scambiati con la rispettiva istanza di Home Assistant. Home Assistant è un progetto della Open Home Foundation.', + impressum_disclaimer_title: 'Esclusione di responsabilità', + impressum_disclaimer_text: 'Nonostante la cura nella redazione, non si assume alcuna responsabilità per la correttezza, la completezza o l’attualità dei contenuti forniti. L’utilizzo avviene a proprio rischio.', + impressum_contact: 'Contatto', + + // Toast / confirms + error_load_events: 'Errore nel caricamento degli eventi', + error_no_calendars: 'Nessun calendario', + confirm_delete_local_cal: 'Eliminare davvero il calendario locale?', + confirm_remove_ical: 'Rimuovere davvero l’iscrizione?', + google_not_configured: 'Google OAuth non è configurato (l’admin deve impostare GOOGLE_CLIENT_ID/SECRET)', + error_enter_title: 'Inserisci un titolo', + error_enter_date: 'Inserisci una data', + error_enter_start: 'Inserisci un orario di inizio', + error_end_before_start: 'La fine non può precedere l’inizio', + ctx_create_event: 'Crea nuovo evento', + event_readonly: 'Gli eventi delle iscrizioni non possono essere modificati', + ha_create_not_supported: 'Non è possibile creare eventi direttamente nei calendari di Home Assistant', + rec_label: 'Ricorrenza', + rec_none: 'Nessuna', rec_daily: 'Giornaliera', rec_weekly: 'Settimanale', + rec_monthly: 'Mensile', rec_yearly: 'Annuale', rec_custom: 'Personalizzata…', + rec_every: 'Ogni', rec_days: 'giorni', rec_weeks: 'settimane', rec_months: 'mesi', + rec_ends: 'Termina', rec_never: 'Mai', rec_after_count: 'Dopo un numero', + rec_on_date: 'In data', rec_occurrences: 'occorrenze', + copy_to_calendar: 'Copia in…', event_copied: 'Evento copiato', + edit_before_copy: 'Modifica prima di copiare', + event_updated: 'Evento aggiornato', event_created: 'Evento creato', + confirm_delete_event: 'Eliminare davvero «{title}»?', + confirm_delete_title: 'Elimina evento', + delete_single: 'Solo questa occorrenza', + delete_all_series: 'Tutti gli eventi della serie', + event_deleted: 'Evento eliminato', + error_fill_all: 'Compila tutti i campi', + account_added: 'Account «{name}» aggiunto', + error_enter_name: 'Inserisci un nome', + calendar_created: 'Calendario «{name}» creato', + // Birthdays + create_event_option: 'Nuovo evento', + birthday_new: 'Nuovo compleanno', + birthday_modal_title: 'Aggiungi un compleanno', + birthday_calendar: 'Calendario dei compleanni', + birthday_calendar_hint: 'Eventi annuali di tutto il giorno con l’età e un’icona di compleanno.', + birthday_notify: 'Promemoria', + birthday_notify_off: 'Disattivato', + birthday_notify_same_day: 'Il giorno stesso', + birthday_notify_one_day: '1 giorno prima', + birthday_notify_days: '{n} giorni prima', + birthday_person: 'Nome', + birthday_person_ph: 'Nome della persona', + birthday_date: 'Compleanno', + birthday_year_unknown: 'Anno sconosciuto', + birthday_target: 'Calendario dei compleanni', + birthday_no_calendars: 'Nessun calendario dei compleanni. Crea prima un calendario e attiva «Calendario dei compleanni».', + birthday_created: 'Compleanno «{name}» aggiunto', + birthday_calendar_name: 'Compleanni', + birthday_activate: 'Attiva il calendario dei compleanni', + birthday_activate_hint: 'Attiva il calendario dei compleanni per aggiungerne. Appare come calendario a sé nella barra laterale.', + birthday_active: 'Calendario dei compleanni attivo', + birthday_year_ph: 'Anno', + birthday_settings_title: 'Compleanni', + birthday_color_hint: 'Colore e visibilità si modificano nella barra laterale.', + birthday_devices_title: 'I compleanni provengono da questi dispositivi:', + birthday_devices_count: '{n} compleanni', + birthday_calendar_type: 'Calendario dei compleanni', + birthday_add_btn: '+ Compleanni', + birthday_calendar_exists: 'Il calendario dei compleanni esiste già', + birthday_settings_hint: 'Aggiungi un calendario dei compleanni con «+ Compleanni» qui sopra.', + error_name_url: 'Inserisci un nome e un URL', + ical_subscribed: 'Iscrizione a «{name}» effettuata', + google_synced: 'Calendario sincronizzato', + confirm_google_disconnect: 'Disconnettere davvero l’account Google?', + google_disconnected: 'Account Google disconnesso', + error_username_password: 'Nome utente e password obbligatori', + user_created: 'Utente «{name}» creato', + settings_saved: 'Impostazioni salvate', + no_caldav: 'Nessun account CalDAV collegato.', + profile_saved: 'Profilo salvato', + avatar_removed: 'Immagine del profilo rimossa', + avatar_uploaded: 'Immagine del profilo caricata', + error_pw_mismatch: 'Le password non coincidono', + error_pw_length: 'Almeno 6 caratteri', + password_changed: 'Password modificata', + key_copied: 'Chiave copiata', + error_enter_6digit: 'Inserisci un codice a 6 cifre', + totp_enabled: '2FA attivata', totp_disabled: '2FA disattivata', + error_enter_password: 'Inserisci la tua password', + confirm_delete_user: 'Eliminare l’utente?', + show_cal: 'Mostra', hide_cal: 'Nascondi', + remove_cal: 'Rimuovi calendario', remove_ical_sub: 'Rimuovi iscrizione', + change_color: 'Cambia colore', + sync: 'Sync', disconnect: 'Disconnetti', + + // Calendar / date + months: ['gennaio','febbraio','marzo','aprile','maggio','giugno','luglio','agosto','settembre','ottobre','novembre','dicembre'], + months_short: ['gen','feb','mar','apr','mag','giu','lug','ago','set','ott','nov','dic'], + days_long: ['domenica','lunedì','martedì','mercoledì','giovedì','venerdì','sabato'], + dow_monday: ['lun','mar','mer','gio','ven','sab','dom'], + dow_sunday: ['dom','lun','mar','mer','gio','ven','sab'], + dow_index: ['dom','lun','mar','mer','gio','ven','sab'], + week_abbr: 'sett.', + allday: 'tutto il giorno', allday_cap: 'Tutto il giorno', + no_events: 'Nessun evento nel periodo visualizzato', + more_events: '+{n} altri', + + // Color picker + color_select: 'Seleziona', + }, + + nl: { + // Common + save: 'Opslaan', cancel: 'Annuleren', close: 'Sluiten', + create: 'Aanmaken', delete: 'Verwijderen', edit: 'Bewerken', + name: 'Naam', username: 'Gebruikersnaam', password: 'Wachtwoord', + email: 'E-mail', color: 'Kleur', color_pick: 'Kleur kiezen', + loading: 'Laden…', connecting: 'Verbinden…', + unknown_error: 'Onbekende fout', + + // Setup + setup_title: 'Eerste installatie', + setup_subtitle: 'Maak het beheerdersaccount aan', + setup_email: 'E-mail (optioneel)', + setup_pw_confirm: 'Wachtwoord bevestigen', + setup_submit: 'Beheerdersaccount aanmaken', + setup_pw_mismatch: 'Wachtwoorden komen niet overeen', + setup_pw_short: 'Wachtwoord moet minstens 6 tekens bevatten', + + // Login + login_tagline: 'de minimalistische agenda', + login_submit: 'Inloggen', + login_2fa_ph: '6-cijferige code', + + // Topbar + btn_today: 'Vandaag', + view_month: 'Maand', view_week: 'Week', view_day: 'Dag', view_quarter: 'Kwartaal', view_agenda: 'Afspraken', + btn_profile: 'Profiel', btn_logout: 'Uitloggen', + + // Sidebar + btn_create: 'Aanmaken', + my_calendars: 'Mijn agenda’s', + add_calendar: 'Agenda toevoegen', + cal_local: 'Lokale agenda', cal_caldav: 'CalDAV-account', + cal_ical: 'Abonneren op iCal-URL', cal_google: 'Google Agenda', + + // Event modal + event_create_title: 'Afspraak aanmaken', event_edit_title: 'Afspraak bewerken', + event_title_ph: 'Titel toevoegen', event_allday: 'Hele dag', + event_start: 'Begin', event_end: 'Einde', event_calendar: 'Agenda', + event_location: 'Locatie', event_location_ph: 'Locatie toevoegen', + event_description: 'Omschrijving', event_description_ph: 'Omschrijving toevoegen', + + // CalDAV modal + caldav_add_title: 'CalDAV-account toevoegen', + caldav_display_name: 'Weergavenaam', caldav_display_name_ph: 'bijv. Mijn Nextcloud', + caldav_url: 'CalDAV-URL', caldav_connect: 'Verbinden', + + // Local calendar modal + localcal_create_title: 'Lokale agenda aanmaken', + localcal_name_ph: 'bijv. Persoonlijk', + + // iCal modal + ical_title: 'Abonneren op iCal-URL', ical_name_ph: 'bijv. Feestdagen', + ical_url_label: 'iCal-URL', ical_refresh: 'Verversingsinterval', + ical_15min: 'Elke 15 minuten', ical_30min: 'Elke 30 minuten', + ical_hourly: 'Elk uur', ical_6h: 'Elke 6 uur', ical_daily: 'Dagelijks', + ical_subscribe: 'Abonneren', + + // Settings + settings_title: 'Instellingen', + settings_nav_appearance: 'Weergave', + settings_nav_profile: 'Profiel', + settings_nav_view: 'Aanzicht', + settings_nav_calendars: 'Agenda’s', + settings_nav_google: 'Google-accounts', + settings_nav_users: 'Gebruikersbeheer', + settings_nav_admin: 'Beheer', + admin_default_theme: 'Standaardthema', + admin_default_theme_desc: 'Geldt voor alle gebruikers zonder eigen kleur. „Herstellen” bij een kleur springt terug naar deze standaard.', + admin_theme_save: 'Standaard opslaan', + admin_theme_import: 'Thema importeren', + admin_theme_imported: '{count} kleuren geïmporteerd – sla op om toe te passen', + admin_theme_discard: 'Verwerpen', + admin_theme_saved: 'Standaardthema opgeslagen', + admin_logo_dims: 'PNG/JPEG/WebP · weergave max. 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (vierkant)', + admin_branding: 'Branding', + admin_branding_desc: 'Eigen logo (linksboven) en favicon voor de hele instantie. PNG/JPEG/WebP, max. 5 MB.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Uploaden', + admin_remove: 'Verwijderen', + admin_brand_default: 'Standaard', + admin_branding_saved: 'Branding opgeslagen', + admin_branding_removed: 'Branding verwijderd', + settings_sync_all: 'Alles synchroniseren', + settings_sync_all_desc: 'Deze instellingen delen tussen je apparaten', + settings_sync_this: 'Synchroniseren tussen apparaten', + settings_share_icon: 'Deelpictogram', + settings_colors: 'Kleuren', + settings_primary_color: 'Primaire kleur', settings_accent_color: 'Accentkleur', + settings_today_color: 'Kleur van vandaag', + settings_month_divider_color: 'Scheidingslijn tussen maanden', + settings_month_label_color: 'Kleur maandlabel', + settings_text_color: 'Tekstkleur', + settings_line_color: 'Lijnkleur', + settings_bg_color: 'Achtergrondkleur', + settings_surface_color: 'Zijbalk-/oppervlaktekleur', + settings_hover_highlight_color: 'Hover-markering (knoppen, menu’s)', + settings_icon_inactive_color: 'Zijbalkpictogrammen inactief (rust/uit)', + settings_icon_active_color: 'Zijbalkpictogrammen actief (hover/aan)', + settings_day_hover_color: 'Agendadag hover', + settings_day_selected_color: 'Geselecteerde dag', + settings_day_bg_color: 'Achtergrond van de dag', + settings_today_bg_color: 'Achtergrond van vandaag', + theme_export: 'Thema exporteren', + theme_import: 'Thema importeren', + theme_imported: 'Thema geïmporteerd – sla op om toe te passen', + theme_imported_saved: '{count} parameters geïmporteerd en opgeslagen', + theme_import_invalid: 'Ongeldig themabestand', + theme_docs_hint: 'Uitleg van de themaparameters', + theme_unknown_title: 'Onbekende parameters', + theme_unknown_params: 'Dit themabestand bevat {count} parameters die deze versie niet kent ({names}). De rest toch importeren?', + theme_import_rest: 'Rest importeren', + confirm_generic_title: 'Bevestigen', + confirm: 'OK', + confirm_delete_cal_title: 'Agenda verwijderen', + confirm_remove_ical_title: 'Abonnement verwijderen', + confirm_ha_disconnect: 'Home Assistant-account echt loskoppelen?', + reset: 'Herstellen', + settings_text_contrast: 'Tekstcontrast', + settings_text_contrast_desc: 'Helderheid van labels en teksten', + contrast_dark: 'Donker', contrast_medium: 'Gemiddeld', + contrast_light: 'Licht', contrast_max: 'Maximaal', + settings_line_contrast: 'Lijncontrast', + settings_line_contrast_desc: 'Zichtbaarheid van randen en scheidingslijnen', + line_barely: 'Nauwelijks', line_subtle: 'Subtiel', + line_normal: 'Normaal', line_strong: 'Sterk', + settings_calendar_view: 'Agendaweergave', + settings_default_view: 'Standaardweergave', + settings_week_start: 'Eerste dag van de week', + week_start_monday: 'Maandag', week_start_sunday: 'Zondag', + settings_dim_past: 'Afspraken uit het verleden dimmen', + settings_month_mode: 'Maandwisseling', + settings_month_mode_scroll: 'Doorlopend scrollen (week)', + settings_month_mode_paged: 'Pagina voor pagina (maand)', + settings_default_duration: 'Standaardduur van een afspraak', + settings_privacy: 'Privacy', + settings_private_visibility: 'Privé-afspraken voor groepsleden', + settings_private_visibility_desc: 'Hoe je privé-afspraken bij andere groepsleden verschijnen', + settings_directory_hidden: 'Mijn profiel verbergen (niet tonen in deel-/groepskeuzes)', + settings_directory_hidden_desc: 'Andere gebruikers kunnen je dan niet kiezen om agenda’s mee te delen of aan groepen toe te voegen. In het beheerdersgebruikersbeheer blijf je zichtbaar.', + private_visibility_busy: 'Weergeven als „Bezet”', + private_visibility_hidden: 'Volledig verbergen', + created_by: 'Aangemaakt door: {name}', + event_private: 'Privé', + reminders: 'Herinneringen', + reminder_add: 'Herinnering toevoegen', + reminder_at_start: 'Op de begintijd', + reminder_minutes: '{n} minuten van tevoren', + reminder_hour_one: '1 uur van tevoren', + reminder_hours: '{n} uur van tevoren', + reminder_day_one: '1 dag van tevoren', + reminder_days: '{n} dagen van tevoren', + reminder_week_one: '1 week van tevoren', + reminder_weeks: '{n} weken van tevoren', + reminder_custom: 'Aangepast…', + reminder_unit_minutes: 'minuten', + reminder_unit_hours: 'uur', + reminder_unit_days: 'dagen', + reminder_unit_weeks: 'weken', + reminder_before: 'van tevoren', + reminders_calendar_off: 'Herinneringen zijn uitgeschakeld voor deze agenda – ze worden niet geactiveerd.', + calendar_reminders_on: 'Herinneringen ingeschakeld', + calendar_reminders_off: 'Herinneringen uitgeschakeld', + copy: 'Kopiëren', + caldav_publish: 'Publiceren via CalDAV', + caldav_unpublish: 'CalDAV-publicatie stoppen', + caldav_published_url: 'CalDAV-URL (zonder login):', + caldav_url_copied: 'CalDAV-URL gekopieerd', + caldav_token_rotate: 'Token opnieuw genereren', + caldav_token_rotated: 'Nieuw token gegenereerd – bestaande abonnementen moeten opnieuw worden ingesteld', + caldav_rotate_confirm: 'Een nieuw token genereren? De huidige URL werkt dan niet meer en bestaande abonnementen moeten met de nieuwe URL opnieuw worden ingesteld.', + caldav_hint: 'Iedereen met deze URL kan zich op deze agenda abonneren en hem bewerken — geen login nodig. Toe te voegen in een CalDAV-client (Apple Agenda, Thunderbird, DAVx5).', + caldav_login_url: 'CalDAV-URL (met login):', + caldav_login_hint: 'Je kunt ook een „CalDAV-account” in je client toevoegen met deze server-URL, je gebruikersnaam en een app-wachtwoord — al je gepubliceerde agenda’s worden dan gevonden.', + app_pw_title: 'App-wachtwoorden (CalDAV)', + app_pw_desc: 'Aparte wachtwoorden voor CalDAV-clients. Nodig bij ingeschakelde 2FA, omdat apps geen 2FA-code kunnen invoeren. Altijd in te trekken.', + app_pw_label_ph: 'Naam (bijv. iPhone)', + app_pw_create: 'Aanmaken', + app_pw_new_label: 'Nieuw app-wachtwoord (alleen nu zichtbaar):', + app_pw_last_used: 'laatst gebruikt', + app_pw_never_used: 'nooit gebruikt', + app_pw_revoke: 'Intrekken', + app_pw_none: 'Nog geen app-wachtwoorden.', + app_pw_copied: 'App-wachtwoord gekopieerd', + app_pw_revoke_confirm: 'Dit app-wachtwoord intrekken? Clients die het gebruiken verliezen de toegang.', + share: 'Delen', + import: 'Importeren', + export: 'Exporteren', + importing: 'Importeren…', + import_result: '{imported} geïmporteerd, {skipped} overgeslagen', + shared_by: 'gedeeld door {name}', + share_title: 'Agenda delen', + share_current: 'Huidige gedeelde toegang', + share_add: 'Gebruiker toevoegen', + share_search: 'Gebruikers zoeken…', + share_none: 'Nog niet gedeeld', + share_no_users: 'Geen gebruikers gevonden', + perm_read: 'Alleen lezen', + perm_read_write: 'Lezen en schrijven', + remove: 'Verwijderen', + done: 'Klaar', + groups_title: 'Groepen', + groups_none: 'Nog geen groepen', + group_create: 'Groep aanmaken', + group_manage: 'Groep beheren', + group_name: 'Naam', + group_name_ph: 'Groepsnaam', + group_members: 'Leden', + group_delete: 'Groep verwijderen', + group_delete_confirm: 'Deze groep en de bijbehorende groepsagenda echt verwijderen?', + group_deleted: 'Groep verwijderd', + group_saved: 'Groep opgeslagen', + group_created: 'Groep aangemaakt', + group_view_label: 'Groepsweergave: {name}', + group_exit: 'Groepsweergave verlaten', + group_calendar: 'Groepsagenda', + group_icon: 'Pictogram', + group_visible_flag: 'Zichtbaar voor je groepen', + group_new_event: '+ Groepsafspraak', + group_member_colors: 'Kleuren van de leden', + only_owner_color: 'Alleen de eigenaar kan de kleur wijzigen', + upload_too_large: 'Bestand te groot (serverlimiet). Verhoog de uploadlimiet.', + shared_with_me: 'Met mij gedeeld', + settings_calendars: 'Agenda’s', + settings_group_visible: 'Agenda zichtbaar voor groepen', + settings_group_visible_desc: 'Kies welke van je agenda’s je groepsleden kunnen zien', + group_visible_none: 'Geen', + drag_reorder: 'Sleep om te sorteren', + profile_account: 'Account', + profile_display_name: 'Weergavenaam', + profile_display_name_ph: 'Weergavenaam', + profile_login_name: 'Inlognaam', + profile_login_name_desc: 'In kleine letters, om in te loggen. Hoofdlettergebruik maakt niet uit.', + settings_hour_height: 'Uurhoogte (week- en dagweergave)', + settings_hour_height_desc: 'Hoeveel ruimte één uur in het tijdraster inneemt', + hour_compact: 'Compact', hour_normal: 'Normaal', + hour_comfort: 'Comfortabel', hour_large: 'Groot', + settings_language: 'Taal', + settings_hidden_cals: 'Verborgen agenda’s', + settings_no_hidden_cals: 'Geen verborgen agenda’s', + settings_no_google: 'Geen Google-accounts gekoppeld', + settings_nav_accounts: 'Accounts', + settings_accounts_caldav: 'CalDAV-accounts', + settings_accounts_local: 'Lokale agenda’s', + settings_accounts_ical: 'iCal-abonnementen', + settings_accounts_google: 'Google-accounts', + settings_no_caldav_accounts: 'Geen CalDAV-accounts', + settings_no_local_cals: 'Geen lokale agenda’s', + settings_no_ical_subs: 'Geen abonnementen', + settings_no_google_accounts: 'Geen Google-accounts', + confirm_caldav_disconnect: 'CalDAV-account echt loskoppelen?', + caldav_disconnected: 'CalDAV-account losgekoppeld', + + // User management + users_add: 'Gebruiker toevoegen', users_is_admin: 'Beheerder', + users_make_admin: 'Beheerder maken', users_revoke_admin: 'Beheerrechten intrekken', + + // Profile + profile_title: 'Profiel', profile_upload: 'Afbeelding uploaden', + profile_remove_avatar: 'Verwijderen', + profile_email_ph: 'Geen e-mail ingesteld', + profile_change_pw: 'Wachtwoord wijzigen', + profile_pw_current: 'Huidig wachtwoord', profile_pw_new: 'Nieuw wachtwoord', + profile_pw_confirm: 'Nieuw wachtwoord bevestigen', + profile_2fa: 'Tweefactorauthenticatie', + profile_2fa_disabled_text: '2FA is uitgeschakeld. Bescherm je account met een authenticator.', + profile_2fa_setup: '2FA instellen', + profile_2fa_scan: 'Scan de QR-code met je authenticator-app (bijv. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Of voer deze sleutel handmatig in', + profile_2fa_copy: 'Kopiëren', profile_2fa_code_label: 'Voer de verificatiecode in', + profile_2fa_ph: '6-cijferige code', profile_2fa_activate: 'Activeren', + profile_2fa_enabled_text: '2FA is ingeschakeld.', + profile_2fa_pw_disable: 'Wachtwoord om uit te schakelen', + profile_2fa_disable: '2FA uitschakelen', + profile_my_calendars: 'Mijn agenda’s', + + // Avatar crop + crop_title: 'Uitsnede kiezen', crop_submit: 'Bijsnijden en uploaden', + + // Impressum + impressum_title: 'Colofon', + impressum_desc: 'Software en webontwikkeling', + impressum_about: 'Deze software is met de grootste zorg ontwikkeld en beschikbaar gesteld door Scarriffleservices. Alle rechten voorbehouden © 2026 Scarriffleservices.', + impressum_data_title: 'Gegevensopslag', + impressum_data_text: 'Alle applicatiegegevens worden opgeslagen en verwerkt op de server waarop deze Calendarr-instantie draait. De opslaglocatie hangt dus af van de beheerder van die server. Bij gebruik van de Google Agenda-koppeling worden gegevens uitgewisseld via de Google API; op die gegevens is het privacybeleid van Google van toepassing. Bij gebruik van de Home Assistant-koppeling worden gegevens uitgewisseld met de betreffende Home Assistant-instantie. Home Assistant is een project van de Open Home Foundation.', + impressum_disclaimer_title: 'Disclaimer', + impressum_disclaimer_text: 'Ondanks zorgvuldige samenstelling wordt geen aansprakelijkheid aanvaard voor de juistheid, volledigheid of actualiteit van de aangeboden inhoud. Gebruik is op eigen risico.', + impressum_contact: 'Contact', + + // Toast / confirms + error_load_events: 'Fout bij het laden van de afspraken', + error_no_calendars: 'Geen agenda’s', + confirm_delete_local_cal: 'Lokale agenda echt verwijderen?', + confirm_remove_ical: 'Abonnement echt verwijderen?', + google_not_configured: 'Google OAuth is niet geconfigureerd (beheerder moet GOOGLE_CLIENT_ID/SECRET instellen)', + error_enter_title: 'Voer een titel in', + error_enter_date: 'Voer een datum in', + error_enter_start: 'Voer een begintijd in', + error_end_before_start: 'Het einde kan niet vóór het begin liggen', + ctx_create_event: 'Nieuwe afspraak aanmaken', + event_readonly: 'Afspraken uit abonnementen kunnen niet worden bewerkt', + ha_create_not_supported: 'Afspraken kunnen niet rechtstreeks in Home Assistant-agenda’s worden aangemaakt', + rec_label: 'Herhaling', + rec_none: 'Geen', rec_daily: 'Dagelijks', rec_weekly: 'Wekelijks', + rec_monthly: 'Maandelijks', rec_yearly: 'Jaarlijks', rec_custom: 'Aangepast…', + rec_every: 'Elke', rec_days: 'dagen', rec_weeks: 'weken', rec_months: 'maanden', + rec_ends: 'Eindigt', rec_never: 'Nooit', rec_after_count: 'Na aantal', + rec_on_date: 'Op datum', rec_occurrences: 'keer', + copy_to_calendar: 'Kopiëren naar…', event_copied: 'Afspraak gekopieerd', + edit_before_copy: 'Bewerken vóór het kopiëren', + event_updated: 'Afspraak bijgewerkt', event_created: 'Afspraak aangemaakt', + confirm_delete_event: '„{title}” echt verwijderen?', + confirm_delete_title: 'Afspraak verwijderen', + delete_single: 'Alleen deze afspraak', + delete_all_series: 'Alle afspraken in de reeks', + event_deleted: 'Afspraak verwijderd', + error_fill_all: 'Vul alle velden in', + account_added: 'Account „{name}” toegevoegd', + error_enter_name: 'Voer een naam in', + calendar_created: 'Agenda „{name}” aangemaakt', + // Birthdays + create_event_option: 'Nieuwe afspraak', + birthday_new: 'Nieuwe verjaardag', + birthday_modal_title: 'Nieuwe verjaardag toevoegen', + birthday_calendar: 'Verjaardagsagenda', + birthday_calendar_hint: 'Jaarlijkse afspraken voor de hele dag, met leeftijd en een verjaardagspictogram.', + birthday_notify: 'Herinnering', + birthday_notify_off: 'Uit', + birthday_notify_same_day: 'Op de dag zelf', + birthday_notify_one_day: '1 dag van tevoren', + birthday_notify_days: '{n} dagen van tevoren', + birthday_person: 'Naam', + birthday_person_ph: 'Naam van de persoon', + birthday_date: 'Verjaardag', + birthday_year_unknown: 'Jaar onbekend', + birthday_target: 'Verjaardagsagenda', + birthday_no_calendars: 'Nog geen verjaardagsagenda. Maak eerst een agenda aan en schakel „Verjaardagsagenda” in.', + birthday_created: 'Verjaardag „{name}” toegevoegd', + birthday_calendar_name: 'Verjaardagen', + birthday_activate: 'Verjaardagsagenda inschakelen', + birthday_activate_hint: 'Schakel de verjaardagsagenda in om verjaardagen toe te voegen. Hij verschijnt als aparte agenda in de zijbalk.', + birthday_active: 'Verjaardagsagenda actief', + birthday_year_ph: 'Jaar', + birthday_settings_title: 'Verjaardagen', + birthday_color_hint: 'Kleur en zichtbaarheid wijzig je in de zijbalk.', + birthday_devices_title: 'Verjaardagen komen van deze apparaten:', + birthday_devices_count: '{n} verjaardagen', + birthday_calendar_type: 'Verjaardagsagenda', + birthday_add_btn: '+ Verjaardagen', + birthday_calendar_exists: 'Verjaardagsagenda bestaat al', + birthday_settings_hint: 'Maak hierboven een verjaardagsagenda aan via „+ Verjaardagen”.', + error_name_url: 'Voer een naam en URL in', + ical_subscribed: 'Geabonneerd op „{name}”', + google_synced: 'Agenda gesynchroniseerd', + confirm_google_disconnect: 'Google-account echt loskoppelen?', + google_disconnected: 'Google-account losgekoppeld', + error_username_password: 'Gebruikersnaam en wachtwoord vereist', + user_created: 'Gebruiker „{name}” aangemaakt', + settings_saved: 'Instellingen opgeslagen', + no_caldav: 'Geen CalDAV-accounts gekoppeld.', + profile_saved: 'Profiel opgeslagen', + avatar_removed: 'Profielfoto verwijderd', + avatar_uploaded: 'Profielfoto geüpload', + error_pw_mismatch: 'Wachtwoorden komen niet overeen', + error_pw_length: 'Minstens 6 tekens', + password_changed: 'Wachtwoord gewijzigd', + key_copied: 'Sleutel gekopieerd', + error_enter_6digit: 'Voer een 6-cijferige code in', + totp_enabled: '2FA ingeschakeld', totp_disabled: '2FA uitgeschakeld', + error_enter_password: 'Voer je wachtwoord in', + confirm_delete_user: 'Gebruiker verwijderen?', + show_cal: 'Tonen', hide_cal: 'Verbergen', + remove_cal: 'Agenda verwijderen', remove_ical_sub: 'Abonnement verwijderen', + change_color: 'Kleur wijzigen', + sync: 'Sync', disconnect: 'Loskoppelen', + + // Calendar / date + months: ['januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december'], + months_short: ['jan','feb','mrt','apr','mei','jun','jul','aug','sep','okt','nov','dec'], + days_long: ['zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'], + dow_monday: ['ma','di','wo','do','vr','za','zo'], + dow_sunday: ['zo','ma','di','wo','do','vr','za'], + dow_index: ['zo','ma','di','wo','do','vr','za'], + week_abbr: 'wk', + allday: 'hele dag', allday_cap: 'Hele dag', + no_events: 'Geen afspraken in de weergegeven periode', + more_events: '+{n} meer', + + // Color picker + color_select: 'Selecteren', + }, + + da: { + // Common + save: 'Gem', cancel: 'Annullér', close: 'Luk', + create: 'Opret', delete: 'Slet', edit: 'Redigér', + name: 'Navn', username: 'Brugernavn', password: 'Adgangskode', + email: 'E-mail', color: 'Farve', color_pick: 'Vælg farve', + loading: 'Indlæser…', connecting: 'Forbinder…', + unknown_error: 'Ukendt fejl', + + // Setup + setup_title: 'Førstegangsopsætning', + setup_subtitle: 'Opret administratorkontoen', + setup_email: 'E-mail (valgfri)', + setup_pw_confirm: 'Bekræft adgangskode', + setup_submit: 'Opret admin-konto', + setup_pw_mismatch: 'Adgangskoderne er ikke ens', + setup_pw_short: 'Adgangskoden skal være mindst 6 tegn', + + // Login + login_tagline: 'den minimalistiske kalender', + login_submit: 'Log ind', + login_2fa_ph: '6-cifret kode', + + // Topbar + btn_today: 'I dag', + view_month: 'Måned', view_week: 'Uge', view_day: 'Dag', view_quarter: 'Kvartal', view_agenda: 'Begivenheder', + btn_profile: 'Profil', btn_logout: 'Log ud', + + // Sidebar + btn_create: 'Opret', + my_calendars: 'Mine kalendere', + add_calendar: 'Tilføj kalender', + cal_local: 'Lokal kalender', cal_caldav: 'CalDAV-konto', + cal_ical: 'Abonnér på iCal-URL', cal_google: 'Google Kalender', + + // Event modal + event_create_title: 'Opret begivenhed', event_edit_title: 'Redigér begivenhed', + event_title_ph: 'Tilføj titel', event_allday: 'Hele dagen', + event_start: 'Start', event_end: 'Slut', event_calendar: 'Kalender', + event_location: 'Sted', event_location_ph: 'Tilføj sted', + event_description: 'Beskrivelse', event_description_ph: 'Tilføj beskrivelse', + + // CalDAV modal + caldav_add_title: 'Tilføj CalDAV-konto', + caldav_display_name: 'Visningsnavn', caldav_display_name_ph: 'f.eks. Min Nextcloud', + caldav_url: 'CalDAV-URL', caldav_connect: 'Forbind', + + // Local calendar modal + localcal_create_title: 'Opret lokal kalender', + localcal_name_ph: 'f.eks. Personlig', + + // iCal modal + ical_title: 'Abonnér på iCal-URL', ical_name_ph: 'f.eks. Helligdage', + ical_url_label: 'iCal-URL', ical_refresh: 'Opdateringsinterval', + ical_15min: 'Hvert 15. minut', ical_30min: 'Hvert 30. minut', + ical_hourly: 'Hver time', ical_6h: 'Hver 6. time', ical_daily: 'Dagligt', + ical_subscribe: 'Abonnér', + + // Settings + settings_title: 'Indstillinger', + settings_nav_appearance: 'Udseende', + settings_nav_profile: 'Profil', + settings_nav_view: 'Visning', + settings_nav_calendars: 'Kalendere', + settings_nav_google: 'Google-konti', + settings_nav_users: 'Brugeradministration', + settings_nav_admin: 'Admin', + admin_default_theme: 'Standardtema', + admin_default_theme_desc: 'Gælder for alle brugere uden egen farve. “Nulstil” på en farve vender tilbage til dette standardtema.', + admin_theme_save: 'Gem standard', + admin_theme_import: 'Importér tema', + admin_theme_imported: '{count} farver importeret – gem for at anvende', + admin_theme_discard: 'Kassér', + admin_theme_saved: 'Standardtema gemt', + admin_logo_dims: 'PNG/JPEG/WebP · vises maks. 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (kvadratisk)', + admin_branding: 'Branding', + admin_branding_desc: 'Eget logo (øverst til venstre) og favicon for hele instansen. PNG/JPEG/WebP, maks. 5 MB.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Upload', + admin_remove: 'Fjern', + admin_brand_default: 'Standard', + admin_branding_saved: 'Branding gemt', + admin_branding_removed: 'Branding fjernet', + settings_sync_all: 'Synkronisér alt', + settings_sync_all_desc: 'Del disse indstillinger mellem dine enheder', + settings_sync_this: 'Synkronisér mellem enheder', + settings_share_icon: 'Delingsikon', + settings_colors: 'Farver', + settings_primary_color: 'Primærfarve', settings_accent_color: 'Accentfarve', + settings_today_color: 'Farve for i dag', + settings_month_divider_color: 'Skillelinje mellem måneder', + settings_month_label_color: 'Farve på månedsetiket', + settings_text_color: 'Tekstfarve', + settings_line_color: 'Linjefarve', + settings_bg_color: 'Baggrundsfarve', + settings_surface_color: 'Sidepanel-/overfladefarve', + settings_hover_highlight_color: 'Fremhævning ved hover (knapper, menuer)', + settings_icon_inactive_color: 'Sidepanelikoner inaktive (hvile/fra)', + settings_icon_active_color: 'Sidepanelikoner aktive (hover/til)', + settings_day_hover_color: 'Kalenderdag ved hover', + settings_day_selected_color: 'Valgt dag', + settings_day_bg_color: 'Dagens baggrund', + settings_today_bg_color: 'Baggrund for i dag', + theme_export: 'Eksportér tema', + theme_import: 'Importér tema', + theme_imported: 'Tema importeret – gem for at anvende', + theme_imported_saved: '{count} parametre importeret og gemt', + theme_import_invalid: 'Ugyldig temafil', + theme_docs_hint: 'Forklaring af temaparametrene', + theme_unknown_title: 'Ukendte parametre', + theme_unknown_params: 'Denne temafil indeholder {count} parametre, som denne version ikke kender ({names}). Vil du importere resten alligevel?', + theme_import_rest: 'Importér resten', + confirm_generic_title: 'Bekræft', + confirm: 'OK', + confirm_delete_cal_title: 'Slet kalender', + confirm_remove_ical_title: 'Fjern abonnement', + confirm_ha_disconnect: 'Vil du virkelig afbryde Home Assistant-kontoen?', + reset: 'Nulstil', + settings_text_contrast: 'Tekstkontrast', + settings_text_contrast_desc: 'Lysstyrken på etiketter og tekst', + contrast_dark: 'Mørk', contrast_medium: 'Middel', + contrast_light: 'Lys', contrast_max: 'Maksimum', + settings_line_contrast: 'Linjekontrast', + settings_line_contrast_desc: 'Synligheden af kanter og skillelinjer', + line_barely: 'Knap nok', line_subtle: 'Diskret', + line_normal: 'Normal', line_strong: 'Kraftig', + settings_calendar_view: 'Kalendervisning', + settings_default_view: 'Standardvisning', + settings_week_start: 'Ugens første dag', + week_start_monday: 'Mandag', week_start_sunday: 'Søndag', + settings_dim_past: 'Dæmp tidligere begivenheder', + settings_month_mode: 'Månedsskift', + settings_month_mode_scroll: 'Løbende scroll (uge)', + settings_month_mode_paged: 'Side for side (måned)', + settings_default_duration: 'Standardvarighed for begivenheder', + settings_privacy: 'Privatliv', + settings_private_visibility: 'Private begivenheder for gruppemedlemmer', + settings_private_visibility_desc: 'Hvordan dine private begivenheder ser ud for andre gruppemedlemmer', + settings_directory_hidden: 'Skjul min profil (vis mig ikke i delings-/gruppevælgere)', + settings_directory_hidden_desc: 'Andre brugere kan så ikke vælge dig til at dele kalendere med eller føje dig til grupper. Du er stadig synlig i administratorens brugeradministration.', + private_visibility_busy: 'Vis som “Optaget”', + private_visibility_hidden: 'Skjul helt', + created_by: 'Oprettet af: {name}', + event_private: 'Privat', + reminders: 'Påmindelser', + reminder_add: 'Tilføj påmindelse', + reminder_at_start: 'Ved starttidspunktet', + reminder_minutes: '{n} minutter før', + reminder_hour_one: '1 time før', + reminder_hours: '{n} timer før', + reminder_day_one: '1 dag før', + reminder_days: '{n} dage før', + reminder_week_one: '1 uge før', + reminder_weeks: '{n} uger før', + reminder_custom: 'Tilpasset…', + reminder_unit_minutes: 'minutter', + reminder_unit_hours: 'timer', + reminder_unit_days: 'dage', + reminder_unit_weeks: 'uger', + reminder_before: 'før', + reminders_calendar_off: 'Påmindelser er slået fra for denne kalender – de bliver ikke udløst.', + calendar_reminders_on: 'Påmindelser slået til', + calendar_reminders_off: 'Påmindelser slået fra', + copy: 'Kopiér', + caldav_publish: 'Udgiv via CalDAV', + caldav_unpublish: 'Stop CalDAV-udgivelse', + caldav_published_url: 'CalDAV-URL (uden login):', + caldav_url_copied: 'CalDAV-URL kopieret', + caldav_token_rotate: 'Generér nyt token', + caldav_token_rotated: 'Nyt token genereret – eksisterende abonnementer skal oprettes igen', + caldav_rotate_confirm: 'Vil du generere et nyt token? Den nuværende URL holder op med at virke, og eksisterende abonnementer skal oprettes igen med den nye URL.', + caldav_hint: 'Alle med denne URL kan abonnere på og redigere denne kalender — intet login nødvendigt. Tilføj den i en CalDAV-klient (Apple Kalender, Thunderbird, DAVx5).', + caldav_login_url: 'CalDAV-URL (med login):', + caldav_login_hint: 'Alternativt kan du tilføje en “CalDAV-konto” i din klient med denne server-URL samt dit brugernavn og en app-adgangskode — så findes alle dine udgivne kalendere.', + app_pw_title: 'App-adgangskoder (CalDAV)', + app_pw_desc: 'Særskilte adgangskoder til CalDAV-klienter. Nødvendige når 2FA er slået til, da apps ikke kan indtaste en 2FA-kode. Kan tilbagekaldes når som helst.', + app_pw_label_ph: 'Navn (f.eks. iPhone)', + app_pw_create: 'Opret', + app_pw_new_label: 'Ny app-adgangskode (vises kun nu):', + app_pw_last_used: 'sidst brugt', + app_pw_never_used: 'aldrig brugt', + app_pw_revoke: 'Tilbagekald', + app_pw_none: 'Ingen app-adgangskoder endnu.', + app_pw_copied: 'App-adgangskode kopieret', + app_pw_revoke_confirm: 'Vil du tilbagekalde denne app-adgangskode? Klienter, der bruger den, mister adgangen.', + share: 'Del', + import: 'Importér', + export: 'Eksportér', + importing: 'Importerer…', + import_result: '{imported} importeret, {skipped} sprunget over', + shared_by: 'delt af {name}', + share_title: 'Del kalender', + share_current: 'Nuværende delinger', + share_add: 'Tilføj bruger', + share_search: 'Søg efter brugere…', + share_none: 'Ikke delt endnu', + share_no_users: 'Ingen brugere fundet', + perm_read: 'Kun læsning', + perm_read_write: 'Læs og skriv', + remove: 'Fjern', + done: 'Færdig', + groups_title: 'Grupper', + groups_none: 'Ingen grupper endnu', + group_create: 'Opret gruppe', + group_manage: 'Administrér gruppe', + group_name: 'Navn', + group_name_ph: 'Gruppenavn', + group_members: 'Medlemmer', + group_delete: 'Slet gruppe', + group_delete_confirm: 'Vil du virkelig slette denne gruppe og dens gruppekalender?', + group_deleted: 'Gruppe slettet', + group_saved: 'Gruppe gemt', + group_created: 'Gruppe oprettet', + group_view_label: 'Gruppevisning: {name}', + group_exit: 'Forlad gruppevisning', + group_calendar: 'Gruppekalender', + group_icon: 'Ikon', + group_visible_flag: 'Synlig for dine grupper', + group_new_event: '+ Gruppebegivenhed', + group_member_colors: 'Medlemmernes farver', + only_owner_color: 'Kun ejeren kan ændre farven', + upload_too_large: 'Filen er for stor (serverens grænse). Hæv venligst upload-grænsen.', + shared_with_me: 'Delt med mig', + settings_calendars: 'Kalendere', + settings_group_visible: 'Kalender synlig for grupper', + settings_group_visible_desc: 'Vælg, hvilken af dine kalendere dine gruppemedlemmer kan se', + group_visible_none: 'Ingen', + drag_reorder: 'Træk for at sortere', + profile_account: 'Konto', + profile_display_name: 'Visningsnavn', + profile_display_name_ph: 'Visningsnavn', + profile_login_name: 'Loginnavn', + profile_login_name_desc: 'Med små bogstaver, bruges til at logge ind. Der skelnes ikke mellem store og små bogstaver.', + settings_hour_height: 'Timehøjde (uge- og dagsvisning)', + settings_hour_height_desc: 'Hvor meget plads én time fylder i tidsgitteret', + hour_compact: 'Kompakt', hour_normal: 'Normal', + hour_comfort: 'Komfort', hour_large: 'Stor', + settings_language: 'Sprog', + settings_hidden_cals: 'Skjulte kalendere', + settings_no_hidden_cals: 'Ingen skjulte kalendere', + settings_no_google: 'Ingen Google-konti forbundet', + settings_nav_accounts: 'Konti', + settings_accounts_caldav: 'CalDAV-konti', + settings_accounts_local: 'Lokale kalendere', + settings_accounts_ical: 'iCal-abonnementer', + settings_accounts_google: 'Google-konti', + settings_no_caldav_accounts: 'Ingen CalDAV-konti', + settings_no_local_cals: 'Ingen lokale kalendere', + settings_no_ical_subs: 'Ingen abonnementer', + settings_no_google_accounts: 'Ingen Google-konti', + confirm_caldav_disconnect: 'Vil du virkelig afbryde CalDAV-kontoen?', + caldav_disconnected: 'CalDAV-konto afbrudt', + + // User management + users_add: 'Tilføj bruger', users_is_admin: 'Administrator', + users_make_admin: 'Gør til admin', users_revoke_admin: 'Fjern admin-rettigheder', + + // Profile + profile_title: 'Profil', profile_upload: 'Upload billede', + profile_remove_avatar: 'Fjern', + profile_email_ph: 'Ingen e-mail angivet', + profile_change_pw: 'Skift adgangskode', + profile_pw_current: 'Nuværende adgangskode', profile_pw_new: 'Ny adgangskode', + profile_pw_confirm: 'Bekræft ny adgangskode', + profile_2fa: 'To-faktor-godkendelse', + profile_2fa_disabled_text: '2FA er slået fra. Beskyt din konto med en authenticator.', + profile_2fa_setup: 'Opsæt 2FA', + profile_2fa_scan: 'Scan QR-koden med din authenticator-app (f.eks. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Eller indtast denne nøgle manuelt', + profile_2fa_copy: 'Kopiér', profile_2fa_code_label: 'Indtast bekræftelseskode', + profile_2fa_ph: '6-cifret kode', profile_2fa_activate: 'Aktivér', + profile_2fa_enabled_text: '2FA er slået til.', + profile_2fa_pw_disable: 'Adgangskode for at slå fra', + profile_2fa_disable: 'Slå 2FA fra', + profile_my_calendars: 'Mine kalendere', + + // Avatar crop + crop_title: 'Vælg billedudsnit', crop_submit: 'Beskær og upload', + + // Impressum + impressum_title: 'Juridisk meddelelse', + impressum_desc: 'Software og webudvikling', + impressum_about: 'Denne software er udviklet og stillet til rådighed af Scarriffleservices med største omhu. Alle rettigheder forbeholdes © 2026 Scarriffleservices.', + impressum_data_title: 'Datalagring', + impressum_data_text: 'Alle applikationsdata gemmes og behandles på den server, hvor denne Calendarr-instans kører. Lagringsstedet afhænger derfor af den, der driver serveren. Ved brug af Google Kalender-integrationen udveksles data via Googles API; Googles privatlivspolitik gælder for disse data. Ved brug af Home Assistant-integrationen udveksles data med den pågældende Home Assistant-instans. Home Assistant er et projekt under Open Home Foundation.', + impressum_disclaimer_title: 'Ansvarsfraskrivelse', + impressum_disclaimer_text: 'Trods omhyggelig udarbejdelse påtages der intet ansvar for rigtigheden, fuldstændigheden eller aktualiteten af det leverede indhold. Brug sker på eget ansvar.', + impressum_contact: 'Kontakt', + + // Toast / confirms + error_load_events: 'Fejl ved indlæsning af begivenheder', + error_no_calendars: 'Ingen kalendere', + confirm_delete_local_cal: 'Vil du virkelig slette den lokale kalender?', + confirm_remove_ical: 'Vil du virkelig fjerne abonnementet?', + google_not_configured: 'Google OAuth er ikke konfigureret (administratoren skal sætte GOOGLE_CLIENT_ID/SECRET)', + error_enter_title: 'Indtast venligst en titel', + error_enter_date: 'Indtast venligst en dato', + error_enter_start: 'Indtast venligst et starttidspunkt', + error_end_before_start: 'Slut kan ikke ligge før start', + ctx_create_event: 'Opret ny begivenhed', + event_readonly: 'Begivenheder fra abonnementer kan ikke redigeres', + ha_create_not_supported: 'Begivenheder kan ikke oprettes direkte i Home Assistant-kalendere', + rec_label: 'Gentagelse', + rec_none: 'Ingen', rec_daily: 'Dagligt', rec_weekly: 'Ugentligt', + rec_monthly: 'Månedligt', rec_yearly: 'Årligt', rec_custom: 'Tilpasset…', + rec_every: 'Hver', rec_days: 'dage', rec_weeks: 'uger', rec_months: 'måneder', + rec_ends: 'Slutter', rec_never: 'Aldrig', rec_after_count: 'Efter antal', + rec_on_date: 'På dato', rec_occurrences: 'gentagelser', + copy_to_calendar: 'Kopiér til…', event_copied: 'Begivenhed kopieret', + edit_before_copy: 'Redigér før kopiering', + event_updated: 'Begivenhed opdateret', event_created: 'Begivenhed oprettet', + confirm_delete_event: 'Vil du virkelig slette “{title}”?', + confirm_delete_title: 'Slet begivenhed', + delete_single: 'Kun denne begivenhed', + delete_all_series: 'Alle begivenheder i serien', + event_deleted: 'Begivenhed slettet', + error_fill_all: 'Udfyld venligst alle felter', + account_added: 'Kontoen “{name}” blev tilføjet', + error_enter_name: 'Indtast venligst et navn', + calendar_created: 'Kalenderen “{name}” blev oprettet', + // Birthdays + create_event_option: 'Ny begivenhed', + birthday_new: 'Ny fødselsdag', + birthday_modal_title: 'Tilføj ny fødselsdag', + birthday_calendar: 'Fødselsdagskalender', + birthday_calendar_hint: 'Årlige heldagsbegivenheder med alder og et fødselsdagsikon.', + birthday_notify: 'Påmindelse', + birthday_notify_off: 'Fra', + birthday_notify_same_day: 'På dagen', + birthday_notify_one_day: '1 dag før', + birthday_notify_days: '{n} dage før', + birthday_person: 'Navn', + birthday_person_ph: 'Personens navn', + birthday_date: 'Fødselsdag', + birthday_year_unknown: 'År ukendt', + birthday_target: 'Fødselsdagskalender', + birthday_no_calendars: 'Ingen fødselsdagskalender endnu. Opret først en kalender, og slå “Fødselsdagskalender” til.', + birthday_created: 'Fødselsdagen “{name}” blev tilføjet', + birthday_calendar_name: 'Fødselsdage', + birthday_activate: 'Slå fødselsdagskalender til', + birthday_activate_hint: 'Slå fødselsdagskalenderen til for at oprette fødselsdage. Den vises som en selvstændig kalender i sidepanelet.', + birthday_active: 'Fødselsdagskalender aktiv', + birthday_year_ph: 'År', + birthday_settings_title: 'Fødselsdage', + birthday_color_hint: 'Farve og synlighed ændrer du i sidepanelet.', + birthday_devices_title: 'Fødselsdage kommer fra disse enheder:', + birthday_devices_count: '{n} fødselsdage', + birthday_calendar_type: 'Fødselsdagskalender', + birthday_add_btn: '+ Fødselsdage', + birthday_calendar_exists: 'Fødselsdagskalenderen findes allerede', + birthday_settings_hint: 'Opret en fødselsdagskalender via “+ Fødselsdage” ovenfor.', + error_name_url: 'Indtast venligst navn og URL', + ical_subscribed: 'Abonnerer nu på “{name}”', + google_synced: 'Kalender synkroniseret', + confirm_google_disconnect: 'Vil du virkelig afbryde Google-kontoen?', + google_disconnected: 'Google-konto afbrudt', + error_username_password: 'Brugernavn og adgangskode er påkrævet', + user_created: 'Brugeren “{name}” blev oprettet', + settings_saved: 'Indstillinger gemt', + no_caldav: 'Ingen CalDAV-konti forbundet.', + profile_saved: 'Profil gemt', + avatar_removed: 'Profilbillede fjernet', + avatar_uploaded: 'Profilbillede uploadet', + error_pw_mismatch: 'Adgangskoderne er ikke ens', + error_pw_length: 'Mindst 6 tegn', + password_changed: 'Adgangskode ændret', + key_copied: 'Nøgle kopieret', + error_enter_6digit: 'Indtast venligst en 6-cifret kode', + totp_enabled: '2FA slået til', totp_disabled: '2FA slået fra', + error_enter_password: 'Indtast venligst din adgangskode', + confirm_delete_user: 'Slet bruger?', + show_cal: 'Vis', hide_cal: 'Skjul', + remove_cal: 'Fjern kalender', remove_ical_sub: 'Fjern abonnement', + change_color: 'Skift farve', + sync: 'Sync', disconnect: 'Afbryd', + + // Calendar / date + months: ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december'], + months_short: ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'], + days_long: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dow_monday: ['man','tir','ons','tor','fre','lør','søn'], + dow_sunday: ['søn','man','tir','ons','tor','fre','lør'], + dow_index: ['søn','man','tir','ons','tor','fre','lør'], + week_abbr: 'uge', + allday: 'hele dagen', allday_cap: 'Hele dagen', + no_events: 'Ingen begivenheder i den viste periode', + more_events: '+{n} mere', + + // Color picker + color_select: 'Vælg', + }, + + no: { + // Common + save: 'Lagre', cancel: 'Avbryt', close: 'Lukk', + create: 'Opprett', delete: 'Slett', edit: 'Rediger', + name: 'Navn', username: 'Brukernavn', password: 'Passord', + email: 'E-post', color: 'Farge', color_pick: 'Velg farge', + loading: 'Laster…', connecting: 'Kobler til…', + unknown_error: 'Ukjent feil', + + // Setup + setup_title: 'Førstegangsoppsett', + setup_subtitle: 'Opprett administratorkontoen', + setup_email: 'E-post (valgfritt)', + setup_pw_confirm: 'Bekreft passord', + setup_submit: 'Opprett admin-konto', + setup_pw_mismatch: 'Passordene er ikke like', + setup_pw_short: 'Passordet må ha minst 6 tegn', + + // Login + login_tagline: 'den minimalistiske kalenderen', + login_submit: 'Logg inn', + login_2fa_ph: '6-sifret kode', + + // Topbar + btn_today: 'I dag', + view_month: 'Måned', view_week: 'Uke', view_day: 'Dag', view_quarter: 'Kvartal', view_agenda: 'Hendelser', + btn_profile: 'Profil', btn_logout: 'Logg ut', + + // Sidebar + btn_create: 'Opprett', + my_calendars: 'Mine kalendere', + add_calendar: 'Legg til kalender', + cal_local: 'Lokal kalender', cal_caldav: 'CalDAV-konto', + cal_ical: 'Abonner på iCal-URL', cal_google: 'Google Kalender', + + // Event modal + event_create_title: 'Opprett hendelse', event_edit_title: 'Rediger hendelse', + event_title_ph: 'Legg til tittel', event_allday: 'Hele dagen', + event_start: 'Start', event_end: 'Slutt', event_calendar: 'Kalender', + event_location: 'Sted', event_location_ph: 'Legg til sted', + event_description: 'Beskrivelse', event_description_ph: 'Legg til beskrivelse', + + // CalDAV modal + caldav_add_title: 'Legg til CalDAV-konto', + caldav_display_name: 'Visningsnavn', caldav_display_name_ph: 'f.eks. Min Nextcloud', + caldav_url: 'CalDAV-URL', caldav_connect: 'Koble til', + + // Local calendar modal + localcal_create_title: 'Opprett lokal kalender', + localcal_name_ph: 'f.eks. Personlig', + + // iCal modal + ical_title: 'Abonner på iCal-URL', ical_name_ph: 'f.eks. Helligdager', + ical_url_label: 'iCal-URL', ical_refresh: 'Oppdateringsintervall', + ical_15min: 'Hvert 15. minutt', ical_30min: 'Hvert 30. minutt', + ical_hourly: 'Hver time', ical_6h: 'Hver 6. time', ical_daily: 'Daglig', + ical_subscribe: 'Abonner', + + // Settings + settings_title: 'Innstillinger', + settings_nav_appearance: 'Utseende', + settings_nav_profile: 'Profil', + settings_nav_view: 'Visning', + settings_nav_calendars: 'Kalendere', + settings_nav_google: 'Google-kontoer', + settings_nav_users: 'Brukeradministrasjon', + settings_nav_admin: 'Admin', + admin_default_theme: 'Standardtema', + admin_default_theme_desc: 'Gjelder alle brukere uten egen farge. «Nullstill» på en farge går tilbake til dette standardtemaet.', + admin_theme_save: 'Lagre standard', + admin_theme_import: 'Importer tema', + admin_theme_imported: '{count} farger importert – lagre for å ta i bruk', + admin_theme_discard: 'Forkast', + admin_theme_saved: 'Standardtema lagret', + admin_logo_dims: 'PNG/JPEG/WebP · vises maks. 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (kvadratisk)', + admin_branding: 'Profilering', + admin_branding_desc: 'Egen logo (øverst til venstre) og favicon for hele instansen. PNG/JPEG/WebP, maks. 5 MB.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Last opp', + admin_remove: 'Fjern', + admin_brand_default: 'Standard', + admin_branding_saved: 'Profilering lagret', + admin_branding_removed: 'Profilering fjernet', + settings_sync_all: 'Synkroniser alt', + settings_sync_all_desc: 'Del disse innstillingene mellom enhetene dine', + settings_sync_this: 'Synkroniser mellom enheter', + settings_share_icon: 'Delingsikon', + settings_colors: 'Farger', + settings_primary_color: 'Primærfarge', settings_accent_color: 'Aksentfarge', + settings_today_color: 'Farge for i dag', + settings_month_divider_color: 'Skillelinje mellom måneder', + settings_month_label_color: 'Farge på månedsetikett', + settings_text_color: 'Tekstfarge', + settings_line_color: 'Linjefarge', + settings_bg_color: 'Bakgrunnsfarge', + settings_surface_color: 'Sidepanel-/overflatefarge', + settings_hover_highlight_color: 'Utheving ved peking (knapper, menyer)', + settings_icon_inactive_color: 'Sidepanelikoner inaktive (hvile/av)', + settings_icon_active_color: 'Sidepanelikoner aktive (peking/på)', + settings_day_hover_color: 'Kalenderdag ved peking', + settings_day_selected_color: 'Valgt dag', + settings_day_bg_color: 'Bakgrunn for dagen', + settings_today_bg_color: 'Bakgrunn for i dag', + theme_export: 'Eksporter tema', + theme_import: 'Importer tema', + theme_imported: 'Tema importert – lagre for å ta i bruk', + theme_imported_saved: '{count} parametere importert og lagret', + theme_import_invalid: 'Ugyldig temafil', + theme_docs_hint: 'Forklaring av temaparameterne', + theme_unknown_title: 'Ukjente parametere', + theme_unknown_params: 'Denne temafilen inneholder {count} parametere som denne versjonen ikke kjenner ({names}). Vil du importere resten likevel?', + theme_import_rest: 'Importer resten', + confirm_generic_title: 'Bekreft', + confirm: 'OK', + confirm_delete_cal_title: 'Slett kalender', + confirm_remove_ical_title: 'Fjern abonnement', + confirm_ha_disconnect: 'Vil du virkelig koble fra Home Assistant-kontoen?', + reset: 'Nullstill', + settings_text_contrast: 'Tekstkontrast', + settings_text_contrast_desc: 'Lysstyrken på etiketter og tekst', + contrast_dark: 'Mørk', contrast_medium: 'Middels', + contrast_light: 'Lys', contrast_max: 'Maksimum', + settings_line_contrast: 'Linjekontrast', + settings_line_contrast_desc: 'Synligheten til kanter og skillelinjer', + line_barely: 'Så vidt', line_subtle: 'Diskret', + line_normal: 'Normal', line_strong: 'Sterk', + settings_calendar_view: 'Kalendervisning', + settings_default_view: 'Standardvisning', + settings_week_start: 'Første dag i uken', + week_start_monday: 'Mandag', week_start_sunday: 'Søndag', + settings_dim_past: 'Dempe tidligere hendelser', + settings_month_mode: 'Månedsskifte', + settings_month_mode_scroll: 'Sammenhengende rulling (uke)', + settings_month_mode_paged: 'Side for side (måned)', + settings_default_duration: 'Standardvarighet for hendelser', + settings_privacy: 'Personvern', + settings_private_visibility: 'Private hendelser for gruppemedlemmer', + settings_private_visibility_desc: 'Hvordan de private hendelsene dine vises for andre gruppemedlemmer', + settings_directory_hidden: 'Skjul profilen min (ikke vis meg i delings-/gruppevelgere)', + settings_directory_hidden_desc: 'Andre brukere kan da ikke velge deg for å dele kalendere med, eller legge deg til i grupper. Du er fortsatt synlig i administratorens brukeradministrasjon.', + private_visibility_busy: 'Vis som «Opptatt»', + private_visibility_hidden: 'Skjul helt', + created_by: 'Opprettet av: {name}', + event_private: 'Privat', + reminders: 'Påminnelser', + reminder_add: 'Legg til påminnelse', + reminder_at_start: 'Ved starttidspunktet', + reminder_minutes: '{n} minutter før', + reminder_hour_one: '1 time før', + reminder_hours: '{n} timer før', + reminder_day_one: '1 dag før', + reminder_days: '{n} dager før', + reminder_week_one: '1 uke før', + reminder_weeks: '{n} uker før', + reminder_custom: 'Tilpasset…', + reminder_unit_minutes: 'minutter', + reminder_unit_hours: 'timer', + reminder_unit_days: 'dager', + reminder_unit_weeks: 'uker', + reminder_before: 'før', + reminders_calendar_off: 'Påminnelser er slått av for denne kalenderen – de blir ikke utløst.', + calendar_reminders_on: 'Påminnelser slått på', + calendar_reminders_off: 'Påminnelser slått av', + copy: 'Kopier', + caldav_publish: 'Publiser via CalDAV', + caldav_unpublish: 'Stopp CalDAV-publisering', + caldav_published_url: 'CalDAV-URL (uten innlogging):', + caldav_url_copied: 'CalDAV-URL kopiert', + caldav_token_rotate: 'Generer nytt token', + caldav_token_rotated: 'Nytt token generert – eksisterende abonnementer må settes opp på nytt', + caldav_rotate_confirm: 'Vil du generere et nytt token? Nåværende URL slutter å virke, og eksisterende abonnementer må settes opp på nytt med den nye URL-en.', + caldav_hint: 'Alle med denne URL-en kan abonnere på og redigere denne kalenderen — ingen innlogging kreves. Legg den til i en CalDAV-klient (Apple Kalender, Thunderbird, DAVx5).', + caldav_login_url: 'CalDAV-URL (med innlogging):', + caldav_login_hint: 'Alternativt kan du legge til en «CalDAV-konto» i klienten med denne server-URL-en samt brukernavnet ditt og et app-passord — da blir alle publiserte kalendere funnet.', + app_pw_title: 'App-passord (CalDAV)', + app_pw_desc: 'Egne passord for CalDAV-klienter. Nødvendig når 2FA er på, siden apper ikke kan taste inn en 2FA-kode. Kan tilbakekalles når som helst.', + app_pw_label_ph: 'Navn (f.eks. iPhone)', + app_pw_create: 'Opprett', + app_pw_new_label: 'Nytt app-passord (vises bare nå):', + app_pw_last_used: 'sist brukt', + app_pw_never_used: 'aldri brukt', + app_pw_revoke: 'Tilbakekall', + app_pw_none: 'Ingen app-passord ennå.', + app_pw_copied: 'App-passord kopiert', + app_pw_revoke_confirm: 'Vil du tilbakekalle dette app-passordet? Klienter som bruker det, mister tilgangen.', + share: 'Del', + import: 'Importer', + export: 'Eksporter', + importing: 'Importerer…', + import_result: '{imported} importert, {skipped} hoppet over', + shared_by: 'delt av {name}', + share_title: 'Del kalender', + share_current: 'Nåværende delinger', + share_add: 'Legg til bruker', + share_search: 'Søk etter brukere…', + share_none: 'Ikke delt ennå', + share_no_users: 'Ingen brukere funnet', + perm_read: 'Kun lesing', + perm_read_write: 'Lese og skrive', + remove: 'Fjern', + done: 'Ferdig', + groups_title: 'Grupper', + groups_none: 'Ingen grupper ennå', + group_create: 'Opprett gruppe', + group_manage: 'Administrer gruppe', + group_name: 'Navn', + group_name_ph: 'Gruppenavn', + group_members: 'Medlemmer', + group_delete: 'Slett gruppe', + group_delete_confirm: 'Vil du virkelig slette denne gruppen og gruppekalenderen dens?', + group_deleted: 'Gruppe slettet', + group_saved: 'Gruppe lagret', + group_created: 'Gruppe opprettet', + group_view_label: 'Gruppevisning: {name}', + group_exit: 'Forlat gruppevisning', + group_calendar: 'Gruppekalender', + group_icon: 'Ikon', + group_visible_flag: 'Synlig for gruppene dine', + group_new_event: '+ Gruppehendelse', + group_member_colors: 'Medlemmenes farger', + only_owner_color: 'Bare eieren kan endre fargen', + upload_too_large: 'Filen er for stor (servergrense). Øk opplastingsgrensen.', + shared_with_me: 'Delt med meg', + settings_calendars: 'Kalendere', + settings_group_visible: 'Kalender synlig for grupper', + settings_group_visible_desc: 'Velg hvilken av kalenderne dine gruppemedlemmene kan se', + group_visible_none: 'Ingen', + drag_reorder: 'Dra for å sortere', + profile_account: 'Konto', + profile_display_name: 'Visningsnavn', + profile_display_name_ph: 'Visningsnavn', + profile_login_name: 'Innloggingsnavn', + profile_login_name_desc: 'Med små bokstaver, brukes til innlogging. Skiller ikke mellom store og små bokstaver.', + settings_hour_height: 'Timehøyde (uke- og dagsvisning)', + settings_hour_height_desc: 'Hvor mye plass én time tar i tidsrutenettet', + hour_compact: 'Kompakt', hour_normal: 'Normal', + hour_comfort: 'Komfort', hour_large: 'Stor', + settings_language: 'Språk', + settings_hidden_cals: 'Skjulte kalendere', + settings_no_hidden_cals: 'Ingen skjulte kalendere', + settings_no_google: 'Ingen Google-kontoer tilkoblet', + settings_nav_accounts: 'Kontoer', + settings_accounts_caldav: 'CalDAV-kontoer', + settings_accounts_local: 'Lokale kalendere', + settings_accounts_ical: 'iCal-abonnementer', + settings_accounts_google: 'Google-kontoer', + settings_no_caldav_accounts: 'Ingen CalDAV-kontoer', + settings_no_local_cals: 'Ingen lokale kalendere', + settings_no_ical_subs: 'Ingen abonnementer', + settings_no_google_accounts: 'Ingen Google-kontoer', + confirm_caldav_disconnect: 'Vil du virkelig koble fra CalDAV-kontoen?', + caldav_disconnected: 'CalDAV-konto frakoblet', + + // User management + users_add: 'Legg til bruker', users_is_admin: 'Administrator', + users_make_admin: 'Gjør til admin', users_revoke_admin: 'Fjern admin-rettigheter', + + // Profile + profile_title: 'Profil', profile_upload: 'Last opp bilde', + profile_remove_avatar: 'Fjern', + profile_email_ph: 'Ingen e-post angitt', + profile_change_pw: 'Endre passord', + profile_pw_current: 'Nåværende passord', profile_pw_new: 'Nytt passord', + profile_pw_confirm: 'Bekreft nytt passord', + profile_2fa: 'Tofaktorautentisering', + profile_2fa_disabled_text: '2FA er slått av. Beskytt kontoen din med en autentiseringsapp.', + profile_2fa_setup: 'Sett opp 2FA', + profile_2fa_scan: 'Skann QR-koden med autentiseringsappen din (f.eks. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Eller skriv inn denne nøkkelen manuelt', + profile_2fa_copy: 'Kopier', profile_2fa_code_label: 'Skriv inn bekreftelseskoden', + profile_2fa_ph: '6-sifret kode', profile_2fa_activate: 'Aktiver', + profile_2fa_enabled_text: '2FA er slått på.', + profile_2fa_pw_disable: 'Passord for å slå av', + profile_2fa_disable: 'Slå av 2FA', + profile_my_calendars: 'Mine kalendere', + + // Avatar crop + crop_title: 'Velg bildeutsnitt', crop_submit: 'Beskjær og last opp', + + // Impressum + impressum_title: 'Juridisk informasjon', + impressum_desc: 'Programvare og webutvikling', + impressum_about: 'Denne programvaren er utviklet og gjort tilgjengelig av Scarriffleservices med største omhu. Alle rettigheter forbeholdt © 2026 Scarriffleservices.', + impressum_data_title: 'Datalagring', + impressum_data_text: 'Alle applikasjonsdata lagres og behandles på serveren der denne Calendarr-instansen kjører. Lagringsstedet avhenger derfor av den som drifter serveren. Ved bruk av Google Kalender-integrasjonen utveksles data via Googles API; Googles personvernerklæring gjelder for disse dataene. Ved bruk av Home Assistant-integrasjonen utveksles data med den aktuelle Home Assistant-instansen. Home Assistant er et prosjekt i regi av Open Home Foundation.', + impressum_disclaimer_title: 'Ansvarsfraskrivelse', + impressum_disclaimer_text: 'Til tross for nøye utarbeidelse påtas det ikke ansvar for at innholdet er riktig, fullstendig eller oppdatert. Bruk skjer på eget ansvar.', + impressum_contact: 'Kontakt', + + // Toast / confirms + error_load_events: 'Feil ved lasting av hendelser', + error_no_calendars: 'Ingen kalendere', + confirm_delete_local_cal: 'Vil du virkelig slette den lokale kalenderen?', + confirm_remove_ical: 'Vil du virkelig fjerne abonnementet?', + google_not_configured: 'Google OAuth er ikke konfigurert (administrator må sette GOOGLE_CLIENT_ID/SECRET)', + error_enter_title: 'Skriv inn en tittel', + error_enter_date: 'Skriv inn en dato', + error_enter_start: 'Skriv inn et starttidspunkt', + error_end_before_start: 'Slutt kan ikke være før start', + ctx_create_event: 'Opprett ny hendelse', + event_readonly: 'Hendelser fra abonnementer kan ikke redigeres', + ha_create_not_supported: 'Hendelser kan ikke opprettes direkte i Home Assistant-kalendere', + rec_label: 'Gjentakelse', + rec_none: 'Ingen', rec_daily: 'Daglig', rec_weekly: 'Ukentlig', + rec_monthly: 'Månedlig', rec_yearly: 'Årlig', rec_custom: 'Tilpasset…', + rec_every: 'Hver', rec_days: 'dager', rec_weeks: 'uker', rec_months: 'måneder', + rec_ends: 'Slutter', rec_never: 'Aldri', rec_after_count: 'Etter antall', + rec_on_date: 'På dato', rec_occurrences: 'gjentakelser', + copy_to_calendar: 'Kopier til…', event_copied: 'Hendelse kopiert', + edit_before_copy: 'Rediger før kopiering', + event_updated: 'Hendelse oppdatert', event_created: 'Hendelse opprettet', + confirm_delete_event: 'Vil du virkelig slette «{title}»?', + confirm_delete_title: 'Slett hendelse', + delete_single: 'Bare denne hendelsen', + delete_all_series: 'Alle hendelser i serien', + event_deleted: 'Hendelse slettet', + error_fill_all: 'Fyll ut alle feltene', + account_added: 'Kontoen «{name}» ble lagt til', + error_enter_name: 'Skriv inn et navn', + calendar_created: 'Kalenderen «{name}» ble opprettet', + // Birthdays + create_event_option: 'Ny hendelse', + birthday_new: 'Ny bursdag', + birthday_modal_title: 'Legg til ny bursdag', + birthday_calendar: 'Bursdagskalender', + birthday_calendar_hint: 'Årlige heldagshendelser med alder og et bursdagsikon.', + birthday_notify: 'Påminnelse', + birthday_notify_off: 'Av', + birthday_notify_same_day: 'Samme dag', + birthday_notify_one_day: '1 dag før', + birthday_notify_days: '{n} dager før', + birthday_person: 'Navn', + birthday_person_ph: 'Personens navn', + birthday_date: 'Bursdag', + birthday_year_unknown: 'År ukjent', + birthday_target: 'Bursdagskalender', + birthday_no_calendars: 'Ingen bursdagskalender ennå. Opprett først en kalender og slå på «Bursdagskalender».', + birthday_created: 'Bursdagen «{name}» ble lagt til', + birthday_calendar_name: 'Bursdager', + birthday_activate: 'Slå på bursdagskalender', + birthday_activate_hint: 'Slå på bursdagskalenderen for å legge inn bursdager. Den vises som en egen kalender i sidepanelet.', + birthday_active: 'Bursdagskalender aktiv', + birthday_year_ph: 'År', + birthday_settings_title: 'Bursdager', + birthday_color_hint: 'Farge og synlighet endrer du i sidepanelet.', + birthday_devices_title: 'Bursdager kommer fra disse enhetene:', + birthday_devices_count: '{n} bursdager', + birthday_calendar_type: 'Bursdagskalender', + birthday_add_btn: '+ Bursdager', + birthday_calendar_exists: 'Bursdagskalenderen finnes allerede', + birthday_settings_hint: 'Opprett en bursdagskalender via «+ Bursdager» ovenfor.', + error_name_url: 'Skriv inn navn og URL', + ical_subscribed: 'Abonnerer nå på «{name}»', + google_synced: 'Kalender synkronisert', + confirm_google_disconnect: 'Vil du virkelig koble fra Google-kontoen?', + google_disconnected: 'Google-konto frakoblet', + error_username_password: 'Brukernavn og passord kreves', + user_created: 'Brukeren «{name}» ble opprettet', + settings_saved: 'Innstillinger lagret', + no_caldav: 'Ingen CalDAV-kontoer tilkoblet.', + profile_saved: 'Profil lagret', + avatar_removed: 'Profilbilde fjernet', + avatar_uploaded: 'Profilbilde lastet opp', + error_pw_mismatch: 'Passordene er ikke like', + error_pw_length: 'Minst 6 tegn', + password_changed: 'Passord endret', + key_copied: 'Nøkkel kopiert', + error_enter_6digit: 'Skriv inn en 6-sifret kode', + totp_enabled: '2FA slått på', totp_disabled: '2FA slått av', + error_enter_password: 'Skriv inn passordet ditt', + confirm_delete_user: 'Slette bruker?', + show_cal: 'Vis', hide_cal: 'Skjul', + remove_cal: 'Fjern kalender', remove_ical_sub: 'Fjern abonnement', + change_color: 'Endre farge', + sync: 'Sync', disconnect: 'Koble fra', + + // Calendar / date + months: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'], + months_short: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'], + days_long: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dow_monday: ['man','tir','ons','tor','fre','lør','søn'], + dow_sunday: ['søn','man','tir','ons','tor','fre','lør'], + dow_index: ['søn','man','tir','ons','tor','fre','lør'], + week_abbr: 'uke', + allday: 'hele dagen', allday_cap: 'Hele dagen', + no_events: 'Ingen hendelser i den viste perioden', + more_events: '+{n} til', + + // Color picker + color_select: 'Velg', + }, + + sv: { + // Common + save: 'Spara', cancel: 'Avbryt', close: 'Stäng', + create: 'Skapa', delete: 'Radera', edit: 'Redigera', + name: 'Namn', username: 'Användarnamn', password: 'Lösenord', + email: 'E-post', color: 'Färg', color_pick: 'Välj färg', + loading: 'Laddar…', connecting: 'Ansluter…', + unknown_error: 'Okänt fel', + + // Setup + setup_title: 'Förstagångsinställning', + setup_subtitle: 'Skapa administratörskontot', + setup_email: 'E-post (valfritt)', + setup_pw_confirm: 'Bekräfta lösenord', + setup_submit: 'Skapa adminkonto', + setup_pw_mismatch: 'Lösenorden stämmer inte överens', + setup_pw_short: 'Lösenordet måste vara minst 6 tecken', + + // Login + login_tagline: 'den minimalistiska kalendern', + login_submit: 'Logga in', + login_2fa_ph: '6-siffrig kod', + + // Topbar + btn_today: 'I dag', + view_month: 'Månad', view_week: 'Vecka', view_day: 'Dag', view_quarter: 'Kvartal', view_agenda: 'Händelser', + btn_profile: 'Profil', btn_logout: 'Logga ut', + + // Sidebar + btn_create: 'Skapa', + my_calendars: 'Mina kalendrar', + add_calendar: 'Lägg till kalender', + cal_local: 'Lokal kalender', cal_caldav: 'CalDAV-konto', + cal_ical: 'Prenumerera på iCal-URL', cal_google: 'Google Kalender', + + // Event modal + event_create_title: 'Skapa händelse', event_edit_title: 'Redigera händelse', + event_title_ph: 'Lägg till titel', event_allday: 'Heldag', + event_start: 'Start', event_end: 'Slut', event_calendar: 'Kalender', + event_location: 'Plats', event_location_ph: 'Lägg till plats', + event_description: 'Beskrivning', event_description_ph: 'Lägg till beskrivning', + + // CalDAV modal + caldav_add_title: 'Lägg till CalDAV-konto', + caldav_display_name: 'Visningsnamn', caldav_display_name_ph: 't.ex. Mitt Nextcloud', + caldav_url: 'CalDAV-URL', caldav_connect: 'Anslut', + + // Local calendar modal + localcal_create_title: 'Skapa lokal kalender', + localcal_name_ph: 't.ex. Privat', + + // iCal modal + ical_title: 'Prenumerera på iCal-URL', ical_name_ph: 't.ex. Helgdagar', + ical_url_label: 'iCal-URL', ical_refresh: 'Uppdateringsintervall', + ical_15min: 'Var 15:e minut', ical_30min: 'Var 30:e minut', + ical_hourly: 'Varje timme', ical_6h: 'Var 6:e timme', ical_daily: 'Dagligen', + ical_subscribe: 'Prenumerera', + + // Settings + settings_title: 'Inställningar', + settings_nav_appearance: 'Utseende', + settings_nav_profile: 'Profil', + settings_nav_view: 'Vy', + settings_nav_calendars: 'Kalendrar', + settings_nav_google: 'Google-konton', + settings_nav_users: 'Användarhantering', + settings_nav_admin: 'Admin', + admin_default_theme: 'Standardtema', + admin_default_theme_desc: 'Gäller alla användare utan egen färg. ”Återställ” på en färg går tillbaka till detta standardtema.', + admin_theme_save: 'Spara standard', + admin_theme_import: 'Importera tema', + admin_theme_imported: '{count} färger importerade – spara för att tillämpa', + admin_theme_discard: 'Förkasta', + admin_theme_saved: 'Standardtema sparat', + admin_logo_dims: 'PNG/JPEG/WebP · visas i max 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (kvadratisk)', + admin_branding: 'Varumärkesprofil', + admin_branding_desc: 'Egen logotyp (uppe till vänster) och favicon för hela instansen. PNG/JPEG/WebP, max 5 MB.', + admin_logo: 'Logotyp', + admin_favicon: 'Favicon', + admin_upload: 'Ladda upp', + admin_remove: 'Ta bort', + admin_brand_default: 'Standard', + admin_branding_saved: 'Varumärkesprofil sparad', + admin_branding_removed: 'Varumärkesprofil borttagen', + settings_sync_all: 'Synkronisera allt', + settings_sync_all_desc: 'Dela dessa inställningar mellan dina enheter', + settings_sync_this: 'Synkronisera mellan enheter', + settings_share_icon: 'Delningsikon', + settings_colors: 'Färger', + settings_primary_color: 'Primärfärg', settings_accent_color: 'Accentfärg', + settings_today_color: 'Färg för i dag', + settings_month_divider_color: 'Skiljelinje mellan månader', + settings_month_label_color: 'Färg på månadsetikett', + settings_text_color: 'Textfärg', + settings_line_color: 'Linjefärg', + settings_bg_color: 'Bakgrundsfärg', + settings_surface_color: 'Sidopanel-/ytfärg', + settings_hover_highlight_color: 'Markering vid hovring (knappar, menyer)', + settings_icon_inactive_color: 'Sidopanelsikoner inaktiva (vilande/av)', + settings_icon_active_color: 'Sidopanelsikoner aktiva (hovring/på)', + settings_day_hover_color: 'Kalenderdag vid hovring', + settings_day_selected_color: 'Vald dag', + settings_day_bg_color: 'Dagens bakgrund', + settings_today_bg_color: 'Bakgrund för i dag', + theme_export: 'Exportera tema', + theme_import: 'Importera tema', + theme_imported: 'Tema importerat – spara för att tillämpa', + theme_imported_saved: '{count} parametrar importerade och sparade', + theme_import_invalid: 'Ogiltig temafil', + theme_docs_hint: 'Förklaring av temaparametrarna', + theme_unknown_title: 'Okända parametrar', + theme_unknown_params: 'Den här temafilen innehåller {count} parametrar som den här versionen inte känner till ({names}). Vill du importera resten ändå?', + theme_import_rest: 'Importera resten', + confirm_generic_title: 'Bekräfta', + confirm: 'OK', + confirm_delete_cal_title: 'Radera kalender', + confirm_remove_ical_title: 'Ta bort prenumeration', + confirm_ha_disconnect: 'Vill du verkligen koppla från Home Assistant-kontot?', + reset: 'Återställ', + settings_text_contrast: 'Textkontrast', + settings_text_contrast_desc: 'Ljusstyrkan på etiketter och text', + contrast_dark: 'Mörk', contrast_medium: 'Medel', + contrast_light: 'Ljus', contrast_max: 'Maximal', + settings_line_contrast: 'Linjekontrast', + settings_line_contrast_desc: 'Synligheten hos kanter och skiljelinjer', + line_barely: 'Knappt', line_subtle: 'Subtil', + line_normal: 'Normal', line_strong: 'Stark', + settings_calendar_view: 'Kalendervy', + settings_default_view: 'Standardvy', + settings_week_start: 'Veckans första dag', + week_start_monday: 'Måndag', week_start_sunday: 'Söndag', + settings_dim_past: 'Tona ned tidigare händelser', + settings_month_mode: 'Månadsbyte', + settings_month_mode_scroll: 'Löpande rullning (vecka)', + settings_month_mode_paged: 'Sida för sida (månad)', + settings_default_duration: 'Standardlängd för händelser', + settings_privacy: 'Integritet', + settings_private_visibility: 'Privata händelser för gruppmedlemmar', + settings_private_visibility_desc: 'Hur dina privata händelser visas för andra gruppmedlemmar', + settings_directory_hidden: 'Dölj min profil (visa mig inte i delnings-/gruppväljare)', + settings_directory_hidden_desc: 'Andra användare kan då inte välja dig för att dela kalendrar med eller lägga till dig i grupper. Du syns fortfarande i administratörens användarhantering.', + private_visibility_busy: 'Visa som ”Upptagen”', + private_visibility_hidden: 'Dölj helt', + created_by: 'Skapad av: {name}', + event_private: 'Privat', + reminders: 'Påminnelser', + reminder_add: 'Lägg till påminnelse', + reminder_at_start: 'Vid starttiden', + reminder_minutes: '{n} minuter innan', + reminder_hour_one: '1 timme innan', + reminder_hours: '{n} timmar innan', + reminder_day_one: '1 dag innan', + reminder_days: '{n} dagar innan', + reminder_week_one: '1 vecka innan', + reminder_weeks: '{n} veckor innan', + reminder_custom: 'Anpassad…', + reminder_unit_minutes: 'minuter', + reminder_unit_hours: 'timmar', + reminder_unit_days: 'dagar', + reminder_unit_weeks: 'veckor', + reminder_before: 'innan', + reminders_calendar_off: 'Påminnelser är avstängda för den här kalendern – de kommer inte att utlösas.', + calendar_reminders_on: 'Påminnelser aktiverade', + calendar_reminders_off: 'Påminnelser avstängda', + copy: 'Kopiera', + caldav_publish: 'Publicera via CalDAV', + caldav_unpublish: 'Sluta publicera via CalDAV', + caldav_published_url: 'CalDAV-URL (utan inloggning):', + caldav_url_copied: 'CalDAV-URL kopierad', + caldav_token_rotate: 'Generera ny token', + caldav_token_rotated: 'Ny token genererad – befintliga prenumerationer måste läggas till på nytt', + caldav_rotate_confirm: 'Vill du generera en ny token? Den nuvarande URL:en slutar fungera och befintliga prenumerationer måste läggas till på nytt med den nya URL:en.', + caldav_hint: 'Alla med den här URL:en kan prenumerera på och redigera den här kalendern — ingen inloggning krävs. Lägg till den i en CalDAV-klient (Apple Kalender, Thunderbird, DAVx5).', + caldav_login_url: 'CalDAV-URL (med inloggning):', + caldav_login_hint: 'Du kan också lägga till ett ”CalDAV-konto” i din klient med den här server-URL:en samt ditt användarnamn och ett applösenord — då hittas alla dina publicerade kalendrar.', + app_pw_title: 'Applösenord (CalDAV)', + app_pw_desc: 'Separata lösenord för CalDAV-klienter. Krävs när 2FA är på, eftersom appar inte kan ange en 2FA-kod. Kan återkallas när som helst.', + app_pw_label_ph: 'Namn (t.ex. iPhone)', + app_pw_create: 'Skapa', + app_pw_new_label: 'Nytt applösenord (visas bara nu):', + app_pw_last_used: 'senast använt', + app_pw_never_used: 'aldrig använt', + app_pw_revoke: 'Återkalla', + app_pw_none: 'Inga applösenord ännu.', + app_pw_copied: 'Applösenord kopierat', + app_pw_revoke_confirm: 'Vill du återkalla det här applösenordet? Klienter som använder det förlorar åtkomsten.', + share: 'Dela', + import: 'Importera', + export: 'Exportera', + importing: 'Importerar…', + import_result: '{imported} importerade, {skipped} överhoppade', + shared_by: 'delad av {name}', + share_title: 'Dela kalender', + share_current: 'Nuvarande delningar', + share_add: 'Lägg till användare', + share_search: 'Sök användare…', + share_none: 'Inte delad ännu', + share_no_users: 'Inga användare hittades', + perm_read: 'Endast läsa', + perm_read_write: 'Läsa och skriva', + remove: 'Ta bort', + done: 'Klar', + groups_title: 'Grupper', + groups_none: 'Inga grupper ännu', + group_create: 'Skapa grupp', + group_manage: 'Hantera grupp', + group_name: 'Namn', + group_name_ph: 'Gruppnamn', + group_members: 'Medlemmar', + group_delete: 'Radera grupp', + group_delete_confirm: 'Vill du verkligen radera den här gruppen och dess gruppkalender?', + group_deleted: 'Grupp raderad', + group_saved: 'Grupp sparad', + group_created: 'Grupp skapad', + group_view_label: 'Gruppvy: {name}', + group_exit: 'Lämna gruppvyn', + group_calendar: 'Gruppkalender', + group_icon: 'Ikon', + group_visible_flag: 'Synlig för dina grupper', + group_new_event: '+ Grupphändelse', + group_member_colors: 'Medlemmarnas färger', + only_owner_color: 'Endast ägaren kan ändra färgen', + upload_too_large: 'Filen är för stor (serverns gräns). Höj uppladdningsgränsen.', + shared_with_me: 'Delade med mig', + settings_calendars: 'Kalendrar', + settings_group_visible: 'Kalender synlig för grupper', + settings_group_visible_desc: 'Välj vilken av dina kalendrar dina gruppmedlemmar kan se', + group_visible_none: 'Ingen', + drag_reorder: 'Dra för att sortera', + profile_account: 'Konto', + profile_display_name: 'Visningsnamn', + profile_display_name_ph: 'Visningsnamn', + profile_login_name: 'Inloggningsnamn', + profile_login_name_desc: 'Med små bokstäver, används för att logga in. Skiljer inte på stora och små bokstäver.', + settings_hour_height: 'Timhöjd (vecko- och dagsvy)', + settings_hour_height_desc: 'Hur mycket plats en timme tar i tidsrutnätet', + hour_compact: 'Kompakt', hour_normal: 'Normal', + hour_comfort: 'Bekväm', hour_large: 'Stor', + settings_language: 'Språk', + settings_hidden_cals: 'Dolda kalendrar', + settings_no_hidden_cals: 'Inga dolda kalendrar', + settings_no_google: 'Inga Google-konton anslutna', + settings_nav_accounts: 'Konton', + settings_accounts_caldav: 'CalDAV-konton', + settings_accounts_local: 'Lokala kalendrar', + settings_accounts_ical: 'iCal-prenumerationer', + settings_accounts_google: 'Google-konton', + settings_no_caldav_accounts: 'Inga CalDAV-konton', + settings_no_local_cals: 'Inga lokala kalendrar', + settings_no_ical_subs: 'Inga prenumerationer', + settings_no_google_accounts: 'Inga Google-konton', + confirm_caldav_disconnect: 'Vill du verkligen koppla från CalDAV-kontot?', + caldav_disconnected: 'CalDAV-konto frånkopplat', + + // User management + users_add: 'Lägg till användare', users_is_admin: 'Administratör', + users_make_admin: 'Gör till admin', users_revoke_admin: 'Återkalla adminbehörighet', + + // Profile + profile_title: 'Profil', profile_upload: 'Ladda upp bild', + profile_remove_avatar: 'Ta bort', + profile_email_ph: 'Ingen e-post angiven', + profile_change_pw: 'Byt lösenord', + profile_pw_current: 'Nuvarande lösenord', profile_pw_new: 'Nytt lösenord', + profile_pw_confirm: 'Bekräfta nytt lösenord', + profile_2fa: 'Tvåfaktorsautentisering', + profile_2fa_disabled_text: '2FA är avstängt. Skydda ditt konto med en autentiseringsapp.', + profile_2fa_setup: 'Konfigurera 2FA', + profile_2fa_scan: 'Skanna QR-koden med din autentiseringsapp (t.ex. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Eller ange den här nyckeln manuellt', + profile_2fa_copy: 'Kopiera', profile_2fa_code_label: 'Ange verifieringskoden', + profile_2fa_ph: '6-siffrig kod', profile_2fa_activate: 'Aktivera', + profile_2fa_enabled_text: '2FA är aktiverat.', + profile_2fa_pw_disable: 'Lösenord för att stänga av', + profile_2fa_disable: 'Stäng av 2FA', + profile_my_calendars: 'Mina kalendrar', + + // Avatar crop + crop_title: 'Välj bildutsnitt', crop_submit: 'Beskär och ladda upp', + + // Impressum + impressum_title: 'Juridisk information', + impressum_desc: 'Programvara och webbutveckling', + impressum_about: 'Den här programvaran har utvecklats och tillhandahållits av Scarriffleservices med största omsorg. Med ensamrätt © 2026 Scarriffleservices.', + impressum_data_title: 'Datalagring', + impressum_data_text: 'Alla applikationsdata lagras och behandlas på den server där denna Calendarr-instans körs. Lagringsplatsen beror därför på den som driver servern. Vid användning av Google Kalender-integrationen utbyts data via Googles API; Googles integritetspolicy gäller för dessa data. Vid användning av Home Assistant-integrationen utbyts data med respektive Home Assistant-instans. Home Assistant är ett projekt inom Open Home Foundation.', + impressum_disclaimer_title: 'Ansvarsfriskrivning', + impressum_disclaimer_text: 'Trots noggrant arbete lämnas ingen garanti för att innehållet är korrekt, fullständigt eller aktuellt. Användning sker på egen risk.', + impressum_contact: 'Kontakt', + + // Toast / confirms + error_load_events: 'Fel vid inläsning av händelser', + error_no_calendars: 'Inga kalendrar', + confirm_delete_local_cal: 'Vill du verkligen radera den lokala kalendern?', + confirm_remove_ical: 'Vill du verkligen ta bort prenumerationen?', + google_not_configured: 'Google OAuth är inte konfigurerat (administratören måste ange GOOGLE_CLIENT_ID/SECRET)', + error_enter_title: 'Ange en titel', + error_enter_date: 'Ange ett datum', + error_enter_start: 'Ange en starttid', + error_end_before_start: 'Slutet kan inte ligga före starten', + ctx_create_event: 'Skapa ny händelse', + event_readonly: 'Händelser från prenumerationer kan inte redigeras', + ha_create_not_supported: 'Händelser kan inte skapas direkt i Home Assistant-kalendrar', + rec_label: 'Upprepning', + rec_none: 'Ingen', rec_daily: 'Dagligen', rec_weekly: 'Varje vecka', + rec_monthly: 'Varje månad', rec_yearly: 'Varje år', rec_custom: 'Anpassad…', + rec_every: 'Var', rec_days: 'dagar', rec_weeks: 'veckor', rec_months: 'månader', + rec_ends: 'Slutar', rec_never: 'Aldrig', rec_after_count: 'Efter antal', + rec_on_date: 'På datum', rec_occurrences: 'tillfällen', + copy_to_calendar: 'Kopiera till…', event_copied: 'Händelse kopierad', + edit_before_copy: 'Redigera före kopiering', + event_updated: 'Händelse uppdaterad', event_created: 'Händelse skapad', + confirm_delete_event: 'Vill du verkligen radera ”{title}”?', + confirm_delete_title: 'Radera händelse', + delete_single: 'Endast den här händelsen', + delete_all_series: 'Alla händelser i serien', + event_deleted: 'Händelse raderad', + error_fill_all: 'Fyll i alla fält', + account_added: 'Kontot ”{name}” lades till', + error_enter_name: 'Ange ett namn', + calendar_created: 'Kalendern ”{name}” skapades', + // Birthdays + create_event_option: 'Ny händelse', + birthday_new: 'Ny födelsedag', + birthday_modal_title: 'Lägg till ny födelsedag', + birthday_calendar: 'Födelsedagskalender', + birthday_calendar_hint: 'Årliga heldagshändelser med ålder och en födelsedagsikon.', + birthday_notify: 'Påminnelse', + birthday_notify_off: 'Av', + birthday_notify_same_day: 'Samma dag', + birthday_notify_one_day: '1 dag innan', + birthday_notify_days: '{n} dagar innan', + birthday_person: 'Namn', + birthday_person_ph: 'Personens namn', + birthday_date: 'Födelsedag', + birthday_year_unknown: 'Okänt år', + birthday_target: 'Födelsedagskalender', + birthday_no_calendars: 'Ingen födelsedagskalender ännu. Skapa först en kalender och aktivera ”Födelsedagskalender”.', + birthday_created: 'Födelsedagen ”{name}” lades till', + birthday_calendar_name: 'Födelsedagar', + birthday_activate: 'Aktivera födelsedagskalender', + birthday_activate_hint: 'Aktivera födelsedagskalendern för att lägga till födelsedagar. Den visas som en egen kalender i sidopanelen.', + birthday_active: 'Födelsedagskalender aktiv', + birthday_year_ph: 'År', + birthday_settings_title: 'Födelsedagar', + birthday_color_hint: 'Färg och synlighet ändrar du i sidopanelen.', + birthday_devices_title: 'Födelsedagar kommer från de här enheterna:', + birthday_devices_count: '{n} födelsedagar', + birthday_calendar_type: 'Födelsedagskalender', + birthday_add_btn: '+ Födelsedagar', + birthday_calendar_exists: 'Födelsedagskalendern finns redan', + birthday_settings_hint: 'Skapa en födelsedagskalender via ”+ Födelsedagar” ovan.', + error_name_url: 'Ange namn och URL', + ical_subscribed: 'Prenumererar nu på ”{name}”', + google_synced: 'Kalender synkroniserad', + confirm_google_disconnect: 'Vill du verkligen koppla från Google-kontot?', + google_disconnected: 'Google-konto frånkopplat', + error_username_password: 'Användarnamn och lösenord krävs', + user_created: 'Användaren ”{name}” skapades', + settings_saved: 'Inställningar sparade', + no_caldav: 'Inga CalDAV-konton anslutna.', + profile_saved: 'Profil sparad', + avatar_removed: 'Profilbild borttagen', + avatar_uploaded: 'Profilbild uppladdad', + error_pw_mismatch: 'Lösenorden stämmer inte överens', + error_pw_length: 'Minst 6 tecken', + password_changed: 'Lösenord ändrat', + key_copied: 'Nyckel kopierad', + error_enter_6digit: 'Ange en 6-siffrig kod', + totp_enabled: '2FA aktiverat', totp_disabled: '2FA avstängt', + error_enter_password: 'Ange ditt lösenord', + confirm_delete_user: 'Radera användaren?', + show_cal: 'Visa', hide_cal: 'Dölj', + remove_cal: 'Ta bort kalender', remove_ical_sub: 'Ta bort prenumeration', + change_color: 'Ändra färg', + sync: 'Sync', disconnect: 'Koppla från', + + // Calendar / date + months: ['januari','februari','mars','april','maj','juni','juli','augusti','september','oktober','november','december'], + months_short: ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'], + days_long: ['söndag','måndag','tisdag','onsdag','torsdag','fredag','lördag'], + dow_monday: ['mån','tis','ons','tor','fre','lör','sön'], + dow_sunday: ['sön','mån','tis','ons','tor','fre','lör'], + dow_index: ['sön','mån','tis','ons','tor','fre','lör'], + week_abbr: 'v.', + allday: 'heldag', allday_cap: 'Heldag', + no_events: 'Inga händelser under den visade perioden', + more_events: '+{n} till', + + // Color picker + color_select: 'Välj', + }, + + fi: { + // Common + save: 'Tallenna', cancel: 'Peruuta', close: 'Sulje', + create: 'Luo', delete: 'Poista', edit: 'Muokkaa', + name: 'Nimi', username: 'Käyttäjätunnus', password: 'Salasana', + email: 'Sähköposti', color: 'Väri', color_pick: 'Valitse väri', + loading: 'Ladataan…', connecting: 'Yhdistetään…', + unknown_error: 'Tuntematon virhe', + + // Setup + setup_title: 'Alkumääritys', + setup_subtitle: 'Luo ylläpitäjän tili', + setup_email: 'Sähköposti (valinnainen)', + setup_pw_confirm: 'Vahvista salasana', + setup_submit: 'Luo ylläpitäjän tili', + setup_pw_mismatch: 'Salasanat eivät täsmää', + setup_pw_short: 'Salasanassa on oltava vähintään 6 merkkiä', + + // Login + login_tagline: 'minimalistinen kalenteri', + login_submit: 'Kirjaudu sisään', + login_2fa_ph: '6-numeroinen koodi', + + // Topbar + btn_today: 'Tänään', + view_month: 'Kuukausi', view_week: 'Viikko', view_day: 'Päivä', view_quarter: 'Neljännes', view_agenda: 'Tapahtumat', + btn_profile: 'Profiili', btn_logout: 'Kirjaudu ulos', + + // Sidebar + btn_create: 'Luo', + my_calendars: 'Omat kalenterit', + add_calendar: 'Lisää kalenteri', + cal_local: 'Paikallinen kalenteri', cal_caldav: 'CalDAV-tili', + cal_ical: 'Tilaa iCal-osoite', cal_google: 'Google-kalenteri', + + // Event modal + event_create_title: 'Luo tapahtuma', event_edit_title: 'Muokkaa tapahtumaa', + event_title_ph: 'Lisää otsikko', event_allday: 'Koko päivä', + event_start: 'Alkaa', event_end: 'Päättyy', event_calendar: 'Kalenteri', + event_location: 'Paikka', event_location_ph: 'Lisää paikka', + event_description: 'Kuvaus', event_description_ph: 'Lisää kuvaus', + + // CalDAV modal + caldav_add_title: 'Lisää CalDAV-tili', + caldav_display_name: 'Näyttönimi', caldav_display_name_ph: 'esim. Oma Nextcloud', + caldav_url: 'CalDAV-osoite', caldav_connect: 'Yhdistä', + + // Local calendar modal + localcal_create_title: 'Luo paikallinen kalenteri', + localcal_name_ph: 'esim. Henkilökohtainen', + + // iCal modal + ical_title: 'Tilaa iCal-osoite', ical_name_ph: 'esim. Pyhäpäivät', + ical_url_label: 'iCal-osoite', ical_refresh: 'Päivitysväli', + ical_15min: '15 minuutin välein', ical_30min: '30 minuutin välein', + ical_hourly: 'Tunnin välein', ical_6h: '6 tunnin välein', ical_daily: 'Päivittäin', + ical_subscribe: 'Tilaa', + + // Settings + settings_title: 'Asetukset', + settings_nav_appearance: 'Ulkoasu', + settings_nav_profile: 'Profiili', + settings_nav_view: 'Näkymä', + settings_nav_calendars: 'Kalenterit', + settings_nav_google: 'Google-tilit', + settings_nav_users: 'Käyttäjien hallinta', + settings_nav_admin: 'Ylläpito', + admin_default_theme: 'Oletusteema', + admin_default_theme_desc: 'Koskee kaikkia käyttäjiä, joilla ei ole omaa väriä. Värin ”Palauta” palaa tähän oletukseen.', + admin_theme_save: 'Tallenna oletus', + admin_theme_import: 'Tuo teema', + admin_theme_imported: '{count} väriä tuotu – tallenna ottaaksesi käyttöön', + admin_theme_discard: 'Hylkää', + admin_theme_saved: 'Oletusteema tallennettu', + admin_logo_dims: 'PNG/JPEG/WebP · näytetään enintään 150 × 40 px', + admin_favicon_dims: 'PNG/JPEG/WebP · 128 × 128 px (neliö)', + admin_branding: 'Brändäys', + admin_branding_desc: 'Oma logo (vasemmalla ylhäällä) ja favicon koko instanssille. PNG/JPEG/WebP, enintään 5 Mt.', + admin_logo: 'Logo', + admin_favicon: 'Favicon', + admin_upload: 'Lataa', + admin_remove: 'Poista', + admin_brand_default: 'Oletus', + admin_branding_saved: 'Brändäys tallennettu', + admin_branding_removed: 'Brändäys poistettu', + settings_sync_all: 'Synkronoi kaikki', + settings_sync_all_desc: 'Jaa nämä asetukset laitteidesi välillä', + settings_sync_this: 'Synkronoi laitteiden välillä', + settings_share_icon: 'Jakokuvake', + settings_colors: 'Värit', + settings_primary_color: 'Pääväri', settings_accent_color: 'Korostusväri', + settings_today_color: 'Tämän päivän väri', + settings_month_divider_color: 'Kuukausien erotinviiva', + settings_month_label_color: 'Kuukausimerkinnän väri', + settings_text_color: 'Tekstin väri', + settings_line_color: 'Viivojen väri', + settings_bg_color: 'Taustaväri', + settings_surface_color: 'Sivupalkin / pinnan väri', + settings_hover_highlight_color: 'Korostus osoitettaessa (painikkeet, valikot)', + settings_icon_inactive_color: 'Sivupalkin kuvakkeet passiivisina (lepotila)', + settings_icon_active_color: 'Sivupalkin kuvakkeet aktiivisina (osoitus/päällä)', + settings_day_hover_color: 'Kalenteripäivä osoitettaessa', + settings_day_selected_color: 'Valittu päivä', + settings_day_bg_color: 'Päivän tausta', + settings_today_bg_color: 'Tämän päivän tausta', + theme_export: 'Vie teema', + theme_import: 'Tuo teema', + theme_imported: 'Teema tuotu – tallenna ottaaksesi käyttöön', + theme_imported_saved: '{count} parametria tuotu ja tallennettu', + theme_import_invalid: 'Virheellinen teematiedosto', + theme_docs_hint: 'Teemaparametrien selitykset', + theme_unknown_title: 'Tuntemattomat parametrit', + theme_unknown_params: 'Tämä teematiedosto sisältää {count} parametria, joita tämä versio ei tunne ({names}). Tuodaanko loput silti?', + theme_import_rest: 'Tuo loput', + confirm_generic_title: 'Vahvista', + confirm: 'OK', + confirm_delete_cal_title: 'Poista kalenteri', + confirm_remove_ical_title: 'Poista tilaus', + confirm_ha_disconnect: 'Katkaistaanko Home Assistant -tilin yhteys?', + reset: 'Palauta', + settings_text_contrast: 'Tekstin kontrasti', + settings_text_contrast_desc: 'Nimikkeiden ja tekstien kirkkaus', + contrast_dark: 'Tumma', contrast_medium: 'Keskitaso', + contrast_light: 'Vaalea', contrast_max: 'Suurin', + settings_line_contrast: 'Viivojen kontrasti', + settings_line_contrast_desc: 'Reunojen ja erottimien näkyvyys', + line_barely: 'Tuskin', line_subtle: 'Hienovarainen', + line_normal: 'Normaali', line_strong: 'Vahva', + settings_calendar_view: 'Kalenterinäkymä', + settings_default_view: 'Oletusnäkymä', + settings_week_start: 'Viikon ensimmäinen päivä', + week_start_monday: 'Maanantai', week_start_sunday: 'Sunnuntai', + settings_dim_past: 'Himmennä menneet tapahtumat', + settings_month_mode: 'Kuukauden vaihto', + settings_month_mode_scroll: 'Jatkuva vieritys (viikko)', + settings_month_mode_paged: 'Sivu kerrallaan (kuukausi)', + settings_default_duration: 'Tapahtuman oletuskesto', + settings_privacy: 'Yksityisyys', + settings_private_visibility: 'Yksityiset tapahtumat ryhmän jäsenille', + settings_private_visibility_desc: 'Miten yksityiset tapahtumasi näkyvät muille ryhmän jäsenille', + settings_directory_hidden: 'Piilota profiilini (älä näytä minua jako-/ryhmävalinnoissa)', + settings_directory_hidden_desc: 'Muut käyttäjät eivät tällöin voi valita sinua kalenterien jakamiseen eivätkä lisätä sinua ryhmiin. Pysyt näkyvissä ylläpidon käyttäjähallinnassa.', + private_visibility_busy: 'Näytä tilassa ”Varattu”', + private_visibility_hidden: 'Piilota kokonaan', + created_by: 'Luonut: {name}', + event_private: 'Yksityinen', + reminders: 'Muistutukset', + reminder_add: 'Lisää muistutus', + reminder_at_start: 'Alkamisajankohtana', + reminder_minutes: '{n} minuuttia ennen', + reminder_hour_one: '1 tunti ennen', + reminder_hours: '{n} tuntia ennen', + reminder_day_one: '1 päivä ennen', + reminder_days: '{n} päivää ennen', + reminder_week_one: '1 viikko ennen', + reminder_weeks: '{n} viikkoa ennen', + reminder_custom: 'Mukautettu…', + reminder_unit_minutes: 'minuuttia', + reminder_unit_hours: 'tuntia', + reminder_unit_days: 'päivää', + reminder_unit_weeks: 'viikkoa', + reminder_before: 'ennen', + reminders_calendar_off: 'Muistutukset on poistettu käytöstä tässä kalenterissa – niitä ei laukaista.', + calendar_reminders_on: 'Muistutukset käytössä', + calendar_reminders_off: 'Muistutukset pois käytöstä', + copy: 'Kopioi', + caldav_publish: 'Julkaise CalDAV:n kautta', + caldav_unpublish: 'Lopeta CalDAV-julkaisu', + caldav_published_url: 'CalDAV-osoite (ilman kirjautumista):', + caldav_url_copied: 'CalDAV-osoite kopioitu', + caldav_token_rotate: 'Luo uusi token', + caldav_token_rotated: 'Uusi token luotu – olemassa olevat tilaukset on määritettävä uudelleen', + caldav_rotate_confirm: 'Luodaanko uusi token? Nykyinen osoite lakkaa toimimasta ja olemassa olevat tilaukset on määritettävä uudelleen uudella osoitteella.', + caldav_hint: 'Kuka tahansa, jolla on tämä osoite, voi tilata ja muokata tätä kalenteria — kirjautumista ei tarvita. Lisää se CalDAV-yhteensopivaan sovellukseen (Apple Kalenteri, Thunderbird, DAVx5).', + caldav_login_url: 'CalDAV-osoite (kirjautumisella):', + caldav_login_hint: 'Vaihtoehtoisesti voit lisätä sovellukseesi ”CalDAV-tilin” tällä palvelinosoitteella sekä käyttäjätunnuksellasi ja sovellussalasanalla — tällöin kaikki julkaisemasi kalenterit löytyvät.', + app_pw_title: 'Sovellussalasanat (CalDAV)', + app_pw_desc: 'Erilliset salasanat CalDAV-sovelluksille. Tarpeen, kun 2FA on käytössä, koska sovellukset eivät voi syöttää 2FA-koodia. Peruutettavissa milloin tahansa.', + app_pw_label_ph: 'Nimi (esim. iPhone)', + app_pw_create: 'Luo', + app_pw_new_label: 'Uusi sovellussalasana (näkyy vain nyt):', + app_pw_last_used: 'viimeksi käytetty', + app_pw_never_used: 'ei koskaan käytetty', + app_pw_revoke: 'Peruuta', + app_pw_none: 'Ei vielä sovellussalasanoja.', + app_pw_copied: 'Sovellussalasana kopioitu', + app_pw_revoke_confirm: 'Peruutetaanko tämä sovellussalasana? Sitä käyttävät sovellukset menettävät pääsyn.', + share: 'Jaa', + import: 'Tuo', + export: 'Vie', + importing: 'Tuodaan…', + import_result: '{imported} tuotu, {skipped} ohitettu', + shared_by: 'jakanut {name}', + share_title: 'Jaa kalenteri', + share_current: 'Nykyiset jaot', + share_add: 'Lisää käyttäjä', + share_search: 'Hae käyttäjiä…', + share_none: 'Ei vielä jaettu', + share_no_users: 'Käyttäjiä ei löytynyt', + perm_read: 'Vain luku', + perm_read_write: 'Luku ja kirjoitus', + remove: 'Poista', + done: 'Valmis', + groups_title: 'Ryhmät', + groups_none: 'Ei vielä ryhmiä', + group_create: 'Luo ryhmä', + group_manage: 'Hallitse ryhmää', + group_name: 'Nimi', + group_name_ph: 'Ryhmän nimi', + group_members: 'Jäsenet', + group_delete: 'Poista ryhmä', + group_delete_confirm: 'Poistetaanko tämä ryhmä ja sen ryhmäkalenteri?', + group_deleted: 'Ryhmä poistettu', + group_saved: 'Ryhmä tallennettu', + group_created: 'Ryhmä luotu', + group_view_label: 'Ryhmänäkymä: {name}', + group_exit: 'Poistu ryhmänäkymästä', + group_calendar: 'Ryhmäkalenteri', + group_icon: 'Kuvake', + group_visible_flag: 'Näkyy ryhmillesi', + group_new_event: '+ Ryhmätapahtuma', + group_member_colors: 'Jäsenten värit', + only_owner_color: 'Vain omistaja voi vaihtaa värin', + upload_too_large: 'Tiedosto on liian suuri (palvelimen raja). Nosta latausrajaa.', + shared_with_me: 'Jaettu kanssani', + settings_calendars: 'Kalenterit', + settings_group_visible: 'Ryhmille näkyvä kalenteri', + settings_group_visible_desc: 'Valitse, minkä kalentereistasi ryhmäsi jäsenet näkevät', + group_visible_none: 'Ei mikään', + drag_reorder: 'Järjestä vetämällä', + profile_account: 'Tili', + profile_display_name: 'Näyttönimi', + profile_display_name_ph: 'Näyttönimi', + profile_login_name: 'Kirjautumisnimi', + profile_login_name_desc: 'Pienillä kirjaimilla, käytetään kirjautumiseen. Kirjainkoolla ei ole väliä.', + settings_hour_height: 'Tunnin korkeus (viikko- ja päivänäkymä)', + settings_hour_height_desc: 'Kuinka paljon tilaa yksi tunti vie aikaruudukossa', + hour_compact: 'Tiivis', hour_normal: 'Normaali', + hour_comfort: 'Väljä', hour_large: 'Suuri', + settings_language: 'Kieli', + settings_hidden_cals: 'Piilotetut kalenterit', + settings_no_hidden_cals: 'Ei piilotettuja kalentereita', + settings_no_google: 'Ei yhdistettyjä Google-tilejä', + settings_nav_accounts: 'Tilit', + settings_accounts_caldav: 'CalDAV-tilit', + settings_accounts_local: 'Paikalliset kalenterit', + settings_accounts_ical: 'iCal-tilaukset', + settings_accounts_google: 'Google-tilit', + settings_no_caldav_accounts: 'Ei CalDAV-tilejä', + settings_no_local_cals: 'Ei paikallisia kalentereita', + settings_no_ical_subs: 'Ei tilauksia', + settings_no_google_accounts: 'Ei Google-tilejä', + confirm_caldav_disconnect: 'Katkaistaanko CalDAV-tilin yhteys?', + caldav_disconnected: 'CalDAV-tilin yhteys katkaistu', + + // User management + users_add: 'Lisää käyttäjä', users_is_admin: 'Ylläpitäjä', + users_make_admin: 'Tee ylläpitäjäksi', users_revoke_admin: 'Poista ylläpito-oikeudet', + + // Profile + profile_title: 'Profiili', profile_upload: 'Lataa kuva', + profile_remove_avatar: 'Poista', + profile_email_ph: 'Sähköpostia ei ole asetettu', + profile_change_pw: 'Vaihda salasana', + profile_pw_current: 'Nykyinen salasana', profile_pw_new: 'Uusi salasana', + profile_pw_confirm: 'Vahvista uusi salasana', + profile_2fa: 'Kaksivaiheinen tunnistautuminen', + profile_2fa_disabled_text: '2FA ei ole käytössä. Suojaa tilisi todennussovelluksella.', + profile_2fa_setup: 'Ota 2FA käyttöön', + profile_2fa_scan: 'Skannaa QR-koodi todennussovelluksellasi (esim. Bitwarden, Google Authenticator).', + profile_2fa_manual: 'Tai syötä tämä avain käsin', + profile_2fa_copy: 'Kopioi', profile_2fa_code_label: 'Syötä vahvistuskoodi', + profile_2fa_ph: '6-numeroinen koodi', profile_2fa_activate: 'Aktivoi', + profile_2fa_enabled_text: '2FA on käytössä.', + profile_2fa_pw_disable: 'Salasana käytöstä poistamiseen', + profile_2fa_disable: 'Poista 2FA käytöstä', + profile_my_calendars: 'Omat kalenterit', + + // Avatar crop + crop_title: 'Valitse kuvan rajaus', crop_submit: 'Rajaa ja lataa', + + // Impressum + impressum_title: 'Oikeudelliset tiedot', + impressum_desc: 'Ohjelmisto- ja verkkokehitys', + impressum_about: 'Tämän ohjelmiston on kehittänyt ja toimittanut Scarriffleservices suurella huolellisuudella. Kaikki oikeudet pidätetään © 2026 Scarriffleservices.', + impressum_data_title: 'Tietojen tallennus', + impressum_data_text: 'Kaikki sovelluksen tiedot tallennetaan ja käsitellään palvelimella, jolla tämä Calendarr-instanssi toimii. Tallennuspaikka riippuu siis kyseisen palvelimen ylläpitäjästä. Google-kalenteriyhteyttä käytettäessä tietoja vaihdetaan Googlen rajapinnan kautta; näihin tietoihin sovelletaan Googlen tietosuojakäytäntöä. Home Assistant -yhteyttä käytettäessä tietoja vaihdetaan kyseisen Home Assistant -instanssin kanssa. Home Assistant on Open Home Foundationin projekti.', + impressum_disclaimer_title: 'Vastuuvapauslauseke', + impressum_disclaimer_text: 'Huolellisesta laatimisesta huolimatta sisällön oikeellisuudesta, täydellisyydestä tai ajantasaisuudesta ei anneta takuuta. Käyttö tapahtuu omalla vastuulla.', + impressum_contact: 'Yhteystiedot', + + // Toast / confirms + error_load_events: 'Virhe tapahtumia ladattaessa', + error_no_calendars: 'Ei kalentereita', + confirm_delete_local_cal: 'Poistetaanko paikallinen kalenteri?', + confirm_remove_ical: 'Poistetaanko tilaus?', + google_not_configured: 'Google OAuth ei ole määritetty (ylläpitäjän on asetettava GOOGLE_CLIENT_ID/SECRET)', + error_enter_title: 'Syötä otsikko', + error_enter_date: 'Syötä päivämäärä', + error_enter_start: 'Syötä alkamisaika', + error_end_before_start: 'Päättymisaika ei voi olla ennen alkamisaikaa', + ctx_create_event: 'Luo uusi tapahtuma', + event_readonly: 'Tilattuja tapahtumia ei voi muokata', + ha_create_not_supported: 'Tapahtumia ei voi luoda suoraan Home Assistant -kalentereihin', + rec_label: 'Toisto', + rec_none: 'Ei toistoa', rec_daily: 'Päivittäin', rec_weekly: 'Viikoittain', + rec_monthly: 'Kuukausittain', rec_yearly: 'Vuosittain', rec_custom: 'Mukautettu…', + rec_every: 'Joka', rec_days: 'päivä', rec_weeks: 'viikko', rec_months: 'kuukausi', + rec_ends: 'Päättyy', rec_never: 'Ei koskaan', rec_after_count: 'Määrän jälkeen', + rec_on_date: 'Päivämääränä', rec_occurrences: 'kertaa', + copy_to_calendar: 'Kopioi kohteeseen…', event_copied: 'Tapahtuma kopioitu', + edit_before_copy: 'Muokkaa ennen kopiointia', + event_updated: 'Tapahtuma päivitetty', event_created: 'Tapahtuma luotu', + confirm_delete_event: 'Poistetaanko ”{title}”?', + confirm_delete_title: 'Poista tapahtuma', + delete_single: 'Vain tämä tapahtuma', + delete_all_series: 'Kaikki sarjan tapahtumat', + event_deleted: 'Tapahtuma poistettu', + error_fill_all: 'Täytä kaikki kentät', + account_added: 'Tili ”{name}” lisätty', + error_enter_name: 'Syötä nimi', + calendar_created: 'Kalenteri ”{name}” luotu', + // Birthdays + create_event_option: 'Uusi tapahtuma', + birthday_new: 'Uusi syntymäpäivä', + birthday_modal_title: 'Lisää uusi syntymäpäivä', + birthday_calendar: 'Syntymäpäiväkalenteri', + birthday_calendar_hint: 'Vuosittaisia koko päivän tapahtumia, joissa on ikä ja syntymäpäiväkuvake.', + birthday_notify: 'Muistutus', + birthday_notify_off: 'Pois', + birthday_notify_same_day: 'Samana päivänä', + birthday_notify_one_day: '1 päivä ennen', + birthday_notify_days: '{n} päivää ennen', + birthday_person: 'Nimi', + birthday_person_ph: 'Henkilön nimi', + birthday_date: 'Syntymäpäivä', + birthday_year_unknown: 'Vuosi tuntematon', + birthday_target: 'Syntymäpäiväkalenteri', + birthday_no_calendars: 'Syntymäpäiväkalenteria ei ole. Luo ensin kalenteri ja ota käyttöön ”Syntymäpäiväkalenteri”.', + birthday_created: 'Syntymäpäivä ”{name}” lisätty', + birthday_calendar_name: 'Syntymäpäivät', + birthday_activate: 'Ota syntymäpäiväkalenteri käyttöön', + birthday_activate_hint: 'Ota syntymäpäiväkalenteri käyttöön lisätäksesi syntymäpäiviä. Se näkyy omana kalenterinaan sivupalkissa.', + birthday_active: 'Syntymäpäiväkalenteri käytössä', + birthday_year_ph: 'Vuosi', + birthday_settings_title: 'Syntymäpäivät', + birthday_color_hint: 'Väriä ja näkyvyyttä muutat sivupalkissa.', + birthday_devices_title: 'Syntymäpäivät tulevat näistä laitteista:', + birthday_devices_count: '{n} syntymäpäivää', + birthday_calendar_type: 'Syntymäpäiväkalenteri', + birthday_add_btn: '+ Syntymäpäivät', + birthday_calendar_exists: 'Syntymäpäiväkalenteri on jo olemassa', + birthday_settings_hint: 'Luo syntymäpäiväkalenteri yllä olevalla ”+ Syntymäpäivät” -painikkeella.', + error_name_url: 'Syötä nimi ja osoite', + ical_subscribed: 'Tilattu ”{name}”', + google_synced: 'Kalenteri synkronoitu', + confirm_google_disconnect: 'Katkaistaanko Google-tilin yhteys?', + google_disconnected: 'Google-tilin yhteys katkaistu', + error_username_password: 'Käyttäjätunnus ja salasana vaaditaan', + user_created: 'Käyttäjä ”{name}” luotu', + settings_saved: 'Asetukset tallennettu', + no_caldav: 'Ei yhdistettyjä CalDAV-tilejä.', + profile_saved: 'Profiili tallennettu', + avatar_removed: 'Profiilikuva poistettu', + avatar_uploaded: 'Profiilikuva ladattu', + error_pw_mismatch: 'Salasanat eivät täsmää', + error_pw_length: 'Vähintään 6 merkkiä', + password_changed: 'Salasana vaihdettu', + key_copied: 'Avain kopioitu', + error_enter_6digit: 'Syötä 6-numeroinen koodi', + totp_enabled: '2FA käytössä', totp_disabled: '2FA pois käytöstä', + error_enter_password: 'Syötä salasanasi', + confirm_delete_user: 'Poistetaanko käyttäjä?', + show_cal: 'Näytä', hide_cal: 'Piilota', + remove_cal: 'Poista kalenteri', remove_ical_sub: 'Poista tilaus', + change_color: 'Vaihda väri', + sync: 'Sync', disconnect: 'Katkaise yhteys', + + // Calendar / date + months: ['tammikuu','helmikuu','maaliskuu','huhtikuu','toukokuu','kesäkuu','heinäkuu','elokuu','syyskuu','lokakuu','marraskuu','joulukuu'], + months_short: ['tammi','helmi','maalis','huhti','touko','kesä','heinä','elo','syys','loka','marras','joulu'], + days_long: ['sunnuntai','maanantai','tiistai','keskiviikko','torstai','perjantai','lauantai'], + dow_monday: ['ma','ti','ke','to','pe','la','su'], + dow_sunday: ['su','ma','ti','ke','to','pe','la'], + dow_index: ['su','ma','ti','ke','to','pe','la'], + week_abbr: 'vk', + allday: 'koko päivä', allday_cap: 'Koko päivä', + no_events: 'Ei tapahtumia näytetyllä ajanjaksolla', + more_events: '+{n} lisää', + + // Color picker + color_select: 'Valitse', }, }; +// The single source of truth for every selectable language. Adding one means +// exactly two things: an entry here plus a dictionary in `translations` above. +// `code` is what we store (settings, localStorage); `locale` is the BCP-47 tag +// for Intl/toLocale* formatting. They differ where the code is not a valid +// language tag — 'ch' is Swiss German, but "ch" alone is a country, not a +// language, so it must never be handed to Intl directly. +export const LANGUAGES = [ + { code: 'de', label: 'Deutsch', locale: 'de-DE' }, + { code: 'ch', label: 'Schwiizerdütsch', locale: 'de-CH' }, + { code: 'en', label: 'English', locale: 'en-GB' }, + { code: 'fr', label: 'Français', locale: 'fr-FR' }, + { code: 'it', label: 'Italiano', locale: 'it-IT' }, + { code: 'nl', label: 'Nederlands', locale: 'nl-NL' }, + { code: 'da', label: 'Dansk', locale: 'da-DK' }, + { code: 'no', label: 'Norsk', locale: 'nb-NO' }, + { code: 'sv', label: 'Svenska', locale: 'sv-SE' }, + { code: 'fi', label: 'Suomi', locale: 'fi-FI' }, +]; + +const DEFAULT_LANG = 'de'; +// A key missing from the active language is looked up here before we give up. +// English first: for a Finnish or Danish user an English label beats a German one. +const FALLBACK_CHAIN = ['en', DEFAULT_LANG]; + +const LANG_BY_CODE = new Map(LANGUAGES.map(l => [l.code, l])); + +/** True for a code that is both registered and actually translated. */ +export function isLang(code) { return LANG_BY_CODE.has(code) && !!translations[code]; } + let currentLang = (() => { - try { const l = localStorage.getItem('lang'); return (l && translations[l]) ? l : 'de'; } catch (_) { return 'de'; } + try { const l = localStorage.getItem('lang'); return isLang(l) ? l : DEFAULT_LANG; } catch (_) { return DEFAULT_LANG; } })(); export function getLang() { return currentLang; } +/** BCP-47 tag for date/time formatting — pass this to Intl, never getLang(). */ +export function getLocale() { + return (LANG_BY_CODE.get(currentLang) ?? LANG_BY_CODE.get(DEFAULT_LANG)).locale; +} + export function setLang(lang) { - currentLang = (lang && translations[lang]) ? lang : 'de'; - document.documentElement.lang = currentLang; + currentLang = isLang(lang) ? lang : DEFAULT_LANG; + document.documentElement.lang = getLocale(); try { localStorage.setItem('lang', currentLang); } catch (_) {} applyLang(); } +/** Active language, then the fallback chain. undefined if nobody defines the key. */ +function lookup(key) { + const dict = translations[currentLang]; + if (dict && dict[key] !== undefined) return dict[key]; + for (const code of FALLBACK_CHAIN) { + const d = translations[code]; + if (d && d[key] !== undefined) return d[key]; + } + return undefined; +} + export function t(key, vars = {}) { - const dict = translations[currentLang] ?? translations.de; - const val = dict[key] ?? translations.de[key] ?? key; + const val = lookup(key); + if (val === undefined) return key; if (typeof val !== 'string') return val; return val.replace(/\{(\w+)\}/g, (_, k) => vars[k] ?? ''); } -// Look up a translation but return null if the key is undefined in both -// the current language and German. Lets callers fall back to the existing -// HTML default rather than displaying the raw key. +// Look up a translation but return null if the key is undefined everywhere. +// Lets callers fall back to the existing HTML default rather than displaying +// the raw key. function tOrNull(key) { - const dict = translations[currentLang] ?? translations.de; - const val = dict[key] ?? translations.de[key]; + const val = lookup(key); return typeof val === 'string' ? val : null; } diff --git a/frontend/js/settings-sync.js b/frontend/js/settings-sync.js index bff5fa5..84b6566 100644 --- a/frontend/js/settings-sync.js +++ b/frontend/js/settings-sync.js @@ -5,6 +5,8 @@ // syncable value so that "not synced" works per browser, plus the declarative // table definition the settings UI renders from. See backend/SETTINGS_SYNC.md. +import { LANGUAGES } from './i18n.js'; + // Canonical default colours — the single source for the web. Reset writes these. export const DEFAULT_COLORS = { primary_color: '#58B900', @@ -59,9 +61,11 @@ export const SETTING_GROUPS = [ { titleKey: 'settings_language', rows: [ - { key: 'language', labelKey: 'settings_language', type: 'select', opts: [ - { v: 'de', label: 'Deutsch' }, { v: 'en', label: 'English' }, - ] }, + // Derived from the i18n registry: adding a language there adds it here. + // Each language is listed under its own endonym, so the labels are never + // translated — a Finn looks for "Suomi", not "Finnisch". + { key: 'language', labelKey: 'settings_language', type: 'select', + opts: LANGUAGES.map(l => ({ v: l.code, label: l.label })) }, { key: 'share_calendar_icon', labelKey: 'settings_share_icon', type: 'icon' }, ], }, diff --git a/frontend/js/utils.js b/frontend/js/utils.js index 972d550..03e1022 100644 --- a/frontend/js/utils.js +++ b/frontend/js/utils.js @@ -1,4 +1,5 @@ import { DEFAULT_COLORS, INSTANCE_DEFAULTS, baseColor } from './settings-sync.js'; +import { getLocale } from './i18n.js'; export function isToday(d) { const now = new Date(); @@ -39,7 +40,7 @@ export function birthdayIconSvg() { } export function formatDate(d, opts = {}) { - return d.toLocaleDateString('de', opts); + return d.toLocaleDateString(getLocale(), opts); } export function dateKey(d) { diff --git a/frontend/js/views/agenda.js b/frontend/js/views/agenda.js index 753bd89..fdb52ae 100644 --- a/frontend/js/views/agenda.js +++ b/frontend/js/views/agenda.js @@ -1,5 +1,5 @@ import { isPast, eventTitle, birthdayIconSvg } from '../utils.js'; -import { t, getLang } from '../i18n.js'; +import { t, getLocale } from '../i18n.js'; export function renderAgenda(container, currentDate, events, onEventClick) { if (!events.length) { @@ -94,7 +94,7 @@ function isTodayDate(d) { } function fmtTime(d) { - return d.toLocaleTimeString(getLang(), { hour: '2-digit', minute: '2-digit' }); + return d.toLocaleTimeString(getLocale(), { hour: '2-digit', minute: '2-digit' }); } function escHtml(s) { diff --git a/frontend/js/views/month.js b/frontend/js/views/month.js index b4956f9..5588dde 100644 --- a/frontend/js/views/month.js +++ b/frontend/js/views/month.js @@ -1,5 +1,5 @@ import { isToday, isPast, isSameDay, dayOfWeek, weekStart, getISOWeekNumber, eventTitle, birthdayIconSvg } from '../utils.js'; -import { t } from '../i18n.js'; +import { t, getLocale } from '../i18n.js'; const LANE_H = 20; // px per lane (event height 18px + 2px gap) const DAY_H = 30; // day-number row height @@ -251,7 +251,7 @@ function dateKey(d) { } function fmtTime(d) { - return d.toLocaleTimeString('de', { hour: '2-digit', minute: '2-digit' }); + return d.toLocaleTimeString(getLocale(), { hour: '2-digit', minute: '2-digit' }); } function escHtml(s) { diff --git a/frontend/js/views/week.js b/frontend/js/views/week.js index a3c56f5..3b00640 100644 --- a/frontend/js/views/week.js +++ b/frontend/js/views/week.js @@ -1,5 +1,5 @@ import { isToday, isPast, dayOfWeek, weekStart, getISOWeekNumber, eventTitle, birthdayIconSvg } from '../utils.js'; -import { t } from '../i18n.js'; +import { t, getLocale } from '../i18n.js'; export function renderWeek(container, currentDate, events, onSlotClick, onEventClick, isSingleDay = false, weekStartDay = 'monday', hourH = 60) { // Build the days array (7 days for week, 1 for day) @@ -352,7 +352,7 @@ function isSameDay(a, b) { } function fmtTime(d) { - return d.toLocaleTimeString('de', { hour: '2-digit', minute: '2-digit' }); + return d.toLocaleTimeString(getLocale(), { hour: '2-digit', minute: '2-digit' }); } function escHtml(s) {