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) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-02 17:20:46 +02:00
parent 39af8f8480
commit 7ba82472b2
81 changed files with 10403 additions and 600 deletions

View file

@ -53,14 +53,22 @@
- **Phase 5:** Infrastruktur (Docker -20 Container, Cloudflare -60 Zeilen, mana-auth 30→8 Origins) - **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 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 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):** **Verbleibende Arbeiten (nicht im Plan, aber empfohlen):**
- Alte standalone Web-Apps in `apps-archived/` verschieben (nach Validierung) - Alte standalone Web-Apps in `apps-archived/` verschieben (nach Validierung)
- E2E-Tests pro Modul (Routen erreichbar, CRUD funktioniert) - 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 - 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! ### Nächste Schritte — Phase 2 abgeschlossen!

View file

@ -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"
}
}

View file

@ -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;

View file

@ -1,2 +0,0 @@
export * from './types';
export * from './constants';

View file

@ -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;

View file

@ -1,4 +0,0 @@
export * from './alarm';
export * from './timer';
export * from './world-clock';
export * from './preset';

View file

@ -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,
};

View file

@ -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];
}

View file

@ -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;
}

View file

@ -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"]
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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 <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">AGB</a> und der <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Datenschutzerklärung</a> 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."
}
}

View file

@ -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 <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Terms</a> and <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Privacy Policy</a>.",
"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."
}
}

View file

@ -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 <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Términos</a> y nuestra <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Política de privacidad</a>.",
"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."
}
}

View file

@ -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 <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Conditions</a> et notre <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Politique de confidentialité</a>.",
"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."
}
}

View file

