From 7ba82472b265124bd2b9d3b53359f5e3e5a146ea Mon Sep 17 00:00:00 2001 From: Till JS Date: Thu, 2 Apr 2026 17:20:46 +0200 Subject: [PATCH] feat(manacore/web): wire TagField, FavoriteButton, ColorPicker into module UIs Add shared TagField component (ID-based wrapper for TagSelector). Wire TagField into: calendar EventForm, times EntryForm, cards CreateDeckModal, contacts detail page. Wire FavoriteButton into contacts list (replaces inline Star toggle). Add ColorPicker to cards CreateDeckModal for deck color selection. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../same-origin-unified-app-migration.md | 12 +- apps/clock/packages/shared/package.json | 19 -- .../packages/shared/src/constants/index.ts | 151 --------- apps/clock/packages/shared/src/index.ts | 2 - apps/clock/packages/shared/src/types/alarm.ts | 55 --- apps/clock/packages/shared/src/types/index.ts | 4 - .../clock/packages/shared/src/types/preset.ts | 42 --- apps/clock/packages/shared/src/types/timer.ts | 49 --- .../packages/shared/src/types/world-clock.ts | 18 - apps/clock/packages/shared/tsconfig.json | 14 - .../web/src/lib/i18n/locales/calendar/de.json | 269 +++++++++++++++ .../web/src/lib/i18n/locales/calendar/en.json | 296 ++++++++++++++++ .../web/src/lib/i18n/locales/calendar/es.json | 275 +++++++++++++++ .../web/src/lib/i18n/locales/calendar/fr.json | 275 +++++++++++++++ .../web/src/lib/i18n/locales/calendar/it.json | 275 +++++++++++++++ .../src/lib/i18n/locales/citycorners/de.json | 255 ++++++++++++++ .../src/lib/i18n/locales/citycorners/en.json | 255 ++++++++++++++ .../src/lib/i18n/locales/citycorners/es.json | 255 ++++++++++++++ .../src/lib/i18n/locales/citycorners/fr.json | 255 ++++++++++++++ .../src/lib/i18n/locales/citycorners/it.json | 255 ++++++++++++++ .../web/src/lib/i18n/locales/contacts/de.json | 219 ++++++++++++ .../web/src/lib/i18n/locales/contacts/en.json | 219 ++++++++++++ .../web/src/lib/i18n/locales/contacts/es.json | 219 ++++++++++++ .../web/src/lib/i18n/locales/contacts/fr.json | 219 ++++++++++++ .../web/src/lib/i18n/locales/contacts/it.json | 219 ++++++++++++ .../web/src/lib/i18n/locales/inventar/de.json | 148 ++++++++ .../web/src/lib/i18n/locales/inventar/en.json | 148 ++++++++ .../web/src/lib/i18n/locales/inventar/es.json | 148 ++++++++ .../web/src/lib/i18n/locales/inventar/fr.json | 148 ++++++++ .../web/src/lib/i18n/locales/inventar/it.json | 148 ++++++++ .../web/src/lib/i18n/locales/memoro/de.json | 320 ++++++++++++++++++ .../web/src/lib/i18n/locales/memoro/en.json | 320 ++++++++++++++++++ .../web/src/lib/i18n/locales/memoro/es.json | 319 +++++++++++++++++ .../web/src/lib/i18n/locales/memoro/fr.json | 319 +++++++++++++++++ .../web/src/lib/i18n/locales/memoro/it.json | 319 +++++++++++++++++ .../web/src/lib/i18n/locales/photos/de.json | 131 +++++++ .../web/src/lib/i18n/locales/photos/en.json | 131 +++++++ .../web/src/lib/i18n/locales/photos/es.json | 131 +++++++ .../web/src/lib/i18n/locales/photos/fr.json | 131 +++++++ .../web/src/lib/i18n/locales/photos/it.json | 131 +++++++ .../src/lib/i18n/locales/questions/de.json | 96 ++++++ .../src/lib/i18n/locales/questions/en.json | 96 ++++++ .../src/lib/i18n/locales/questions/es.json | 96 ++++++ .../src/lib/i18n/locales/questions/fr.json | 96 ++++++ .../src/lib/i18n/locales/questions/it.json | 96 ++++++ .../src/lib/i18n/locales/skilltree/de.json | 112 ++++++ .../src/lib/i18n/locales/skilltree/en.json | 112 ++++++ .../src/lib/i18n/locales/skilltree/es.json | 112 ++++++ .../src/lib/i18n/locales/skilltree/fr.json | 112 ++++++ .../src/lib/i18n/locales/skilltree/it.json | 112 ++++++ .../web/src/lib/i18n/locales/times/de.json | 182 ++++++++++ .../web/src/lib/i18n/locales/times/en.json | 182 ++++++++++ .../web/src/lib/i18n/locales/times/es.json | 182 ++++++++++ .../web/src/lib/i18n/locales/times/fr.json | 182 ++++++++++ .../web/src/lib/i18n/locales/times/it.json | 182 ++++++++++ .../web/src/lib/i18n/locales/uload/de.json | 95 ++++++ .../web/src/lib/i18n/locales/uload/en.json | 95 ++++++ .../web/src/lib/i18n/locales/uload/es.json | 95 ++++++ .../web/src/lib/i18n/locales/uload/fr.json | 95 ++++++ .../web/src/lib/i18n/locales/uload/it.json | 95 ++++++ .../web/src/lib/i18n/locales/zitare/de.json | 160 +++++++++ .../web/src/lib/i18n/locales/zitare/en.json | 160 +++++++++ .../web/src/lib/i18n/locales/zitare/es.json | 160 +++++++++ .../web/src/lib/i18n/locales/zitare/fr.json | 160 +++++++++ .../web/src/lib/i18n/locales/zitare/it.json | 160 +++++++++ .../src/lib/modules/calendar/AppView.svelte | 117 ++----- .../calendar/components/EventForm.svelte | 14 + .../cards/components/CreateDeckModal.svelte | 24 ++ .../src/lib/modules/contacts/AppView.svelte | 161 +++------ .../modules/times/components/EntryForm.svelte | 17 +- .../src/routes/(app)/contacts/+page.svelte | 19 +- .../routes/(app)/contacts/[id]/+page.svelte | 17 + package.json | 1 + packages/shared-hono/package.json | 4 +- packages/shared-hono/src/index.ts | 1 + packages/shared-hono/src/logger.ts | 61 ++++ packages/shared-logger/src/index.ts | 166 +++++++-- packages/shared-ui/src/index.ts | 1 + packages/shared-ui/src/molecules/index.ts | 1 + .../src/molecules/tags/TagField.svelte | 55 +++ .../shared-ui/src/molecules/tags/index.ts | 1 + 81 files changed, 10403 insertions(+), 600 deletions(-) delete mode 100644 apps/clock/packages/shared/package.json delete mode 100644 apps/clock/packages/shared/src/constants/index.ts delete mode 100644 apps/clock/packages/shared/src/index.ts delete mode 100644 apps/clock/packages/shared/src/types/alarm.ts delete mode 100644 apps/clock/packages/shared/src/types/index.ts delete mode 100644 apps/clock/packages/shared/src/types/preset.ts delete mode 100644 apps/clock/packages/shared/src/types/timer.ts delete mode 100644 apps/clock/packages/shared/src/types/world-clock.ts delete mode 100644 apps/clock/packages/shared/tsconfig.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/calendar/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/calendar/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/calendar/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/calendar/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/calendar/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/citycorners/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/citycorners/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/citycorners/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/citycorners/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/citycorners/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/contacts/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/contacts/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/contacts/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/contacts/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/contacts/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/inventar/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/inventar/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/inventar/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/inventar/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/inventar/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/memoro/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/memoro/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/memoro/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/memoro/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/memoro/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/photos/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/photos/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/photos/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/photos/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/photos/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/questions/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/questions/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/questions/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/questions/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/questions/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/skilltree/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/skilltree/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/skilltree/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/skilltree/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/skilltree/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/times/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/times/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/times/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/times/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/times/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/uload/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/uload/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/uload/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/uload/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/uload/it.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/zitare/de.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/zitare/en.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/zitare/es.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/zitare/fr.json create mode 100644 apps/manacore/apps/web/src/lib/i18n/locales/zitare/it.json create mode 100644 packages/shared-hono/src/logger.ts create mode 100644 packages/shared-ui/src/molecules/tags/TagField.svelte diff --git a/.claude/plans/same-origin-unified-app-migration.md b/.claude/plans/same-origin-unified-app-migration.md index c61aaccee..4d5939bea 100644 --- a/.claude/plans/same-origin-unified-app-migration.md +++ b/.claude/plans/same-origin-unified-app-migration.md @@ -53,14 +53,22 @@ - **Phase 5:** Infrastruktur (Docker -20 Container, Cloudflare -60 Zeilen, mana-auth 30→8 Origins) - **Phase 6:** Navigation (APP_URLS auf Pfade, PillNav intern statt window.open) - **Phase 7:** Unified Sync (Multi-App Sync Manager, Change Tracker mit appId-Routing) +- **Phase 8:** Sync Fix & Cross-App-Reader Elimination (2026-04-02) + - Dexie Hooks für automatisches Change-Tracking (ersetzt manuelles trackChange()) + - sync.ts komplett neu: korrekte URLs, Auth-Token, Table-Name-Mapping, Server-Change-Guard + - 12 Cross-App-Reader eliminiert (cross-app-stores.ts gelöscht, 383 Zeilen) + - Legacy-DB-Migration (manacore-todo etc. → unified manacore DB) + - manacoreStore refaktoriert auf unified DB Wrapper + - Build verifiziert, 0 neue Type-Fehler -### Alle 7 Phasen abgeschlossen! +### Alle 8 Phasen abgeschlossen! **Verbleibende Arbeiten (nicht im Plan, aber empfohlen):** - Alte standalone Web-Apps in `apps-archived/` verschieben (nach Validierung) - E2E-Tests pro Modul (Routen erreichbar, CRUD funktioniert) -- Build-Validierung der unified App (`pnpm --filter @manacore/web build`) - Production-Deploy + Cloudflare Tunnel Config auf Server aktualisieren +- WebSocket-Konsolidierung: eine WS-Verbindung pro User statt 27 pro App (optional, Backend-Änderung) +- End-to-End Sync-Test mit laufendem mana-sync Server verifizieren ### Nächste Schritte — Phase 2 abgeschlossen! diff --git a/apps/clock/packages/shared/package.json b/apps/clock/packages/shared/package.json deleted file mode 100644 index 8b9961090..000000000 --- a/apps/clock/packages/shared/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@clock/shared", - "version": "0.2.0", - "private": true, - "type": "module", - "main": "./src/index.ts", - "exports": { - ".": "./src/index.ts", - "./types": "./src/types/index.ts", - "./constants": "./src/constants/index.ts" - }, - "scripts": { - "type-check": "tsc --noEmit", - "lint": "eslint src" - }, - "devDependencies": { - "typescript": "^5.7.2" - } -} diff --git a/apps/clock/packages/shared/src/constants/index.ts b/apps/clock/packages/shared/src/constants/index.ts deleted file mode 100644 index 205c25895..000000000 --- a/apps/clock/packages/shared/src/constants/index.ts +++ /dev/null @@ -1,151 +0,0 @@ -// Popular timezones with city names and coordinates for map display -export const POPULAR_TIMEZONES = [ - { - timezone: 'America/New_York', - city: 'New York', - region: 'Americas', - lat: 40.7128, - lng: -74.006, - }, - { - timezone: 'America/Los_Angeles', - city: 'Los Angeles', - region: 'Americas', - lat: 34.0522, - lng: -118.2437, - }, - { timezone: 'America/Chicago', city: 'Chicago', region: 'Americas', lat: 41.8781, lng: -87.6298 }, - { timezone: 'America/Toronto', city: 'Toronto', region: 'Americas', lat: 43.6532, lng: -79.3832 }, - { - timezone: 'America/Sao_Paulo', - city: 'São Paulo', - region: 'Americas', - lat: -23.5505, - lng: -46.6333, - }, - { - timezone: 'America/Mexico_City', - city: 'Mexico City', - region: 'Americas', - lat: 19.4326, - lng: -99.1332, - }, - { - timezone: 'America/Buenos_Aires', - city: 'Buenos Aires', - region: 'Americas', - lat: -34.6037, - lng: -58.3816, - }, - { - timezone: 'America/Vancouver', - city: 'Vancouver', - region: 'Americas', - lat: 49.2827, - lng: -123.1207, - }, - { timezone: 'Europe/London', city: 'London', region: 'Europe', lat: 51.5074, lng: -0.1278 }, - { timezone: 'Europe/Paris', city: 'Paris', region: 'Europe', lat: 48.8566, lng: 2.3522 }, - { timezone: 'Europe/Berlin', city: 'Berlin', region: 'Europe', lat: 52.52, lng: 13.405 }, - { timezone: 'Europe/Rome', city: 'Rome', region: 'Europe', lat: 41.9028, lng: 12.4964 }, - { timezone: 'Europe/Madrid', city: 'Madrid', region: 'Europe', lat: 40.4168, lng: -3.7038 }, - { timezone: 'Europe/Amsterdam', city: 'Amsterdam', region: 'Europe', lat: 52.3676, lng: 4.9041 }, - { timezone: 'Europe/Vienna', city: 'Vienna', region: 'Europe', lat: 48.2082, lng: 16.3738 }, - { timezone: 'Europe/Zurich', city: 'Zurich', region: 'Europe', lat: 47.3769, lng: 8.5417 }, - { timezone: 'Europe/Moscow', city: 'Moscow', region: 'Europe', lat: 55.7558, lng: 37.6173 }, - { timezone: 'Europe/Stockholm', city: 'Stockholm', region: 'Europe', lat: 59.3293, lng: 18.0686 }, - { timezone: 'Europe/Istanbul', city: 'Istanbul', region: 'Europe', lat: 41.0082, lng: 28.9784 }, - { timezone: 'Asia/Tokyo', city: 'Tokyo', region: 'Asia', lat: 35.6762, lng: 139.6503 }, - { timezone: 'Asia/Shanghai', city: 'Shanghai', region: 'Asia', lat: 31.2304, lng: 121.4737 }, - { timezone: 'Asia/Hong_Kong', city: 'Hong Kong', region: 'Asia', lat: 22.3193, lng: 114.1694 }, - { timezone: 'Asia/Singapore', city: 'Singapore', region: 'Asia', lat: 1.3521, lng: 103.8198 }, - { timezone: 'Asia/Seoul', city: 'Seoul', region: 'Asia', lat: 37.5665, lng: 126.978 }, - { timezone: 'Asia/Mumbai', city: 'Mumbai', region: 'Asia', lat: 19.076, lng: 72.8777 }, - { timezone: 'Asia/Dubai', city: 'Dubai', region: 'Asia', lat: 25.2048, lng: 55.2708 }, - { timezone: 'Asia/Bangkok', city: 'Bangkok', region: 'Asia', lat: 13.7563, lng: 100.5018 }, - { timezone: 'Asia/Jakarta', city: 'Jakarta', region: 'Asia', lat: -6.2088, lng: 106.8456 }, - { timezone: 'Australia/Sydney', city: 'Sydney', region: 'Oceania', lat: -33.8688, lng: 151.2093 }, - { - timezone: 'Australia/Melbourne', - city: 'Melbourne', - region: 'Oceania', - lat: -37.8136, - lng: 144.9631, - }, - { - timezone: 'Pacific/Auckland', - city: 'Auckland', - region: 'Oceania', - lat: -36.8485, - lng: 174.7633, - }, - { timezone: 'Africa/Cairo', city: 'Cairo', region: 'Africa', lat: 30.0444, lng: 31.2357 }, - { - timezone: 'Africa/Johannesburg', - city: 'Johannesburg', - region: 'Africa', - lat: -26.2041, - lng: 28.0473, - }, - { timezone: 'Africa/Lagos', city: 'Lagos', region: 'Africa', lat: 6.5244, lng: 3.3792 }, -] as const; - -// Available alarm sounds -export const ALARM_SOUNDS = [ - { id: 'default', name: 'Default', nameDE: 'Standard' }, - { id: 'gentle', name: 'Gentle', nameDE: 'Sanft' }, - { id: 'classic', name: 'Classic', nameDE: 'Klassisch' }, - { id: 'digital', name: 'Digital', nameDE: 'Digital' }, - { id: 'nature', name: 'Nature', nameDE: 'Natur' }, - { id: 'chime', name: 'Chime', nameDE: 'Glockenspiel' }, -] as const; - -// Timer presets -export const QUICK_TIMER_PRESETS = [ - { label: '1 min', seconds: 60 }, - { label: '3 min', seconds: 180 }, - { label: '5 min', seconds: 300 }, - { label: '10 min', seconds: 600 }, - { label: '15 min', seconds: 900 }, - { label: '30 min', seconds: 1800 }, - { label: '45 min', seconds: 2700 }, - { label: '1 hour', seconds: 3600 }, -] as const; - -// Default alarm presets (like iOS Clock app) -export const DEFAULT_ALARM_PRESETS = [ - { time: '06:00', label: 'Früh aufstehen', labelEN: 'Wake up early' }, - { time: '07:00', label: 'Aufwachen', labelEN: 'Wake up' }, - { time: '08:00', label: 'Morgen', labelEN: 'Morning' }, - { time: '12:00', label: 'Mittag', labelEN: 'Noon' }, - { time: '18:00', label: 'Feierabend', labelEN: 'End of work' }, - { time: '22:00', label: 'Schlafenszeit', labelEN: 'Bedtime' }, -] as const; - -// Pomodoro presets -export const POMODORO_PRESETS = [ - { - name: 'Classic Pomodoro', - nameDE: 'Klassischer Pomodoro', - workDuration: 25 * 60, - breakDuration: 5 * 60, - longBreakDuration: 15 * 60, - sessionsBeforeLongBreak: 4, - }, - { - name: 'Short Focus', - nameDE: 'Kurzer Fokus', - workDuration: 15 * 60, - breakDuration: 3 * 60, - longBreakDuration: 10 * 60, - sessionsBeforeLongBreak: 4, - }, - { - name: 'Deep Work', - nameDE: 'Tiefes Arbeiten', - workDuration: 50 * 60, - breakDuration: 10 * 60, - longBreakDuration: 30 * 60, - sessionsBeforeLongBreak: 3, - }, -] as const; diff --git a/apps/clock/packages/shared/src/index.ts b/apps/clock/packages/shared/src/index.ts deleted file mode 100644 index 33c8572a1..000000000 --- a/apps/clock/packages/shared/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './types'; -export * from './constants'; diff --git a/apps/clock/packages/shared/src/types/alarm.ts b/apps/clock/packages/shared/src/types/alarm.ts deleted file mode 100644 index 212e10059..000000000 --- a/apps/clock/packages/shared/src/types/alarm.ts +++ /dev/null @@ -1,55 +0,0 @@ -export interface Alarm { - id: string; - userId: string; - label: string | null; - time: string; // HH:MM:SS format - enabled: boolean; - repeatDays: number[] | null; // [0-6] where 0 = Sunday - snoozeMinutes: number | null; - sound: string | null; - vibrate: boolean | null; - createdAt: string; - updatedAt: string; -} - -export interface CreateAlarmInput { - label?: string; - time: string; - enabled?: boolean; - repeatDays?: number[]; - snoozeMinutes?: number; - sound?: string; - vibrate?: boolean; -} - -export interface UpdateAlarmInput { - label?: string; - time?: string; - enabled?: boolean; - repeatDays?: number[]; - snoozeMinutes?: number; - sound?: string; - vibrate?: boolean; -} - -export type RepeatDay = 0 | 1 | 2 | 3 | 4 | 5 | 6; - -export const REPEAT_DAY_LABELS = { - 0: 'Sun', - 1: 'Mon', - 2: 'Tue', - 3: 'Wed', - 4: 'Thu', - 5: 'Fri', - 6: 'Sat', -} as const; - -export const REPEAT_DAY_LABELS_DE = { - 0: 'So', - 1: 'Mo', - 2: 'Di', - 3: 'Mi', - 4: 'Do', - 5: 'Fr', - 6: 'Sa', -} as const; diff --git a/apps/clock/packages/shared/src/types/index.ts b/apps/clock/packages/shared/src/types/index.ts deleted file mode 100644 index 1bd20351b..000000000 --- a/apps/clock/packages/shared/src/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './alarm'; -export * from './timer'; -export * from './world-clock'; -export * from './preset'; diff --git a/apps/clock/packages/shared/src/types/preset.ts b/apps/clock/packages/shared/src/types/preset.ts deleted file mode 100644 index 948adf37e..000000000 --- a/apps/clock/packages/shared/src/types/preset.ts +++ /dev/null @@ -1,42 +0,0 @@ -export type PresetType = 'timer' | 'pomodoro'; - -export interface PresetSettings { - // For pomodoro presets - workDuration?: number; - breakDuration?: number; - longBreakDuration?: number; - sessionsBeforeLongBreak?: number; - // For timer presets - sound?: string; -} - -export interface Preset { - id: string; - userId: string; - type: PresetType; - name: string; - durationSeconds: number; - settings: PresetSettings | null; - createdAt: string; -} - -export interface CreatePresetInput { - type: PresetType; - name: string; - durationSeconds: number; - settings?: PresetSettings; -} - -export interface UpdatePresetInput { - name?: string; - durationSeconds?: number; - settings?: PresetSettings; -} - -// Default pomodoro settings -export const DEFAULT_POMODORO_SETTINGS: PresetSettings = { - workDuration: 25 * 60, // 25 minutes - breakDuration: 5 * 60, // 5 minutes - longBreakDuration: 15 * 60, // 15 minutes - sessionsBeforeLongBreak: 4, -}; diff --git a/apps/clock/packages/shared/src/types/timer.ts b/apps/clock/packages/shared/src/types/timer.ts deleted file mode 100644 index 221bb56ef..000000000 --- a/apps/clock/packages/shared/src/types/timer.ts +++ /dev/null @@ -1,49 +0,0 @@ -export type TimerStatus = 'idle' | 'running' | 'paused' | 'finished'; - -export interface Timer { - id: string; - userId: string; - label: string | null; - durationSeconds: number; - remainingSeconds: number | null; - status: TimerStatus; - startedAt: string | null; - pausedAt: string | null; - sound: string | null; - createdAt: string; - updatedAt: string; -} - -export interface CreateTimerInput { - label?: string; - durationSeconds: number; - sound?: string; -} - -export interface UpdateTimerInput { - label?: string; - durationSeconds?: number; - sound?: string; -} - -export function formatDuration(seconds: number): string { - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - const secs = seconds % 60; - - if (hours > 0) { - return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; - } - return `${minutes}:${secs.toString().padStart(2, '0')}`; -} - -export function parseDuration(formatted: string): number { - const parts = formatted.split(':').map(Number); - if (parts.length === 3) { - return parts[0] * 3600 + parts[1] * 60 + parts[2]; - } - if (parts.length === 2) { - return parts[0] * 60 + parts[1]; - } - return parts[0]; -} diff --git a/apps/clock/packages/shared/src/types/world-clock.ts b/apps/clock/packages/shared/src/types/world-clock.ts deleted file mode 100644 index 7a2ae55a7..000000000 --- a/apps/clock/packages/shared/src/types/world-clock.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface WorldClock { - id: string; - userId: string; - timezone: string; // IANA timezone e.g. 'America/New_York' - cityName: string; - sortOrder: number; - createdAt: string; -} - -export interface CreateWorldClockInput { - timezone: string; - cityName: string; -} - -export interface TimezoneInfo { - timezone: string; - city: string; -} diff --git a/apps/clock/packages/shared/tsconfig.json b/apps/clock/packages/shared/tsconfig.json deleted file mode 100644 index b17efe376..000000000 --- a/apps/clock/packages/shared/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2021", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/calendar/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/de.json new file mode 100644 index 000000000..1d44c1578 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/de.json @@ -0,0 +1,269 @@ +{ + "app": { + "name": "Kalender", + "loading": "Laden..." + }, + "nav": { + "calendar": "Kalender", + "calendars": "Kalender", + "agenda": "Agenda", + "settings": "Einstellungen", + "feedback": "Feedback" + }, + "views": { + "day": "Tag", + "5day": "5 Tage", + "week": "Woche", + "10day": "10 Tage", + "14day": "14 Tage", + "month": "Monat", + "year": "Jahr", + "agenda": "Agenda", + "weekdaysOnly": "Nur Wochentage", + "weekNumber": "KW", + "moreEvents": "+{count} mehr", + "allDay": "Ganztägig", + "birthday": "Geburtstag", + "weekView": "Wochenansicht", + "monthView": "Monatsansicht" + }, + "calendar": { + "today": "Heute", + "newEvent": "Neuer Termin", + "noEvents": "Keine Termine", + "allDay": "Ganztägig", + "myCalendars": "Meine Kalender", + "sharedCalendars": "Geteilte Kalender", + "draftEvent": "(Neuer Termin)", + "untitled": "Ohne Titel", + "hideSidebar": "Sidebar ausblenden", + "showSidebar": "Sidebar einblenden", + "contextMenu": { + "edit": "Bearbeiten", + "duplicate": "Duplizieren", + "copy": "Kopie", + "delete": "Löschen" + } + }, + "event": { + "title": "Titel", + "description": "Beschreibung", + "location": "Ort", + "start": "Beginn", + "end": "Ende", + "allDay": "Ganztägig", + "repeat": "Wiederholen", + "reminder": "Erinnerung", + "calendar": "Kalender", + "changeStartTime": "Startzeit ändern", + "changeEndTime": "Endzeit ändern" + }, + "repeat": { + "none": "Nicht wiederholen", + "daily": "Täglich", + "weekly": "Wöchentlich", + "monthly": "Monatlich", + "yearly": "Jährlich" + }, + "reminder": { + "atTime": "Zum Zeitpunkt", + "5min": "5 Minuten vorher", + "15min": "15 Minuten vorher", + "30min": "30 Minuten vorher", + "1hour": "1 Stunde vorher", + "1day": "1 Tag vorher" + }, + "share": { + "share": "Teilen", + "shareCalendar": "Kalender teilen", + "permissions": "Berechtigungen", + "read": "Nur lesen", + "write": "Lesen & Schreiben", + "admin": "Administrator", + "pending": "Ausstehend", + "accepted": "Akzeptiert" + }, + "toast": { + "eventLoadError": "Termine konnten nicht geladen werden", + "eventUpdateError": "Termin konnte nicht aktualisiert werden", + "eventDeleteError": "Termin konnte nicht gelöscht werden", + "eventDeleted": "Termin gelöscht", + "error": "Fehler", + "calendarShared": "Kalender mit {email} geteilt", + "shareLinkCreated": "Freigabe-Link erstellt", + "inviteAccepted": "Einladung angenommen", + "shareRemoved": "Freigabe entfernt", + "shareError": "Freigabe fehlgeschlagen", + "updateError": "Aktualisierung fehlgeschlagen", + "removeError": "Entfernen fehlgeschlagen", + "declineError": "Ablehnung fehlgeschlagen", + "calendarConnected": "{name} verbunden", + "calendarDisconnected": "{name} getrennt", + "syncCompleted": "Synchronisation abgeschlossen", + "connectionError": "Verbindung fehlgeschlagen", + "syncError": "Sync fehlgeschlagen" + }, + "settings": { + "myCalendars": "Meine Kalender", + "externalCalendars": "Externe Kalender", + "shares": "Kalender-Freigaben", + "appSettings": "App-Einstellungen", + "appSettingsDesc": "Diese Einstellungen werden mit allen Mana Apps synchronisiert", + "calendarView": "Kalender-Ansicht", + "events": "Termine", + "birthdays": "Geburtstage", + "account": "Konto", + "newCalendar": "Neuer Kalender", + "calendarName": "Kalender Name", + "name": "Name", + "color": "Farbe", + "default": "Standard", + "setAsDefault": "Als Standardkalender verwenden", + "currentDefault": "aktueller Standard", + "noCalendars": "Keine Kalender vorhanden", + "calendarCreated": "Kalender erstellt", + "calendarUpdated": "Kalender aktualisiert", + "calendarDeleted": "Kalender gelöscht", + "confirmDeleteCalendar": "Möchten Sie \"{name}\" wirklich löschen?", + "externalCalendarsDesc": "Verbinde Google Calendar, Apple Calendar, CalDAV oder iCal-URLs.", + "manageSync": "Kalender-Sync verwalten", + "sharesDesc": "Teile Kalender mit anderen Nutzern oder verwalte Einladungen.", + "manageShares": "Freigaben verwalten", + "defaultView": "Standard-Ansicht", + "defaultViewDesc": "Ansicht beim Öffnen des Kalenders", + "selectView": "Ansicht wählen", + "viewWeek": "Woche", + "viewMonth": "Monat", + "viewAgenda": "Agenda", + "timeFormat": "Zeitformat", + "timeFormatDesc": "Anzeige der Uhrzeiten", + "weekdaysOnly": "Nur Werktage anzeigen", + "weekdaysOnlyDesc": "Wochenenden in der Kalenderansicht ausblenden", + "showWeekNumbers": "Wochennummern anzeigen", + "showWeekNumbersDesc": "Kalenderwoche (KW) in der Ansicht anzeigen", + "filterHours": "Stunden filtern", + "filterHoursDesc": "Nur bestimmte Stunden in der Tages-/Wochenansicht anzeigen", + "visibleHours": "Sichtbare Stunden", + "visibleHoursDesc": "Zeitbereich der in der Kalenderansicht angezeigt wird", + "hoursFrom": "Von", + "hoursTo": "Bis", + "allDayEvents": "Ganztägige Termine", + "allDayEventsDesc": "Wie sollen ganztägige Termine angezeigt werden?", + "allDayInHeader": "In Kopfzeile", + "allDayAsBlock": "Als Tagesblock", + "defaultDuration": "Standard-Dauer", + "defaultDurationDesc": "Voreingestellte Dauer für neue Termine", + "selectDuration": "Dauer wählen", + "durationMinutes": "{count} Minuten", + "durationHours": "{count} Stunde(n)", + "defaultReminder": "Standard-Erinnerung", + "defaultReminderDesc": "Voreingestellte Erinnerung für neue Termine", + "selectReminder": "Erinnerung wählen", + "reminderNone": "Keine", + "reminderMinutes": "{count} Minuten", + "reminderHour": "1 Stunde", + "reminderDay": "1 Tag", + "showBirthdays": "Geburtstage anzeigen", + "showBirthdaysDesc": "Geburtstage aus Kontakten im Kalender anzeigen", + "showAge": "Alter anzeigen", + "showAgeDesc": "Das Alter der Person bei Geburtstagen anzeigen" + }, + "errors": { + "loadEvents": "Termine konnten nicht geladen werden", + "createEvent": "Termin konnte nicht erstellt werden", + "updateEvent": "Termin konnte nicht aktualisiert werden", + "deleteEvent": "Termin konnte nicht gelöscht werden" + }, + "success": { + "eventCreated": "Termin erstellt", + "eventDeleted": "Termin gelöscht" + }, + "a11y": { + "createEventOn": "Termin erstellen am {date}", + "slotTime": "{day} {time}" + }, + "error": { + "notFound": "Seite nicht gefunden", + "backToHome": "Zurück zur Startseite" + }, + "sync": { + "pageTitle": "Kalender-Sync - Einstellungen", + "title": "Kalender-Sync", + "connectCalendar": "Kalender verbinden", + "description": "Verbinde externe Kalender, um Termine zu importieren und zu synchronisieren.", + "emptyState": "Keine externen Kalender verbunden", + "syncNow": "Jetzt synchronisieren", + "disconnect": "Verbindung trennen", + "confirmDisconnect": "\"{name}\" wirklich trennen? Synchronisierte Termine werden gelöscht.", + "neverSynced": "Noch nie", + "directionLabel": "Richtung", + "lastSync": "Letzte Sync", + "statusLabel": "Status", + "autoSync": "Auto-Sync", + "connectCaldav": "CalDAV-Server verbinden", + "connectProvider": "{provider} verbinden", + "searching": "Suche...", + "searchCalendars": "Kalender suchen", + "discoveredCalendars": "Gefundene Kalender:", + "connecting": "Verbinde...", + "connect": "Verbinden", + "direction": { + "import": "Nur Import", + "export": "Nur Export", + "both": "Bidirektional" + }, + "status": { + "error": "Fehler", + "active": "Aktiv (alle {interval} Min.)", + "paused": "Pausiert" + }, + "providers": { + "icalUrl": "iCal URL", + "icalUrlDesc": "ICS-Link importieren (z.B. Feiertage)", + "caldav": "CalDAV", + "caldavDesc": "CalDAV-Server verbinden", + "google": "Google Calendar", + "googleDesc": "Mit Google Kalender synchronisieren", + "apple": "Apple Calendar", + "appleDesc": "iCloud Kalender verbinden" + }, + "form": { + "serverUrl": "Server-URL", + "username": "Benutzername", + "password": "Passwort", + "name": "Name", + "namePlaceholder": "Mein externer Kalender", + "url": "URL", + "syncDirection": "Sync-Richtung" + } + }, + "sharing": { + "pageTitle": "Kalender-Freigaben - Einstellungen", + "title": "Freigaben", + "shareCalendar": "Kalender teilen", + "invitations": "Einladungen ({count})", + "calendarInvitation": "Kalender-Einladung", + "access": "Zugriff", + "accept": "Annehmen", + "sharedWithMe": "Mit mir geteilt", + "sharedCalendar": "Geteilter Kalender", + "shareMyCalendars": "Meine Kalender teilen", + "notSharedYet": "Noch nicht geteilt", + "linkShare": "Link-Freigabe", + "pending": "Ausstehend", + "removeShare": "Freigabe entfernen", + "confirmRemoveShare": "Freigabe wirklich entfernen?", + "addPerson": "Person hinzufügen", + "sharing": "Teile...", + "permission": { + "read": "Lesen", + "write": "Lesen & Bearbeiten", + "admin": "Administrator" + }, + "form": { + "calendar": "Kalender", + "email": "E-Mail-Adresse", + "permission": "Berechtigung" + } + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/calendar/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/en.json new file mode 100644 index 000000000..06c63f2a1 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/en.json @@ -0,0 +1,296 @@ +{ + "app": { + "name": "Calendar", + "loading": "Loading..." + }, + "nav": { + "calendar": "Calendar", + "calendars": "Calendars", + "agenda": "Agenda", + "settings": "Settings", + "feedback": "Feedback" + }, + "views": { + "day": "Day", + "5day": "5 Days", + "week": "Week", + "10day": "10 Days", + "14day": "14 Days", + "month": "Month", + "year": "Year", + "agenda": "Agenda", + "weekdaysOnly": "Weekdays only", + "weekNumber": "W", + "moreEvents": "+{count} more", + "allDay": "All day", + "birthday": "Birthday", + "weekView": "Week view", + "monthView": "Month view" + }, + "calendar": { + "today": "Today", + "newEvent": "New Event", + "noEvents": "No events", + "allDay": "All day", + "myCalendars": "My Calendars", + "sharedCalendars": "Shared Calendars", + "draftEvent": "(New Event)", + "untitled": "Untitled", + "hideSidebar": "Hide sidebar", + "showSidebar": "Show sidebar", + "contextMenu": { + "edit": "Edit", + "duplicate": "Duplicate", + "copy": "Copy", + "delete": "Delete" + } + }, + "event": { + "title": "Title", + "description": "Description", + "location": "Location", + "start": "Start", + "end": "End", + "allDay": "All day", + "repeat": "Repeat", + "reminder": "Reminder", + "calendar": "Calendar", + "save": "Save", + "delete": "Delete", + "cancel": "Cancel", + "changeStartTime": "Change start time", + "changeEndTime": "Change end time" + }, + "repeat": { + "none": "Don't repeat", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "yearly": "Yearly" + }, + "reminder": { + "atTime": "At time of event", + "5min": "5 minutes before", + "15min": "15 minutes before", + "30min": "30 minutes before", + "1hour": "1 hour before", + "1day": "1 day before" + }, + "share": { + "share": "Share", + "shareCalendar": "Share calendar", + "permissions": "Permissions", + "read": "View only", + "write": "Can edit", + "admin": "Admin", + "pending": "Pending", + "accepted": "Accepted" + }, + "auth": { + "login": "Login", + "logout": "Logout", + "register": "Register", + "email": "Email", + "password": "Password", + "forgotPassword": "Forgot password?" + }, + "toast": { + "eventLoadError": "Failed to load events", + "eventUpdateError": "Failed to update event", + "eventDeleteError": "Failed to delete event", + "eventDeleted": "Event deleted", + "error": "Error", + "calendarShared": "Calendar shared with {email}", + "shareLinkCreated": "Share link created", + "inviteAccepted": "Invitation accepted", + "shareRemoved": "Share removed", + "shareError": "Sharing failed", + "updateError": "Update failed", + "removeError": "Remove failed", + "declineError": "Decline failed", + "calendarConnected": "{name} connected", + "calendarDisconnected": "{name} disconnected", + "syncCompleted": "Sync completed", + "connectionError": "Connection failed", + "syncError": "Sync failed" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "add": "Add", + "close": "Close", + "search": "Search", + "error": "Error", + "success": "Success", + "calendar": "Calendar", + "create": "Create" + }, + "settings": { + "myCalendars": "My Calendars", + "externalCalendars": "External Calendars", + "shares": "Calendar Sharing", + "appSettings": "App Settings", + "appSettingsDesc": "These settings are synced across all Mana apps", + "calendarView": "Calendar View", + "events": "Events", + "birthdays": "Birthdays", + "account": "Account", + "newCalendar": "New Calendar", + "calendarName": "Calendar Name", + "name": "Name", + "color": "Color", + "default": "Default", + "setAsDefault": "Set as default calendar", + "currentDefault": "current default", + "noCalendars": "No calendars available", + "calendarCreated": "Calendar created", + "calendarUpdated": "Calendar updated", + "calendarDeleted": "Calendar deleted", + "confirmDeleteCalendar": "Are you sure you want to delete \"{name}\"?", + "externalCalendarsDesc": "Connect Google Calendar, Apple Calendar, CalDAV or iCal URLs.", + "manageSync": "Manage calendar sync", + "sharesDesc": "Share calendars with other users or manage invitations.", + "manageShares": "Manage sharing", + "defaultView": "Default View", + "defaultViewDesc": "View when opening the calendar", + "selectView": "Select view", + "viewWeek": "Week", + "viewMonth": "Month", + "viewAgenda": "Agenda", + "timeFormat": "Time Format", + "timeFormatDesc": "How times are displayed", + "weekdaysOnly": "Show weekdays only", + "weekdaysOnlyDesc": "Hide weekends in the calendar view", + "showWeekNumbers": "Show week numbers", + "showWeekNumbersDesc": "Display week numbers in the calendar view", + "filterHours": "Filter hours", + "filterHoursDesc": "Only show certain hours in day/week view", + "visibleHours": "Visible hours", + "visibleHoursDesc": "Time range displayed in the calendar view", + "hoursFrom": "From", + "hoursTo": "To", + "allDayEvents": "All-day events", + "allDayEventsDesc": "How should all-day events be displayed?", + "allDayInHeader": "In header", + "allDayAsBlock": "As day block", + "defaultDuration": "Default Duration", + "defaultDurationDesc": "Default duration for new events", + "selectDuration": "Select duration", + "durationMinutes": "{count} minutes", + "durationHours": "{count} hour(s)", + "defaultReminder": "Default Reminder", + "defaultReminderDesc": "Default reminder for new events", + "selectReminder": "Select reminder", + "reminderNone": "None", + "reminderMinutes": "{count} minutes", + "reminderHour": "1 hour", + "reminderDay": "1 day", + "showBirthdays": "Show birthdays", + "showBirthdaysDesc": "Show birthdays from contacts in the calendar", + "showAge": "Show age", + "showAgeDesc": "Display the person's age on birthdays" + }, + "errors": { + "loadEvents": "Failed to load events", + "createEvent": "Failed to create event", + "updateEvent": "Failed to update event", + "deleteEvent": "Failed to delete event" + }, + "success": { + "eventCreated": "Event created", + "eventDeleted": "Event deleted" + }, + "a11y": { + "createEventOn": "Create event on {date}", + "slotTime": "{day} {time}" + }, + "error": { + "notFound": "Page not found", + "backToHome": "Back to home" + }, + "sync": { + "pageTitle": "Calendar Sync - Settings", + "title": "Calendar Sync", + "back": "Back", + "connectCalendar": "Connect calendar", + "description": "Connect external calendars to import and synchronize events.", + "emptyState": "No external calendars connected", + "syncNow": "Sync now", + "disconnect": "Disconnect", + "confirmDisconnect": "Really disconnect \"{name}\"? Synchronized events will be deleted.", + "neverSynced": "Never", + "directionLabel": "Direction", + "lastSync": "Last sync", + "statusLabel": "Status", + "autoSync": "Auto-Sync", + "connectCaldav": "Connect CalDAV server", + "connectProvider": "Connect {provider}", + "searching": "Searching...", + "searchCalendars": "Search calendars", + "discoveredCalendars": "Discovered calendars:", + "connecting": "Connecting...", + "connect": "Connect", + "direction": { + "import": "Import only", + "export": "Export only", + "both": "Bidirectional" + }, + "status": { + "error": "Error", + "active": "Active (every {interval} min.)", + "paused": "Paused" + }, + "providers": { + "icalUrl": "iCal URL", + "icalUrlDesc": "Import ICS link (e.g. holidays)", + "caldav": "CalDAV", + "caldavDesc": "Connect CalDAV server", + "google": "Google Calendar", + "googleDesc": "Sync with Google Calendar", + "apple": "Apple Calendar", + "appleDesc": "Connect iCloud Calendar" + }, + "form": { + "serverUrl": "Server URL", + "username": "Username", + "password": "Password", + "name": "Name", + "namePlaceholder": "My external calendar", + "url": "URL", + "syncDirection": "Sync direction" + } + }, + "sharing": { + "pageTitle": "Calendar Sharing - Settings", + "title": "Sharing", + "back": "Back", + "shareCalendar": "Share calendar", + "invitations": "Invitations ({count})", + "calendarInvitation": "Calendar invitation", + "access": "access", + "accept": "Accept", + "sharedWithMe": "Shared with me", + "sharedCalendar": "Shared calendar", + "shareMyCalendars": "Share my calendars", + "notSharedYet": "Not shared yet", + "linkShare": "Link share", + "pending": "Pending", + "removeShare": "Remove share", + "confirmRemoveShare": "Really remove this share?", + "addPerson": "Add person", + "share": "Share", + "sharing": "Sharing...", + "permission": { + "read": "Read", + "write": "Read & Edit", + "admin": "Admin" + }, + "form": { + "calendar": "Calendar", + "email": "Email address", + "permission": "Permission" + } + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/calendar/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/es.json new file mode 100644 index 000000000..45c7809fc --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/es.json @@ -0,0 +1,275 @@ +{ + "app": { + "name": "Calendario", + "loading": "Cargando..." + }, + "nav": { + "calendar": "Calendario", + "calendars": "Calendarios", + "agenda": "Agenda", + "settings": "Configuración", + "feedback": "Comentarios" + }, + "views": { + "day": "Día", + "5day": "5 días", + "week": "Semana", + "10day": "10 días", + "14day": "14 días", + "month": "Mes", + "year": "Año", + "agenda": "Agenda", + "weekdaysOnly": "Solo días laborables", + "allDay": "Todo el día", + "birthday": "Cumpleaños", + "weekView": "Vista semanal", + "monthView": "Vista mensual" + }, + "calendar": { + "today": "Hoy", + "newEvent": "Nuevo evento", + "noEvents": "Sin eventos", + "allDay": "Todo el día", + "myCalendars": "Mis calendarios", + "sharedCalendars": "Calendarios compartidos", + "untitled": "Sin título", + "contextMenu": { + "edit": "Editar", + "duplicate": "Duplicar", + "copy": "Copia", + "delete": "Eliminar" + } + }, + "event": { + "title": "Título", + "description": "Descripción", + "location": "Ubicación", + "start": "Inicio", + "end": "Fin", + "allDay": "Todo el día", + "repeat": "Repetir", + "reminder": "Recordatorio", + "calendar": "Calendario", + "save": "Guardar", + "delete": "Eliminar", + "cancel": "Cancelar" + }, + "repeat": { + "none": "No repetir", + "daily": "Diario", + "weekly": "Semanal", + "monthly": "Mensual", + "yearly": "Anual" + }, + "reminder": { + "atTime": "Al momento del evento", + "5min": "5 minutos antes", + "15min": "15 minutos antes", + "30min": "30 minutos antes", + "1hour": "1 hora antes", + "1day": "1 día antes" + }, + "share": { + "share": "Compartir", + "shareCalendar": "Compartir calendario", + "permissions": "Permisos", + "read": "Solo lectura", + "write": "Puede editar", + "admin": "Administrador", + "pending": "Pendiente", + "accepted": "Aceptado" + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "register": "Registrarse", + "email": "Correo electrónico", + "password": "Contraseña", + "forgotPassword": "¿Olvidaste tu contraseña?" + }, + "toast": { + "eventLoadError": "No se pudieron cargar los eventos", + "eventUpdateError": "No se pudo actualizar el evento", + "eventDeleteError": "No se pudo eliminar el evento", + "eventDeleted": "Evento eliminado", + "error": "Error", + "calendarShared": "Calendario compartido con {email}", + "shareLinkCreated": "Enlace de compartir creado", + "inviteAccepted": "Invitación aceptada", + "shareRemoved": "Compartir eliminado", + "shareError": "Error al compartir", + "updateError": "Error al actualizar", + "removeError": "Error al eliminar", + "declineError": "Error al rechazar", + "calendarConnected": "{name} conectado", + "calendarDisconnected": "{name} desconectado", + "syncCompleted": "Sincronización completada", + "connectionError": "Error de conexión", + "syncError": "Error de sincronización" + }, + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "add": "Agregar", + "close": "Cerrar", + "search": "Buscar", + "error": "Error", + "success": "Éxito", + "calendar": "Calendario", + "create": "Crear" + }, + "settings": { + "myCalendars": "Mis calendarios", + "externalCalendars": "Calendarios externos", + "shares": "Compartir calendarios", + "appSettings": "Configuración de la app", + "appSettingsDesc": "Estos ajustes se sincronizan con todas las apps de Mana", + "calendarView": "Vista del calendario", + "events": "Eventos", + "birthdays": "Cumpleaños", + "account": "Cuenta", + "newCalendar": "Nuevo calendario", + "calendarName": "Nombre del calendario", + "name": "Nombre", + "color": "Color", + "default": "Predeterminado", + "setAsDefault": "Establecer como calendario predeterminado", + "currentDefault": "predeterminado actual", + "noCalendars": "No hay calendarios disponibles", + "calendarCreated": "Calendario creado", + "calendarUpdated": "Calendario actualizado", + "calendarDeleted": "Calendario eliminado", + "confirmDeleteCalendar": "¿Seguro que quieres eliminar \"{name}\"?", + "externalCalendarsDesc": "Conecta Google Calendar, Apple Calendar, CalDAV o URLs de iCal.", + "manageSync": "Gestionar sincronización", + "sharesDesc": "Comparte calendarios con otros usuarios o gestiona invitaciones.", + "manageShares": "Gestionar compartidos", + "defaultView": "Vista predeterminada", + "defaultViewDesc": "Vista al abrir el calendario", + "selectView": "Seleccionar vista", + "viewWeek": "Semana", + "viewMonth": "Mes", + "viewAgenda": "Agenda", + "timeFormat": "Formato de hora", + "timeFormatDesc": "Cómo se muestran las horas", + "weekdaysOnly": "Mostrar solo días laborables", + "weekdaysOnlyDesc": "Ocultar fines de semana en la vista del calendario", + "showWeekNumbers": "Mostrar números de semana", + "showWeekNumbersDesc": "Mostrar el número de semana en la vista del calendario", + "filterHours": "Filtrar horas", + "filterHoursDesc": "Mostrar solo ciertas horas en la vista de día/semana", + "visibleHours": "Horas visibles", + "visibleHoursDesc": "Rango horario mostrado en la vista del calendario", + "hoursFrom": "Desde", + "hoursTo": "Hasta", + "allDayEvents": "Eventos de todo el día", + "allDayEventsDesc": "¿Cómo se deben mostrar los eventos de todo el día?", + "allDayInHeader": "En encabezado", + "allDayAsBlock": "Como bloque diario", + "defaultDuration": "Duración predeterminada", + "defaultDurationDesc": "Duración predeterminada para nuevos eventos", + "selectDuration": "Seleccionar duración", + "durationMinutes": "{count} minutos", + "durationHours": "{count} hora(s)", + "defaultReminder": "Recordatorio predeterminado", + "defaultReminderDesc": "Recordatorio predeterminado para nuevos eventos", + "selectReminder": "Seleccionar recordatorio", + "reminderNone": "Ninguno", + "reminderMinutes": "{count} minutos", + "reminderHour": "1 hora", + "reminderDay": "1 día", + "showBirthdays": "Mostrar cumpleaños", + "showBirthdaysDesc": "Mostrar cumpleaños de contactos en el calendario", + "showAge": "Mostrar edad", + "showAgeDesc": "Mostrar la edad de la persona en los cumpleaños" + }, + "error": { + "notFound": "Página no encontrada", + "backToHome": "Volver al inicio" + }, + "sync": { + "pageTitle": "Sincronización de calendarios - Configuración", + "title": "Sincronización", + "back": "Volver", + "connectCalendar": "Conectar calendario", + "description": "Conecta calendarios externos para importar y sincronizar eventos.", + "emptyState": "No hay calendarios externos conectados", + "syncNow": "Sincronizar ahora", + "disconnect": "Desconectar", + "confirmDisconnect": "¿Realmente desconectar \"{name}\"? Los eventos sincronizados serán eliminados.", + "neverSynced": "Nunca", + "directionLabel": "Dirección", + "lastSync": "Última sincronización", + "statusLabel": "Estado", + "autoSync": "Sincronización automática", + "connectCaldav": "Conectar servidor CalDAV", + "connectProvider": "Conectar {provider}", + "searching": "Buscando...", + "searchCalendars": "Buscar calendarios", + "discoveredCalendars": "Calendarios encontrados:", + "connecting": "Conectando...", + "connect": "Conectar", + "direction": { + "import": "Solo importar", + "export": "Solo exportar", + "both": "Bidireccional" + }, + "status": { + "error": "Error", + "active": "Activo (cada {interval} min.)", + "paused": "Pausado" + }, + "providers": { + "icalUrl": "URL iCal", + "icalUrlDesc": "Importar enlace ICS (ej. festivos)", + "caldav": "CalDAV", + "caldavDesc": "Conectar servidor CalDAV", + "google": "Google Calendar", + "googleDesc": "Sincronizar con Google Calendar", + "apple": "Apple Calendar", + "appleDesc": "Conectar calendario de iCloud" + }, + "form": { + "serverUrl": "URL del servidor", + "username": "Nombre de usuario", + "password": "Contraseña", + "name": "Nombre", + "namePlaceholder": "Mi calendario externo", + "url": "URL", + "syncDirection": "Dirección de sincronización" + } + }, + "sharing": { + "pageTitle": "Compartir calendarios - Configuración", + "title": "Compartidos", + "back": "Volver", + "shareCalendar": "Compartir calendario", + "invitations": "Invitaciones ({count})", + "calendarInvitation": "Invitación de calendario", + "access": "acceso", + "accept": "Aceptar", + "sharedWithMe": "Compartidos conmigo", + "sharedCalendar": "Calendario compartido", + "shareMyCalendars": "Compartir mis calendarios", + "notSharedYet": "Aún no compartido", + "linkShare": "Compartir por enlace", + "pending": "Pendiente", + "removeShare": "Eliminar compartido", + "confirmRemoveShare": "¿Realmente eliminar este compartido?", + "addPerson": "Agregar persona", + "share": "Compartir", + "sharing": "Compartiendo...", + "permission": { + "read": "Lectura", + "write": "Lectura y edición", + "admin": "Administrador" + }, + "form": { + "calendar": "Calendario", + "email": "Dirección de correo", + "permission": "Permiso" + } + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/calendar/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/fr.json new file mode 100644 index 000000000..68db567da --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/fr.json @@ -0,0 +1,275 @@ +{ + "app": { + "name": "Calendrier", + "loading": "Chargement..." + }, + "nav": { + "calendar": "Calendrier", + "calendars": "Calendriers", + "agenda": "Agenda", + "settings": "Paramètres", + "feedback": "Commentaires" + }, + "views": { + "day": "Jour", + "5day": "5 jours", + "week": "Semaine", + "10day": "10 jours", + "14day": "14 jours", + "month": "Mois", + "year": "Année", + "agenda": "Agenda", + "weekdaysOnly": "Jours ouvrables", + "allDay": "Toute la journée", + "birthday": "Anniversaire", + "weekView": "Vue semaine", + "monthView": "Vue mois" + }, + "calendar": { + "today": "Aujourd'hui", + "newEvent": "Nouvel événement", + "noEvents": "Aucun événement", + "allDay": "Toute la journée", + "myCalendars": "Mes calendriers", + "sharedCalendars": "Calendriers partagés", + "untitled": "Sans titre", + "contextMenu": { + "edit": "Modifier", + "duplicate": "Dupliquer", + "copy": "Copie", + "delete": "Supprimer" + } + }, + "event": { + "title": "Titre", + "description": "Description", + "location": "Lieu", + "start": "Début", + "end": "Fin", + "allDay": "Toute la journée", + "repeat": "Répéter", + "reminder": "Rappel", + "calendar": "Calendrier", + "save": "Enregistrer", + "delete": "Supprimer", + "cancel": "Annuler" + }, + "repeat": { + "none": "Ne pas répéter", + "daily": "Quotidien", + "weekly": "Hebdomadaire", + "monthly": "Mensuel", + "yearly": "Annuel" + }, + "reminder": { + "atTime": "Au moment de l'événement", + "5min": "5 minutes avant", + "15min": "15 minutes avant", + "30min": "30 minutes avant", + "1hour": "1 heure avant", + "1day": "1 jour avant" + }, + "share": { + "share": "Partager", + "shareCalendar": "Partager le calendrier", + "permissions": "Autorisations", + "read": "Lecture seule", + "write": "Modification", + "admin": "Administrateur", + "pending": "En attente", + "accepted": "Accepté" + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "register": "Inscription", + "email": "E-mail", + "password": "Mot de passe", + "forgotPassword": "Mot de passe oublié?" + }, + "toast": { + "eventLoadError": "Impossible de charger les événements", + "eventUpdateError": "Impossible de mettre à jour l'événement", + "eventDeleteError": "Impossible de supprimer l'événement", + "eventDeleted": "Événement supprimé", + "error": "Erreur", + "calendarShared": "Calendrier partagé avec {email}", + "shareLinkCreated": "Lien de partage créé", + "inviteAccepted": "Invitation acceptée", + "shareRemoved": "Partage supprimé", + "shareError": "Échec du partage", + "updateError": "Échec de la mise à jour", + "removeError": "Échec de la suppression", + "declineError": "Échec du refus", + "calendarConnected": "{name} connecté", + "calendarDisconnected": "{name} déconnecté", + "syncCompleted": "Synchronisation terminée", + "connectionError": "Échec de la connexion", + "syncError": "Échec de la synchronisation" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "add": "Ajouter", + "close": "Fermer", + "search": "Rechercher", + "error": "Erreur", + "success": "Succès", + "calendar": "Calendrier", + "create": "Créer" + }, + "settings": { + "myCalendars": "Mes calendriers", + "externalCalendars": "Calendriers externes", + "shares": "Partage de calendriers", + "appSettings": "Paramètres de l'app", + "appSettingsDesc": "Ces paramètres sont synchronisés avec toutes les apps Mana", + "calendarView": "Vue du calendrier", + "events": "Événements", + "birthdays": "Anniversaires", + "account": "Compte", + "newCalendar": "Nouveau calendrier", + "calendarName": "Nom du calendrier", + "name": "Nom", + "color": "Couleur", + "default": "Par défaut", + "setAsDefault": "Définir comme calendrier par défaut", + "currentDefault": "par défaut actuel", + "noCalendars": "Aucun calendrier disponible", + "calendarCreated": "Calendrier créé", + "calendarUpdated": "Calendrier mis à jour", + "calendarDeleted": "Calendrier supprimé", + "confirmDeleteCalendar": "Voulez-vous vraiment supprimer \"{name}\" ?", + "externalCalendarsDesc": "Connectez Google Calendar, Apple Calendar, CalDAV ou des URLs iCal.", + "manageSync": "Gérer la synchronisation", + "sharesDesc": "Partagez des calendriers avec d'autres utilisateurs ou gérez les invitations.", + "manageShares": "Gérer les partages", + "defaultView": "Vue par défaut", + "defaultViewDesc": "Vue à l'ouverture du calendrier", + "selectView": "Choisir la vue", + "viewWeek": "Semaine", + "viewMonth": "Mois", + "viewAgenda": "Agenda", + "timeFormat": "Format de l'heure", + "timeFormatDesc": "Affichage des heures", + "weekdaysOnly": "Afficher uniquement les jours ouvrables", + "weekdaysOnlyDesc": "Masquer les week-ends dans la vue du calendrier", + "showWeekNumbers": "Afficher les numéros de semaine", + "showWeekNumbersDesc": "Afficher le numéro de semaine dans la vue du calendrier", + "filterHours": "Filtrer les heures", + "filterHoursDesc": "Afficher uniquement certaines heures dans la vue jour/semaine", + "visibleHours": "Heures visibles", + "visibleHoursDesc": "Plage horaire affichée dans la vue du calendrier", + "hoursFrom": "De", + "hoursTo": "À", + "allDayEvents": "Événements sur toute la journée", + "allDayEventsDesc": "Comment afficher les événements sur toute la journée ?", + "allDayInHeader": "Dans l'en-tête", + "allDayAsBlock": "En bloc journalier", + "defaultDuration": "Durée par défaut", + "defaultDurationDesc": "Durée par défaut pour les nouveaux événements", + "selectDuration": "Choisir la durée", + "durationMinutes": "{count} minutes", + "durationHours": "{count} heure(s)", + "defaultReminder": "Rappel par défaut", + "defaultReminderDesc": "Rappel par défaut pour les nouveaux événements", + "selectReminder": "Choisir le rappel", + "reminderNone": "Aucun", + "reminderMinutes": "{count} minutes", + "reminderHour": "1 heure", + "reminderDay": "1 jour", + "showBirthdays": "Afficher les anniversaires", + "showBirthdaysDesc": "Afficher les anniversaires des contacts dans le calendrier", + "showAge": "Afficher l'âge", + "showAgeDesc": "Afficher l'âge de la personne lors des anniversaires" + }, + "error": { + "notFound": "Page non trouvée", + "backToHome": "Retour à l'accueil" + }, + "sync": { + "pageTitle": "Sync des calendriers - Paramètres", + "title": "Sync des calendriers", + "back": "Retour", + "connectCalendar": "Connecter un calendrier", + "description": "Connectez des calendriers externes pour importer et synchroniser des événements.", + "emptyState": "Aucun calendrier externe connecté", + "syncNow": "Synchroniser maintenant", + "disconnect": "Déconnecter", + "confirmDisconnect": "Vraiment déconnecter \"{name}\" ? Les événements synchronisés seront supprimés.", + "neverSynced": "Jamais", + "directionLabel": "Direction", + "lastSync": "Dernière sync", + "statusLabel": "Statut", + "autoSync": "Sync auto", + "connectCaldav": "Connecter un serveur CalDAV", + "connectProvider": "Connecter {provider}", + "searching": "Recherche...", + "searchCalendars": "Rechercher des calendriers", + "discoveredCalendars": "Calendriers trouvés :", + "connecting": "Connexion...", + "connect": "Connecter", + "direction": { + "import": "Import uniquement", + "export": "Export uniquement", + "both": "Bidirectionnel" + }, + "status": { + "error": "Erreur", + "active": "Actif (toutes les {interval} min.)", + "paused": "En pause" + }, + "providers": { + "icalUrl": "URL iCal", + "icalUrlDesc": "Importer un lien ICS (ex. jours fériés)", + "caldav": "CalDAV", + "caldavDesc": "Connecter un serveur CalDAV", + "google": "Google Calendar", + "googleDesc": "Synchroniser avec Google Agenda", + "apple": "Apple Calendar", + "appleDesc": "Connecter le calendrier iCloud" + }, + "form": { + "serverUrl": "URL du serveur", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "name": "Nom", + "namePlaceholder": "Mon calendrier externe", + "url": "URL", + "syncDirection": "Direction de sync" + } + }, + "sharing": { + "pageTitle": "Partage de calendriers - Paramètres", + "title": "Partages", + "back": "Retour", + "shareCalendar": "Partager le calendrier", + "invitations": "Invitations ({count})", + "calendarInvitation": "Invitation de calendrier", + "access": "accès", + "accept": "Accepter", + "sharedWithMe": "Partagés avec moi", + "sharedCalendar": "Calendrier partagé", + "shareMyCalendars": "Partager mes calendriers", + "notSharedYet": "Pas encore partagé", + "linkShare": "Partage par lien", + "pending": "En attente", + "removeShare": "Supprimer le partage", + "confirmRemoveShare": "Vraiment supprimer ce partage ?", + "addPerson": "Ajouter une personne", + "share": "Partager", + "sharing": "Partage...", + "permission": { + "read": "Lecture", + "write": "Lecture & modification", + "admin": "Administrateur" + }, + "form": { + "calendar": "Calendrier", + "email": "Adresse e-mail", + "permission": "Autorisation" + } + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/calendar/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/it.json new file mode 100644 index 000000000..7f4c648b1 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/calendar/it.json @@ -0,0 +1,275 @@ +{ + "app": { + "name": "Calendario", + "loading": "Caricamento..." + }, + "nav": { + "calendar": "Calendario", + "calendars": "Calendari", + "agenda": "Agenda", + "settings": "Impostazioni", + "feedback": "Feedback" + }, + "views": { + "day": "Giorno", + "5day": "5 giorni", + "week": "Settimana", + "10day": "10 giorni", + "14day": "14 giorni", + "month": "Mese", + "year": "Anno", + "agenda": "Agenda", + "weekdaysOnly": "Solo giorni feriali", + "allDay": "Tutto il giorno", + "birthday": "Compleanno", + "weekView": "Vista settimanale", + "monthView": "Vista mensile" + }, + "calendar": { + "today": "Oggi", + "newEvent": "Nuovo evento", + "noEvents": "Nessun evento", + "allDay": "Tutto il giorno", + "myCalendars": "I miei calendari", + "sharedCalendars": "Calendari condivisi", + "untitled": "Senza titolo", + "contextMenu": { + "edit": "Modifica", + "duplicate": "Duplica", + "copy": "Copia", + "delete": "Elimina" + } + }, + "event": { + "title": "Titolo", + "description": "Descrizione", + "location": "Luogo", + "start": "Inizio", + "end": "Fine", + "allDay": "Tutto il giorno", + "repeat": "Ripeti", + "reminder": "Promemoria", + "calendar": "Calendario", + "save": "Salva", + "delete": "Elimina", + "cancel": "Annulla" + }, + "repeat": { + "none": "Non ripetere", + "daily": "Giornaliero", + "weekly": "Settimanale", + "monthly": "Mensile", + "yearly": "Annuale" + }, + "reminder": { + "atTime": "All'ora dell'evento", + "5min": "5 minuti prima", + "15min": "15 minuti prima", + "30min": "30 minuti prima", + "1hour": "1 ora prima", + "1day": "1 giorno prima" + }, + "share": { + "share": "Condividi", + "shareCalendar": "Condividi calendario", + "permissions": "Autorizzazioni", + "read": "Solo lettura", + "write": "Può modificare", + "admin": "Amministratore", + "pending": "In attesa", + "accepted": "Accettato" + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "register": "Registrati", + "email": "Email", + "password": "Password", + "forgotPassword": "Password dimenticata?" + }, + "toast": { + "eventLoadError": "Impossibile caricare gli eventi", + "eventUpdateError": "Impossibile aggiornare l'evento", + "eventDeleteError": "Impossibile eliminare l'evento", + "eventDeleted": "Evento eliminato", + "error": "Errore", + "calendarShared": "Calendario condiviso con {email}", + "shareLinkCreated": "Link di condivisione creato", + "inviteAccepted": "Invito accettato", + "shareRemoved": "Condivisione rimossa", + "shareError": "Condivisione fallita", + "updateError": "Aggiornamento fallito", + "removeError": "Rimozione fallita", + "declineError": "Rifiuto fallito", + "calendarConnected": "{name} connesso", + "calendarDisconnected": "{name} disconnesso", + "syncCompleted": "Sincronizzazione completata", + "connectionError": "Connessione fallita", + "syncError": "Sincronizzazione fallita" + }, + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "add": "Aggiungi", + "close": "Chiudi", + "search": "Cerca", + "error": "Errore", + "success": "Successo", + "calendar": "Calendario", + "create": "Crea" + }, + "settings": { + "myCalendars": "I miei calendari", + "externalCalendars": "Calendari esterni", + "shares": "Condivisione calendari", + "appSettings": "Impostazioni app", + "appSettingsDesc": "Queste impostazioni vengono sincronizzate con tutte le app Mana", + "calendarView": "Vista del calendario", + "events": "Eventi", + "birthdays": "Compleanni", + "account": "Account", + "newCalendar": "Nuovo calendario", + "calendarName": "Nome del calendario", + "name": "Nome", + "color": "Colore", + "default": "Predefinito", + "setAsDefault": "Imposta come calendario predefinito", + "currentDefault": "predefinito attuale", + "noCalendars": "Nessun calendario disponibile", + "calendarCreated": "Calendario creato", + "calendarUpdated": "Calendario aggiornato", + "calendarDeleted": "Calendario eliminato", + "confirmDeleteCalendar": "Vuoi davvero eliminare \"{name}\"?", + "externalCalendarsDesc": "Collega Google Calendar, Apple Calendar, CalDAV o URL iCal.", + "manageSync": "Gestisci sincronizzazione", + "sharesDesc": "Condividi calendari con altri utenti o gestisci gli inviti.", + "manageShares": "Gestisci condivisioni", + "defaultView": "Vista predefinita", + "defaultViewDesc": "Vista all'apertura del calendario", + "selectView": "Seleziona vista", + "viewWeek": "Settimana", + "viewMonth": "Mese", + "viewAgenda": "Agenda", + "timeFormat": "Formato ora", + "timeFormatDesc": "Come vengono visualizzati gli orari", + "weekdaysOnly": "Mostra solo giorni feriali", + "weekdaysOnlyDesc": "Nascondi i fine settimana nella vista del calendario", + "showWeekNumbers": "Mostra numeri di settimana", + "showWeekNumbersDesc": "Mostra il numero della settimana nella vista del calendario", + "filterHours": "Filtra ore", + "filterHoursDesc": "Mostra solo determinate ore nella vista giorno/settimana", + "visibleHours": "Ore visibili", + "visibleHoursDesc": "Intervallo orario visualizzato nella vista del calendario", + "hoursFrom": "Da", + "hoursTo": "A", + "allDayEvents": "Eventi tutto il giorno", + "allDayEventsDesc": "Come devono essere visualizzati gli eventi tutto il giorno?", + "allDayInHeader": "Nell'intestazione", + "allDayAsBlock": "Come blocco giornaliero", + "defaultDuration": "Durata predefinita", + "defaultDurationDesc": "Durata predefinita per i nuovi eventi", + "selectDuration": "Seleziona durata", + "durationMinutes": "{count} minuti", + "durationHours": "{count} ora/e", + "defaultReminder": "Promemoria predefinito", + "defaultReminderDesc": "Promemoria predefinito per i nuovi eventi", + "selectReminder": "Seleziona promemoria", + "reminderNone": "Nessuno", + "reminderMinutes": "{count} minuti", + "reminderHour": "1 ora", + "reminderDay": "1 giorno", + "showBirthdays": "Mostra compleanni", + "showBirthdaysDesc": "Mostra i compleanni dei contatti nel calendario", + "showAge": "Mostra età", + "showAgeDesc": "Mostra l'età della persona nei compleanni" + }, + "error": { + "notFound": "Pagina non trovata", + "backToHome": "Torna alla home" + }, + "sync": { + "pageTitle": "Sincronizzazione calendari - Impostazioni", + "title": "Sincronizzazione", + "back": "Indietro", + "connectCalendar": "Collega calendario", + "description": "Collega calendari esterni per importare e sincronizzare eventi.", + "emptyState": "Nessun calendario esterno collegato", + "syncNow": "Sincronizza ora", + "disconnect": "Disconnetti", + "confirmDisconnect": "Disconnettere davvero \"{name}\"? Gli eventi sincronizzati verranno eliminati.", + "neverSynced": "Mai", + "directionLabel": "Direzione", + "lastSync": "Ultima sincronizzazione", + "statusLabel": "Stato", + "autoSync": "Sincronizzazione automatica", + "connectCaldav": "Collega server CalDAV", + "connectProvider": "Collega {provider}", + "searching": "Ricerca...", + "searchCalendars": "Cerca calendari", + "discoveredCalendars": "Calendari trovati:", + "connecting": "Collegamento...", + "connect": "Collega", + "direction": { + "import": "Solo importazione", + "export": "Solo esportazione", + "both": "Bidirezionale" + }, + "status": { + "error": "Errore", + "active": "Attivo (ogni {interval} min.)", + "paused": "In pausa" + }, + "providers": { + "icalUrl": "URL iCal", + "icalUrlDesc": "Importa link ICS (es. festività)", + "caldav": "CalDAV", + "caldavDesc": "Collega server CalDAV", + "google": "Google Calendar", + "googleDesc": "Sincronizza con Google Calendar", + "apple": "Apple Calendar", + "appleDesc": "Collega calendario iCloud" + }, + "form": { + "serverUrl": "URL del server", + "username": "Nome utente", + "password": "Password", + "name": "Nome", + "namePlaceholder": "Il mio calendario esterno", + "url": "URL", + "syncDirection": "Direzione di sincronizzazione" + } + }, + "sharing": { + "pageTitle": "Condivisione calendari - Impostazioni", + "title": "Condivisioni", + "back": "Indietro", + "shareCalendar": "Condividi calendario", + "invitations": "Inviti ({count})", + "calendarInvitation": "Invito calendario", + "access": "accesso", + "accept": "Accetta", + "sharedWithMe": "Condivisi con me", + "sharedCalendar": "Calendario condiviso", + "shareMyCalendars": "Condividi i miei calendari", + "notSharedYet": "Non ancora condiviso", + "linkShare": "Condivisione tramite link", + "pending": "In attesa", + "removeShare": "Rimuovi condivisione", + "confirmRemoveShare": "Rimuovere davvero questa condivisione?", + "addPerson": "Aggiungi persona", + "share": "Condividi", + "sharing": "Condivisione...", + "permission": { + "read": "Lettura", + "write": "Lettura e modifica", + "admin": "Amministratore" + }, + "form": { + "calendar": "Calendario", + "email": "Indirizzo email", + "permission": "Autorizzazione" + } + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/de.json new file mode 100644 index 000000000..68d1db538 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/de.json @@ -0,0 +1,255 @@ +{ + "app": { + "name": "CityCorners", + "tagline": "Entdecke Städte weltweit" + }, + "nav": { + "explore": "Entdecken", + "map": "Karte", + "add": "Hinzufügen", + "favorites": "Favoriten", + "settings": "Einstellungen", + "showNav": "Navigation einblenden", + "hideNav": "Navigation ausblenden", + "cities": "Städte" + }, + "cities": { + "title": "Städte entdecken", + "subtitle": "Von der Community für die Community", + "search": "Stadt suchen...", + "add": "Stadt hinzufügen", + "empty": "Noch keine Städte. Sei der Erste!", + "locationsCount": "{count} Orte", + "noLocationsYet": "Noch keine Orte", + "contributors": "{count} Beitragende", + "contributorsOne": "1 Beitragender", + "onMap": "{count} auf der Karte", + "recentlyAdded": "Zuletzt hinzugefügt", + "stats": "Statistiken", + "totalCities": "{count} Städte", + "totalLocations": "{count} Orte", + "totalContributors": "{count} Beitragende", + "topCategories": "Top-Kategorien" + }, + "cityAdd": { + "title": "Neue Stadt anlegen", + "subtitle": "Füge eine Stadt, ein Dorf oder einen Ort hinzu", + "name": "Name", + "namePlaceholder": "z.B. Konstanz", + "country": "Land", + "countryPlaceholder": "z.B. Deutschland", + "state": "Bundesland / Region (optional)", + "statePlaceholder": "z.B. Baden-Württemberg", + "description": "Beschreibung (optional)", + "descriptionPlaceholder": "Was macht diesen Ort besonders?", + "imageUrl": "Bild-URL (optional)", + "imageUrlPlaceholder": "https://example.com/bild.jpg", + "submit": "Stadt anlegen", + "submitting": "Wird angelegt...", + "loginRequired": "Melde dich an, um Städte anzulegen.", + "error": "Fehler beim Anlegen. Bitte versuche es erneut.", + "geocoding": "Koordinaten werden ermittelt...", + "coordinatesFound": "Koordinaten gefunden", + "slugExists": "Eine Stadt mit diesem Namen existiert bereits." + }, + "home": { + "title": "Orte entdecken", + "subtitle": "Sehenswürdigkeiten, Restaurants, Museen und mehr", + "all": "Alle", + "loading": "Laden...", + "noResults": "Keine Orte gefunden.", + "noResultsCategory": "Keine {category} gefunden.", + "addFirst": "Ersten Ort hinzufügen", + "loadMore": "Mehr laden" + }, + "categories": { + "sight": "Sehenswürdigkeiten", + "restaurant": "Restaurants", + "shop": "Läden", + "museum": "Museen", + "cafe": "Cafés", + "bar": "Bars", + "park": "Parks", + "beach": "Strandbäder", + "hotel": "Hotels", + "event_venue": "Veranstaltungsorte", + "viewpoint": "Aussichtspunkte" + }, + "category": { + "sight": "Sehenswürdigkeit", + "restaurant": "Restaurant", + "shop": "Laden", + "museum": "Museum", + "cafe": "Café", + "bar": "Bar", + "park": "Park", + "beach": "Strandbad", + "hotel": "Hotel", + "event_venue": "Veranstaltungsort", + "viewpoint": "Aussichtspunkt" + }, + "detail": { + "history": "Geschichte", + "openInMaps": "OSM", + "showOnMap": "Auf Karte", + "directions": "Route", + "share": "Teilen", + "linkCopied": "Link kopiert!", + "showDetails": "Details", + "back": "Zurück zur Übersicht", + "notFound": "Ort nicht gefunden.", + "edit": "Bearbeiten", + "delete": "Löschen", + "deleteConfirm": "Bist du sicher, dass du diesen Ort löschen möchtest? Das kann nicht rückgängig gemacht werden.", + "confirmDelete": "Endgültig löschen", + "deleting": "Wird gelöscht...", + "cancel": "Abbrechen", + "nearby": "In der Nähe", + "website": "Webseite", + "phone": "Telefon", + "openingHours": "Öffnungszeiten", + "closed": "Geschlossen", + "openNow": "Jetzt geöffnet", + "closedNow": "Geschlossen" + }, + "days": { + "mo": "Montag", + "tu": "Dienstag", + "we": "Mittwoch", + "th": "Donnerstag", + "fr": "Freitag", + "sa": "Samstag", + "su": "Sonntag" + }, + "gallery": { + "addPhoto": "Foto hinzufügen", + "add": "Hinzufügen", + "addError": "Foto konnte nicht hinzugefügt werden." + }, + "favorites": { + "title": "Favoriten", + "subtitle": "Deine gespeicherten Orte", + "empty": "Noch keine Favoriten. Tippe auf das Herz bei einer Location, um sie zu speichern.", + "loginRequired": "Melde dich an, um Favoriten zu speichern.", + "add": "Zu Favoriten hinzufügen", + "remove": "Aus Favoriten entfernen", + "tabFavorites": "Favoriten", + "tabCollections": "Sammlungen" + }, + "collections": { + "title": "Sammlungen", + "empty": "Noch keine Sammlungen erstellt.", + "create": "Sammlung erstellen", + "name": "Name", + "namePlaceholder": "z.B. Meine Lieblingsrestaurants", + "description": "Beschreibung (optional)", + "descriptionPlaceholder": "Worum geht es in dieser Sammlung?", + "save": "Speichern", + "cancel": "Abbrechen", + "locations": "{count} Orte", + "noLocations": "Keine Orte in dieser Sammlung.", + "delete": "Sammlung löschen", + "deleteConfirm": "Bist du sicher, dass du diese Sammlung löschen möchtest?", + "back": "Zurück zu Sammlungen" + }, + "map": { + "title": "Karte", + "subtitle": "Alle Orte auf der Karte", + "locateMe": "Mein Standort", + "yourLocation": "Du bist hier", + "geolocationNotSupported": "Standortbestimmung wird nicht unterstützt.", + "geolocationError": "Standort konnte nicht ermittelt werden.", + "filterAll": "Alle" + }, + "search": { + "placeholder": "Ort suchen...", + "noResults": "Keine Ergebnisse", + "searching": "Suche..." + }, + "settings": { + "title": "Einstellungen", + "appearance": "Erscheinungsbild", + "mode": "Modus", + "light": "Hell", + "dark": "Dunkel", + "system": "System", + "colorScheme": "Farbschema", + "account": "Account", + "email": "E-Mail", + "logout": "Abmelden", + "loginPrompt": "Melde dich an, um Favoriten zu speichern und alle Features zu nutzen.", + "login": "Anmelden", + "register": "Registrieren", + "about": "Über CityCorners", + "aboutText": "CityCorners ist eine offene Plattform für Stadtführer weltweit. Entdecke Orte, die von der Community geteilt werden — oder lege selbst eine Stadt an." + }, + "auth": { + "loginTitle": "Login - CityCorners", + "registerTitle": "Registrieren - CityCorners" + }, + "add": { + "title": "Ort hinzufügen", + "subtitle": "Teile deinen Lieblingsort", + "name": "Name", + "namePlaceholder": "z.B. Café am See", + "category": "Kategorie", + "description": "Beschreibung", + "descriptionPlaceholder": "Was macht diesen Ort besonders?", + "minChars": "Mindestens 10 Zeichen", + "address": "Adresse (optional)", + "addressPlaceholder": "z.B. Seestraße 1", + "searchTitle": "Ort im Web suchen", + "searchSubtitle": "Wir suchen automatisch nach Infos und füllen das Formular vor.", + "searchPlaceholder": "z.B. Café Zeitlos", + "searchButton": "Suchen", + "skipSearch": "Überspringen und manuell eintragen", + "foundSources": "Quellen gefunden:", + "reset": "Zurück", + "submit": "Ort einreichen", + "submitting": "Wird eingereicht...", + "loginRequired": "Melde dich an, um Orte hinzuzufügen.", + "error": "Fehler beim Einreichen. Bitte versuche es erneut.", + "imageUrl": "Bild-URL (optional)", + "imageUrlPlaceholder": "https://example.com/bild.jpg", + "imagePreview": "Bildvorschau", + "imageLoadError": "Bild konnte nicht geladen werden.", + "imageRetry": "Erneut versuchen", + "geocoding": "Koordinaten werden ermittelt...", + "coordinatesFound": "Koordinaten gefunden", + "website": "Webseite (optional)", + "websitePlaceholder": "https://example.com", + "phone": "Telefon (optional)", + "phonePlaceholder": "+49 7531 12345" + }, + "edit": { + "title": "Ort bearbeiten", + "subtitle": "Ändere die Details dieses Ortes", + "save": "Änderungen speichern", + "saving": "Wird gespeichert...", + "cancel": "Abbrechen", + "error": "Fehler beim Speichern. Bitte versuche es erneut.", + "loadError": "Ort konnte nicht geladen werden.", + "forbidden": "Du kannst nur deine eigenen Orte bearbeiten." + }, + "reviews": { + "title": "Bewertungen", + "write": "Bewertung schreiben", + "yourRating": "Deine Bewertung", + "commentPlaceholder": "Was hat dir gefallen? (optional)", + "submit": "Absenden", + "submitting": "Wird gesendet...", + "loginRequired": "Melde dich an, um eine Bewertung zu schreiben.", + "alreadyReviewed": "Du hast diesen Ort bereits bewertet.", + "deleteConfirm": "Bewertung löschen?", + "delete": "Löschen", + "noReviews": "Noch keine Bewertungen. Sei der Erste!", + "error": "Bewertung konnte nicht gespeichert werden.", + "count": "{count} Bewertungen", + "countOne": "1 Bewertung" + }, + "offline": { + "title": "Keine Verbindung", + "message": "Du bist gerade offline. Sobald du wieder eine Internetverbindung hast, kannst du CityCorners weiter nutzen.", + "retry": "Erneut versuchen" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/en.json new file mode 100644 index 000000000..75b2c0686 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/en.json @@ -0,0 +1,255 @@ +{ + "app": { + "name": "CityCorners", + "tagline": "Discover cities worldwide" + }, + "nav": { + "explore": "Explore", + "map": "Map", + "add": "Add", + "favorites": "Favorites", + "settings": "Settings", + "showNav": "Show navigation", + "hideNav": "Hide navigation", + "cities": "Cities" + }, + "cities": { + "title": "Discover cities", + "subtitle": "By the community, for the community", + "search": "Search cities...", + "add": "Add a city", + "empty": "No cities yet. Be the first!", + "locationsCount": "{count} places", + "noLocationsYet": "No places yet", + "contributors": "{count} contributors", + "contributorsOne": "1 contributor", + "onMap": "{count} on the map", + "recentlyAdded": "Recently added", + "stats": "Statistics", + "totalCities": "{count} cities", + "totalLocations": "{count} places", + "totalContributors": "{count} contributors", + "topCategories": "Top categories" + }, + "cityAdd": { + "title": "Add a new city", + "subtitle": "Add a city, village, or town", + "name": "Name", + "namePlaceholder": "e.g. Berlin", + "country": "Country", + "countryPlaceholder": "e.g. Germany", + "state": "State / Region (optional)", + "statePlaceholder": "e.g. Bavaria", + "description": "Description (optional)", + "descriptionPlaceholder": "What makes this place special?", + "imageUrl": "Image URL (optional)", + "imageUrlPlaceholder": "https://example.com/image.jpg", + "submit": "Add city", + "submitting": "Creating...", + "loginRequired": "Sign in to add cities.", + "error": "Failed to create. Please try again.", + "geocoding": "Finding coordinates...", + "coordinatesFound": "Coordinates found", + "slugExists": "A city with this name already exists." + }, + "home": { + "title": "Discover places", + "subtitle": "Sights, restaurants, museums and more", + "all": "All", + "loading": "Loading...", + "noResults": "No places found.", + "noResultsCategory": "No {category} found.", + "addFirst": "Add the first place", + "loadMore": "Load more" + }, + "categories": { + "sight": "Sights", + "restaurant": "Restaurants", + "shop": "Shops", + "museum": "Museums", + "cafe": "Cafés", + "bar": "Bars", + "park": "Parks", + "beach": "Beaches", + "hotel": "Hotels", + "event_venue": "Event Venues", + "viewpoint": "Viewpoints" + }, + "category": { + "sight": "Sight", + "restaurant": "Restaurant", + "shop": "Shop", + "museum": "Museum", + "cafe": "Café", + "bar": "Bar", + "park": "Park", + "beach": "Beach", + "hotel": "Hotel", + "event_venue": "Event Venue", + "viewpoint": "Viewpoint" + }, + "detail": { + "history": "History", + "openInMaps": "OSM", + "showOnMap": "On map", + "directions": "Directions", + "share": "Share", + "linkCopied": "Link copied!", + "showDetails": "Details", + "back": "Back to overview", + "notFound": "Place not found.", + "edit": "Edit", + "delete": "Delete", + "deleteConfirm": "Are you sure you want to delete this place? This cannot be undone.", + "confirmDelete": "Delete permanently", + "deleting": "Deleting...", + "cancel": "Cancel", + "nearby": "Nearby", + "website": "Website", + "phone": "Phone", + "openingHours": "Opening hours", + "closed": "Closed", + "openNow": "Open now", + "closedNow": "Closed" + }, + "days": { + "mo": "Monday", + "tu": "Tuesday", + "we": "Wednesday", + "th": "Thursday", + "fr": "Friday", + "sa": "Saturday", + "su": "Sunday" + }, + "gallery": { + "addPhoto": "Add photo", + "add": "Add", + "addError": "Could not add photo." + }, + "favorites": { + "title": "Favorites", + "subtitle": "Your saved places", + "empty": "No favorites yet. Tap the heart on a location to save it.", + "loginRequired": "Sign in to save favorites.", + "add": "Add to favorites", + "remove": "Remove from favorites", + "tabFavorites": "Favorites", + "tabCollections": "Collections" + }, + "collections": { + "title": "Collections", + "empty": "No collections created yet.", + "create": "Create collection", + "name": "Name", + "namePlaceholder": "e.g. My favorite restaurants", + "description": "Description (optional)", + "descriptionPlaceholder": "What is this collection about?", + "save": "Save", + "cancel": "Cancel", + "locations": "{count} places", + "noLocations": "No places in this collection.", + "delete": "Delete collection", + "deleteConfirm": "Are you sure you want to delete this collection?", + "back": "Back to collections" + }, + "map": { + "title": "Map", + "subtitle": "All places on the map", + "locateMe": "My location", + "yourLocation": "You are here", + "geolocationNotSupported": "Geolocation is not supported.", + "geolocationError": "Could not determine location.", + "filterAll": "All" + }, + "search": { + "placeholder": "Search places...", + "noResults": "No results", + "searching": "Searching..." + }, + "settings": { + "title": "Settings", + "appearance": "Appearance", + "mode": "Mode", + "light": "Light", + "dark": "Dark", + "system": "System", + "colorScheme": "Color scheme", + "account": "Account", + "email": "Email", + "logout": "Sign out", + "loginPrompt": "Sign in to save favorites and use all features.", + "login": "Sign in", + "register": "Sign up", + "about": "About CityCorners", + "aboutText": "CityCorners is an open platform for city guides worldwide. Discover places shared by the community — or add your own city." + }, + "auth": { + "loginTitle": "Login - CityCorners", + "registerTitle": "Sign up - CityCorners" + }, + "add": { + "title": "Add a place", + "subtitle": "Share your favorite spot", + "name": "Name", + "namePlaceholder": "e.g. Lakeside Cafe", + "category": "Category", + "description": "Description", + "descriptionPlaceholder": "What makes this place special?", + "minChars": "At least 10 characters", + "address": "Address (optional)", + "addressPlaceholder": "e.g. Main Street 1", + "searchTitle": "Search for a place online", + "searchSubtitle": "We'll automatically find info and pre-fill the form for you.", + "searchPlaceholder": "e.g. Cafe Zeitlos", + "searchButton": "Search", + "skipSearch": "Skip and enter manually", + "foundSources": "Sources found:", + "reset": "Back", + "submit": "Submit place", + "submitting": "Submitting...", + "loginRequired": "Sign in to add places.", + "error": "Failed to submit. Please try again.", + "imageUrl": "Image URL (optional)", + "imageUrlPlaceholder": "https://example.com/image.jpg", + "imagePreview": "Image preview", + "imageLoadError": "Image could not be loaded.", + "imageRetry": "Retry", + "geocoding": "Finding coordinates...", + "coordinatesFound": "Coordinates found", + "website": "Website (optional)", + "websitePlaceholder": "https://example.com", + "phone": "Phone (optional)", + "phonePlaceholder": "+49 7531 12345" + }, + "edit": { + "title": "Edit place", + "subtitle": "Update the details of this place", + "save": "Save changes", + "saving": "Saving...", + "cancel": "Cancel", + "error": "Failed to save. Please try again.", + "loadError": "Could not load place.", + "forbidden": "You can only edit your own places." + }, + "reviews": { + "title": "Reviews", + "write": "Write a review", + "yourRating": "Your rating", + "commentPlaceholder": "What did you like? (optional)", + "submit": "Submit", + "submitting": "Submitting...", + "loginRequired": "Sign in to write a review.", + "alreadyReviewed": "You have already reviewed this place.", + "deleteConfirm": "Delete review?", + "delete": "Delete", + "noReviews": "No reviews yet. Be the first!", + "error": "Could not save review.", + "count": "{count} reviews", + "countOne": "1 review" + }, + "offline": { + "title": "No connection", + "message": "You are currently offline. You can continue using CityCorners once you have an internet connection again.", + "retry": "Try again" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/es.json new file mode 100644 index 000000000..dac28f8ee --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/es.json @@ -0,0 +1,255 @@ +{ + "app": { + "name": "CityCorners", + "tagline": "Descubre ciudades en todo el mundo" + }, + "nav": { + "explore": "Explorar", + "map": "Mapa", + "add": "Agregar", + "favorites": "Favoritos", + "settings": "Ajustes", + "showNav": "Mostrar navegación", + "hideNav": "Ocultar navegación", + "cities": "Ciudades" + }, + "cities": { + "title": "Descubrir ciudades", + "subtitle": "De la comunidad, para la comunidad", + "search": "Buscar ciudades...", + "add": "Agregar ciudad", + "empty": "Aún no hay ciudades. ¡Sé el primero!", + "locationsCount": "{count} lugares", + "noLocationsYet": "Aún no hay lugares", + "contributors": "{count} colaboradores", + "contributorsOne": "1 colaborador", + "onMap": "{count} en el mapa", + "recentlyAdded": "Agregados recientemente", + "stats": "Estadísticas", + "totalCities": "{count} ciudades", + "totalLocations": "{count} lugares", + "totalContributors": "{count} colaboradores", + "topCategories": "Categorías principales" + }, + "cityAdd": { + "title": "Agregar nueva ciudad", + "subtitle": "Agrega una ciudad, pueblo o localidad", + "name": "Nombre", + "namePlaceholder": "ej. Madrid", + "country": "País", + "countryPlaceholder": "ej. España", + "state": "Comunidad / Región (opcional)", + "statePlaceholder": "ej. Comunidad de Madrid", + "description": "Descripción (opcional)", + "descriptionPlaceholder": "¿Qué hace especial a este lugar?", + "imageUrl": "URL de imagen (opcional)", + "imageUrlPlaceholder": "https://example.com/imagen.jpg", + "submit": "Agregar ciudad", + "submitting": "Creando...", + "loginRequired": "Inicia sesión para agregar ciudades.", + "error": "Error al crear. Inténtalo de nuevo.", + "geocoding": "Buscando coordenadas...", + "coordinatesFound": "Coordenadas encontradas", + "slugExists": "Ya existe una ciudad con este nombre." + }, + "home": { + "title": "Descubrir lugares", + "subtitle": "Monumentos, restaurantes, museos y más", + "all": "Todos", + "loading": "Cargando...", + "noResults": "No se encontraron lugares.", + "noResultsCategory": "No se encontraron {category}.", + "addFirst": "Agrega el primer lugar", + "loadMore": "Cargar más" + }, + "categories": { + "sight": "Monumentos", + "restaurant": "Restaurantes", + "shop": "Tiendas", + "museum": "Museos", + "cafe": "Cafeterías", + "bar": "Bares", + "park": "Parques", + "beach": "Playas", + "hotel": "Hoteles", + "event_venue": "Salas de eventos", + "viewpoint": "Miradores" + }, + "category": { + "sight": "Monumento", + "restaurant": "Restaurante", + "shop": "Tienda", + "museum": "Museo", + "cafe": "Cafetería", + "bar": "Bar", + "park": "Parque", + "beach": "Playa", + "hotel": "Hotel", + "event_venue": "Sala de eventos", + "viewpoint": "Mirador" + }, + "detail": { + "history": "Historia", + "openInMaps": "OSM", + "showOnMap": "En el mapa", + "directions": "Cómo llegar", + "share": "Compartir", + "linkCopied": "¡Enlace copiado!", + "showDetails": "Detalles", + "back": "Volver al listado", + "notFound": "Lugar no encontrado.", + "edit": "Editar", + "delete": "Eliminar", + "deleteConfirm": "¿Seguro que quieres eliminar este lugar? No se puede deshacer.", + "confirmDelete": "Eliminar definitivamente", + "deleting": "Eliminando...", + "cancel": "Cancelar", + "nearby": "Cerca", + "website": "Sitio web", + "phone": "Teléfono", + "openingHours": "Horario", + "closed": "Cerrado", + "openNow": "Abierto ahora", + "closedNow": "Cerrado" + }, + "days": { + "mo": "Lunes", + "tu": "Martes", + "we": "Miércoles", + "th": "Jueves", + "fr": "Viernes", + "sa": "Sábado", + "su": "Domingo" + }, + "gallery": { + "addPhoto": "Agregar foto", + "add": "Agregar", + "addError": "No se pudo agregar la foto." + }, + "favorites": { + "title": "Favoritos", + "subtitle": "Tus lugares guardados", + "empty": "Aún no hay favoritos. Toca el corazón en un lugar para guardarlo.", + "loginRequired": "Inicia sesión para guardar favoritos.", + "add": "Agregar a favoritos", + "remove": "Quitar de favoritos", + "tabFavorites": "Favoritos", + "tabCollections": "Colecciones" + }, + "collections": { + "title": "Colecciones", + "empty": "Aún no hay colecciones.", + "create": "Crear colección", + "name": "Nombre", + "namePlaceholder": "ej. Mis restaurantes favoritos", + "description": "Descripción (opcional)", + "descriptionPlaceholder": "¿De qué trata esta colección?", + "save": "Guardar", + "cancel": "Cancelar", + "locations": "{count} lugares", + "noLocations": "No hay lugares en esta colección.", + "delete": "Eliminar colección", + "deleteConfirm": "¿Seguro que quieres eliminar esta colección?", + "back": "Volver a colecciones" + }, + "map": { + "title": "Mapa", + "subtitle": "Todos los lugares en el mapa", + "locateMe": "Mi ubicación", + "yourLocation": "Estás aquí", + "geolocationNotSupported": "La geolocalización no está disponible.", + "geolocationError": "No se pudo determinar la ubicación.", + "filterAll": "Todos" + }, + "search": { + "placeholder": "Buscar lugares...", + "noResults": "Sin resultados", + "searching": "Buscando..." + }, + "settings": { + "title": "Ajustes", + "appearance": "Apariencia", + "mode": "Modo", + "light": "Claro", + "dark": "Oscuro", + "system": "Sistema", + "colorScheme": "Esquema de color", + "account": "Cuenta", + "email": "Email", + "logout": "Cerrar sesión", + "loginPrompt": "Inicia sesión para guardar favoritos y usar todas las funciones.", + "login": "Iniciar sesión", + "register": "Registrarse", + "about": "Sobre CityCorners", + "aboutText": "CityCorners es una plataforma abierta para guías de ciudades en todo el mundo. Descubre lugares compartidos por la comunidad o agrega tu propia ciudad." + }, + "auth": { + "loginTitle": "Login - CityCorners", + "registerTitle": "Registro - CityCorners" + }, + "add": { + "title": "Agregar un lugar", + "subtitle": "Comparte tu sitio favorito", + "name": "Nombre", + "namePlaceholder": "ej. Café del Lago", + "category": "Categoría", + "description": "Descripción", + "descriptionPlaceholder": "¿Qué hace especial a este lugar?", + "minChars": "Mínimo 10 caracteres", + "address": "Dirección (opcional)", + "addressPlaceholder": "ej. Calle Mayor 1", + "searchTitle": "Buscar un lugar en línea", + "searchSubtitle": "Encontraremos la información y rellenaremos el formulario automáticamente.", + "searchPlaceholder": "ej. Café Zeitlos", + "searchButton": "Buscar", + "skipSearch": "Omitir e ingresar manualmente", + "foundSources": "Fuentes encontradas:", + "reset": "Atrás", + "submit": "Enviar lugar", + "submitting": "Enviando...", + "loginRequired": "Inicia sesión para agregar lugares.", + "error": "Error al enviar. Inténtalo de nuevo.", + "imageUrl": "URL de imagen (opcional)", + "imageUrlPlaceholder": "https://example.com/imagen.jpg", + "imagePreview": "Vista previa de imagen", + "imageLoadError": "No se pudo cargar la imagen.", + "imageRetry": "Reintentar", + "geocoding": "Buscando coordenadas...", + "coordinatesFound": "Coordenadas encontradas", + "website": "Sitio web (opcional)", + "websitePlaceholder": "https://example.com", + "phone": "Teléfono (opcional)", + "phonePlaceholder": "+34 91 123 4567" + }, + "edit": { + "title": "Editar lugar", + "subtitle": "Actualiza los detalles de este lugar", + "save": "Guardar cambios", + "saving": "Guardando...", + "cancel": "Cancelar", + "error": "Error al guardar. Inténtalo de nuevo.", + "loadError": "No se pudo cargar el lugar.", + "forbidden": "Solo puedes editar tus propios lugares." + }, + "reviews": { + "title": "Reseñas", + "write": "Escribir reseña", + "yourRating": "Tu valoración", + "commentPlaceholder": "¿Qué te gustó? (opcional)", + "submit": "Enviar", + "submitting": "Enviando...", + "loginRequired": "Inicia sesión para escribir una reseña.", + "alreadyReviewed": "Ya has opinado sobre este lugar.", + "deleteConfirm": "¿Eliminar reseña?", + "delete": "Eliminar", + "noReviews": "Aún no hay reseñas. ¡Sé el primero!", + "error": "No se pudo guardar la reseña.", + "count": "{count} reseñas", + "countOne": "1 reseña" + }, + "offline": { + "title": "Sin conexión", + "message": "Estás sin conexión. Puedes seguir usando CityCorners cuando tengas conexión a internet.", + "retry": "Reintentar" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/fr.json new file mode 100644 index 000000000..4908ed9dd --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/fr.json @@ -0,0 +1,255 @@ +{ + "app": { + "name": "CityCorners", + "tagline": "Découvrez des villes du monde entier" + }, + "nav": { + "explore": "Explorer", + "map": "Carte", + "add": "Ajouter", + "favorites": "Favoris", + "settings": "Paramètres", + "showNav": "Afficher la navigation", + "hideNav": "Masquer la navigation", + "cities": "Villes" + }, + "cities": { + "title": "Découvrir des villes", + "subtitle": "Par la communauté, pour la communauté", + "search": "Rechercher des villes...", + "add": "Ajouter une ville", + "empty": "Pas encore de villes. Soyez le premier !", + "locationsCount": "{count} lieux", + "noLocationsYet": "Pas encore de lieux", + "contributors": "{count} contributeurs", + "contributorsOne": "1 contributeur", + "onMap": "{count} sur la carte", + "recentlyAdded": "Ajoutés récemment", + "stats": "Statistiques", + "totalCities": "{count} villes", + "totalLocations": "{count} lieux", + "totalContributors": "{count} contributeurs", + "topCategories": "Catégories principales" + }, + "cityAdd": { + "title": "Ajouter une ville", + "subtitle": "Ajoutez une ville, un village ou une localité", + "name": "Nom", + "namePlaceholder": "ex. Paris", + "country": "Pays", + "countryPlaceholder": "ex. France", + "state": "Région / Département (optionnel)", + "statePlaceholder": "ex. Île-de-France", + "description": "Description (optionnel)", + "descriptionPlaceholder": "Qu'est-ce qui rend cet endroit spécial ?", + "imageUrl": "URL de l'image (optionnel)", + "imageUrlPlaceholder": "https://example.com/image.jpg", + "submit": "Ajouter la ville", + "submitting": "Création...", + "loginRequired": "Connectez-vous pour ajouter des villes.", + "error": "Échec de la création. Veuillez réessayer.", + "geocoding": "Recherche des coordonnées...", + "coordinatesFound": "Coordonnées trouvées", + "slugExists": "Une ville avec ce nom existe déjà." + }, + "home": { + "title": "Découvrir des lieux", + "subtitle": "Monuments, restaurants, musées et plus", + "all": "Tous", + "loading": "Chargement...", + "noResults": "Aucun lieu trouvé.", + "noResultsCategory": "Aucun {category} trouvé.", + "addFirst": "Ajoutez le premier lieu", + "loadMore": "Charger plus" + }, + "categories": { + "sight": "Monuments", + "restaurant": "Restaurants", + "shop": "Boutiques", + "museum": "Musées", + "cafe": "Cafés", + "bar": "Bars", + "park": "Parcs", + "beach": "Plages", + "hotel": "Hôtels", + "event_venue": "Salles d'événements", + "viewpoint": "Points de vue" + }, + "category": { + "sight": "Monument", + "restaurant": "Restaurant", + "shop": "Boutique", + "museum": "Musée", + "cafe": "Café", + "bar": "Bar", + "park": "Parc", + "beach": "Plage", + "hotel": "Hôtel", + "event_venue": "Salle d'événements", + "viewpoint": "Point de vue" + }, + "detail": { + "history": "Histoire", + "openInMaps": "OSM", + "showOnMap": "Sur la carte", + "directions": "Itinéraire", + "share": "Partager", + "linkCopied": "Lien copié !", + "showDetails": "Détails", + "back": "Retour à la liste", + "notFound": "Lieu introuvable.", + "edit": "Modifier", + "delete": "Supprimer", + "deleteConfirm": "Voulez-vous vraiment supprimer ce lieu ? Cette action est irréversible.", + "confirmDelete": "Supprimer définitivement", + "deleting": "Suppression...", + "cancel": "Annuler", + "nearby": "À proximité", + "website": "Site web", + "phone": "Téléphone", + "openingHours": "Horaires d'ouverture", + "closed": "Fermé", + "openNow": "Ouvert", + "closedNow": "Fermé" + }, + "days": { + "mo": "Lundi", + "tu": "Mardi", + "we": "Mercredi", + "th": "Jeudi", + "fr": "Vendredi", + "sa": "Samedi", + "su": "Dimanche" + }, + "gallery": { + "addPhoto": "Ajouter une photo", + "add": "Ajouter", + "addError": "Impossible d'ajouter la photo." + }, + "favorites": { + "title": "Favoris", + "subtitle": "Vos lieux enregistrés", + "empty": "Pas encore de favoris. Appuyez sur le cœur pour sauvegarder un lieu.", + "loginRequired": "Connectez-vous pour sauvegarder vos favoris.", + "add": "Ajouter aux favoris", + "remove": "Retirer des favoris", + "tabFavorites": "Favoris", + "tabCollections": "Collections" + }, + "collections": { + "title": "Collections", + "empty": "Pas encore de collections.", + "create": "Créer une collection", + "name": "Nom", + "namePlaceholder": "ex. Mes restaurants préférés", + "description": "Description (optionnel)", + "descriptionPlaceholder": "De quoi parle cette collection ?", + "save": "Enregistrer", + "cancel": "Annuler", + "locations": "{count} lieux", + "noLocations": "Aucun lieu dans cette collection.", + "delete": "Supprimer la collection", + "deleteConfirm": "Voulez-vous vraiment supprimer cette collection ?", + "back": "Retour aux collections" + }, + "map": { + "title": "Carte", + "subtitle": "Tous les lieux sur la carte", + "locateMe": "Ma position", + "yourLocation": "Vous êtes ici", + "geolocationNotSupported": "La géolocalisation n'est pas disponible.", + "geolocationError": "Impossible de déterminer la position.", + "filterAll": "Tous" + }, + "search": { + "placeholder": "Rechercher des lieux...", + "noResults": "Aucun résultat", + "searching": "Recherche..." + }, + "settings": { + "title": "Paramètres", + "appearance": "Apparence", + "mode": "Mode", + "light": "Clair", + "dark": "Sombre", + "system": "Système", + "colorScheme": "Thème de couleur", + "account": "Compte", + "email": "Email", + "logout": "Déconnexion", + "loginPrompt": "Connectez-vous pour sauvegarder vos favoris et utiliser toutes les fonctions.", + "login": "Connexion", + "register": "Inscription", + "about": "À propos de CityCorners", + "aboutText": "CityCorners est une plateforme ouverte de guides de villes du monde entier. Découvrez des lieux partagés par la communauté ou ajoutez votre propre ville." + }, + "auth": { + "loginTitle": "Connexion - CityCorners", + "registerTitle": "Inscription - CityCorners" + }, + "add": { + "title": "Ajouter un lieu", + "subtitle": "Partagez votre endroit préféré", + "name": "Nom", + "namePlaceholder": "ex. Café du Lac", + "category": "Catégorie", + "description": "Description", + "descriptionPlaceholder": "Qu'est-ce qui rend cet endroit spécial ?", + "minChars": "Au moins 10 caractères", + "address": "Adresse (optionnel)", + "addressPlaceholder": "ex. 1 Rue Principale", + "searchTitle": "Rechercher un lieu en ligne", + "searchSubtitle": "Nous trouverons les informations et pré-remplirons le formulaire.", + "searchPlaceholder": "ex. Café Zeitlos", + "searchButton": "Rechercher", + "skipSearch": "Passer et saisir manuellement", + "foundSources": "Sources trouvées :", + "reset": "Retour", + "submit": "Soumettre le lieu", + "submitting": "Envoi...", + "loginRequired": "Connectez-vous pour ajouter des lieux.", + "error": "Échec de l'envoi. Veuillez réessayer.", + "imageUrl": "URL de l'image (optionnel)", + "imageUrlPlaceholder": "https://example.com/image.jpg", + "imagePreview": "Aperçu de l'image", + "imageLoadError": "Impossible de charger l'image.", + "imageRetry": "Réessayer", + "geocoding": "Recherche des coordonnées...", + "coordinatesFound": "Coordonnées trouvées", + "website": "Site web (optionnel)", + "websitePlaceholder": "https://example.com", + "phone": "Téléphone (optionnel)", + "phonePlaceholder": "+33 1 23 45 67 89" + }, + "edit": { + "title": "Modifier le lieu", + "subtitle": "Mettez à jour les détails de ce lieu", + "save": "Enregistrer", + "saving": "Enregistrement...", + "cancel": "Annuler", + "error": "Échec de la sauvegarde. Veuillez réessayer.", + "loadError": "Impossible de charger le lieu.", + "forbidden": "Vous ne pouvez modifier que vos propres lieux." + }, + "reviews": { + "title": "Avis", + "write": "Écrire un avis", + "yourRating": "Votre note", + "commentPlaceholder": "Qu'avez-vous aimé ? (optionnel)", + "submit": "Envoyer", + "submitting": "Envoi...", + "loginRequired": "Connectez-vous pour écrire un avis.", + "alreadyReviewed": "Vous avez déjà donné votre avis sur ce lieu.", + "deleteConfirm": "Supprimer l'avis ?", + "delete": "Supprimer", + "noReviews": "Pas encore d'avis. Soyez le premier !", + "error": "Impossible de sauvegarder l'avis.", + "count": "{count} avis", + "countOne": "1 avis" + }, + "offline": { + "title": "Pas de connexion", + "message": "Vous êtes hors ligne. Vous pourrez utiliser CityCorners dès que vous aurez une connexion internet.", + "retry": "Réessayer" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/it.json new file mode 100644 index 000000000..1c38f4348 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/citycorners/it.json @@ -0,0 +1,255 @@ +{ + "app": { + "name": "CityCorners", + "tagline": "Scopri città in tutto il mondo" + }, + "nav": { + "explore": "Esplora", + "map": "Mappa", + "add": "Aggiungi", + "favorites": "Preferiti", + "settings": "Impostazioni", + "showNav": "Mostra navigazione", + "hideNav": "Nascondi navigazione", + "cities": "Città" + }, + "cities": { + "title": "Scopri città", + "subtitle": "Dalla community, per la community", + "search": "Cerca città...", + "add": "Aggiungi città", + "empty": "Ancora nessuna città. Sii il primo!", + "locationsCount": "{count} luoghi", + "noLocationsYet": "Ancora nessun luogo", + "contributors": "{count} collaboratori", + "contributorsOne": "1 collaboratore", + "onMap": "{count} sulla mappa", + "recentlyAdded": "Aggiunti di recente", + "stats": "Statistiche", + "totalCities": "{count} città", + "totalLocations": "{count} luoghi", + "totalContributors": "{count} collaboratori", + "topCategories": "Categorie principali" + }, + "cityAdd": { + "title": "Aggiungi nuova città", + "subtitle": "Aggiungi una città, un paese o una località", + "name": "Nome", + "namePlaceholder": "es. Roma", + "country": "Paese", + "countryPlaceholder": "es. Italia", + "state": "Regione / Provincia (opzionale)", + "statePlaceholder": "es. Lazio", + "description": "Descrizione (opzionale)", + "descriptionPlaceholder": "Cosa rende speciale questo posto?", + "imageUrl": "URL immagine (opzionale)", + "imageUrlPlaceholder": "https://example.com/immagine.jpg", + "submit": "Aggiungi città", + "submitting": "Creazione...", + "loginRequired": "Accedi per aggiungere città.", + "error": "Creazione fallita. Riprova.", + "geocoding": "Ricerca coordinate...", + "coordinatesFound": "Coordinate trovate", + "slugExists": "Esiste già una città con questo nome." + }, + "home": { + "title": "Scopri luoghi", + "subtitle": "Monumenti, ristoranti, musei e altro", + "all": "Tutti", + "loading": "Caricamento...", + "noResults": "Nessun luogo trovato.", + "noResultsCategory": "Nessun {category} trovato.", + "addFirst": "Aggiungi il primo luogo", + "loadMore": "Carica altri" + }, + "categories": { + "sight": "Monumenti", + "restaurant": "Ristoranti", + "shop": "Negozi", + "museum": "Musei", + "cafe": "Caffè", + "bar": "Bar", + "park": "Parchi", + "beach": "Spiagge", + "hotel": "Hotel", + "event_venue": "Sale eventi", + "viewpoint": "Punti panoramici" + }, + "category": { + "sight": "Monumento", + "restaurant": "Ristorante", + "shop": "Negozio", + "museum": "Museo", + "cafe": "Caffè", + "bar": "Bar", + "park": "Parco", + "beach": "Spiaggia", + "hotel": "Hotel", + "event_venue": "Sala eventi", + "viewpoint": "Punto panoramico" + }, + "detail": { + "history": "Storia", + "openInMaps": "OSM", + "showOnMap": "Sulla mappa", + "directions": "Indicazioni", + "share": "Condividi", + "linkCopied": "Link copiato!", + "showDetails": "Dettagli", + "back": "Torna alla lista", + "notFound": "Luogo non trovato.", + "edit": "Modifica", + "delete": "Elimina", + "deleteConfirm": "Vuoi davvero eliminare questo luogo? Non è possibile annullare.", + "confirmDelete": "Elimina definitivamente", + "deleting": "Eliminazione...", + "cancel": "Annulla", + "nearby": "Nelle vicinanze", + "website": "Sito web", + "phone": "Telefono", + "openingHours": "Orari di apertura", + "closed": "Chiuso", + "openNow": "Aperto ora", + "closedNow": "Chiuso" + }, + "days": { + "mo": "Lunedì", + "tu": "Martedì", + "we": "Mercoledì", + "th": "Giovedì", + "fr": "Venerdì", + "sa": "Sabato", + "su": "Domenica" + }, + "gallery": { + "addPhoto": "Aggiungi foto", + "add": "Aggiungi", + "addError": "Impossibile aggiungere la foto." + }, + "favorites": { + "title": "Preferiti", + "subtitle": "I tuoi luoghi salvati", + "empty": "Ancora nessun preferito. Tocca il cuore su un luogo per salvarlo.", + "loginRequired": "Accedi per salvare i preferiti.", + "add": "Aggiungi ai preferiti", + "remove": "Rimuovi dai preferiti", + "tabFavorites": "Preferiti", + "tabCollections": "Collezioni" + }, + "collections": { + "title": "Collezioni", + "empty": "Ancora nessuna collezione.", + "create": "Crea collezione", + "name": "Nome", + "namePlaceholder": "es. I miei ristoranti preferiti", + "description": "Descrizione (opzionale)", + "descriptionPlaceholder": "Di cosa tratta questa collezione?", + "save": "Salva", + "cancel": "Annulla", + "locations": "{count} luoghi", + "noLocations": "Nessun luogo in questa collezione.", + "delete": "Elimina collezione", + "deleteConfirm": "Vuoi davvero eliminare questa collezione?", + "back": "Torna alle collezioni" + }, + "map": { + "title": "Mappa", + "subtitle": "Tutti i luoghi sulla mappa", + "locateMe": "La mia posizione", + "yourLocation": "Sei qui", + "geolocationNotSupported": "La geolocalizzazione non è disponibile.", + "geolocationError": "Impossibile determinare la posizione.", + "filterAll": "Tutti" + }, + "search": { + "placeholder": "Cerca luoghi...", + "noResults": "Nessun risultato", + "searching": "Ricerca..." + }, + "settings": { + "title": "Impostazioni", + "appearance": "Aspetto", + "mode": "Modalità", + "light": "Chiaro", + "dark": "Scuro", + "system": "Sistema", + "colorScheme": "Schema colori", + "account": "Account", + "email": "Email", + "logout": "Esci", + "loginPrompt": "Accedi per salvare i preferiti e usare tutte le funzioni.", + "login": "Accedi", + "register": "Registrati", + "about": "Informazioni su CityCorners", + "aboutText": "CityCorners è una piattaforma aperta per guide di città in tutto il mondo. Scopri luoghi condivisi dalla community o aggiungi la tua città." + }, + "auth": { + "loginTitle": "Login - CityCorners", + "registerTitle": "Registrazione - CityCorners" + }, + "add": { + "title": "Aggiungi un luogo", + "subtitle": "Condividi il tuo posto preferito", + "name": "Nome", + "namePlaceholder": "es. Caffè del Lago", + "category": "Categoria", + "description": "Descrizione", + "descriptionPlaceholder": "Cosa rende speciale questo posto?", + "minChars": "Almeno 10 caratteri", + "address": "Indirizzo (opzionale)", + "addressPlaceholder": "es. Via Roma 1", + "searchTitle": "Cerca un luogo online", + "searchSubtitle": "Troveremo le informazioni e compileremo il modulo automaticamente.", + "searchPlaceholder": "es. Caffè Zeitlos", + "searchButton": "Cerca", + "skipSearch": "Salta e inserisci manualmente", + "foundSources": "Fonti trovate:", + "reset": "Indietro", + "submit": "Invia luogo", + "submitting": "Invio...", + "loginRequired": "Accedi per aggiungere luoghi.", + "error": "Invio fallito. Riprova.", + "imageUrl": "URL immagine (opzionale)", + "imageUrlPlaceholder": "https://example.com/immagine.jpg", + "imagePreview": "Anteprima immagine", + "imageLoadError": "Impossibile caricare l'immagine.", + "imageRetry": "Riprova", + "geocoding": "Ricerca coordinate...", + "coordinatesFound": "Coordinate trovate", + "website": "Sito web (opzionale)", + "websitePlaceholder": "https://example.com", + "phone": "Telefono (opzionale)", + "phonePlaceholder": "+39 06 1234567" + }, + "edit": { + "title": "Modifica luogo", + "subtitle": "Aggiorna i dettagli di questo luogo", + "save": "Salva modifiche", + "saving": "Salvataggio...", + "cancel": "Annulla", + "error": "Salvataggio fallito. Riprova.", + "loadError": "Impossibile caricare il luogo.", + "forbidden": "Puoi modificare solo i tuoi luoghi." + }, + "reviews": { + "title": "Recensioni", + "write": "Scrivi una recensione", + "yourRating": "La tua valutazione", + "commentPlaceholder": "Cosa ti è piaciuto? (opzionale)", + "submit": "Invia", + "submitting": "Invio...", + "loginRequired": "Accedi per scrivere una recensione.", + "alreadyReviewed": "Hai già recensito questo luogo.", + "deleteConfirm": "Eliminare la recensione?", + "delete": "Elimina", + "noReviews": "Ancora nessuna recensione. Sii il primo!", + "error": "Impossibile salvare la recensione.", + "count": "{count} recensioni", + "countOne": "1 recensione" + }, + "offline": { + "title": "Nessuna connessione", + "message": "Sei offline. Potrai usare CityCorners quando avrai una connessione internet.", + "retry": "Riprova" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/contacts/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/de.json new file mode 100644 index 000000000..39c356d44 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/de.json @@ -0,0 +1,219 @@ +{ + "app": { + "name": "Contacts" + }, + "common": { + "back": "Zurück", + "cancel": "Abbrechen", + "loadingMore": "Lade weitere..." + }, + "nav": { + "contacts": "Kontakte", + "groups": "Gruppen", + "tags": "Tags", + "favorites": "Favoriten", + "archive": "Archiv", + "search": "Suche", + "settings": "Einstellungen", + "feedback": "Feedback", + "import": "Importieren" + }, + "import": { + "title": "Kontakte importieren", + "subtitle": "Importiere Kontakte aus vCard- oder CSV-Dateien", + "tabs": { + "file": "Datei-Import", + "google": "Google Kontakte" + }, + "processing": "Datei wird verarbeitet...", + "importing": "Importiere...", + "downloadTemplate": "CSV-Vorlage herunterladen", + "dropzone": { + "title": "Datei hierher ziehen", + "subtitle": "oder klicken zum Auswählen" + }, + "preview": { + "total": "Gesamt", + "valid": "Gültig", + "duplicates": "Duplikate", + "selected": "Ausgewählt", + "errors": "Fehler beim Parsen", + "duplicateHandling": "Wie sollen Duplikate behandelt werden?", + "skip": "Überspringen", + "merge": "Zusammenführen", + "create": "Trotzdem erstellen", + "contacts": "Kontakte zum Importieren", + "selectAll": "Alle auswählen", + "deselectAll": "Alle abwählen", + "duplicateTag": "Duplikat", + "matchesWith": "Stimmt überein mit", + "importButton": "{count} Kontakte importieren" + }, + "result": { + "title": "Import abgeschlossen", + "subtitle": "Deine Kontakte wurden erfolgreich importiert", + "imported": "Importiert", + "merged": "Zusammengeführt", + "skipped": "Übersprungen", + "errors": "Fehler", + "importMore": "Weitere importieren", + "done": "Fertig" + } + }, + "contacts": { + "title": "Kontakte", + "new": "Neuer Kontakt", + "edit": "Bearbeiten", + "delete": "Löschen", + "search": "Kontakte durchsuchen...", + "noContacts": "Keine Kontakte gefunden", + "addFirst": "Füge deinen ersten Kontakt hinzu", + "me": "Ich", + "myCard": "Meine Karte", + "favorites": "Favoriten", + "archive": "Archiv", + "contact": "Kontakt", + "contactsPlural": "Kontakte", + "call": "Anrufen", + "email": "E-Mail senden", + "favorite": "Als Favorit markieren", + "unfavorite": "Favorit entfernen" + }, + "views": { + "list": "Listenansicht", + "grid": "Kachelansicht", + "alphabet": "Alphabetisch" + }, + "sort": { + "firstName": "Vorname", + "lastName": "Nachname" + }, + "contact": { + "firstName": "Vorname", + "lastName": "Nachname", + "displayName": "Anzeigename", + "email": "E-Mail", + "phone": "Telefon", + "mobile": "Mobil", + "company": "Firma", + "jobTitle": "Position", + "department": "Abteilung", + "street": "Straße", + "city": "Stadt", + "postalCode": "PLZ", + "country": "Land", + "website": "Website", + "birthday": "Geburtstag", + "notes": "Notizen", + "tasks": { + "title": "Aufgaben", + "assigned": "Zugewiesen", + "involved": "Beteiligt", + "empty": "Keine Aufgaben für diesen Kontakt", + "serviceUnavailable": "Todo-Service nicht erreichbar", + "error": "Fehler beim Laden der Aufgaben", + "overdue": "Überfällig", + "dueToday": "Heute", + "tomorrow": "Morgen", + "showCompleted": "Erledigte", + "showMore": "{count} weitere anzeigen", + "markComplete": "Als erledigt markieren", + "markIncomplete": "Als unerledigt markieren" + } + }, + "groups": { + "title": "Gruppen", + "new": "Neue Gruppe", + "noGroups": "Keine Gruppen vorhanden" + }, + "actions": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "create": "Erstellen", + "favorite": "Favorit", + "unfavorite": "Kein Favorit", + "archive": "Archivieren", + "unarchive": "Wiederherstellen" + }, + "messages": { + "saved": "Gespeichert", + "deleted": "Gelöscht", + "error": "Ein Fehler ist aufgetreten" + }, + "google": { + "loading": "Verbindung wird geprüft...", + "connect": { + "title": "Mit Google verbinden", + "subtitle": "Importiere deine Kontakte direkt aus Google Kontakte", + "button": "Mit Google verbinden" + }, + "connected": "Verbunden mit Google", + "disconnect": "Trennen", + "contacts": "Kontakte", + "loadMore": "Mehr laden" + }, + "filters": { + "title": "Filter", + "clearAll": "Alle löschen", + "tag": "Tag", + "allTags": "Alle Tags", + "contactInfo": "Kontaktinfo", + "contact": { + "all": "Alle Kontakte", + "favorites": "Favoriten", + "hasPhone": "Mit Telefon", + "hasEmail": "Mit E-Mail", + "incomplete": "Unvollständig" + }, + "birthdayLabel": "Geburtstag", + "birthday": { + "all": "Alle", + "today": "Heute", + "thisWeek": "Diese Woche", + "thisMonth": "Diesen Monat" + }, + "company": "Firma", + "allCompanies": "Alle Firmen" + }, + "export": { + "title": "Kontakte exportieren", + "button": "Exportieren", + "format": "Format auswählen", + "selectedCount": "{count} Kontakte ausgewählt", + "allContacts": "Alle Kontakte werden exportiert", + "includeArchived": "Archivierte Kontakte einschließen", + "exporting": "Exportiere...", + "success": "Export erfolgreich" + }, + "notes": { + "title": "Notizen", + "add": "Notiz hinzufügen", + "addFirst": "Erste Notiz hinzufügen", + "empty": "Noch keine Notizen", + "placeholder": "Schreibe eine Notiz...", + "confirmDelete": "Diese Notiz löschen?", + "pin": "Notiz anheften", + "unpin": "Nicht mehr anheften", + "yesterday": "Gestern" + }, + "tags": { + "title": "Tags", + "new": "Neuer Tag", + "edit": "Tag bearbeiten", + "noTags": "Noch keine Tags", + "createFirst": "Erstelle deinen ersten Tag um Kontakte zu organisieren", + "search": "Tags durchsuchen...", + "name": "Name", + "namePlaceholder": "Tag-Name eingeben", + "color": "Farbe", + "preview": "Vorschau", + "contactCount": "{count} Kontakte", + "confirmDelete": "Möchtest du \"{name}\" wirklich löschen?", + "noResults": "Keine Tags gefunden", + "noResultsFor": "Keine Ergebnisse für \"{query}\"", + "tagSingular": "Tag", + "tagPlural": "Tags" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/contacts/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/en.json new file mode 100644 index 000000000..85af5aa1b --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/en.json @@ -0,0 +1,219 @@ +{ + "app": { + "name": "Contacts" + }, + "common": { + "back": "Back", + "cancel": "Cancel", + "loadingMore": "Loading more..." + }, + "nav": { + "contacts": "Contacts", + "groups": "Groups", + "tags": "Tags", + "favorites": "Favorites", + "archive": "Archive", + "search": "Search", + "settings": "Settings", + "feedback": "Feedback", + "import": "Import" + }, + "import": { + "title": "Import Contacts", + "subtitle": "Import contacts from vCard or CSV files", + "tabs": { + "file": "File Import", + "google": "Google Contacts" + }, + "processing": "Processing file...", + "importing": "Importing...", + "downloadTemplate": "Download CSV template", + "dropzone": { + "title": "Drop file here", + "subtitle": "or click to select" + }, + "preview": { + "total": "Total", + "valid": "Valid", + "duplicates": "Duplicates", + "selected": "Selected", + "errors": "Parse errors", + "duplicateHandling": "How should duplicates be handled?", + "skip": "Skip", + "merge": "Merge", + "create": "Create anyway", + "contacts": "Contacts to import", + "selectAll": "Select all", + "deselectAll": "Deselect all", + "duplicateTag": "Duplicate", + "matchesWith": "Matches with", + "importButton": "Import {count} contacts" + }, + "result": { + "title": "Import complete", + "subtitle": "Your contacts have been successfully imported", + "imported": "Imported", + "merged": "Merged", + "skipped": "Skipped", + "errors": "Errors", + "importMore": "Import more", + "done": "Done" + } + }, + "contacts": { + "title": "Contacts", + "new": "New Contact", + "edit": "Edit", + "delete": "Delete", + "search": "Search contacts...", + "noContacts": "No contacts found", + "addFirst": "Add your first contact", + "me": "Me", + "myCard": "My Card", + "favorites": "Favorites", + "archive": "Archive", + "contact": "Contact", + "contactsPlural": "Contacts", + "call": "Call", + "email": "Send email", + "favorite": "Mark as favorite", + "unfavorite": "Remove favorite" + }, + "views": { + "list": "List view", + "grid": "Grid view", + "alphabet": "Alphabetical" + }, + "sort": { + "firstName": "First Name", + "lastName": "Last Name" + }, + "contact": { + "firstName": "First Name", + "lastName": "Last Name", + "displayName": "Display Name", + "email": "Email", + "phone": "Phone", + "mobile": "Mobile", + "company": "Company", + "jobTitle": "Job Title", + "department": "Department", + "street": "Street", + "city": "City", + "postalCode": "Postal Code", + "country": "Country", + "website": "Website", + "birthday": "Birthday", + "notes": "Notes", + "tasks": { + "title": "Tasks", + "assigned": "Assigned", + "involved": "Involved", + "empty": "No tasks for this contact", + "serviceUnavailable": "Todo service unavailable", + "error": "Failed to load tasks", + "overdue": "Overdue", + "dueToday": "Today", + "tomorrow": "Tomorrow", + "showCompleted": "Completed", + "showMore": "Show {count} more", + "markComplete": "Mark as complete", + "markIncomplete": "Mark as incomplete" + } + }, + "groups": { + "title": "Groups", + "new": "New Group", + "noGroups": "No groups available" + }, + "actions": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "create": "Create", + "favorite": "Favorite", + "unfavorite": "Unfavorite", + "archive": "Archive", + "unarchive": "Restore" + }, + "messages": { + "saved": "Saved", + "deleted": "Deleted", + "error": "An error occurred" + }, + "google": { + "loading": "Checking connection...", + "connect": { + "title": "Connect to Google", + "subtitle": "Import your contacts directly from Google Contacts", + "button": "Connect with Google" + }, + "connected": "Connected to Google", + "disconnect": "Disconnect", + "contacts": "Contacts", + "loadMore": "Load more" + }, + "filters": { + "title": "Filters", + "clearAll": "Clear all", + "tag": "Tag", + "allTags": "All tags", + "contactInfo": "Contact info", + "contact": { + "all": "All contacts", + "favorites": "Favorites", + "hasPhone": "With phone", + "hasEmail": "With email", + "incomplete": "Incomplete" + }, + "birthdayLabel": "Birthday", + "birthday": { + "all": "All", + "today": "Today", + "thisWeek": "This week", + "thisMonth": "This month" + }, + "company": "Company", + "allCompanies": "All companies" + }, + "export": { + "title": "Export Contacts", + "button": "Export", + "format": "Select format", + "selectedCount": "{count} contacts selected", + "allContacts": "All contacts will be exported", + "includeArchived": "Include archived contacts", + "exporting": "Exporting...", + "success": "Export successful" + }, + "notes": { + "title": "Notes", + "add": "Add Note", + "addFirst": "Add your first note", + "empty": "No notes yet", + "placeholder": "Write a note...", + "confirmDelete": "Delete this note?", + "pin": "Pin note", + "unpin": "Unpin note", + "yesterday": "Yesterday" + }, + "tags": { + "title": "Tags", + "new": "New Tag", + "edit": "Edit Tag", + "noTags": "No tags yet", + "createFirst": "Create your first tag to organize contacts", + "search": "Search tags...", + "name": "Name", + "namePlaceholder": "Enter tag name", + "color": "Color", + "preview": "Preview", + "contactCount": "{count} contacts", + "confirmDelete": "Are you sure you want to delete \"{name}\"?", + "noResults": "No tags found", + "noResultsFor": "No results for \"{query}\"", + "tagSingular": "Tag", + "tagPlural": "Tags" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/contacts/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/es.json new file mode 100644 index 000000000..51011b383 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/es.json @@ -0,0 +1,219 @@ +{ + "app": { + "name": "Contacts" + }, + "common": { + "back": "Volver", + "cancel": "Cancelar", + "loadingMore": "Cargando más..." + }, + "nav": { + "contacts": "Contactos", + "groups": "Grupos", + "tags": "Etiquetas", + "favorites": "Favoritos", + "archive": "Archivo", + "search": "Buscar", + "settings": "Configuración", + "feedback": "Comentarios", + "import": "Importar" + }, + "import": { + "title": "Importar contactos", + "subtitle": "Importa contactos desde archivos vCard o CSV", + "tabs": { + "file": "Importar archivo", + "google": "Google Contacts" + }, + "processing": "Procesando archivo...", + "importing": "Importando...", + "downloadTemplate": "Descargar plantilla CSV", + "dropzone": { + "title": "Arrastra el archivo aquí", + "subtitle": "o haz clic para seleccionar" + }, + "preview": { + "total": "Total", + "valid": "Válidos", + "duplicates": "Duplicados", + "selected": "Seleccionados", + "errors": "Errores de análisis", + "duplicateHandling": "¿Cómo gestionar los duplicados?", + "skip": "Omitir", + "merge": "Fusionar", + "create": "Crear de todos modos", + "contacts": "Contactos a importar", + "selectAll": "Seleccionar todos", + "deselectAll": "Deseleccionar todos", + "duplicateTag": "Duplicado", + "matchesWith": "Coincide con", + "importButton": "Importar {count} contactos" + }, + "result": { + "title": "Importación completada", + "subtitle": "Tus contactos han sido importados con éxito", + "imported": "Importados", + "merged": "Fusionados", + "skipped": "Omitidos", + "errors": "Errores", + "importMore": "Importar más", + "done": "Listo" + } + }, + "contacts": { + "title": "Contactos", + "new": "Nuevo contacto", + "edit": "Editar", + "delete": "Eliminar", + "search": "Buscar contactos...", + "noContacts": "No se encontraron contactos", + "addFirst": "Añade tu primer contacto", + "me": "Yo", + "myCard": "Mi tarjeta", + "favorites": "Favoritos", + "archive": "Archivo", + "contact": "Contacto", + "contactsPlural": "Contactos", + "call": "Llamar", + "email": "Enviar correo", + "favorite": "Marcar como favorito", + "unfavorite": "Quitar de favoritos" + }, + "views": { + "list": "Vista de lista", + "grid": "Vista de cuadrícula", + "alphabet": "Alfabético" + }, + "sort": { + "firstName": "Nombre", + "lastName": "Apellido" + }, + "contact": { + "firstName": "Nombre", + "lastName": "Apellido", + "displayName": "Nombre para mostrar", + "email": "Correo electrónico", + "phone": "Teléfono", + "mobile": "Móvil", + "company": "Empresa", + "jobTitle": "Cargo", + "department": "Departamento", + "street": "Calle", + "city": "Ciudad", + "postalCode": "Código postal", + "country": "País", + "website": "Sitio web", + "birthday": "Cumpleaños", + "notes": "Notas", + "tasks": { + "title": "Tareas", + "assigned": "Asignadas", + "involved": "Involucrado", + "empty": "No hay tareas para este contacto", + "serviceUnavailable": "Servicio Todo no disponible", + "error": "Error al cargar las tareas", + "overdue": "Atrasada", + "dueToday": "Hoy", + "tomorrow": "Mañana", + "showCompleted": "Completadas", + "showMore": "Mostrar {count} más", + "markComplete": "Marcar como completada", + "markIncomplete": "Marcar como no completada" + } + }, + "groups": { + "title": "Grupos", + "new": "Nuevo grupo", + "noGroups": "No hay grupos disponibles" + }, + "actions": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "create": "Crear", + "favorite": "Favorito", + "unfavorite": "No favorito", + "archive": "Archivar", + "unarchive": "Restaurar" + }, + "messages": { + "saved": "Guardado", + "deleted": "Eliminado", + "error": "Ha ocurrido un error" + }, + "google": { + "loading": "Verificando conexión...", + "connect": { + "title": "Conectar con Google", + "subtitle": "Importa tus contactos directamente desde Google Contacts", + "button": "Conectar con Google" + }, + "connected": "Conectado a Google", + "disconnect": "Desconectar", + "contacts": "Contactos", + "loadMore": "Cargar más" + }, + "filters": { + "title": "Filtros", + "clearAll": "Borrar todo", + "tag": "Etiqueta", + "allTags": "Todas las etiquetas", + "contactInfo": "Info de contacto", + "contact": { + "all": "Todos los contactos", + "favorites": "Favoritos", + "hasPhone": "Con teléfono", + "hasEmail": "Con correo", + "incomplete": "Incompletos" + }, + "birthdayLabel": "Cumpleaños", + "birthday": { + "all": "Todos", + "today": "Hoy", + "thisWeek": "Esta semana", + "thisMonth": "Este mes" + }, + "company": "Empresa", + "allCompanies": "Todas las empresas" + }, + "export": { + "title": "Exportar contactos", + "button": "Exportar", + "format": "Seleccionar formato", + "selectedCount": "{count} contactos seleccionados", + "allContacts": "Se exportarán todos los contactos", + "includeArchived": "Incluir contactos archivados", + "exporting": "Exportando...", + "success": "Exportación exitosa" + }, + "notes": { + "title": "Notas", + "add": "Añadir nota", + "addFirst": "Añade tu primera nota", + "empty": "Sin notas todavía", + "placeholder": "Escribe una nota...", + "confirmDelete": "¿Eliminar esta nota?", + "pin": "Fijar nota", + "unpin": "Desfijar nota", + "yesterday": "Ayer" + }, + "tags": { + "title": "Etiquetas", + "new": "Nueva etiqueta", + "edit": "Editar etiqueta", + "noTags": "Sin etiquetas todavía", + "createFirst": "Crea tu primera etiqueta para organizar contactos", + "search": "Buscar etiquetas...", + "name": "Nombre", + "namePlaceholder": "Introduce el nombre de la etiqueta", + "color": "Color", + "preview": "Vista previa", + "contactCount": "{count} contactos", + "confirmDelete": "¿Estás seguro de que quieres eliminar \"{name}\"?", + "noResults": "No se encontraron etiquetas", + "noResultsFor": "Sin resultados para \"{query}\"", + "tagSingular": "Etiqueta", + "tagPlural": "Etiquetas" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/contacts/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/fr.json new file mode 100644 index 000000000..f10465356 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/fr.json @@ -0,0 +1,219 @@ +{ + "app": { + "name": "Contacts" + }, + "common": { + "back": "Retour", + "cancel": "Annuler", + "loadingMore": "Chargement..." + }, + "nav": { + "contacts": "Contacts", + "groups": "Groupes", + "tags": "Tags", + "favorites": "Favoris", + "archive": "Archives", + "search": "Rechercher", + "settings": "Paramètres", + "feedback": "Commentaires", + "import": "Importer" + }, + "import": { + "title": "Importer des contacts", + "subtitle": "Importez des contacts depuis des fichiers vCard ou CSV", + "tabs": { + "file": "Import de fichier", + "google": "Google Contacts" + }, + "processing": "Traitement du fichier...", + "importing": "Importation...", + "downloadTemplate": "Télécharger le modèle CSV", + "dropzone": { + "title": "Déposez le fichier ici", + "subtitle": "ou cliquez pour sélectionner" + }, + "preview": { + "total": "Total", + "valid": "Valides", + "duplicates": "Doublons", + "selected": "Sélectionnés", + "errors": "Erreurs d'analyse", + "duplicateHandling": "Comment traiter les doublons ?", + "skip": "Ignorer", + "merge": "Fusionner", + "create": "Créer quand même", + "contacts": "Contacts à importer", + "selectAll": "Tout sélectionner", + "deselectAll": "Tout désélectionner", + "duplicateTag": "Doublon", + "matchesWith": "Correspond à", + "importButton": "Importer {count} contacts" + }, + "result": { + "title": "Import terminé", + "subtitle": "Vos contacts ont été importés avec succès", + "imported": "Importés", + "merged": "Fusionnés", + "skipped": "Ignorés", + "errors": "Erreurs", + "importMore": "Importer d'autres", + "done": "Terminé" + } + }, + "contacts": { + "title": "Contacts", + "new": "Nouveau contact", + "edit": "Modifier", + "delete": "Supprimer", + "search": "Rechercher des contacts...", + "noContacts": "Aucun contact trouvé", + "addFirst": "Ajoutez votre premier contact", + "me": "Moi", + "myCard": "Ma fiche", + "favorites": "Favoris", + "archive": "Archives", + "contact": "Contact", + "contactsPlural": "Contacts", + "call": "Appeler", + "email": "Envoyer un e-mail", + "favorite": "Marquer comme favori", + "unfavorite": "Retirer des favoris" + }, + "views": { + "list": "Vue liste", + "grid": "Vue grille", + "alphabet": "Alphabétique" + }, + "sort": { + "firstName": "Prénom", + "lastName": "Nom" + }, + "contact": { + "firstName": "Prénom", + "lastName": "Nom", + "displayName": "Nom d'affichage", + "email": "E-mail", + "phone": "Téléphone", + "mobile": "Mobile", + "company": "Entreprise", + "jobTitle": "Poste", + "department": "Département", + "street": "Rue", + "city": "Ville", + "postalCode": "Code postal", + "country": "Pays", + "website": "Site web", + "birthday": "Anniversaire", + "notes": "Notes", + "tasks": { + "title": "Tâches", + "assigned": "Assignées", + "involved": "Impliqué", + "empty": "Aucune tâche pour ce contact", + "serviceUnavailable": "Service Todo indisponible", + "error": "Échec du chargement des tâches", + "overdue": "En retard", + "dueToday": "Aujourd'hui", + "tomorrow": "Demain", + "showCompleted": "Terminées", + "showMore": "Afficher {count} de plus", + "markComplete": "Marquer comme terminée", + "markIncomplete": "Marquer comme non terminée" + } + }, + "groups": { + "title": "Groupes", + "new": "Nouveau groupe", + "noGroups": "Aucun groupe disponible" + }, + "actions": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "create": "Créer", + "favorite": "Favori", + "unfavorite": "Non favori", + "archive": "Archiver", + "unarchive": "Restaurer" + }, + "messages": { + "saved": "Enregistré", + "deleted": "Supprimé", + "error": "Une erreur est survenue" + }, + "google": { + "loading": "Vérification de la connexion...", + "connect": { + "title": "Se connecter à Google", + "subtitle": "Importez vos contacts directement depuis Google Contacts", + "button": "Se connecter avec Google" + }, + "connected": "Connecté à Google", + "disconnect": "Déconnecter", + "contacts": "Contacts", + "loadMore": "Charger plus" + }, + "filters": { + "title": "Filtres", + "clearAll": "Tout effacer", + "tag": "Tag", + "allTags": "Tous les tags", + "contactInfo": "Info contact", + "contact": { + "all": "Tous les contacts", + "favorites": "Favoris", + "hasPhone": "Avec téléphone", + "hasEmail": "Avec e-mail", + "incomplete": "Incomplets" + }, + "birthdayLabel": "Anniversaire", + "birthday": { + "all": "Tous", + "today": "Aujourd'hui", + "thisWeek": "Cette semaine", + "thisMonth": "Ce mois-ci" + }, + "company": "Entreprise", + "allCompanies": "Toutes les entreprises" + }, + "export": { + "title": "Exporter les contacts", + "button": "Exporter", + "format": "Choisir le format", + "selectedCount": "{count} contacts sélectionnés", + "allContacts": "Tous les contacts seront exportés", + "includeArchived": "Inclure les contacts archivés", + "exporting": "Exportation...", + "success": "Export réussi" + }, + "notes": { + "title": "Notes", + "add": "Ajouter une note", + "addFirst": "Ajoutez votre première note", + "empty": "Aucune note pour le moment", + "placeholder": "Écrire une note...", + "confirmDelete": "Supprimer cette note ?", + "pin": "Épingler la note", + "unpin": "Désépingler la note", + "yesterday": "Hier" + }, + "tags": { + "title": "Tags", + "new": "Nouveau tag", + "edit": "Modifier le tag", + "noTags": "Aucun tag pour le moment", + "createFirst": "Créez votre premier tag pour organiser vos contacts", + "search": "Rechercher des tags...", + "name": "Nom", + "namePlaceholder": "Saisir le nom du tag", + "color": "Couleur", + "preview": "Aperçu", + "contactCount": "{count} contacts", + "confirmDelete": "Êtes-vous sûr de vouloir supprimer \"{name}\" ?", + "noResults": "Aucun tag trouvé", + "noResultsFor": "Aucun résultat pour \"{query}\"", + "tagSingular": "Tag", + "tagPlural": "Tags" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/contacts/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/it.json new file mode 100644 index 000000000..ec2f8b6cd --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/contacts/it.json @@ -0,0 +1,219 @@ +{ + "app": { + "name": "Contacts" + }, + "common": { + "back": "Indietro", + "cancel": "Annulla", + "loadingMore": "Caricamento..." + }, + "nav": { + "contacts": "Contatti", + "groups": "Gruppi", + "tags": "Tag", + "favorites": "Preferiti", + "archive": "Archivio", + "search": "Cerca", + "settings": "Impostazioni", + "feedback": "Feedback", + "import": "Importa" + }, + "import": { + "title": "Importa contatti", + "subtitle": "Importa contatti da file vCard o CSV", + "tabs": { + "file": "Import da file", + "google": "Google Contatti" + }, + "processing": "Elaborazione del file...", + "importing": "Importazione...", + "downloadTemplate": "Scarica modello CSV", + "dropzone": { + "title": "Trascina il file qui", + "subtitle": "o clicca per selezionare" + }, + "preview": { + "total": "Totale", + "valid": "Validi", + "duplicates": "Duplicati", + "selected": "Selezionati", + "errors": "Errori di analisi", + "duplicateHandling": "Come gestire i duplicati?", + "skip": "Ignora", + "merge": "Unisci", + "create": "Crea comunque", + "contacts": "Contatti da importare", + "selectAll": "Seleziona tutti", + "deselectAll": "Deseleziona tutti", + "duplicateTag": "Duplicato", + "matchesWith": "Corrisponde a", + "importButton": "Importa {count} contatti" + }, + "result": { + "title": "Importazione completata", + "subtitle": "I tuoi contatti sono stati importati con successo", + "imported": "Importati", + "merged": "Uniti", + "skipped": "Ignorati", + "errors": "Errori", + "importMore": "Importa altri", + "done": "Fatto" + } + }, + "contacts": { + "title": "Contatti", + "new": "Nuovo contatto", + "edit": "Modifica", + "delete": "Elimina", + "search": "Cerca contatti...", + "noContacts": "Nessun contatto trovato", + "addFirst": "Aggiungi il tuo primo contatto", + "me": "Io", + "myCard": "La mia scheda", + "favorites": "Preferiti", + "archive": "Archivio", + "contact": "Contatto", + "contactsPlural": "Contatti", + "call": "Chiama", + "email": "Invia e-mail", + "favorite": "Segna come preferito", + "unfavorite": "Rimuovi dai preferiti" + }, + "views": { + "list": "Vista elenco", + "grid": "Vista griglia", + "alphabet": "Alfabetico" + }, + "sort": { + "firstName": "Nome", + "lastName": "Cognome" + }, + "contact": { + "firstName": "Nome", + "lastName": "Cognome", + "displayName": "Nome visualizzato", + "email": "E-mail", + "phone": "Telefono", + "mobile": "Cellulare", + "company": "Azienda", + "jobTitle": "Posizione", + "department": "Dipartimento", + "street": "Via", + "city": "Città", + "postalCode": "CAP", + "country": "Paese", + "website": "Sito web", + "birthday": "Compleanno", + "notes": "Note", + "tasks": { + "title": "Attività", + "assigned": "Assegnate", + "involved": "Coinvolto", + "empty": "Nessuna attività per questo contatto", + "serviceUnavailable": "Servizio Todo non disponibile", + "error": "Impossibile caricare le attività", + "overdue": "In ritardo", + "dueToday": "Oggi", + "tomorrow": "Domani", + "showCompleted": "Completate", + "showMore": "Mostra altri {count}", + "markComplete": "Segna come completata", + "markIncomplete": "Segna come non completata" + } + }, + "groups": { + "title": "Gruppi", + "new": "Nuovo gruppo", + "noGroups": "Nessun gruppo disponibile" + }, + "actions": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "create": "Crea", + "favorite": "Preferito", + "unfavorite": "Non preferito", + "archive": "Archivia", + "unarchive": "Ripristina" + }, + "messages": { + "saved": "Salvato", + "deleted": "Eliminato", + "error": "Si è verificato un errore" + }, + "google": { + "loading": "Verifica della connessione...", + "connect": { + "title": "Connetti a Google", + "subtitle": "Importa i tuoi contatti direttamente da Google Contatti", + "button": "Connetti con Google" + }, + "connected": "Connesso a Google", + "disconnect": "Disconnetti", + "contacts": "Contatti", + "loadMore": "Carica altri" + }, + "filters": { + "title": "Filtri", + "clearAll": "Cancella tutto", + "tag": "Tag", + "allTags": "Tutti i tag", + "contactInfo": "Info contatto", + "contact": { + "all": "Tutti i contatti", + "favorites": "Preferiti", + "hasPhone": "Con telefono", + "hasEmail": "Con e-mail", + "incomplete": "Incompleti" + }, + "birthdayLabel": "Compleanno", + "birthday": { + "all": "Tutti", + "today": "Oggi", + "thisWeek": "Questa settimana", + "thisMonth": "Questo mese" + }, + "company": "Azienda", + "allCompanies": "Tutte le aziende" + }, + "export": { + "title": "Esporta contatti", + "button": "Esporta", + "format": "Seleziona formato", + "selectedCount": "{count} contatti selezionati", + "allContacts": "Tutti i contatti verranno esportati", + "includeArchived": "Includi contatti archiviati", + "exporting": "Esportazione...", + "success": "Esportazione riuscita" + }, + "notes": { + "title": "Note", + "add": "Aggiungi nota", + "addFirst": "Aggiungi la tua prima nota", + "empty": "Nessuna nota ancora", + "placeholder": "Scrivi una nota...", + "confirmDelete": "Eliminare questa nota?", + "pin": "Fissa nota", + "unpin": "Rimuovi fissaggio", + "yesterday": "Ieri" + }, + "tags": { + "title": "Tag", + "new": "Nuovo tag", + "edit": "Modifica tag", + "noTags": "Nessun tag ancora", + "createFirst": "Crea il tuo primo tag per organizzare i contatti", + "search": "Cerca tag...", + "name": "Nome", + "namePlaceholder": "Inserisci nome del tag", + "color": "Colore", + "preview": "Anteprima", + "contactCount": "{count} contatti", + "confirmDelete": "Sei sicuro di voler eliminare \"{name}\"?", + "noResults": "Nessun tag trovato", + "noResultsFor": "Nessun risultato per \"{query}\"", + "tagSingular": "Tag", + "tagPlural": "Tag" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/inventar/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/de.json new file mode 100644 index 000000000..5a7d8bc1f --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/de.json @@ -0,0 +1,148 @@ +{ + "app": { + "name": "Inventar", + "loading": "Laden..." + }, + "nav": { + "collections": "Sammlungen", + "allItems": "Alle Items", + "locations": "Standorte", + "categories": "Kategorien", + "tags": "Tags", + "search": "Suche", + "settings": "Einstellungen", + "feedback": "Feedback" + }, + "collection": { + "create": "Sammlung erstellen", + "edit": "Sammlung bearbeiten", + "delete": "Sammlung löschen", + "name": "Name", + "description": "Beschreibung", + "icon": "Symbol", + "color": "Farbe", + "template": "Vorlage", + "schema": "Schema", + "noCollections": "Keine Sammlungen", + "itemCount": "{count} Items", + "selectTemplate": "Vorlage wählen", + "customFields": "Eigene Felder", + "addField": "Feld hinzufügen" + }, + "item": { + "create": "Item erstellen", + "edit": "Item bearbeiten", + "delete": "Item löschen", + "name": "Name", + "description": "Beschreibung", + "status": "Status", + "quantity": "Menge", + "location": "Standort", + "category": "Kategorie", + "tags": "Tags", + "photos": "Fotos", + "notes": "Notizen", + "documents": "Dokumente", + "noItems": "Keine Items", + "addPhoto": "Foto hinzufügen", + "addNote": "Notiz hinzufügen", + "addDocument": "Dokument hinzufügen" + }, + "status": { + "owned": "Besitzt", + "lent": "Verliehen", + "stored": "Eingelagert", + "for_sale": "Zu verkaufen", + "disposed": "Entsorgt" + }, + "location": { + "create": "Standort erstellen", + "edit": "Standort bearbeiten", + "delete": "Standort löschen", + "name": "Name", + "parent": "Übergeordnet", + "noLocations": "Keine Standorte", + "addSub": "Unterstandort hinzufügen" + }, + "category": { + "create": "Kategorie erstellen", + "edit": "Kategorie bearbeiten", + "delete": "Kategorie löschen", + "name": "Name", + "noCategories": "Keine Kategorien" + }, + "field": { + "text": "Text", + "number": "Zahl", + "date": "Datum", + "select": "Auswahl", + "tags": "Tags", + "checkbox": "Checkbox", + "url": "URL", + "currency": "Währung", + "required": "Pflichtfeld", + "placeholder": "Platzhalter", + "options": "Optionen", + "addOption": "Option hinzufügen", + "removeField": "Feld entfernen" + }, + "template": { + "electronics": "Elektronik", + "books": "Bücher", + "furniture": "Möbel", + "clothing": "Kleidung", + "tools": "Werkzeug", + "kitchen": "Küche", + "media": "Medien", + "custom": "Benutzerdefiniert" + }, + "view": { + "list": "Liste", + "grid": "Kacheln", + "table": "Tabelle" + }, + "filter": { + "all": "Alle", + "saved": "Gespeicherte Filter", + "save": "Filter speichern", + "clear": "Filter zurücksetzen" + }, + "purchase": { + "title": "Kaufdaten", + "price": "Preis", + "currency": "Währung", + "date": "Kaufdatum", + "retailer": "Händler", + "warranty": "Garantie bis", + "receipt": "Beleg" + }, + "auth": { + "login": "Anmelden", + "logout": "Abmelden", + "register": "Registrieren", + "email": "E-Mail", + "password": "Passwort", + "forgotPassword": "Passwort vergessen?" + }, + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "add": "Hinzufügen", + "close": "Schließen", + "search": "Suchen", + "error": "Fehler", + "success": "Erfolgreich", + "loading": "Laden...", + "noResults": "Keine Ergebnisse", + "confirm": "Bestätigen", + "back": "Zurück", + "next": "Weiter", + "create": "Erstellen" + }, + "error": { + "notFound": "Seite nicht gefunden", + "backToHome": "Zurück zur Startseite" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/inventar/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/en.json new file mode 100644 index 000000000..31da651f8 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/en.json @@ -0,0 +1,148 @@ +{ + "app": { + "name": "Inventar", + "loading": "Loading..." + }, + "nav": { + "collections": "Collections", + "allItems": "All Items", + "locations": "Locations", + "categories": "Categories", + "tags": "Tags", + "search": "Search", + "settings": "Settings", + "feedback": "Feedback" + }, + "collection": { + "create": "Create Collection", + "edit": "Edit Collection", + "delete": "Delete Collection", + "name": "Name", + "description": "Description", + "icon": "Icon", + "color": "Color", + "template": "Template", + "schema": "Schema", + "noCollections": "No collections", + "itemCount": "{count} items", + "selectTemplate": "Select template", + "customFields": "Custom fields", + "addField": "Add field" + }, + "item": { + "create": "Create Item", + "edit": "Edit Item", + "delete": "Delete Item", + "name": "Name", + "description": "Description", + "status": "Status", + "quantity": "Quantity", + "location": "Location", + "category": "Category", + "tags": "Tags", + "photos": "Photos", + "notes": "Notes", + "documents": "Documents", + "noItems": "No items", + "addPhoto": "Add photo", + "addNote": "Add note", + "addDocument": "Add document" + }, + "status": { + "owned": "Owned", + "lent": "Lent", + "stored": "Stored", + "for_sale": "For Sale", + "disposed": "Disposed" + }, + "location": { + "create": "Create Location", + "edit": "Edit Location", + "delete": "Delete Location", + "name": "Name", + "parent": "Parent", + "noLocations": "No locations", + "addSub": "Add sub-location" + }, + "category": { + "create": "Create Category", + "edit": "Edit Category", + "delete": "Delete Category", + "name": "Name", + "noCategories": "No categories" + }, + "field": { + "text": "Text", + "number": "Number", + "date": "Date", + "select": "Select", + "tags": "Tags", + "checkbox": "Checkbox", + "url": "URL", + "currency": "Currency", + "required": "Required", + "placeholder": "Placeholder", + "options": "Options", + "addOption": "Add option", + "removeField": "Remove field" + }, + "template": { + "electronics": "Electronics", + "books": "Books", + "furniture": "Furniture", + "clothing": "Clothing", + "tools": "Tools", + "kitchen": "Kitchen", + "media": "Media", + "custom": "Custom" + }, + "view": { + "list": "List", + "grid": "Grid", + "table": "Table" + }, + "filter": { + "all": "All", + "saved": "Saved Filters", + "save": "Save Filter", + "clear": "Clear Filters" + }, + "purchase": { + "title": "Purchase Data", + "price": "Price", + "currency": "Currency", + "date": "Purchase Date", + "retailer": "Retailer", + "warranty": "Warranty Until", + "receipt": "Receipt" + }, + "auth": { + "login": "Login", + "logout": "Logout", + "register": "Register", + "email": "Email", + "password": "Password", + "forgotPassword": "Forgot password?" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "add": "Add", + "close": "Close", + "search": "Search", + "error": "Error", + "success": "Success", + "loading": "Loading...", + "noResults": "No results", + "confirm": "Confirm", + "back": "Back", + "next": "Next", + "create": "Create" + }, + "error": { + "notFound": "Page not found", + "backToHome": "Back to home" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/inventar/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/es.json new file mode 100644 index 000000000..b4a145359 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/es.json @@ -0,0 +1,148 @@ +{ + "app": { + "name": "Inventar", + "loading": "Cargando..." + }, + "nav": { + "collections": "Colecciones", + "allItems": "Todos los artículos", + "locations": "Ubicaciones", + "categories": "Categorías", + "tags": "Etiquetas", + "search": "Buscar", + "settings": "Ajustes", + "feedback": "Feedback" + }, + "collection": { + "create": "Crear colección", + "edit": "Editar colección", + "delete": "Eliminar colección", + "name": "Nombre", + "description": "Descripción", + "icon": "Icono", + "color": "Color", + "template": "Plantilla", + "schema": "Esquema", + "noCollections": "Sin colecciones", + "itemCount": "{count} artículos", + "selectTemplate": "Seleccionar plantilla", + "customFields": "Campos personalizados", + "addField": "Agregar campo" + }, + "item": { + "create": "Crear artículo", + "edit": "Editar artículo", + "delete": "Eliminar artículo", + "name": "Nombre", + "description": "Descripción", + "status": "Estado", + "quantity": "Cantidad", + "location": "Ubicación", + "category": "Categoría", + "tags": "Etiquetas", + "photos": "Fotos", + "notes": "Notas", + "documents": "Documentos", + "noItems": "Sin artículos", + "addPhoto": "Agregar foto", + "addNote": "Agregar nota", + "addDocument": "Agregar documento" + }, + "status": { + "owned": "Propio", + "lent": "Prestado", + "stored": "Almacenado", + "for_sale": "En venta", + "disposed": "Descartado" + }, + "location": { + "create": "Crear ubicación", + "edit": "Editar ubicación", + "delete": "Eliminar ubicación", + "name": "Nombre", + "parent": "Padre", + "noLocations": "Sin ubicaciones", + "addSub": "Agregar sub-ubicación" + }, + "category": { + "create": "Crear categoría", + "edit": "Editar categoría", + "delete": "Eliminar categoría", + "name": "Nombre", + "noCategories": "Sin categorías" + }, + "field": { + "text": "Texto", + "number": "Número", + "date": "Fecha", + "select": "Selección", + "tags": "Etiquetas", + "checkbox": "Casilla", + "url": "URL", + "currency": "Moneda", + "required": "Obligatorio", + "placeholder": "Marcador", + "options": "Opciones", + "addOption": "Agregar opción", + "removeField": "Eliminar campo" + }, + "template": { + "electronics": "Electrónica", + "books": "Libros", + "furniture": "Muebles", + "clothing": "Ropa", + "tools": "Herramientas", + "kitchen": "Cocina", + "media": "Medios", + "custom": "Personalizado" + }, + "view": { + "list": "Lista", + "grid": "Cuadrícula", + "table": "Tabla" + }, + "filter": { + "all": "Todos", + "saved": "Filtros guardados", + "save": "Guardar filtro", + "clear": "Borrar filtros" + }, + "purchase": { + "title": "Datos de compra", + "price": "Precio", + "currency": "Moneda", + "date": "Fecha de compra", + "retailer": "Tienda", + "warranty": "Garantía hasta", + "receipt": "Recibo" + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "register": "Registrarse", + "email": "Email", + "password": "Contraseña", + "forgotPassword": "¿Olvidaste tu contraseña?" + }, + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "add": "Agregar", + "close": "Cerrar", + "search": "Buscar", + "error": "Error", + "success": "Correcto", + "loading": "Cargando...", + "noResults": "Sin resultados", + "confirm": "Confirmar", + "back": "Atrás", + "next": "Siguiente", + "create": "Crear" + }, + "error": { + "notFound": "Página no encontrada", + "backToHome": "Volver al inicio" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/inventar/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/fr.json new file mode 100644 index 000000000..38e951db7 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/fr.json @@ -0,0 +1,148 @@ +{ + "app": { + "name": "Inventar", + "loading": "Chargement..." + }, + "nav": { + "collections": "Collections", + "allItems": "Tous les articles", + "locations": "Emplacements", + "categories": "Catégories", + "tags": "Tags", + "search": "Rechercher", + "settings": "Paramètres", + "feedback": "Feedback" + }, + "collection": { + "create": "Créer une collection", + "edit": "Modifier la collection", + "delete": "Supprimer la collection", + "name": "Nom", + "description": "Description", + "icon": "Icône", + "color": "Couleur", + "template": "Modèle", + "schema": "Schéma", + "noCollections": "Aucune collection", + "itemCount": "{count} articles", + "selectTemplate": "Choisir un modèle", + "customFields": "Champs personnalisés", + "addField": "Ajouter un champ" + }, + "item": { + "create": "Créer un article", + "edit": "Modifier l'article", + "delete": "Supprimer l'article", + "name": "Nom", + "description": "Description", + "status": "Statut", + "quantity": "Quantité", + "location": "Emplacement", + "category": "Catégorie", + "tags": "Tags", + "photos": "Photos", + "notes": "Notes", + "documents": "Documents", + "noItems": "Aucun article", + "addPhoto": "Ajouter une photo", + "addNote": "Ajouter une note", + "addDocument": "Ajouter un document" + }, + "status": { + "owned": "Possédé", + "lent": "Prêté", + "stored": "Stocké", + "for_sale": "En vente", + "disposed": "Jeté" + }, + "location": { + "create": "Créer un emplacement", + "edit": "Modifier l'emplacement", + "delete": "Supprimer l'emplacement", + "name": "Nom", + "parent": "Parent", + "noLocations": "Aucun emplacement", + "addSub": "Ajouter un sous-emplacement" + }, + "category": { + "create": "Créer une catégorie", + "edit": "Modifier la catégorie", + "delete": "Supprimer la catégorie", + "name": "Nom", + "noCategories": "Aucune catégorie" + }, + "field": { + "text": "Texte", + "number": "Nombre", + "date": "Date", + "select": "Sélection", + "tags": "Tags", + "checkbox": "Case à cocher", + "url": "URL", + "currency": "Devise", + "required": "Obligatoire", + "placeholder": "Placeholder", + "options": "Options", + "addOption": "Ajouter une option", + "removeField": "Supprimer le champ" + }, + "template": { + "electronics": "Électronique", + "books": "Livres", + "furniture": "Meubles", + "clothing": "Vêtements", + "tools": "Outils", + "kitchen": "Cuisine", + "media": "Médias", + "custom": "Personnalisé" + }, + "view": { + "list": "Liste", + "grid": "Grille", + "table": "Tableau" + }, + "filter": { + "all": "Tous", + "saved": "Filtres enregistrés", + "save": "Enregistrer le filtre", + "clear": "Effacer les filtres" + }, + "purchase": { + "title": "Données d'achat", + "price": "Prix", + "currency": "Devise", + "date": "Date d'achat", + "retailer": "Revendeur", + "warranty": "Garantie jusqu'au", + "receipt": "Reçu" + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "register": "Inscription", + "email": "Email", + "password": "Mot de passe", + "forgotPassword": "Mot de passe oublié ?" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "add": "Ajouter", + "close": "Fermer", + "search": "Rechercher", + "error": "Erreur", + "success": "Succès", + "loading": "Chargement...", + "noResults": "Aucun résultat", + "confirm": "Confirmer", + "back": "Retour", + "next": "Suivant", + "create": "Créer" + }, + "error": { + "notFound": "Page introuvable", + "backToHome": "Retour à l'accueil" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/inventar/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/it.json new file mode 100644 index 000000000..6c7dacb9a --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/inventar/it.json @@ -0,0 +1,148 @@ +{ + "app": { + "name": "Inventar", + "loading": "Caricamento..." + }, + "nav": { + "collections": "Collezioni", + "allItems": "Tutti gli articoli", + "locations": "Posizioni", + "categories": "Categorie", + "tags": "Tag", + "search": "Cerca", + "settings": "Impostazioni", + "feedback": "Feedback" + }, + "collection": { + "create": "Crea collezione", + "edit": "Modifica collezione", + "delete": "Elimina collezione", + "name": "Nome", + "description": "Descrizione", + "icon": "Icona", + "color": "Colore", + "template": "Modello", + "schema": "Schema", + "noCollections": "Nessuna collezione", + "itemCount": "{count} articoli", + "selectTemplate": "Seleziona modello", + "customFields": "Campi personalizzati", + "addField": "Aggiungi campo" + }, + "item": { + "create": "Crea articolo", + "edit": "Modifica articolo", + "delete": "Elimina articolo", + "name": "Nome", + "description": "Descrizione", + "status": "Stato", + "quantity": "Quantità", + "location": "Posizione", + "category": "Categoria", + "tags": "Tag", + "photos": "Foto", + "notes": "Note", + "documents": "Documenti", + "noItems": "Nessun articolo", + "addPhoto": "Aggiungi foto", + "addNote": "Aggiungi nota", + "addDocument": "Aggiungi documento" + }, + "status": { + "owned": "Posseduto", + "lent": "Prestato", + "stored": "Depositato", + "for_sale": "In vendita", + "disposed": "Smaltito" + }, + "location": { + "create": "Crea posizione", + "edit": "Modifica posizione", + "delete": "Elimina posizione", + "name": "Nome", + "parent": "Padre", + "noLocations": "Nessuna posizione", + "addSub": "Aggiungi sotto-posizione" + }, + "category": { + "create": "Crea categoria", + "edit": "Modifica categoria", + "delete": "Elimina categoria", + "name": "Nome", + "noCategories": "Nessuna categoria" + }, + "field": { + "text": "Testo", + "number": "Numero", + "date": "Data", + "select": "Selezione", + "tags": "Tag", + "checkbox": "Casella", + "url": "URL", + "currency": "Valuta", + "required": "Obbligatorio", + "placeholder": "Segnaposto", + "options": "Opzioni", + "addOption": "Aggiungi opzione", + "removeField": "Rimuovi campo" + }, + "template": { + "electronics": "Elettronica", + "books": "Libri", + "furniture": "Mobili", + "clothing": "Abbigliamento", + "tools": "Utensili", + "kitchen": "Cucina", + "media": "Media", + "custom": "Personalizzato" + }, + "view": { + "list": "Lista", + "grid": "Griglia", + "table": "Tabella" + }, + "filter": { + "all": "Tutti", + "saved": "Filtri salvati", + "save": "Salva filtro", + "clear": "Cancella filtri" + }, + "purchase": { + "title": "Dati di acquisto", + "price": "Prezzo", + "currency": "Valuta", + "date": "Data di acquisto", + "retailer": "Rivenditore", + "warranty": "Garanzia fino al", + "receipt": "Ricevuta" + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "register": "Registrati", + "email": "Email", + "password": "Password", + "forgotPassword": "Password dimenticata?" + }, + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "add": "Aggiungi", + "close": "Chiudi", + "search": "Cerca", + "error": "Errore", + "success": "Successo", + "loading": "Caricamento...", + "noResults": "Nessun risultato", + "confirm": "Conferma", + "back": "Indietro", + "next": "Avanti", + "create": "Crea" + }, + "error": { + "notFound": "Pagina non trovata", + "backToHome": "Torna alla home" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/memoro/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/de.json new file mode 100644 index 000000000..5ecc43561 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/de.json @@ -0,0 +1,320 @@ +{ + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "share": "Teilen", + "back": "Zurück", + "next": "Weiter", + "done": "Fertig", + "loading": "Wird geladen...", + "search": "Suchen", + "settings": "Einstellungen", + "yes": "Ja", + "no": "Nein", + "ok": "OK", + "error": "Fehler", + "success": "Erfolg", + "create": "Erstellen", + "confirm": "Bestätigen", + "close": "Schließen", + "or": "ODER" + }, + "nav": { + "dashboard": "Dashboard", + "tags": "Tags", + "spaces": "Spaces", + "mana": "Mana", + "blueprints": "Vorlagen", + "statistics": "Statistiken", + "settings": "Einstellungen", + "logout": "Abmelden", + "expand": "Erweitern", + "minimize": "Minimieren", + "shortcuts": "Tastenkombinationen" + }, + "auth": { + "welcome": "Willkommen bei Memoro", + "get_started": "Los geht's", + "create_account": "Neues Konto erstellen", + "sign_in": "Anmelden", + "sign_in_with_email": "Mit E-Mail anmelden", + "sign_up_with_email": "Mit E-Mail registrieren", + "email": "E-Mail", + "password": "Passwort", + "confirm_password": "Passwort bestätigen", + "forgot_password": "Passwort vergessen?", + "reset_password": "Passwort zurücksetzen", + "logging_in": "Anmelden...", + "creating_account": "Konto wird erstellt...", + "sending": "Senden...", + "error_email_required": "Bitte gib deine E-Mail-Adresse ein", + "error_password_required": "Bitte gib dein Passwort ein", + "error_confirm_password": "Bitte bestätige dein Passwort", + "error_passwords_not_match": "Passwörter stimmen nicht überein", + "error_password_too_short": "Das Passwort muss mindestens 8 Zeichen lang sein", + "error_password_requirements": "Das Passwort muss mindestens einen Kleinbuchstaben, einen Großbuchstaben, eine Ziffer und ein Sonderzeichen enthalten", + "error_registration_failed": "Registrierung fehlgeschlagen", + "password_requirement": "Passwort muss mindestens 8 Zeichen lang sein und mindestens einen Kleinbuchstaben, einen Großbuchstaben, eine Ziffer und ein Sonderzeichen enthalten.", + "registration_success": "Registrierung erfolgreich! Überprüfe deine E-Mail, um dein Konto zu bestätigen.", + "check_email_confirmation": "Bitte überprüfe deine E-Mail, um dein Konto zu bestätigen.", + "reset_email_sent": "Gib deine E-Mail-Adresse ein und wir senden dir einen Link zum Zurücksetzen deines Passworts.", + "email_only_title": "Warum nur E-Mail-Authentifizierung?", + "email_only_info": "Wir unterstützen nur E-Mail-Registrierung, um deine Unabhängigkeit und Privatsphäre zu gewährleisten.", + "email_only_learn_more": "Mehr erfahren", + "email_only_intro": "Wir glauben daran, dir die volle Kontrolle über dein Konto und deine Daten zu geben. Mit E-Mail-basierter Authentifizierung stellen wir sicher:", + "email_only_benefit_1_title": "Kein Vendor Lock-in", + "email_only_benefit_1_desc": "Du bist nicht von Drittanbietern wie Google oder Apple abhängig. Dein Konto funktioniert unabhängig.", + "email_only_benefit_2_title": "Verbesserte Privatsphäre", + "email_only_benefit_2_desc": "Wir teilen deine Daten nicht mit Google, Apple oder anderen Drittanbietern zur Authentifizierung.", + "email_only_benefit_3_title": "Konto-Portabilität", + "email_only_benefit_3_desc": "Deine E-Mail-Adresse ist portabel und funktioniert auf allen Geräten und Plattformen.", + "email_only_benefit_4_title": "Direkte Kommunikation", + "email_only_benefit_4_desc": "Wir können dich direkt über wichtige Updates erreichen, ohne auf Drittanbieter-Benachrichtigungssysteme angewiesen zu sein.", + "email_only_modal_footer": "Wir sind verpflichtet, Tools zu entwickeln, die deine Freiheit und Privatsphäre respektieren. E-Mail-Authentifizierung ist Teil dieser Verpflichtung.", + "got_it": "Verstanden", + "already_have_account": "Hast du bereits ein Konto?", + "dont_have_account": "Noch kein Konto?", + "terms_agreement": "Mit der Nutzung von Memoro stimmst du unseren AGB und der Datenschutzerklärung zu.", + "mana_login": "Mana Login", + "mana_login_description": "Ein Login für alle Mana Apps", + "mana_login_benefit_0": "Mana Subscriptions über alle Apps hinweg nutzen - nur einmal zahlen und alles nutzen", + "back": "Zurück", + "reset_password_description": "Gib deine E-Mail-Adresse ein und wir senden dir einen Link zum Zurücksetzen deines Passworts.", + "reset_password_error": "Passwort zurücksetzen fehlgeschlagen", + "reset_password_success": "E-Mail wurde versendet!", + "reset_password_rate_limit": "Zu viele Versuche. Bitte warte einige Minuten.", + "reset_email_sent_description": "Wir haben eine E-Mail mit Anweisungen zum Zurücksetzen deines Passworts an {email} gesendet. Bitte überprüfe deinen Posteingang und Spam-Ordner.", + "back_to_login": "Zurück zum Login", + "resend_email": "E-Mail erneut senden", + "reset_email_sent_title": "E-Mail wurde versendet!", + "terms_agreement_conjunction": "und der", + "terms_agreement_suffix": "zu.", + "oauth_error_access_denied": "Zugriff verweigert. Die Anmeldung wurde abgebrochen.", + "oauth_error_server_error": "Server-Fehler bei der Authentifizierung. Bitte versuche es erneut.", + "oauth_error_temporarily_unavailable": "Der Authentifizierungsdienst ist vorübergehend nicht verfügbar. Bitte versuche es später erneut.", + "oauth_error_invalid_request": "Ungültige Anfrage. Bitte versuche es erneut.", + "oauth_error_unauthorized_client": "Nicht autorisierter Client. Bitte kontaktiere den Support.", + "oauth_error_unsupported_response_type": "Nicht unterstützter Antworttyp. Bitte kontaktiere den Support.", + "oauth_error_invalid_scope": "Ungültiger Berechtigungsbereich. Bitte kontaktiere den Support.", + "oauth_error_unknown": "Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut.", + "password_requirements_title": "Passwort-Anforderungen:", + "password_requirement_length": "Mindestens 8 Zeichen", + "password_requirement_lowercase": "Einen Kleinbuchstaben", + "password_requirement_uppercase": "Einen Großbuchstaben", + "password_requirement_digit": "Eine Ziffer", + "password_requirement_special": "Ein Sonderzeichen" + }, + "dashboard": { + "title": "Dashboard", + "recent_memos": "Neueste Memos", + "no_memos": "Keine Memos gefunden", + "create_memo": "Memo erstellen", + "search_placeholder": "Memos durchsuchen..." + }, + "memo": { + "title": "Memo", + "unnamed": "Unbenanntes Memo", + "word_count": "{{count}} Wort", + "word_count_plural": "{{count}} Wörter", + "delete_confirmation": "Möchtest du dieses Memo wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "delete_permanently": "Endgültig löschen", + "deleting": "Wird gelöscht...", + "pin": "Anheften", + "unpin": "Loslösen", + "share": "Teilen", + "edit": "Bearbeiten", + "translate": "Übersetzen", + "create_memory": "Memory erstellen", + "ask_question": "Frage stellen", + "copy_transcript": "Transkript kopieren", + "replace_word": "Wort ersetzen", + "reprocess": "Erneut verarbeiten", + "label_speakers": "Sprecher benennen", + "add_photos": "Fotos hinzufügen", + "manage_spaces": "Spaces verwalten", + "tags": "Tags", + "add_tag": "Tag hinzufügen", + "options": "Optionen", + "search": "Suchen", + "copy": "Kopieren", + "speakers": "Sprecher", + "find_replace": "Suchen & Ersetzen", + "shortcuts": "Tastenkürzel", + "no_memo_selected": "Kein Memo ausgewählt", + "select_memo_hint": "Wähle ein Memo aus der Liste oder erstelle eine neue Aufnahme", + "processing_transcript": "Transkription wird verarbeitet...", + "ask_question_placeholder": "Stelle eine Frage zu diesem Memo...", + "open_in_new_tab": "In neuem Tab öffnen", + "edit_title": "Titel bearbeiten", + "export_text": "Als Text exportieren", + "enter_new_title": "Neuen Titel eingeben:", + "no_title": "Ohne Titel", + "no_transcript": "Kein Transkript verfügbar", + "link_copied": "Link in Zwischenablage kopiert!", + "transcript_copied": "Transkript in Zwischenablage kopiert!", + "no_search_results": "Keine Suchergebnisse", + "no_memos_with_search": "Es wurden keine Memos gefunden, die \"{query}\" enthalten.", + "clear_search": "Suche löschen", + "no_memos_with_tag": "Keine Memos mit diesem Tag", + "no_memos_with_tag_hint": "Es gibt noch keine Memos mit diesem Tag.", + "show_all_memos": "Alle Memos anzeigen", + "no_memos_yet": "Noch keine Memos", + "no_memos_hint": "Gehe zur Aufnahme-Seite, um dein erstes Memo aufzunehmen", + "load_more": "Mehr Memos laden", + "search_placeholder": "Memos durchsuchen...", + "delete_memo_title": "Memo löschen", + "delete_memo_confirm": "Möchtest du \"{title}\" wirklich löschen?", + "delete_memo_warning": "Diese Aktion kann nicht rückgängig gemacht werden. Das Memo und alle zugehörigen Daten werden dauerhaft gelöscht.", + "error_user_not_authenticated": "Benutzer nicht authentifiziert", + "error_loading_memos": "Memos konnten nicht geladen werden", + "error_deleting_memo": "Fehler beim Löschen des Memos. Bitte versuche es erneut.", + "error_updating_title": "Fehler beim Aktualisieren des Titels. Bitte versuche es erneut.", + "error_copying_link": "Fehler beim Kopieren des Links. Bitte versuche es erneut.", + "error_pin_status": "Fehler beim Ändern des Pin-Status. Bitte versuche es erneut.", + "error_saving": "Fehler beim Speichern. Bitte versuche es erneut.", + "error_copying_transcript": "Fehler beim Kopieren des Transkripts. Bitte versuche es erneut.", + "error_updating_tags": "Fehler beim Aktualisieren der Tags. Bitte versuche es erneut.", + "error_creating_tag": "Fehler beim Erstellen des Tags. Bitte versuche es erneut.", + "error_asking_question": "Fehler bei der Verarbeitung der Frage. Bitte versuche es erneut.", + "retry": "Erneut versuchen", + "export_title": "Titel", + "export_date": "Datum", + "export_duration": "Dauer", + "export_transcript": "Transkript", + "export_no_transcript": "Kein Transkript verfügbar", + "export_ai_analysis": "KI-Analyse" + }, + "tags": { + "title": "Tags", + "create_tag": "Tag erstellen", + "search_placeholder": "Tags durchsuchen...", + "no_tags": "Keine Tags gefunden", + "delete_confirmation": "Möchtest du den Tag \"{{name}}\" wirklich löschen?", + "tag_name": "Tag-Name", + "tag_color": "Tag-Farbe" + }, + "spaces": { + "title": "Spaces", + "create_space": "Space erstellen", + "no_spaces": "Keine Spaces gefunden", + "members": "Mitglieder", + "invite": "Einladen" + }, + "blueprints": { + "title": "Vorlagen", + "loading": "Lade Vorlagen...", + "no_blueprints": "Keine Vorlagen gefunden", + "search_placeholder": "Vorlagen durchsuchen...", + "all_categories": "Alle", + "standard": "Standard", + "manage": "Blueprints verwalten", + "activate": "Blueprint aktivieren", + "load_error": "Blueprints konnten nicht geladen werden.", + "previous_tip": "Vorheriger Tipp", + "next_tip": "Nächster Tipp", + "go_to_tip": "Gehe zu Tipp {index}" + }, + "record": { + "title": "Aufnehmen - Memoro", + "instruction": "Halte gedrückt zum Aufnehmen", + "uploading": "Wird hochgeladen...", + "user_not_authenticated": "Benutzer nicht authentifiziert", + "upload_failed": "Upload fehlgeschlagen", + "network_error": "Netzwerkfehler: Bitte überprüfe deine Verbindung und versuche es erneut.", + "upload_error": "Fehler beim Hochladen der Aufnahme: {error}", + "unexpected_error": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut.", + "cancel_title": "Aufnahme löschen", + "cancel_message": "Möchtest du die aktuelle Aufnahme wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "cancel_confirm": "Löschen", + "cancel_abort": "Nicht löschen", + "pause": "Pause", + "resume": "Fortsetzen", + "cancel": "Aufnahme abbrechen" + }, + "statistics": { + "title": "Statistiken", + "today": "Heute", + "last_30_days": "Letzte 30 Tage", + "total": "Gesamt", + "memos": "Memos", + "words": "Wörter", + "recording_duration": "Aufnahmedauer", + "loading": "Lade Statistiken..." + }, + "subscription": { + "title": "Mana kaufen", + "current_plan": "Aktueller Tarif", + "your_mana": "Dein Mana", + "buy": "Kaufen", + "popular": "Beliebt", + "legacy_plan": "Alter Tarif", + "monthly": "Monatlich", + "yearly": "Jährlich" + }, + "settings": { + "title": "Einstellungen", + "appearance": "Darstellung", + "theme": "Theme", + "system": "System", + "light": "Hell", + "dark": "Dunkel", + "language": "Sprache", + "user_interface": "Benutzeroberfläche", + "show_language_button": "Sprachen-Button anzeigen", + "show_recording_instruction": "Aufnahme-Anleitung anzeigen", + "show_blueprints": "Blueprints anzeigen", + "show_mana_badge": "Mana-Anzeige im Header", + "data_privacy": "Daten & Privatsphäre", + "save_location": "Standort speichern", + "enable_analytics": "Analytics aktivieren", + "support": "Support", + "contact_support": "Support kontaktieren", + "rate_app": "App bewerten", + "account": "Konto", + "email_label": "E-Mail-Adresse", + "sign_out": "Abmelden", + "delete_account": "Konto löschen", + "app_info": "App-Informationen", + "version": "Version", + "platform": "Plattform", + "build": "Build", + "browser": "Browser", + "copyright": "© 2025 Memoro GmbH", + "made_with_love": "Made with ❤️ in Germany" + }, + "app_slider": { + "title": "Weitere Manacore Apps", + "memoro_desc": "KI-gestützte Sprachmemos", + "memoro_long_desc": "Verwandle deine Stimme in organisierte, umsetzbare Erkenntnisse mit KI-gestützter Transkription und Analyse. Perfekt zum Festhalten von Ideen unterwegs.", + "maerchenzauber_desc": "Magische Gute-Nacht-Geschichten", + "maerchenzauber_long_desc": "Erschaffe personalisierte Gute-Nacht-Geschichten für deine Kinder mit KI. Entfache die Fantasie und mache jede Nacht magisch mit einzigartigen Erzählungen.", + "moodlit_desc": "Dein Stimmungsbegleiter", + "moodlit_long_desc": "Verfolge und verstehe deine Emotionen mit KI-gestützten Einblicken. Baue emotionales Bewusstsein auf und verbessere dein mentales Wohlbefinden.", + "manacore_desc": "KI-Produktivitätssuite", + "manacore_long_desc": "Die zentrale Anlaufstelle für alle Manacore-Apps. Verwalte deine Abonnements, synchronisiere Daten und greife auf leistungsstarke KI-Tools von einem Ort aus zu.", + "coming_soon": "Demnächst", + "download": "Download", + "get_started": "Los geht's", + "status_published": "Veröffentlicht", + "status_beta": "Beta", + "status_development": "In Entwicklung", + "status_planning": "Geplant" + }, + "theme": { + "toggle": "Theme wechseln", + "light_mode": "Heller Modus", + "dark_mode": "Dunkler Modus", + "switch_to_light": "Zum hellen Modus wechseln", + "switch_to_dark": "Zum dunklen Modus wechseln" + }, + "errors": { + "unexpected": "Ein unerwarteter Fehler ist aufgetreten.", + "network": "Netzwerkfehler. Bitte überprüfe deine Internetverbindung.", + "not_found": "Nicht gefunden.", + "unauthorized": "Nicht autorisiert.", + "forbidden": "Zugriff verweigert.", + "server_error": "Serverfehler. Bitte versuche es später erneut." + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/memoro/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/en.json new file mode 100644 index 000000000..cf4e8e269 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/en.json @@ -0,0 +1,320 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "share": "Share", + "back": "Back", + "next": "Next", + "done": "Done", + "loading": "Loading...", + "search": "Search", + "settings": "Settings", + "yes": "Yes", + "no": "No", + "ok": "OK", + "error": "Error", + "success": "Success", + "create": "Create", + "confirm": "Confirm", + "close": "Close", + "or": "OR" + }, + "nav": { + "dashboard": "Dashboard", + "tags": "Tags", + "spaces": "Spaces", + "mana": "Mana", + "blueprints": "Blueprints", + "statistics": "Statistics", + "settings": "Settings", + "logout": "Logout", + "expand": "Expand", + "minimize": "Minimize", + "shortcuts": "Shortcuts" + }, + "auth": { + "welcome": "Welcome to Memoro", + "get_started": "Get Started", + "create_account": "Create Account", + "sign_in": "Sign In", + "sign_in_with_email": "Sign In with Email", + "sign_up_with_email": "Sign Up with Email", + "email": "Email", + "password": "Password", + "confirm_password": "Confirm Password", + "forgot_password": "Forgot Password?", + "reset_password": "Reset Password", + "logging_in": "Signing in...", + "creating_account": "Creating account...", + "sending": "Sending...", + "error_email_required": "Please enter your email address", + "error_password_required": "Please enter your password", + "error_confirm_password": "Please confirm your password", + "error_passwords_not_match": "Passwords do not match", + "error_password_too_short": "Password must be at least 8 characters long", + "error_password_requirements": "Password must contain at least one lowercase letter, one uppercase letter, one digit, and one special character", + "error_registration_failed": "Registration failed", + "password_requirement": "Password must be at least 8 characters long and contain at least one lowercase letter, one uppercase letter, one digit, and one special character.", + "registration_success": "Registration successful! Check your email to verify your account.", + "check_email_confirmation": "Please check your email to confirm your account.", + "reset_email_sent": "Enter your email address and we'll send you a link to reset your password.", + "email_only_title": "Why Email-Only Authentication?", + "email_only_info": "We only support email registration to ensure your independence and privacy.", + "email_only_learn_more": "Learn more", + "email_only_intro": "We believe in giving you full control over your account and data. By using email-based authentication, we ensure:", + "email_only_benefit_1_title": "No Vendor Lock-In", + "email_only_benefit_1_desc": "You're not dependent on third-party services like Google or Apple. Your account works independently.", + "email_only_benefit_2_title": "Enhanced Privacy", + "email_only_benefit_2_desc": "We don't share your data with Google, Apple, or any other third party for authentication.", + "email_only_benefit_3_title": "Account Portability", + "email_only_benefit_3_desc": "Your email address is portable and works across all devices and platforms.", + "email_only_benefit_4_title": "Direct Communication", + "email_only_benefit_4_desc": "We can reach you directly for important updates without relying on third-party notification systems.", + "email_only_modal_footer": "We're committed to building tools that respect your freedom and privacy. Email authentication is part of that commitment.", + "got_it": "Got it", + "already_have_account": "Already have an account?", + "dont_have_account": "Don't have an account?", + "terms_agreement": "By using Memoro you agree to our Terms and Privacy Policy.", + "mana_login": "Mana Login", + "mana_login_description": "One login for all Mana apps", + "mana_login_benefit_0": "Use Mana subscriptions across all apps - pay once and use everything", + "back": "Back", + "reset_password_description": "Enter your email address and we'll send you a link to reset your password.", + "reset_password_error": "Password reset failed", + "reset_password_success": "Email sent!", + "reset_password_rate_limit": "Too many attempts. Please wait a few minutes.", + "reset_email_sent_description": "We've sent an email with instructions to reset your password to {email}. Please check your inbox and spam folder.", + "back_to_login": "Back to login", + "resend_email": "Resend email", + "reset_email_sent_title": "Email sent!", + "terms_agreement_conjunction": "and the", + "terms_agreement_suffix": ".", + "oauth_error_access_denied": "Access denied. The login was cancelled.", + "oauth_error_server_error": "Server error during authentication. Please try again.", + "oauth_error_temporarily_unavailable": "The authentication service is temporarily unavailable. Please try again later.", + "oauth_error_invalid_request": "Invalid request. Please try again.", + "oauth_error_unauthorized_client": "Unauthorized client. Please contact support.", + "oauth_error_unsupported_response_type": "Unsupported response type. Please contact support.", + "oauth_error_invalid_scope": "Invalid scope. Please contact support.", + "oauth_error_unknown": "An unknown error occurred. Please try again.", + "password_requirements_title": "Password requirements:", + "password_requirement_length": "At least 8 characters", + "password_requirement_lowercase": "One lowercase letter", + "password_requirement_uppercase": "One uppercase letter", + "password_requirement_digit": "One digit", + "password_requirement_special": "One special character" + }, + "dashboard": { + "title": "Dashboard", + "recent_memos": "Recent Memos", + "no_memos": "No memos found", + "create_memo": "Create Memo", + "search_placeholder": "Search memos..." + }, + "memo": { + "title": "Memo", + "unnamed": "Unnamed Memo", + "word_count": "{{count}} word", + "word_count_plural": "{{count}} words", + "delete_confirmation": "Are you sure you want to delete this memo? This action cannot be undone.", + "delete_permanently": "Delete Permanently", + "deleting": "Deleting...", + "pin": "Pin", + "unpin": "Unpin", + "share": "Share", + "edit": "Edit", + "translate": "Translate", + "create_memory": "Create Memory", + "ask_question": "Ask Question", + "copy_transcript": "Copy Transcript", + "replace_word": "Replace Word", + "reprocess": "Reprocess", + "label_speakers": "Label Speakers", + "add_photos": "Add Photos", + "manage_spaces": "Manage Spaces", + "tags": "Tags", + "add_tag": "Add Tag", + "options": "Options", + "search": "Search", + "copy": "Copy", + "speakers": "Speakers", + "find_replace": "Find & Replace", + "shortcuts": "Shortcuts", + "no_memo_selected": "No memo selected", + "select_memo_hint": "Select a memo from the list or create a new recording", + "processing_transcript": "Transcription in progress...", + "ask_question_placeholder": "Ask a question about this memo...", + "open_in_new_tab": "Open in new tab", + "edit_title": "Edit title", + "export_text": "Export as text", + "enter_new_title": "Enter new title:", + "no_title": "Untitled", + "no_transcript": "No transcript available", + "link_copied": "Link copied to clipboard!", + "transcript_copied": "Transcript copied to clipboard!", + "no_search_results": "No search results", + "no_memos_with_search": "No memos found containing \"{query}\".", + "clear_search": "Clear search", + "no_memos_with_tag": "No memos with this tag", + "no_memos_with_tag_hint": "There are no memos with this tag yet.", + "show_all_memos": "Show all memos", + "no_memos_yet": "No memos yet", + "no_memos_hint": "Go to the recording page to create your first memo", + "load_more": "Load more memos", + "search_placeholder": "Search memos...", + "delete_memo_title": "Delete memo", + "delete_memo_confirm": "Are you sure you want to delete \"{title}\"?", + "delete_memo_warning": "This action cannot be undone. The memo and all associated data will be permanently deleted.", + "error_user_not_authenticated": "User not authenticated", + "error_loading_memos": "Could not load memos", + "error_deleting_memo": "Error deleting memo. Please try again.", + "error_updating_title": "Error updating title. Please try again.", + "error_copying_link": "Error copying link. Please try again.", + "error_pin_status": "Error updating pin status. Please try again.", + "error_saving": "Error saving changes. Please try again.", + "error_copying_transcript": "Error copying transcript. Please try again.", + "error_updating_tags": "Error updating tags. Please try again.", + "error_creating_tag": "Error creating tag. Please try again.", + "error_asking_question": "Error processing question. Please try again.", + "retry": "Try again", + "export_title": "Title", + "export_date": "Date", + "export_duration": "Duration", + "export_transcript": "Transcript", + "export_no_transcript": "No transcript available", + "export_ai_analysis": "AI Analysis" + }, + "tags": { + "title": "Tags", + "create_tag": "Create Tag", + "search_placeholder": "Search tags...", + "no_tags": "No tags found", + "delete_confirmation": "Are you sure you want to delete the tag \"{{name}}\"?", + "tag_name": "Tag Name", + "tag_color": "Tag Color" + }, + "spaces": { + "title": "Spaces", + "create_space": "Create Space", + "no_spaces": "No spaces found", + "members": "Members", + "invite": "Invite" + }, + "blueprints": { + "title": "Blueprints", + "loading": "Loading blueprints...", + "no_blueprints": "No blueprints found", + "search_placeholder": "Search blueprints...", + "all_categories": "All", + "standard": "Standard", + "manage": "Manage blueprints", + "activate": "Activate blueprint", + "load_error": "Could not load blueprints.", + "previous_tip": "Previous tip", + "next_tip": "Next tip", + "go_to_tip": "Go to tip {index}" + }, + "record": { + "title": "Record - Memoro", + "instruction": "Hold to record", + "uploading": "Uploading...", + "user_not_authenticated": "User not authenticated", + "upload_failed": "Upload failed", + "network_error": "Network error: Please check your connection and try again.", + "upload_error": "Error uploading recording: {error}", + "unexpected_error": "An unexpected error occurred. Please try again.", + "cancel_title": "Delete Recording", + "cancel_message": "Do you really want to delete the current recording? This action cannot be undone.", + "cancel_confirm": "Delete", + "cancel_abort": "Don't delete", + "pause": "Pause", + "resume": "Resume", + "cancel": "Cancel recording" + }, + "statistics": { + "title": "Statistics", + "today": "Today", + "last_30_days": "Last 30 days", + "total": "Total", + "memos": "Memos", + "words": "Words", + "recording_duration": "Recording Duration", + "loading": "Loading statistics..." + }, + "subscription": { + "title": "Buy Mana", + "current_plan": "Current Plan", + "your_mana": "Your Mana", + "buy": "Buy", + "popular": "Popular", + "legacy_plan": "Legacy Plan", + "monthly": "Monthly", + "yearly": "Yearly" + }, + "settings": { + "title": "Settings", + "appearance": "Appearance", + "theme": "Theme", + "system": "System", + "light": "Light", + "dark": "Dark", + "language": "Language", + "user_interface": "User Interface", + "show_language_button": "Show Language Button", + "show_recording_instruction": "Show Recording Instruction", + "show_blueprints": "Show Blueprints", + "show_mana_badge": "Show Mana Badge in Header", + "data_privacy": "Data & Privacy", + "save_location": "Save Location", + "enable_analytics": "Enable Analytics", + "support": "Support", + "contact_support": "Contact Support", + "rate_app": "Rate App", + "account": "Account", + "email_label": "Email Address", + "sign_out": "Sign Out", + "delete_account": "Delete Account", + "app_info": "App Information", + "version": "Version", + "platform": "Platform", + "build": "Build", + "browser": "Browser", + "copyright": "© 2025 Memoro GmbH", + "made_with_love": "Made with ❤️ in Germany" + }, + "app_slider": { + "title": "More Manacore Apps", + "memoro_desc": "AI-powered voice memos", + "memoro_long_desc": "Transform your voice into organized, actionable insights with AI-powered transcription and analysis. Perfect for capturing ideas on the go.", + "maerchenzauber_desc": "Magical bedtime stories", + "maerchenzauber_long_desc": "Create personalized bedtime stories for your children with AI. Spark imagination and make every night magical with unique tales.", + "moodlit_desc": "Your mood companion", + "moodlit_long_desc": "Track and understand your emotions with AI-powered insights. Build emotional awareness and improve your mental wellbeing.", + "manacore_desc": "AI productivity suite", + "manacore_long_desc": "The central hub for all Manacore apps. Manage your subscriptions, sync data, and access powerful AI tools from one place.", + "coming_soon": "Coming Soon", + "download": "Download", + "get_started": "Get Started", + "status_published": "Published", + "status_beta": "Beta", + "status_development": "In Development", + "status_planning": "Planned" + }, + "theme": { + "toggle": "Toggle Theme", + "light_mode": "Light Mode", + "dark_mode": "Dark Mode", + "switch_to_light": "Switch to light mode", + "switch_to_dark": "Switch to dark mode" + }, + "errors": { + "unexpected": "An unexpected error occurred.", + "network": "Network error. Please check your internet connection.", + "not_found": "Not found.", + "unauthorized": "Unauthorized.", + "forbidden": "Access denied.", + "server_error": "Server error. Please try again later." + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/memoro/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/es.json new file mode 100644 index 000000000..c13aead96 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/es.json @@ -0,0 +1,319 @@ +{ + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "share": "Compartir", + "back": "Volver", + "next": "Siguiente", + "done": "Hecho", + "loading": "Cargando...", + "search": "Buscar", + "settings": "Ajustes", + "yes": "Sí", + "no": "No", + "ok": "OK", + "error": "Error", + "success": "Éxito", + "create": "Crear", + "confirm": "Confirmar", + "close": "Cerrar", + "or": "O" + }, + "nav": { + "dashboard": "Tablero", + "tags": "Etiquetas", + "spaces": "Espacios", + "mana": "Mana", + "blueprints": "Plantillas", + "statistics": "Estadísticas", + "settings": "Ajustes", + "logout": "Cerrar sesión", + "expand": "Expandir", + "minimize": "Minimizar", + "shortcuts": "Atajos" + }, + "auth": { + "welcome": "Bienvenido a Memoro", + "get_started": "Comenzar", + "create_account": "Crear cuenta", + "sign_in": "Iniciar sesión", + "sign_in_with_email": "Iniciar sesión con correo", + "sign_up_with_email": "Registrarse con correo", + "email": "Correo electrónico", + "password": "Contraseña", + "confirm_password": "Confirmar contraseña", + "forgot_password": "¿Olvidó su contraseña?", + "reset_password": "Restablecer contraseña", + "logging_in": "Iniciando sesión...", + "creating_account": "Creando cuenta...", + "sending": "Enviando...", + "error_email_required": "Por favor, introduzca su dirección de correo electrónico", + "error_password_required": "Por favor, introduzca su contraseña", + "error_confirm_password": "Por favor, confirme su contraseña", + "error_passwords_not_match": "Las contraseñas no coinciden", + "error_password_too_short": "La contraseña debe tener al menos 8 caracteres", + "error_password_requirements": "La contraseña debe contener al menos una letra minúscula, una letra mayúscula, un dígito y un carácter especial", + "error_registration_failed": "Error en el registro", + "password_requirement": "La contraseña debe tener al menos 8 caracteres y contener al menos una letra minúscula, una letra mayúscula, un dígito y un carácter especial.", + "registration_success": "¡Registro exitoso! Revise su correo electrónico para confirmar su cuenta.", + "check_email_confirmation": "Por favor, revise su correo electrónico para confirmar su cuenta.", + "reset_email_sent": "Introduzca su dirección de correo electrónico y le enviaremos un enlace para restablecer su contraseña.", + "email_only_title": "¿Por qué solo autenticación por correo?", + "email_only_info": "Solo admitimos el registro por correo electrónico para garantizar su independencia y privacidad.", + "email_only_learn_more": "Más información", + "email_only_intro": "Creemos en darle control total sobre su cuenta y datos. Al usar autenticación por correo electrónico, garantizamos:", + "email_only_benefit_1_title": "Sin dependencia de proveedores", + "email_only_benefit_1_desc": "No depende de servicios de terceros como Google o Apple. Su cuenta funciona de forma independiente.", + "email_only_benefit_2_title": "Privacidad mejorada", + "email_only_benefit_2_desc": "No compartimos sus datos con Google, Apple ni ningún otro tercero para la autenticación.", + "email_only_benefit_3_title": "Portabilidad de la cuenta", + "email_only_benefit_3_desc": "Su dirección de correo electrónico es portátil y funciona en todos los dispositivos y plataformas.", + "email_only_benefit_4_title": "Comunicación directa", + "email_only_benefit_4_desc": "Podemos contactarle directamente para actualizaciones importantes sin depender de sistemas de notificación de terceros.", + "email_only_modal_footer": "Nos comprometemos a crear herramientas que respeten su libertad y privacidad. La autenticación por correo electrónico es parte de ese compromiso.", + "got_it": "Entendido", + "already_have_account": "¿Ya tiene una cuenta?", + "dont_have_account": "¿No tiene una cuenta?", + "terms_agreement": "Al usar Memoro, acepta nuestros Términos y nuestra Política de privacidad.", + "mana_login": "Mana Login", + "mana_login_description": "Un login para todas las apps de Mana", + "mana_login_benefit_0": "Usa suscripciones de Mana en todas las apps - paga una vez y úsalo todo", + "back": "Volver", + "reset_password_description": "Introduzca su dirección de correo electrónico y le enviaremos un enlace para restablecer su contraseña.", + "reset_password_error": "Error al restablecer la contraseña", + "reset_password_success": "¡Correo enviado!", + "reset_password_rate_limit": "Demasiados intentos. Por favor, espere unos minutos.", + "reset_email_sent_description": "Hemos enviado un correo con instrucciones para restablecer su contraseña a {email}. Por favor, revise su bandeja de entrada y carpeta de spam.", + "back_to_login": "Volver al login", + "resend_email": "Reenviar correo", + "reset_email_sent_title": "¡Correo enviado!", + "terms_agreement_conjunction": "y la", + "terms_agreement_suffix": ".", + "oauth_error_access_denied": "Acceso denegado. El inicio de sesión fue cancelado.", + "oauth_error_server_error": "Error del servidor durante la autenticación. Por favor, inténtelo de nuevo.", + "oauth_error_temporarily_unavailable": "El servicio de autenticación no está disponible temporalmente. Por favor, inténtelo más tarde.", + "oauth_error_invalid_request": "Solicitud inválida. Por favor, inténtelo de nuevo.", + "oauth_error_unauthorized_client": "Cliente no autorizado. Por favor, contacte con soporte.", + "oauth_error_unsupported_response_type": "Tipo de respuesta no soportado. Por favor, contacte con soporte.", + "oauth_error_invalid_scope": "Alcance inválido. Por favor, contacte con soporte.", + "oauth_error_unknown": "Ha ocurrido un error desconocido. Por favor, inténtelo de nuevo.", + "password_requirements_title": "Requisitos de contraseña:", + "password_requirement_length": "Al menos 8 caracteres", + "password_requirement_lowercase": "Una letra minúscula", + "password_requirement_uppercase": "Una letra mayúscula", + "password_requirement_digit": "Un dígito", + "password_requirement_special": "Un carácter especial" + }, + "dashboard": { + "title": "Tablero", + "recent_memos": "Memos recientes", + "no_memos": "No se encontraron memos", + "create_memo": "Crear memo", + "search_placeholder": "Buscar memos..." + }, + "memo": { + "title": "Memo", + "unnamed": "Memo sin nombre", + "word_count": "{{count}} palabra", + "word_count_plural": "{{count}} palabras", + "delete_confirmation": "¿Realmente desea eliminar este memo? Esta acción no se puede deshacer.", + "delete_permanently": "Eliminar permanentemente", + "deleting": "Eliminando...", + "pin": "Fijar", + "unpin": "Desfijar", + "share": "Compartir", + "edit": "Editar", + "translate": "Traducir", + "create_memory": "Crear Memory", + "ask_question": "Hacer pregunta", + "copy_transcript": "Copiar transcripción", + "replace_word": "Reemplazar palabra", + "reprocess": "Reprocesar", + "label_speakers": "Etiquetar oradores", + "add_photos": "Añadir fotos", + "manage_spaces": "Gestionar espacios", + "tags": "Etiquetas", + "add_tag": "Añadir etiqueta", + "options": "Opciones", + "search": "Buscar", + "copy": "Copiar", + "speakers": "Oradores", + "find_replace": "Buscar y reemplazar", + "shortcuts": "Atajos", + "no_memo_selected": "Ningún memo seleccionado", + "select_memo_hint": "Seleccione un memo de la lista o cree una nueva grabación", + "processing_transcript": "Transcripción en proceso...", + "ask_question_placeholder": "Haga una pregunta sobre este memo...", + "open_in_new_tab": "Abrir en nueva pestaña", + "edit_title": "Editar título", + "export_text": "Exportar como texto", + "enter_new_title": "Introduzca nuevo título:", + "no_title": "Sin título", + "no_transcript": "No hay transcripción disponible", + "link_copied": "¡Enlace copiado al portapapeles!", + "transcript_copied": "¡Transcripción copiada al portapapeles!", + "no_search_results": "Sin resultados de búsqueda", + "no_memos_with_search": "No se encontraron memos que contengan \"{query}\".", + "clear_search": "Limpiar búsqueda", + "no_memos_with_tag": "No hay memos con esta etiqueta", + "no_memos_with_tag_hint": "Aún no hay memos con esta etiqueta.", + "show_all_memos": "Mostrar todos los memos", + "no_memos_yet": "Aún no hay memos", + "no_memos_hint": "Ve a la página de grabación para crear tu primer memo", + "search_placeholder": "Buscar memos...", + "delete_memo_title": "Eliminar memo", + "delete_memo_confirm": "¿Realmente desea eliminar \"{title}\"?", + "delete_memo_warning": "Esta acción no se puede deshacer. El memo y todos los datos asociados se eliminarán permanentemente.", + "error_user_not_authenticated": "Usuario no autenticado", + "error_loading_memos": "No se pudieron cargar los memos", + "error_deleting_memo": "Error al eliminar el memo. Por favor, inténtelo de nuevo.", + "error_updating_title": "Error al actualizar el título. Por favor, inténtelo de nuevo.", + "error_copying_link": "Error al copiar el enlace. Por favor, inténtelo de nuevo.", + "error_pin_status": "Error al cambiar el estado de fijado. Por favor, inténtelo de nuevo.", + "error_saving": "Error al guardar. Por favor, inténtelo de nuevo.", + "error_copying_transcript": "Error al copiar la transcripción. Por favor, inténtelo de nuevo.", + "error_updating_tags": "Error al actualizar las etiquetas. Por favor, inténtelo de nuevo.", + "error_creating_tag": "Error al crear la etiqueta. Por favor, inténtelo de nuevo.", + "error_asking_question": "Error al procesar la pregunta. Por favor, inténtelo de nuevo.", + "retry": "Reintentar", + "export_title": "Título", + "export_date": "Fecha", + "export_duration": "Duración", + "export_transcript": "Transcripción", + "export_no_transcript": "No hay transcripción disponible", + "export_ai_analysis": "Análisis de IA" + }, + "tags": { + "title": "Etiquetas", + "create_tag": "Crear etiqueta", + "search_placeholder": "Buscar etiquetas...", + "no_tags": "No se encontraron etiquetas", + "delete_confirmation": "¿Realmente desea eliminar la etiqueta \"{{name}}\"?", + "tag_name": "Nombre de etiqueta", + "tag_color": "Color de etiqueta" + }, + "spaces": { + "title": "Espacios", + "create_space": "Crear espacio", + "no_spaces": "No se encontraron espacios", + "members": "Miembros", + "invite": "Invitar" + }, + "blueprints": { + "title": "Plantillas", + "loading": "Cargando plantillas...", + "no_blueprints": "No se encontraron plantillas", + "search_placeholder": "Buscar plantillas...", + "all_categories": "Todas", + "standard": "Estándar", + "manage": "Gestionar plantillas", + "activate": "Activar plantilla", + "load_error": "No se pudieron cargar las plantillas.", + "previous_tip": "Consejo anterior", + "next_tip": "Siguiente consejo", + "go_to_tip": "Ir al consejo {index}" + }, + "record": { + "title": "Grabar - Memoro", + "instruction": "Mantén presionado para grabar", + "uploading": "Subiendo...", + "user_not_authenticated": "Usuario no autenticado", + "upload_failed": "Error en la subida", + "network_error": "Error de red: Por favor, verifica tu conexión e inténtalo de nuevo.", + "upload_error": "Error al subir la grabación: {error}", + "unexpected_error": "Ha ocurrido un error inesperado. Por favor, inténtalo de nuevo.", + "cancel_title": "Eliminar grabación", + "cancel_message": "¿Realmente deseas eliminar la grabación actual? Esta acción no se puede deshacer.", + "cancel_confirm": "Eliminar", + "cancel_abort": "No eliminar", + "pause": "Pausar", + "resume": "Continuar", + "cancel": "Cancelar grabación" + }, + "statistics": { + "title": "Estadísticas", + "today": "Hoy", + "last_30_days": "Últimos 30 días", + "total": "Total", + "memos": "Memos", + "words": "Palabras", + "recording_duration": "Duración de grabación", + "loading": "Cargando estadísticas..." + }, + "subscription": { + "title": "Comprar Mana", + "current_plan": "Plan actual", + "your_mana": "Tu Mana", + "buy": "Comprar", + "popular": "Popular", + "legacy_plan": "Plan antiguo", + "monthly": "Mensual", + "yearly": "Anual" + }, + "settings": { + "title": "Ajustes", + "appearance": "Apariencia", + "theme": "Tema", + "system": "Sistema", + "light": "Claro", + "dark": "Oscuro", + "language": "Idioma", + "user_interface": "Interfaz de usuario", + "show_language_button": "Mostrar botón de idioma", + "show_recording_instruction": "Mostrar instrucciones de grabación", + "show_blueprints": "Mostrar plantillas", + "show_mana_badge": "Mostrar insignia de Mana en el encabezado", + "data_privacy": "Datos y privacidad", + "save_location": "Guardar ubicación", + "enable_analytics": "Habilitar análisis", + "support": "Soporte", + "contact_support": "Contactar soporte", + "rate_app": "Calificar app", + "account": "Cuenta", + "email_label": "Dirección de correo", + "sign_out": "Cerrar sesión", + "delete_account": "Eliminar cuenta", + "app_info": "Información de la app", + "version": "Versión", + "platform": "Plataforma", + "build": "Build", + "browser": "Navegador", + "copyright": "© 2025 Memoro GmbH", + "made_with_love": "Made with ❤️ in Germany" + }, + "app_slider": { + "title": "Más aplicaciones Manacore", + "memoro_desc": "Memos de voz impulsados por IA", + "memoro_long_desc": "Transforma tu voz en información organizada y accionable con transcripción y análisis impulsados por IA. Perfecto para capturar ideas sobre la marcha.", + "maerchenzauber_desc": "Cuentos mágicos para dormir", + "maerchenzauber_long_desc": "Crea cuentos personalizados para dormir para tus hijos con IA. Enciende la imaginación y haz cada noche mágica con historias únicas.", + "moodlit_desc": "Tu compañero de ánimo", + "moodlit_long_desc": "Rastrea y comprende tus emociones con análisis impulsados por IA. Construye conciencia emocional y mejora tu bienestar mental.", + "manacore_desc": "Suite de productividad IA", + "manacore_long_desc": "El centro para todas las apps de Manacore. Gestiona tus suscripciones, sincroniza datos y accede a herramientas de IA desde un solo lugar.", + "coming_soon": "Próximamente", + "download": "Descargar", + "get_started": "Comenzar", + "status_published": "Publicado", + "status_beta": "Beta", + "status_development": "En desarrollo", + "status_planning": "Planificado" + }, + "theme": { + "toggle": "Cambiar tema", + "light_mode": "Modo claro", + "dark_mode": "Modo oscuro", + "switch_to_light": "Cambiar a modo claro", + "switch_to_dark": "Cambiar a modo oscuro" + }, + "errors": { + "unexpected": "Ha ocurrido un error inesperado.", + "network": "Error de red. Verifique su conexión a Internet.", + "not_found": "No encontrado.", + "unauthorized": "No autorizado.", + "forbidden": "Acceso denegado.", + "server_error": "Error del servidor. Inténtelo de nuevo más tarde." + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/memoro/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/fr.json new file mode 100644 index 000000000..fa073249c --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/fr.json @@ -0,0 +1,319 @@ +{ + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "share": "Partager", + "back": "Retour", + "next": "Suivant", + "done": "Terminé", + "loading": "Chargement...", + "search": "Rechercher", + "settings": "Paramètres", + "yes": "Oui", + "no": "Non", + "ok": "OK", + "error": "Erreur", + "success": "Succès", + "create": "Créer", + "confirm": "Confirmer", + "close": "Fermer", + "or": "OU" + }, + "nav": { + "dashboard": "Tableau de bord", + "tags": "Tags", + "spaces": "Espaces", + "mana": "Mana", + "blueprints": "Modèles", + "statistics": "Statistiques", + "settings": "Paramètres", + "logout": "Déconnexion", + "expand": "Agrandir", + "minimize": "Réduire", + "shortcuts": "Raccourcis" + }, + "auth": { + "welcome": "Bienvenue sur Memoro", + "get_started": "Commencer", + "create_account": "Créer un compte", + "sign_in": "Connexion", + "sign_in_with_email": "Se connecter avec l'email", + "sign_up_with_email": "S'inscrire avec l'email", + "email": "Email", + "password": "Mot de passe", + "confirm_password": "Confirmer le mot de passe", + "forgot_password": "Mot de passe oublié ?", + "reset_password": "Réinitialiser le mot de passe", + "logging_in": "Connexion en cours...", + "creating_account": "Création du compte...", + "sending": "Envoi en cours...", + "error_email_required": "Veuillez entrer votre adresse email", + "error_password_required": "Veuillez entrer votre mot de passe", + "error_confirm_password": "Veuillez confirmer votre mot de passe", + "error_passwords_not_match": "Les mots de passe ne correspondent pas", + "error_password_too_short": "Le mot de passe doit contenir au moins 8 caractères", + "error_password_requirements": "Le mot de passe doit contenir au moins une lettre minuscule, une lettre majuscule, un chiffre et un caractère spécial", + "error_registration_failed": "Échec de l'inscription", + "password_requirement": "Le mot de passe doit contenir au moins 8 caractères et inclure au moins une lettre minuscule, une lettre majuscule, un chiffre et un caractère spécial.", + "registration_success": "Inscription réussie ! Vérifiez votre email pour confirmer votre compte.", + "check_email_confirmation": "Veuillez vérifier votre email pour confirmer votre compte.", + "reset_email_sent": "Entrez votre adresse email et nous vous enverrons un lien pour réinitialiser votre mot de passe.", + "email_only_title": "Pourquoi uniquement l'authentification par email ?", + "email_only_info": "Nous ne prenons en charge que l'inscription par email pour garantir votre indépendance et votre confidentialité.", + "email_only_learn_more": "En savoir plus", + "email_only_intro": "Nous croyons en vous donnant le contrôle total sur votre compte et vos données. En utilisant l'authentification par email, nous garantissons :", + "email_only_benefit_1_title": "Pas de dépendance aux fournisseurs", + "email_only_benefit_1_desc": "Vous n'êtes pas dépendant de services tiers comme Google ou Apple. Votre compte fonctionne de manière indépendante.", + "email_only_benefit_2_title": "Confidentialité renforcée", + "email_only_benefit_2_desc": "Nous ne partageons pas vos données avec Google, Apple ou d'autres tiers pour l'authentification.", + "email_only_benefit_3_title": "Portabilité du compte", + "email_only_benefit_3_desc": "Votre adresse email est portable et fonctionne sur tous les appareils et plateformes.", + "email_only_benefit_4_title": "Communication directe", + "email_only_benefit_4_desc": "Nous pouvons vous contacter directement pour des mises à jour importantes sans dépendre de systèmes de notification tiers.", + "email_only_modal_footer": "Nous nous engageons à créer des outils qui respectent votre liberté et votre confidentialité. L'authentification par email fait partie de cet engagement.", + "got_it": "Compris", + "already_have_account": "Vous avez déjà un compte ?", + "dont_have_account": "Pas encore de compte ?", + "terms_agreement": "En utilisant Memoro, vous acceptez nos Conditions et notre Politique de confidentialité.", + "mana_login": "Mana Login", + "mana_login_description": "Une connexion pour toutes les applications Mana", + "mana_login_benefit_0": "Utilisez les abonnements Mana dans toutes les applications - payez une fois et utilisez tout", + "back": "Retour", + "reset_password_description": "Entrez votre adresse email et nous vous enverrons un lien pour réinitialiser votre mot de passe.", + "reset_password_error": "Échec de la réinitialisation du mot de passe", + "reset_password_success": "Email envoyé !", + "reset_password_rate_limit": "Trop de tentatives. Veuillez patienter quelques minutes.", + "reset_email_sent_description": "Nous avons envoyé un email avec des instructions pour réinitialiser votre mot de passe à {email}. Veuillez vérifier votre boîte de réception et votre dossier spam.", + "back_to_login": "Retour à la connexion", + "resend_email": "Renvoyer l'email", + "reset_email_sent_title": "Email envoyé !", + "terms_agreement_conjunction": "et la", + "terms_agreement_suffix": ".", + "oauth_error_access_denied": "Accès refusé. La connexion a été annulée.", + "oauth_error_server_error": "Erreur serveur lors de l'authentification. Veuillez réessayer.", + "oauth_error_temporarily_unavailable": "Le service d'authentification est temporairement indisponible. Veuillez réessayer plus tard.", + "oauth_error_invalid_request": "Requête invalide. Veuillez réessayer.", + "oauth_error_unauthorized_client": "Client non autorisé. Veuillez contacter le support.", + "oauth_error_unsupported_response_type": "Type de réponse non supporté. Veuillez contacter le support.", + "oauth_error_invalid_scope": "Portée invalide. Veuillez contacter le support.", + "oauth_error_unknown": "Une erreur inconnue s'est produite. Veuillez réessayer.", + "password_requirements_title": "Exigences du mot de passe :", + "password_requirement_length": "Au moins 8 caractères", + "password_requirement_lowercase": "Une lettre minuscule", + "password_requirement_uppercase": "Une lettre majuscule", + "password_requirement_digit": "Un chiffre", + "password_requirement_special": "Un caractère spécial" + }, + "dashboard": { + "title": "Tableau de bord", + "recent_memos": "Mémos récents", + "no_memos": "Aucun mémo trouvé", + "create_memo": "Créer un mémo", + "search_placeholder": "Rechercher des mémos..." + }, + "memo": { + "title": "Mémo", + "unnamed": "Mémo sans nom", + "word_count": "{{count}} mot", + "word_count_plural": "{{count}} mots", + "delete_confirmation": "Voulez-vous vraiment supprimer ce mémo ? Cette action ne peut pas être annulée.", + "delete_permanently": "Supprimer définitivement", + "deleting": "Suppression...", + "pin": "Épingler", + "unpin": "Désépingler", + "share": "Partager", + "edit": "Modifier", + "translate": "Traduire", + "create_memory": "Créer une Memory", + "ask_question": "Poser une question", + "copy_transcript": "Copier la transcription", + "replace_word": "Remplacer un mot", + "reprocess": "Retraiter", + "label_speakers": "Nommer les intervenants", + "add_photos": "Ajouter des photos", + "manage_spaces": "Gérer les espaces", + "tags": "Tags", + "add_tag": "Ajouter un tag", + "options": "Options", + "search": "Rechercher", + "copy": "Copier", + "speakers": "Intervenants", + "find_replace": "Rechercher et remplacer", + "shortcuts": "Raccourcis", + "no_memo_selected": "Aucun mémo sélectionné", + "select_memo_hint": "Sélectionnez un mémo dans la liste ou créez un nouvel enregistrement", + "processing_transcript": "Transcription en cours...", + "ask_question_placeholder": "Posez une question sur ce mémo...", + "open_in_new_tab": "Ouvrir dans un nouvel onglet", + "edit_title": "Modifier le titre", + "export_text": "Exporter en texte", + "enter_new_title": "Entrez le nouveau titre :", + "no_title": "Sans titre", + "no_transcript": "Aucune transcription disponible", + "link_copied": "Lien copié dans le presse-papiers !", + "transcript_copied": "Transcription copiée dans le presse-papiers !", + "no_search_results": "Aucun résultat de recherche", + "no_memos_with_search": "Aucun mémo contenant \"{query}\" n'a été trouvé.", + "clear_search": "Effacer la recherche", + "no_memos_with_tag": "Aucun mémo avec ce tag", + "no_memos_with_tag_hint": "Il n'y a pas encore de mémos avec ce tag.", + "show_all_memos": "Afficher tous les mémos", + "no_memos_yet": "Pas encore de mémos", + "no_memos_hint": "Allez à la page d'enregistrement pour créer votre premier mémo", + "search_placeholder": "Rechercher des mémos...", + "delete_memo_title": "Supprimer le mémo", + "delete_memo_confirm": "Voulez-vous vraiment supprimer \"{title}\" ?", + "delete_memo_warning": "Cette action ne peut pas être annulée. Le mémo et toutes les données associées seront supprimés définitivement.", + "error_user_not_authenticated": "Utilisateur non authentifié", + "error_loading_memos": "Impossible de charger les mémos", + "error_deleting_memo": "Erreur lors de la suppression du mémo. Veuillez réessayer.", + "error_updating_title": "Erreur lors de la mise à jour du titre. Veuillez réessayer.", + "error_copying_link": "Erreur lors de la copie du lien. Veuillez réessayer.", + "error_pin_status": "Erreur lors du changement du statut d'épinglage. Veuillez réessayer.", + "error_saving": "Erreur lors de l'enregistrement. Veuillez réessayer.", + "error_copying_transcript": "Erreur lors de la copie de la transcription. Veuillez réessayer.", + "error_updating_tags": "Erreur lors de la mise à jour des tags. Veuillez réessayer.", + "error_creating_tag": "Erreur lors de la création du tag. Veuillez réessayer.", + "error_asking_question": "Erreur lors du traitement de la question. Veuillez réessayer.", + "retry": "Réessayer", + "export_title": "Titre", + "export_date": "Date", + "export_duration": "Durée", + "export_transcript": "Transcription", + "export_no_transcript": "Aucune transcription disponible", + "export_ai_analysis": "Analyse IA" + }, + "tags": { + "title": "Tags", + "create_tag": "Créer un tag", + "search_placeholder": "Rechercher des tags...", + "no_tags": "Aucun tag trouvé", + "delete_confirmation": "Voulez-vous vraiment supprimer le tag \"{{name}}\" ?", + "tag_name": "Nom du tag", + "tag_color": "Couleur du tag" + }, + "spaces": { + "title": "Espaces", + "create_space": "Créer un espace", + "no_spaces": "Aucun espace trouvé", + "members": "Membres", + "invite": "Inviter" + }, + "blueprints": { + "title": "Modèles", + "loading": "Chargement des modèles...", + "no_blueprints": "Aucun modèle trouvé", + "search_placeholder": "Rechercher des modèles...", + "all_categories": "Tous", + "standard": "Standard", + "manage": "Gérer les modèles", + "activate": "Activer le modèle", + "load_error": "Impossible de charger les modèles.", + "previous_tip": "Conseil précédent", + "next_tip": "Conseil suivant", + "go_to_tip": "Aller au conseil {index}" + }, + "record": { + "title": "Enregistrer - Memoro", + "instruction": "Maintenez pour enregistrer", + "uploading": "Téléchargement...", + "user_not_authenticated": "Utilisateur non authentifié", + "upload_failed": "Échec du téléchargement", + "network_error": "Erreur réseau : Veuillez vérifier votre connexion et réessayer.", + "upload_error": "Erreur lors du téléchargement de l'enregistrement : {error}", + "unexpected_error": "Une erreur inattendue s'est produite. Veuillez réessayer.", + "cancel_title": "Supprimer l'enregistrement", + "cancel_message": "Voulez-vous vraiment supprimer l'enregistrement actuel ? Cette action ne peut pas être annulée.", + "cancel_confirm": "Supprimer", + "cancel_abort": "Ne pas supprimer", + "pause": "Pause", + "resume": "Reprendre", + "cancel": "Annuler l'enregistrement" + }, + "statistics": { + "title": "Statistiques", + "today": "Aujourd'hui", + "last_30_days": "30 derniers jours", + "total": "Total", + "memos": "Mémos", + "words": "Mots", + "recording_duration": "Durée d'enregistrement", + "loading": "Chargement des statistiques..." + }, + "subscription": { + "title": "Acheter du Mana", + "current_plan": "Plan actuel", + "your_mana": "Votre Mana", + "buy": "Acheter", + "popular": "Populaire", + "legacy_plan": "Plan ancien", + "monthly": "Mensuel", + "yearly": "Annuel" + }, + "settings": { + "title": "Paramètres", + "appearance": "Apparence", + "theme": "Thème", + "system": "Système", + "light": "Clair", + "dark": "Sombre", + "language": "Langue", + "user_interface": "Interface utilisateur", + "show_language_button": "Afficher le bouton de langue", + "show_recording_instruction": "Afficher les instructions d'enregistrement", + "show_blueprints": "Afficher les modèles", + "show_mana_badge": "Afficher le badge Mana dans l'en-tête", + "data_privacy": "Données et confidentialité", + "save_location": "Enregistrer la position", + "enable_analytics": "Activer les analyses", + "support": "Support", + "contact_support": "Contacter le support", + "rate_app": "Évaluer l'application", + "account": "Compte", + "email_label": "Adresse email", + "sign_out": "Déconnexion", + "delete_account": "Supprimer le compte", + "app_info": "Informations de l'application", + "version": "Version", + "platform": "Plateforme", + "build": "Build", + "browser": "Navigateur", + "copyright": "© 2025 Memoro GmbH", + "made_with_love": "Made with ❤️ in Germany" + }, + "app_slider": { + "title": "Plus d'applications Manacore", + "memoro_desc": "Mémos vocaux alimentés par l'IA", + "memoro_long_desc": "Transformez votre voix en informations organisées et exploitables grâce à la transcription et à l'analyse alimentées par l'IA. Parfait pour capturer des idées en déplacement.", + "maerchenzauber_desc": "Histoires magiques pour s'endormir", + "maerchenzauber_long_desc": "Créez des histoires personnalisées pour endormir vos enfants avec l'IA. Enflammez l'imagination et rendez chaque nuit magique avec des contes uniques.", + "moodlit_desc": "Votre compagnon d'humeur", + "moodlit_long_desc": "Suivez et comprenez vos émotions avec des analyses alimentées par l'IA. Développez la conscience émotionnelle et améliorez votre bien-être mental.", + "manacore_desc": "Suite de productivité IA", + "manacore_long_desc": "Le hub central pour toutes les applications Manacore. Gérez vos abonnements, synchronisez les données et accédez à des outils d'IA puissants depuis un seul endroit.", + "coming_soon": "Prochainement", + "download": "Télécharger", + "get_started": "Commencer", + "status_published": "Publié", + "status_beta": "Bêta", + "status_development": "En développement", + "status_planning": "Planifié" + }, + "theme": { + "toggle": "Changer de thème", + "light_mode": "Mode clair", + "dark_mode": "Mode sombre", + "switch_to_light": "Passer au mode clair", + "switch_to_dark": "Passer au mode sombre" + }, + "errors": { + "unexpected": "Une erreur inattendue s'est produite.", + "network": "Erreur réseau. Veuillez vérifier votre connexion Internet.", + "not_found": "Non trouvé.", + "unauthorized": "Non autorisé.", + "forbidden": "Accès refusé.", + "server_error": "Erreur serveur. Veuillez réessayer plus tard." + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/memoro/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/it.json new file mode 100644 index 000000000..20fe56b25 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/memoro/it.json @@ -0,0 +1,319 @@ +{ + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "share": "Condividi", + "back": "Indietro", + "next": "Avanti", + "done": "Fatto", + "loading": "Caricamento...", + "search": "Cerca", + "settings": "Impostazioni", + "yes": "Sì", + "no": "No", + "ok": "OK", + "error": "Errore", + "success": "Successo", + "create": "Crea", + "confirm": "Conferma", + "close": "Chiudi", + "or": "OPPURE" + }, + "nav": { + "dashboard": "Dashboard", + "tags": "Tag", + "spaces": "Spazi", + "mana": "Mana", + "blueprints": "Modelli", + "statistics": "Statistiche", + "settings": "Impostazioni", + "logout": "Esci", + "expand": "Espandi", + "minimize": "Minimizza", + "shortcuts": "Scorciatoie" + }, + "auth": { + "welcome": "Benvenuto in Memoro", + "get_started": "Inizia", + "create_account": "Crea account", + "sign_in": "Accedi", + "sign_in_with_email": "Accedi con email", + "sign_up_with_email": "Registrati con email", + "email": "Email", + "password": "Password", + "confirm_password": "Conferma password", + "forgot_password": "Password dimenticata?", + "reset_password": "Reimposta password", + "logging_in": "Accesso in corso...", + "creating_account": "Creazione account...", + "sending": "Invio in corso...", + "error_email_required": "Inserisci il tuo indirizzo email", + "error_password_required": "Inserisci la tua password", + "error_confirm_password": "Conferma la tua password", + "error_passwords_not_match": "Le password non corrispondono", + "error_password_too_short": "La password deve essere lunga almeno 8 caratteri", + "error_password_requirements": "La password deve contenere almeno una lettera minuscola, una lettera maiuscola, un numero e un carattere speciale", + "error_registration_failed": "Registrazione fallita", + "password_requirement": "La password deve essere lunga almeno 8 caratteri e contenere almeno una lettera minuscola, una lettera maiuscola, un numero e un carattere speciale.", + "registration_success": "Registrazione completata con successo! Controlla la tua email per confermare il tuo account.", + "check_email_confirmation": "Controlla la tua email per confermare il tuo account.", + "reset_email_sent": "Inserisci il tuo indirizzo email e ti invieremo un link per reimpostare la tua password.", + "email_only_title": "Perché solo autenticazione email?", + "email_only_info": "Supportiamo solo la registrazione via email per garantire la tua indipendenza e privacy.", + "email_only_learn_more": "Scopri di più", + "email_only_intro": "Crediamo nel darti il pieno controllo sul tuo account e sui tuoi dati. Utilizzando l'autenticazione via email, garantiamo:", + "email_only_benefit_1_title": "Nessun vincolo con fornitori", + "email_only_benefit_1_desc": "Non sei dipendente da servizi di terze parti come Google o Apple. Il tuo account funziona in modo indipendente.", + "email_only_benefit_2_title": "Privacy migliorata", + "email_only_benefit_2_desc": "Non condividiamo i tuoi dati con Google, Apple o altre terze parti per l'autenticazione.", + "email_only_benefit_3_title": "Portabilità dell'account", + "email_only_benefit_3_desc": "Il tuo indirizzo email è portabile e funziona su tutti i dispositivi e piattaforme.", + "email_only_benefit_4_title": "Comunicazione diretta", + "email_only_benefit_4_desc": "Possiamo contattarti direttamente per aggiornamenti importanti senza fare affidamento su sistemi di notifica di terze parti.", + "email_only_modal_footer": "Ci impegniamo a costruire strumenti che rispettino la tua libertà e privacy. L'autenticazione via email fa parte di questo impegno.", + "got_it": "Ho capito", + "already_have_account": "Hai già un account?", + "dont_have_account": "Non hai un account?", + "terms_agreement": "Utilizzando Memoro accetti i nostri Termini e la nostra Informativa sulla privacy.", + "mana_login": "Mana Login", + "mana_login_description": "Un login per tutte le app Mana", + "mana_login_benefit_0": "Usa gli abbonamenti Mana in tutte le app - paga una volta e usa tutto", + "back": "Indietro", + "reset_password_description": "Inserisci il tuo indirizzo email e ti invieremo un link per reimpostare la tua password.", + "reset_password_error": "Reimpostazione password fallita", + "reset_password_success": "Email inviata!", + "reset_password_rate_limit": "Troppi tentativi. Attendi qualche minuto.", + "reset_email_sent_description": "Abbiamo inviato un'email con le istruzioni per reimpostare la password a {email}. Controlla la posta in arrivo e la cartella spam.", + "back_to_login": "Torna al login", + "resend_email": "Reinvia email", + "reset_email_sent_title": "Email inviata!", + "terms_agreement_conjunction": "e la", + "terms_agreement_suffix": ".", + "oauth_error_access_denied": "Accesso negato. L'accesso è stato annullato.", + "oauth_error_server_error": "Errore del server durante l'autenticazione. Riprova.", + "oauth_error_temporarily_unavailable": "Il servizio di autenticazione non è temporaneamente disponibile. Riprova più tardi.", + "oauth_error_invalid_request": "Richiesta non valida. Riprova.", + "oauth_error_unauthorized_client": "Client non autorizzato. Contatta il supporto.", + "oauth_error_unsupported_response_type": "Tipo di risposta non supportato. Contatta il supporto.", + "oauth_error_invalid_scope": "Ambito non valido. Contatta il supporto.", + "oauth_error_unknown": "Si è verificato un errore sconosciuto. Riprova.", + "password_requirements_title": "Requisiti password:", + "password_requirement_length": "Almeno 8 caratteri", + "password_requirement_lowercase": "Una lettera minuscola", + "password_requirement_uppercase": "Una lettera maiuscola", + "password_requirement_digit": "Un numero", + "password_requirement_special": "Un carattere speciale" + }, + "dashboard": { + "title": "Dashboard", + "recent_memos": "Memo recenti", + "no_memos": "Nessun memo trovato", + "create_memo": "Crea memo", + "search_placeholder": "Cerca memo..." + }, + "memo": { + "title": "Memo", + "unnamed": "Memo senza nome", + "word_count": "{{count}} parola", + "word_count_plural": "{{count}} parole", + "delete_confirmation": "Vuoi davvero eliminare questo memo? Questa azione non può essere annullata.", + "delete_permanently": "Elimina definitivamente", + "deleting": "Eliminazione...", + "pin": "Fissa", + "unpin": "Sblocca", + "share": "Condividi", + "edit": "Modifica", + "translate": "Traduci", + "create_memory": "Crea Memory", + "ask_question": "Fai una domanda", + "copy_transcript": "Copia trascrizione", + "replace_word": "Sostituisci parola", + "reprocess": "Rielabora", + "label_speakers": "Nomina relatori", + "add_photos": "Aggiungi foto", + "manage_spaces": "Gestisci spazi", + "tags": "Tag", + "add_tag": "Aggiungi tag", + "options": "Opzioni", + "search": "Cerca", + "copy": "Copia", + "speakers": "Relatori", + "find_replace": "Trova e sostituisci", + "shortcuts": "Scorciatoie", + "no_memo_selected": "Nessun memo selezionato", + "select_memo_hint": "Seleziona un memo dalla lista o crea una nuova registrazione", + "processing_transcript": "Trascrizione in corso...", + "ask_question_placeholder": "Fai una domanda su questo memo...", + "open_in_new_tab": "Apri in una nuova scheda", + "edit_title": "Modifica titolo", + "export_text": "Esporta come testo", + "enter_new_title": "Inserisci nuovo titolo:", + "no_title": "Senza titolo", + "no_transcript": "Nessuna trascrizione disponibile", + "link_copied": "Link copiato negli appunti!", + "transcript_copied": "Trascrizione copiata negli appunti!", + "no_search_results": "Nessun risultato di ricerca", + "no_memos_with_search": "Nessun memo trovato contenente \"{query}\".", + "clear_search": "Cancella ricerca", + "no_memos_with_tag": "Nessun memo con questo tag", + "no_memos_with_tag_hint": "Non ci sono ancora memo con questo tag.", + "show_all_memos": "Mostra tutti i memo", + "no_memos_yet": "Ancora nessun memo", + "no_memos_hint": "Vai alla pagina di registrazione per creare il tuo primo memo", + "search_placeholder": "Cerca memo...", + "delete_memo_title": "Elimina memo", + "delete_memo_confirm": "Vuoi davvero eliminare \"{title}\"?", + "delete_memo_warning": "Questa azione non può essere annullata. Il memo e tutti i dati associati verranno eliminati definitivamente.", + "error_user_not_authenticated": "Utente non autenticato", + "error_loading_memos": "Impossibile caricare i memo", + "error_deleting_memo": "Errore durante l'eliminazione del memo. Riprova.", + "error_updating_title": "Errore durante l'aggiornamento del titolo. Riprova.", + "error_copying_link": "Errore durante la copia del link. Riprova.", + "error_pin_status": "Errore durante la modifica dello stato di fissaggio. Riprova.", + "error_saving": "Errore durante il salvataggio. Riprova.", + "error_copying_transcript": "Errore durante la copia della trascrizione. Riprova.", + "error_updating_tags": "Errore durante l'aggiornamento dei tag. Riprova.", + "error_creating_tag": "Errore durante la creazione del tag. Riprova.", + "error_asking_question": "Errore durante l'elaborazione della domanda. Riprova.", + "retry": "Riprova", + "export_title": "Titolo", + "export_date": "Data", + "export_duration": "Durata", + "export_transcript": "Trascrizione", + "export_no_transcript": "Nessuna trascrizione disponibile", + "export_ai_analysis": "Analisi IA" + }, + "tags": { + "title": "Tag", + "create_tag": "Crea tag", + "search_placeholder": "Cerca tag...", + "no_tags": "Nessun tag trovato", + "delete_confirmation": "Vuoi davvero eliminare il tag \"{{name}}\"?", + "tag_name": "Nome tag", + "tag_color": "Colore tag" + }, + "spaces": { + "title": "Spazi", + "create_space": "Crea spazio", + "no_spaces": "Nessuno spazio trovato", + "members": "Membri", + "invite": "Invita" + }, + "blueprints": { + "title": "Modelli", + "loading": "Caricamento modelli...", + "no_blueprints": "Nessun modello trovato", + "search_placeholder": "Cerca modelli...", + "all_categories": "Tutti", + "standard": "Standard", + "manage": "Gestisci modelli", + "activate": "Attiva modello", + "load_error": "Impossibile caricare i modelli.", + "previous_tip": "Consiglio precedente", + "next_tip": "Consiglio successivo", + "go_to_tip": "Vai al consiglio {index}" + }, + "record": { + "title": "Registra - Memoro", + "instruction": "Tieni premuto per registrare", + "uploading": "Caricamento...", + "user_not_authenticated": "Utente non autenticato", + "upload_failed": "Caricamento fallito", + "network_error": "Errore di rete: Verifica la connessione e riprova.", + "upload_error": "Errore durante il caricamento della registrazione: {error}", + "unexpected_error": "Si è verificato un errore imprevisto. Riprova.", + "cancel_title": "Elimina registrazione", + "cancel_message": "Vuoi davvero eliminare la registrazione corrente? Questa azione non può essere annullata.", + "cancel_confirm": "Elimina", + "cancel_abort": "Non eliminare", + "pause": "Pausa", + "resume": "Riprendi", + "cancel": "Annulla registrazione" + }, + "statistics": { + "title": "Statistiche", + "today": "Oggi", + "last_30_days": "Ultimi 30 giorni", + "total": "Totale", + "memos": "Memo", + "words": "Parole", + "recording_duration": "Durata registrazione", + "loading": "Caricamento statistiche..." + }, + "subscription": { + "title": "Acquista Mana", + "current_plan": "Piano attuale", + "your_mana": "Il tuo Mana", + "buy": "Acquista", + "popular": "Popolare", + "legacy_plan": "Piano Legacy", + "monthly": "Mensile", + "yearly": "Annuale" + }, + "settings": { + "title": "Impostazioni", + "appearance": "Aspetto", + "theme": "Tema", + "system": "Sistema", + "light": "Chiaro", + "dark": "Scuro", + "language": "Lingua", + "user_interface": "Interfaccia utente", + "show_language_button": "Mostra pulsante lingua", + "show_recording_instruction": "Mostra istruzioni di registrazione", + "show_blueprints": "Mostra modelli", + "show_mana_badge": "Mostra badge Mana nell'intestazione", + "data_privacy": "Dati e privacy", + "save_location": "Salva posizione", + "enable_analytics": "Abilita analytics", + "support": "Supporto", + "contact_support": "Contatta supporto", + "rate_app": "Valuta app", + "account": "Account", + "email_label": "Indirizzo email", + "sign_out": "Esci", + "delete_account": "Elimina account", + "app_info": "Informazioni app", + "version": "Versione", + "platform": "Piattaforma", + "build": "Build", + "browser": "Browser", + "copyright": "© 2025 Memoro GmbH", + "made_with_love": "Made with ❤️ in Germany" + }, + "app_slider": { + "title": "Altre app Manacore", + "memoro_desc": "Memo vocali alimentati dall'IA", + "memoro_long_desc": "Trasforma la tua voce in informazioni organizzate e utilizzabili con trascrizione e analisi alimentate dall'IA. Perfetto per catturare idee in movimento.", + "maerchenzauber_desc": "Storie magiche della buonanotte", + "maerchenzauber_long_desc": "Crea storie personalizzate per la buonanotte per i tuoi bambini con l'IA. Accendi l'immaginazione e rendi ogni notte magica con racconti unici.", + "moodlit_desc": "Il tuo compagno d'umore", + "moodlit_long_desc": "Traccia e comprendi le tue emozioni con analisi alimentate dall'IA. Costruisci consapevolezza emotiva e migliora il tuo benessere mentale.", + "manacore_desc": "Suite di produttività IA", + "manacore_long_desc": "L'hub centrale per tutte le app Manacore. Gestisci i tuoi abbonamenti, sincronizza i dati e accedi a potenti strumenti IA da un unico posto.", + "coming_soon": "Prossimamente", + "download": "Scarica", + "get_started": "Inizia", + "status_published": "Pubblicato", + "status_beta": "Beta", + "status_development": "In sviluppo", + "status_planning": "Pianificato" + }, + "theme": { + "toggle": "Cambia tema", + "light_mode": "Modalità chiara", + "dark_mode": "Modalità scura", + "switch_to_light": "Passa alla modalità chiara", + "switch_to_dark": "Passa alla modalità scura" + }, + "errors": { + "unexpected": "Si è verificato un errore imprevisto.", + "network": "Errore di rete. Verifica la tua connessione Internet.", + "not_found": "Non trovato.", + "unauthorized": "Non autorizzato.", + "forbidden": "Accesso negato.", + "server_error": "Errore del server. Riprova più tardi." + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/photos/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/photos/de.json new file mode 100644 index 000000000..6589b0bc3 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/photos/de.json @@ -0,0 +1,131 @@ +{ + "app": { + "name": "Photos", + "tagline": "Alle deine Fotos an einem Ort" + }, + "nav": { + "gallery": "Galerie", + "albums": "Alben", + "favorites": "Favoriten", + "upload": "Hochladen", + "settings": "Einstellungen" + }, + "gallery": { + "title": "Galerie", + "empty": "Keine Fotos gefunden", + "emptyHint": "Lade dein erstes Foto hoch oder verbinde Apps", + "loadMore": "Mehr laden", + "photo": "Foto", + "photos": "Fotos" + }, + "albums": { + "title": "Alben", + "empty": "Keine Alben vorhanden", + "emptyHint": "Erstelle dein erstes Album", + "create": "Album erstellen", + "edit": "Album bearbeiten", + "delete": "Album löschen", + "deleteConfirm": "Möchtest du dieses Album wirklich löschen?", + "name": "Name", + "description": "Beschreibung", + "items": "Fotos" + }, + "favorites": { + "title": "Favoriten", + "empty": "Keine Favoriten", + "emptyHint": "Markiere Fotos als Favorit mit dem Herz-Symbol" + }, + "upload": { + "title": "Hochladen", + "dropzone": "Fotos hierher ziehen oder klicken zum Auswählen", + "uploading": "Wird hochgeladen...", + "success": "Erfolgreich hochgeladen", + "error": "Fehler beim Hochladen", + "selectFiles": "Dateien auswählen" + }, + "photo": { + "details": "Details", + "exif": "EXIF-Daten", + "tags": "Tags", + "addToAlbum": "Zu Album hinzufügen", + "removeFromAlbum": "Aus Album entfernen", + "setCover": "Als Cover setzen", + "download": "Herunterladen", + "delete": "Löschen", + "favorite": "Favorit", + "unfavorite": "Favorit entfernen", + "hideInfo": "Details ausblenden" + }, + "exif": { + "camera": "Kamera", + "lens": "Objektiv", + "focalLength": "Brennweite", + "aperture": "Blende", + "iso": "ISO", + "exposure": "Belichtung", + "date": "Aufnahmedatum", + "location": "Standort", + "dimensions": "Abmessungen" + }, + "tags": { + "title": "Tags", + "create": "Tag erstellen", + "edit": "Tag bearbeiten", + "delete": "Tag löschen", + "name": "Name", + "color": "Farbe", + "noTags": "Keine Tags" + }, + "filters": { + "title": "Filter", + "app": "App", + "allApps": "Alle Apps", + "dateRange": "Zeitraum", + "from": "Von", + "to": "Bis", + "hasLocation": "Mit Standort", + "sortBy": "Sortieren nach", + "date": "Datum", + "size": "Größe", + "sortOrder": "Reihenfolge", + "asc": "Aufsteigend", + "desc": "Absteigend", + "clear": "Filter zurücksetzen" + }, + "settings": { + "title": "Einstellungen", + "theme": "Design", + "language": "Sprache", + "gridSize": "Rastergröße" + }, + "auth": { + "login": "Anmelden", + "logout": "Abmelden", + "email": "E-Mail", + "password": "Passwort", + "signIn": "Einloggen", + "signUp": "Registrieren", + "forgotPassword": "Passwort vergessen?" + }, + "contextMenu": { + "view": "Anzeigen", + "open": "Öffnen", + "toggleFavorite": "Favorit umschalten", + "addToFavorites": "Zu Favoriten hinzufügen", + "removeFromFavorites": "Aus Favoriten entfernen" + }, + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "create": "Erstellen", + "close": "Schließen", + "loading": "Lädt...", + "error": "Fehler", + "success": "Erfolg", + "confirm": "Bestätigen", + "yes": "Ja", + "no": "Nein" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/photos/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/photos/en.json new file mode 100644 index 000000000..7ee5e124d --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/photos/en.json @@ -0,0 +1,131 @@ +{ + "app": { + "name": "Photos", + "tagline": "All your photos in one place" + }, + "nav": { + "gallery": "Gallery", + "albums": "Albums", + "favorites": "Favorites", + "upload": "Upload", + "settings": "Settings" + }, + "gallery": { + "title": "Gallery", + "empty": "No photos found", + "emptyHint": "Upload your first photo or connect apps", + "loadMore": "Load more", + "photo": "photo", + "photos": "photos" + }, + "albums": { + "title": "Albums", + "empty": "No albums yet", + "emptyHint": "Create your first album", + "create": "Create Album", + "edit": "Edit Album", + "delete": "Delete Album", + "deleteConfirm": "Are you sure you want to delete this album?", + "name": "Name", + "description": "Description", + "items": "photos" + }, + "favorites": { + "title": "Favorites", + "empty": "No favorites", + "emptyHint": "Mark photos as favorite with the heart icon" + }, + "upload": { + "title": "Upload", + "dropzone": "Drop photos here or click to select", + "uploading": "Uploading...", + "success": "Upload successful", + "error": "Upload failed", + "selectFiles": "Select files" + }, + "photo": { + "details": "Details", + "exif": "EXIF Data", + "tags": "Tags", + "addToAlbum": "Add to Album", + "removeFromAlbum": "Remove from Album", + "setCover": "Set as Cover", + "download": "Download", + "delete": "Delete", + "favorite": "Favorite", + "unfavorite": "Remove Favorite", + "hideInfo": "Hide details" + }, + "exif": { + "camera": "Camera", + "lens": "Lens", + "focalLength": "Focal Length", + "aperture": "Aperture", + "iso": "ISO", + "exposure": "Exposure", + "date": "Date Taken", + "location": "Location", + "dimensions": "Dimensions" + }, + "tags": { + "title": "Tags", + "create": "Create Tag", + "edit": "Edit Tag", + "delete": "Delete Tag", + "name": "Name", + "color": "Color", + "noTags": "No tags" + }, + "filters": { + "title": "Filters", + "app": "App", + "allApps": "All Apps", + "dateRange": "Date Range", + "from": "From", + "to": "To", + "hasLocation": "With Location", + "sortBy": "Sort by", + "date": "Date", + "size": "Size", + "sortOrder": "Order", + "asc": "Ascending", + "desc": "Descending", + "clear": "Clear Filters" + }, + "settings": { + "title": "Settings", + "theme": "Theme", + "language": "Language", + "gridSize": "Grid Size" + }, + "auth": { + "login": "Login", + "logout": "Logout", + "email": "Email", + "password": "Password", + "signIn": "Sign In", + "signUp": "Sign Up", + "forgotPassword": "Forgot Password?" + }, + "contextMenu": { + "view": "View", + "open": "Open", + "toggleFavorite": "Toggle Favorite", + "addToFavorites": "Add to Favorites", + "removeFromFavorites": "Remove from Favorites" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "create": "Create", + "close": "Close", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "confirm": "Confirm", + "yes": "Yes", + "no": "No" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/photos/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/photos/es.json new file mode 100644 index 000000000..3f772557e --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/photos/es.json @@ -0,0 +1,131 @@ +{ + "app": { + "name": "Photos", + "tagline": "Todas tus fotos en un solo lugar" + }, + "nav": { + "gallery": "Galería", + "albums": "Álbumes", + "favorites": "Favoritos", + "upload": "Subir", + "settings": "Ajustes" + }, + "gallery": { + "title": "Galería", + "empty": "No se encontraron fotos", + "emptyHint": "Sube tu primera foto o conecta apps", + "loadMore": "Cargar más", + "photo": "foto", + "photos": "fotos" + }, + "albums": { + "title": "Álbumes", + "empty": "Aún no hay álbumes", + "emptyHint": "Crea tu primer álbum", + "create": "Crear álbum", + "edit": "Editar álbum", + "delete": "Eliminar álbum", + "deleteConfirm": "¿Seguro que quieres eliminar este álbum?", + "name": "Nombre", + "description": "Descripción", + "items": "fotos" + }, + "favorites": { + "title": "Favoritos", + "empty": "Sin favoritos", + "emptyHint": "Marca fotos como favoritas con el icono de corazón" + }, + "upload": { + "title": "Subir", + "dropzone": "Arrastra fotos aquí o haz clic para seleccionar", + "uploading": "Subiendo...", + "success": "Subida exitosa", + "error": "Error al subir", + "selectFiles": "Seleccionar archivos" + }, + "photo": { + "details": "Detalles", + "exif": "Datos EXIF", + "tags": "Etiquetas", + "addToAlbum": "Agregar a álbum", + "removeFromAlbum": "Quitar de álbum", + "setCover": "Usar como portada", + "download": "Descargar", + "delete": "Eliminar", + "favorite": "Favorito", + "unfavorite": "Quitar favorito", + "hideInfo": "Ocultar detalles" + }, + "exif": { + "camera": "Cámara", + "lens": "Objetivo", + "focalLength": "Distancia focal", + "aperture": "Apertura", + "iso": "ISO", + "exposure": "Exposición", + "date": "Fecha de captura", + "location": "Ubicación", + "dimensions": "Dimensiones" + }, + "tags": { + "title": "Etiquetas", + "create": "Crear etiqueta", + "edit": "Editar etiqueta", + "delete": "Eliminar etiqueta", + "name": "Nombre", + "color": "Color", + "noTags": "Sin etiquetas" + }, + "filters": { + "title": "Filtros", + "app": "App", + "allApps": "Todas las apps", + "dateRange": "Rango de fechas", + "from": "Desde", + "to": "Hasta", + "hasLocation": "Con ubicación", + "sortBy": "Ordenar por", + "date": "Fecha", + "size": "Tamaño", + "sortOrder": "Orden", + "asc": "Ascendente", + "desc": "Descendente", + "clear": "Borrar filtros" + }, + "settings": { + "title": "Ajustes", + "theme": "Tema", + "language": "Idioma", + "gridSize": "Tamaño de cuadrícula" + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "email": "Email", + "password": "Contraseña", + "signIn": "Iniciar sesión", + "signUp": "Registrarse", + "forgotPassword": "¿Olvidaste tu contraseña?" + }, + "contextMenu": { + "view": "Ver", + "open": "Abrir", + "toggleFavorite": "Cambiar favorito", + "addToFavorites": "Agregar a favoritos", + "removeFromFavorites": "Quitar de favoritos" + }, + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "create": "Crear", + "close": "Cerrar", + "loading": "Cargando...", + "error": "Error", + "success": "Correcto", + "confirm": "Confirmar", + "yes": "Sí", + "no": "No" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/photos/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/photos/fr.json new file mode 100644 index 000000000..adf163017 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/photos/fr.json @@ -0,0 +1,131 @@ +{ + "app": { + "name": "Photos", + "tagline": "Toutes tes photos au même endroit" + }, + "nav": { + "gallery": "Galerie", + "albums": "Albums", + "favorites": "Favoris", + "upload": "Télécharger", + "settings": "Paramètres" + }, + "gallery": { + "title": "Galerie", + "empty": "Aucune photo trouvée", + "emptyHint": "Télécharge ta première photo ou connecte des apps", + "loadMore": "Charger plus", + "photo": "photo", + "photos": "photos" + }, + "albums": { + "title": "Albums", + "empty": "Pas encore d'albums", + "emptyHint": "Crée ton premier album", + "create": "Créer un album", + "edit": "Modifier l'album", + "delete": "Supprimer l'album", + "deleteConfirm": "Voulez-vous vraiment supprimer cet album ?", + "name": "Nom", + "description": "Description", + "items": "photos" + }, + "favorites": { + "title": "Favoris", + "empty": "Pas de favoris", + "emptyHint": "Marque des photos comme favorites avec l'icône cœur" + }, + "upload": { + "title": "Télécharger", + "dropzone": "Dépose des photos ici ou clique pour sélectionner", + "uploading": "Téléchargement...", + "success": "Téléchargement réussi", + "error": "Échec du téléchargement", + "selectFiles": "Sélectionner des fichiers" + }, + "photo": { + "details": "Détails", + "exif": "Données EXIF", + "tags": "Tags", + "addToAlbum": "Ajouter à l'album", + "removeFromAlbum": "Retirer de l'album", + "setCover": "Définir comme couverture", + "download": "Télécharger", + "delete": "Supprimer", + "favorite": "Favori", + "unfavorite": "Retirer des favoris", + "hideInfo": "Masquer les détails" + }, + "exif": { + "camera": "Appareil", + "lens": "Objectif", + "focalLength": "Focale", + "aperture": "Ouverture", + "iso": "ISO", + "exposure": "Exposition", + "date": "Date de prise", + "location": "Lieu", + "dimensions": "Dimensions" + }, + "tags": { + "title": "Tags", + "create": "Créer un tag", + "edit": "Modifier le tag", + "delete": "Supprimer le tag", + "name": "Nom", + "color": "Couleur", + "noTags": "Aucun tag" + }, + "filters": { + "title": "Filtres", + "app": "App", + "allApps": "Toutes les apps", + "dateRange": "Période", + "from": "Du", + "to": "Au", + "hasLocation": "Avec localisation", + "sortBy": "Trier par", + "date": "Date", + "size": "Taille", + "sortOrder": "Ordre", + "asc": "Croissant", + "desc": "Décroissant", + "clear": "Effacer les filtres" + }, + "settings": { + "title": "Paramètres", + "theme": "Thème", + "language": "Langue", + "gridSize": "Taille de grille" + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "email": "Email", + "password": "Mot de passe", + "signIn": "Se connecter", + "signUp": "S'inscrire", + "forgotPassword": "Mot de passe oublié ?" + }, + "contextMenu": { + "view": "Voir", + "open": "Ouvrir", + "toggleFavorite": "Basculer favori", + "addToFavorites": "Ajouter aux favoris", + "removeFromFavorites": "Retirer des favoris" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "create": "Créer", + "close": "Fermer", + "loading": "Chargement...", + "error": "Erreur", + "success": "Succès", + "confirm": "Confirmer", + "yes": "Oui", + "no": "Non" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/photos/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/photos/it.json new file mode 100644 index 000000000..40774e244 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/photos/it.json @@ -0,0 +1,131 @@ +{ + "app": { + "name": "Photos", + "tagline": "Tutte le tue foto in un unico posto" + }, + "nav": { + "gallery": "Galleria", + "albums": "Album", + "favorites": "Preferiti", + "upload": "Carica", + "settings": "Impostazioni" + }, + "gallery": { + "title": "Galleria", + "empty": "Nessuna foto trovata", + "emptyHint": "Carica la tua prima foto o collega le app", + "loadMore": "Carica altre", + "photo": "foto", + "photos": "foto" + }, + "albums": { + "title": "Album", + "empty": "Ancora nessun album", + "emptyHint": "Crea il tuo primo album", + "create": "Crea album", + "edit": "Modifica album", + "delete": "Elimina album", + "deleteConfirm": "Vuoi davvero eliminare questo album?", + "name": "Nome", + "description": "Descrizione", + "items": "foto" + }, + "favorites": { + "title": "Preferiti", + "empty": "Nessun preferito", + "emptyHint": "Segna le foto come preferite con l'icona del cuore" + }, + "upload": { + "title": "Carica", + "dropzone": "Trascina le foto qui o clicca per selezionare", + "uploading": "Caricamento...", + "success": "Caricamento riuscito", + "error": "Caricamento fallito", + "selectFiles": "Seleziona file" + }, + "photo": { + "details": "Dettagli", + "exif": "Dati EXIF", + "tags": "Tag", + "addToAlbum": "Aggiungi all'album", + "removeFromAlbum": "Rimuovi dall'album", + "setCover": "Imposta come copertina", + "download": "Scarica", + "delete": "Elimina", + "favorite": "Preferito", + "unfavorite": "Rimuovi preferito", + "hideInfo": "Nascondi dettagli" + }, + "exif": { + "camera": "Fotocamera", + "lens": "Obiettivo", + "focalLength": "Lunghezza focale", + "aperture": "Apertura", + "iso": "ISO", + "exposure": "Esposizione", + "date": "Data di scatto", + "location": "Posizione", + "dimensions": "Dimensioni" + }, + "tags": { + "title": "Tag", + "create": "Crea tag", + "edit": "Modifica tag", + "delete": "Elimina tag", + "name": "Nome", + "color": "Colore", + "noTags": "Nessun tag" + }, + "filters": { + "title": "Filtri", + "app": "App", + "allApps": "Tutte le app", + "dateRange": "Periodo", + "from": "Da", + "to": "A", + "hasLocation": "Con posizione", + "sortBy": "Ordina per", + "date": "Data", + "size": "Dimensione", + "sortOrder": "Ordine", + "asc": "Crescente", + "desc": "Decrescente", + "clear": "Cancella filtri" + }, + "settings": { + "title": "Impostazioni", + "theme": "Tema", + "language": "Lingua", + "gridSize": "Dimensione griglia" + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "email": "Email", + "password": "Password", + "signIn": "Accedi", + "signUp": "Registrati", + "forgotPassword": "Password dimenticata?" + }, + "contextMenu": { + "view": "Visualizza", + "open": "Apri", + "toggleFavorite": "Cambia preferito", + "addToFavorites": "Aggiungi ai preferiti", + "removeFromFavorites": "Rimuovi dai preferiti" + }, + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "create": "Crea", + "close": "Chiudi", + "loading": "Caricamento...", + "error": "Errore", + "success": "Successo", + "confirm": "Conferma", + "yes": "Sì", + "no": "No" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/questions/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/questions/de.json new file mode 100644 index 000000000..2f8bbadc0 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/questions/de.json @@ -0,0 +1,96 @@ +{ + "app": { + "name": "Questions", + "loading": "Laden...", + "tagline": "KI-gestützte Recherche" + }, + "nav": { + "questions": "Fragen", + "collections": "Sammlungen", + "research": "Recherche", + "settings": "Einstellungen" + }, + "question": { + "create": "Frage erstellen", + "edit": "Frage bearbeiten", + "delete": "Frage löschen", + "title": "Frage", + "description": "Beschreibung", + "status": "Status", + "priority": "Priorität", + "noQuestions": "Noch keine Fragen", + "addFirst": "Stelle deine erste Frage" + }, + "status": { + "open": "Offen", + "researching": "Wird recherchiert", + "answered": "Beantwortet", + "archived": "Archiviert" + }, + "priority": { + "low": "Niedrig", + "medium": "Mittel", + "high": "Hoch" + }, + "collection": { + "create": "Sammlung erstellen", + "edit": "Sammlung bearbeiten", + "delete": "Sammlung löschen", + "name": "Name", + "color": "Farbe", + "noCollections": "Keine Sammlungen" + }, + "research": { + "start": "Recherche starten", + "inProgress": "Recherche läuft...", + "depth": "Recherchetiefe", + "quick": "Schnell", + "standard": "Standard", + "deep": "Tiefgehend", + "sources": "Quellen", + "summary": "Zusammenfassung", + "keyPoints": "Kernpunkte", + "followUp": "Weiterführende Fragen" + }, + "answer": { + "create": "Antwort erstellen", + "edit": "Antwort bearbeiten", + "accept": "Antwort akzeptieren", + "rate": "Bewerten", + "noAnswer": "Noch keine Antwort" + }, + "source": { + "view": "Quelle ansehen", + "extract": "Inhalt extrahieren", + "noSources": "Keine Quellen gefunden" + }, + "auth": { + "login": "Anmelden", + "logout": "Abmelden", + "register": "Registrieren" + }, + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "add": "Hinzufügen", + "close": "Schließen", + "search": "Suchen", + "error": "Fehler", + "success": "Erfolgreich", + "loading": "Laden..." + }, + "errors": { + "loadQuestions": "Fragen konnten nicht geladen werden", + "researchFailed": "Recherche fehlgeschlagen", + "saveFailed": "Speichern fehlgeschlagen", + "loadSources": "Quellen konnten nicht geladen werden" + }, + "success": { + "questionCreated": "Frage erstellt", + "questionDeleted": "Frage gelöscht", + "researchStarted": "Recherche gestartet", + "answerAccepted": "Antwort akzeptiert" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/questions/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/questions/en.json new file mode 100644 index 000000000..78e29de13 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/questions/en.json @@ -0,0 +1,96 @@ +{ + "app": { + "name": "Questions", + "loading": "Loading...", + "tagline": "AI-powered research" + }, + "nav": { + "questions": "Questions", + "collections": "Collections", + "research": "Research", + "settings": "Settings" + }, + "question": { + "create": "Create question", + "edit": "Edit question", + "delete": "Delete question", + "title": "Question", + "description": "Description", + "status": "Status", + "priority": "Priority", + "noQuestions": "No questions yet", + "addFirst": "Ask your first question" + }, + "status": { + "open": "Open", + "researching": "Researching", + "answered": "Answered", + "archived": "Archived" + }, + "priority": { + "low": "Low", + "medium": "Medium", + "high": "High" + }, + "collection": { + "create": "Create collection", + "edit": "Edit collection", + "delete": "Delete collection", + "name": "Name", + "color": "Color", + "noCollections": "No collections" + }, + "research": { + "start": "Start research", + "inProgress": "Research in progress...", + "depth": "Research depth", + "quick": "Quick", + "standard": "Standard", + "deep": "Deep", + "sources": "Sources", + "summary": "Summary", + "keyPoints": "Key points", + "followUp": "Follow-up questions" + }, + "answer": { + "create": "Create answer", + "edit": "Edit answer", + "accept": "Accept answer", + "rate": "Rate", + "noAnswer": "No answer yet" + }, + "source": { + "view": "View source", + "extract": "Extract content", + "noSources": "No sources found" + }, + "auth": { + "login": "Login", + "logout": "Logout", + "register": "Register" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "add": "Add", + "close": "Close", + "search": "Search", + "error": "Error", + "success": "Success", + "loading": "Loading..." + }, + "errors": { + "loadQuestions": "Failed to load questions", + "researchFailed": "Research failed", + "saveFailed": "Failed to save", + "loadSources": "Failed to load sources" + }, + "success": { + "questionCreated": "Question created", + "questionDeleted": "Question deleted", + "researchStarted": "Research started", + "answerAccepted": "Answer accepted" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/questions/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/questions/es.json new file mode 100644 index 000000000..49eeaeea7 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/questions/es.json @@ -0,0 +1,96 @@ +{ + "app": { + "name": "Questions", + "loading": "Cargando...", + "tagline": "Investigación con IA" + }, + "nav": { + "questions": "Preguntas", + "collections": "Colecciones", + "research": "Investigación", + "settings": "Ajustes" + }, + "question": { + "create": "Crear pregunta", + "edit": "Editar pregunta", + "delete": "Eliminar pregunta", + "title": "Pregunta", + "description": "Descripción", + "status": "Estado", + "priority": "Prioridad", + "noQuestions": "Aún no hay preguntas", + "addFirst": "Haz tu primera pregunta" + }, + "status": { + "open": "Abierta", + "researching": "Investigando", + "answered": "Respondida", + "archived": "Archivada" + }, + "priority": { + "low": "Baja", + "medium": "Media", + "high": "Alta" + }, + "collection": { + "create": "Crear colección", + "edit": "Editar colección", + "delete": "Eliminar colección", + "name": "Nombre", + "color": "Color", + "noCollections": "Sin colecciones" + }, + "research": { + "start": "Iniciar investigación", + "inProgress": "Investigación en curso...", + "depth": "Profundidad", + "quick": "Rápida", + "standard": "Estándar", + "deep": "Profunda", + "sources": "Fuentes", + "summary": "Resumen", + "keyPoints": "Puntos clave", + "followUp": "Preguntas de seguimiento" + }, + "answer": { + "create": "Crear respuesta", + "edit": "Editar respuesta", + "accept": "Aceptar respuesta", + "rate": "Valorar", + "noAnswer": "Aún sin respuesta" + }, + "source": { + "view": "Ver fuente", + "extract": "Extraer contenido", + "noSources": "No se encontraron fuentes" + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "register": "Registrarse" + }, + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "add": "Agregar", + "close": "Cerrar", + "search": "Buscar", + "error": "Error", + "success": "Correcto", + "loading": "Cargando..." + }, + "errors": { + "loadQuestions": "Error al cargar preguntas", + "researchFailed": "Investigación fallida", + "saveFailed": "Error al guardar", + "loadSources": "Error al cargar fuentes" + }, + "success": { + "questionCreated": "Pregunta creada", + "questionDeleted": "Pregunta eliminada", + "researchStarted": "Investigación iniciada", + "answerAccepted": "Respuesta aceptada" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/questions/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/questions/fr.json new file mode 100644 index 000000000..7079e5678 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/questions/fr.json @@ -0,0 +1,96 @@ +{ + "app": { + "name": "Questions", + "loading": "Chargement...", + "tagline": "Recherche assistée par IA" + }, + "nav": { + "questions": "Questions", + "collections": "Collections", + "research": "Recherche", + "settings": "Paramètres" + }, + "question": { + "create": "Créer une question", + "edit": "Modifier la question", + "delete": "Supprimer la question", + "title": "Question", + "description": "Description", + "status": "Statut", + "priority": "Priorité", + "noQuestions": "Pas encore de questions", + "addFirst": "Pose ta première question" + }, + "status": { + "open": "Ouverte", + "researching": "En recherche", + "answered": "Répondue", + "archived": "Archivée" + }, + "priority": { + "low": "Basse", + "medium": "Moyenne", + "high": "Haute" + }, + "collection": { + "create": "Créer une collection", + "edit": "Modifier la collection", + "delete": "Supprimer la collection", + "name": "Nom", + "color": "Couleur", + "noCollections": "Aucune collection" + }, + "research": { + "start": "Lancer la recherche", + "inProgress": "Recherche en cours...", + "depth": "Profondeur", + "quick": "Rapide", + "standard": "Standard", + "deep": "Approfondie", + "sources": "Sources", + "summary": "Résumé", + "keyPoints": "Points clés", + "followUp": "Questions de suivi" + }, + "answer": { + "create": "Créer une réponse", + "edit": "Modifier la réponse", + "accept": "Accepter la réponse", + "rate": "Noter", + "noAnswer": "Pas encore de réponse" + }, + "source": { + "view": "Voir la source", + "extract": "Extraire le contenu", + "noSources": "Aucune source trouvée" + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "register": "Inscription" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "add": "Ajouter", + "close": "Fermer", + "search": "Rechercher", + "error": "Erreur", + "success": "Succès", + "loading": "Chargement..." + }, + "errors": { + "loadQuestions": "Échec du chargement des questions", + "researchFailed": "Recherche échouée", + "saveFailed": "Échec de la sauvegarde", + "loadSources": "Échec du chargement des sources" + }, + "success": { + "questionCreated": "Question créée", + "questionDeleted": "Question supprimée", + "researchStarted": "Recherche lancée", + "answerAccepted": "Réponse acceptée" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/questions/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/questions/it.json new file mode 100644 index 000000000..29cbc7e1c --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/questions/it.json @@ -0,0 +1,96 @@ +{ + "app": { + "name": "Questions", + "loading": "Caricamento...", + "tagline": "Ricerca con IA" + }, + "nav": { + "questions": "Domande", + "collections": "Collezioni", + "research": "Ricerca", + "settings": "Impostazioni" + }, + "question": { + "create": "Crea domanda", + "edit": "Modifica domanda", + "delete": "Elimina domanda", + "title": "Domanda", + "description": "Descrizione", + "status": "Stato", + "priority": "Priorità", + "noQuestions": "Ancora nessuna domanda", + "addFirst": "Fai la tua prima domanda" + }, + "status": { + "open": "Aperta", + "researching": "In ricerca", + "answered": "Risolta", + "archived": "Archiviata" + }, + "priority": { + "low": "Bassa", + "medium": "Media", + "high": "Alta" + }, + "collection": { + "create": "Crea collezione", + "edit": "Modifica collezione", + "delete": "Elimina collezione", + "name": "Nome", + "color": "Colore", + "noCollections": "Nessuna collezione" + }, + "research": { + "start": "Avvia ricerca", + "inProgress": "Ricerca in corso...", + "depth": "Profondità", + "quick": "Rapida", + "standard": "Standard", + "deep": "Approfondita", + "sources": "Fonti", + "summary": "Riepilogo", + "keyPoints": "Punti chiave", + "followUp": "Domande di approfondimento" + }, + "answer": { + "create": "Crea risposta", + "edit": "Modifica risposta", + "accept": "Accetta risposta", + "rate": "Valuta", + "noAnswer": "Ancora nessuna risposta" + }, + "source": { + "view": "Visualizza fonte", + "extract": "Estrai contenuto", + "noSources": "Nessuna fonte trovata" + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "register": "Registrati" + }, + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "add": "Aggiungi", + "close": "Chiudi", + "search": "Cerca", + "error": "Errore", + "success": "Successo", + "loading": "Caricamento..." + }, + "errors": { + "loadQuestions": "Caricamento domande fallito", + "researchFailed": "Ricerca fallita", + "saveFailed": "Salvataggio fallito", + "loadSources": "Caricamento fonti fallito" + }, + "success": { + "questionCreated": "Domanda creata", + "questionDeleted": "Domanda eliminata", + "researchStarted": "Ricerca avviata", + "answerAccepted": "Risposta accettata" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/de.json new file mode 100644 index 000000000..b42723763 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/de.json @@ -0,0 +1,112 @@ +{ + "app": { + "name": "SkillTree", + "loading": "Laden...", + "tagline": "Level Up Your Life" + }, + "nav": { + "skills": "Skills", + "activities": "Aktivitäten", + "stats": "Statistiken", + "settings": "Einstellungen" + }, + "skill": { + "create": "Skill erstellen", + "edit": "Skill bearbeiten", + "delete": "Skill löschen", + "name": "Name", + "description": "Beschreibung", + "branch": "Kategorie", + "level": "Level", + "xp": "XP", + "totalXp": "Gesamt-XP", + "noSkills": "Noch keine Skills", + "addFirst": "Füge deinen ersten Skill hinzu" + }, + "branch": { + "intellect": "Intellekt", + "body": "Körper", + "creativity": "Kreativität", + "social": "Soziales", + "practical": "Praktisches", + "mindset": "Mindset" + }, + "level": { + "unknown": "Unbekannt", + "beginner": "Anfänger", + "intermediate": "Fortgeschritten", + "competent": "Kompetent", + "expert": "Experte", + "master": "Meister" + }, + "activity": { + "log": "Aktivität loggen", + "recent": "Letzte Aktivitäten", + "xpEarned": "+{xp} XP", + "noActivities": "Noch keine Aktivitäten" + }, + "stats": { + "totalXp": "Gesamt-XP", + "totalSkills": "Skills", + "highestLevel": "Höchstes Level", + "streak": "Streak", + "achievements": "Achievements" + }, + "achievement": { + "title": "Achievements", + "unlocked": "Freigeschaltet", + "locked": "Gesperrt", + "progress": "Fortschritt", + "celebration": "Achievement freigeschaltet!", + "clickToClose": "Klicken zum Schließen", + "noAchievements": "Keine Achievements gefunden", + "showAll": "Alle zeigen", + "showUnlocked": "Nur freigeschaltete", + "all": "Alle", + "rarity": { + "common": "Gewöhnlich", + "uncommon": "Ungewöhnlich", + "rare": "Selten", + "epic": "Episch", + "legendary": "Legendär" + }, + "category": { + "xp": "Erfahrung", + "skills": "Skills", + "levels": "Level", + "activities": "Aktivitäten", + "streak": "Streak", + "branches": "Branches", + "special": "Speziell" + } + }, + "auth": { + "login": "Anmelden", + "logout": "Abmelden", + "register": "Registrieren" + }, + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "add": "Hinzufügen", + "close": "Schließen", + "search": "Suchen", + "error": "Fehler", + "success": "Erfolgreich", + "loading": "Laden..." + }, + "errors": { + "loadSkills": "Skills konnten nicht geladen werden", + "createSkill": "Skill konnte nicht erstellt werden", + "updateSkill": "Skill konnte nicht aktualisiert werden", + "deleteSkill": "Skill konnte nicht gelöscht werden" + }, + "success": { + "skillCreated": "Skill erstellt", + "skillUpdated": "Skill aktualisiert", + "skillDeleted": "Skill gelöscht", + "xpAdded": "XP hinzugefügt" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/en.json new file mode 100644 index 000000000..3b2372476 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/en.json @@ -0,0 +1,112 @@ +{ + "app": { + "name": "SkillTree", + "loading": "Loading...", + "tagline": "Level Up Your Life" + }, + "nav": { + "skills": "Skills", + "activities": "Activities", + "stats": "Statistics", + "settings": "Settings" + }, + "skill": { + "create": "Create skill", + "edit": "Edit skill", + "delete": "Delete skill", + "name": "Name", + "description": "Description", + "branch": "Category", + "level": "Level", + "xp": "XP", + "totalXp": "Total XP", + "noSkills": "No skills yet", + "addFirst": "Add your first skill" + }, + "branch": { + "intellect": "Intellect", + "body": "Body", + "creativity": "Creativity", + "social": "Social", + "practical": "Practical", + "mindset": "Mindset" + }, + "level": { + "unknown": "Unknown", + "beginner": "Beginner", + "intermediate": "Intermediate", + "competent": "Competent", + "expert": "Expert", + "master": "Master" + }, + "activity": { + "log": "Log activity", + "recent": "Recent activities", + "xpEarned": "+{xp} XP", + "noActivities": "No activities yet" + }, + "stats": { + "totalXp": "Total XP", + "totalSkills": "Skills", + "highestLevel": "Highest Level", + "streak": "Streak", + "achievements": "Achievements" + }, + "achievement": { + "title": "Achievements", + "unlocked": "Unlocked", + "locked": "Locked", + "progress": "Progress", + "celebration": "Achievement unlocked!", + "clickToClose": "Click to close", + "noAchievements": "No achievements found", + "showAll": "Show all", + "showUnlocked": "Unlocked only", + "all": "All", + "rarity": { + "common": "Common", + "uncommon": "Uncommon", + "rare": "Rare", + "epic": "Epic", + "legendary": "Legendary" + }, + "category": { + "xp": "Experience", + "skills": "Skills", + "levels": "Level", + "activities": "Activities", + "streak": "Streak", + "branches": "Branches", + "special": "Special" + } + }, + "auth": { + "login": "Login", + "logout": "Logout", + "register": "Register" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "add": "Add", + "close": "Close", + "search": "Search", + "error": "Error", + "success": "Success", + "loading": "Loading..." + }, + "errors": { + "loadSkills": "Failed to load skills", + "createSkill": "Failed to create skill", + "updateSkill": "Failed to update skill", + "deleteSkill": "Failed to delete skill" + }, + "success": { + "skillCreated": "Skill created", + "skillUpdated": "Skill updated", + "skillDeleted": "Skill deleted", + "xpAdded": "XP added" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/es.json new file mode 100644 index 000000000..9d71c96a0 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/es.json @@ -0,0 +1,112 @@ +{ + "app": { + "name": "SkillTree", + "loading": "Cargando...", + "tagline": "Sube de nivel en tu vida" + }, + "nav": { + "skills": "Habilidades", + "activities": "Actividades", + "stats": "Estadísticas", + "settings": "Ajustes" + }, + "skill": { + "create": "Crear habilidad", + "edit": "Editar habilidad", + "delete": "Eliminar habilidad", + "name": "Nombre", + "description": "Descripción", + "branch": "Categoría", + "level": "Nivel", + "xp": "XP", + "totalXp": "XP total", + "noSkills": "Aún no hay habilidades", + "addFirst": "Agrega tu primera habilidad" + }, + "branch": { + "intellect": "Intelecto", + "body": "Cuerpo", + "creativity": "Creatividad", + "social": "Social", + "practical": "Práctico", + "mindset": "Mentalidad" + }, + "level": { + "unknown": "Desconocido", + "beginner": "Principiante", + "intermediate": "Intermedio", + "competent": "Competente", + "expert": "Experto", + "master": "Maestro" + }, + "activity": { + "log": "Registrar actividad", + "recent": "Actividades recientes", + "xpEarned": "+{xp} XP", + "noActivities": "Aún no hay actividades" + }, + "stats": { + "totalXp": "XP total", + "totalSkills": "Habilidades", + "highestLevel": "Nivel más alto", + "streak": "Racha", + "achievements": "Logros" + }, + "achievement": { + "title": "Logros", + "unlocked": "Desbloqueado", + "locked": "Bloqueado", + "progress": "Progreso", + "celebration": "¡Logro desbloqueado!", + "clickToClose": "Clic para cerrar", + "noAchievements": "No se encontraron logros", + "showAll": "Mostrar todos", + "showUnlocked": "Solo desbloqueados", + "all": "Todos", + "rarity": { + "common": "Común", + "uncommon": "Poco común", + "rare": "Raro", + "epic": "Épico", + "legendary": "Legendario" + }, + "category": { + "xp": "Experiencia", + "skills": "Habilidades", + "levels": "Nivel", + "activities": "Actividades", + "streak": "Racha", + "branches": "Ramas", + "special": "Especial" + } + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "register": "Registrarse" + }, + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "add": "Agregar", + "close": "Cerrar", + "search": "Buscar", + "error": "Error", + "success": "Correcto", + "loading": "Cargando..." + }, + "errors": { + "loadSkills": "Error al cargar habilidades", + "createSkill": "Error al crear habilidad", + "updateSkill": "Error al actualizar habilidad", + "deleteSkill": "Error al eliminar habilidad" + }, + "success": { + "skillCreated": "Habilidad creada", + "skillUpdated": "Habilidad actualizada", + "skillDeleted": "Habilidad eliminada", + "xpAdded": "XP agregado" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/fr.json new file mode 100644 index 000000000..463ef6ca0 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/fr.json @@ -0,0 +1,112 @@ +{ + "app": { + "name": "SkillTree", + "loading": "Chargement...", + "tagline": "Monte en niveau dans ta vie" + }, + "nav": { + "skills": "Compétences", + "activities": "Activités", + "stats": "Statistiques", + "settings": "Paramètres" + }, + "skill": { + "create": "Créer une compétence", + "edit": "Modifier la compétence", + "delete": "Supprimer la compétence", + "name": "Nom", + "description": "Description", + "branch": "Catégorie", + "level": "Niveau", + "xp": "XP", + "totalXp": "XP total", + "noSkills": "Pas encore de compétences", + "addFirst": "Ajoute ta première compétence" + }, + "branch": { + "intellect": "Intellect", + "body": "Corps", + "creativity": "Créativité", + "social": "Social", + "practical": "Pratique", + "mindset": "État d'esprit" + }, + "level": { + "unknown": "Inconnu", + "beginner": "Débutant", + "intermediate": "Intermédiaire", + "competent": "Compétent", + "expert": "Expert", + "master": "Maître" + }, + "activity": { + "log": "Enregistrer une activité", + "recent": "Activités récentes", + "xpEarned": "+{xp} XP", + "noActivities": "Pas encore d'activités" + }, + "stats": { + "totalXp": "XP total", + "totalSkills": "Compétences", + "highestLevel": "Niveau le plus élevé", + "streak": "Série", + "achievements": "Succès" + }, + "achievement": { + "title": "Succès", + "unlocked": "Débloqué", + "locked": "Verrouillé", + "progress": "Progression", + "celebration": "Succès débloqué !", + "clickToClose": "Cliquer pour fermer", + "noAchievements": "Aucun succès trouvé", + "showAll": "Tout afficher", + "showUnlocked": "Débloqués uniquement", + "all": "Tous", + "rarity": { + "common": "Commun", + "uncommon": "Peu commun", + "rare": "Rare", + "epic": "Épique", + "legendary": "Légendaire" + }, + "category": { + "xp": "Expérience", + "skills": "Compétences", + "levels": "Niveau", + "activities": "Activités", + "streak": "Série", + "branches": "Branches", + "special": "Spécial" + } + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "register": "Inscription" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "add": "Ajouter", + "close": "Fermer", + "search": "Rechercher", + "error": "Erreur", + "success": "Succès", + "loading": "Chargement..." + }, + "errors": { + "loadSkills": "Échec du chargement des compétences", + "createSkill": "Échec de la création", + "updateSkill": "Échec de la mise à jour", + "deleteSkill": "Échec de la suppression" + }, + "success": { + "skillCreated": "Compétence créée", + "skillUpdated": "Compétence mise à jour", + "skillDeleted": "Compétence supprimée", + "xpAdded": "XP ajouté" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/it.json new file mode 100644 index 000000000..c426ba903 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/skilltree/it.json @@ -0,0 +1,112 @@ +{ + "app": { + "name": "SkillTree", + "loading": "Caricamento...", + "tagline": "Sali di livello nella tua vita" + }, + "nav": { + "skills": "Abilità", + "activities": "Attività", + "stats": "Statistiche", + "settings": "Impostazioni" + }, + "skill": { + "create": "Crea abilità", + "edit": "Modifica abilità", + "delete": "Elimina abilità", + "name": "Nome", + "description": "Descrizione", + "branch": "Categoria", + "level": "Livello", + "xp": "XP", + "totalXp": "XP totali", + "noSkills": "Ancora nessuna abilità", + "addFirst": "Aggiungi la tua prima abilità" + }, + "branch": { + "intellect": "Intelletto", + "body": "Corpo", + "creativity": "Creatività", + "social": "Sociale", + "practical": "Pratico", + "mindset": "Mentalità" + }, + "level": { + "unknown": "Sconosciuto", + "beginner": "Principiante", + "intermediate": "Intermedio", + "competent": "Competente", + "expert": "Esperto", + "master": "Maestro" + }, + "activity": { + "log": "Registra attività", + "recent": "Attività recenti", + "xpEarned": "+{xp} XP", + "noActivities": "Ancora nessuna attività" + }, + "stats": { + "totalXp": "XP totali", + "totalSkills": "Abilità", + "highestLevel": "Livello più alto", + "streak": "Serie", + "achievements": "Traguardi" + }, + "achievement": { + "title": "Traguardi", + "unlocked": "Sbloccato", + "locked": "Bloccato", + "progress": "Progresso", + "celebration": "Traguardo sbloccato!", + "clickToClose": "Clicca per chiudere", + "noAchievements": "Nessun traguardo trovato", + "showAll": "Mostra tutti", + "showUnlocked": "Solo sbloccati", + "all": "Tutti", + "rarity": { + "common": "Comune", + "uncommon": "Non comune", + "rare": "Raro", + "epic": "Epico", + "legendary": "Leggendario" + }, + "category": { + "xp": "Esperienza", + "skills": "Abilità", + "levels": "Livello", + "activities": "Attività", + "streak": "Serie", + "branches": "Rami", + "special": "Speciale" + } + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "register": "Registrati" + }, + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "add": "Aggiungi", + "close": "Chiudi", + "search": "Cerca", + "error": "Errore", + "success": "Successo", + "loading": "Caricamento..." + }, + "errors": { + "loadSkills": "Caricamento abilità fallito", + "createSkill": "Creazione abilità fallita", + "updateSkill": "Aggiornamento abilità fallito", + "deleteSkill": "Eliminazione abilità fallita" + }, + "success": { + "skillCreated": "Abilità creata", + "skillUpdated": "Abilità aggiornata", + "skillDeleted": "Abilità eliminata", + "xpAdded": "XP aggiunti" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/times/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/times/de.json new file mode 100644 index 000000000..66fca217c --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/times/de.json @@ -0,0 +1,182 @@ +{ + "app": { + "name": "Times", + "loading": "Laden...", + "tagline": "Dein Arbeitsrhythmus, messbar gemacht." + }, + "nav": { + "timer": "Timer", + "entries": "Einträge", + "projects": "Projekte", + "clients": "Kunden", + "reports": "Reports", + "settings": "Einstellungen", + "templates": "Vorlagen", + "alarms": "Wecker", + "countdown": "Countdown", + "stopwatch": "Stoppuhr", + "worldClock": "Weltuhr" + }, + "timer": { + "start": "Timer starten", + "stop": "Timer stoppen", + "resume": "Fortsetzen", + "running": "Läuft", + "noDescription": "Keine Beschreibung", + "whatAreYouWorkingOn": "Woran arbeitest du?" + }, + "entry": { + "create": "Eintrag erstellen", + "edit": "Eintrag bearbeiten", + "delete": "Eintrag löschen", + "description": "Beschreibung", + "date": "Datum", + "startTime": "Startzeit", + "endTime": "Endzeit", + "duration": "Dauer", + "billable": "Abrechenbar", + "notBillable": "Nicht abrechenbar", + "noEntries": "Keine Einträge", + "today": "Heute", + "thisWeek": "Diese Woche", + "thisMonth": "Dieser Monat", + "manual": "Manuell erfassen", + "deleteConfirm": "Möchtest du diesen Zeiteintrag wirklich löschen? Dies kann nicht rückgängig gemacht werden." + }, + "project": { + "create": "Projekt erstellen", + "edit": "Projekt bearbeiten", + "delete": "Projekt löschen", + "name": "Name", + "description": "Beschreibung", + "client": "Kunde", + "billable": "Abrechenbar", + "budget": "Budget", + "noProjects": "Keine Projekte", + "archived": "Archiviert", + "internal": "Intern", + "deleteConfirm": "Möchtest du dieses Projekt wirklich löschen? Dies kann nicht rückgängig gemacht werden." + }, + "client": { + "create": "Kunde erstellen", + "edit": "Kunde bearbeiten", + "delete": "Kunde löschen", + "name": "Name", + "shortCode": "Kürzel", + "email": "E-Mail", + "billingRate": "Stundensatz", + "noClients": "Keine Kunden", + "deleteConfirm": "Möchtest du diesen Kunden wirklich löschen? Dies kann nicht rückgängig gemacht werden." + }, + "report": { + "title": "Reports", + "totalHours": "Gesamtstunden", + "billableHours": "Abrechenbare Stunden", + "avgPerDay": "Durchschnitt/Tag", + "topProject": "Top-Projekt", + "byProject": "Nach Projekt", + "byClient": "Nach Kunde", + "byDay": "Nach Tag", + "export": "Exportieren", + "dateRange": "Zeitraum" + }, + "template": { + "create": "Vorlage erstellen", + "edit": "Vorlage bearbeiten", + "delete": "Vorlage löschen", + "noTemplates": "Keine Vorlagen", + "useTemplate": "Vorlage verwenden" + }, + "settings": { + "title": "Einstellungen", + "workingHours": "Arbeitsstunden/Tag", + "workingDays": "Arbeitstage/Woche", + "rounding": "Rundung", + "roundingMethod": "Rundungsmethode", + "none": "Keine", + "up": "Aufrunden", + "down": "Abrunden", + "nearest": "Nächster Wert", + "currency": "Währung", + "billingRate": "Standard-Stundensatz", + "weekStart": "Woche beginnt am", + "monday": "Montag", + "sunday": "Sonntag", + "timerReminder": "Timer-Erinnerung (Min.)", + "autoStop": "Auto-Stop (Std.)" + }, + "auth": { + "login": "Anmelden", + "logout": "Abmelden", + "register": "Registrieren", + "email": "E-Mail", + "password": "Passwort", + "forgotPassword": "Passwort vergessen?" + }, + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "add": "Hinzufügen", + "close": "Schließen", + "search": "Suchen", + "error": "Fehler", + "success": "Erfolgreich", + "loading": "Laden...", + "noResults": "Keine Ergebnisse", + "confirm": "Bestätigen", + "back": "Zurück", + "next": "Weiter", + "create": "Erstellen", + "archive": "Archivieren", + "unarchive": "Wiederherstellen", + "total": "Gesamt", + "hours": "Stunden", + "minutes": "Minuten" + }, + "clock": { + "alarm": { + "title": "Wecker", + "custom": "Eigene Wecker", + "edit": "Wecker bearbeiten", + "time": "Uhrzeit", + "label": "Bezeichnung", + "repeat": "Wiederholung", + "sound": "Ton", + "snooze": "Schlummern" + }, + "timer": { + "title": "Countdown Timer", + "finished": "Timer abgelaufen!" + }, + "stopwatch": { + "title": "Stoppuhr", + "new": "Neue Stoppuhr", + "start": "Start", + "stop": "Stopp", + "continue": "Weiter", + "reset": "Reset", + "lap": "Runde", + "laps": "Runden", + "total": "Gesamt", + "best": "Beste", + "worst": "Langsamste", + "noStopwatches": "Keine Stoppuhren", + "noStopwatchesDescription": "Erstelle eine neue Stoppuhr um Zeit zu messen.", + "startFirst": "Erste Stoppuhr starten", + "otherStopwatches": "Weitere Stoppuhren" + }, + "worldClock": { + "title": "Weltzeituhr", + "add": "Stadt hinzufügen", + "search": "Stadt suchen...", + "noClocks": "Keine Weltuhren hinzugefügt", + "same": "Gleiche Zeit" + } + }, + "error": { + "notFound": "Seite nicht gefunden", + "backToHome": "Zurück zur Startseite" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/times/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/times/en.json new file mode 100644 index 000000000..81237eff4 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/times/en.json @@ -0,0 +1,182 @@ +{ + "app": { + "name": "Times", + "loading": "Loading...", + "tagline": "Your work rhythm, made measurable." + }, + "nav": { + "timer": "Timer", + "entries": "Entries", + "projects": "Projects", + "clients": "Clients", + "reports": "Reports", + "settings": "Settings", + "templates": "Templates", + "alarms": "Alarms", + "countdown": "Countdown", + "stopwatch": "Stopwatch", + "worldClock": "World Clock" + }, + "timer": { + "start": "Start Timer", + "stop": "Stop Timer", + "resume": "Resume", + "running": "Running", + "noDescription": "No description", + "whatAreYouWorkingOn": "What are you working on?" + }, + "entry": { + "create": "Create Entry", + "edit": "Edit Entry", + "delete": "Delete Entry", + "description": "Description", + "date": "Date", + "startTime": "Start Time", + "endTime": "End Time", + "duration": "Duration", + "billable": "Billable", + "notBillable": "Not Billable", + "noEntries": "No entries", + "today": "Today", + "thisWeek": "This Week", + "thisMonth": "This Month", + "manual": "Manual Entry", + "deleteConfirm": "Are you sure you want to delete this time entry? This cannot be undone." + }, + "project": { + "create": "Create Project", + "edit": "Edit Project", + "delete": "Delete Project", + "name": "Name", + "description": "Description", + "client": "Client", + "billable": "Billable", + "budget": "Budget", + "noProjects": "No projects", + "archived": "Archived", + "internal": "Internal", + "deleteConfirm": "Are you sure you want to delete this project? This cannot be undone." + }, + "client": { + "create": "Create Client", + "edit": "Edit Client", + "delete": "Delete Client", + "name": "Name", + "shortCode": "Short Code", + "email": "Email", + "billingRate": "Billing Rate", + "noClients": "No clients", + "deleteConfirm": "Are you sure you want to delete this client? This cannot be undone." + }, + "report": { + "title": "Reports", + "totalHours": "Total Hours", + "billableHours": "Billable Hours", + "avgPerDay": "Avg/Day", + "topProject": "Top Project", + "byProject": "By Project", + "byClient": "By Client", + "byDay": "By Day", + "export": "Export", + "dateRange": "Date Range" + }, + "template": { + "create": "Create Template", + "edit": "Edit Template", + "delete": "Delete Template", + "noTemplates": "No templates", + "useTemplate": "Use Template" + }, + "settings": { + "title": "Settings", + "workingHours": "Working Hours/Day", + "workingDays": "Working Days/Week", + "rounding": "Rounding", + "roundingMethod": "Rounding Method", + "none": "None", + "up": "Round Up", + "down": "Round Down", + "nearest": "Nearest", + "currency": "Currency", + "billingRate": "Default Billing Rate", + "weekStart": "Week Starts On", + "monday": "Monday", + "sunday": "Sunday", + "timerReminder": "Timer Reminder (min)", + "autoStop": "Auto-Stop (hours)" + }, + "auth": { + "login": "Login", + "logout": "Logout", + "register": "Register", + "email": "Email", + "password": "Password", + "forgotPassword": "Forgot password?" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "add": "Add", + "close": "Close", + "search": "Search", + "error": "Error", + "success": "Success", + "loading": "Loading...", + "noResults": "No results", + "confirm": "Confirm", + "back": "Back", + "next": "Next", + "create": "Create", + "archive": "Archive", + "unarchive": "Restore", + "total": "Total", + "hours": "Hours", + "minutes": "Minutes" + }, + "clock": { + "alarm": { + "title": "Alarms", + "custom": "Custom Alarms", + "edit": "Edit Alarm", + "time": "Time", + "label": "Label", + "repeat": "Repeat", + "sound": "Sound", + "snooze": "Snooze" + }, + "timer": { + "title": "Countdown Timer", + "finished": "Timer finished!" + }, + "stopwatch": { + "title": "Stopwatch", + "new": "New Stopwatch", + "start": "Start", + "stop": "Stop", + "continue": "Continue", + "reset": "Reset", + "lap": "Lap", + "laps": "Laps", + "total": "Total", + "best": "Best", + "worst": "Worst", + "noStopwatches": "No Stopwatches", + "noStopwatchesDescription": "Create a new stopwatch to start timing.", + "startFirst": "Start First Stopwatch", + "otherStopwatches": "Other Stopwatches" + }, + "worldClock": { + "title": "World Clock", + "add": "Add City", + "search": "Search city...", + "noClocks": "No world clocks added", + "same": "Same time" + } + }, + "error": { + "notFound": "Page not found", + "backToHome": "Back to home" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/times/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/times/es.json new file mode 100644 index 000000000..a5a1dc56d --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/times/es.json @@ -0,0 +1,182 @@ +{ + "app": { + "name": "Times", + "loading": "Cargando...", + "tagline": "Tu ritmo de trabajo, medible." + }, + "nav": { + "timer": "Temporizador", + "entries": "Registros", + "projects": "Proyectos", + "clients": "Clientes", + "reports": "Informes", + "settings": "Ajustes", + "templates": "Plantillas", + "alarms": "Alarmas", + "countdown": "Cuenta atrás", + "stopwatch": "Cronómetro", + "worldClock": "Reloj mundial" + }, + "timer": { + "start": "Iniciar temporizador", + "stop": "Detener temporizador", + "resume": "Reanudar", + "running": "En marcha", + "noDescription": "Sin descripción", + "whatAreYouWorkingOn": "¿En qué estás trabajando?" + }, + "entry": { + "create": "Crear registro", + "edit": "Editar registro", + "delete": "Eliminar registro", + "description": "Descripción", + "date": "Fecha", + "startTime": "Hora de inicio", + "endTime": "Hora de fin", + "duration": "Duración", + "billable": "Facturable", + "notBillable": "No facturable", + "noEntries": "Sin registros", + "today": "Hoy", + "thisWeek": "Esta semana", + "thisMonth": "Este mes", + "manual": "Entrada manual", + "deleteConfirm": "¿Seguro que quieres eliminar este registro? No se puede deshacer." + }, + "project": { + "create": "Crear proyecto", + "edit": "Editar proyecto", + "delete": "Eliminar proyecto", + "name": "Nombre", + "description": "Descripción", + "client": "Cliente", + "billable": "Facturable", + "budget": "Presupuesto", + "noProjects": "Sin proyectos", + "archived": "Archivado", + "internal": "Interno", + "deleteConfirm": "¿Seguro que quieres eliminar este proyecto? No se puede deshacer." + }, + "client": { + "create": "Crear cliente", + "edit": "Editar cliente", + "delete": "Eliminar cliente", + "name": "Nombre", + "shortCode": "Código corto", + "email": "Email", + "billingRate": "Tarifa", + "noClients": "Sin clientes", + "deleteConfirm": "¿Seguro que quieres eliminar este cliente? No se puede deshacer." + }, + "report": { + "title": "Informes", + "totalHours": "Horas totales", + "billableHours": "Horas facturables", + "avgPerDay": "Media/día", + "topProject": "Proyecto principal", + "byProject": "Por proyecto", + "byClient": "Por cliente", + "byDay": "Por día", + "export": "Exportar", + "dateRange": "Rango de fechas" + }, + "template": { + "create": "Crear plantilla", + "edit": "Editar plantilla", + "delete": "Eliminar plantilla", + "noTemplates": "Sin plantillas", + "useTemplate": "Usar plantilla" + }, + "settings": { + "title": "Ajustes", + "workingHours": "Horas de trabajo/día", + "workingDays": "Días laborables/semana", + "rounding": "Redondeo", + "roundingMethod": "Método de redondeo", + "none": "Ninguno", + "up": "Redondear arriba", + "down": "Redondear abajo", + "nearest": "Al más cercano", + "currency": "Moneda", + "billingRate": "Tarifa por defecto", + "weekStart": "La semana empieza el", + "monday": "Lunes", + "sunday": "Domingo", + "timerReminder": "Recordatorio (min)", + "autoStop": "Parada automática (horas)" + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "register": "Registrarse", + "email": "Email", + "password": "Contraseña", + "forgotPassword": "¿Olvidaste tu contraseña?" + }, + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "add": "Agregar", + "close": "Cerrar", + "search": "Buscar", + "error": "Error", + "success": "Correcto", + "loading": "Cargando...", + "noResults": "Sin resultados", + "confirm": "Confirmar", + "back": "Atrás", + "next": "Siguiente", + "create": "Crear", + "archive": "Archivar", + "unarchive": "Restaurar", + "total": "Total", + "hours": "Horas", + "minutes": "Minutos" + }, + "clock": { + "alarm": { + "title": "Alarmas", + "custom": "Alarmas personalizadas", + "edit": "Editar alarma", + "time": "Hora", + "label": "Etiqueta", + "repeat": "Repetir", + "sound": "Sonido", + "snooze": "Posponer" + }, + "timer": { + "title": "Cuenta atrás", + "finished": "¡Tiempo terminado!" + }, + "stopwatch": { + "title": "Cronómetro", + "new": "Nuevo cronómetro", + "start": "Iniciar", + "stop": "Detener", + "continue": "Continuar", + "reset": "Reiniciar", + "lap": "Vuelta", + "laps": "Vueltas", + "total": "Total", + "best": "Mejor", + "worst": "Peor", + "noStopwatches": "Sin cronómetros", + "noStopwatchesDescription": "Crea un nuevo cronómetro para empezar.", + "startFirst": "Iniciar primer cronómetro", + "otherStopwatches": "Otros cronómetros" + }, + "worldClock": { + "title": "Reloj mundial", + "add": "Agregar ciudad", + "search": "Buscar ciudad...", + "noClocks": "No hay relojes mundiales", + "same": "Misma hora" + } + }, + "error": { + "notFound": "Página no encontrada", + "backToHome": "Volver al inicio" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/times/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/times/fr.json new file mode 100644 index 000000000..9c5479438 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/times/fr.json @@ -0,0 +1,182 @@ +{ + "app": { + "name": "Times", + "loading": "Chargement...", + "tagline": "Ton rythme de travail, mesurable." + }, + "nav": { + "timer": "Minuteur", + "entries": "Entrées", + "projects": "Projets", + "clients": "Clients", + "reports": "Rapports", + "settings": "Paramètres", + "templates": "Modèles", + "alarms": "Alarmes", + "countdown": "Compte à rebours", + "stopwatch": "Chronomètre", + "worldClock": "Horloge mondiale" + }, + "timer": { + "start": "Démarrer le minuteur", + "stop": "Arrêter le minuteur", + "resume": "Reprendre", + "running": "En cours", + "noDescription": "Pas de description", + "whatAreYouWorkingOn": "Sur quoi travailles-tu ?" + }, + "entry": { + "create": "Créer une entrée", + "edit": "Modifier l'entrée", + "delete": "Supprimer l'entrée", + "description": "Description", + "date": "Date", + "startTime": "Heure de début", + "endTime": "Heure de fin", + "duration": "Durée", + "billable": "Facturable", + "notBillable": "Non facturable", + "noEntries": "Aucune entrée", + "today": "Aujourd'hui", + "thisWeek": "Cette semaine", + "thisMonth": "Ce mois-ci", + "manual": "Entrée manuelle", + "deleteConfirm": "Voulez-vous vraiment supprimer cette entrée ? Cette action est irréversible." + }, + "project": { + "create": "Créer un projet", + "edit": "Modifier le projet", + "delete": "Supprimer le projet", + "name": "Nom", + "description": "Description", + "client": "Client", + "billable": "Facturable", + "budget": "Budget", + "noProjects": "Aucun projet", + "archived": "Archivé", + "internal": "Interne", + "deleteConfirm": "Voulez-vous vraiment supprimer ce projet ? Cette action est irréversible." + }, + "client": { + "create": "Créer un client", + "edit": "Modifier le client", + "delete": "Supprimer le client", + "name": "Nom", + "shortCode": "Code court", + "email": "Email", + "billingRate": "Tarif", + "noClients": "Aucun client", + "deleteConfirm": "Voulez-vous vraiment supprimer ce client ? Cette action est irréversible." + }, + "report": { + "title": "Rapports", + "totalHours": "Heures totales", + "billableHours": "Heures facturables", + "avgPerDay": "Moy./jour", + "topProject": "Projet principal", + "byProject": "Par projet", + "byClient": "Par client", + "byDay": "Par jour", + "export": "Exporter", + "dateRange": "Période" + }, + "template": { + "create": "Créer un modèle", + "edit": "Modifier le modèle", + "delete": "Supprimer le modèle", + "noTemplates": "Aucun modèle", + "useTemplate": "Utiliser le modèle" + }, + "settings": { + "title": "Paramètres", + "workingHours": "Heures de travail/jour", + "workingDays": "Jours ouvrés/semaine", + "rounding": "Arrondi", + "roundingMethod": "Méthode d'arrondi", + "none": "Aucun", + "up": "Arrondir au-dessus", + "down": "Arrondir en-dessous", + "nearest": "Au plus proche", + "currency": "Devise", + "billingRate": "Tarif par défaut", + "weekStart": "La semaine commence le", + "monday": "Lundi", + "sunday": "Dimanche", + "timerReminder": "Rappel (min)", + "autoStop": "Arrêt auto (heures)" + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "register": "Inscription", + "email": "Email", + "password": "Mot de passe", + "forgotPassword": "Mot de passe oublié ?" + }, + "common": { + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "add": "Ajouter", + "close": "Fermer", + "search": "Rechercher", + "error": "Erreur", + "success": "Succès", + "loading": "Chargement...", + "noResults": "Aucun résultat", + "confirm": "Confirmer", + "back": "Retour", + "next": "Suivant", + "create": "Créer", + "archive": "Archiver", + "unarchive": "Restaurer", + "total": "Total", + "hours": "Heures", + "minutes": "Minutes" + }, + "clock": { + "alarm": { + "title": "Alarmes", + "custom": "Alarmes personnalisées", + "edit": "Modifier l'alarme", + "time": "Heure", + "label": "Libellé", + "repeat": "Répéter", + "sound": "Son", + "snooze": "Rappel" + }, + "timer": { + "title": "Compte à rebours", + "finished": "Temps écoulé !" + }, + "stopwatch": { + "title": "Chronomètre", + "new": "Nouveau chronomètre", + "start": "Démarrer", + "stop": "Arrêter", + "continue": "Continuer", + "reset": "Réinitialiser", + "lap": "Tour", + "laps": "Tours", + "total": "Total", + "best": "Meilleur", + "worst": "Pire", + "noStopwatches": "Aucun chronomètre", + "noStopwatchesDescription": "Crée un nouveau chronomètre pour commencer.", + "startFirst": "Démarrer le premier chronomètre", + "otherStopwatches": "Autres chronomètres" + }, + "worldClock": { + "title": "Horloge mondiale", + "add": "Ajouter une ville", + "search": "Rechercher une ville...", + "noClocks": "Aucune horloge mondiale", + "same": "Même heure" + } + }, + "error": { + "notFound": "Page introuvable", + "backToHome": "Retour à l'accueil" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/times/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/times/it.json new file mode 100644 index 000000000..c97359f62 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/times/it.json @@ -0,0 +1,182 @@ +{ + "app": { + "name": "Times", + "loading": "Caricamento...", + "tagline": "Il tuo ritmo di lavoro, misurabile." + }, + "nav": { + "timer": "Timer", + "entries": "Registrazioni", + "projects": "Progetti", + "clients": "Clienti", + "reports": "Report", + "settings": "Impostazioni", + "templates": "Modelli", + "alarms": "Sveglie", + "countdown": "Conto alla rovescia", + "stopwatch": "Cronometro", + "worldClock": "Orologio mondiale" + }, + "timer": { + "start": "Avvia timer", + "stop": "Ferma timer", + "resume": "Riprendi", + "running": "In corso", + "noDescription": "Nessuna descrizione", + "whatAreYouWorkingOn": "Su cosa stai lavorando?" + }, + "entry": { + "create": "Crea registrazione", + "edit": "Modifica registrazione", + "delete": "Elimina registrazione", + "description": "Descrizione", + "date": "Data", + "startTime": "Ora di inizio", + "endTime": "Ora di fine", + "duration": "Durata", + "billable": "Fatturabile", + "notBillable": "Non fatturabile", + "noEntries": "Nessuna registrazione", + "today": "Oggi", + "thisWeek": "Questa settimana", + "thisMonth": "Questo mese", + "manual": "Inserimento manuale", + "deleteConfirm": "Vuoi davvero eliminare questa registrazione? Non è possibile annullare." + }, + "project": { + "create": "Crea progetto", + "edit": "Modifica progetto", + "delete": "Elimina progetto", + "name": "Nome", + "description": "Descrizione", + "client": "Cliente", + "billable": "Fatturabile", + "budget": "Budget", + "noProjects": "Nessun progetto", + "archived": "Archiviato", + "internal": "Interno", + "deleteConfirm": "Vuoi davvero eliminare questo progetto? Non è possibile annullare." + }, + "client": { + "create": "Crea cliente", + "edit": "Modifica cliente", + "delete": "Elimina cliente", + "name": "Nome", + "shortCode": "Codice breve", + "email": "Email", + "billingRate": "Tariffa", + "noClients": "Nessun cliente", + "deleteConfirm": "Vuoi davvero eliminare questo cliente? Non è possibile annullare." + }, + "report": { + "title": "Report", + "totalHours": "Ore totali", + "billableHours": "Ore fatturabili", + "avgPerDay": "Media/giorno", + "topProject": "Progetto principale", + "byProject": "Per progetto", + "byClient": "Per cliente", + "byDay": "Per giorno", + "export": "Esporta", + "dateRange": "Periodo" + }, + "template": { + "create": "Crea modello", + "edit": "Modifica modello", + "delete": "Elimina modello", + "noTemplates": "Nessun modello", + "useTemplate": "Usa modello" + }, + "settings": { + "title": "Impostazioni", + "workingHours": "Ore lavorative/giorno", + "workingDays": "Giorni lavorativi/settimana", + "rounding": "Arrotondamento", + "roundingMethod": "Metodo di arrotondamento", + "none": "Nessuno", + "up": "Arrotonda per eccesso", + "down": "Arrotonda per difetto", + "nearest": "Al più vicino", + "currency": "Valuta", + "billingRate": "Tariffa predefinita", + "weekStart": "La settimana inizia il", + "monday": "Lunedì", + "sunday": "Domenica", + "timerReminder": "Promemoria (min)", + "autoStop": "Arresto automatico (ore)" + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "register": "Registrati", + "email": "Email", + "password": "Password", + "forgotPassword": "Password dimenticata?" + }, + "common": { + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "add": "Aggiungi", + "close": "Chiudi", + "search": "Cerca", + "error": "Errore", + "success": "Successo", + "loading": "Caricamento...", + "noResults": "Nessun risultato", + "confirm": "Conferma", + "back": "Indietro", + "next": "Avanti", + "create": "Crea", + "archive": "Archivia", + "unarchive": "Ripristina", + "total": "Totale", + "hours": "Ore", + "minutes": "Minuti" + }, + "clock": { + "alarm": { + "title": "Sveglie", + "custom": "Sveglie personalizzate", + "edit": "Modifica sveglia", + "time": "Ora", + "label": "Etichetta", + "repeat": "Ripeti", + "sound": "Suono", + "snooze": "Posticipa" + }, + "timer": { + "title": "Conto alla rovescia", + "finished": "Tempo scaduto!" + }, + "stopwatch": { + "title": "Cronometro", + "new": "Nuovo cronometro", + "start": "Avvia", + "stop": "Ferma", + "continue": "Continua", + "reset": "Azzera", + "lap": "Giro", + "laps": "Giri", + "total": "Totale", + "best": "Migliore", + "worst": "Peggiore", + "noStopwatches": "Nessun cronometro", + "noStopwatchesDescription": "Crea un nuovo cronometro per iniziare.", + "startFirst": "Avvia il primo cronometro", + "otherStopwatches": "Altri cronometri" + }, + "worldClock": { + "title": "Orologio mondiale", + "add": "Aggiungi città", + "search": "Cerca città...", + "noClocks": "Nessun orologio mondiale", + "same": "Stessa ora" + } + }, + "error": { + "notFound": "Pagina non trovata", + "backToHome": "Torna alla home" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/uload/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/uload/de.json new file mode 100644 index 000000000..2b0ae9e44 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/uload/de.json @@ -0,0 +1,95 @@ +{ + "nav": { + "links": "Links", + "tags": "Tags", + "analytics": "Analytics", + "settings": "Einstellungen" + }, + "links": { + "title": "Links", + "newLink": "Neuer Link", + "hide": "Ausblenden", + "url": "URL", + "urlPlaceholder": "https://example.com/long-url-here", + "titleLabel": "Titel (optional)", + "titlePlaceholder": "Mein Link", + "customCode": "Custom Code (optional)", + "customCodePlaceholder": "mein-link", + "utmParams": "UTM-Parameter", + "create": "Link erstellen", + "search": "Links durchsuchen...", + "all": "Alle", + "active": "Aktiv", + "inactive": "Inaktiv", + "allFolders": "Alle Ordner", + "noLinks": "Noch keine Links", + "noLinksDesc": "Erstelle deinen ersten gekürzten Link!", + "copied": "Link kopiert!", + "created": "Link erstellt", + "updated": "Link aktualisiert", + "deleted": "Link gelöscht", + "edit": "Bearbeiten", + "editTitle": "Link bearbeiten", + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "deleteConfirm": "wirklich löschen?", + "activate": "Aktivieren", + "deactivate": "Deaktivieren", + "copyLink": "Link kopieren", + "qrCode": "QR-Code", + "qrDownload": "QR herunterladen", + "clicks": "clicks" + }, + "tags": { + "title": "Tags", + "newTag": "Neuer Tag", + "name": "Name", + "namePlaceholder": "z.B. Social Media", + "color": "Farbe", + "create": "Erstellen", + "noTags": "Noch keine Tags", + "noTagsDesc": "Erstelle Tags um deine Links zu organisieren.", + "created": "Tag erstellt", + "updated": "Tag aktualisiert", + "deleted": "Tag gelöscht", + "linksCount": "Links" + }, + "analytics": { + "title": "Analytics", + "clicks": "Clicks", + "unique": "Unique", + "status": "Status", + "created": "Erstellt", + "clicksOverTime": "Clicks über Zeit", + "devices": "Geräte", + "referrers": "Referrer", + "countries": "Länder", + "noData": "Keine Daten", + "noDataPeriod": "Noch keine Daten für diesen Zeitraum", + "authRequired": "Analytics nur für angemeldete Nutzer", + "localClicks": "Lokale Click-Counts", + "unknown": "Unbekannt", + "direct": "Direkt" + }, + "settings": { + "title": "Einstellungen", + "account": "Account", + "email": "E-Mail", + "name": "Name", + "data": "Daten", + "clearData": "Lokale Daten löschen", + "clearConfirm": "Alle lokalen Daten löschen? Dies kann nicht rückgängig gemacht werden.", + "cleared": "Lokale Daten gelöscht", + "logout": "Abmelden", + "guestHint": "Du bist als Gast unterwegs.", + "loginToSync": "Anmelden um Daten zu synchronisieren." + }, + "common": { + "back": "Zurück", + "login": "Anmelden", + "source": "Source", + "medium": "Medium", + "campaign": "Campaign" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/uload/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/uload/en.json new file mode 100644 index 000000000..6c5f159ac --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/uload/en.json @@ -0,0 +1,95 @@ +{ + "nav": { + "links": "Links", + "tags": "Tags", + "analytics": "Analytics", + "settings": "Settings" + }, + "links": { + "title": "Links", + "newLink": "New Link", + "hide": "Hide", + "url": "URL", + "urlPlaceholder": "https://example.com/long-url-here", + "titleLabel": "Title (optional)", + "titlePlaceholder": "My Link", + "customCode": "Custom Code (optional)", + "customCodePlaceholder": "my-link", + "utmParams": "UTM Parameters", + "create": "Create Link", + "search": "Search links...", + "all": "All", + "active": "Active", + "inactive": "Inactive", + "allFolders": "All Folders", + "noLinks": "No links yet", + "noLinksDesc": "Create your first shortened link!", + "copied": "Link copied!", + "created": "Link created", + "updated": "Link updated", + "deleted": "Link deleted", + "edit": "Edit", + "editTitle": "Edit Link", + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "deleteConfirm": "really delete?", + "activate": "Activate", + "deactivate": "Deactivate", + "copyLink": "Copy link", + "qrCode": "QR Code", + "qrDownload": "Download QR", + "clicks": "clicks" + }, + "tags": { + "title": "Tags", + "newTag": "New Tag", + "name": "Name", + "namePlaceholder": "e.g. Social Media", + "color": "Color", + "create": "Create", + "noTags": "No tags yet", + "noTagsDesc": "Create tags to organize your links.", + "created": "Tag created", + "updated": "Tag updated", + "deleted": "Tag deleted", + "linksCount": "Links" + }, + "analytics": { + "title": "Analytics", + "clicks": "Clicks", + "unique": "Unique", + "status": "Status", + "created": "Created", + "clicksOverTime": "Clicks over time", + "devices": "Devices", + "referrers": "Referrers", + "countries": "Countries", + "noData": "No data", + "noDataPeriod": "No data for this period yet", + "authRequired": "Analytics only for logged-in users", + "localClicks": "Local click counts", + "unknown": "Unknown", + "direct": "Direct" + }, + "settings": { + "title": "Settings", + "account": "Account", + "email": "Email", + "name": "Name", + "data": "Data", + "clearData": "Clear local data", + "clearConfirm": "Clear all local data? This cannot be undone.", + "cleared": "Local data cleared", + "logout": "Sign out", + "guestHint": "You are in guest mode.", + "loginToSync": "Sign in to sync your data." + }, + "common": { + "back": "Back", + "login": "Sign in", + "source": "Source", + "medium": "Medium", + "campaign": "Campaign" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/uload/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/uload/es.json new file mode 100644 index 000000000..b322c53cc --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/uload/es.json @@ -0,0 +1,95 @@ +{ + "nav": { + "links": "Enlaces", + "tags": "Etiquetas", + "analytics": "Analíticas", + "settings": "Ajustes" + }, + "links": { + "title": "Enlaces", + "newLink": "Nuevo enlace", + "hide": "Ocultar", + "url": "URL", + "urlPlaceholder": "https://example.com/url-larga-aqui", + "titleLabel": "Título (opcional)", + "titlePlaceholder": "Mi enlace", + "customCode": "Código personalizado (opcional)", + "customCodePlaceholder": "mi-enlace", + "utmParams": "Parámetros UTM", + "create": "Crear enlace", + "search": "Buscar enlaces...", + "all": "Todos", + "active": "Activos", + "inactive": "Inactivos", + "allFolders": "Todas las carpetas", + "noLinks": "Aún no hay enlaces", + "noLinksDesc": "¡Crea tu primer enlace acortado!", + "copied": "¡Enlace copiado!", + "created": "Enlace creado", + "updated": "Enlace actualizado", + "deleted": "Enlace eliminado", + "edit": "Editar", + "editTitle": "Editar enlace", + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "deleteConfirm": "¿eliminar de verdad?", + "activate": "Activar", + "deactivate": "Desactivar", + "copyLink": "Copiar enlace", + "qrCode": "Código QR", + "qrDownload": "Descargar QR", + "clicks": "clics" + }, + "tags": { + "title": "Etiquetas", + "newTag": "Nueva etiqueta", + "name": "Nombre", + "namePlaceholder": "ej. Redes sociales", + "color": "Color", + "create": "Crear", + "noTags": "Aún no hay etiquetas", + "noTagsDesc": "Crea etiquetas para organizar tus enlaces.", + "created": "Etiqueta creada", + "updated": "Etiqueta actualizada", + "deleted": "Etiqueta eliminada", + "linksCount": "Enlaces" + }, + "analytics": { + "title": "Analíticas", + "clicks": "Clics", + "unique": "Únicos", + "status": "Estado", + "created": "Creado", + "clicksOverTime": "Clics en el tiempo", + "devices": "Dispositivos", + "referrers": "Referentes", + "countries": "Países", + "noData": "Sin datos", + "noDataPeriod": "Aún no hay datos para este período", + "authRequired": "Analíticas solo para usuarios registrados", + "localClicks": "Clics locales", + "unknown": "Desconocido", + "direct": "Directo" + }, + "settings": { + "title": "Ajustes", + "account": "Cuenta", + "email": "Email", + "name": "Nombre", + "data": "Datos", + "clearData": "Borrar datos locales", + "clearConfirm": "¿Borrar todos los datos locales? No se puede deshacer.", + "cleared": "Datos locales borrados", + "logout": "Cerrar sesión", + "guestHint": "Estás en modo invitado.", + "loginToSync": "Inicia sesión para sincronizar tus datos." + }, + "common": { + "back": "Atrás", + "login": "Iniciar sesión", + "source": "Fuente", + "medium": "Medio", + "campaign": "Campaña" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/uload/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/uload/fr.json new file mode 100644 index 000000000..0266c972f --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/uload/fr.json @@ -0,0 +1,95 @@ +{ + "nav": { + "links": "Liens", + "tags": "Tags", + "analytics": "Statistiques", + "settings": "Paramètres" + }, + "links": { + "title": "Liens", + "newLink": "Nouveau lien", + "hide": "Masquer", + "url": "URL", + "urlPlaceholder": "https://example.com/longue-url-ici", + "titleLabel": "Titre (optionnel)", + "titlePlaceholder": "Mon lien", + "customCode": "Code personnalisé (optionnel)", + "customCodePlaceholder": "mon-lien", + "utmParams": "Paramètres UTM", + "create": "Créer le lien", + "search": "Rechercher des liens...", + "all": "Tous", + "active": "Actifs", + "inactive": "Inactifs", + "allFolders": "Tous les dossiers", + "noLinks": "Pas encore de liens", + "noLinksDesc": "Crée ton premier lien raccourci !", + "copied": "Lien copié !", + "created": "Lien créé", + "updated": "Lien mis à jour", + "deleted": "Lien supprimé", + "edit": "Modifier", + "editTitle": "Modifier le lien", + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "deleteConfirm": "vraiment supprimer ?", + "activate": "Activer", + "deactivate": "Désactiver", + "copyLink": "Copier le lien", + "qrCode": "Code QR", + "qrDownload": "Télécharger le QR", + "clicks": "clics" + }, + "tags": { + "title": "Tags", + "newTag": "Nouveau tag", + "name": "Nom", + "namePlaceholder": "ex. Réseaux sociaux", + "color": "Couleur", + "create": "Créer", + "noTags": "Pas encore de tags", + "noTagsDesc": "Crée des tags pour organiser tes liens.", + "created": "Tag créé", + "updated": "Tag mis à jour", + "deleted": "Tag supprimé", + "linksCount": "Liens" + }, + "analytics": { + "title": "Statistiques", + "clicks": "Clics", + "unique": "Uniques", + "status": "Statut", + "created": "Créé", + "clicksOverTime": "Clics dans le temps", + "devices": "Appareils", + "referrers": "Référents", + "countries": "Pays", + "noData": "Pas de données", + "noDataPeriod": "Pas encore de données pour cette période", + "authRequired": "Statistiques réservées aux utilisateurs connectés", + "localClicks": "Clics locaux", + "unknown": "Inconnu", + "direct": "Direct" + }, + "settings": { + "title": "Paramètres", + "account": "Compte", + "email": "Email", + "name": "Nom", + "data": "Données", + "clearData": "Effacer les données locales", + "clearConfirm": "Effacer toutes les données locales ? Cette action est irréversible.", + "cleared": "Données locales effacées", + "logout": "Déconnexion", + "guestHint": "Tu es en mode invité.", + "loginToSync": "Connecte-toi pour synchroniser tes données." + }, + "common": { + "back": "Retour", + "login": "Connexion", + "source": "Source", + "medium": "Support", + "campaign": "Campagne" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/uload/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/uload/it.json new file mode 100644 index 000000000..57123f159 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/uload/it.json @@ -0,0 +1,95 @@ +{ + "nav": { + "links": "Link", + "tags": "Tag", + "analytics": "Statistiche", + "settings": "Impostazioni" + }, + "links": { + "title": "Link", + "newLink": "Nuovo link", + "hide": "Nascondi", + "url": "URL", + "urlPlaceholder": "https://example.com/url-lunga-qui", + "titleLabel": "Titolo (opzionale)", + "titlePlaceholder": "Il mio link", + "customCode": "Codice personalizzato (opzionale)", + "customCodePlaceholder": "mio-link", + "utmParams": "Parametri UTM", + "create": "Crea link", + "search": "Cerca link...", + "all": "Tutti", + "active": "Attivi", + "inactive": "Inattivi", + "allFolders": "Tutte le cartelle", + "noLinks": "Ancora nessun link", + "noLinksDesc": "Crea il tuo primo link abbreviato!", + "copied": "Link copiato!", + "created": "Link creato", + "updated": "Link aggiornato", + "deleted": "Link eliminato", + "edit": "Modifica", + "editTitle": "Modifica link", + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "deleteConfirm": "eliminare davvero?", + "activate": "Attiva", + "deactivate": "Disattiva", + "copyLink": "Copia link", + "qrCode": "Codice QR", + "qrDownload": "Scarica QR", + "clicks": "clic" + }, + "tags": { + "title": "Tag", + "newTag": "Nuovo tag", + "name": "Nome", + "namePlaceholder": "es. Social media", + "color": "Colore", + "create": "Crea", + "noTags": "Ancora nessun tag", + "noTagsDesc": "Crea tag per organizzare i tuoi link.", + "created": "Tag creato", + "updated": "Tag aggiornato", + "deleted": "Tag eliminato", + "linksCount": "Link" + }, + "analytics": { + "title": "Statistiche", + "clicks": "Clic", + "unique": "Unici", + "status": "Stato", + "created": "Creato", + "clicksOverTime": "Clic nel tempo", + "devices": "Dispositivi", + "referrers": "Referrer", + "countries": "Paesi", + "noData": "Nessun dato", + "noDataPeriod": "Nessun dato per questo periodo", + "authRequired": "Statistiche solo per utenti registrati", + "localClicks": "Clic locali", + "unknown": "Sconosciuto", + "direct": "Diretto" + }, + "settings": { + "title": "Impostazioni", + "account": "Account", + "email": "Email", + "name": "Nome", + "data": "Dati", + "clearData": "Cancella dati locali", + "clearConfirm": "Cancellare tutti i dati locali? Non è possibile annullare.", + "cleared": "Dati locali cancellati", + "logout": "Esci", + "guestHint": "Sei in modalità ospite.", + "loginToSync": "Accedi per sincronizzare i tuoi dati." + }, + "common": { + "back": "Indietro", + "login": "Accedi", + "source": "Sorgente", + "medium": "Mezzo", + "campaign": "Campagna" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/zitare/de.json b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/de.json new file mode 100644 index 000000000..9b38667dd --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/de.json @@ -0,0 +1,160 @@ +{ + "app": { + "name": "Zitare", + "tagline": "Inspirierende Zitate jeden Tag" + }, + "nav": { + "home": "Heute", + "today": "Heute", + "categories": "Kategorien", + "favorites": "Favoriten", + "lists": "Listen", + "search": "Suche", + "settings": "Einstellungen", + "feedback": "Feedback", + "menu": "Menü", + "allThemes": "Alle Themes", + "showNav": "Navigation anzeigen", + "hideNav": "Navigation ausblenden" + }, + "home": { + "dailyQuote": "Zitat des Tages", + "newQuote": "Neues Zitat", + "share": "Teilen", + "favorite": "Favorit", + "unfavorite": "Entfernen", + "source": "Quelle", + "year": "Jahr" + }, + "categories": { + "title": "Kategorien", + "wisdom": "Weisheit", + "motivation": "Motivation", + "love": "Liebe", + "life": "Leben", + "success": "Erfolg", + "happiness": "Glück", + "friendship": "Freundschaft", + "courage": "Mut", + "hope": "Hoffnung", + "nature": "Natur", + "quotes": "{count} Zitate", + "notFound": "Kategorie nicht gefunden", + "backToCategories": "Zurück zu Kategorien", + "searchInCategory": "In dieser Kategorie suchen...", + "sortByAuthor": "Nach Autor", + "sortByDefault": "Standard" + }, + "favorites": { + "title": "Favoriten", + "empty": "Noch keine Favoriten", + "emptyDescription": "Tippe auf das Herz-Symbol, um Zitate zu speichern", + "loginPrompt": "Melde dich an, um Favoriten zu speichern", + "removeFromFavorites": "Aus Favoriten entfernen", + "copyQuote": "Zitat kopieren", + "share": "Teilen" + }, + "lists": { + "title": "Meine Listen", + "create": "Neue Liste", + "empty": "Noch keine Listen", + "emptyDescription": "Erstelle Listen, um Zitate zu organisieren", + "loginPrompt": "Melde dich an, um Listen zu erstellen", + "quoteCount": "{count} Zitate", + "createModal": { + "title": "Neue Liste erstellen", + "namePlaceholder": "z.B. Motivierende Zitate", + "descriptionPlaceholder": "Was macht diese Liste besonders?", + "submit": "Erstellen" + }, + "nameLabel": "Name", + "descriptionLabel": "Beschreibung (optional)", + "confirmDelete": "Möchtest du diese Liste wirklich löschen?", + "detail": { + "notFound": "Liste nicht gefunden", + "notFoundDescription": "Diese Liste existiert nicht oder wurde gelöscht.", + "backToLists": "Zurück zu Listen", + "breadcrumb": "Listen", + "lastEdited": "Zuletzt bearbeitet: {date}", + "searchPlaceholder": "Zitate durchsuchen...", + "emptyTitle": "Keine Zitate in dieser Liste", + "emptyDescription": "Füge Zitate hinzu, um deine Sammlung zu starten", + "addQuotes": "Zitate hinzufügen", + "remove": "Entfernen", + "removeConfirm": "Zitat aus dieser Liste entfernen?", + "noSearchResults": "Keine Ergebnisse", + "noSearchResultsDescription": "Versuche es mit anderen Suchbegriffen", + "floatingResults": "{filtered} von {total} Zitaten", + "editModal": { + "title": "Liste bearbeiten", + "deleteList": "Liste löschen" + }, + "addModal": { + "title": "Zitate hinzufügen", + "selected": "{count} ausgewählt", + "submit": "Hinzufügen ({count})" + }, + "toast": { + "updated": "Liste aktualisiert!", + "updateError": "Fehler beim Aktualisieren", + "deleted": "Liste gelöscht", + "deleteError": "Fehler beim Löschen", + "quotesAdded": "{count} {count, plural, one {Zitat} other {Zitate}} hinzugefügt!", + "quoteRemoved": "Zitat entfernt", + "removeError": "Fehler beim Entfernen" + } + } + }, + "search": { + "title": "Suche", + "placeholder": "Zitat oder Autor suchen...", + "noResults": "Keine Ergebnisse", + "results": "{count} Ergebnisse", + "searching": "Suche...", + "create": "Erstellen", + "createList": "als Liste erstellen", + "createListDescription": "Neue Liste mit diesem Namen erstellen", + "minChars": "Bitte gib mindestens 2 Zeichen ein", + "hint": "Suche nach Zitaten, Autoren oder Themen", + "allCategories": "Alle", + "filterByCategory": "Nach Kategorie filtern" + }, + "settings": { + "quoteLanguage": "Zitat-Sprache", + "quoteLanguageDescription": "Wähle die Sprache, in der die Zitate angezeigt werden sollen.", + "display": "Anzeige", + "showCategory": "Kategorie anzeigen", + "showCategoryDescription": "Zeigt die Kategorie-Badge auf Zitat-Karten", + "showSource": "Quelle anzeigen", + "showSourceDescription": "Zeigt Quelle und Jahr unter dem Zitat", + "fontSize": "Schriftgröße", + "fontSizeSmall": "Klein", + "fontSizeNormal": "Normal", + "fontSizeLarge": "Groß", + "fontSizeXLarge": "Sehr groß", + "about": "Über Zitare", + "aboutDescription": "Zitare bietet dir täglich inspirierende Zitate von den größten Denkern der Geschichte. Speichere deine Favoriten und erstelle eigene Listen.", + "stats": "{quotes} Zitate · {categories} Kategorien · {languages} Sprachen" + }, + "auth": { + "login": "Anmelden", + "logout": "Abmelden", + "register": "Registrieren" + }, + "feedback": { + "title": "Feedback & Vorschläge", + "subtitle": "Teile deine Ideen und stimme für Feature-Wünsche ab" + }, + "common": { + "loading": "Laden...", + "error": "Ein Fehler ist aufgetreten", + "retry": "Erneut versuchen", + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "edit": "Bearbeiten", + "close": "Schließen", + "search": "Suchen", + "list": "Liste" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/zitare/en.json b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/en.json new file mode 100644 index 000000000..67def3582 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/en.json @@ -0,0 +1,160 @@ +{ + "app": { + "name": "Zitare", + "tagline": "Inspiring quotes every day" + }, + "nav": { + "home": "Today", + "today": "Today", + "categories": "Categories", + "favorites": "Favorites", + "lists": "Lists", + "search": "Search", + "settings": "Settings", + "feedback": "Feedback", + "menu": "Menu", + "allThemes": "All Themes", + "showNav": "Show navigation", + "hideNav": "Hide navigation" + }, + "home": { + "dailyQuote": "Quote of the Day", + "newQuote": "New Quote", + "share": "Share", + "favorite": "Favorite", + "unfavorite": "Remove", + "source": "Source", + "year": "Year" + }, + "categories": { + "title": "Categories", + "wisdom": "Wisdom", + "motivation": "Motivation", + "love": "Love", + "life": "Life", + "success": "Success", + "happiness": "Happiness", + "friendship": "Friendship", + "courage": "Courage", + "hope": "Hope", + "nature": "Nature", + "quotes": "{count} quotes", + "notFound": "Category not found", + "backToCategories": "Back to categories", + "searchInCategory": "Search in this category...", + "sortByAuthor": "By author", + "sortByDefault": "Default" + }, + "favorites": { + "title": "Favorites", + "empty": "No favorites yet", + "emptyDescription": "Tap the heart icon to save quotes", + "loginPrompt": "Sign in to save favorites", + "removeFromFavorites": "Remove from favorites", + "copyQuote": "Copy quote", + "share": "Share" + }, + "lists": { + "title": "My Lists", + "create": "New List", + "empty": "No lists yet", + "emptyDescription": "Create lists to organize quotes", + "loginPrompt": "Sign in to create lists", + "quoteCount": "{count} quotes", + "createModal": { + "title": "Create new list", + "namePlaceholder": "e.g. Motivational Quotes", + "descriptionPlaceholder": "What makes this list special?", + "submit": "Create" + }, + "nameLabel": "Name", + "descriptionLabel": "Description (optional)", + "confirmDelete": "Do you really want to delete this list?", + "detail": { + "notFound": "List not found", + "notFoundDescription": "This list does not exist or has been deleted.", + "backToLists": "Back to lists", + "breadcrumb": "Lists", + "lastEdited": "Last edited: {date}", + "searchPlaceholder": "Search quotes...", + "emptyTitle": "No quotes in this list", + "emptyDescription": "Add quotes to start your collection", + "addQuotes": "Add quotes", + "remove": "Remove", + "removeConfirm": "Remove quote from this list?", + "noSearchResults": "No results", + "noSearchResultsDescription": "Try different search terms", + "floatingResults": "{filtered} of {total} quotes", + "editModal": { + "title": "Edit list", + "deleteList": "Delete list" + }, + "addModal": { + "title": "Add quotes", + "selected": "{count} selected", + "submit": "Add ({count})" + }, + "toast": { + "updated": "List updated!", + "updateError": "Error updating list", + "deleted": "List deleted", + "deleteError": "Error deleting list", + "quotesAdded": "{count} {count, plural, one {quote} other {quotes}} added!", + "quoteRemoved": "Quote removed", + "removeError": "Error removing quote" + } + } + }, + "search": { + "title": "Search", + "placeholder": "Search quotes or authors...", + "noResults": "No results", + "results": "{count} results", + "searching": "Searching...", + "create": "Create", + "createList": "create as list", + "createListDescription": "Create a new list with this name", + "minChars": "Please enter at least 2 characters", + "hint": "Search for quotes, authors, or topics", + "allCategories": "All", + "filterByCategory": "Filter by category" + }, + "settings": { + "quoteLanguage": "Quote language", + "quoteLanguageDescription": "Choose the language in which quotes are displayed.", + "display": "Display", + "showCategory": "Show category", + "showCategoryDescription": "Shows the category badge on quote cards", + "showSource": "Show source", + "showSourceDescription": "Shows source and year below the quote", + "fontSize": "Font size", + "fontSizeSmall": "Small", + "fontSizeNormal": "Normal", + "fontSizeLarge": "Large", + "fontSizeXLarge": "Extra large", + "about": "About Zitare", + "aboutDescription": "Zitare offers you daily inspiring quotes from the greatest thinkers in history. Save your favorites and create your own lists.", + "stats": "{quotes} quotes · {categories} categories · {languages} languages" + }, + "auth": { + "login": "Sign In", + "logout": "Sign Out", + "register": "Sign Up" + }, + "feedback": { + "title": "Feedback & Suggestions", + "subtitle": "Share your ideas and vote for feature requests" + }, + "common": { + "loading": "Loading...", + "error": "An error occurred", + "retry": "Try again", + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "search": "Search", + "list": "List" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/zitare/es.json b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/es.json new file mode 100644 index 000000000..459985977 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/es.json @@ -0,0 +1,160 @@ +{ + "app": { + "name": "Zitare", + "tagline": "Citas inspiradoras cada día" + }, + "nav": { + "home": "Hoy", + "today": "Hoy", + "categories": "Categorías", + "favorites": "Favoritos", + "lists": "Listas", + "search": "Buscar", + "settings": "Ajustes", + "feedback": "Feedback", + "menu": "Menú", + "allThemes": "Todos los temas", + "showNav": "Mostrar navegación", + "hideNav": "Ocultar navegación" + }, + "home": { + "dailyQuote": "Cita del día", + "newQuote": "Nueva cita", + "share": "Compartir", + "favorite": "Favorito", + "unfavorite": "Quitar", + "source": "Fuente", + "year": "Año" + }, + "categories": { + "title": "Categorías", + "wisdom": "Sabiduría", + "motivation": "Motivación", + "love": "Amor", + "life": "Vida", + "success": "Éxito", + "happiness": "Felicidad", + "friendship": "Amistad", + "courage": "Valentía", + "hope": "Esperanza", + "nature": "Naturaleza", + "quotes": "{count} citas", + "notFound": "Categoría no encontrada", + "backToCategories": "Volver a categorías", + "searchInCategory": "Buscar en esta categoría...", + "sortByAuthor": "Por autor", + "sortByDefault": "Por defecto" + }, + "favorites": { + "title": "Favoritos", + "empty": "Aún no hay favoritos", + "emptyDescription": "Toca el corazón para guardar citas", + "loginPrompt": "Inicia sesión para guardar favoritos", + "removeFromFavorites": "Quitar de favoritos", + "copyQuote": "Copiar cita", + "share": "Compartir" + }, + "lists": { + "title": "Mis listas", + "create": "Nueva lista", + "empty": "Aún no hay listas", + "emptyDescription": "Crea listas para organizar citas", + "loginPrompt": "Inicia sesión para crear listas", + "quoteCount": "{count} citas", + "createModal": { + "title": "Crear nueva lista", + "namePlaceholder": "ej. Citas motivacionales", + "descriptionPlaceholder": "¿Qué hace especial esta lista?", + "submit": "Crear" + }, + "nameLabel": "Nombre", + "descriptionLabel": "Descripción (opcional)", + "confirmDelete": "¿Realmente quieres eliminar esta lista?", + "detail": { + "notFound": "Lista no encontrada", + "notFoundDescription": "Esta lista no existe o ha sido eliminada.", + "backToLists": "Volver a listas", + "breadcrumb": "Listas", + "lastEdited": "Última edición: {date}", + "searchPlaceholder": "Buscar citas...", + "emptyTitle": "No hay citas en esta lista", + "emptyDescription": "Agrega citas para empezar tu colección", + "addQuotes": "Agregar citas", + "remove": "Quitar", + "removeConfirm": "¿Quitar cita de esta lista?", + "noSearchResults": "Sin resultados", + "noSearchResultsDescription": "Prueba con otros términos", + "floatingResults": "{filtered} de {total} citas", + "editModal": { + "title": "Editar lista", + "deleteList": "Eliminar lista" + }, + "addModal": { + "title": "Agregar citas", + "selected": "{count} seleccionadas", + "submit": "Agregar ({count})" + }, + "toast": { + "updated": "¡Lista actualizada!", + "updateError": "Error al actualizar la lista", + "deleted": "Lista eliminada", + "deleteError": "Error al eliminar la lista", + "quotesAdded": "¡{count} {count, plural, one {cita} other {citas}} agregadas!", + "quoteRemoved": "Cita eliminada", + "removeError": "Error al eliminar la cita" + } + } + }, + "search": { + "title": "Buscar", + "placeholder": "Buscar citas o autores...", + "noResults": "Sin resultados", + "results": "{count} resultados", + "searching": "Buscando...", + "create": "Crear", + "createList": "crear como lista", + "createListDescription": "Crea una nueva lista con este nombre", + "minChars": "Ingresa al menos 2 caracteres", + "hint": "Busca citas, autores o temas", + "allCategories": "Todas", + "filterByCategory": "Filtrar por categoría" + }, + "settings": { + "quoteLanguage": "Idioma de citas", + "quoteLanguageDescription": "Elige el idioma en que se muestran las citas.", + "display": "Visualización", + "showCategory": "Mostrar categoría", + "showCategoryDescription": "Muestra la etiqueta de categoría en las tarjetas", + "showSource": "Mostrar fuente", + "showSourceDescription": "Muestra la fuente y año debajo de la cita", + "fontSize": "Tamaño de fuente", + "fontSizeSmall": "Pequeño", + "fontSizeNormal": "Normal", + "fontSizeLarge": "Grande", + "fontSizeXLarge": "Muy grande", + "about": "Sobre Zitare", + "aboutDescription": "Zitare te ofrece citas inspiradoras diarias de los más grandes pensadores de la historia. Guarda tus favoritas y crea tus propias listas.", + "stats": "{quotes} citas · {categories} categorías · {languages} idiomas" + }, + "auth": { + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "register": "Registrarse" + }, + "feedback": { + "title": "Feedback y sugerencias", + "subtitle": "Comparte tus ideas y vota por nuevas funciones" + }, + "common": { + "loading": "Cargando...", + "error": "Ha ocurrido un error", + "retry": "Reintentar", + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "close": "Cerrar", + "search": "Buscar", + "list": "Lista" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/zitare/fr.json b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/fr.json new file mode 100644 index 000000000..972b061ec --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/fr.json @@ -0,0 +1,160 @@ +{ + "app": { + "name": "Zitare", + "tagline": "Des citations inspirantes chaque jour" + }, + "nav": { + "home": "Aujourd'hui", + "today": "Aujourd'hui", + "categories": "Catégories", + "favorites": "Favoris", + "lists": "Listes", + "search": "Rechercher", + "settings": "Paramètres", + "feedback": "Feedback", + "menu": "Menu", + "allThemes": "Tous les thèmes", + "showNav": "Afficher la navigation", + "hideNav": "Masquer la navigation" + }, + "home": { + "dailyQuote": "Citation du jour", + "newQuote": "Nouvelle citation", + "share": "Partager", + "favorite": "Favori", + "unfavorite": "Retirer", + "source": "Source", + "year": "Année" + }, + "categories": { + "title": "Catégories", + "wisdom": "Sagesse", + "motivation": "Motivation", + "love": "Amour", + "life": "Vie", + "success": "Succès", + "happiness": "Bonheur", + "friendship": "Amitié", + "courage": "Courage", + "hope": "Espoir", + "nature": "Nature", + "quotes": "{count} citations", + "notFound": "Catégorie introuvable", + "backToCategories": "Retour aux catégories", + "searchInCategory": "Rechercher dans cette catégorie...", + "sortByAuthor": "Par auteur", + "sortByDefault": "Par défaut" + }, + "favorites": { + "title": "Favoris", + "empty": "Pas encore de favoris", + "emptyDescription": "Appuyez sur le cœur pour sauvegarder des citations", + "loginPrompt": "Connectez-vous pour sauvegarder vos favoris", + "removeFromFavorites": "Retirer des favoris", + "copyQuote": "Copier la citation", + "share": "Partager" + }, + "lists": { + "title": "Mes listes", + "create": "Nouvelle liste", + "empty": "Pas encore de listes", + "emptyDescription": "Créez des listes pour organiser vos citations", + "loginPrompt": "Connectez-vous pour créer des listes", + "quoteCount": "{count} citations", + "createModal": { + "title": "Créer une nouvelle liste", + "namePlaceholder": "ex. Citations motivantes", + "descriptionPlaceholder": "Qu'est-ce qui rend cette liste spéciale ?", + "submit": "Créer" + }, + "nameLabel": "Nom", + "descriptionLabel": "Description (optionnel)", + "confirmDelete": "Voulez-vous vraiment supprimer cette liste ?", + "detail": { + "notFound": "Liste introuvable", + "notFoundDescription": "Cette liste n'existe pas ou a été supprimée.", + "backToLists": "Retour aux listes", + "breadcrumb": "Listes", + "lastEdited": "Dernière modification : {date}", + "searchPlaceholder": "Rechercher des citations...", + "emptyTitle": "Aucune citation dans cette liste", + "emptyDescription": "Ajoutez des citations pour commencer votre collection", + "addQuotes": "Ajouter des citations", + "remove": "Retirer", + "removeConfirm": "Retirer la citation de cette liste ?", + "noSearchResults": "Aucun résultat", + "noSearchResultsDescription": "Essayez d'autres termes", + "floatingResults": "{filtered} sur {total} citations", + "editModal": { + "title": "Modifier la liste", + "deleteList": "Supprimer la liste" + }, + "addModal": { + "title": "Ajouter des citations", + "selected": "{count} sélectionnées", + "submit": "Ajouter ({count})" + }, + "toast": { + "updated": "Liste mise à jour !", + "updateError": "Erreur lors de la mise à jour", + "deleted": "Liste supprimée", + "deleteError": "Erreur lors de la suppression", + "quotesAdded": "{count} {count, plural, one {citation ajoutée} other {citations ajoutées}} !", + "quoteRemoved": "Citation retirée", + "removeError": "Erreur lors du retrait" + } + } + }, + "search": { + "title": "Rechercher", + "placeholder": "Rechercher des citations ou auteurs...", + "noResults": "Aucun résultat", + "results": "{count} résultats", + "searching": "Recherche...", + "create": "Créer", + "createList": "créer comme liste", + "createListDescription": "Créer une nouvelle liste avec ce nom", + "minChars": "Saisissez au moins 2 caractères", + "hint": "Cherchez des citations, auteurs ou thèmes", + "allCategories": "Toutes", + "filterByCategory": "Filtrer par catégorie" + }, + "settings": { + "quoteLanguage": "Langue des citations", + "quoteLanguageDescription": "Choisissez la langue d'affichage des citations.", + "display": "Affichage", + "showCategory": "Afficher la catégorie", + "showCategoryDescription": "Affiche le badge de catégorie sur les cartes", + "showSource": "Afficher la source", + "showSourceDescription": "Affiche la source et l'année sous la citation", + "fontSize": "Taille de police", + "fontSizeSmall": "Petite", + "fontSizeNormal": "Normale", + "fontSizeLarge": "Grande", + "fontSizeXLarge": "Très grande", + "about": "À propos de Zitare", + "aboutDescription": "Zitare vous propose chaque jour des citations inspirantes des plus grands penseurs de l'histoire. Sauvegardez vos favoris et créez vos propres listes.", + "stats": "{quotes} citations · {categories} catégories · {languages} langues" + }, + "auth": { + "login": "Connexion", + "logout": "Déconnexion", + "register": "Inscription" + }, + "feedback": { + "title": "Feedback et suggestions", + "subtitle": "Partagez vos idées et votez pour de nouvelles fonctionnalités" + }, + "common": { + "loading": "Chargement...", + "error": "Une erreur est survenue", + "retry": "Réessayer", + "save": "Enregistrer", + "cancel": "Annuler", + "delete": "Supprimer", + "edit": "Modifier", + "close": "Fermer", + "search": "Rechercher", + "list": "Liste" + } +} diff --git a/apps/manacore/apps/web/src/lib/i18n/locales/zitare/it.json b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/it.json new file mode 100644 index 000000000..140ed3640 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/i18n/locales/zitare/it.json @@ -0,0 +1,160 @@ +{ + "app": { + "name": "Zitare", + "tagline": "Citazioni ispiratrici ogni giorno" + }, + "nav": { + "home": "Oggi", + "today": "Oggi", + "categories": "Categorie", + "favorites": "Preferiti", + "lists": "Liste", + "search": "Cerca", + "settings": "Impostazioni", + "feedback": "Feedback", + "menu": "Menu", + "allThemes": "Tutti i temi", + "showNav": "Mostra navigazione", + "hideNav": "Nascondi navigazione" + }, + "home": { + "dailyQuote": "Citazione del giorno", + "newQuote": "Nuova citazione", + "share": "Condividi", + "favorite": "Preferito", + "unfavorite": "Rimuovi", + "source": "Fonte", + "year": "Anno" + }, + "categories": { + "title": "Categorie", + "wisdom": "Saggezza", + "motivation": "Motivazione", + "love": "Amore", + "life": "Vita", + "success": "Successo", + "happiness": "Felicità", + "friendship": "Amicizia", + "courage": "Coraggio", + "hope": "Speranza", + "nature": "Natura", + "quotes": "{count} citazioni", + "notFound": "Categoria non trovata", + "backToCategories": "Torna alle categorie", + "searchInCategory": "Cerca in questa categoria...", + "sortByAuthor": "Per autore", + "sortByDefault": "Predefinito" + }, + "favorites": { + "title": "Preferiti", + "empty": "Ancora nessun preferito", + "emptyDescription": "Tocca il cuore per salvare le citazioni", + "loginPrompt": "Accedi per salvare i preferiti", + "removeFromFavorites": "Rimuovi dai preferiti", + "copyQuote": "Copia citazione", + "share": "Condividi" + }, + "lists": { + "title": "Le mie liste", + "create": "Nuova lista", + "empty": "Ancora nessuna lista", + "emptyDescription": "Crea liste per organizzare le citazioni", + "loginPrompt": "Accedi per creare liste", + "quoteCount": "{count} citazioni", + "createModal": { + "title": "Crea nuova lista", + "namePlaceholder": "es. Citazioni motivazionali", + "descriptionPlaceholder": "Cosa rende speciale questa lista?", + "submit": "Crea" + }, + "nameLabel": "Nome", + "descriptionLabel": "Descrizione (opzionale)", + "confirmDelete": "Vuoi davvero eliminare questa lista?", + "detail": { + "notFound": "Lista non trovata", + "notFoundDescription": "Questa lista non esiste o è stata eliminata.", + "backToLists": "Torna alle liste", + "breadcrumb": "Liste", + "lastEdited": "Ultima modifica: {date}", + "searchPlaceholder": "Cerca citazioni...", + "emptyTitle": "Nessuna citazione in questa lista", + "emptyDescription": "Aggiungi citazioni per iniziare la tua collezione", + "addQuotes": "Aggiungi citazioni", + "remove": "Rimuovi", + "removeConfirm": "Rimuovere la citazione da questa lista?", + "noSearchResults": "Nessun risultato", + "noSearchResultsDescription": "Prova con altri termini", + "floatingResults": "{filtered} di {total} citazioni", + "editModal": { + "title": "Modifica lista", + "deleteList": "Elimina lista" + }, + "addModal": { + "title": "Aggiungi citazioni", + "selected": "{count} selezionate", + "submit": "Aggiungi ({count})" + }, + "toast": { + "updated": "Lista aggiornata!", + "updateError": "Errore durante l'aggiornamento", + "deleted": "Lista eliminata", + "deleteError": "Errore durante l'eliminazione", + "quotesAdded": "{count} {count, plural, one {citazione aggiunta} other {citazioni aggiunte}}!", + "quoteRemoved": "Citazione rimossa", + "removeError": "Errore durante la rimozione" + } + } + }, + "search": { + "title": "Cerca", + "placeholder": "Cerca citazioni o autori...", + "noResults": "Nessun risultato", + "results": "{count} risultati", + "searching": "Ricerca...", + "create": "Crea", + "createList": "crea come lista", + "createListDescription": "Crea una nuova lista con questo nome", + "minChars": "Inserisci almeno 2 caratteri", + "hint": "Cerca citazioni, autori o argomenti", + "allCategories": "Tutte", + "filterByCategory": "Filtra per categoria" + }, + "settings": { + "quoteLanguage": "Lingua delle citazioni", + "quoteLanguageDescription": "Scegli la lingua in cui vengono mostrate le citazioni.", + "display": "Visualizzazione", + "showCategory": "Mostra categoria", + "showCategoryDescription": "Mostra il badge categoria sulle schede", + "showSource": "Mostra fonte", + "showSourceDescription": "Mostra fonte e anno sotto la citazione", + "fontSize": "Dimensione carattere", + "fontSizeSmall": "Piccolo", + "fontSizeNormal": "Normale", + "fontSizeLarge": "Grande", + "fontSizeXLarge": "Molto grande", + "about": "Informazioni su Zitare", + "aboutDescription": "Zitare ti offre ogni giorno citazioni ispiratrici dei più grandi pensatori della storia. Salva i tuoi preferiti e crea le tue liste.", + "stats": "{quotes} citazioni · {categories} categorie · {languages} lingue" + }, + "auth": { + "login": "Accedi", + "logout": "Esci", + "register": "Registrati" + }, + "feedback": { + "title": "Feedback e suggerimenti", + "subtitle": "Condividi le tue idee e vota per nuove funzionalità" + }, + "common": { + "loading": "Caricamento...", + "error": "Si è verificato un errore", + "retry": "Riprova", + "save": "Salva", + "cancel": "Annulla", + "delete": "Elimina", + "edit": "Modifica", + "close": "Chiudi", + "search": "Cerca", + "list": "Lista" + } +} diff --git a/apps/manacore/apps/web/src/lib/modules/calendar/AppView.svelte b/apps/manacore/apps/web/src/lib/modules/calendar/AppView.svelte index cf5aaf4d2..0e614b352 100644 --- a/apps/manacore/apps/web/src/lib/modules/calendar/AppView.svelte +++ b/apps/manacore/apps/web/src/lib/modules/calendar/AppView.svelte @@ -51,17 +51,18 @@ const dayNames = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']; // Quick event creation - let showNewEvent = $state(false); let newTitle = $state(''); - let newTime = $state('09:00'); async function createEvent() { const title = newTitle.trim(); if (!title) return; - const startTime = `${todayStr}T${newTime}:00`; - const [h, m] = newTime.split(':').map(Number); + + const nowTime = new Date(); + const h = nowTime.getHours(); + const m = nowTime.getMinutes(); + const startTime = `${todayStr}T${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:00`; const endH = h + 1; - const endTime = `${todayStr}T${String(endH).padStart(2, '0')}:${String(m).padStart(2, '0')}:00`; + const endTime = `${todayStr}T${String(endH > 23 ? 23 : endH).padStart(2, '0')}:${String(m).padStart(2, '0')}:00`; // Get default calendar or use a fallback id const calendars = await db.table('calendars').toArray(); @@ -75,7 +76,6 @@ endTime, }); newTitle = ''; - showNewEvent = false; } @@ -103,24 +103,18 @@

Heute

-
- {#if showNewEvent} -
{ - e.preventDefault(); - createEvent(); - }} - class="new-event-form" - > - - - -
- {/if} +
{ + e.preventDefault(); + createEvent(); + }} + class="quick-add" + > + + +
{#each todayEvents as event (event.id)}
@@ -214,89 +208,42 @@ color: #9ca3af; margin: 0; } - .add-btn { + .quick-add { display: flex; align-items: center; - justify-content: center; - width: 24px; - height: 24px; - border-radius: 0.25rem; - border: none; - background: transparent; - color: #9ca3af; - cursor: pointer; - transition: all 0.15s; - } - .add-btn:hover { - background: rgba(0, 0, 0, 0.06); - color: #3b82f6; - } - :global(.dark) .add-btn:hover { - background: rgba(255, 255, 255, 0.08); - color: #60a5fa; - } - .new-event-form { - display: flex; - gap: 0.375rem; - padding: 0.375rem; - border: 1px solid rgba(0, 0, 0, 0.08); + gap: 0.5rem; + padding: 0.375rem 0.5rem; border-radius: 0.375rem; - animation: slideDown 0.15s ease-out; + border: 1px solid rgba(0, 0, 0, 0.08); + background: transparent; } - :global(.dark) .new-event-form { + :global(.dark) .quick-add { border-color: rgba(255, 255, 255, 0.08); } - @keyframes slideDown { - from { - opacity: 0; - transform: translateY(-4px); - } - to { - opacity: 1; - transform: translateY(0); - } + .add-icon { + color: #d1d5db; + display: flex; } - .event-input { + :global(.dark) .add-icon { + color: #4b5563; + } + .add-input { flex: 1; border: none; background: transparent; outline: none; font-size: 0.8125rem; color: #374151; - min-width: 0; } - .event-input::placeholder { + .add-input::placeholder { color: #c0bfba; } - :global(.dark) .event-input { + :global(.dark) .add-input { color: #f3f4f6; } - :global(.dark) .event-input::placeholder { + :global(.dark) .add-input::placeholder { color: #4b5563; } - .event-time { - width: 5rem; - border: none; - background: transparent; - outline: none; - font-size: 0.75rem; - color: #6b7280; - text-align: center; - } - :global(.dark) .event-time { - color: #9ca3af; - color-scheme: dark; - } - .event-submit { - padding: 0.25rem 0.5rem; - border: none; - border-radius: 0.25rem; - background: #3b82f6; - color: white; - font-size: 0.75rem; - font-weight: 500; - cursor: pointer; - } .event-card { padding: 0.5rem 0.625rem; border-radius: 0.375rem; diff --git a/apps/manacore/apps/web/src/lib/modules/calendar/components/EventForm.svelte b/apps/manacore/apps/web/src/lib/modules/calendar/components/EventForm.svelte index 6ef75d756..0f2051988 100644 --- a/apps/manacore/apps/web/src/lib/modules/calendar/components/EventForm.svelte +++ b/apps/manacore/apps/web/src/lib/modules/calendar/components/EventForm.svelte @@ -4,6 +4,8 @@ import type { Calendar, CalendarEvent } from '../types'; import { toDate } from '../utils/event-date-helpers'; import { format, addMinutes } from 'date-fns'; + import { TagField } from '@manacore/shared-ui'; + import { useAllTags } from '@manacore/shared-stores'; interface Props { mode: 'create' | 'edit'; @@ -24,6 +26,11 @@ let isAllDay = $state(event?.isAllDay || false); let calendarId = $state(event?.calendarId || ''); let recurrenceRule = $state(event?.recurrenceRule || ''); + let selectedTagIds = $state( + ((event as Record)?.tagIds as string[]) ?? [] + ); + + const allTags = useAllTags(); // Date/time fields let startDate = $state(''); @@ -82,6 +89,8 @@ recurrenceRule: recurrenceRule || null, }; + data.tagIds = selectedTagIds; + if (mode === 'create') { data.calendarId = calendarId; } @@ -195,6 +204,11 @@ >
+
+ Tags + (selectedTagIds = ids)} /> +
+
-
+ - {#if showCreate} -
{ - e.preventDefault(); - createContact(); - }} - class="create-form" - > -
- - -
-
- - -
-
- {/if} +
{ + e.preventDefault(); + createContact(); + }} + class="quick-add" + > + + +

{filtered().length} Kontakte

@@ -133,12 +110,7 @@ padding: 1rem; height: 100%; } - .search-row { - display: flex; - gap: 0.375rem; - } .search-input { - flex: 1; padding: 0.375rem 0.625rem; border-radius: 0.375rem; border: 1px solid rgba(0, 0, 0, 0.08); @@ -146,6 +118,7 @@ font-size: 0.8125rem; color: #374151; outline: none; + width: 100%; } .search-input::placeholder { color: #c0bfba; @@ -163,87 +136,41 @@ :global(.dark) .search-input:focus { border-color: rgba(255, 255, 255, 0.15); } - .add-btn { + .quick-add { display: flex; align-items: center; - justify-content: center; - width: 32px; - height: 32px; + gap: 0.5rem; + padding: 0.375rem 0.5rem; border-radius: 0.375rem; - border: none; - background: transparent; - color: #9ca3af; - cursor: pointer; - transition: all 0.15s; - } - .add-btn:hover { - background: rgba(0, 0, 0, 0.06); - color: #22c55e; - } - :global(.dark) .add-btn:hover { - background: rgba(255, 255, 255, 0.08); - color: #4ade80; - } - .create-form { - display: flex; - flex-direction: column; - gap: 0.375rem; - padding: 0.5rem; border: 1px solid rgba(0, 0, 0, 0.08); - border-radius: 0.375rem; - animation: slideDown 0.15s ease-out; + background: transparent; } - :global(.dark) .create-form { + :global(.dark) .quick-add { border-color: rgba(255, 255, 255, 0.08); } - @keyframes slideDown { - from { - opacity: 0; - transform: translateY(-4px); - } - to { - opacity: 1; - transform: translateY(0); - } - } - .form-row { + .add-icon { + color: #d1d5db; display: flex; - gap: 0.375rem; } - .form-input { - flex: 1; - padding: 0.3125rem 0.5rem; - border-radius: 0.25rem; - border: 1px solid rgba(0, 0, 0, 0.06); - background: transparent; - font-size: 0.75rem; - color: #374151; - outline: none; - min-width: 0; - } - .form-input::placeholder { - color: #c0bfba; - } - :global(.dark) .form-input { - border-color: rgba(255, 255, 255, 0.06); - color: #f3f4f6; - } - :global(.dark) .form-input::placeholder { + :global(.dark) .add-icon { color: #4b5563; } - .form-input.full { - flex: 2; - } - .form-submit { - padding: 0.3125rem 0.625rem; + .add-input { + flex: 1; border: none; - border-radius: 0.25rem; - background: #22c55e; - color: white; - font-size: 0.75rem; - font-weight: 500; - cursor: pointer; - white-space: nowrap; + background: transparent; + outline: none; + font-size: 0.8125rem; + color: #374151; + } + .add-input::placeholder { + color: #c0bfba; + } + :global(.dark) .add-input { + color: #f3f4f6; + } + :global(.dark) .add-input::placeholder { + color: #4b5563; } .count { font-size: 0.6875rem; diff --git a/apps/manacore/apps/web/src/lib/modules/times/components/EntryForm.svelte b/apps/manacore/apps/web/src/lib/modules/times/components/EntryForm.svelte index f8df0756d..ca6bab41a 100644 --- a/apps/manacore/apps/web/src/lib/modules/times/components/EntryForm.svelte +++ b/apps/manacore/apps/web/src/lib/modules/times/components/EntryForm.svelte @@ -3,6 +3,7 @@ import { _ } from 'svelte-i18n'; import { timeEntryTable } from '$lib/modules/times/collections'; import { X, CurrencyDollar } from '@manacore/shared-icons'; + import { TagField } from '@manacore/shared-ui'; import type { Project, Client } from '$lib/modules/times/types'; import { parseMultiEntryInput, @@ -28,6 +29,7 @@ let durationHours = $state(1); let durationMinutes = $state(0); let isBillable = $state(false); + let selectedTagIds = $state([]); // Quick-input state let quickInput = $state(''); @@ -113,6 +115,7 @@ durationHours = 1; durationMinutes = 0; isBillable = false; + selectedTagIds = []; } async function handleSubmit() { @@ -132,7 +135,7 @@ duration: totalSeconds, isBillable, isRunning: false, - tags: [], + tags: selectedTagIds, billingRate: null, visibility: 'private', guildId: null, @@ -307,6 +310,18 @@
+ +
+ + (selectedTagIds = ids)} + /> +
+
+ contactsStore.toggleFavorite(contact.id)} + variant="star" + size={14} + activeColor="#f59e0b" + />
+ +
+

+ Tags +

+ (editData = { ...editData, tagIds: ids })} + /> +
+

diff --git a/package.json b/package.json index 3dfc27c4b..570c82ad1 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "dev:manacore:mobile": "pnpm --filter @manacore/mobile dev", "dev:manacore:app": "pnpm --filter @manacore/web dev", "dev:manacore:full": "concurrently -n web,servers -c cyan,yellow \"pnpm dev:manacore:web\" \"pnpm dev:manacore:servers\"", + "dev:manacore:all": "pnpm docker:up && pnpm setup:db && pnpm dev:manacore:full", "dev:cards:web": "pnpm --filter @cards/web dev", "dev:cards:landing": "pnpm --filter @cards/landing dev", "dev:cards:mobile": "pnpm --filter @cards/mobile dev", diff --git a/packages/shared-hono/package.json b/packages/shared-hono/package.json index b461614f2..c2ab4cb31 100644 --- a/packages/shared-hono/package.json +++ b/packages/shared-hono/package.json @@ -14,12 +14,14 @@ "./admin": "./src/admin.ts", "./error": "./src/error.ts", "./credits": "./src/credits.ts", - "./rate-limit": "./src/rate-limit.ts" + "./rate-limit": "./src/rate-limit.ts", + "./logger": "./src/logger.ts" }, "scripts": { "type-check": "tsc --noEmit" }, "dependencies": { + "@manacore/shared-logger": "workspace:*", "hono": "^4.7.0", "jose": "^6.0.11", "drizzle-orm": "^0.45.1", diff --git a/packages/shared-hono/src/index.ts b/packages/shared-hono/src/index.ts index 65f02784d..5298457f9 100644 --- a/packages/shared-hono/src/index.ts +++ b/packages/shared-hono/src/index.ts @@ -41,4 +41,5 @@ export { errorHandler, notFoundHandler } from './error'; export { getBalance, validateCredits, consumeCredits, refundCredits } from './credits'; export type { CreditBalance, CreditValidationResult } from './credits'; export { rateLimitMiddleware } from './rate-limit'; +export { requestLogger, initLogger } from './logger'; export type { CurrentUserData, AuthVariables } from './types'; diff --git a/packages/shared-hono/src/logger.ts b/packages/shared-hono/src/logger.ts new file mode 100644 index 000000000..630480702 --- /dev/null +++ b/packages/shared-hono/src/logger.ts @@ -0,0 +1,61 @@ +/** + * Structured request logging middleware for Hono servers. + * + * - Generates a unique request ID per request (X-Request-Id header) + * - Logs request/response as JSON lines (in production) or console (in dev) + * - Integrates with @manacore/shared-logger for consistent format + * + * @example + * ```ts + * import { requestLogger } from '@manacore/shared-hono/logger'; + * app.use('*', requestLogger()); + * ``` + */ + +import type { MiddlewareHandler } from 'hono'; +import { logger as log, configureLogger } from '@manacore/shared-logger'; + +let _requestIdStore: Map | null = null; + +function getStore(): Map { + if (!_requestIdStore) _requestIdStore = new Map(); + return _requestIdStore; +} + +/** + * Initialize the Hono logger with a service name. + * Call once at server startup before registering the middleware. + */ +export function initLogger(serviceName: string): void { + configureLogger({ serviceName }); +} + +/** + * Hono middleware that adds a request ID and logs request + response. + */ +export function requestLogger(): MiddlewareHandler { + return async (c, next) => { + const requestId = + c.req.header('x-request-id') || crypto.randomUUID().slice(0, 8); + c.header('X-Request-Id', requestId); + + const method = c.req.method; + const path = c.req.path; + const start = performance.now(); + + log.info('request', { requestId, method, path }); + + await next(); + + const durationMs = Math.round(performance.now() - start); + const status = c.res.status; + + if (status >= 500) { + log.error('response', { requestId, method, path, status, durationMs }); + } else if (status >= 400) { + log.warn('response', { requestId, method, path, status, durationMs }); + } else { + log.info('response', { requestId, method, path, status, durationMs }); + } + }; +} diff --git a/packages/shared-logger/src/index.ts b/packages/shared-logger/src/index.ts index 11e1a671a..8b4cadf46 100644 --- a/packages/shared-logger/src/index.ts +++ b/packages/shared-logger/src/index.ts @@ -1,106 +1,214 @@ /** * Shared Logger Utilities for ManaCore Apps - * Provides consistent logging across mobile and web applications. + * + * Dual-mode logger: + * - **Development / Browser**: Console output with colored prefixes (human-readable) + * - **Production / Server**: JSON lines with timestamp, level, service, requestId (machine-readable) + * + * JSON mode is auto-detected in production Node.js/Bun environments. + * Override with `LOGGER_FORMAT=json` or `LOGGER_FORMAT=console`. */ -// Check if we're in development mode -// Works in both React Native (__DEV__) and Node.js environments +// ─── Environment detection ───────────────────────────────── + declare const __DEV__: boolean | undefined; const isDevelopment = typeof __DEV__ !== 'undefined' ? __DEV__ : process.env.NODE_ENV === 'development'; +const isBrowser = typeof window !== 'undefined'; + +const useJson = + process.env.LOGGER_FORMAT === 'json' || + (process.env.LOGGER_FORMAT !== 'console' && !isDevelopment && !isBrowser); + +// ─── Request context (AsyncLocalStorage for correlation IDs) ─ + +type LogLevel = 'debug' | 'info' | 'warn' | 'error'; + +let _serviceName = 'unknown'; +let _getRequestId: (() => string | undefined) | null = null; + +/** + * Configure the logger for a service. Call once at startup. + * + * @example + * ```typescript + * import { configureLogger } from '@manacore/shared-logger'; + * configureLogger({ serviceName: 'todo-server' }); + * ``` + */ +export function configureLogger(opts: { + serviceName: string; + getRequestId?: () => string | undefined; +}): void { + _serviceName = opts.serviceName; + if (opts.getRequestId) _getRequestId = opts.getRequestId; +} + +// ─── JSON formatter ───────────────────────────────────────── + +function jsonLog(level: LogLevel, args: unknown[]): void { + const entry: Record = { + ts: new Date().toISOString(), + level, + service: _serviceName, + }; + + const requestId = _getRequestId?.(); + if (requestId) entry.requestId = requestId; + + // First string arg becomes `msg`, rest goes into `data` + if (typeof args[0] === 'string') { + entry.msg = args[0]; + if (args.length > 1) { + entry.data = args.length === 2 ? args[1] : args.slice(1); + } + } else { + entry.data = args.length === 1 ? args[0] : args; + } + + // Serialize errors + if (entry.data instanceof Error) { + entry.data = { message: entry.data.message, stack: entry.data.stack }; + } + + const line = JSON.stringify(entry); + if (level === 'error') process.stderr.write(line + '\n'); + else process.stdout.write(line + '\n'); +} + +// ─── Console formatter (original behavior) ────────────────── + +function consoleLog(level: LogLevel, args: unknown[]): void { + const prefix = `[${level.toUpperCase()}]`; + switch (level) { + case 'debug': + console.debug(prefix, ...args); + break; + case 'info': + console.info(prefix, ...args); + break; + case 'warn': + console.warn(prefix, ...args); + break; + case 'error': + console.error(prefix, ...args); + break; + } +} + +function emit(level: LogLevel, args: unknown[]): void { + if (useJson) jsonLog(level, args); + else consoleLog(level, args); +} + +// ─── Main logger ──────────────────────────────────────────── + /** * Main logger object with standard log levels. - * Debug and info only log in development mode. + * Debug and info only log in development mode (console) or always in JSON mode. * Warn and error always log. */ export const logger = { - /** Log debug information (only in development) */ + /** Log debug information (only in development, or always in JSON mode) */ debug: (...args: unknown[]): void => { - if (isDevelopment) { - console.debug('[DEBUG]', ...args); - } + if (isDevelopment || useJson) emit('debug', args); }, - /** Log general information (only in development) */ + /** Log general information (only in development, or always in JSON mode) */ info: (...args: unknown[]): void => { - if (isDevelopment) { - console.info('[INFO]', ...args); - } + if (isDevelopment || useJson) emit('info', args); }, /** Log warnings (always logged) */ warn: (...args: unknown[]): void => { - console.warn('[WARN]', ...args); + emit('warn', args); }, /** Log errors (always logged) */ error: (...args: unknown[]): void => { - console.error('[ERROR]', ...args); + emit('error', args); }, /** Log success messages (only in development) */ success: (...args: unknown[]): void => { if (isDevelopment) { - console.log('[SUCCESS]', ...args); + if (useJson) jsonLog('info', [{ success: true }, ...args]); + else console.log('[SUCCESS]', ...args); } }, - /** General log (only in development) */ + /** General log (only in development, or always in JSON mode) */ log: (...args: unknown[]): void => { - if (isDevelopment) { - console.log('[LOG]', ...args); - } + if (isDevelopment || useJson) emit('info', args); }, }; +// ─── Performance logger ───────────────────────────────────── + +const perfTimers = new Map(); + /** * Performance logger for measuring execution time. - * Only logs in development mode. */ export const perfLogger = { /** Start a performance timer with a label */ start: (label: string): void => { - if (isDevelopment) { + if (useJson) { + perfTimers.set(label, performance.now()); + } else if (isDevelopment) { console.time(label); } }, /** End a performance timer and log the duration */ end: (label: string): void => { - if (isDevelopment) { + if (useJson) { + const start = perfTimers.get(label); + if (start !== undefined) { + const durationMs = Math.round(performance.now() - start); + perfTimers.delete(label); + jsonLog('info', ['perf', { label, durationMs }]); + } + } else if (isDevelopment) { console.timeEnd(label); } }, }; +// ─── Network logger ───────────────────────────────────────── + /** * Network request logger for API debugging. - * Request and response only log in development. + * Request and response only log in development or JSON mode. * Errors always log. */ export const networkLogger = { /** Log an outgoing network request */ request: (url: string, method: string, body?: unknown): void => { - if (isDevelopment) { - console.log(`[NETWORK] ${method} ${url}`, body ? { body } : ''); + if (isDevelopment || useJson) { + emit('info', ['network_request', { method, url, ...(body !== undefined && { body }) }]); } }, /** Log a network response */ response: (url: string, status: number, data?: unknown): void => { - if (isDevelopment) { - console.log(`[NETWORK] Response ${status} from ${url}`, data ? { data } : ''); + if (isDevelopment || useJson) { + emit('info', ['network_response', { url, status, ...(data !== undefined && { data }) }]); } }, /** Log a network error (always logged) */ error: (url: string, error: unknown): void => { - console.error(`[NETWORK] Error from ${url}`, error); + emit('error', [ + 'network_error', + { url, error: error instanceof Error ? error.message : String(error) }, + ]); }, }; -// Individual function exports for backwards compatibility with cards pattern +// ─── Backwards-compatible individual exports ──────────────── + export const debug = logger.debug; export const info = logger.info; export const warn = logger.warn; diff --git a/packages/shared-ui/src/index.ts b/packages/shared-ui/src/index.ts index d6ed98e77..3dd0e0343 100644 --- a/packages/shared-ui/src/index.ts +++ b/packages/shared-ui/src/index.ts @@ -29,6 +29,7 @@ export { TagColorPicker, TagEditModal, TagSelector, + TagField, TagList, TAG_COLORS, DEFAULT_TAG_COLOR, diff --git a/packages/shared-ui/src/molecules/index.ts b/packages/shared-ui/src/molecules/index.ts index 578699a67..0946d5d3b 100644 --- a/packages/shared-ui/src/molecules/index.ts +++ b/packages/shared-ui/src/molecules/index.ts @@ -21,6 +21,7 @@ export { TagColorPicker, TagEditModal, TagSelector, + TagField, TagList, TAG_COLORS, DEFAULT_TAG_COLOR, diff --git a/packages/shared-ui/src/molecules/tags/TagField.svelte b/packages/shared-ui/src/molecules/tags/TagField.svelte new file mode 100644 index 000000000..dd98a6a21 --- /dev/null +++ b/packages/shared-ui/src/molecules/tags/TagField.svelte @@ -0,0 +1,55 @@ + + + diff --git a/packages/shared-ui/src/molecules/tags/index.ts b/packages/shared-ui/src/molecules/tags/index.ts index a2790b0df..7a661b47b 100644 --- a/packages/shared-ui/src/molecules/tags/index.ts +++ b/packages/shared-ui/src/molecules/tags/index.ts @@ -4,6 +4,7 @@ export { default as TagChip } from './TagChip.svelte'; export { default as TagColorPicker } from './TagColorPicker.svelte'; export { default as TagEditModal } from './TagEditModal.svelte'; export { default as TagSelector } from './TagSelector.svelte'; +export { default as TagField } from './TagField.svelte'; export { default as TagList } from './TagList.svelte'; // Constants and Types