@ -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 <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Termini</a> e la nostra <a href=\"https://manacore.ai/privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: underline;\">Informativa sulla privacy</a>.",
"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."
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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é"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -51,17 +51,18 @@
const dayNames = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']; const dayNames = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
// Quick event creation // Quick event creation
let showNewEvent = $state(false);
let newTitle = $state(''); let newTitle = $state('');
let newTime = $state('09:00');
async function createEvent() { async function createEvent() {
const title = newTitle.trim(); const title = newTitle.trim();
if (!title) return; 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 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 // Get default calendar or use a fallback id
const calendars = await db.table('calendars').toArray(); const calendars = await db.table('calendars').toArray();
@ -75,7 +76,6 @@
endTime, endTime,
}); });
newTitle = ''; newTitle = '';
showNewEvent = false;
} }
</script> </script>
@ -103,24 +103,18 @@
<div class="events-section"> <div class="events-section">
<div class="section-header"> <div class="section-header">
<h3 class="section-title">Heute</h3> <h3 class="section-title">Heute</h3>
<button class="add-btn" onclick={() => (showNewEvent = !showNewEvent)} title="Neuer Termin">
<Plus size={14} />
</button>
</div> </div>
{#if showNewEvent} <form
<form onsubmit={(e) => {
onsubmit={(e) => { e.preventDefault();
e.preventDefault(); createEvent();
createEvent(); }}
}} class="quick-add"
class="new-event-form" >
> <span class="add-icon"><Plus size={16} /></span>
<input bind:value={newTitle} placeholder="Termin-Titel..." class="event-input" autofocus /> <input bind:value={newTitle} placeholder="Neuer Termin..." class="add-input" />
<input bind:value={newTime} type="time" class="event-time" /> </form>
<button type="submit" class="event-submit">OK</button>
</form>
{/if}
{#each todayEvents as event (event.id)} {#each todayEvents as event (event.id)}
<div class="event-card"> <div class="event-card">
@ -214,89 +208,42 @@
color: #9ca3af; color: #9ca3af;
margin: 0; margin: 0;
} }
.add-btn { .quick-add {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; gap: 0.5rem;
width: 24px; padding: 0.375rem 0.5rem;
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);
border-radius: 0.375rem; 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); border-color: rgba(255, 255, 255, 0.08);
} }
@keyframes slideDown { .add-icon {
from { color: #d1d5db;
opacity: 0; display: flex;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: translateY(0);
}
} }
.event-input { :global(.dark) .add-icon {
color: #4b5563;
}
.add-input {
flex: 1; flex: 1;
border: none; border: none;
background: transparent; background: transparent;
outline: none; outline: none;
font-size: 0.8125rem; font-size: 0.8125rem;
color: #374151; color: #374151;
min-width: 0;
} }
.event-input::placeholder { .add-input::placeholder {
color: #c0bfba; color: #c0bfba;
} }
:global(.dark) .event-input { :global(.dark) .add-input {
color: #f3f4f6; color: #f3f4f6;
} }
:global(.dark) .event-input::placeholder { :global(.dark) .add-input::placeholder {
color: #4b5563; 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 { .event-card {
padding: 0.5rem 0.625rem; padding: 0.5rem 0.625rem;
border-radius: 0.375rem; border-radius: 0.375rem;

View file

@ -4,6 +4,8 @@
import type { Calendar, CalendarEvent } from '../types'; import type { Calendar, CalendarEvent } from '../types';
import { toDate } from '../utils/event-date-helpers'; import { toDate } from '../utils/event-date-helpers';
import { format, addMinutes } from 'date-fns'; import { format, addMinutes } from 'date-fns';
import { TagField } from '@manacore/shared-ui';
import { useAllTags } from '@manacore/shared-stores';
interface Props { interface Props {
mode: 'create' | 'edit'; mode: 'create' | 'edit';
@ -24,6 +26,11 @@
let isAllDay = $state(event?.isAllDay || false); let isAllDay = $state(event?.isAllDay || false);
let calendarId = $state(event?.calendarId || ''); let calendarId = $state(event?.calendarId || '');
let recurrenceRule = $state(event?.recurrenceRule || ''); let recurrenceRule = $state(event?.recurrenceRule || '');
let selectedTagIds = $state<string[]>(
((event as Record<string, unknown>)?.tagIds as string[]) ?? []
);
const allTags = useAllTags();
// Date/time fields // Date/time fields
let startDate = $state(''); let startDate = $state('');
@ -82,6 +89,8 @@
recurrenceRule: recurrenceRule || null, recurrenceRule: recurrenceRule || null,
}; };
data.tagIds = selectedTagIds;
if (mode === 'create') { if (mode === 'create') {
data.calendarId = calendarId; data.calendarId = calendarId;
} }
@ -195,6 +204,11 @@
></textarea> ></textarea>
</div> </div>
<div class="field">
<span class="label">Tags</span>
<TagField tags={allTags.value} {selectedTagIds} onChange={(ids) => (selectedTagIds = ids)} />
</div>
<div class="form-actions"> <div class="form-actions">
<button type="button" class="btn btn-secondary" onclick={onCancel}> Abbrechen </button> <button type="button" class="btn btn-secondary" onclick={onCancel}> Abbrechen </button>
<button type="submit" class="btn btn-primary" disabled={submitting || !title.trim()}> <button type="submit" class="btn btn-primary" disabled={submitting || !title.trim()}>

View file

@ -1,5 +1,7 @@
<script lang="ts"> <script lang="ts">
import { deckStore } from '../stores/decks.svelte'; import { deckStore } from '../stores/decks.svelte';
import { TagField, ColorPicker, COLORS_12, DEFAULT_COLOR } from '@manacore/shared-ui';
import { useAllTags } from '@manacore/shared-stores';
interface Props { interface Props {
open?: boolean; open?: boolean;
@ -11,7 +13,10 @@
let title = $state(''); let title = $state('');
let description = $state(''); let description = $state('');
let isPublic = $state(false); let isPublic = $state(false);
let color = $state(DEFAULT_COLOR);
let submitting = $state(false); let submitting = $state(false);
let selectedTagIds = $state<string[]>([]);
const allTags = useAllTags();
async function handleSubmit() { async function handleSubmit() {
if (!title.trim()) return; if (!title.trim()) return;
@ -99,6 +104,25 @@
</label> </label>
</div> </div>
<div>
<span class="mb-1 block text-sm font-medium text-foreground">Tags</span>
<TagField
tags={allTags.value}
{selectedTagIds}
onChange={(ids) => (selectedTagIds = ids)}
/>
</div>
<div>
<span class="mb-1 block text-sm font-medium text-foreground">Farbe</span>
<ColorPicker
colors={[...COLORS_12]}
selectedColor={color}
onColorChange={(c) => (color = c)}
size="sm"
/>
</div>
{#if deckStore.error} {#if deckStore.error}
<div class="rounded-lg bg-destructive/10 p-3 text-sm text-destructive"> <div class="rounded-lg bg-destructive/10 p-3 text-sm text-destructive">
{deckStore.error} {deckStore.error}

View file

@ -48,58 +48,35 @@
} }
// Quick create // Quick create
let showCreate = $state(false); let newName = $state('');
let newFirstName = $state('');
let newLastName = $state('');
let newEmail = $state('');
async function createContact() { async function createContact() {
const firstName = newFirstName.trim(); const name = newName.trim();
const lastName = newLastName.trim(); if (!name) return;
if (!firstName && !lastName) return; const parts = name.split(/\s+/);
const firstName = parts[0];
const lastName = parts.length > 1 ? parts.slice(1).join(' ') : undefined;
await contactsStore.createContact({ await contactsStore.createContact({
firstName: firstName || undefined, firstName,
lastName: lastName || undefined, lastName,
email: newEmail.trim() || undefined,
}); });
newFirstName = ''; newName = '';
newLastName = '';
newEmail = '';
showCreate = false;
} }
</script> </script>
<div class="app-view"> <div class="app-view">
<div class="search-row"> <input bind:value={search} placeholder="Kontakt suchen..." class="search-input" />
<input bind:value={search} placeholder="Kontakt suchen..." class="search-input" />
<button class="add-btn" onclick={() => (showCreate = !showCreate)} title="Neuer Kontakt">
<Plus size={14} />
</button>
</div>
{#if showCreate} <form
<form onsubmit={(e) => {
onsubmit={(e) => { e.preventDefault();
e.preventDefault(); createContact();
createContact(); }}
}} class="quick-add"
class="create-form" >
> <span class="add-icon"><Plus size={16} /></span>
<div class="form-row"> <input bind:value={newName} placeholder="Neuer Kontakt..." class="add-input" />
<input bind:value={newFirstName} placeholder="Vorname" class="form-input" autofocus /> </form>
<input bind:value={newLastName} placeholder="Nachname" class="form-input" />
</div>
<div class="form-row">
<input
bind:value={newEmail}
placeholder="E-Mail (optional)"
class="form-input full"
type="email"
/>
<button type="submit" class="form-submit">Anlegen</button>
</div>
</form>
{/if}
<p class="count">{filtered().length} Kontakte</p> <p class="count">{filtered().length} Kontakte</p>
@ -133,12 +110,7 @@
padding: 1rem; padding: 1rem;
height: 100%; height: 100%;
} }
.search-row {
display: flex;
gap: 0.375rem;
}
.search-input { .search-input {
flex: 1;
padding: 0.375rem 0.625rem; padding: 0.375rem 0.625rem;
border-radius: 0.375rem; border-radius: 0.375rem;
border: 1px solid rgba(0, 0, 0, 0.08); border: 1px solid rgba(0, 0, 0, 0.08);
@ -146,6 +118,7 @@
font-size: 0.8125rem; font-size: 0.8125rem;
color: #374151; color: #374151;
outline: none; outline: none;
width: 100%;
} }
.search-input::placeholder { .search-input::placeholder {
color: #c0bfba; color: #c0bfba;
@ -163,87 +136,41 @@
:global(.dark) .search-input:focus { :global(.dark) .search-input:focus {
border-color: rgba(255, 255, 255, 0.15); border-color: rgba(255, 255, 255, 0.15);
} }
.add-btn { .quick-add {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; gap: 0.5rem;
width: 32px; padding: 0.375rem 0.5rem;
height: 32px;
border-radius: 0.375rem; 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: 1px solid rgba(0, 0, 0, 0.08);
border-radius: 0.375rem; background: transparent;
animation: slideDown 0.15s ease-out;
} }
:global(.dark) .create-form { :global(.dark) .quick-add {
border-color: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.08);
} }
@keyframes slideDown { .add-icon {
from { color: #d1d5db;
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.form-row {
display: flex; display: flex;
gap: 0.375rem;
} }
.form-input { :global(.dark) .add-icon {
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 {
color: #4b5563; color: #4b5563;
} }
.form-input.full { .add-input {
flex: 2; flex: 1;
}
.form-submit {
padding: 0.3125rem 0.625rem;
border: none; border: none;
border-radius: 0.25rem; background: transparent;
background: #22c55e; outline: none;
color: white; font-size: 0.8125rem;
font-size: 0.75rem; color: #374151;
font-weight: 500; }
cursor: pointer; .add-input::placeholder {
white-space: nowrap; color: #c0bfba;
}
:global(.dark) .add-input {
color: #f3f4f6;
}
:global(.dark) .add-input::placeholder {
color: #4b5563;
} }
.count { .count {
font-size: 0.6875rem; font-size: 0.6875rem;

View file

@ -3,6 +3,7 @@
import { _ } from 'svelte-i18n'; import { _ } from 'svelte-i18n';
import { timeEntryTable } from '$lib/modules/times/collections'; import { timeEntryTable } from '$lib/modules/times/collections';
import { X, CurrencyDollar } from '@manacore/shared-icons'; import { X, CurrencyDollar } from '@manacore/shared-icons';
import { TagField } from '@manacore/shared-ui';
import type { Project, Client } from '$lib/modules/times/types'; import type { Project, Client } from '$lib/modules/times/types';
import { import {
parseMultiEntryInput, parseMultiEntryInput,
@ -28,6 +29,7 @@
let durationHours = $state(1); let durationHours = $state(1);
let durationMinutes = $state(0); let durationMinutes = $state(0);
let isBillable = $state(false); let isBillable = $state(false);
let selectedTagIds = $state<string[]>([]);
// Quick-input state // Quick-input state
let quickInput = $state(''); let quickInput = $state('');
@ -113,6 +115,7 @@
durationHours = 1; durationHours = 1;
durationMinutes = 0; durationMinutes = 0;
isBillable = false; isBillable = false;
selectedTagIds = [];
} }
async function handleSubmit() { async function handleSubmit() {
@ -132,7 +135,7 @@
duration: totalSeconds, duration: totalSeconds,
isBillable, isBillable,
isRunning: false, isRunning: false,
tags: [], tags: selectedTagIds,
billingRate: null, billingRate: null,
visibility: 'private', visibility: 'private',
guildId: null, guildId: null,
@ -307,6 +310,18 @@
</button> </button>
</div> </div>
<!-- Tags -->
<div>
<label class="mb-1.5 block text-xs font-medium text-[hsl(var(--muted-foreground))]"
>Tags</label
>
<TagField
tags={allTags.value}
{selectedTagIds}
onChange={(ids) => (selectedTagIds = ids)}
/>
</div>
<!-- Submit --> <!-- Submit -->
<div class="flex gap-2"> <div class="flex gap-2">
<button <button

View file

@ -2,6 +2,7 @@
import { getContext, onMount } from 'svelte'; import { getContext, onMount } from 'svelte';
import type { Observable } from 'dexie'; import type { Observable } from 'dexie';
import { dropTarget } from '@manacore/shared-ui/dnd'; import { dropTarget } from '@manacore/shared-ui/dnd';
import { FavoriteButton } from '@manacore/shared-ui';
import type { DragPayload, TagDragData } from '@manacore/shared-ui/dnd'; import type { DragPayload, TagDragData } from '@manacore/shared-ui/dnd';
import { useAllTags } from '$lib/stores/tags.svelte'; import { useAllTags } from '$lib/stores/tags.svelte';
import { import {
@ -288,17 +289,13 @@
<!-- Actions (visible on hover) --> <!-- Actions (visible on hover) -->
<div class="flex gap-1 opacity-0 transition-opacity group-hover:opacity-100"> <div class="flex gap-1 opacity-0 transition-opacity group-hover:opacity-100">
<button <FavoriteButton
onclick={(e) => handleToggleFavorite(e, contact.id)} active={contact.isFavorite}
class="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-amber-500" onclick={() => contactsStore.toggleFavorite(contact.id)}
title={contact.isFavorite ? 'Favorit entfernen' : 'Zu Favoriten'} variant="star"
> size={14}
{#if contact.isFavorite} activeColor="#f59e0b"
<Star weight="fill" size={14} /> />
{:else}
<Star size={14} />
{/if}
</button>
<button <button
onclick={(e) => handleArchive(e, contact.id)} onclick={(e) => handleArchive(e, contact.id)}
class="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted" class="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted"

View file

@ -26,6 +26,10 @@
ShareNetwork, ShareNetwork,
} from '@manacore/shared-icons'; } from '@manacore/shared-icons';
import { ShareModal } from '@manacore/shared-uload'; import { ShareModal } from '@manacore/shared-uload';
import { TagField } from '@manacore/shared-ui';
import { useAllTags } from '@manacore/shared-stores';
const allTags = useAllTags();
const allContacts$: Observable<Contact[]> = getContext('contacts'); const allContacts$: Observable<Contact[]> = getContext('contacts');
@ -65,6 +69,7 @@
twitter: contact.twitter, twitter: contact.twitter,
instagram: contact.instagram, instagram: contact.instagram,
github: contact.github, github: contact.github,
tagIds: ((contact as Record<string, unknown>).tagIds as string[]) ?? [],
}; };
isEditing = true; isEditing = true;
} }
@ -372,6 +377,18 @@
></textarea> ></textarea>
</div> </div>
<!-- Tags -->
<div class="rounded-xl border border-border bg-card p-5">
<h2 class="mb-3 text-sm font-semibold uppercase tracking-wider text-muted-foreground">
Tags
</h2>
<TagField
tags={allTags.value}
selectedIds={(editData.tagIds as string[]) ?? []}
onChange={(ids) => (editData = { ...editData, tagIds: ids })}
/>
</div>
<!-- Social Media --> <!-- Social Media -->
<div class="rounded-xl border border-border bg-card p-5"> <div class="rounded-xl border border-border bg-card p-5">
<h2 class="mb-3 text-sm font-semibold uppercase tracking-wider text-muted-foreground"> <h2 class="mb-3 text-sm font-semibold uppercase tracking-wider text-muted-foreground">

View file

@ -36,6 +36,7 @@
"dev:manacore:mobile": "pnpm --filter @manacore/mobile dev", "dev:manacore:mobile": "pnpm --filter @manacore/mobile dev",
"dev:manacore:app": "pnpm --filter @manacore/web 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: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:web": "pnpm --filter @cards/web dev",
"dev:cards:landing": "pnpm --filter @cards/landing dev", "dev:cards:landing": "pnpm --filter @cards/landing dev",
"dev:cards:mobile": "pnpm --filter @cards/mobile dev", "dev:cards:mobile": "pnpm --filter @cards/mobile dev",

View file

@ -14,12 +14,14 @@
"./admin": "./src/admin.ts", "./admin": "./src/admin.ts",
"./error": "./src/error.ts", "./error": "./src/error.ts",
"./credits": "./src/credits.ts", "./credits": "./src/credits.ts",
"./rate-limit": "./src/rate-limit.ts" "./rate-limit": "./src/rate-limit.ts",
"./logger": "./src/logger.ts"
}, },
"scripts": { "scripts": {
"type-check": "tsc --noEmit" "type-check": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@manacore/shared-logger": "workspace:*",
"hono": "^4.7.0", "hono": "^4.7.0",
"jose": "^6.0.11", "jose": "^6.0.11",
"drizzle-orm": "^0.45.1", "drizzle-orm": "^0.45.1",

View file

@ -41,4 +41,5 @@ export { errorHandler, notFoundHandler } from './error';
export { getBalance, validateCredits, consumeCredits, refundCredits } from './credits'; export { getBalance, validateCredits, consumeCredits, refundCredits } from './credits';
export type { CreditBalance, CreditValidationResult } from './credits'; export type { CreditBalance, CreditValidationResult } from './credits';
export { rateLimitMiddleware } from './rate-limit'; export { rateLimitMiddleware } from './rate-limit';
export { requestLogger, initLogger } from './logger';
export type { CurrentUserData, AuthVariables } from './types'; export type { CurrentUserData, AuthVariables } from './types';

View file

@ -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<object, string> | null = null;
function getStore(): Map<object, string> {
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 });
}
};
}

View file

@ -1,106 +1,214 @@
/** /**
* Shared Logger Utilities for ManaCore Apps * 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 // ─── Environment detection ─────────────────────────────────
// Works in both React Native (__DEV__) and Node.js environments
declare const __DEV__: boolean | undefined; declare const __DEV__: boolean | undefined;
const isDevelopment = const isDevelopment =
typeof __DEV__ !== 'undefined' ? __DEV__ : process.env.NODE_ENV === 'development'; 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<string, unknown> = {
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. * 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. * Warn and error always log.
*/ */
export const logger = { export const logger = {
/** Log debug information (only in development) */ /** Log debug information (only in development, or always in JSON mode) */
debug: (...args: unknown[]): void => { debug: (...args: unknown[]): void => {
if (isDevelopment) { if (isDevelopment || useJson) emit('debug', args);
console.debug('[DEBUG]', ...args);
}
}, },
/** Log general information (only in development) */ /** Log general information (only in development, or always in JSON mode) */
info: (...args: unknown[]): void => { info: (...args: unknown[]): void => {
if (isDevelopment) { if (isDevelopment || useJson) emit('info', args);
console.info('[INFO]', ...args);
}
}, },
/** Log warnings (always logged) */ /** Log warnings (always logged) */
warn: (...args: unknown[]): void => { warn: (...args: unknown[]): void => {
console.warn('[WARN]', ...args); emit('warn', args);
}, },
/** Log errors (always logged) */ /** Log errors (always logged) */
error: (...args: unknown[]): void => { error: (...args: unknown[]): void => {
console.error('[ERROR]', ...args); emit('error', args);
}, },
/** Log success messages (only in development) */ /** Log success messages (only in development) */
success: (...args: unknown[]): void => { success: (...args: unknown[]): void => {
if (isDevelopment) { 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 => { log: (...args: unknown[]): void => {
if (isDevelopment) { if (isDevelopment || useJson) emit('info', args);
console.log('[LOG]', ...args);
}
}, },
}; };
// ─── Performance logger ─────────────────────────────────────
const perfTimers = new Map<string, number>();
/** /**
* Performance logger for measuring execution time. * Performance logger for measuring execution time.
* Only logs in development mode.
*/ */
export const perfLogger = { export const perfLogger = {
/** Start a performance timer with a label */ /** Start a performance timer with a label */
start: (label: string): void => { start: (label: string): void => {
if (isDevelopment) { if (useJson) {
perfTimers.set(label, performance.now());
} else if (isDevelopment) {
console.time(label); console.time(label);
} }
}, },
/** End a performance timer and log the duration */ /** End a performance timer and log the duration */
end: (label: string): void => { 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); console.timeEnd(label);
} }
}, },
}; };
// ─── Network logger ─────────────────────────────────────────
/** /**
* Network request logger for API debugging. * 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. * Errors always log.
*/ */
export const networkLogger = { export const networkLogger = {
/** Log an outgoing network request */ /** Log an outgoing network request */
request: (url: string, method: string, body?: unknown): void => { request: (url: string, method: string, body?: unknown): void => {
if (isDevelopment) { if (isDevelopment || useJson) {
console.log(`[NETWORK] ${method} ${url}`, body ? { body } : ''); emit('info', ['network_request', { method, url, ...(body !== undefined && { body }) }]);
} }
}, },
/** Log a network response */ /** Log a network response */
response: (url: string, status: number, data?: unknown): void => { response: (url: string, status: number, data?: unknown): void => {
if (isDevelopment) { if (isDevelopment || useJson) {
console.log(`[NETWORK] Response ${status} from ${url}`, data ? { data } : ''); emit('info', ['network_response', { url, status, ...(data !== undefined && { data }) }]);
} }
}, },
/** Log a network error (always logged) */ /** Log a network error (always logged) */
error: (url: string, error: unknown): void => { 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 debug = logger.debug;
export const info = logger.info; export const info = logger.info;
export const warn = logger.warn; export const warn = logger.warn;

View file

@ -29,6 +29,7 @@ export {
TagColorPicker, TagColorPicker,
TagEditModal, TagEditModal,
TagSelector, TagSelector,
TagField,
TagList, TagList,
TAG_COLORS, TAG_COLORS,
DEFAULT_TAG_COLOR, DEFAULT_TAG_COLOR,

View file

@ -21,6 +21,7 @@ export {
TagColorPicker, TagColorPicker,
TagEditModal, TagEditModal,
TagSelector, TagSelector,
TagField,
TagList, TagList,
TAG_COLORS, TAG_COLORS,
DEFAULT_TAG_COLOR, DEFAULT_TAG_COLOR,

View file

@ -0,0 +1,55 @@
<script lang="ts">
import TagSelector from './TagSelector.svelte';
import type { Tag } from './constants';
/**
* Form field wrapper for TagSelector.
* Works with tag IDs (string[]) — the common pattern across all modules.
* Pass all available tags and the currently selected IDs.
*/
interface Props {
/** All available tags */
tags: Array<{ id: string; name: string; color?: string | null }>;
/** Currently selected tag IDs */
selectedIds: string[];
/** Called when selection changes */
onChange: (ids: string[]) => void;
/** Max number of tags (optional) */
maxTags?: number;
/** Label for the add button */
addLabel?: string;
/** Placeholder text */
placeholder?: string;
}
let {
tags,
selectedIds,
onChange,
maxTags,
addLabel = 'Tag hinzufügen',
placeholder = 'Tag suchen...',
}: Props = $props();
const tagObjects: Tag[] = $derived(
tags.map((t) => ({ id: t.id, name: t.name, color: t.color ?? undefined }))
);
const selectedTags: Tag[] = $derived(
selectedIds.map((id) => tagObjects.find((t) => t.id === id)).filter((t): t is Tag => t != null)
);
function handleChange(newTags: Tag[]) {
onChange(newTags.map((t) => t.id));
}
</script>
<TagSelector
tags={tagObjects}
{selectedTags}
onTagsChange={handleChange}
addTagLabel={addLabel}
searchPlaceholder={placeholder}
{maxTags}
/>

View file

@ -4,6 +4,7 @@ export { default as TagChip } from './TagChip.svelte';
export { default as TagColorPicker } from './TagColorPicker.svelte'; export { default as TagColorPicker } from './TagColorPicker.svelte';
export { default as TagEditModal } from './TagEditModal.svelte'; export { default as TagEditModal } from './TagEditModal.svelte';
export { default as TagSelector } from './TagSelector.svelte'; export { default as TagSelector } from './TagSelector.svelte';
export { default as TagField } from './TagField.svelte';
export { default as TagList } from './TagList.svelte'; export { default as TagList } from './TagList.svelte';
// Constants and Types // Constants and Types