diff --git a/client/src/i18n/TranslationContext.tsx b/client/src/i18n/TranslationContext.tsx index 699ddfaa..940113ff 100644 --- a/client/src/i18n/TranslationContext.tsx +++ b/client/src/i18n/TranslationContext.tsx @@ -34,6 +34,7 @@ const localeLoaders: Record Promise<{ default: Tran ja: () => import('@trek/shared/i18n/ja'), ko: () => import('@trek/shared/i18n/ko'), uk: () => import('@trek/shared/i18n/uk'), + gr: () => import('@trek/shared/i18n/gr'), } // Re-export pure helpers that live in shared so downstream consumers can import them diff --git a/client/tests/unit/i18n/index.test.ts b/client/tests/unit/i18n/index.test.ts index 9260b732..c5d966e7 100644 --- a/client/tests/unit/i18n/index.test.ts +++ b/client/tests/unit/i18n/index.test.ts @@ -91,7 +91,7 @@ describe('isRtlLanguage', () => { describe('SUPPORTED_LANGUAGES', () => { it('FE-COMP-I18N-009: contains expected entries with value/label shape', () => { expect(Array.isArray(SUPPORTED_LANGUAGES)).toBe(true) - expect(SUPPORTED_LANGUAGES).toHaveLength(19) + expect(SUPPORTED_LANGUAGES).toHaveLength(20) expect(SUPPORTED_LANGUAGES).toContainEqual(expect.objectContaining({ value: 'en', label: 'English' })) expect(SUPPORTED_LANGUAGES).toContainEqual(expect.objectContaining({ value: 'tr', label: 'Türkçe' })) expect(SUPPORTED_LANGUAGES).toContainEqual(expect.objectContaining({ value: 'ja', label: '日本語' })) diff --git a/shared/src/i18n/gr/admin.ts b/shared/src/i18n/gr/admin.ts new file mode 100644 index 00000000..5edd02bf --- /dev/null +++ b/shared/src/i18n/gr/admin.ts @@ -0,0 +1,300 @@ +import type { TranslationStrings } from '../types'; + +const admin: TranslationStrings = { + 'admin.notifications.title': 'Ειδοποιήσεις', + 'admin.notifications.hint': 'Επιλέξτε ένα κανάλι ειδοποιήσεων. Μόνο ένα μπορεί να είναι ενεργό κάθε φορά.', + 'admin.notifications.none': 'Απενεργοποιημένο', + 'admin.notifications.email': 'Email (SMTP)', + 'admin.notifications.webhook': 'Webhook', + 'admin.notifications.ntfy': 'Ntfy', + 'admin.ntfy.hint': 'Επιτρέψτε στους χρήστες να διαμορφώνουν τα δικά τους θέματα ntfy για push ειδοποιήσεις. Ορίστε τον προεπιλεγμένο server παρακάτω για να προ-συμπληρώνει τις ρυθμίσεις χρηστών.', + 'admin.notifications.save': 'Αποθήκευση ρυθμίσεων ειδοποιήσεων', + 'admin.notifications.saved': 'Οι ρυθμίσεις ειδοποιήσεων αποθηκεύτηκαν', + 'admin.notifications.testWebhook': 'Αποστολή δοκιμαστικού webhook', + 'admin.notifications.testWebhookSuccess': 'Η δοκιμή webhook στάλθηκε επιτυχώς', + 'admin.notifications.testWebhookFailed': 'Η δοκιμή webhook απέτυχε', + 'admin.notifications.testNtfy': 'Αποστολή δοκιμαστικού ntfy', + 'admin.notifications.testNtfySuccess': 'Η δοκιμή ntfy στάλθηκε επιτυχώς', + 'admin.notifications.testNtfyFailed': 'Η δοκιμή ntfy απέτυχε', + 'admin.notifications.emailPanel.title': 'Email (SMTP)', + 'admin.notifications.webhookPanel.title': 'Webhook', + 'admin.notifications.inappPanel.title': 'Εντός εφαρμογής', + 'admin.notifications.inappPanel.hint': 'Οι ειδοποιήσεις εντός εφαρμογής είναι πάντα ενεργές και δεν μπορούν να απενεργοποιηθούν καθολικά.', + 'admin.notifications.adminWebhookPanel.title': 'Webhook Διαχειριστή', + 'admin.notifications.adminWebhookPanel.hint': 'Αυτό το webhook χρησιμοποιείται αποκλειστικά για ειδοποιήσεις διαχειριστή (π.χ. ειδοποιήσεις έκδοσης). Είναι ξεχωριστό από τα webhooks των χρηστών και ενεργοποιείται πάντα όταν έχει οριστεί.', + 'admin.notifications.adminWebhookPanel.saved': 'Το URL του webhook διαχειριστή αποθηκεύτηκε', + 'admin.notifications.adminWebhookPanel.testSuccess': 'Η δοκιμή webhook στάλθηκε επιτυχώς', + 'admin.notifications.adminWebhookPanel.testFailed': 'Η δοκιμή webhook απέτυχε', + 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Το webhook διαχειριστή ενεργοποιείται πάντα όταν έχει διαμορφωθεί ένα URL', + 'admin.notifications.adminNtfyPanel.title': 'Ntfy Διαχειριστή', + 'admin.notifications.adminNtfyPanel.hint': 'Αυτό το θέμα ntfy χρησιμοποιείται αποκλειστικά για ειδοποιήσεις διαχειριστή (π.χ. ειδοποιήσεις έκδοσης). Είναι ξεχωριστό από τα θέματα των χρηστών και ενεργοποιείται πάντα όταν έχει διαμορφωθεί.', + 'admin.notifications.adminNtfyPanel.serverLabel': 'URL Ntfy Server', + 'admin.notifications.adminNtfyPanel.serverHint': 'Χρησιμοποιείται επίσης ως ο προεπιλεγμένος server για τις ντόπιες ntfy ειδοποιήσεις χρηστών. Αφήστε κενό για προεπιλογή ntfy.sh. Οι χρήστες μπορούν να το παρακάμψουν στις δικές τους ρυθμίσεις.', + 'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh', + 'admin.notifications.adminNtfyPanel.topicLabel': 'Θέμα Διαχειριστή', + 'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts', + 'admin.notifications.adminNtfyPanel.tokenLabel': 'Access Token (προαιρετικό)', + 'admin.notifications.adminNtfyPanel.tokenCleared': 'Το access token διαχειριστή εκκαθαρίστηκε', + 'admin.notifications.adminNtfyPanel.saved': 'Οι ρυθμίσεις ntfy διαχειριστή αποθηκεύτηκαν', + 'admin.notifications.adminNtfyPanel.test': 'Αποστολή δοκιμαστικού ntfy', + 'admin.notifications.adminNtfyPanel.testSuccess': 'Η δοκιμή ntfy στάλθηκε επιτυχώς', + 'admin.notifications.adminNtfyPanel.testFailed': 'Η δοκιμή ntfy απέτυχε', + 'admin.notifications.adminNtfyPanel.alwaysOnHint': 'Το ntfy διαχειριστή ενεργοποιείται πάντα όταν έχει διαμορφωθεί ένα θέμα', + 'admin.notifications.adminNotificationsHint': 'Διαμορφώστε ποια κανάλια παραδίδουν ειδοποιήσεις μόνο για διαχειριστές (π.χ. ειδοποιήσεις έκδοσης).', + 'admin.notifications.tripReminders.title': 'Υπενθυμίσεις Ταξιδιού', + 'admin.notifications.tripReminders.hint': 'Αποστολή ειδοποίησης υπενθύμισης πριν την έναρξη ενός ταξιδιού (απαιτεί να έχουν οριστεί ημέρες υπενθύμισης στο ταξίδι).', + 'admin.notifications.tripReminders.enabled': 'Οι υπενθυμίσεις ταξιδιού ενεργοποιήθηκαν', + 'admin.notifications.tripReminders.disabled': 'Οι υπενθυμίσεις ταξιδιού απενεργοποιήθηκαν', + 'admin.smtp.title': 'Email & Ειδοποιήσεις', + 'admin.smtp.hint': 'Διαμόρφωση SMTP για αποστολή ειδοποιήσεων email.', + 'admin.smtp.testButton': 'Αποστολή δοκιμαστικού email', + 'admin.webhook.hint': 'Επιτρέψτε στους χρήστες να διαμορφώνουν τα δικά τους webhook URLs για ειδοποιήσεις (Discord, Slack, κ.λπ.).', + 'admin.smtp.testSuccess': 'Το δοκιμαστικό email στάλθηκε επιτυχώς', + 'admin.smtp.testFailed': 'Το δοκιμαστικό email απέτυχε', + 'admin.title': 'Διαχείριση', + 'admin.subtitle': 'Διαχείριση χρηστών και ρυθμίσεις συστήματος', + 'admin.tabs.users': 'Χρήστες', + 'admin.tabs.categories': 'Κατηγορίες', + 'admin.tabs.backup': 'Αντίγραφο ασφαλείας', + 'admin.tabs.notifications': 'Ειδοποιήσεις', + 'admin.tabs.audit': 'Έλεγχος', + 'admin.stats.users': 'Χρήστες', + 'admin.stats.trips': 'Ταξίδια', + 'admin.stats.places': 'Τόποι', + 'admin.stats.photos': 'Φωτογραφίες', + 'admin.stats.files': 'Αρχεία', + 'admin.table.user': 'Χρήστης', + 'admin.table.email': 'Email', + 'admin.table.role': 'Ρόλος', + 'admin.table.created': 'Δημιουργήθηκε', + 'admin.table.lastLogin': 'Τελευταία Σύνδεση', + 'admin.table.actions': 'Ενέργειες', + 'admin.you': '(Εσείς)', + 'admin.editUser': 'Επεξεργασία Χρήστη', + 'admin.newPassword': 'Νέος Κωδικός', + 'admin.newPasswordHint': 'Αφήστε κενό για να διατηρηθεί ο τρέχων κωδικός', + 'admin.deleteUser': 'Διαγραφή χρήστη "{name}"; Όλα τα ταξίδια θα διαγραφούν μόνιμα.', + 'admin.deleteUserTitle': 'Διαγραφή χρήστη', + 'admin.newPasswordPlaceholder': 'Εισάγετε νέο κωδικό…', + 'admin.toast.loadError': 'Αποτυχία φόρτωσης δεδομένων διαχείρισης', + 'admin.toast.userUpdated': 'Ο χρήστης ενημερώθηκε', + 'admin.toast.updateError': 'Αποτυχία ενημέρωσης', + 'admin.toast.userDeleted': 'Ο χρήστης διαγράφηκε', + 'admin.toast.deleteError': 'Αποτυχία διαγραφής', + 'admin.toast.cannotDeleteSelf': 'Δεν μπορείτε να διαγράψετε τον δικό σας λογαριασμό', + 'admin.toast.userCreated': 'Ο χρήστης δημιουργήθηκε', + 'admin.toast.createError': 'Αποτυχία δημιουργίας χρήστη', + 'admin.toast.fieldsRequired': 'Το όνομα χρήστη, το email και ο κωδικός είναι υποχρεωτικά', + 'admin.createUser': 'Δημιουργία Χρήστη', + 'admin.invite.title': 'Σύνδεσμοι Πρόσκλησης', + 'admin.invite.subtitle': 'Δημιουργία συνδέσμων εγγραφής μίας χρήσης', + 'admin.invite.create': 'Δημιουργία Συνδέσμου', + 'admin.invite.createAndCopy': 'Δημιουργία & Αντιγραφή', + 'admin.invite.empty': 'Δεν έχουν δημιουργηθεί σύνδεσμοι πρόσκλησης ακόμη', + 'admin.invite.maxUses': 'Μέγ. Χρήσεις', + 'admin.invite.expiry': 'Λήγει μετά από', + 'admin.invite.uses': 'χρησιμοποιήθηκε', + 'admin.invite.expiresAt': 'λήγει', + 'admin.invite.createdBy': 'από', + 'admin.invite.active': 'Ενεργός', + 'admin.invite.expired': 'Έληξε', + 'admin.invite.usedUp': 'Εξαντλήθηκε', + 'admin.invite.copied': 'Ο σύνδεσμος πρόσκλησης αντιγράφηκε στο πρόχειρο', + 'admin.invite.copyLink': 'Αντιγραφή συνδέσμου', + 'admin.invite.deleted': 'Ο σύνδεσμος πρόσκλησης διαγράφηκε', + 'admin.invite.createError': 'Αποτυχία δημιουργίας συνδέσμου πρόσκλησης', + 'admin.invite.deleteError': 'Αποτυχία διαγραφής συνδέσμου πρόσκλησης', + 'admin.tabs.settings': 'Ρυθμίσεις', + 'admin.allowRegistration': 'Να επιτρέπονται οι εγγραφές', + 'admin.allowRegistrationHint': 'Οι νέοι χρήστες μπορούν να εγγράφονται μόνοι τους', + 'admin.authMethods': 'Μέθοδοι Ελέγχου Ταυτότητας', + 'admin.passwordLogin': 'Σύνδεση με Κωδικό', + 'admin.passwordLoginHint': 'Επιτρέψτε στους χρήστες να συνδέονται με email και κωδικό', + 'admin.passwordRegistration': 'Εγγραφή με Κωδικό', + 'admin.passwordRegistrationHint': 'Επιτρέψτε σε νέους χρήστες να εγγράφονται με email και κωδικό', + 'admin.oidcLogin': 'Σύνδεση SSO', + 'admin.oidcLoginHint': 'Επιτρέψτε στους χρήστες να συνδέονται με SSO', + 'admin.oidcRegistration': 'Αυτόματη Δημιουργία SSO', + 'admin.oidcRegistrationHint': 'Αυτόματη δημιουργία λογαριασμών για νέους χρήστες SSO', + 'admin.envOverrideHint': 'Οι ρυθμίσεις σύνδεσης με κωδικό ελέγχονται από τη μεταβλητή περιβάλλοντος OIDC_ONLY και δεν μπορούν να αλλάξουν εδώ.', + 'admin.lockoutWarning': 'Πρέπει να παραμείνει ενεργοποιημένη τουλάχιστον μία μέθοδος σύνδεσης', + 'admin.requireMfa': 'Απαίτηση ελέγχου ταυτότητας δύο παραγόντων (2FA)', + 'admin.requireMfaHint': 'Οι χρήστες χωρίς 2FA πρέπει να ολοκληρώσουν τη ρύθμιση στις Ρυθμίσεις πριν χρησιμοποιήσουν την εφαρμογή.', + 'admin.apiKeys': 'Κλειδιά API', + 'admin.apiKeysHint': 'Προαιρετικά. Ενεργοποιεί εκτεταμένα δεδομένα τόπων όπως φωτογραφίες και καιρό.', + 'admin.mapsKey': 'Google Maps API Key', + 'admin.mapsKeyHint': 'Απαιτείται για αναζήτηση τόπων. Λάβετε το από console.cloud.google.com', + 'admin.mapsKeyHintLong': 'Χωρίς κλειδί API, χρησιμοποιείται το OpenStreetMap για αναζήτηση τόπων. Με κλειδί Google API, μπορούν επίσης να φορτωθούν φωτογραφίες, βαθμολογίες και ώρες λειτουργίας. Λάβετε ένα στο console.cloud.google.com.', + 'admin.recommended': 'Συνιστάται', + 'admin.weatherKey': 'OpenWeatherMap API Key', + 'admin.weatherKeyHint': 'Για δεδομένα καιρού. Δωρεάν στο openweathermap.org', + 'admin.validateKey': 'Δοκιμή', + 'admin.keyValid': 'Συνδέθηκε', + 'admin.keyInvalid': 'Μη έγκυρο', + 'admin.keySaved': 'Τα κλειδιά API αποθηκεύτηκαν', + 'admin.oidcTitle': 'Ενιαία Σύνδεση (OIDC)', + 'admin.oidcSubtitle': 'Επιτρέψτε τη σύνδεση μέσω εξωτερικών παρόχων όπως Google, Apple, Authentik ή Keycloak.', + 'admin.oidcDisplayName': 'Εμφανιζόμενο Όνομα', + 'admin.oidcIssuer': 'Issuer URL', + 'admin.oidcIssuerHint': 'Το OpenID Connect Issuer URL του παρόχου. π.χ. https://accounts.google.com', + 'admin.oidcSaved': 'Η διαμόρφωση OIDC αποθηκεύτηκε', + 'admin.oidcOnlyMode': 'Απενεργοποίηση ελέγχου ταυτότητας με κωδικό', + 'admin.oidcOnlyModeHint': 'Όταν είναι ενεργοποιημένο, επιτρέπεται μόνο η σύνδεση SSO. Η σύνδεση και εγγραφή με κωδικό αποκλείονται.', + 'admin.fileTypes': 'Επιτρεπόμενοι Τύποι Αρχείων', + 'admin.fileTypesHint': 'Ρυθμίστε ποιους τύπους αρχείων μπορούν να μεταφορτώνουν οι χρήστες.', + 'admin.fileTypesFormat': 'Επεκτάσεις χωρισμένες με κόμμα (π.χ. jpg,png,pdf,doc). Χρησιμοποιήστε * για να επιτρέπονται όλοι οι τύποι.', + 'admin.fileTypesSaved': 'Οι ρυθμίσεις τύπων αρχείων αποθηκεύτηκαν', + 'admin.placesPhotos.title': 'Φωτογραφίες Τόπων', + 'admin.placesPhotos.subtitle': 'Λήψη φωτογραφιών από το Google Places API. Απενεργοποιήστε για εξοικονόμηση ποσοστώσης API. Οι φωτογραφίες Wikimedia δεν επηρεάζονται.', + 'admin.placesAutocomplete.title': 'Αυτόματη Συμπλήρωση Τόπων', + 'admin.placesAutocomplete.subtitle': 'Χρήση του Google Places API για προτάσεις αναζήτησης. Απενεργοποιήστε για εξοικονόμηση ποσοστώσης API.', + 'admin.placesDetails.title': 'Λεπτομέρειες Τόπου', + 'admin.placesDetails.subtitle': 'Λήψη λεπτομερών πληροφοριών τόπου (ώρες, βαθμολογία, ιστοσελίδα) από το Google Places API. Απενεργοποιήστε για εξοικονόμηση ποσοστώσης API.', + 'admin.bagTracking.title': 'Παρακολούθηση Αποσκευών', + 'admin.bagTracking.subtitle': 'Ενεργοποίηση βάρους και ανάθεσης τσάντας για αντικείμενα πακεταρίσματος', + 'admin.collab.chat.title': 'Συνομιλία', + 'admin.collab.chat.subtitle': 'Μηνύματα πραγματικού χρόνου για συνεργασία ταξιδιού', + 'admin.collab.notes.title': 'Σημειώσεις', + 'admin.collab.notes.subtitle': 'Κοινόχρηστες σημειώσεις και έγγραφα', + 'admin.collab.polls.title': 'Δημοσκοπήσεις', + 'admin.collab.polls.subtitle': 'Ομαδικές δημοσκοπήσεις και ψηφοφορίες', + 'admin.collab.whatsnext.title': 'Τι Ακολουθεί', + 'admin.collab.whatsnext.subtitle': 'Προτάσεις δραστηριοτήτων και επόμενα βήματα', + 'admin.tabs.config': 'Εξατομίκευση', + 'admin.tabs.defaults': 'Προεπιλογές Χρήστη', + 'admin.defaultSettings.title': 'Προεπιλεγμένες Ρυθμίσεις Χρήστη', + 'admin.defaultSettings.description': 'Ορίστε προεπιλογές για όλη την υπηρεσία. Οι χρήστες που δεν έχουν αλλάξει μια ρύθμιση θα βλέπουν αυτές τις τιμές. Οι δικές τους αλλαγές έχουν πάντα προτεραιότητα.', + 'admin.defaultSettings.saved': 'Η προεπιλογή αποθηκεύτηκε', + 'admin.defaultSettings.reset': 'Επαναφορά στην ενσωματωμένη προεπιλογή', + 'admin.defaultSettings.resetToBuiltIn': 'επαναφορά', + 'admin.tabs.templates': 'Πρότυπα Πακεταρίσματος', + 'admin.packingTemplates.title': 'Πρότυπα Πακεταρίσματος', + 'admin.packingTemplates.subtitle': 'Δημιουργήστε επαναχρησιμοποιήσιμες λίστες πακεταρίσματος για τα ταξίδια σας', + 'admin.packingTemplates.create': 'Νέο Πρότυπο', + 'admin.packingTemplates.namePlaceholder': 'Όνομα προτύπου (π.χ. Διακοπές στην Παραλία)', + 'admin.packingTemplates.empty': 'Δεν έχουν δημιουργηθεί πρότυπα ακόμη', + 'admin.packingTemplates.items': 'αντικείμενα', + 'admin.packingTemplates.categories': 'κατηγορίες', + 'admin.packingTemplates.itemName': 'Όνομα αντικειμένου', + 'admin.packingTemplates.itemCategory': 'Κατηγορία', + 'admin.packingTemplates.categoryName': 'Όνομα κατηγορίας (π.χ. Ρούχα)', + 'admin.packingTemplates.addCategory': 'Προσθήκη κατηγορίας', + 'admin.packingTemplates.created': 'Το πρότυπο δημιουργήθηκε', + 'admin.packingTemplates.deleted': 'Το πρότυπο διαγράφηκε', + 'admin.packingTemplates.loadError': 'Αποτυχία φόρτωσης προτύπων', + 'admin.packingTemplates.createError': 'Αποτυχία δημιουργίας προτύπου', + 'admin.packingTemplates.deleteError': 'Αποτυχία διαγραφής προτύπου', + 'admin.packingTemplates.saveError': 'Αποτυχία αποθήκευσης', + 'admin.tabs.addons': 'Πρόσθετα', + 'admin.addons.title': 'Πρόσθετα', + 'admin.addons.subtitle': 'Ενεργοποιήστε ή απενεργοποιήστε λειτουργίες για να εξατομικεύσετε την εμπειρία σας στο TREK.', + 'admin.addons.catalog.packing.name': 'Λίστες', + 'admin.addons.catalog.packing.description': 'Λίστες πακεταρίσματος και εργασίες προς εκτέλεση για τα ταξίδια σας', + 'admin.addons.catalog.budget.name': 'Προϋπολογισμός', + 'admin.addons.catalog.budget.description': 'Παρακολουθήστε τα έξοδα και σχεδιάστε τον προϋπολογισμό του ταξιδιού σας', + 'admin.addons.catalog.documents.name': 'Έγγραφα', + 'admin.addons.catalog.documents.description': 'Αποθηκεύστε και διαχειριστείτε ταξιδιωτικά έγγραφα', + 'admin.addons.catalog.vacay.name': 'Vacay', + 'admin.addons.catalog.vacay.description': 'Προσωπικός σχεδιαστής διακοπών με προβολή ημερολογίου', + 'admin.addons.catalog.atlas.name': 'Atlas', + 'admin.addons.catalog.atlas.description': 'Παγκόσμιος χάρτης με χώρες που έχετε επισκεφθεί και ταξιδιωτικά στατιστικά', + 'admin.addons.catalog.collab.name': 'Collab', + 'admin.addons.catalog.collab.description': 'Σημειώσεις, δημοσκοπήσεις και συνομιλία πραγματικού χρόνου για σχεδιασμό ταξιδιού', + 'admin.addons.catalog.memories.name': 'Φωτογραφίες (Immich)', + 'admin.addons.catalog.memories.description': 'Μοιραστείτε φωτογραφίες ταξιδιού μέσω της δικής σας εγκατάστασης Immich', + 'admin.addons.catalog.mcp.name': 'MCP', + 'admin.addons.catalog.mcp.description': 'Model Context Protocol για ενσωμάτωση βοηθού AI', + 'admin.addons.subtitleBefore': 'Ενεργοποιήστε ή απενεργοποιήστε λειτουργίες για να εξατομικεύσετε την εμπειρία σας στο ', + 'admin.addons.subtitleAfter': '.', + 'admin.addons.enabled': 'Ενεργοποιημένο', + 'admin.addons.disabled': 'Απενεργοποιημένο', + 'admin.addons.type.trip': 'Ταξίδι', + 'admin.addons.type.global': 'Καθολικό', + 'admin.addons.type.integration': 'Ενσωμάτωση', + 'admin.addons.tripHint': 'Διαθέσιμο ως καρτέλα μέσα σε κάθε ταξίδι', + 'admin.addons.globalHint': 'Διαθέσιμο ως αυτόνομη ενότητα στην κύρια πλοήγηση', + 'admin.addons.integrationHint': 'Υπηρεσίες backend και ενσωματώσεις API χωρίς ειδική σελίδα', + 'admin.addons.toast.updated': 'Το πρόσθετο ενημερώθηκε', + 'admin.addons.toast.error': 'Αποτυχία ενημέρωσης προσθέτου', + 'admin.addons.noAddons': 'Δεν υπάρχουν διαθέσιμα πρόσθετα', + 'admin.weather.title': 'Δεδομένα Καιρού', + 'admin.weather.badge': 'Από 24 Μαρτίου 2026', + 'admin.weather.description': 'Το TREK χρησιμοποιεί το Open-Meteo ως πηγή δεδομένων καιρού. Το Open-Meteo είναι μια δωρεάν, ανοιχτού κώδικα υπηρεσία καιρού — δεν απαιτείται κλειδί API.', + 'admin.weather.forecast': 'Πρόγνωση 16 ημερών', + 'admin.weather.forecastDesc': 'Προηγουμένως 5 ημέρες (OpenWeatherMap)', + 'admin.weather.climate': 'Ιστορικά δεδομένα κλίματος', + 'admin.weather.climateDesc': 'Μέσοι όροι από τα τελευταία 85 χρόνια για ημέρες πέρα από την πρόγνωση 16 ημερών', + 'admin.weather.requests': '10.000 αιτήματα / ημέρα', + 'admin.weather.requestsDesc': 'Δωρεάν, δεν απαιτείται κλειδί API', + 'admin.weather.locationHint': 'Ο καιρός βασίζεται στον πρώτο τόπο με συντεταγμένες σε κάθε ημέρα. Αν δεν έχει ανατεθεί τόπος σε μια ημέρα, χρησιμοποιείται ως αναφορά οποιοσδήποτε τόπος από τη λίστα.', + 'admin.tabs.mcpTokens': 'Πρόσβαση MCP', + 'admin.mcpTokens.title': 'Πρόσβαση MCP', + 'admin.mcpTokens.subtitle': 'Διαχείριση συνεδριών OAuth και διακριτικών API για όλους τους χρήστες', + 'admin.mcpTokens.sectionTitle': 'Διακριτικά API', + 'admin.mcpTokens.owner': 'Κάτοχος', + 'admin.mcpTokens.tokenName': 'Όνομα Διακριτικού', + 'admin.mcpTokens.created': 'Δημιουργήθηκε', + 'admin.mcpTokens.lastUsed': 'Τελευταία Χρήση', + 'admin.mcpTokens.never': 'Ποτέ', + 'admin.mcpTokens.empty': 'Δεν έχουν δημιουργηθεί διακριτικά MCP ακόμη', + 'admin.mcpTokens.deleteTitle': 'Διαγραφή Διακριτικού', + 'admin.mcpTokens.deleteMessage': 'Αυτό θα ανακαλέσει το διακριτικό άμεσα. Ο χρήστης θα χάσει την πρόσβαση MCP μέσω αυτού του διακριτικού.', + 'admin.mcpTokens.deleteSuccess': 'Το διακριτικό διαγράφηκε', + 'admin.mcpTokens.deleteError': 'Αποτυχία διαγραφής διακριτικού', + 'admin.mcpTokens.loadError': 'Αποτυχία φόρτωσης διακριτικών', + 'admin.oauthSessions.sectionTitle': 'Συνεδρίες OAuth', + 'admin.oauthSessions.clientName': 'Πελάτης', + 'admin.oauthSessions.owner': 'Κάτοχος', + 'admin.oauthSessions.scopes': 'Scopes', + 'admin.oauthSessions.created': 'Δημιουργήθηκε', + 'admin.oauthSessions.empty': 'Δεν υπάρχουν ενεργές συνεδρίες OAuth', + 'admin.oauthSessions.revokeTitle': 'Ανάκληση Συνεδρίας', + 'admin.oauthSessions.revokeMessage': 'Αυτό θα ανακαλέσει τη συνεδρία OAuth άμεσα. Ο πελάτης θα χάσει την πρόσβαση MCP.', + 'admin.oauthSessions.revokeSuccess': 'Η συνεδρία ανακλήθηκε', + 'admin.oauthSessions.revokeError': 'Αποτυχία ανάκλησης συνεδρίας', + 'admin.oauthSessions.loadError': 'Αποτυχία φόρτωσης συνεδριών OAuth', + 'admin.tabs.github': 'GitHub', + 'admin.audit.subtitle': 'Συμβάντα ασφαλείας και διαχείρισης (αντίγραφα ασφαλείας, χρήστες, MFA, ρυθμίσεις).', + 'admin.audit.empty': 'Δεν υπάρχουν εγγραφές ελέγχου ακόμη.', + 'admin.audit.refresh': 'Ανανέωση', + 'admin.audit.loadMore': 'Φόρτωση περισσότερων', + 'admin.audit.showing': '{count} φορτώθηκαν · {total} σύνολο', + 'admin.audit.col.time': 'Ώρα', + 'admin.audit.col.user': 'Χρήστης', + 'admin.audit.col.action': 'Ενέργεια', + 'admin.audit.col.resource': 'Πόρος', + 'admin.audit.col.ip': 'IP', + 'admin.audit.col.details': 'Λεπτομέρειες', + 'admin.github.title': 'Ιστορικό Εκδόσεων', + 'admin.github.subtitle': 'Τελευταίες ενημερώσεις από {repo}', + 'admin.github.latest': 'Τελευταία', + 'admin.github.prerelease': 'Προ-έκδοση', + 'admin.github.showDetails': 'Εμφάνιση λεπτομερειών', + 'admin.github.hideDetails': 'Απόκρυψη λεπτομερειών', + 'admin.github.loadMore': 'Φόρτωση περισσότερων', + 'admin.github.loading': 'Φόρτωση...', + 'admin.github.error': 'Αποτυχία φόρτωσης εκδόσεων', + 'admin.github.by': 'από', + 'admin.github.support': 'Βοηθά να συνεχίσω την ανάπτυξη του TREK', + 'admin.update.available': 'Διαθέσιμη ενημέρωση', + 'admin.update.text': 'Το TREK {version} είναι διαθέσιμο. Εκτελείτε το {current}.', + 'admin.update.button': 'Προβολή στο GitHub', + 'admin.update.install': 'Εγκατάσταση Ενημέρωσης', + 'admin.update.confirmTitle': 'Εγκατάσταση Ενημέρωσης;', + 'admin.update.confirmText': 'Το TREK θα ενημερωθεί από {current} σε {version}. Ο server θα επανεκκινήσει αυτόματα στη συνέχεια.', + 'admin.update.dataInfo': 'Όλα τα δεδομένα σας (ταξίδια, χρήστες, κλειδιά API, μεταφορτώσεις, Vacay, Atlas, προϋπολογισμοί) θα διατηρηθούν.', + 'admin.update.warning': 'Η εφαρμογή θα είναι σύντομα μη διαθέσιμη κατά την επανεκκίνηση.', + 'admin.update.confirm': 'Ενημέρωση Τώρα', + 'admin.update.installing': 'Ενημέρωση…', + 'admin.update.success': 'Η ενημέρωση εγκαταστάθηκε! Ο server επανεκκινεί…', + 'admin.update.failed': 'Η ενημέρωση απέτυχε', + 'admin.update.backupHint': 'Συνιστούμε να δημιουργήσετε ένα αντίγραφο ασφαλείας πριν την ενημέρωση.', + 'admin.update.backupLink': 'Μετάβαση στο Αντίγραφο Ασφαλείας', + 'admin.update.howTo': 'Πώς να Ενημερώσετε', + 'admin.update.dockerText': 'Η εγκατάστασή σας TREK εκτελείται σε Docker. Για να ενημερωθείτε στο {version}, εκτελέστε τις ακόλουθες εντολές στον server σας:', + 'admin.update.reloadHint': 'Παρακαλώ ανανεώστε τη σελίδα σε λίγα δευτερόλεπτα.', + 'admin.tabs.permissions': 'Δικαιώματα', + 'admin.addons.catalog.journey.name': 'Ταξίδι', + 'admin.addons.catalog.journey.description': 'Παρακολούθηση ταξιδιών & ημερολόγιο ταξιδιών με αφίξεις, φωτογραφίες και καθημερινές ιστορίες', +}; +export default admin; diff --git a/shared/src/i18n/gr/airport.ts b/shared/src/i18n/gr/airport.ts new file mode 100644 index 00000000..482d431d --- /dev/null +++ b/shared/src/i18n/gr/airport.ts @@ -0,0 +1,6 @@ +import type { TranslationStrings } from '../types'; + +const airport: TranslationStrings = { + 'airport.searchPlaceholder': 'Κωδικός αεροδρομίου ή πόλη (π.χ. FRA)', +}; +export default airport; diff --git a/shared/src/i18n/gr/atlas.ts b/shared/src/i18n/gr/atlas.ts new file mode 100644 index 00000000..079460ec --- /dev/null +++ b/shared/src/i18n/gr/atlas.ts @@ -0,0 +1,58 @@ +import type { TranslationStrings } from '../types'; + +const atlas: TranslationStrings = { + 'atlas.subtitle': 'Το ταξιδιωτικό σας αποτύπωμα σε όλο τον κόσμο', + 'atlas.countries': 'Χώρες', + 'atlas.trips': 'Ταξίδια', + 'atlas.places': 'Μέρη', + 'atlas.unmark': 'Αφαίρεση', + 'atlas.confirmMark': 'Σήμανση αυτής της χώρας ως επισκεφθείσας;', + 'atlas.confirmUnmark': 'Αφαίρεση αυτής της χώρας από τη λίστα επισκεφθέντων;', + 'atlas.confirmUnmarkRegion': 'Αφαίρεση αυτής της περιοχής από τη λίστα επισκεφθέντων;', + 'atlas.markVisited': 'Σήμανση ως επισκεφθείσα', + 'atlas.markVisitedHint': 'Προσθέστε αυτή τη χώρα στη λίστα επισκεφθέντων', + 'atlas.markRegionVisitedHint': 'Προσθέστε αυτή την περιοχή στη λίστα επισκεφθέντων', + 'atlas.addToBucket': 'Προσθήκη στη λίστα επιθυμιών', + 'atlas.addPoi': 'Προσθήκη μέρους', + 'atlas.searchCountry': 'Αναζήτηση χώρας...', + 'atlas.bucketNamePlaceholder': 'Όνομα (χώρα, πόλη, μέρος...)', + 'atlas.month': 'Μήνας', + 'atlas.year': 'Έτος', + 'atlas.addToBucketHint': 'Αποθηκεύστε ως μέρος που θέλετε να επισκεφθείτε', + 'atlas.bucketWhen': 'Πότε σκοπεύετε να το επισκεφθείτε;', + 'atlas.statsTab': 'Στατιστικά', + 'atlas.bucketTab': 'Λίστα Επιθυμιών', + 'atlas.addBucket': 'Προσθήκη στη λίστα επιθυμιών', + 'atlas.bucketNotesPlaceholder': 'Σημειώσεις (προαιρετικό)', + 'atlas.bucketEmpty': 'Η λίστα επιθυμιών σας είναι κενή', + 'atlas.bucketEmptyHint': 'Προσθέστε μέρη που ονειρεύεστε να επισκεφθείτε', + 'atlas.days': 'Ημέρες', + 'atlas.visitedCountries': 'Επισκεφθείσες Χώρες', + 'atlas.cities': 'Πόλεις', + 'atlas.noData': 'Δεν υπάρχουν ταξιδιωτικά δεδομένα ακόμη', + 'atlas.noDataHint': 'Δημιουργήστε ένα ταξίδι και προσθέστε μέρη για να δείτε τον παγκόσμιο χάρτη σας', + 'atlas.lastTrip': 'Τελευταίο ταξίδι', + 'atlas.nextTrip': 'Επόμενο ταξίδι', + 'atlas.daysLeft': 'ημέρες απομένουν', + 'atlas.streak': 'Σερί', + 'atlas.years': 'έτη', + 'atlas.yearInRow': 'έτος στη σειρά', + 'atlas.yearsInRow': 'έτη στη σειρά', + 'atlas.tripIn': 'ταξίδι σε', + 'atlas.tripsIn': 'ταξίδια σε', + 'atlas.since': 'από', + 'atlas.europe': 'Ευρώπη', + 'atlas.asia': 'Ασία', + 'atlas.northAmerica': 'Β. Αμερική', + 'atlas.southAmerica': 'Ν. Αμερική', + 'atlas.africa': 'Αφρική', + 'atlas.oceania': 'Ωκεανία', + 'atlas.other': 'Άλλο', + 'atlas.firstVisit': 'Πρώτο ταξίδι', + 'atlas.lastVisitLabel': 'Τελευταίο ταξίδι', + 'atlas.tripSingular': 'Ταξίδι', + 'atlas.tripPlural': 'Ταξίδια', + 'atlas.placeVisited': 'Μέρος που επισκεφθήκατε', + 'atlas.placesVisited': 'Μέρη που επισκεφθήκατε', +}; +export default atlas; diff --git a/shared/src/i18n/gr/backup.ts b/shared/src/i18n/gr/backup.ts new file mode 100644 index 00000000..cd2ac05a --- /dev/null +++ b/shared/src/i18n/gr/backup.ts @@ -0,0 +1,70 @@ +import type { TranslationStrings } from '../types'; + +const backup: TranslationStrings = { + 'backup.title': 'Αντίγραφο Ασφαλείας Δεδομένων', + 'backup.subtitle': 'Βάση δεδομένων και όλα τα μεταφορτωμένα αρχεία', + 'backup.refresh': 'Ανανέωση', + 'backup.upload': 'Μεταφόρτωση Αντιγράφου', + 'backup.uploading': 'Μεταφόρτωση…', + 'backup.create': 'Δημιουργία Αντιγράφου', + 'backup.creating': 'Δημιουργία…', + 'backup.empty': 'Δεν υπάρχουν αντίγραφα ασφαλείας ακόμη', + 'backup.createFirst': 'Δημιουργία πρώτου αντιγράφου', + 'backup.download': 'Λήψη', + 'backup.restore': 'Επαναφορά', + 'backup.confirm.restore': 'Επαναφορά αντιγράφου "{name}";\n\nΌλα τα τρέχοντα δεδομένα θα αντικατασταθούν με το αντίγραφο.', + 'backup.confirm.uploadRestore': 'Μεταφόρτωση και επαναφορά αρχείου αντιγράφου "{name}";\n\nΌλα τα τρέχοντα δεδομένα θα αντικατασταθούν.', + 'backup.confirm.delete': 'Διαγραφή αντιγράφου "{name}";', + 'backup.toast.loadError': 'Αποτυχία φόρτωσης αντιγράφων', + 'backup.toast.created': 'Το αντίγραφο δημιουργήθηκε επιτυχώς', + 'backup.toast.createError': 'Αποτυχία δημιουργίας αντιγράφου', + 'backup.toast.restored': 'Το αντίγραφο επαναφέρθηκε. Η σελίδα θα επαναφορτωθεί…', + 'backup.toast.restoreError': 'Αποτυχία επαναφοράς', + 'backup.toast.uploadError': 'Αποτυχία μεταφόρτωσης', + 'backup.toast.deleted': 'Το αντίγραφο διαγράφηκε', + 'backup.toast.deleteError': 'Αποτυχία διαγραφής', + 'backup.toast.downloadError': 'Η λήψη απέτυχε', + 'backup.toast.settingsSaved': 'Οι ρυθμίσεις αυτόματου αντιγράφου αποθηκεύτηκαν', + 'backup.toast.settingsError': 'Αποτυχία αποθήκευσης ρυθμίσεων', + 'backup.auto.title': 'Αυτόματο Αντίγραφο', + 'backup.auto.subtitle': 'Αυτόματο αντίγραφο ασφαλείας με χρονοπρόγραμμα', + 'backup.auto.enable': 'Ενεργοποίηση αυτόματου αντιγράφου', + 'backup.auto.enableHint': 'Τα αντίγραφα θα δημιουργούνται αυτόματα στο επιλεγμένο χρονοπρόγραμμα', + 'backup.auto.interval': 'Διάστημα', + 'backup.auto.hour': 'Εκτέλεση την ώρα', + 'backup.auto.hourHint': 'Τοπική ώρα διακομιστή (μορφή {format})', + 'backup.auto.dayOfWeek': 'Ημέρα εβδομάδας', + 'backup.auto.dayOfMonth': 'Ημέρα μήνα', + 'backup.auto.dayOfMonthHint': 'Περιορίζεται σε 1–28 για συμβατότητα με όλους τους μήνες', + 'backup.auto.scheduleSummary': 'Χρονοπρόγραμμα', + 'backup.auto.summaryDaily': 'Κάθε ημέρα στις {hour}:00', + 'backup.auto.summaryWeekly': 'Κάθε {day} στις {hour}:00', + 'backup.auto.summaryMonthly': 'Ημέρα {day} κάθε μήνα στις {hour}:00', + 'backup.auto.envLocked': 'Docker', + 'backup.auto.envLockedHint': 'Το αυτόματο αντίγραφο είναι ρυθμισμένο μέσω μεταβλητών περιβάλλοντος Docker. Για να αλλάξετε αυτές τις ρυθμίσεις, ενημερώστε το docker-compose.yml και επανεκκινήστε το container.', + 'backup.auto.copyEnv': 'Αντιγραφή μεταβλητών Docker', + 'backup.auto.envCopied': 'Οι μεταβλητές Docker αντιγράφηκαν στο πρόχειρο', + 'backup.auto.keepLabel': 'Διαγραφή παλιών αντιγράφων μετά από', + 'backup.dow.sunday': 'Κυρ', + 'backup.dow.monday': 'Δευ', + 'backup.dow.tuesday': 'Τρι', + 'backup.dow.wednesday': 'Τετ', + 'backup.dow.thursday': 'Πεμ', + 'backup.dow.friday': 'Παρ', + 'backup.dow.saturday': 'Σαβ', + 'backup.interval.hourly': 'Ωριαία', + 'backup.interval.daily': 'Ημερήσια', + 'backup.interval.weekly': 'Εβδομαδιαία', + 'backup.interval.monthly': 'Μηνιαία', + 'backup.keep.1day': '1 ημέρα', + 'backup.keep.3days': '3 ημέρες', + 'backup.keep.7days': '7 ημέρες', + 'backup.keep.14days': '14 ημέρες', + 'backup.keep.30days': '30 ημέρες', + 'backup.keep.forever': 'Διατήρηση για πάντα', + 'backup.restoreConfirmTitle': 'Επαναφορά Αντιγράφου;', + 'backup.restoreWarning': 'Όλα τα τρέχοντα δεδομένα (ταξίδια, τοποθεσίες, χρήστες, μεταφορτώσεις) θα αντικατασταθούν μόνιμα με το αντίγραφο. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.', + 'backup.restoreTip': 'Συμβουλή: Δημιουργήστε ένα αντίγραφο της τρέχουσας κατάστασης πριν την επαναφορά.', + 'backup.restoreConfirm': 'Ναι, επαναφορά', +}; +export default backup; diff --git a/shared/src/i18n/gr/budget.ts b/shared/src/i18n/gr/budget.ts new file mode 100644 index 00000000..a48afff6 --- /dev/null +++ b/shared/src/i18n/gr/budget.ts @@ -0,0 +1,40 @@ +import type { TranslationStrings } from '../types'; + +const budget: TranslationStrings = { + 'budget.title': 'Προϋπολογισμός', + 'budget.exportCsv': 'Εξαγωγή CSV', + 'budget.emptyTitle': 'Δεν έχει δημιουργηθεί προϋπολογισμός ακόμη', + 'budget.emptyText': 'Δημιουργήστε κατηγορίες και εγγραφές για να σχεδιάσετε τον ταξιδιωτικό σας προϋπολογισμό', + 'budget.emptyPlaceholder': 'Εισαγάγετε όνομα κατηγορίας...', + 'budget.createCategory': 'Δημιουργία Κατηγορίας', + 'budget.category': 'Κατηγορία', + 'budget.categoryName': 'Όνομα Κατηγορίας', + 'budget.table.name': 'Όνομα', + 'budget.table.total': 'Σύνολο', + 'budget.table.persons': 'Άτομα', + 'budget.table.days': 'Ημέρες', + 'budget.table.perPerson': 'Ανά Άτομο', + 'budget.table.perDay': 'Ανά Ημέρα', + 'budget.table.perPersonDay': 'Α.Α. / Ημέρα', + 'budget.table.note': 'Σημείωση', + 'budget.table.date': 'Ημερομηνία', + 'budget.newEntry': 'Νέα Εγγραφή', + 'budget.defaultEntry': 'Νέα Εγγραφή', + 'budget.defaultCategory': 'Νέα Κατηγορία', + 'budget.total': 'Σύνολο', + 'budget.totalBudget': 'Συνολικός Προϋπολογισμός', + 'budget.byCategory': 'Ανά Κατηγορία', + 'budget.editTooltip': 'Κάντε κλικ για επεξεργασία', + 'budget.linkedToReservation': 'Συνδεδεμένο με κράτηση — επεξεργαστείτε το όνομα εκεί', + 'budget.confirm.deleteCategory': 'Είστε σίγουροι ότι θέλετε να διαγράψετε την κατηγορία "{name}" με {count} εγγραφές;', + 'budget.deleteCategory': 'Διαγραφή Κατηγορίας', + 'budget.perPerson': 'Ανά Άτομο', + 'budget.paid': 'Πληρωμένο', + 'budget.open': 'Ανοιχτό', + 'budget.noMembers': 'Δεν έχουν ανατεθεί μέλη', + 'budget.settlement': 'Εκκαθάριση', + 'budget.settlementInfo': 'Κάντε κλικ στο avatar ενός μέλους σε μια εγγραφή προϋπολογισμού για να το επισημάνετε πράσινο — αυτό σημαίνει ότι πλήρωσε. Η εκκαθάριση δείχνει στη συνέχεια ποιος χρωστάει σε ποιον και πόσα.', + 'budget.netBalances': 'Καθαρά Υπόλοιπα', + 'budget.categoriesLabel': 'κατηγορίες', +}; +export default budget; diff --git a/shared/src/i18n/gr/categories.ts b/shared/src/i18n/gr/categories.ts new file mode 100644 index 00000000..bb560581 --- /dev/null +++ b/shared/src/i18n/gr/categories.ts @@ -0,0 +1,25 @@ +import type { TranslationStrings } from '../types'; + +const categories: TranslationStrings = { + 'categories.title': 'Κατηγορίες', + 'categories.subtitle': 'Διαχείριση κατηγοριών για τοποθεσίες', + 'categories.new': 'Νέα Κατηγορία', + 'categories.empty': 'Δεν υπάρχουν κατηγορίες ακόμη', + 'categories.namePlaceholder': 'Όνομα κατηγορίας', + 'categories.icon': 'Εικονίδιο', + 'categories.color': 'Χρώμα', + 'categories.customColor': 'Επιλογή προσαρμοσμένου χρώματος', + 'categories.preview': 'Προεπισκόπηση', + 'categories.defaultName': 'Κατηγορία', + 'categories.update': 'Ενημέρωση', + 'categories.create': 'Δημιουργία', + 'categories.confirm.delete': 'Διαγραφή κατηγορίας; Οι τοποθεσίες σε αυτή την κατηγορία δεν θα διαγραφούν.', + 'categories.toast.loadError': 'Αποτυχία φόρτωσης κατηγοριών', + 'categories.toast.nameRequired': 'Παρακαλώ εισάγετε όνομα', + 'categories.toast.updated': 'Η κατηγορία ενημερώθηκε', + 'categories.toast.created': 'Η κατηγορία δημιουργήθηκε', + 'categories.toast.saveError': 'Αποτυχία αποθήκευσης', + 'categories.toast.deleted': 'Η κατηγορία διαγράφηκε', + 'categories.toast.deleteError': 'Αποτυχία διαγραφής', +}; +export default categories; diff --git a/shared/src/i18n/gr/collab.ts b/shared/src/i18n/gr/collab.ts new file mode 100644 index 00000000..3c73b7f0 --- /dev/null +++ b/shared/src/i18n/gr/collab.ts @@ -0,0 +1,73 @@ +import type { TranslationStrings } from '../types'; + +const collab: TranslationStrings = { + 'collab.tabs.chat': 'Συνομιλία', + 'collab.tabs.notes': 'Σημειώσεις', + 'collab.tabs.polls': 'Δημοσκοπήσεις', + 'collab.whatsNext.title': 'Τι Επόμενο', + 'collab.whatsNext.today': 'Σήμερα', + 'collab.whatsNext.tomorrow': 'Αύριο', + 'collab.whatsNext.empty': 'Καμία επερχόμενη δραστηριότητα', + 'collab.whatsNext.until': 'έως', + 'collab.whatsNext.emptyHint': 'Οι δραστηριότητες με ώρες θα εμφανίζονται εδώ', + 'collab.chat.send': 'Αποστολή', + 'collab.chat.placeholder': 'Πληκτρολογήστε ένα μήνυμα...', + 'collab.chat.empty': 'Ξεκινήστε τη συζήτηση', + 'collab.chat.emptyHint': 'Τα μηνύματα κοινοποιούνται σε όλα τα μέλη του ταξιδιού', + 'collab.chat.emptyDesc': 'Μοιραστείτε ιδέες, σχέδια και ενημερώσεις με την ταξιδιωτική σας ομάδα', + 'collab.chat.today': 'Σήμερα', + 'collab.chat.yesterday': 'Χθες', + 'collab.chat.deletedMessage': 'διέγραψε ένα μήνυμα', + 'collab.chat.reply': 'Απάντηση', + 'collab.chat.loadMore': 'Φόρτωση παλαιότερων μηνυμάτων', + 'collab.chat.justNow': 'μόλις τώρα', + 'collab.chat.minutesAgo': '{n}λ πριν', + 'collab.chat.hoursAgo': '{n}ω πριν', + 'collab.notes.title': 'Σημειώσεις', + 'collab.notes.new': 'Νέα Σημείωση', + 'collab.notes.empty': 'Δεν υπάρχουν σημειώσεις ακόμη', + 'collab.notes.emptyHint': 'Ξεκινήστε να καταγράφετε ιδέες και σχέδια', + 'collab.notes.all': 'Όλες', + 'collab.notes.titlePlaceholder': 'Τίτλος σημείωσης', + 'collab.notes.contentPlaceholder': 'Γράψτε κάτι...', + 'collab.notes.categoryPlaceholder': 'Κατηγορία', + 'collab.notes.newCategory': 'Νέα κατηγορία...', + 'collab.notes.category': 'Κατηγορία', + 'collab.notes.noCategory': 'Χωρίς κατηγορία', + 'collab.notes.color': 'Χρώμα', + 'collab.notes.save': 'Αποθήκευση', + 'collab.notes.cancel': 'Ακύρωση', + 'collab.notes.edit': 'Επεξεργασία', + 'collab.notes.delete': 'Διαγραφή', + 'collab.notes.pin': 'Καρφίτσωμα', + 'collab.notes.unpin': 'Ξεκαρφίτσωμα', + 'collab.notes.daysAgo': '{n}η πριν', + 'collab.notes.categorySettings': 'Διαχείριση Κατηγοριών', + 'collab.notes.create': 'Δημιουργία', + 'collab.notes.website': 'Ιστότοπος', + 'collab.notes.websitePlaceholder': 'https://...', + 'collab.notes.attachFiles': 'Επισύναψη αρχείων', + 'collab.notes.noCategoriesYet': 'Δεν υπάρχουν κατηγορίες ακόμη', + 'collab.notes.emptyDesc': 'Δημιουργήστε μια σημείωση για να ξεκινήσετε', + 'collab.polls.title': 'Δημοσκοπήσεις', + 'collab.polls.new': 'Νέα Δημοσκόπηση', + 'collab.polls.empty': 'Δεν υπάρχουν δημοσκοπήσεις ακόμη', + 'collab.polls.emptyHint': 'Ρωτήστε την ομάδα και ψηφίστε μαζί', + 'collab.polls.question': 'Ερώτηση', + 'collab.polls.questionPlaceholder': 'Τι πρέπει να κάνουμε;', + 'collab.polls.addOption': '+ Προσθήκη επιλογής', + 'collab.polls.optionPlaceholder': 'Επιλογή {n}', + 'collab.polls.create': 'Δημιουργία Δημοσκόπησης', + 'collab.polls.close': 'Κλείσιμο', + 'collab.polls.closed': 'Κλειστή', + 'collab.polls.votes': '{n} ψήφοι', + 'collab.polls.vote': '{n} ψήφος', + 'collab.polls.multipleChoice': 'Πολλαπλή επιλογή', + 'collab.polls.multiChoice': 'Πολλαπλή επιλογή', + 'collab.polls.deadline': 'Προθεσμία', + 'collab.polls.option': 'Επιλογή', + 'collab.polls.options': 'Επιλογές', + 'collab.polls.delete': 'Διαγραφή', + 'collab.polls.closedSection': 'Κλειστές', +}; +export default collab; diff --git a/shared/src/i18n/gr/common.ts b/shared/src/i18n/gr/common.ts new file mode 100644 index 00000000..6552c9cf --- /dev/null +++ b/shared/src/i18n/gr/common.ts @@ -0,0 +1,54 @@ +import type { TranslationStrings } from '../types'; + +const common: TranslationStrings = { + 'common.save': 'Αποθήκευση', + 'common.showMore': 'Εμφάνιση περισσότερων', + 'common.showLess': 'Εμφάνιση λιγότερων', + 'common.cancel': 'Ακύρωση', + 'common.clear': 'Εκκαθάριση', + 'common.delete': 'Διαγραφή', + 'common.edit': 'Επεξεργασία', + 'common.add': 'Προσθήκη', + 'common.loading': 'Φόρτωση...', + 'common.import': 'Εισαγωγή', + 'common.select': 'Επιλογή', + 'common.selectAll': 'Επιλογή όλων', + 'common.deselectAll': 'Απο-επιλογή όλων', + 'common.error': 'Σφάλμα', + 'common.unknownError': 'Άγνωστο σφάλμα', + 'common.tooManyAttempts': 'Πολλαπλές προσπάθειες. Παρακαλώ δοκιμάστε αργότερα.', + 'common.back': 'Πίσω', + 'common.all': 'Όλα', + 'common.close': 'Κλείσιμο', + 'common.open': 'Άνοιγμα', + 'common.upload': 'Μεταφόρτωση', + 'common.search': 'Αναζήτηση', + 'common.confirm': 'Επιβεβαίωση', + 'common.ok': 'OK', + 'common.yes': 'Ναι', + 'common.no': 'Όχι', + 'common.or': 'ή', + 'common.none': 'Κανένα', + 'common.date': 'Ημερομηνία', + 'common.rename': 'Μετονομασία', + 'common.discardChanges': 'Απόρριψη αλλαγών', + 'common.discard': 'Απόρριψη', + 'common.name': 'Όνομα', + 'common.email': 'Email', + 'common.password': 'Κωδικός', + 'common.saving': 'Αποθήκευση...', + 'common.justNow': 'Μόλις τώρα', + 'common.hoursAgo': '{count} ώρες πρίν', + 'common.daysAgo': '{count} μέρες πρίν', + 'common.saved': 'Αποθηκεύτηκε', + 'common.update': 'Ενημέρωση', + 'common.change': 'Αλλαγή', + 'common.uploading': 'Μεταφόρτωση...', + 'common.backToPlanning': 'Πίσω στον Σχεδιασμό', + 'common.reset': 'Επαναφορά', + 'common.expand': 'Επέκταση', + 'common.collapse': 'Σύμπτυξη', + 'common.copy': 'Αντιγραφή', + 'common.copied': 'Αντιγράφηκε', +}; +export default common; diff --git a/shared/src/i18n/gr/dashboard.ts b/shared/src/i18n/gr/dashboard.ts new file mode 100644 index 00000000..3f9b0643 --- /dev/null +++ b/shared/src/i18n/gr/dashboard.ts @@ -0,0 +1,117 @@ +import type { TranslationStrings } from '../types'; + +const dashboard: TranslationStrings = { + 'dashboard.title': 'Τα Ταξίδια μου', + 'dashboard.subtitle.loading': 'Φόρτωση των ταξιδιών...', + 'dashboard.subtitle.trips': '{count} ταξίδια ({archived} αρχειοθετημένα)', + 'dashboard.subtitle.empty': 'Ξεκινήστε το πρώτο σας ταξίδι', + 'dashboard.subtitle.activeOne': '{count} ενεργό ταξίδι', + 'dashboard.subtitle.activeMany': '{count} ενεργά ταξίδια', + 'dashboard.subtitle.archivedSuffix': ' · {count} αρχειοθετημένα', + 'dashboard.newTrip': 'Νέο Ταξίδι', + 'dashboard.gridView': 'Προβολή στοιχείων', + 'dashboard.listView': 'Προβολή λίστας', + 'dashboard.currency': 'Συνάλλαγμα', + 'dashboard.timezone': 'Ζώνες ώρας', + 'dashboard.localTime': 'Τοπική', + 'dashboard.timezoneCustomTitle': 'Προσαρμοσμένη Ζώνη ώρας', + 'dashboard.timezoneCustomLabelPlaceholder': 'Επιθετικό (προαιρετικό)', + 'dashboard.timezoneCustomTzPlaceholder': 'π.χ. Αμερική/Νέα Υόρκη', + 'dashboard.timezoneCustomAdd': 'Προσθήκη', + 'dashboard.timezoneCustomErrorEmpty': 'Εισάγετε μια ζώνη ώρας', + 'dashboard.timezoneCustomErrorInvalid': 'Μη έγκυρη ζώνη ώρας. Χρησιμοποιήστε την μορφή π.χ. Europe/Berlin', + 'dashboard.timezoneCustomErrorDuplicate': 'Έχει προστεθεί ήδη', + 'dashboard.emptyTitle': 'Δεν υπάρχουν ταξίδια ακόμη', + 'dashboard.emptyText': 'Δημιουργήστε το πρώτο σας ταξίδι και ξεκινήστε τα σχέδια!', + 'dashboard.emptyButton': 'Δημιουργία Πρώτου Ταξίδιου', + 'dashboard.nextTrip': 'Επόμενο Ταξίδι', + 'dashboard.shared': 'Κοινοποιημένο', + 'dashboard.sharedBy': 'Κοινοποιήθηκε από {name}', + 'dashboard.days': 'Ημέρες', + 'dashboard.places': 'Τόποι', + 'dashboard.members': 'Μέλη', + 'dashboard.archive': 'Αρχειοθήκευση', + 'dashboard.copyTrip': 'Αντιγραφή', + 'dashboard.copySuffix': 'αντιγραφή', + 'dashboard.restore': 'Επαναφορά', + 'dashboard.archived': 'Αρχειοθετημένο', + 'dashboard.status.ongoing': 'Τρέχων', + 'dashboard.status.today': 'Σήμερα', + 'dashboard.status.tomorrow': 'Αύριο', + 'dashboard.status.past': 'Παρελθόν', + 'dashboard.status.daysLeft': '{count} μέρες έμειναν', + 'dashboard.toast.loadError': 'Αποτυχία φόρτωσης ταξιδιών', + 'dashboard.toast.created': 'Ταξίδι δημιουργήθηκε επιτυχώς!', + 'dashboard.toast.createError': 'Αποτυχία δημιουργίας ταξιδιού', + 'dashboard.toast.updated': 'Ταξίδι ενημερώθηκε!', + 'dashboard.toast.updateError': 'Αποτυχία ενημέρωσης ταξιδιού', + 'dashboard.toast.deleted': 'Ταξίδι διαγράφηκε', + 'dashboard.toast.deleteError': 'Αποτυχία διαγραφής ταξιδιού', + 'dashboard.toast.archived': 'Ταξίδι αρχειοθετήθηκε', + 'dashboard.toast.archiveError': 'Αποτυχία αρχειοθήκευσης ταξιδιού', + 'dashboard.toast.restored': 'Ταξίδι επαναφέρθηκε', + 'dashboard.toast.restoreError': 'Αποτυχία επαναφοράς ταξιδιού', + 'dashboard.toast.copied': 'Ταξίδι αντιγράφηκε!', + 'dashboard.toast.copyError': 'Αποτυχία αντιγραφής ταξιδιού', + 'dashboard.confirm.delete': 'Διαγραφή ταξιδιού "{title}"; Όλα τα τόποι και τα σχέδια θα διαγραφούν επίσης.', + 'dashboard.confirm.copy.title': 'Αντιγραφή αυτού του ταξιδιού;', + 'dashboard.confirm.copy.willCopy': 'Θα αντιγραφεί', + 'dashboard.confirm.copy.will1': 'Μέρες, μέρη και σχέδια μέρας', + 'dashboard.confirm.copy.will2': 'Καταλύματα και κρατήσεις', + 'dashboard.confirm.copy.will3': 'Αντικείμενα budget και σειρά κατηγορίας', + 'dashboard.confirm.copy.will4': 'Λίστα πακεταρίσματος (Μη ελεγμένα)', + 'dashboard.confirm.copy.will5': 'TODOs (Μη ορισμένα & Μη ελεγμένα)', + 'dashboard.confirm.copy.will6': 'Σημειώσεις μέρας', + 'dashboard.confirm.copy.wontCopy': 'Δεν θα αντιγραφούν', + 'dashboard.confirm.copy.wont1': 'Συνεργάτες & αναθέσεις μελών', + 'dashboard.confirm.copy.wont2': 'Σημειώσεις συνεργασίας, ψηφοφορίες & μηνύματα', + 'dashboard.confirm.copy.wont3': 'Αρχεία & φωτογραφίες', + 'dashboard.confirm.copy.wont4': 'Σύνδεσμοι διαμοιρασμού', + 'dashboard.confirm.copy.confirm': 'Αντιγραφή ταξιδιού', + 'dashboard.editTrip': 'Επεξεργασία Ταξιδιού', + 'dashboard.createTrip': 'Δημιουργία Νέου Ταξιδιού', + 'dashboard.tripTitle': 'Τίτλος', + 'dashboard.tripTitlePlaceholder': 'π.χ. Καλοκαίρι στην Ιαπωνία', + 'dashboard.tripDescription': 'Περιγραφή', + 'dashboard.tripDescriptionPlaceholder': 'Σχετικά με τι είναι αυτό το ταξίδι;', + 'dashboard.startDate': 'Ημερομηνία Έναρξης', + 'dashboard.endDate': 'Ημερομηνία Λήξης', + 'dashboard.dayCount': 'Αριθμός Ημερών', + 'dashboard.dayCountHint': 'Πόσες ημέρες να σχεδιαστούν όταν δεν έχουν οριστεί ημερομηνίες ταξιδιού.', + 'dashboard.noDateHint': 'Δεν έχει οριστεί ημερομηνία — θα δημιουργηθούν 7 προεπιλεγμένες ημέρες. Μπορείτε να το αλλάξετε οποτεδήποτε.', + 'dashboard.coverImage': 'Εικόνα Εξωφύλλου', + 'dashboard.addCoverImage': 'Προσθήκη εικόνας εξωφύλλου (ή σύρετε & αποθέστε)', + 'dashboard.addMembers': 'Συνταξιδιώτες', + 'dashboard.addMember': 'Προσθήκη μέλους', + 'dashboard.coverSaved': 'Η εικόνα εξωφύλλου αποθηκεύτηκε', + 'dashboard.coverUploadError': 'Αποτυχία μεταφόρτωσης', + 'dashboard.coverRemoveError': 'Αποτυχία αφαίρεσης', + 'dashboard.titleRequired': 'Ο τίτλος είναι υποχρεωτικός', + 'dashboard.endDateError': 'Η ημερομηνία λήξης πρέπει να είναι μετά την ημερομηνία έναρξης', + 'dashboard.greeting.morning': 'Καλημέρα,', + 'dashboard.greeting.afternoon': 'Καλό απόγευμα,', + 'dashboard.greeting.evening': 'Καλησπέρα,', + 'dashboard.mobile.liveNow': 'Ζωντανά Τώρα', + 'dashboard.mobile.tripProgress': 'Πρόοδος ταξιδιού', + 'dashboard.mobile.daysLeft': '{count} ημέρες ακόμα', + 'dashboard.mobile.places': 'Τοποθεσίες', + 'dashboard.mobile.buddies': 'Συνταξιδιώτες', + 'dashboard.mobile.newTrip': 'Νέο Ταξίδι', + 'dashboard.mobile.currency': 'Νόμισμα', + 'dashboard.mobile.timezone': 'Ζώνη ώρας', + 'dashboard.mobile.upcomingTrips': 'Επερχόμενα Ταξίδια', + 'dashboard.mobile.yourTrips': 'Τα Ταξίδια σας', + 'dashboard.mobile.trips': 'ταξίδια', + 'dashboard.mobile.starts': 'Ξεκινά', + 'dashboard.mobile.duration': 'Διάρκεια', + 'dashboard.mobile.day': 'ημέρα', + 'dashboard.mobile.days': 'ημέρες', + 'dashboard.mobile.ongoing': 'Σε εξέλιξη', + 'dashboard.mobile.startsToday': 'Ξεκινά σήμερα', + 'dashboard.mobile.tomorrow': 'Αύριο', + 'dashboard.mobile.inDays': 'Σε {count} ημέρες', + 'dashboard.mobile.inMonths': 'Σε {count} μήνες', + 'dashboard.mobile.completed': 'Ολοκληρώθηκε', + 'dashboard.mobile.currencyConverter': 'Μετατροπέας Νομισμάτων', +}; +export default dashboard; diff --git a/shared/src/i18n/gr/day.ts b/shared/src/i18n/gr/day.ts new file mode 100644 index 00000000..92b8040e --- /dev/null +++ b/shared/src/i18n/gr/day.ts @@ -0,0 +1,25 @@ +import type { TranslationStrings } from '../types'; + +const day: TranslationStrings = { + 'day.precipProb': 'Πιθανότητα βροχής', + 'day.precipitation': 'Κατακρημνίσματα', + 'day.wind': 'Άνεμος', + 'day.sunrise': 'Ανατολή', + 'day.sunset': 'Δύση', + 'day.hourlyForecast': 'Ωριαία Πρόγνωση', + 'day.climateHint': 'Ιστορικοί μέσοι όροι — η πραγματική πρόγνωση είναι διαθέσιμη εντός 16 ημερών από αυτή την ημερομηνία.', + 'day.noWeather': 'Δεν υπάρχουν διαθέσιμα δεδομένα καιρού. Προσθέστε μια τοποθεσία με συντεταγμένες.', + 'day.overview': 'Ημερήσια Επισκόπηση', + 'day.accommodation': 'Διαμονή', + 'day.addAccommodation': 'Προσθήκη διαμονής', + 'day.hotelDayRange': 'Εφαρμογή σε ημέρες', + 'day.noPlacesForHotel': 'Προσθέστε πρώτα τοποθεσίες στο ταξίδι σας', + 'day.allDays': 'Όλες', + 'day.checkIn': 'Check-in', + 'day.checkInUntil': 'Έως', + 'day.checkOut': 'Check-out', + 'day.confirmation': 'Επιβεβαίωση', + 'day.editAccommodation': 'Επεξεργασία διαμονής', + 'day.reservations': 'Κρατήσεις', +}; +export default day; diff --git a/shared/src/i18n/gr/dayplan.ts b/shared/src/i18n/gr/dayplan.ts new file mode 100644 index 00000000..8cccff4d --- /dev/null +++ b/shared/src/i18n/gr/dayplan.ts @@ -0,0 +1,42 @@ +import type { TranslationStrings } from '../types'; + +const dayplan: TranslationStrings = { + 'dayplan.icsTooltip': 'Εξαγωγή ημερολογίου (ICS)', + 'dayplan.emptyDay': 'Δεν υπάρχουν προγραμματισμένα μέρη για αυτή την ημέρα', + 'dayplan.cannotReorderTransport': 'Οι κρατήσεις με σταθερή ώρα δεν μπορούν να αναδιαταχθούν', + 'dayplan.confirmRemoveTimeTitle': 'Αφαίρεση ώρας;', + 'dayplan.confirmRemoveTimeBody': 'Αυτό το μέρος έχει σταθερή ώρα ({time}). Η μετακίνησή του θα αφαιρέσει την ώρα και θα επιτρέψει ελεύθερη ταξινόμηση.', + 'dayplan.confirmRemoveTimeAction': 'Αφαίρεση ώρας & μετακίνηση', + 'dayplan.cannotDropOnTimed': 'Τα στοιχεία δεν μπορούν να τοποθετηθούν μεταξύ καταχωρήσεων με ώρα', + 'dayplan.cannotBreakChronology': 'Αυτό θα έσπαγε τη χρονολογική σειρά των στοιχείων με ώρα και των κρατήσεων', + 'dayplan.addNote': 'Προσθήκη Σημείωσης', + 'dayplan.expandAll': 'Ανάπτυξη όλων των ημερών', + 'dayplan.collapseAll': 'Σύμπτυξη όλων των ημερών', + 'dayplan.editNote': 'Επεξεργασία Σημείωσης', + 'dayplan.noteAdd': 'Προσθήκη Σημείωσης', + 'dayplan.noteEdit': 'Επεξεργασία Σημείωσης', + 'dayplan.noteTitle': 'Σημείωση', + 'dayplan.noteSubtitle': 'Ημερήσια Σημείωση', + 'dayplan.totalCost': 'Συνολικό Κόστος', + 'dayplan.days': 'Ημέρες', + 'dayplan.dayN': 'Ημέρα {n}', + 'dayplan.calculating': 'Υπολογισμός...', + 'dayplan.route': 'Διαδρομή', + 'dayplan.optimize': 'Βελτιστοποίηση', + 'dayplan.optimized': 'Η διαδρομή βελτιστοποιήθηκε', + 'dayplan.routeError': 'Αποτυχία υπολογισμού διαδρομής', + 'dayplan.toast.needTwoPlaces': 'Χρειάζονται τουλάχιστον δύο μέρη για βελτιστοποίηση διαδρομής', + 'dayplan.toast.routeOptimized': 'Η διαδρομή βελτιστοποιήθηκε', + 'dayplan.toast.noGeoPlaces': 'Δεν βρέθηκαν μέρη με συντεταγμένες για τον υπολογισμό διαδρομής', + 'dayplan.confirmed': 'Επιβεβαιωμένο', + 'dayplan.pendingRes': 'Εκκρεμές', + 'dayplan.pdf': 'PDF', + 'dayplan.pdfTooltip': 'Εξαγωγή ημερήσιου πλάνου ως PDF', + 'dayplan.pdfError': 'Αποτυχία εξαγωγής PDF', + 'dayplan.mobile.addPlace': 'Προσθήκη Τοποθεσίας', + 'dayplan.mobile.searchPlaces': 'Αναζήτηση τοποθεσιών...', + 'dayplan.mobile.allAssigned': 'Όλες οι τοποθεσίες έχουν ανατεθεί', + 'dayplan.mobile.noMatch': 'Καμία αντιστοιχία', + 'dayplan.mobile.createNew': 'Δημιουργία νέας τοποθεσίας', +}; +export default dayplan; diff --git a/shared/src/i18n/gr/files.ts b/shared/src/i18n/gr/files.ts new file mode 100644 index 00000000..493ec57e --- /dev/null +++ b/shared/src/i18n/gr/files.ts @@ -0,0 +1,59 @@ +import type { TranslationStrings } from '../types'; + +const files: TranslationStrings = { + 'files.title': 'Αρχεία', + 'files.pageTitle': 'Αρχεία & Έγγραφα', + 'files.subtitle': '{count} αρχεία για {trip}', + 'files.download': 'Λήψη', + 'files.openError': 'Δεν ήταν δυνατό το άνοιγμα του αρχείου', + 'files.downloadPdf': 'Λήψη PDF', + 'files.count': '{count} αρχεία', + 'files.countSingular': '1 αρχείο', + 'files.uploaded': '{count} μεταφορτώθηκαν', + 'files.uploadError': 'Η μεταφόρτωση απέτυχε', + 'files.dropzone': 'Αποθέστε αρχεία εδώ', + 'files.dropzoneHint': 'ή κάντε κλικ για περιήγηση', + 'files.allowedTypes': 'Εικόνες, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Μέγ. 50 MB', + 'files.uploading': 'Μεταφόρτωση...', + 'files.filterAll': 'Όλα', + 'files.filterPdf': 'PDF', + 'files.filterImages': 'Εικόνες', + 'files.filterDocs': 'Έγγραφα', + 'files.filterCollab': 'Σημειώσεις Collab', + 'files.sourceCollab': 'Από Σημειώσεις Collab', + 'files.empty': 'Δεν υπάρχουν αρχεία ακόμη', + 'files.emptyHint': 'Μεταφορτώστε αρχεία για να τα επισυνάψετε στο ταξίδι σας', + 'files.openTab': 'Άνοιγμα σε νέα καρτέλα', + 'files.confirm.delete': 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο;', + 'files.toast.deleted': 'Το αρχείο διαγράφηκε', + 'files.toast.deleteError': 'Αποτυχία διαγραφής αρχείου', + 'files.sourcePlan': 'Ημερήσιο Πλάνο', + 'files.sourceBooking': 'Κράτηση', + 'files.sourceTransport': 'Μεταφορά', + 'files.attach': 'Επισύναψη', + 'files.pasteHint': 'Μπορείτε επίσης να επικολλήσετε εικόνες από το πρόχειρο (Ctrl+V)', + 'files.trash': 'Κάδος', + 'files.trashEmpty': 'Ο κάδος είναι άδειος', + 'files.emptyTrash': 'Άδειασμα Κάδου', + 'files.restore': 'Επαναφορά', + 'files.star': 'Επισήμανση', + 'files.unstar': 'Αφαίρεση επισήμανσης', + 'files.assign': 'Ανάθεση', + 'files.assignTitle': 'Ανάθεση Αρχείου', + 'files.assignPlace': 'Μέρος', + 'files.assignBooking': 'Κράτηση', + 'files.assignTransport': 'Μεταφορά', + 'files.unassigned': 'Χωρίς ανάθεση', + 'files.unlink': 'Αφαίρεση σύνδεσης', + 'files.toast.trashed': 'Μετακινήθηκε στον κάδο', + 'files.toast.restored': 'Το αρχείο επαναφέρθηκε', + 'files.toast.trashEmptied': 'Ο κάδος αδειάστηκε', + 'files.toast.assigned': 'Το αρχείο ανατέθηκε', + 'files.toast.assignError': 'Η ανάθεση απέτυχε', + 'files.toast.restoreError': 'Η επαναφορά απέτυχε', + 'files.confirm.permanentDelete': 'Οριστική διαγραφή αυτού του αρχείου; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.', + 'files.confirm.emptyTrash': 'Οριστική διαγραφή όλων των αρχείων στον κάδο; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.', + 'files.noteLabel': 'Σημείωση', + 'files.notePlaceholder': 'Προσθήκη σημείωσης...', +}; +export default files; diff --git a/shared/src/i18n/gr/index.ts b/shared/src/i18n/gr/index.ts new file mode 100644 index 00000000..77aeb6a0 --- /dev/null +++ b/shared/src/i18n/gr/index.ts @@ -0,0 +1,86 @@ +import admin from './admin'; +import airport from './airport'; +import atlas from './atlas'; +import backup from './backup'; +import budget from './budget'; +import categories from './categories'; +import collab from './collab'; +import common from './common'; +import dashboard from './dashboard'; +import day from './day'; +import dayplan from './dayplan'; +import files from './files'; +import inspector from './inspector'; +import journey from './journey'; +import login from './login'; +import map from './map'; +import members from './members'; +import memories from './memories'; +import nav from './nav'; +import notif from './notif'; +import notifications from './notifications'; +import oauth from './oauth'; +import packing from './packing'; +import pdf from './pdf'; +import perm from './perm'; +import photos from './photos'; +import places from './places'; +import planner from './planner'; +import register from './register'; +import reservations from './reservations'; +import settings from './settings'; +import share from './share'; +import shared from './shared'; +import stats from './stats'; +import system_notice from './system_notice'; +import todo from './todo'; +import transport from './transport'; +import trip from './trip'; +import trips from './trips'; +import undo from './undo'; +import vacay from './vacay'; + +const locale = { + ...common, + ...trips, + ...nav, + ...dashboard, + ...settings, + ...admin, + ...dayplan, + ...share, + ...shared, + ...login, + ...register, + ...vacay, + ...atlas, + ...trip, + ...places, + ...inspector, + ...reservations, + ...airport, + ...map, + ...budget, + ...files, + ...packing, + ...members, + ...categories, + ...backup, + ...photos, + ...pdf, + ...planner, + ...stats, + ...day, + ...memories, + ...collab, + ...perm, + ...undo, + ...notifications, + ...todo, + ...notif, + ...journey, + ...oauth, + ...system_notice, + ...transport, +}; +export default locale; diff --git a/shared/src/i18n/gr/inspector.ts b/shared/src/i18n/gr/inspector.ts new file mode 100644 index 00000000..8a9825b7 --- /dev/null +++ b/shared/src/i18n/gr/inspector.ts @@ -0,0 +1,22 @@ +import type { TranslationStrings } from '../types'; + +const inspector: TranslationStrings = { + 'inspector.opened': 'Ανοιχτό', + 'inspector.closed': 'Κλειστό', + 'inspector.openingHours': 'Ώρες Λειτουργίας', + 'inspector.showHours': 'Εμφάνιση ωρών λειτουργίας', + 'inspector.files': 'Αρχεία', + 'inspector.filesCount': '{count} αρχεία', + 'inspector.remove': 'Αφαίρεση', + 'inspector.removeFromDay': 'Αφαίρεση από την Ημέρα', + 'inspector.addToDay': 'Προσθήκη στην Ημέρα', + 'inspector.confirmedRes': 'Επιβεβαιωμένη Κράτηση', + 'inspector.pendingRes': 'Εκκρεμής Κράτηση', + 'inspector.google': 'Άνοιγμα στο Google Maps', + 'inspector.website': 'Άνοιγμα Ιστοσελίδας', + 'inspector.addRes': 'Κράτηση', + 'inspector.editRes': 'Επεξεργασία Κράτησης', + 'inspector.participants': 'Συμμετέχοντες', + 'inspector.trackStats': 'Στατιστικά Διαδρομής', +}; +export default inspector; diff --git a/shared/src/i18n/gr/journey.ts b/shared/src/i18n/gr/journey.ts new file mode 100644 index 00000000..7411957b --- /dev/null +++ b/shared/src/i18n/gr/journey.ts @@ -0,0 +1,230 @@ +import type { TranslationStrings } from '../types'; + +const journey: TranslationStrings = { + 'journey.search.placeholder': 'Αναζήτηση ταξιδιών…', + 'journey.search.noResults': 'Κανένα ταξίδι δεν ταιριάζει με «{query}»', + 'journey.title': 'Ταξίδι', + 'journey.subtitle': 'Παρακολουθήστε τα ταξίδια σας καθώς συμβαίνουν', + 'journey.new': 'Νέο Ταξίδι', + 'journey.create': 'Δημιουργία', + 'journey.titlePlaceholder': 'Πού πηγαίνετε;', + 'journey.empty': 'Δεν υπάρχουν ταξίδια ακόμα', + 'journey.emptyHint': 'Ξεκινήστε να καταγράφετε το επόμενο ταξίδι σας', + 'journey.deleted': 'Το ταξίδι διαγράφηκε', + 'journey.createError': 'Δεν ήταν δυνατή η δημιουργία ταξιδιού', + 'journey.deleteError': 'Δεν ήταν δυνατή η διαγραφή ταξιδιού', + 'journey.deleteConfirmTitle': 'Διαγραφή', + 'journey.deleteConfirmMessage': 'Διαγραφή «{title}»; Αυτό δεν μπορεί να αναιρεθεί.', + 'journey.deleteConfirmGeneric': 'Είστε σίγουροι ότι θέλετε να το διαγράψετε;', + 'journey.notFound': 'Το ταξίδι δεν βρέθηκε', + 'journey.photos': 'Φωτογραφίες', + 'journey.timelineEmpty': 'Δεν υπάρχουν στάσεις ακόμα', + 'journey.timelineEmptyHint': 'Προσθέστε μια άφιξη ή γράψτε μια καταχώρηση ημερολογίου για να ξεκινήσετε', + 'journey.status.draft': 'Πρόχειρο', + 'journey.status.active': 'Ενεργό', + 'journey.status.completed': 'Ολοκληρωμένο', + 'journey.status.upcoming': 'Επερχόμενο', + 'journey.status.archived': 'Αρχειοθετημένο', + 'journey.checkin.add': 'Άφιξη', + 'journey.checkin.namePlaceholder': 'Όνομα τοποθεσίας', + 'journey.checkin.notesPlaceholder': 'Σημειώσεις (προαιρετικό)', + 'journey.checkin.save': 'Αποθήκευση', + 'journey.checkin.error': 'Δεν ήταν δυνατή η αποθήκευση άφιξης', + 'journey.entry.add': 'Ημερολόγιο', + 'journey.entry.edit': 'Επεξεργασία καταχώρησης', + 'journey.entry.titlePlaceholder': 'Τίτλος (προαιρετικό)', + 'journey.entry.bodyPlaceholder': 'Τι συνέβη σήμερα;', + 'journey.entry.save': 'Αποθήκευση', + 'journey.entry.error': 'Δεν ήταν δυνατή η αποθήκευση καταχώρησης', + 'journey.photo.add': 'Φωτογραφία', + 'journey.photo.uploadError': 'Η μεταφόρτωση απέτυχε', + 'journey.share.share': 'Κοινοποίηση', + 'journey.share.public': 'Δημόσιο', + 'journey.share.linkCopied': 'Ο δημόσιος σύνδεσμος αντιγράφηκε', + 'journey.share.disabled': 'Η δημόσια κοινοποίηση απενεργοποιήθηκε', + 'journey.editor.titlePlaceholder': 'Δώστε ένα όνομα σε αυτή τη στιγμή...', + 'journey.editor.bodyPlaceholder': 'Πείτε την ιστορία αυτής της ημέρας...', + 'journey.editor.placePlaceholder': 'Τοποθεσία (προαιρετικό)', + 'journey.editor.tagsPlaceholder': 'Ετικέτες: κρυμμένος θησαυρός, καλύτερο γεύμα, πρέπει να ξαναπάω...', + 'journey.visibility.private': 'Ιδιωτικό', + 'journey.visibility.shared': 'Κοινόχρηστο', + 'journey.visibility.public': 'Δημόσιο', + 'journey.emptyState.title': 'Η ιστορία σας ξεκινά εδώ', + 'journey.emptyState.subtitle': 'Κάντε άφιξη σε ένα μέρος ή γράψτε την πρώτη σας καταχώρηση ημερολογίου', + 'journey.frontpage.subtitle': 'Μετατρέψτε τα ταξίδια σας σε ιστορίες που δεν θα ξεχάσετε ποτέ', + 'journey.frontpage.createJourney': 'Δημιουργία Ταξιδιού', + 'journey.frontpage.activeJourney': 'Ενεργό Ταξίδι', + 'journey.frontpage.allJourneys': 'Όλα τα Ταξίδια', + 'journey.frontpage.journeys': 'ταξίδια', + 'journey.frontpage.createNew': 'Δημιουργία νέου Ταξιδιού', + 'journey.frontpage.createNewSub': 'Επιλέξτε ταξίδια, γράψτε ιστορίες, μοιραστείτε τις περιπέτειές σας', + 'journey.frontpage.live': 'Ζωντανά', + 'journey.frontpage.synced': 'Συγχρονισμένο', + 'journey.frontpage.continueWriting': 'Συνέχιση γραφής', + 'journey.frontpage.updated': 'Ενημερώθηκε {time}', + 'journey.frontpage.suggestionLabel': 'Το ταξίδι μόλις τελείωσε', + 'journey.frontpage.suggestionText': 'Μετατρέψτε το {title} σε Ταξίδι', + 'journey.frontpage.dismiss': 'Απόρριψη', + 'journey.frontpage.journeyName': 'Όνομα Ταξιδιού', + 'journey.frontpage.namePlaceholder': 'π.χ. Νοτιοανατολική Ασία 2026', + 'journey.frontpage.selectTrips': 'Επιλογή Ταξιδιών', + 'journey.frontpage.tripsSelected': 'επιλεγμένα ταξίδια', + 'journey.frontpage.trips': 'ταξίδια', + 'journey.frontpage.placesImported': 'τοποθεσίες θα εισαχθούν', + 'journey.frontpage.places': 'τοποθεσίες', + 'journey.detail.backToJourney': 'Πίσω στο Ταξίδι', + 'journey.detail.syncedWithTrips': 'Συγχρονισμένο με Ταξίδια', + 'journey.detail.addEntry': 'Προσθήκη Καταχώρησης', + 'journey.detail.newEntry': 'Νέα Καταχώρηση', + 'journey.detail.editEntry': 'Επεξεργασία Καταχώρησης', + 'journey.detail.noEntries': 'Δεν υπάρχουν καταχωρήσεις ακόμα', + 'journey.detail.noEntriesHint': 'Προσθέστε ένα ταξίδι για να ξεκινήσετε με προτεινόμενες καταχωρήσεις', + 'journey.detail.noPhotos': 'Δεν υπάρχουν φωτογραφίες ακόμα', + 'journey.detail.noPhotosHint': 'Μεταφορτώστε φωτογραφίες σε καταχωρήσεις ή περιηγηθείτε τη βιβλιοθήκη Immich/Synology', + 'journey.detail.journeyTab': 'Ταξίδι', + 'journey.detail.journeyStats': 'Στατιστικά Ταξιδιού', + 'journey.detail.syncedTrips': 'Συγχρονισμένα Ταξίδια', + 'journey.detail.noTripsLinked': 'Δεν έχουν συνδεθεί ταξίδια ακόμα', + 'journey.detail.contributors': 'Συνεισφέροντες', + 'journey.detail.readMore': 'Διαβάστε περισσότερα', + 'journey.detail.prosCons': 'Υπέρ & Κατά', + 'journey.detail.photos': 'φωτογραφίες', + 'journey.detail.day': 'Ημέρα {number}', + 'journey.detail.places': 'τοποθεσίες', + 'journey.stats.days': 'Ημέρες', + 'journey.stats.cities': 'Πόλεις', + 'journey.stats.entries': 'Καταχωρήσεις', + 'journey.stats.photos': 'Φωτογραφίες', + 'journey.stats.places': 'Τοποθεσίες', + 'journey.skeletons.show': 'Εμφάνιση προτάσεων', + 'journey.skeletons.hide': 'Απόκρυψη προτάσεων', + 'journey.verdict.lovedIt': 'Το λάτρεψα', + 'journey.verdict.couldBeBetter': 'Θα μπορούσε να ήταν καλύτερο', + 'journey.synced.places': 'τοποθεσίες', + 'journey.synced.synced': 'συγχρονισμένα', + 'journey.editor.discardChangesConfirm': 'Έχετε μη αποθηκευμένες αλλαγές. Απόρριψη;', + 'journey.editor.uploadFailed': 'Η μεταφόρτωση φωτογραφίας απέτυχε', + 'journey.editor.uploadPhotos': 'Μεταφόρτωση φωτογραφιών', + 'journey.editor.uploading': 'Μεταφόρτωση...', + 'journey.editor.uploadingProgress': 'Μεταφόρτωση {done}/{total}.', + 'journey.editor.uploadPartialFailed': '{failed} από {total} φωτογραφίες απέτυχαν — αποθηκεύστε ξανά για να δοκιμάσετε εκ νέου', + 'journey.editor.fromGallery': 'Από τη Συλλογή', + 'journey.editor.allPhotosAdded': 'Όλες οι φωτογραφίες έχουν ήδη προστεθεί', + 'journey.editor.writeStory': 'Γράψτε την ιστορία σας...', + 'journey.editor.prosCons': 'Υπέρ & Κατά', + 'journey.editor.pros': 'Υπέρ', + 'journey.editor.cons': 'Κατά', + 'journey.editor.proPlaceholder': 'Κάτι υπέροχο...', + 'journey.editor.conPlaceholder': 'Όχι και τόσο καλό...', + 'journey.editor.addAnother': 'Προσθήκη άλλου', + 'journey.editor.date': 'Ημερομηνία', + 'journey.editor.location': 'Τοποθεσία', + 'journey.editor.searchLocation': 'Αναζήτηση τοποθεσίας...', + 'journey.editor.mood': 'Διάθεση', + 'journey.editor.weather': 'Καιρός', + 'journey.editor.photoFirst': '1η', + 'journey.editor.makeFirst': 'Ορισμός ως 1η', + 'journey.editor.searching': 'Αναζήτηση...', + 'journey.mood.amazing': 'Καταπληκτική', + 'journey.mood.good': 'Καλή', + 'journey.mood.neutral': 'Ουδέτερη', + 'journey.mood.rough': 'Δύσκολη', + 'journey.weather.sunny': 'Ηλιόλουστος', + 'journey.weather.partly': 'Μερικώς συννεφιασμένος', + 'journey.weather.cloudy': 'Συννεφιασμένος', + 'journey.weather.rainy': 'Βροχερός', + 'journey.weather.stormy': 'Καταιγιδοφόρος', + 'journey.weather.cold': 'Χιονισμένος', + 'journey.trips.linkTrip': 'Σύνδεση Ταξιδιού', + 'journey.trips.searchTrip': 'Αναζήτηση Ταξιδιού', + 'journey.trips.searchPlaceholder': 'Όνομα ταξιδιού ή προορισμός...', + 'journey.trips.noTripsAvailable': 'Δεν υπάρχουν διαθέσιμα ταξίδια', + 'journey.trips.link': 'Σύνδεση', + 'journey.trips.tripLinked': 'Το ταξίδι συνδέθηκε', + 'journey.trips.linkFailed': 'Αποτυχία σύνδεσης ταξιδιού', + 'journey.trips.addTrip': 'Προσθήκη Ταξιδιού', + 'journey.trips.unlinkTrip': 'Αποσύνδεση Ταξιδιού', + 'journey.trips.unlinkMessage': 'Αποσύνδεση «{title}»; Όλες οι συγχρονισμένες καταχωρήσεις και φωτογραφίες αυτού του ταξιδιού θα διαγραφούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί.', + 'journey.trips.unlink': 'Αποσύνδεση', + 'journey.trips.tripUnlinked': 'Το ταξίδι αποσυνδέθηκε', + 'journey.trips.unlinkFailed': 'Αποτυχία αποσύνδεσης ταξιδιού', + 'journey.trips.noTripsLinkedSettings': 'Δεν έχουν συνδεθεί ταξίδια', + 'journey.contributors.invite': 'Πρόσκληση Συνεισφέροντα', + 'journey.contributors.searchUser': 'Αναζήτηση Χρήστη', + 'journey.contributors.searchPlaceholder': 'Όνομα χρήστη ή email...', + 'journey.contributors.noUsers': 'Δεν βρέθηκαν χρήστες', + 'journey.contributors.role': 'Ρόλος', + 'journey.contributors.added': 'Ο συνεισφέρων προστέθηκε', + 'journey.contributors.addFailed': 'Αποτυχία προσθήκης συνεισφέροντα', + 'journey.contributors.remove': 'Αφαίρεση συνεισφέροντα', + 'journey.contributors.removeConfirm': 'Αφαίρεση {username} από αυτό το ταξίδι;', + 'journey.contributors.removed': 'Ο συνεισφέρων αφαιρέθηκε', + 'journey.contributors.removeFailed': 'Αποτυχία αφαίρεσης συνεισφέροντα', + 'journey.share.publicShare': 'Δημόσια Κοινοποίηση', + 'journey.share.createLink': 'Δημιουργία συνδέσμου κοινής χρήσης', + 'journey.share.linkCreated': 'Ο σύνδεσμος κοινής χρήσης δημιουργήθηκε', + 'journey.share.createFailed': 'Αποτυχία δημιουργίας συνδέσμου', + 'journey.share.copy': 'Αντιγραφή', + 'journey.share.copied': 'Αντιγράφηκε!', + 'journey.share.timeline': 'Χρονολόγιο', + 'journey.share.gallery': 'Συλλογή', + 'journey.share.map': 'Χάρτης', + 'journey.share.removeLink': 'Αφαίρεση συνδέσμου κοινής χρήσης', + 'journey.share.linkDeleted': 'Ο σύνδεσμος κοινής χρήσης διαγράφηκε', + 'journey.share.deleteFailed': 'Αποτυχία διαγραφής', + 'journey.share.updateFailed': 'Αποτυχία ενημέρωσης', + 'journey.invite.role': 'Ρόλος', + 'journey.invite.viewer': 'Θεατής', + 'journey.invite.editor': 'Συντάκτης', + 'journey.invite.invite': 'Πρόσκληση', + 'journey.invite.inviting': 'Αποστολή πρόσκλησης...', + 'journey.settings.title': 'Ρυθμίσεις Ταξιδιού', + 'journey.settings.coverImage': 'Εικόνα Εξωφύλλου', + 'journey.settings.changeCover': 'Αλλαγή εξωφύλλου', + 'journey.settings.addCover': 'Προσθήκη εικόνας εξωφύλλου', + 'journey.settings.name': 'Όνομα', + 'journey.settings.subtitle': 'Υπότιτλος', + 'journey.settings.subtitlePlaceholder': 'π.χ. Ταϊλάνδη, Βιετνάμ & Καμπότζη', + 'journey.settings.endJourney': 'Αρχειοθέτηση Ταξιδιού', + 'journey.settings.reopenJourney': 'Επαναφορά Ταξιδιού', + 'journey.settings.archived': 'Το ταξίδι αρχειοθετήθηκε', + 'journey.settings.reopened': 'Το ταξίδι επανενεργοποιήθηκε', + 'journey.settings.endDescription': 'Αποκρύπτει το σήμα «Ζωντανά». Μπορείτε να το επαναφέρετε ανά πάσα στιγμή.', + 'journey.settings.delete': 'Διαγραφή', + 'journey.settings.deleteJourney': 'Διαγραφή Ταξιδιού', + 'journey.settings.deleteMessage': 'Διαγραφή «{title}»; Όλες οι καταχωρήσεις και οι φωτογραφίες θα χαθούν.', + 'journey.settings.saved': 'Οι ρυθμίσεις αποθηκεύτηκαν', + 'journey.settings.saveFailed': 'Αποτυχία αποθήκευσης', + 'journey.settings.coverUpdated': 'Το εξώφυλλο ενημερώθηκε', + 'journey.settings.coverFailed': 'Η μεταφόρτωση απέτυχε', + 'journey.settings.failedToDelete': 'Αποτυχία διαγραφής', + 'journey.entries.deleteTitle': 'Διαγραφή Καταχώρησης', + 'journey.photosUploaded': '{count} φωτογραφίες μεταφορτώθηκαν', + 'journey.photosUploadFailed': 'Ορισμένες φωτογραφίες απέτυχαν να μεταφορτωθούν', + 'journey.photosAdded': '{count} φωτογραφίες προστέθηκαν', + 'journey.public.notFound': 'Δεν Βρέθηκε', + 'journey.public.notFoundMessage': 'Αυτό το ταξίδι δεν υπάρχει ή ο σύνδεσμος έχει λήξει.', + 'journey.public.readOnly': 'Μόνο ανάγνωση · Δημόσιο Ταξίδι', + 'journey.public.tagline': 'Travel Resource & Exploration Kit', + 'journey.public.sharedVia': 'Κοινοποιήθηκε μέσω', + 'journey.public.madeWith': 'Φτιαγμένο με', + 'journey.pdf.journeyBook': 'Βιβλίο Ταξιδιού', + 'journey.pdf.madeWith': 'Φτιαγμένο με TREK', + 'journey.pdf.day': 'Ημέρα', + 'journey.pdf.theEnd': 'Τέλος', + 'journey.pdf.saveAsPdf': 'Αποθήκευση ως PDF', + 'journey.pdf.pages': 'σελίδες', + 'journey.picker.tripPeriod': 'Περίοδος Ταξιδιού', + 'journey.picker.dateRange': 'Εύρος Ημερομηνιών', + 'journey.picker.allPhotos': 'Όλες οι Φωτογραφίες', + 'journey.picker.albums': 'Άλμπουμ', + 'journey.picker.selected': 'επιλεγμένες', + 'journey.picker.addTo': 'Προσθήκη σε', + 'journey.picker.newGallery': 'Νέα Συλλογή', + 'journey.picker.selectAll': 'Επιλογή όλων', + 'journey.picker.deselectAll': 'Αποεπιλογή όλων', + 'journey.picker.noAlbums': 'Δεν βρέθηκαν άλμπουμ', + 'journey.picker.selectDate': 'Επιλογή ημερομηνίας', + 'journey.picker.search': 'Αναζήτηση', +}; +export default journey; diff --git a/shared/src/i18n/gr/login.ts b/shared/src/i18n/gr/login.ts new file mode 100644 index 00000000..14b8b3fb --- /dev/null +++ b/shared/src/i18n/gr/login.ts @@ -0,0 +1,83 @@ +import type { TranslationStrings } from '../types'; + +const login: TranslationStrings = { + 'login.error': 'Η σύνδεση απέτυχε. Παρακαλώ ελέγξτε τα στοιχεία σας.', + 'login.tagline': 'Τα Ταξίδια σας.\nΤο Σχέδιό σας.', + 'login.description': 'Σχεδιάστε ταξίδια συνεργατικά με διαδραστικούς χάρτες, προϋπολογισμούς και συγχρονισμό σε πραγματικό χρόνο.', + 'login.features.maps': 'Διαδραστικοί Χάρτες', + 'login.features.mapsDesc': 'Google Places, διαδρομές & ομαδοποίηση', + 'login.features.realtime': 'Συγχρονισμός Πραγματικού Χρόνου', + 'login.features.realtimeDesc': 'Σχεδιάστε μαζί μέσω WebSocket', + 'login.features.budget': 'Παρακολούθηση Προϋπολογισμού', + 'login.features.budgetDesc': 'Κατηγορίες, γραφήματα & κόστος ανά άτομο', + 'login.features.collab': 'Συνεργασία', + 'login.features.collabDesc': 'Πολλαπλοί χρήστες με κοινόχρηστα ταξίδια', + 'login.features.packing': 'Λίστες Πακεταρίσματος', + 'login.features.packingDesc': 'Κατηγορίες, πρόοδος & προτάσεις', + 'login.features.bookings': 'Κρατήσεις', + 'login.features.bookingsDesc': 'Πτήσεις, ξενοδοχεία, εστιατόρια & άλλα', + 'login.features.files': 'Έγγραφα', + 'login.features.filesDesc': 'Μεταφόρτωση & διαχείριση εγγράφων', + 'login.features.routes': 'Έξυπνες Διαδρομές', + 'login.features.routesDesc': 'Αυτόματη βελτιστοποίηση & εξαγωγή στο Google Maps', + 'login.selfHosted': 'Self-hosted \u00B7 Open Source \u00B7 Τα δεδομένα σας παραμένουν δικά σας', + 'login.title': 'Σύνδεση', + 'login.subtitle': 'Καλώς ήρθατε πίσω', + 'login.signingIn': 'Σύνδεση…', + 'login.signIn': 'Σύνδεση', + 'login.createAdmin': 'Δημιουργία Λογαριασμού Διαχειριστή', + 'login.createAdminHint': 'Ρυθμίστε τον πρώτο λογαριασμό διαχειριστή για το TREK.', + 'login.setNewPassword': 'Ορισμός Νέου Κωδικού', + 'login.setNewPasswordHint': 'Πρέπει να αλλάξετε τον κωδικό σας πριν συνεχίσετε.', + 'login.createAccount': 'Δημιουργία Λογαριασμού', + 'login.createAccountHint': 'Καταχωρήστε έναν νέο λογαριασμό.', + 'login.creating': 'Δημιουργία…', + 'login.noAccount': 'Δεν έχετε λογαριασμό;', + 'login.hasAccount': 'Έχετε ήδη λογαριασμό;', + 'login.register': 'Εγγραφή', + 'login.emailPlaceholder': 'your@email.com', + 'login.username': 'Όνομα χρήστη', + 'login.oidc.registrationDisabled': 'Η εγγραφή είναι απενεργοποιημένη. Επικοινωνήστε με τον διαχειριστή σας.', + 'login.oidc.noEmail': 'Δεν ελήφθη email από τον πάροχο.', + 'login.oidc.tokenFailed': 'Ο έλεγχος ταυτότητας απέτυχε.', + 'login.oidc.invalidState': 'Μη έγκυρη συνεδρία. Παρακαλώ δοκιμάστε ξανά.', + 'login.demoFailed': 'Η σύνδεση demo απέτυχε', + 'login.oidcSignIn': 'Σύνδεση με {name}', + 'login.oidcOnly': 'Ο έλεγχος ταυτότητας με κωδικό είναι απενεργοποιημένος. Παρακαλώ συνδεθείτε χρησιμοποιώντας τον πάροχο SSO σας.', + 'login.oidcLoggedOut': 'Έχετε αποσυνδεθεί. Συνδεθείτε ξανά χρησιμοποιώντας τον πάροχο SSO σας.', + 'login.demoHint': 'Δοκιμάστε το demo — δεν απαιτείται εγγραφή', + 'login.mfaTitle': 'Έλεγχος ταυτότητας δύο παραγόντων', + 'login.mfaSubtitle': 'Εισάγετε τον 6ψήφιο κωδικό από την εφαρμογή authenticator σας.', + 'login.mfaCodeLabel': 'Κωδικός επαλήθευσης', + 'login.mfaCodeRequired': 'Εισάγετε τον κωδικό από την εφαρμογή authenticator σας.', + 'login.mfaHint': 'Ανοίξτε το Google Authenticator, Authy ή άλλη εφαρμογή TOTP.', + 'login.mfaBack': '← Πίσω στη σύνδεση', + 'login.mfaVerify': 'Επαλήθευση', + 'login.invalidInviteLink': 'Μη έγκυρος ή ληγμένος σύνδεσμος πρόσκλησης', + 'login.oidcFailed': 'Η σύνδεση OIDC απέτυχε', + 'login.usernameRequired': 'Το όνομα χρήστη είναι υποχρεωτικό', + 'login.passwordMinLength': 'Ο κωδικός πρέπει να έχει τουλάχιστον 8 χαρακτήρες', + 'login.forgotPassword': 'Ξεχάσατε τον κωδικό;', + 'login.forgotPasswordTitle': 'Επαναφορά του κωδικού σας', + 'login.forgotPasswordBody': 'Εισάγετε το email με το οποίο εγγραφήκατε. Αν υπάρχει λογαριασμός, θα στείλουμε έναν σύνδεσμο επαναφοράς.', + 'login.forgotPasswordSubmit': 'Αποστολή συνδέσμου επαναφοράς', + 'login.forgotPasswordSentTitle': 'Ελέγξτε το email σας', + 'login.forgotPasswordSentBody': 'Αν υπάρχει λογαριασμός για αυτό το email, ένας σύνδεσμος επαναφοράς είναι καθ\'οδόν. Λήγει σε 60 λεπτά.', + 'login.forgotPasswordSmtpHintOff': 'Προσοχή: ο διαχειριστής σας δεν έχει διαμορφώσει SMTP, οπότε ο σύνδεσμος επαναφοράς θα γραφτεί στην κονσόλα του server αντί να σταλεί με email.', + 'login.backToLogin': 'Πίσω στη σύνδεση', + 'login.newPassword': 'Νέος κωδικός', + 'login.confirmPassword': 'Επιβεβαίωση νέου κωδικού', + 'login.passwordsDontMatch': 'Οι κωδικοί δεν ταιριάζουν', + 'login.mfaCode': 'Κωδικός 2FA', + 'login.resetPasswordTitle': 'Ορίστε έναν νέο κωδικό', + 'login.resetPasswordBody': 'Επιλέξτε έναν ισχυρό κωδικό που δεν έχετε χρησιμοποιήσει εδώ ξανά. Ελάχιστο 8 χαρακτήρες.', + 'login.resetPasswordMfaBody': 'Εισάγετε τον κωδικό 2FA ή έναν εφεδρικό κωδικό για να ολοκληρωθεί η επαναφορά.', + 'login.resetPasswordSubmit': 'Επαναφορά κωδικού', + 'login.resetPasswordVerify': 'Επαλήθευση & επαναφορά', + 'login.resetPasswordSuccessTitle': 'Ο κωδικός ενημερώθηκε', + 'login.resetPasswordSuccessBody': 'Μπορείτε τώρα να συνδεθείτε με τον νέο σας κωδικό.', + 'login.resetPasswordInvalidLink': 'Μη έγκυρος σύνδεσμος επαναφοράς', + 'login.resetPasswordInvalidLinkBody': 'Αυτός ο σύνδεσμος λείπει ή έχει χαλάσει. Ζητήστε έναν νέο για να συνεχίσετε.', + 'login.resetPasswordFailed': 'Η επαναφορά απέτυχε. Ο σύνδεσμος μπορεί να έχει λήξει.', +}; +export default login; diff --git a/shared/src/i18n/gr/map.ts b/shared/src/i18n/gr/map.ts new file mode 100644 index 00000000..b587a932 --- /dev/null +++ b/shared/src/i18n/gr/map.ts @@ -0,0 +1,8 @@ +import type { TranslationStrings } from '../types'; + +const map: TranslationStrings = { + 'map.connections': 'Συνδέσεις', + 'map.showConnections': 'Εμφάνιση διαδρομών κρατήσεων', + 'map.hideConnections': 'Απόκρυψη διαδρομών κρατήσεων', +}; +export default map; diff --git a/shared/src/i18n/gr/members.ts b/shared/src/i18n/gr/members.ts new file mode 100644 index 00000000..759bda6b --- /dev/null +++ b/shared/src/i18n/gr/members.ts @@ -0,0 +1,24 @@ +import type { TranslationStrings } from '../types'; + +const members: TranslationStrings = { + 'members.shareTrip': 'Κοινή Χρήση Ταξιδιού', + 'members.inviteUser': 'Πρόσκληση Χρήστη', + 'members.selectUser': 'Επιλέξτε χρήστη…', + 'members.invite': 'Πρόσκληση', + 'members.allHaveAccess': 'Όλοι οι χρήστες έχουν ήδη πρόσβαση.', + 'members.access': 'Πρόσβαση', + 'members.person': 'άτομο', + 'members.persons': 'άτομα', + 'members.you': 'εσείς', + 'members.owner': 'Ιδιοκτήτης', + 'members.leaveTrip': 'Αποχώρηση από ταξίδι', + 'members.removeAccess': 'Αφαίρεση πρόσβασης', + 'members.confirmLeave': 'Αποχώρηση από το ταξίδι; Θα χάσετε την πρόσβαση.', + 'members.confirmRemove': 'Αφαίρεση πρόσβασης για αυτόν τον χρήστη;', + 'members.loadError': 'Αποτυχία φόρτωσης μελών', + 'members.added': 'προστέθηκε', + 'members.addError': 'Αποτυχία προσθήκης', + 'members.removed': 'Το μέλος αφαιρέθηκε', + 'members.removeError': 'Αποτυχία αφαίρεσης', +}; +export default members; diff --git a/shared/src/i18n/gr/memories.ts b/shared/src/i18n/gr/memories.ts new file mode 100644 index 00000000..14ed15eb --- /dev/null +++ b/shared/src/i18n/gr/memories.ts @@ -0,0 +1,72 @@ +import type { TranslationStrings } from '../types'; + +const memories: TranslationStrings = { + 'memories.title': 'Φωτογραφίες', + 'memories.notConnected': 'Το {provider_name} δεν είναι συνδεδεμένο', + 'memories.notConnectedHint': 'Συνδέστε την υπηρεσία {provider_name} στις Ρυθμίσεις για να μπορείτε να προσθέτετε φωτογραφίες σε αυτό το ταξίδι.', + 'memories.notConnectedMultipleHint': 'Συνδέστε οποιονδήποτε από αυτούς τους παρόχους φωτογραφιών: {provider_names} στις Ρυθμίσεις για να μπορείτε να προσθέτετε φωτογραφίες σε αυτό το ταξίδι.', + 'memories.noDates': 'Προσθέστε ημερομηνίες στο ταξίδι σας για να φορτωθούν φωτογραφίες.', + 'memories.noPhotos': 'Δεν βρέθηκαν φωτογραφίες', + 'memories.noPhotosHint': 'Δεν βρέθηκαν φωτογραφίες στο {provider_name} για το εύρος ημερομηνιών αυτού του ταξιδιού.', + 'memories.photosFound': 'φωτογραφίες', + 'memories.fromOthers': 'από άλλους', + 'memories.sharePhotos': 'Κοινή χρήση φωτογραφιών', + 'memories.sharing': 'Κοινή χρήση', + 'memories.reviewTitle': 'Ελέγξτε τις φωτογραφίες σας', + 'memories.reviewHint': 'Κάντε κλικ στις φωτογραφίες για να τις εξαιρέσετε από την κοινή χρήση.', + 'memories.shareCount': 'Κοινή χρήση {count} φωτογραφιών', + 'memories.providerUrl': 'URL Διακομιστή', + 'memories.providerApiKey': 'API Key', + 'memories.providerUsername': 'Όνομα χρήστη', + 'memories.providerPassword': 'Κωδικός', + 'memories.providerOTP': 'Κωδικός MFA (αν είναι ενεργοποιημένος)', + 'memories.skipSSLVerification': 'Παράλειψη επαλήθευσης πιστοποιητικού SSL', + 'memories.immichAutoUpload': 'Αντικατοπτρισμός φωτογραφιών journey στο Immich κατά τη μεταφόρτωση', + 'memories.providerUrlHintSynology': 'Συμπεριλάβετε τη διαδρομή της εφαρμογής Photos στο URL, π.χ. https://nas:5001/photo', + 'memories.testConnection': 'Δοκιμή σύνδεσης', + 'memories.testShort': 'Δοκιμή', + 'memories.testFirst': 'Δοκιμάστε πρώτα τη σύνδεση', + 'memories.connected': 'Συνδεδεμένο', + 'memories.disconnected': 'Μη συνδεδεμένο', + 'memories.connectionSuccess': 'Συνδέθηκε στο {provider_name}', + 'memories.connectionError': 'Δεν ήταν δυνατή η σύνδεση στο {provider_name}', + 'memories.saved': 'Οι ρυθμίσεις {provider_name} αποθηκεύτηκαν', + 'memories.providerDisconnectedBanner': 'Η σύνδεση {provider_name} χάθηκε. Επανασυνδεθείτε στις Ρυθμίσεις για να δείτε φωτογραφίες.', + 'memories.saveError': 'Δεν ήταν δυνατή η αποθήκευση των ρυθμίσεων {provider_name}', + 'memories.addPhotos': 'Προσθήκη φωτογραφιών', + 'memories.linkAlbum': 'Σύνδεση Άλμπουμ', + 'memories.selectAlbum': 'Επιλογή Άλμπουμ {provider_name}', + 'memories.selectAlbumMultiple': 'Επιλογή Άλμπουμ', + 'memories.noAlbums': 'Δεν βρέθηκαν άλμπουμ', + 'memories.syncAlbum': 'Συγχρονισμός άλμπουμ', + 'memories.unlinkAlbum': 'Αποσύνδεση άλμπουμ', + 'memories.photos': 'φωτογραφίες', + 'memories.selectPhotos': 'Επιλογή φωτογραφιών από {provider_name}', + 'memories.selectPhotosMultiple': 'Επιλογή Φωτογραφιών', + 'memories.selectHint': 'Πατήστε στις φωτογραφίες για να τις επιλέξετε.', + 'memories.selected': 'επιλεγμένες', + 'memories.addSelected': 'Προσθήκη {count} φωτογραφιών', + 'memories.alreadyAdded': 'Προστέθηκε', + 'memories.private': 'Ιδιωτικό', + 'memories.stopSharing': 'Διακοπή κοινής χρήσης', + 'memories.oldest': 'Παλαιότερες πρώτα', + 'memories.newest': 'Νεότερες πρώτα', + 'memories.allLocations': 'Όλες οι τοποθεσίες', + 'memories.tripDates': 'Ημερομηνίες ταξιδιού', + 'memories.allPhotos': 'Όλες οι φωτογραφίες', + 'memories.confirmShareTitle': 'Κοινή χρήση με τα μέλη του ταξιδιού;', + 'memories.confirmShareHint': '{count} φωτογραφίες θα είναι ορατές σε όλα τα μέλη αυτού του ταξιδιού. Μπορείτε να κάνετε μεμονωμένες φωτογραφίες ιδιωτικές αργότερα.', + 'memories.confirmShareButton': 'Κοινή χρήση φωτογραφιών', + 'memories.error.loadAlbums': 'Αποτυχία φόρτωσης άλμπουμ', + 'memories.error.linkAlbum': 'Αποτυχία σύνδεσης άλμπουμ', + 'memories.error.unlinkAlbum': 'Αποτυχία αποσύνδεσης άλμπουμ', + 'memories.error.syncAlbum': 'Αποτυχία συγχρονισμού άλμπουμ', + 'memories.error.loadPhotos': 'Αποτυχία φόρτωσης φωτογραφιών', + 'memories.error.addPhotos': 'Αποτυχία προσθήκης φωτογραφιών', + 'memories.error.removePhoto': 'Αποτυχία αφαίρεσης φωτογραφίας', + 'memories.error.toggleSharing': 'Αποτυχία ενημέρωσης κοινής χρήσης', + 'memories.saveRouteNotConfigured': 'Η διαδρομή αποθήκευσης δεν έχει ρυθμιστεί για αυτόν τον πάροχο', + 'memories.testRouteNotConfigured': 'Η διαδρομή δοκιμής δεν έχει ρυθμιστεί για αυτόν τον πάροχο', + 'memories.fillRequiredFields': 'Παρακαλώ συμπληρώστε όλα τα απαιτούμενα πεδία', +}; +export default memories; diff --git a/shared/src/i18n/gr/nav.ts b/shared/src/i18n/gr/nav.ts new file mode 100644 index 00000000..03eff074 --- /dev/null +++ b/shared/src/i18n/gr/nav.ts @@ -0,0 +1,20 @@ +import type { TranslationStrings } from '../types'; + +const nav: TranslationStrings = { + 'nav.trip': 'Ταξίδι', + 'nav.share': 'Διαμοιρασμός', + 'nav.settings': 'Ρυθμίσεις', + 'nav.admin': 'Διαχείριση', + 'nav.logout': 'Αποσύνδεση', + 'nav.lightMode': 'Light mode', + 'nav.darkMode': 'Dark mode', + 'nav.autoMode': 'Auto mode', + 'nav.administrator': 'Διαχειριστής', + 'nav.myTrips': 'Τα Ταξίδια μου', + 'nav.profile': 'Προφίλ', + 'nav.bottomSettings': 'Ρυθμίσεις', + 'nav.bottomAdmin': 'Ρυθμίσεις Διαχειριστή', + 'nav.bottomLogout': 'Αποσύνδεση', + 'nav.bottomAdminBadge': 'Διαχειριστής', +}; +export default nav; diff --git a/shared/src/i18n/gr/notif.ts b/shared/src/i18n/gr/notif.ts new file mode 100644 index 00000000..b15b4195 --- /dev/null +++ b/shared/src/i18n/gr/notif.ts @@ -0,0 +1,40 @@ +import type { TranslationStrings } from '../types'; + +const notif: TranslationStrings = { + 'notif.test.title': '[Δοκιμή] Ειδοποίηση', + 'notif.test.simple.text': 'Αυτή είναι μια απλή δοκιμαστική ειδοποίηση.', + 'notif.test.boolean.text': 'Αποδέχεστε αυτή τη δοκιμαστική ειδοποίηση;', + 'notif.test.navigate.text': 'Κάντε κλικ παρακάτω για μετάβαση στον πίνακα ελέγχου.', + 'notif.trip_invite.title': 'Πρόσκληση Ταξιδιού', + 'notif.trip_invite.text': 'Ο/Η {actor} σας προσκάλεσε στο {trip}', + 'notif.booking_change.title': 'Η Κράτηση Ενημερώθηκε', + 'notif.booking_change.text': 'Ο/Η {actor} ενημέρωσε μια κράτηση στο {trip}', + 'notif.trip_reminder.title': 'Υπενθύμιση Ταξιδιού', + 'notif.trip_reminder.text': 'Το ταξίδι σας {trip} πλησιάζει!', + 'notif.todo_due.title': 'Εργασία προς λήξη', + 'notif.todo_due.text': 'Η εργασία {todo} στο {trip} λήγει στις {due}', + 'notif.vacay_invite.title': 'Πρόσκληση Σύντηξης Vacay', + 'notif.vacay_invite.text': 'Ο/Η {actor} σας προσκάλεσε να συγχωνεύσετε τα σχέδια διακοπών', + 'notif.photos_shared.title': 'Κοινοποίηση Φωτογραφιών', + 'notif.photos_shared.text': 'Ο/Η {actor} μοιράστηκε {count} φωτογραφία(ες) στο {trip}', + 'notif.collab_message.title': 'Νέο Μήνυμα', + 'notif.collab_message.text': 'Ο/Η {actor} έστειλε ένα μήνυμα στο {trip}', + 'notif.packing_tagged.title': 'Ανάθεση Αποσκευών', + 'notif.packing_tagged.text': 'Ο/Η {actor} σας ανέθεσε στο {category} του {trip}', + 'notif.version_available.title': 'Νέα Έκδοση Διαθέσιμη', + 'notif.version_available.text': 'Το TREK {version} είναι τώρα διαθέσιμο', + 'notif.action.view_trip': 'Προβολή Ταξιδιού', + 'notif.action.view_collab': 'Προβολή Μηνυμάτων', + 'notif.action.view_packing': 'Προβολή Αποσκευών', + 'notif.action.view_photos': 'Προβολή Φωτογραφιών', + 'notif.action.view_vacay': 'Προβολή Vacay', + 'notif.action.view_admin': 'Μετάβαση στη Διαχείριση', + 'notif.action.view': 'Προβολή', + 'notif.action.accept': 'Αποδοχή', + 'notif.action.decline': 'Απόρριψη', + 'notif.generic.title': 'Ειδοποίηση', + 'notif.generic.text': 'Έχετε μια νέα ειδοποίηση', + 'notif.dev.unknown_event.title': '[DEV] Άγνωστο Συμβάν', + 'notif.dev.unknown_event.text': 'Ο τύπος συμβάντος "{event}" δεν είναι εγγεγραμμένος στο EVENT_NOTIFICATION_CONFIG', +}; +export default notif; diff --git a/shared/src/i18n/gr/notifications.ts b/shared/src/i18n/gr/notifications.ts new file mode 100644 index 00000000..d602f68b --- /dev/null +++ b/shared/src/i18n/gr/notifications.ts @@ -0,0 +1,35 @@ +import type { TranslationStrings } from '../types'; + +const notifications: TranslationStrings = { + 'notifications.title': 'Ειδοποιήσεις', + 'notifications.markAllRead': 'Σήμανση όλων ως αναγνωσμένα', + 'notifications.deleteAll': 'Διαγραφή όλων', + 'notifications.showAll': 'Εμφάνιση όλων των ειδοποιήσεων', + 'notifications.empty': 'Καμία ειδοποίηση', + 'notifications.emptyDescription': 'Είστε ενημερωμένοι!', + 'notifications.all': 'Όλες', + 'notifications.unreadOnly': 'Μη αναγνωσμένες', + 'notifications.markRead': 'Σήμανση ως αναγνωσμένη', + 'notifications.markUnread': 'Σήμανση ως μη αναγνωσμένη', + 'notifications.delete': 'Διαγραφή', + 'notifications.system': 'Σύστημα', + 'notifications.synologySessionCleared.title': 'Το Synology Photos αποσυνδέθηκε', + 'notifications.synologySessionCleared.text': 'Ο διακομιστής ή ο λογαριασμός σας άλλαξε — μεταβείτε στις Ρυθμίσεις για να δοκιμάσετε ξανά τη σύνδεσή σας.', + 'notifications.versionAvailable.title': 'Διαθέσιμη Ενημέρωση', + 'notifications.versionAvailable.text': 'Το TREK {version} είναι τώρα διαθέσιμο.', + 'notifications.versionAvailable.button': 'Προβολή Λεπτομερειών', + 'notifications.test.title': 'Δοκιμαστική ειδοποίηση από {actor}', + 'notifications.test.text': 'Αυτή είναι μια απλή δοκιμαστική ειδοποίηση.', + 'notifications.test.booleanTitle': 'Ο {actor} ζητά την έγκρισή σας', + 'notifications.test.booleanText': 'Αυτή είναι μια δοκιμαστική ειδοποίηση boolean. Επιλέξτε μια ενέργεια παρακάτω.', + 'notifications.test.accept': 'Έγκριση', + 'notifications.test.decline': 'Απόρριψη', + 'notifications.test.navigateTitle': 'Ρίξτε μια ματιά', + 'notifications.test.navigateText': 'Αυτή είναι μια δοκιμαστική ειδοποίηση πλοήγησης.', + 'notifications.test.goThere': 'Μετάβαση εκεί', + 'notifications.test.adminTitle': 'Εκπομπή διαχειριστή', + 'notifications.test.adminText': 'Ο {actor} έστειλε μια δοκιμαστική ειδοποίηση σε όλους τους διαχειριστές.', + 'notifications.test.tripTitle': 'Ο {actor} δημοσίευσε στο ταξίδι σας', + 'notifications.test.tripText': 'Δοκιμαστική ειδοποίηση για το ταξίδι «{trip}».', +}; +export default notifications; diff --git a/shared/src/i18n/gr/oauth.ts b/shared/src/i18n/gr/oauth.ts new file mode 100644 index 00000000..dd0410bd --- /dev/null +++ b/shared/src/i18n/gr/oauth.ts @@ -0,0 +1,72 @@ +import type { TranslationStrings } from '../types'; + +const oauth: TranslationStrings = { + 'oauth.scope.group.trips': 'Ταξίδια', + 'oauth.scope.group.places': 'Τοποθεσίες', + 'oauth.scope.group.atlas': 'Atlas', + 'oauth.scope.group.packing': 'Αποσκευές', + 'oauth.scope.group.todos': 'Εργασίες', + 'oauth.scope.group.budget': 'Προϋπολογισμός', + 'oauth.scope.group.reservations': 'Κρατήσεις', + 'oauth.scope.group.collab': 'Συνεργασία', + 'oauth.scope.group.notifications': 'Ειδοποιήσεις', + 'oauth.scope.group.vacay': 'Διακοπές', + 'oauth.scope.group.geo': 'Γεωγραφικά', + 'oauth.scope.group.weather': 'Καιρός', + 'oauth.scope.group.journey': 'Ταξίδι', + 'oauth.scope.trips:read.label': 'Προβολή ταξιδιών & δρομολογίων', + 'oauth.scope.trips:read.description': 'Ανάγνωση ταξιδιών, ημερών, σημειώσεων και μελών', + 'oauth.scope.trips:write.label': 'Επεξεργασία ταξιδιών & δρομολογίων', + 'oauth.scope.trips:write.description': 'Δημιουργία και ενημέρωση ταξιδιών, ημερών, σημειώσεων και διαχείριση μελών', + 'oauth.scope.trips:delete.label': 'Διαγραφή ταξιδιών', + 'oauth.scope.trips:delete.description': 'Οριστική διαγραφή ολόκληρων ταξιδιών — αυτή η ενέργεια είναι μη ανατρέψιμη', + 'oauth.scope.trips:share.label': 'Διαχείριση συνδέσμων κοινής χρήσης', + 'oauth.scope.trips:share.description': 'Δημιουργία, ενημέρωση και ανάκληση δημόσιων συνδέσμων κοινής χρήσης για ταξίδια', + 'oauth.scope.places:read.label': 'Προβολή τοποθεσιών & δεδομένων χάρτη', + 'oauth.scope.places:read.description': 'Ανάγνωση τοποθεσιών, αναθέσεων ημερών, ετικετών και κατηγοριών', + 'oauth.scope.places:write.label': 'Διαχείριση τοποθεσιών', + 'oauth.scope.places:write.description': 'Δημιουργία, ενημέρωση και διαγραφή τοποθεσιών, αναθέσεων και ετικετών', + 'oauth.scope.atlas:read.label': 'Προβολή Atlas', + 'oauth.scope.atlas:read.description': 'Ανάγνωση περιοχών που έχουν επισκεφθεί, χωρών και λίστας επιθυμιών', + 'oauth.scope.atlas:write.label': 'Διαχείριση Atlas', + 'oauth.scope.atlas:write.description': 'Σήμανση χωρών και περιοχών ως επισκεφθεισών, διαχείριση λίστας επιθυμιών', + 'oauth.scope.packing:read.label': 'Προβολή λιστών αποσκευών', + 'oauth.scope.packing:read.description': 'Ανάγνωση αντικειμένων αποσκευών, τσαντών και αναθέσεων κατηγοριών', + 'oauth.scope.packing:write.label': 'Διαχείριση λιστών αποσκευών', + 'oauth.scope.packing:write.description': 'Προσθήκη, ενημέρωση, διαγραφή, εναλλαγή και αναδιάταξη αντικειμένων και τσαντών', + 'oauth.scope.todos:read.label': 'Προβολή λιστών εργασιών', + 'oauth.scope.todos:read.description': 'Ανάγνωση εργασιών ταξιδιού και αναθέσεων κατηγοριών', + 'oauth.scope.todos:write.label': 'Διαχείριση λιστών εργασιών', + 'oauth.scope.todos:write.description': 'Δημιουργία, ενημέρωση, εναλλαγή, διαγραφή και αναδιάταξη εργασιών', + 'oauth.scope.budget:read.label': 'Προβολή προϋπολογισμού', + 'oauth.scope.budget:read.description': 'Ανάγνωση στοιχείων προϋπολογισμού και ανάλυσης εξόδων', + 'oauth.scope.budget:write.label': 'Διαχείριση προϋπολογισμού', + 'oauth.scope.budget:write.description': 'Δημιουργία, ενημέρωση και διαγραφή στοιχείων προϋπολογισμού', + 'oauth.scope.reservations:read.label': 'Προβολή κρατήσεων', + 'oauth.scope.reservations:read.description': 'Ανάγνωση κρατήσεων και λεπτομερειών διαμονής', + 'oauth.scope.reservations:write.label': 'Διαχείριση κρατήσεων', + 'oauth.scope.reservations:write.description': 'Δημιουργία, ενημέρωση, διαγραφή και αναδιάταξη κρατήσεων', + 'oauth.scope.collab:read.label': 'Προβολή συνεργασίας', + 'oauth.scope.collab:read.description': 'Ανάγνωση σημειώσεων, δημοσκοπήσεων και μηνυμάτων συνεργασίας', + 'oauth.scope.collab:write.label': 'Διαχείριση συνεργασίας', + 'oauth.scope.collab:write.description': 'Δημιουργία, ενημέρωση και διαγραφή σημειώσεων, δημοσκοπήσεων και μηνυμάτων συνεργασίας', + 'oauth.scope.notifications:read.label': 'Προβολή ειδοποιήσεων', + 'oauth.scope.notifications:read.description': 'Ανάγνωση ειδοποιήσεων εντός εφαρμογής και μετρητών μη αναγνωσμένων', + 'oauth.scope.notifications:write.label': 'Διαχείριση ειδοποιήσεων', + 'oauth.scope.notifications:write.description': 'Σήμανση ειδοποιήσεων ως αναγνωσμένων και απάντηση σε αυτές', + 'oauth.scope.vacay:read.label': 'Προβολή πλάνων διακοπών', + 'oauth.scope.vacay:read.description': 'Ανάγνωση δεδομένων σχεδιασμού διακοπών, καταχωρήσεων και στατιστικών', + 'oauth.scope.vacay:write.label': 'Διαχείριση πλάνων διακοπών', + 'oauth.scope.vacay:write.description': 'Δημιουργία και διαχείριση καταχωρήσεων διακοπών, αργιών και κοινών πλάνων', + 'oauth.scope.geo:read.label': 'Χάρτες & γεωκωδικοποίηση', + 'oauth.scope.geo:read.description': 'Αναζήτηση τοποθεσιών, επίλυση URL χαρτών και αντίστροφη γεωκωδικοποίηση συντεταγμένων', + 'oauth.scope.weather:read.label': 'Προγνώσεις καιρού', + 'oauth.scope.weather:read.description': 'Λήψη προγνώσεων καιρού για τοποθεσίες και ημερομηνίες ταξιδιών', + 'oauth.scope.journey:read.label': 'Προβολή ταξιδιών', + 'oauth.scope.journey:read.description': 'Ανάγνωση ταξιδιών, καταχωρήσεων και λίστας συνεισφερόντων', + 'oauth.scope.journey:write.label': 'Διαχείριση ταξιδιών', + 'oauth.scope.journey:write.description': 'Δημιουργία, ενημέρωση και διαγραφή ταξιδιών και των καταχωρήσεων τους', + 'oauth.scope.journey:share.label': 'Διαχείριση συνδέσμων ταξιδιών', + 'oauth.scope.journey:share.description': 'Δημιουργία, ενημέρωση και ανάκληση δημόσιων συνδέσμων κοινής χρήσης για ταξίδια', +}; +export default oauth; diff --git a/shared/src/i18n/gr/packing.ts b/shared/src/i18n/gr/packing.ts new file mode 100644 index 00000000..f76eff36 --- /dev/null +++ b/shared/src/i18n/gr/packing.ts @@ -0,0 +1,92 @@ +import type { TranslationStrings } from '../types'; + +const packing: TranslationStrings = { + 'packing.title': 'Λίστα Αποσκευών', + 'packing.empty': 'Η λίστα αποσκευών είναι κενή', + 'packing.import': 'Εισαγωγή', + 'packing.importTitle': 'Εισαγωγή Λίστας Αποσκευών', + 'packing.importHint': 'Ένα αντικείμενο ανά γραμμή. Μορφή: Κατηγορία, Όνομα, Βάρος σε g (προαιρετικό), Τσάντα (προαιρετικό), checked/unchecked (προαιρετικό)', + 'packing.importPlaceholder': 'Υγιεινή, Οδοντόβουρτσα\nΡούχα, T-Shirts, 200\nΈγγραφα, Διαβατήριο, , Χειραποσκευή\nΗλεκτρονικά, Φορτιστής, 50, Βαλίτσα, checked', + 'packing.importCsv': 'Φόρτωση CSV/TXT', + 'packing.importAction': 'Εισαγωγή {count}', + 'packing.importSuccess': '{count} αντικείμενα εισήχθησαν', + 'packing.importError': 'Η εισαγωγή απέτυχε', + 'packing.importEmpty': 'Δεν υπάρχουν αντικείμενα προς εισαγωγή', + 'packing.progress': '{packed} από {total} συσκευασμένα ({percent}%)', + 'packing.clearChecked': 'Αφαίρεση {count} επιλεγμένων', + 'packing.clearCheckedShort': 'Αφαίρεση {count}', + 'packing.suggestions': 'Προτάσεις', + 'packing.suggestionsTitle': 'Προσθήκη Προτάσεων', + 'packing.allSuggested': 'Όλες οι προτάσεις προστέθηκαν', + 'packing.allPacked': 'Όλα έτοιμα!', + 'packing.addPlaceholder': 'Προσθήκη νέου αντικειμένου...', + 'packing.categoryPlaceholder': 'Κατηγορία...', + 'packing.filterAll': 'Όλα', + 'packing.filterOpen': 'Ανοιχτά', + 'packing.filterDone': 'Ολοκληρωμένα', + 'packing.emptyTitle': 'Η λίστα αποσκευών είναι κενή', + 'packing.emptyHint': 'Προσθέστε αντικείμενα ή χρησιμοποιήστε τις προτάσεις', + 'packing.emptyFiltered': 'Κανένα αντικείμενο δεν ταιριάζει με αυτό το φίλτρο', + 'packing.menuRename': 'Μετονομασία', + 'packing.menuCheckAll': 'Επιλογή Όλων', + 'packing.menuUncheckAll': 'Αποεπιλογή Όλων', + 'packing.menuDeleteCat': 'Διαγραφή Κατηγορίας', + 'packing.noMembers': 'Δεν υπάρχουν μέλη ταξιδιού', + 'packing.addItem': 'Προσθήκη αντικειμένου', + 'packing.addItemPlaceholder': 'Όνομα αντικειμένου...', + 'packing.addCategory': 'Προσθήκη κατηγορίας', + 'packing.newCategoryPlaceholder': 'Όνομα κατηγορίας (π.χ. Ρούχα)', + 'packing.applyTemplate': 'Εφαρμογή προτύπου', + 'packing.template': 'Πρότυπο', + 'packing.templateApplied': '{count} αντικείμενα προστέθηκαν από το πρότυπο', + 'packing.templateError': 'Αποτυχία εφαρμογής προτύπου', + 'packing.saveAsTemplate': 'Αποθήκευση ως πρότυπο', + 'packing.templateName': 'Όνομα προτύπου', + 'packing.templateSaved': 'Η λίστα αποσκευών αποθηκεύτηκε ως πρότυπο', + 'packing.bags': 'Τσάντες', + 'packing.noBag': 'Χωρίς ανάθεση', + 'packing.totalWeight': 'Συνολικό βάρος', + 'packing.bagName': 'Όνομα τσάντας...', + 'packing.addBag': 'Προσθήκη τσάντας', + 'packing.changeCategory': 'Αλλαγή Κατηγορίας', + 'packing.confirm.clearChecked': 'Είστε σίγουροι ότι θέλετε να αφαιρέσετε {count} επιλεγμένα αντικείμενα;', + 'packing.confirm.deleteCat': 'Είστε σίγουροι ότι θέλετε να διαγράψετε την κατηγορία "{name}" με {count} αντικείμενα;', + 'packing.defaultCategory': 'Άλλα', + 'packing.toast.saveError': 'Αποτυχία αποθήκευσης', + 'packing.toast.deleteError': 'Αποτυχία διαγραφής', + 'packing.toast.renameError': 'Αποτυχία μετονομασίας', + 'packing.toast.addError': 'Αποτυχία προσθήκης', + 'packing.suggestions.items': [ + { name: 'Διαβατήριο', category: 'Έγγραφα' }, + { name: 'Ταυτότητα', category: 'Έγγραφα' }, + { name: 'Ταξιδιωτική Ασφάλιση', category: 'Έγγραφα' }, + { name: 'Αεροπορικά Εισιτήρια', category: 'Έγγραφα' }, + { name: 'Πιστωτική Κάρτα', category: 'Οικονομικά' }, + { name: 'Μετρητά', category: 'Οικονομικά' }, + { name: 'Visa', category: 'Έγγραφα' }, + { name: 'T-Shirts', category: 'Ρούχα' }, + { name: 'Παντελόνια', category: 'Ρούχα' }, + { name: 'Εσώρουχα', category: 'Ρούχα' }, + { name: 'Κάλτσες', category: 'Ρούχα' }, + { name: 'Μπουφάν', category: 'Ρούχα' }, + { name: 'Πιτζάμες', category: 'Ρούχα' }, + { name: 'Μαγιό', category: 'Ρούχα' }, + { name: 'Αδιάβροχο', category: 'Ρούχα' }, + { name: 'Άνετα Παπούτσια', category: 'Ρούχα' }, + { name: 'Οδοντόβουρτσα', category: 'Είδη Υγιεινής' }, + { name: 'Οδοντόκρεμα', category: 'Είδη Υγιεινής' }, + { name: 'Σαμπουάν', category: 'Είδη Υγιεινής' }, + { name: 'Αποσμητικό', category: 'Είδη Υγιεινής' }, + { name: 'Αντηλιακό', category: 'Είδη Υγιεινής' }, + { name: 'Ξυριστική Μηχανή', category: 'Είδη Υγιεινής' }, + { name: 'Φορτιστής', category: 'Ηλεκτρονικά' }, + { name: 'Power Bank', category: 'Ηλεκτρονικά' }, + { name: 'Ακουστικά', category: 'Ηλεκτρονικά' }, + { name: 'Ταξιδιωτικός Αντάπτορας', category: 'Ηλεκτρονικά' }, + { name: 'Κάμερα', category: 'Ηλεκτρονικά' }, + { name: 'Παυσίπονα', category: 'Υγεία' }, + { name: 'Τσιρότα', category: 'Υγεία' }, + { name: 'Απολυμαντικό', category: 'Υγεία' }, + ], +}; +export default packing; diff --git a/shared/src/i18n/gr/pdf.ts b/shared/src/i18n/gr/pdf.ts new file mode 100644 index 00000000..8915c199 --- /dev/null +++ b/shared/src/i18n/gr/pdf.ts @@ -0,0 +1,10 @@ +import type { TranslationStrings } from '../types'; + +const pdf: TranslationStrings = { + 'pdf.travelPlan': 'Ταξιδιωτικό Πρόγραμμα', + 'pdf.planned': 'Προγραμματισμένο', + 'pdf.costLabel': 'Κόστος EUR', + 'pdf.preview': 'Προεπισκόπηση PDF', + 'pdf.saveAsPdf': 'Αποθήκευση ως PDF', +}; +export default pdf; diff --git a/shared/src/i18n/gr/perm.ts b/shared/src/i18n/gr/perm.ts new file mode 100644 index 00000000..5168c936 --- /dev/null +++ b/shared/src/i18n/gr/perm.ts @@ -0,0 +1,51 @@ +import type { TranslationStrings } from '../types'; + +const perm: TranslationStrings = { + 'perm.title': 'Ρυθμίσεις Δικαιωμάτων', + 'perm.subtitle': 'Ελέγξτε ποιος μπορεί να εκτελεί ενέργειες σε όλη την εφαρμογή', + 'perm.saved': 'Οι ρυθμίσεις δικαιωμάτων αποθηκεύτηκαν', + 'perm.resetDefaults': 'Επαναφορά προεπιλογών', + 'perm.customized': 'προσαρμοσμένο', + 'perm.level.admin': 'Μόνο διαχειριστής', + 'perm.level.tripOwner': 'Ιδιοκτήτης ταξιδιού', + 'perm.level.tripMember': 'Μέλη ταξιδιού', + 'perm.level.everybody': 'Όλοι', + 'perm.cat.trip': 'Διαχείριση Ταξιδιού', + 'perm.cat.members': 'Διαχείριση Μελών', + 'perm.cat.files': 'Αρχεία', + 'perm.cat.content': 'Περιεχόμενο & Πρόγραμμα', + 'perm.cat.extras': 'Προϋπολογισμός, Αποσκευές & Συνεργασία', + 'perm.action.trip_create': 'Δημιουργία ταξιδιών', + 'perm.action.trip_edit': 'Επεξεργασία λεπτομερειών ταξιδιού', + 'perm.action.trip_delete': 'Διαγραφή ταξιδιών', + 'perm.action.trip_archive': 'Αρχειοθέτηση / επαναφορά ταξιδιών', + 'perm.action.trip_cover_upload': 'Μεταφόρτωση εικόνας εξωφύλλου', + 'perm.action.member_manage': 'Προσθήκη / αφαίρεση μελών', + 'perm.action.file_upload': 'Μεταφόρτωση αρχείων', + 'perm.action.file_edit': 'Επεξεργασία μεταδεδομένων αρχείου', + 'perm.action.file_delete': 'Διαγραφή αρχείων', + 'perm.action.place_edit': 'Προσθήκη / επεξεργασία / διαγραφή τοποθεσιών', + 'perm.action.day_edit': 'Επεξεργασία ημερών, σημειώσεων & αναθέσεων', + 'perm.action.reservation_edit': 'Διαχείριση κρατήσεων', + 'perm.action.budget_edit': 'Διαχείριση προϋπολογισμού', + 'perm.action.packing_edit': 'Διαχείριση λιστών αποσκευών', + 'perm.action.collab_edit': 'Συνεργασία (σημειώσεις, δημοσκοπήσεις, συνομιλία)', + 'perm.action.share_manage': 'Διαχείριση συνδέσμων κοινής χρήσης', + 'perm.actionHint.trip_create': 'Ποιος μπορεί να δημιουργεί νέα ταξίδια', + 'perm.actionHint.trip_edit': 'Ποιος μπορεί να αλλάζει όνομα, ημερομηνίες, περιγραφή και νόμισμα ταξιδιού', + 'perm.actionHint.trip_delete': 'Ποιος μπορεί να διαγράφει οριστικά ένα ταξίδι', + 'perm.actionHint.trip_archive': 'Ποιος μπορεί να αρχειοθετεί ή να επαναφέρει ένα ταξίδι', + 'perm.actionHint.trip_cover_upload': 'Ποιος μπορεί να μεταφορτώνει ή να αλλάζει την εικόνα εξωφύλλου', + 'perm.actionHint.member_manage': 'Ποιος μπορεί να προσκαλεί ή να αφαιρεί μέλη ταξιδιού', + 'perm.actionHint.file_upload': 'Ποιος μπορεί να μεταφορτώνει αρχεία σε ένα ταξίδι', + 'perm.actionHint.file_edit': 'Ποιος μπορεί να επεξεργάζεται περιγραφές και συνδέσμους αρχείων', + 'perm.actionHint.file_delete': 'Ποιος μπορεί να μετακινεί αρχεία στον κάδο ή να τα διαγράφει οριστικά', + 'perm.actionHint.place_edit': 'Ποιος μπορεί να προσθέτει, να επεξεργάζεται ή να διαγράφει τοποθεσίες', + 'perm.actionHint.day_edit': 'Ποιος μπορεί να επεξεργάζεται ημέρες, σημειώσεις ημέρας και αναθέσεις τοποθεσιών', + 'perm.actionHint.reservation_edit': 'Ποιος μπορεί να δημιουργεί, να επεξεργάζεται ή να διαγράφει κρατήσεις', + 'perm.actionHint.budget_edit': 'Ποιος μπορεί να δημιουργεί, να επεξεργάζεται ή να διαγράφει στοιχεία προϋπολογισμού', + 'perm.actionHint.packing_edit': 'Ποιος μπορεί να διαχειρίζεται αντικείμενα και τσάντες αποσκευών', + 'perm.actionHint.collab_edit': 'Ποιος μπορεί να δημιουργεί σημειώσεις, δημοσκοπήσεις και να στέλνει μηνύματα', + 'perm.actionHint.share_manage': 'Ποιος μπορεί να δημιουργεί ή να διαγράφει δημόσιους συνδέσμους κοινής χρήσης', +}; +export default perm; diff --git a/shared/src/i18n/gr/photos.ts b/shared/src/i18n/gr/photos.ts new file mode 100644 index 00000000..8a65035b --- /dev/null +++ b/shared/src/i18n/gr/photos.ts @@ -0,0 +1,25 @@ +import type { TranslationStrings } from '../types'; + +const photos: TranslationStrings = { + 'photos.title': 'Φωτογραφίες', + 'photos.subtitle': '{count} φωτογραφίες για {trip}', + 'photos.dropHere': 'Αποθέστε φωτογραφίες εδώ...', + 'photos.dropHereActive': 'Αποθέστε φωτογραφίες εδώ', + 'photos.captionForAll': 'Λεζάντα (για όλες)', + 'photos.captionPlaceholder': 'Προαιρετική λεζάντα...', + 'photos.addCaption': 'Προσθήκη λεζάντας...', + 'photos.allDays': 'Όλες οι Ημέρες', + 'photos.noPhotos': 'Δεν υπάρχουν φωτογραφίες ακόμη', + 'photos.uploadHint': 'Μεταφορτώστε τις ταξιδιωτικές σας φωτογραφίες', + 'photos.clickToSelect': 'ή κάντε κλικ για επιλογή', + 'photos.linkPlace': 'Σύνδεση Τοποθεσίας', + 'photos.noPlace': 'Καμία Τοποθεσία', + 'photos.uploadN': 'Μεταφόρτωση {n} φωτογραφιών', + 'photos.linkDay': 'Σύνδεση Ημέρας', + 'photos.noDay': 'Καμία Ημέρα', + 'photos.dayLabel': 'Ημέρα {number}', + 'photos.photoSelected': 'Επιλέχθηκε φωτογραφία', + 'photos.photosSelected': 'Επιλέχθηκαν φωτογραφίες', + 'photos.fileTypeHint': 'JPG, PNG, WebP · μέγ. 10 MB · έως 30 φωτογραφίες', +}; +export default photos; diff --git a/shared/src/i18n/gr/places.ts b/shared/src/i18n/gr/places.ts new file mode 100644 index 00000000..02f179f0 --- /dev/null +++ b/shared/src/i18n/gr/places.ts @@ -0,0 +1,82 @@ +import type { TranslationStrings } from '../types'; + +const places: TranslationStrings = { + 'places.addPlace': 'Προσθήκη Μέρους/Δραστηριότητας', + 'places.importFile': 'Εισαγωγή αρχείου', + 'places.sidebarDrop': 'Αφήστε για εισαγωγή', + 'places.importFileHint': 'Εισαγωγή αρχείων .gpx, .kml ή .kmz από εργαλεία όπως Google My Maps, Google Earth ή GPS tracker.', + 'places.importFileDropHere': 'Κάντε κλικ για να επιλέξετε αρχείο ή σύρετε εδώ', + 'places.importFileDropActive': 'Αφήστε το αρχείο για επιλογή', + 'places.importFileUnsupported': 'Μη υποστηριζόμενος τύπος αρχείου. Χρησιμοποιήστε .gpx, .kml ή .kmz.', + 'places.importFileTooLarge': 'Το αρχείο είναι πολύ μεγάλο. Το μέγιστο μέγεθος μεταφόρτωσης είναι {maxMb} MB.', + 'places.importFileError': 'Η εισαγωγή απέτυχε', + 'places.importAllSkipped': 'Όλα τα μέρη υπήρχαν ήδη στο ταξίδι.', + 'places.gpxImported': '{count} μέρη εισήχθησαν από GPX', + 'places.gpxImportTypes': 'Τι θέλετε να εισάγετε;', + 'places.gpxImportWaypoints': 'Σημεία διαδρομής', + 'places.gpxImportRoutes': 'Διαδρομές', + 'places.gpxImportTracks': 'Ίχνη (με γεωμετρία διαδρομής)', + 'places.gpxImportNoneSelected': 'Επιλέξτε τουλάχιστον έναν τύπο για εισαγωγή.', + 'places.kmlImportTypes': 'Τι θέλετε να εισάγετε;', + 'places.kmlImportPoints': 'Σημεία (Placemarks)', + 'places.kmlImportPaths': 'Διαδρομές (LineStrings)', + 'places.kmlImportNoneSelected': 'Επιλέξτε τουλάχιστον έναν τύπο για εισαγωγή.', + 'places.selectionCount': '{count} επιλεγμένα', + 'places.deleteSelected': 'Διαγραφή επιλεγμένων', + 'places.kmlKmzImported': '{count} μέρη εισήχθησαν από KMZ/KML', + 'places.urlResolved': 'Το μέρος εισήχθη από URL', + 'places.importList': 'Εισαγωγή Λίστας', + 'places.kmlKmzSummaryValues': 'Placemarks: {total} • Εισήχθησαν: {created} • Παραλείφθηκαν: {skipped}', + 'places.importGoogleList': 'Λίστα Google', + 'places.importNaverList': 'Λίστα Naver', + 'places.googleListHint': 'Επικολλήστε έναν κοινοποιημένο σύνδεσμο λίστας Google Maps για να εισάγετε όλα τα μέρη.', + 'places.googleListImported': '{count} μέρη εισήχθησαν από "{list}"', + 'places.googleListError': 'Αποτυχία εισαγωγής λίστας Google Maps', + 'places.naverListHint': 'Επικολλήστε έναν κοινοποιημένο σύνδεσμο λίστας Naver Maps για να εισάγετε όλα τα μέρη.', + 'places.naverListImported': '{count} μέρη εισήχθησαν από "{list}"', + 'places.naverListError': 'Αποτυχία εισαγωγής λίστας Naver Maps', + 'places.viewDetails': 'Προβολή Λεπτομερειών', + 'places.assignToDay': 'Σε ποια ημέρα να προστεθεί;', + 'places.all': 'Όλα', + 'places.unplanned': 'Μη προγραμματισμένα', + 'places.filterTracks': 'Ίχνη', + 'places.search': 'Αναζήτηση μερών...', + 'places.allCategories': 'Όλες οι Κατηγορίες', + 'places.categoriesSelected': 'κατηγορίες', + 'places.clearFilter': 'Καθαρισμός φίλτρου', + 'places.count': '{count} μέρη', + 'places.countSingular': '1 μέρος', + 'places.allPlanned': 'Όλα τα μέρη είναι προγραμματισμένα', + 'places.noneFound': 'Δεν βρέθηκαν μέρη', + 'places.editPlace': 'Επεξεργασία Μέρους', + 'places.formName': 'Όνομα', + 'places.formNamePlaceholder': 'π.χ. Πύργος του Άιφελ', + 'places.formDescription': 'Περιγραφή', + 'places.formDescriptionPlaceholder': 'Σύντομη περιγραφή...', + 'places.formAddress': 'Διεύθυνση', + 'places.formAddressPlaceholder': 'Οδός, Πόλη, Χώρα', + 'places.formLat': 'Γεωγραφικό Πλάτος (π.χ. 48.8566)', + 'places.formLng': 'Γεωγραφικό Μήκος (π.χ. 2.3522)', + 'places.formCategory': 'Κατηγορία', + 'places.noCategory': 'Χωρίς Κατηγορία', + 'places.categoryNamePlaceholder': 'Όνομα κατηγορίας', + 'places.formTime': 'Ώρα', + 'places.startTime': 'Έναρξη', + 'places.endTime': 'Λήξη', + 'places.endTimeBeforeStart': 'Η ώρα λήξης είναι πριν την ώρα έναρξης', + 'places.timeCollision': 'Επικάλυψη ώρας με:', + 'places.formWebsite': 'Ιστοσελίδα', + 'places.formNotes': 'Σημειώσεις', + 'places.formNotesPlaceholder': 'Προσωπικές σημειώσεις...', + 'places.formReservation': 'Κράτηση', + 'places.reservationNotesPlaceholder': 'Σημειώσεις κράτησης, αριθμός επιβεβαίωσης...', + 'places.mapsSearchPlaceholder': 'Αναζήτηση μερών...', + 'places.mapsSearchError': 'Η αναζήτηση μέρους απέτυχε.', + 'places.loadingDetails': 'Φόρτωση λεπτομερειών μέρους…', + 'places.osmHint': 'Χρήση αναζήτησης OpenStreetMap (χωρίς φωτογραφίες, ώρες λειτουργίας ή αξιολογήσεις). Προσθέστε ένα κλειδί Google API στις ρυθμίσεις για πλήρεις λεπτομέρειες.', + 'places.osmActive': 'Αναζήτηση μέσω OpenStreetMap (χωρίς φωτογραφίες, αξιολογήσεις ή ώρες λειτουργίας). Προσθέστε ένα κλειδί Google API στις Ρυθμίσεις για εμπλουτισμένα δεδομένα.', + 'places.categoryCreateError': 'Αποτυχία δημιουργίας κατηγορίας', + 'places.nameRequired': 'Παρακαλώ εισαγάγετε ένα όνομα', + 'places.saveError': 'Αποτυχία αποθήκευσης', +}; +export default places; diff --git a/shared/src/i18n/gr/planner.ts b/shared/src/i18n/gr/planner.ts new file mode 100644 index 00000000..c2efbc75 --- /dev/null +++ b/shared/src/i18n/gr/planner.ts @@ -0,0 +1,66 @@ +import type { TranslationStrings } from '../types'; + +const planner: TranslationStrings = { + 'planner.places': 'Τοποθεσίες', + 'planner.bookings': 'Κρατήσεις', + 'planner.packingList': 'Λίστα Αποσκευών', + 'planner.documents': 'Έγγραφα', + 'planner.dayPlan': 'Πρόγραμμα Ημέρας', + 'planner.reservations': 'Κρατήσεις', + 'planner.minTwoPlaces': 'Απαιτούνται τουλάχιστον 2 τοποθεσίες με συντεταγμένες', + 'planner.noGeoPlaces': 'Δεν υπάρχουν διαθέσιμες τοποθεσίες με συντεταγμένες', + 'planner.routeCalculated': 'Η διαδρομή υπολογίστηκε', + 'planner.routeCalcFailed': 'Δεν ήταν δυνατός ο υπολογισμός της διαδρομής', + 'planner.routeError': 'Σφάλμα υπολογισμού διαδρομής', + 'planner.icsExportFailed': 'Η εξαγωγή ICS απέτυχε', + 'planner.routeOptimized': 'Η διαδρομή βελτιστοποιήθηκε', + 'planner.reservationUpdated': 'Η κράτηση ενημερώθηκε', + 'planner.reservationAdded': 'Η κράτηση προστέθηκε', + 'planner.confirmDeleteReservation': 'Διαγραφή κράτησης;', + 'planner.reservationDeleted': 'Η κράτηση διαγράφηκε', + 'planner.days': 'Ημέρες', + 'planner.allPlaces': 'Όλες οι Τοποθεσίες', + 'planner.totalPlaces': '{n} τοποθεσίες συνολικά', + 'planner.noDaysPlanned': 'Δεν έχουν προγραμματιστεί ημέρες ακόμη', + 'planner.editTrip': 'Επεξεργασία ταξιδιού \u2192', + 'planner.placeOne': '1 τοποθεσία', + 'planner.placeN': '{n} τοποθεσίες', + 'planner.addNote': 'Προσθήκη σημείωσης', + 'planner.noEntries': 'Καμία καταχώρηση για αυτή την ημέρα', + 'planner.addPlace': 'Προσθήκη τοποθεσίας/δραστηριότητας', + 'planner.addPlaceShort': '+ Προσθήκη τοποθεσίας/δραστηριότητας', + 'planner.resPending': 'Κράτηση σε εκκρεμότητα · ', + 'planner.resConfirmed': 'Κράτηση επιβεβαιωμένη · ', + 'planner.notePlaceholder': 'Σημείωση\u2026', + 'planner.noteTimePlaceholder': 'Ώρα (προαιρετικό)', + 'planner.noteExamplePlaceholder': 'π.χ. S3 στις 14:30 από τον κεντρικό σταθμό, φέρι από την προβλήτα 7, διάλειμμα μεσημεριανού\u2026', + 'planner.totalCost': 'Συνολικό κόστος', + 'planner.searchPlaces': 'Αναζήτηση τοποθεσιών\u2026', + 'planner.allCategories': 'Όλες οι Κατηγορίες', + 'planner.noPlacesFound': 'Δεν βρέθηκαν τοποθεσίες', + 'planner.addFirstPlace': 'Προσθήκη πρώτης τοποθεσίας', + 'planner.noReservations': 'Καμία κράτηση', + 'planner.addFirstReservation': 'Προσθήκη πρώτης κράτησης', + 'planner.new': 'Νέα', + 'planner.addToDay': '+ Ημέρα', + 'planner.calculating': 'Υπολογισμός\u2026', + 'planner.route': 'Διαδρομή', + 'planner.optimize': 'Βελτιστοποίηση', + 'planner.openGoogleMaps': 'Άνοιγμα στο Google Maps', + 'planner.selectDayHint': 'Επιλέξτε μια ημέρα από την αριστερή λίστα για να δείτε το πρόγραμμα', + 'planner.noPlacesForDay': 'Δεν υπάρχουν τοποθεσίες για αυτή την ημέρα ακόμη', + 'planner.addPlacesLink': 'Προσθήκη τοποθεσιών \u2192', + 'planner.minTotal': 'λεπτά σύνολο', + 'planner.noReservation': 'Καμία κράτηση', + 'planner.removeFromDay': 'Αφαίρεση από την ημέρα', + 'planner.addToThisDay': 'Προσθήκη στην ημέρα', + 'planner.overview': 'Επισκόπηση', + 'planner.noDays': 'Δεν υπάρχουν ημέρες ακόμη', + 'planner.editTripToAddDays': 'Επεξεργαστείτε το ταξίδι για προσθήκη ημερών', + 'planner.dayCount': '{n} Ημέρες', + 'planner.clickToUnlock': 'Κάντε κλικ για ξεκλείδωμα', + 'planner.keepPosition': 'Διατήρηση θέσης κατά τη βελτιστοποίηση διαδρομής', + 'planner.dayDetails': 'Λεπτομέρειες ημέρας', + 'planner.dayN': 'Ημέρα {n}', +}; +export default planner; diff --git a/shared/src/i18n/gr/register.ts b/shared/src/i18n/gr/register.ts new file mode 100644 index 00000000..5e14b1e2 --- /dev/null +++ b/shared/src/i18n/gr/register.ts @@ -0,0 +1,25 @@ +import type { TranslationStrings } from '../types'; + +const register: TranslationStrings = { + 'register.passwordMismatch': 'Οι κωδικοί δεν ταιριάζουν', + 'register.passwordTooShort': 'Ο κωδικός πρέπει να έχει τουλάχιστον 8 χαρακτήρες', + 'register.failed': 'Η εγγραφή απέτυχε', + 'register.getStarted': 'Ξεκινήστε', + 'register.subtitle': 'Δημιουργήστε έναν λογαριασμό και ξεκινήστε να σχεδιάζετε τα ταξίδια των ονείρων σας.', + 'register.feature1': 'Απεριόριστα σχέδια ταξιδιών', + 'register.feature2': 'Διαδραστική προβολή χάρτη', + 'register.feature3': 'Διαχείριση τόπων και κατηγοριών', + 'register.feature4': 'Παρακολούθηση κρατήσεων', + 'register.feature5': 'Δημιουργία λιστών πακεταρίσματος', + 'register.feature6': 'Αποθήκευση φωτογραφιών και αρχείων', + 'register.createAccount': 'Δημιουργία Λογαριασμού', + 'register.startPlanning': 'Ξεκινήστε τον σχεδιασμό του ταξιδιού σας', + 'register.minChars': 'Ελάχ. 6 χαρακτήρες', + 'register.confirmPassword': 'Επιβεβαίωση Κωδικού', + 'register.repeatPassword': 'Επανάληψη κωδικού', + 'register.registering': 'Εγγραφή...', + 'register.register': 'Εγγραφή', + 'register.hasAccount': 'Έχετε ήδη λογαριασμό;', + 'register.signIn': 'Σύνδεση', +}; +export default register; diff --git a/shared/src/i18n/gr/reservations.ts b/shared/src/i18n/gr/reservations.ts new file mode 100644 index 00000000..ec0c6b1b --- /dev/null +++ b/shared/src/i18n/gr/reservations.ts @@ -0,0 +1,113 @@ +import type { TranslationStrings } from '../types'; + +const reservations: TranslationStrings = { + 'reservations.title': 'Κρατήσεις', + 'reservations.empty': 'Δεν υπάρχουν κρατήσεις ακόμη', + 'reservations.emptyHint': 'Προσθέστε κρατήσεις για πτήσεις, ξενοδοχεία και άλλα', + 'reservations.add': 'Προσθήκη Κράτησης', + 'reservations.addManual': 'Χειροκίνητη Κράτηση', + 'reservations.placeHint': 'Συμβουλή: Οι κρατήσεις δημιουργούνται καλύτερα απευθείας από ένα μέρος για να συνδεθούν με το ημερήσιο πλάνο σας.', + 'reservations.confirmed': 'Επιβεβαιωμένο', + 'reservations.pending': 'Εκκρεμές', + 'reservations.summary': '{confirmed} επιβεβαιωμένες, {pending} εκκρεμείς', + 'reservations.fromPlan': 'Από το Πλάνο', + 'reservations.showFiles': 'Εμφάνιση Αρχείων', + 'reservations.editTitle': 'Επεξεργασία Κράτησης', + 'reservations.status': 'Κατάσταση', + 'reservations.datetime': 'Ημερομηνία & Ώρα', + 'reservations.startTime': 'Ώρα έναρξης', + 'reservations.endTime': 'Ώρα λήξης', + 'reservations.date': 'Ημερομηνία', + 'reservations.time': 'Ώρα', + 'reservations.timeAlt': 'Ώρα (εναλλακτικά, π.χ. 19:30)', + 'reservations.notes': 'Σημειώσεις', + 'reservations.notesPlaceholder': 'Πρόσθετες σημειώσεις...', + 'reservations.meta.airline': 'Αεροπορική Εταιρεία', + 'reservations.meta.flightNumber': 'Αρ. Πτήσης', + 'reservations.meta.from': 'Από', + 'reservations.meta.to': 'Προς', + 'reservations.needsReview': 'Έλεγχος', + 'reservations.needsReviewHint': 'Δεν ήταν δυνατή η αυτόματη αντιστοίχιση του αεροδρομίου — παρακαλώ επιβεβαιώστε την τοποθεσία.', + 'reservations.searchLocation': 'Αναζήτηση σταθμού, λιμανιού, διεύθυνσης…', + 'reservations.meta.trainNumber': 'Αρ. Τρένου', + 'reservations.meta.platform': 'Αποβάθρα', + 'reservations.meta.seat': 'Θέση', + 'reservations.meta.checkIn': 'Check-in', + 'reservations.meta.checkInUntil': 'Check-in έως', + 'reservations.meta.checkOut': 'Check-out', + 'reservations.meta.linkAccommodation': 'Κατάλυμα', + 'reservations.meta.pickAccommodation': 'Σύνδεση με κατάλυμα', + 'reservations.meta.noAccommodation': 'Κανένα', + 'reservations.meta.hotelPlace': 'Κατάλυμα', + 'reservations.meta.pickHotel': 'Επιλογή καταλύματος', + 'reservations.meta.fromDay': 'Από', + 'reservations.meta.toDay': 'Προς', + 'reservations.meta.selectDay': 'Επιλογή ημέρας', + 'reservations.type.flight': 'Πτήση', + 'reservations.type.hotel': 'Κατάλυμα', + 'reservations.type.restaurant': 'Εστιατόριο', + 'reservations.type.train': 'Τρένο', + 'reservations.type.car': 'Αυτοκίνητο', + 'reservations.type.cruise': 'Κρουαζιέρα', + 'reservations.type.event': 'Εκδήλωση', + 'reservations.type.tour': 'Περιήγηση', + 'reservations.type.other': 'Άλλο', + 'reservations.confirm.delete': 'Είστε σίγουροι ότι θέλετε να διαγράψετε την κράτηση "{name}";', + 'reservations.confirm.deleteTitle': 'Διαγραφή κράτησης;', + 'reservations.confirm.deleteBody': 'Η κράτηση "{name}" θα διαγραφεί οριστικά.', + 'reservations.toast.updated': 'Η κράτηση ενημερώθηκε', + 'reservations.toast.removed': 'Η κράτηση διαγράφηκε', + 'reservations.toast.fileUploaded': 'Το αρχείο μεταφορτώθηκε', + 'reservations.toast.uploadError': 'Η μεταφόρτωση απέτυχε', + 'reservations.newTitle': 'Νέα Κράτηση', + 'reservations.bookingType': 'Τύπος Κράτησης', + 'reservations.titleLabel': 'Τίτλος', + 'reservations.titlePlaceholder': 'π.χ. Lufthansa LH123, Hotel Adlon, ...', + 'reservations.locationAddress': 'Τοποθεσία / Διεύθυνση', + 'reservations.locationPlaceholder': 'Διεύθυνση, Αεροδρόμιο, Ξενοδοχείο...', + 'reservations.confirmationCode': 'Κωδικός Κράτησης', + 'reservations.confirmationPlaceholder': 'π.χ. ABC12345', + 'reservations.day': 'Ημέρα', + 'reservations.noDay': 'Καμία Ημέρα', + 'reservations.place': 'Μέρος', + 'reservations.noPlace': 'Κανένα Μέρος', + 'reservations.pendingSave': 'θα αποθηκευτεί…', + 'reservations.uploading': 'Μεταφόρτωση...', + 'reservations.attachFile': 'Επισύναψη αρχείου', + 'reservations.linkExisting': 'Σύνδεση υπάρχοντος αρχείου', + 'reservations.toast.saveError': 'Αποτυχία αποθήκευσης', + 'reservations.toast.updateError': 'Αποτυχία ενημέρωσης', + 'reservations.toast.deleteError': 'Αποτυχία διαγραφής', + 'reservations.confirm.remove': 'Αφαίρεση κράτησης για "{name}";', + 'reservations.linkAssignment': 'Σύνδεση με ανάθεση ημέρας', + 'reservations.pickAssignment': 'Επιλέξτε μια ανάθεση από το πλάνο σας...', + 'reservations.noAssignment': 'Χωρίς σύνδεση (ανεξάρτητη)', + 'reservations.price': 'Τιμή', + 'reservations.budgetCategory': 'Κατηγορία προϋπολογισμού', + 'reservations.budgetCategoryPlaceholder': 'π.χ. Μεταφορά, Κατάλυμα', + 'reservations.budgetCategoryAuto': 'Αυτόματα (από τον τύπο κράτησης)', + 'reservations.budgetHint': 'Μια εγγραφή προϋπολογισμού θα δημιουργηθεί αυτόματα κατά την αποθήκευση.', + 'reservations.departureDate': 'Αναχώρηση', + 'reservations.arrivalDate': 'Άφιξη', + 'reservations.departureTime': 'Ώρα αναχ.', + 'reservations.arrivalTime': 'Ώρα άφ.', + 'reservations.pickupDate': 'Παραλαβή', + 'reservations.returnDate': 'Επιστροφή', + 'reservations.pickupTime': 'Ώρα παραλαβής', + 'reservations.returnTime': 'Ώρα επιστροφής', + 'reservations.endDate': 'Ημερομηνία λήξης', + 'reservations.meta.departureTimezone': 'Ζώνη ώρας αναχ.', + 'reservations.meta.arrivalTimezone': 'Ζώνη ώρας άφ.', + 'reservations.span.departure': 'Αναχώρηση', + 'reservations.span.arrival': 'Άφιξη', + 'reservations.span.inTransit': 'Σε διέλευση', + 'reservations.span.pickup': 'Παραλαβή', + 'reservations.span.return': 'Επιστροφή', + 'reservations.span.active': 'Ενεργό', + 'reservations.span.start': 'Έναρξη', + 'reservations.span.end': 'Λήξη', + 'reservations.span.ongoing': 'Σε εξέλιξη', + 'reservations.validation.endBeforeStart': 'Η ημερομηνία/ώρα λήξης πρέπει να είναι μετά την ημερομηνία/ώρα έναρξης', + 'reservations.addBooking': 'Προσθήκη κράτησης', +}; +export default reservations; diff --git a/shared/src/i18n/gr/settings.ts b/shared/src/i18n/gr/settings.ts new file mode 100644 index 00000000..01579747 --- /dev/null +++ b/shared/src/i18n/gr/settings.ts @@ -0,0 +1,251 @@ +import type { TranslationStrings } from '../types'; + +const settings: TranslationStrings = { + 'settings.title': 'Ρυθμίσεις', + 'settings.subtitle': 'Διαμορφώστε τις προσωπικές σας ρυθμίσεις', + 'settings.tabs.display': 'Εμφάνιση', + 'settings.tabs.map': 'Χάρτης', + 'settings.tabs.notifications': 'Ειδοποιήσεις', + 'settings.tabs.integrations': 'Ενσωματώσεις', + 'settings.tabs.account': 'Λογαριασμός', + 'settings.tabs.offline': 'Εκτός σύνδεσης', + 'settings.tabs.about': 'Σχετικά', + 'settings.map': 'Χάρτης', + 'settings.mapTemplate': 'Πρότυπο Χάρτη', + 'settings.mapTemplatePlaceholder.select': 'Επιλέξτε πρότυπο...', + 'settings.mapDefaultHint': 'Αφήστε κενό για OpenStreetMap (προεπιλογή)', + 'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'settings.mapHint': 'Πρότυπο URL για πλακίδια χάρτη', + 'settings.mapProvider': 'Πάροχος Χάρτη', + 'settings.mapProviderHint': 'Επηρεάζει τους χάρτες του Trip Planner και του Journey. Το Atlas χρησιμοποιεί πάντα Leaflet.', + 'settings.mapLeafletSubtitle': 'Κλασικό 2D, οποιαδήποτε raster πλακίδια', + 'settings.mapMapboxSubtitle': 'Διανυσματικά πλακίδια, 3D κτίρια & ανάγλυφο', + 'settings.mapExperimental': 'Πειραματικό', + 'settings.mapMapboxToken': 'Mapbox Access Token', + 'settings.mapMapboxTokenHint': 'Δημόσιο token (pk.*) από', + 'settings.mapMapboxTokenLink': 'mapbox.com → Access tokens', + 'settings.mapStyle': 'Στυλ Χάρτη', + 'settings.mapStylePlaceholder': 'Επιλέξτε ένα στυλ Mapbox', + 'settings.mapStyleHint': 'Προκαθορισμένο ή δικό σας mapbox://styles/USER/ID URL', + 'settings.map3dBuildings': '3D Κτίρια & Ανάγλυφο', + 'settings.map3dHint': 'Κλίση + πραγματικές 3D προεξοχές κτιρίων — λειτουργεί σε κάθε στυλ, συμπεριλαμβανομένου του δορυφορικού.', + 'settings.mapHighQuality': 'Λειτουργία Υψηλής Ποιότητας', + 'settings.mapHighQualityHint': 'Antialiasing + προβολή υδρογείου για ευκρινέστερες ακμές και ρεαλιστική όψη του κόσμου.', + 'settings.mapHighQualityWarning': 'Μπορεί να επηρεάσει την απόδοση σε συσκευές χαμηλότερων προδιαγραφών.', + 'settings.mapTipLabel': 'Συμβουλή:', + 'settings.mapTip': 'κάντε δεξί κλικ και σύρετε για περιστροφή/κλίση του χάρτη. Μεσαίο κλικ για προσθήκη τοποθεσίας (το δεξί κλικ έχει κρατηθεί για περιστροφή).', + 'settings.latitude': 'Γεωγραφικό Πλάτος', + 'settings.longitude': 'Γεωγραφικό Μήκος', + 'settings.saveMap': 'Αποθήκευση Χάρτη', + 'settings.apiKeys': 'Κλειδιά API', + 'settings.mapsKey': 'Google Maps API Key', + 'settings.mapsKeyHint': 'Για αναζήτηση τοποθεσιών. Απαιτείται Places API (New). Λάβετε το από console.cloud.google.com', + 'settings.weatherKey': 'OpenWeatherMap API Key', + 'settings.weatherKeyHint': 'Για δεδομένα καιρού. Δωρεάν στο openweathermap.org/api', + 'settings.keyPlaceholder': 'Εισάγετε κλειδί...', + 'settings.configured': 'Διαμορφωμένο', + 'settings.saveKeys': 'Αποθήκευση Κλειδιών', + 'settings.display': 'Εμφάνιση', + 'settings.colorMode': 'Λειτουργία Χρώματος', + 'settings.light': 'Φωτεινό', + 'settings.dark': 'Σκούρο', + 'settings.auto': 'Αυτόματο', + 'settings.language': 'Γλώσσα', + 'settings.temperature': 'Μονάδα Θερμοκρασίας', + 'settings.timeFormat': 'Μορφή Ώρας', + 'settings.routeCalculation': 'Υπολογισμός Διαδρομής', + 'settings.bookingLabels': 'Ετικέτες διαδρομής κρατήσεων', + 'settings.bookingLabelsHint': 'Εμφάνιση ονομάτων σταθμών / αεροδρομίων στον χάρτη. Όταν είναι απενεργοποιημένο, εμφανίζεται μόνο το εικονίδιο.', + 'settings.blurBookingCodes': 'Θόλωμα Κωδικών Κρατήσεων', + 'settings.notifications': 'Ειδοποιήσεις', + 'settings.notifyTripInvite': 'Προσκλήσεις ταξιδιού', + 'settings.notifyBookingChange': 'Αλλαγές κρατήσεων', + 'settings.notifyTripReminder': 'Υπενθυμίσεις ταξιδιού', + 'settings.notifyTodoDue': 'Εκκρεμότητα λήγει σύντομα', + 'settings.notifyVacayInvite': 'Προσκλήσεις Vacay fusion', + 'settings.notifyPhotosShared': 'Κοινόχρηστες φωτογραφίες (Immich)', + 'settings.notifyCollabMessage': 'Μηνύματα συνομιλίας (Collab)', + 'settings.notifyPackingTagged': 'Λίστα πακεταρίσματος: αναθέσεις', + 'settings.notifyWebhook': 'Ειδοποιήσεις Webhook', + 'settings.notifyVersionAvailable': 'Διαθέσιμη νέα έκδοση', + 'settings.notificationPreferences.email': 'Email', + 'settings.notificationPreferences.webhook': 'Webhook', + 'settings.notificationPreferences.inapp': 'Εντός εφαρμογής', + 'settings.notificationPreferences.ntfy': 'Ntfy', + 'settings.notificationPreferences.noChannels': 'Δεν έχουν διαμορφωθεί κανάλια ειδοποιήσεων. Ζητήστε από έναν διαχειριστή να ρυθμίσει ειδοποιήσεις email ή webhook.', + 'settings.webhookUrl.label': 'Webhook URL', + 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', + 'settings.webhookUrl.hint': 'Εισάγετε το Discord, Slack ή προσαρμοσμένο webhook URL σας για να λαμβάνετε ειδοποιήσεις.', + 'settings.webhookUrl.saved': 'Το Webhook URL αποθηκεύτηκε', + 'settings.webhookUrl.test': 'Δοκιμή', + 'settings.webhookUrl.testSuccess': 'Η δοκιμή webhook στάλθηκε επιτυχώς', + 'settings.webhookUrl.testFailed': 'Η δοκιμή webhook απέτυχε', + 'settings.ntfyUrl.topicLabel': 'Θέμα Ntfy', + 'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts', + 'settings.ntfyUrl.serverLabel': 'URL Ntfy Server (προαιρετικό)', + 'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh', + 'settings.ntfyUrl.hint': 'Εισάγετε το ntfy topic σας για να λαμβάνετε push ειδοποιήσεις. Αφήστε τον server κενό για χρήση του προεπιλεγμένου από τον διαχειριστή.', + 'settings.ntfyUrl.tokenLabel': 'Access Token (προαιρετικό)', + 'settings.ntfyUrl.tokenHint': 'Απαιτείται για θέματα προστατευμένα με κωδικό.', + 'settings.ntfyUrl.saved': 'Οι ρυθμίσεις Ntfy αποθηκεύτηκαν', + 'settings.ntfyUrl.test': 'Δοκιμή', + 'settings.ntfyUrl.testSuccess': 'Η δοκιμαστική ειδοποίηση ntfy στάλθηκε επιτυχώς', + 'settings.ntfyUrl.testFailed': 'Η δοκιμαστική ειδοποίηση ntfy απέτυχε', + 'settings.ntfyUrl.tokenCleared': 'Το access token εκκαθαρίστηκε', + 'settings.notificationsDisabled': 'Οι ειδοποιήσεις δεν έχουν διαμορφωθεί. Ζητήστε από έναν διαχειριστή να ενεργοποιήσει ειδοποιήσεις email ή webhook.', + 'settings.notificationsActive': 'Ενεργό κανάλι', + 'settings.notificationsManagedByAdmin': 'Τα συμβάντα ειδοποιήσεων διαμορφώνονται από τον διαχειριστή σας.', + 'settings.on': 'Ενεργό', + 'settings.off': 'Ανενεργό', + 'settings.mcp.title': 'Διαμόρφωση MCP', + 'settings.mcp.endpoint': 'MCP Endpoint', + 'settings.mcp.clientConfig': 'Διαμόρφωση Πελάτη', + 'settings.mcp.clientConfigHint': 'Αντικαταστήστε το με ένα API token από την παρακάτω λίστα. Η διαδρομή για το npx ίσως χρειαστεί να προσαρμοστεί για το σύστημά σας (π.χ. C:\\PROGRA~1\\nodejs\\npx.cmd στα Windows).', + 'settings.mcp.clientConfigHintOAuth': 'Αντικαταστήστε τα και με τα διαπιστευτήρια που εμφανίζονται στον πελάτη OAuth 2.1 που δημιουργήσατε παραπάνω. Το mcp-remote θα ανοίξει τον browser σας για να ολοκληρώσετε την εξουσιοδότηση την πρώτη φορά που θα συνδεθείτε. Η διαδρομή για το npx ίσως χρειαστεί να προσαρμοστεί για το σύστημά σας (π.χ. C:\PROGRA~1\nodejs\npx.cmd στα Windows).', + 'settings.mcp.copy': 'Αντιγραφή', + 'settings.mcp.copied': 'Αντιγράφηκε!', + 'settings.mcp.apiTokens': 'API Tokens', + 'settings.mcp.createToken': 'Δημιουργία νέου Token', + 'settings.mcp.noTokens': 'Δεν υπάρχουν tokens ακόμη. Δημιουργήστε ένα για να συνδέσετε πελάτες MCP.', + 'settings.mcp.tokenCreatedAt': 'Δημιουργήθηκε', + 'settings.mcp.tokenUsedAt': 'Χρησιμοποιήθηκε', + 'settings.mcp.deleteTokenTitle': 'Διαγραφή Token', + 'settings.mcp.deleteTokenMessage': 'Αυτό το token θα σταματήσει να λειτουργεί αμέσως. Οποιοσδήποτε πελάτης MCP το χρησιμοποιεί θα χάσει την πρόσβαση.', + 'settings.mcp.modal.createTitle': 'Δημιουργία API Token', + 'settings.mcp.modal.tokenName': 'Όνομα Token', + 'settings.mcp.modal.tokenNamePlaceholder': 'π.χ. Claude Desktop, Φορητός εργασίας', + 'settings.mcp.modal.creating': 'Δημιουργία…', + 'settings.mcp.modal.create': 'Δημιουργία Token', + 'settings.mcp.modal.createdTitle': 'Το Token δημιουργήθηκε', + 'settings.mcp.modal.createdWarning': 'Αυτό το token θα εμφανιστεί μόνο μία φορά. Αντιγράψτε και αποθηκεύστε το τώρα — δεν μπορεί να ανακτηθεί.', + 'settings.mcp.modal.done': 'Ολοκληρώθηκε', + 'settings.mcp.toast.created': 'Το token δημιουργήθηκε', + 'settings.mcp.toast.createError': 'Αποτυχία δημιουργίας token', + 'settings.mcp.toast.deleted': 'Το token διαγράφηκε', + 'settings.mcp.toast.deleteError': 'Αποτυχία διαγραφής token', + 'settings.mcp.apiTokensDeprecated': 'Τα API Tokens έχουν καταργηθεί και θα αφαιρεθούν σε μελλοντική έκδοση. Παρακαλώ χρησιμοποιήστε OAuth 2.1 Clients αντί αυτών.', + 'settings.oauth.clients': 'OAuth 2.1 Clients', + 'settings.oauth.clientsHint': 'Καταχωρήστε πελάτες OAuth 2.1 για να επιτρέψετε σε εφαρμογές MCP τρίτων (Claude Web, Cursor, κ.λπ.) να συνδέονται χωρίς στατικά tokens.', + 'settings.oauth.createClient': 'Νέος Πελάτης', + 'settings.oauth.noClients': 'Δεν έχουν καταχωρηθεί πελάτες OAuth.', + 'settings.oauth.clientId': 'Client ID', + 'settings.oauth.clientSecret': 'Client Secret', + 'settings.oauth.deleteClient': 'Διαγραφή Πελάτη', + 'settings.oauth.deleteClientMessage': 'Αυτός ο πελάτης και όλες οι ενεργές συνεδρίες θα αφαιρεθούν μόνιμα. Οποιαδήποτε εφαρμογή τον χρησιμοποιεί θα χάσει την πρόσβαση αμέσως.', + 'settings.oauth.rotateSecret': 'Εναλλαγή Secret', + 'settings.oauth.rotateSecretMessage': 'Θα δημιουργηθεί ένα νέο client secret και όλες οι υπάρχουσες συνεδρίες θα ακυρωθούν αμέσως. Ενημερώστε την εφαρμογή σας πριν κλείσετε αυτό το παράθυρο.', + 'settings.oauth.rotateSecretConfirm': 'Εναλλαγή', + 'settings.oauth.rotateSecretConfirming': 'Εναλλαγή…', + 'settings.oauth.rotateSecretDoneTitle': 'Δημιουργήθηκε νέο Secret', + 'settings.oauth.rotateSecretDoneWarning': 'Αυτό το secret εμφανίζεται μόνο μία φορά. Αντιγράψτε το τώρα και ενημερώστε την εφαρμογή σας — όλες οι προηγούμενες συνεδρίες έχουν ακυρωθεί.', + 'settings.oauth.activeSessions': 'Ενεργές Συνεδρίες OAuth', + 'settings.oauth.sessionScopes': 'Scopes', + 'settings.oauth.sessionExpires': 'Λήγει', + 'settings.oauth.revoke': 'Ανάκληση', + 'settings.oauth.revokeSession': 'Ανάκληση Συνεδρίας', + 'settings.oauth.revokeSessionMessage': 'Αυτό θα ανακαλέσει αμέσως την πρόσβαση για αυτή τη συνεδρία OAuth.', + 'settings.oauth.modal.createTitle': 'Καταχώρηση Πελάτη OAuth', + 'settings.oauth.modal.presets': 'Γρήγορες προεπιλογές', + 'settings.oauth.modal.clientName': 'Όνομα Εφαρμογής', + 'settings.oauth.modal.clientNamePlaceholder': 'π.χ. Claude Web, Η εφαρμογή μου MCP', + 'settings.oauth.modal.redirectUris': 'Redirect URIs', + 'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth', + 'settings.oauth.modal.redirectUrisHint': 'Ένα URI ανά γραμμή. Απαιτείται HTTPS (το localhost εξαιρείται). Επιβάλλεται ακριβής αντιστοίχιση.', + 'settings.oauth.modal.scopes': 'Επιτρεπόμενα Scopes', + 'settings.oauth.modal.scopesHint': 'Τα list_trips και get_trip_summary είναι πάντα διαθέσιμα — δεν απαιτείται scope. Επιτρέπουν στο AI να εντοπίζει τα trip IDs που χρειάζονται για τη χρήση οποιουδήποτε άλλου εργαλείου.', + 'settings.oauth.modal.selectAll': 'Επιλογή όλων', + 'settings.oauth.modal.deselectAll': 'Απο-επιλογή όλων', + 'settings.oauth.modal.creating': 'Καταχώρηση…', + 'settings.oauth.modal.create': 'Καταχώρηση Πελάτη', + 'settings.oauth.modal.createdTitle': 'Ο Πελάτης Καταχωρήθηκε', + 'settings.oauth.modal.createdWarning': 'Το client secret εμφανίζεται μόνο μία φορά. Αντιγράψτε το τώρα — δεν μπορεί να ανακτηθεί.', + 'settings.oauth.toast.createError': 'Αποτυχία καταχώρησης πελάτη OAuth', + 'settings.oauth.toast.deleted': 'Ο πελάτης OAuth διαγράφηκε', + 'settings.oauth.toast.deleteError': 'Αποτυχία διαγραφής πελάτη OAuth', + 'settings.oauth.toast.revoked': 'Η συνεδρία ανακλήθηκε', + 'settings.oauth.toast.revokeError': 'Αποτυχία ανάκλησης συνεδρίας', + 'settings.oauth.toast.rotateError': 'Αποτυχία εναλλαγής client secret', + 'settings.oauth.modal.machineClient': 'Πελάτης μηχανής (χωρίς σύνδεση μέσω browser)', + 'settings.oauth.modal.machineClientHint': 'Χρησιμοποιήστε grant client_credentials — δεν χρειάζονται redirect URIs. Το token εκδίδεται απευθείας μέσω client_id + client_secret και ενεργεί ως εσείς εντός των επιλεγμένων scopes.', + 'settings.oauth.modal.machineClientUsage': 'Λήψη token: POST /oauth/token με grant_type=client_credentials, client_id, και client_secret. Χωρίς browser, χωρίς refresh token.', + 'settings.oauth.badge.machine': 'μηχανή', + 'settings.account': 'Λογαριασμός', + 'settings.about': 'Σχετικά', + 'settings.about.reportBug': 'Αναφορά Σφάλματος', + 'settings.about.reportBugHint': 'Βρήκατε πρόβλημα; Ενημερώστε μας', + 'settings.about.featureRequest': 'Αίτημα Λειτουργίας', + 'settings.about.featureRequestHint': 'Προτείνετε ένα νέο χαρακτηριστικό', + 'settings.about.wikiHint': 'Τεκμηρίωση & οδηγοί', + 'settings.about.supporters.badge': 'Μηνιαίοι Υποστηρικτές', + 'settings.about.supporters.title': 'Συνταξιδιώτες για το TREK', + 'settings.about.supporters.subtitle': 'Καθώς εσείς σχεδιάζετε την επόμενή σας διαδρομή, αυτοί οι άνθρωποι βοηθούν να σχεδιαστεί το μέλλον του TREK. Η μηνιαία τους συνεισφορά πηγαίνει απευθείας στην ανάπτυξη και σε πραγματικές ώρες εργασίας — ώστε το TREK να παραμένει Open Source.', + 'settings.about.supporters.since': 'υποστηρικτής από {date}', + 'settings.about.supporters.tierEmpty': 'Γίνετε ο πρώτος', + 'settings.about.supporter.tier.noReturnTicket': 'Χωρίς Εισιτήριο Επιστροφής', + 'settings.about.supporter.tier.lostLuggageVip': 'VIP Χαμένων Αποσκευών', + 'settings.about.supporter.tier.businessClassDreamer': 'Ονειροπόλος Business Class', + 'settings.about.supporter.tier.budgetTraveller': 'Οικονομικός Ταξιδιώτης', + 'settings.about.supporter.tier.hostelBunkmate': 'Συγκάτοικος Hostel', + 'settings.about.description': 'Το TREK είναι ένας self-hosted ταξιδιωτικός σχεδιαστής που σας βοηθά να οργανώσετε τα ταξίδια σας από την πρώτη ιδέα μέχρι την τελευταία ανάμνηση. Σχεδιασμός ημερών, προϋπολογισμός, λίστες πακεταρίσματος, φωτογραφίες και πολλά άλλα — όλα σε ένα μέρος, στον δικό σας server.', + 'settings.about.madeWith': 'Φτιαγμένο με', + 'settings.about.madeBy': 'από τον Maurice και μια αναπτυσσόμενη κοινότητα open-source.', + 'settings.username': 'Όνομα χρήστη', + 'settings.email': 'Email', + 'settings.role': 'Ρόλος', + 'settings.roleAdmin': 'Διαχειριστής', + 'settings.oidcLinked': 'Συνδεδεμένο με', + 'settings.changePassword': 'Αλλαγή Κωδικού', + 'settings.currentPassword': 'Τρέχων κωδικός', + 'settings.currentPasswordRequired': 'Ο τρέχων κωδικός είναι υποχρεωτικός', + 'settings.newPassword': 'Νέος κωδικός', + 'settings.confirmPassword': 'Επιβεβαίωση νέου κωδικού', + 'settings.updatePassword': 'Ενημέρωση κωδικού', + 'settings.passwordRequired': 'Παρακαλώ εισάγετε τον τρέχοντα και τον νέο κωδικό', + 'settings.passwordTooShort': 'Ο κωδικός πρέπει να έχει τουλάχιστον 8 χαρακτήρες', + 'settings.passwordMismatch': 'Οι κωδικοί δεν ταιριάζουν', + 'settings.passwordWeak': 'Ο κωδικός πρέπει να περιέχει κεφαλαία, πεζά, έναν αριθμό και έναν ειδικό χαρακτήρα', + 'settings.passwordChanged': 'Ο κωδικός άλλαξε επιτυχώς', + 'settings.mustChangePassword': 'Πρέπει να αλλάξετε τον κωδικό σας πριν συνεχίσετε. Παρακαλώ ορίστε έναν νέο κωδικό παρακάτω.', + 'settings.deleteAccount': 'Διαγραφή λογαριασμού', + 'settings.deleteAccountTitle': 'Διαγραφή του λογαριασμού σας;', + 'settings.deleteAccountWarning': 'Ο λογαριασμός σας και όλα τα ταξίδια, οι τόποι και τα αρχεία σας θα διαγραφούν μόνιμα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.', + 'settings.deleteAccountConfirm': 'Μόνιμη διαγραφή', + 'settings.deleteBlockedTitle': 'Η διαγραφή δεν είναι δυνατή', + 'settings.deleteBlockedMessage': 'Είστε ο μόνος διαχειριστής. Προαγάγετε έναν άλλον χρήστη σε διαχειριστή πριν διαγράψετε τον λογαριασμό σας.', + 'settings.roleUser': 'Χρήστης', + 'settings.saveProfile': 'Αποθήκευση Προφίλ', + 'settings.toast.mapSaved': 'Οι ρυθμίσεις χάρτη αποθηκεύτηκαν', + 'settings.toast.keysSaved': 'Τα κλειδιά API αποθηκεύτηκαν', + 'settings.toast.displaySaved': 'Οι ρυθμίσεις εμφάνισης αποθηκεύτηκαν', + 'settings.toast.profileSaved': 'Το προφίλ αποθηκεύτηκε', + 'settings.uploadAvatar': 'Μεταφόρτωση Εικόνας Προφίλ', + 'settings.removeAvatar': 'Αφαίρεση Εικόνας Προφίλ', + 'settings.avatarUploaded': 'Η εικόνα προφίλ ενημερώθηκε', + 'settings.avatarRemoved': 'Η εικόνα προφίλ αφαιρέθηκε', + 'settings.avatarError': 'Η μεταφόρτωση απέτυχε', + 'settings.mfa.title': 'Έλεγχος ταυτότητας δύο παραγόντων (2FA)', + 'settings.mfa.description': 'Προσθέτει ένα δεύτερο βήμα όταν συνδέεστε με email και κωδικό. Χρησιμοποιήστε μια εφαρμογή authenticator (Google Authenticator, Authy, κ.λπ.).', + 'settings.mfa.requiredByPolicy': 'Ο διαχειριστής σας απαιτεί έλεγχο ταυτότητας δύο παραγόντων. Ρυθμίστε μια εφαρμογή authenticator παρακάτω πριν συνεχίσετε.', + 'settings.mfa.backupTitle': 'Εφεδρικοί κωδικοί', + 'settings.mfa.backupDescription': 'Χρησιμοποιήστε αυτούς τους εφεδρικούς κωδικούς μίας χρήσης αν χάσετε την πρόσβαση στην εφαρμογή authenticator.', + 'settings.mfa.backupWarning': 'Αποθηκεύστε αυτούς τους κωδικούς τώρα. Κάθε κωδικός μπορεί να χρησιμοποιηθεί μόνο μία φορά.', + 'settings.mfa.backupCopy': 'Αντιγραφή κωδικών', + 'settings.mfa.backupDownload': 'Λήψη TXT', + 'settings.mfa.backupPrint': 'Εκτύπωση / PDF', + 'settings.mfa.backupCopied': 'Οι εφεδρικοί κωδικοί αντιγράφηκαν', + 'settings.mfa.enabled': 'Το 2FA είναι ενεργοποιημένο στον λογαριασμό σας.', + 'settings.mfa.disabled': 'Το 2FA δεν είναι ενεργοποιημένο.', + 'settings.mfa.setup': 'Ρύθμιση authenticator', + 'settings.mfa.scanQr': 'Σαρώστε αυτόν τον κωδικό QR με την εφαρμογή σας ή εισάγετε το secret χειροκίνητα.', + 'settings.mfa.secretLabel': 'Κλειδί secret (χειροκίνητη εισαγωγή)', + 'settings.mfa.codePlaceholder': 'Κωδικός 6 ψηφίων', + 'settings.mfa.enable': 'Ενεργοποίηση 2FA', + 'settings.mfa.cancelSetup': 'Ακύρωση', + 'settings.mfa.disableTitle': 'Απενεργοποίηση 2FA', + 'settings.mfa.disableHint': 'Εισάγετε τον κωδικό του λογαριασμού σας και έναν τρέχοντα κωδικό από τον authenticator σας.', + 'settings.mfa.disable': 'Απενεργοποίηση 2FA', + 'settings.mfa.toastEnabled': 'Ο έλεγχος ταυτότητας δύο παραγόντων ενεργοποιήθηκε', + 'settings.mfa.toastDisabled': 'Ο έλεγχος ταυτότητας δύο παραγόντων απενεργοποιήθηκε', + 'settings.mfa.demoBlocked': 'Δεν είναι διαθέσιμο σε λειτουργία demo', +}; +export default settings; diff --git a/shared/src/i18n/gr/share.ts b/shared/src/i18n/gr/share.ts new file mode 100644 index 00000000..517c7a2a --- /dev/null +++ b/shared/src/i18n/gr/share.ts @@ -0,0 +1,15 @@ +import type { TranslationStrings } from '../types'; + +const share: TranslationStrings = { + 'share.linkTitle': 'Δημόσιος Σύνδεσμος', + 'share.linkHint': 'Δημιουργήστε έναν σύνδεσμο που μπορεί να χρησιμοποιήσει οποιοσδήποτε για να δει αυτό το ταξίδι χωρίς σύνδεση. Μόνο για ανάγνωση — χωρίς δυνατότητα επεξεργασίας.', + 'share.createLink': 'Δημιουργία συνδέσμου', + 'share.deleteLink': 'Διαγραφή συνδέσμου', + 'share.createError': 'Αδυναμία δημιουργίας συνδέσμου', + 'share.permMap': 'Χάρτης & Σχέδιο', + 'share.permBookings': 'Κρατήσεις', + 'share.permPacking': 'Πακετάρισμα', + 'share.permBudget': 'Προϋπολογισμός', + 'share.permCollab': 'Συνομιλία', +}; +export default share; diff --git a/shared/src/i18n/gr/shared.ts b/shared/src/i18n/gr/shared.ts new file mode 100644 index 00000000..1aaa9136 --- /dev/null +++ b/shared/src/i18n/gr/shared.ts @@ -0,0 +1,21 @@ +import type { TranslationStrings } from '../types'; + +const shared: TranslationStrings = { + 'shared.expired': 'Ο σύνδεσμος έληξε ή δεν είναι έγκυρος', + 'shared.expiredHint': 'Αυτός ο κοινόχρηστος σύνδεσμος ταξιδιού δεν είναι πλέον ενεργός.', + 'shared.readOnly': 'Κοινόχρηστη προβολή μόνο για ανάγνωση', + 'shared.tabPlan': 'Σχέδιο', + 'shared.tabBookings': 'Κρατήσεις', + 'shared.tabPacking': 'Πακετάρισμα', + 'shared.tabBudget': 'Προϋπολογισμός', + 'shared.tabChat': 'Συνομιλία', + 'shared.days': 'ημέρες', + 'shared.places': 'τόποι', + 'shared.other': 'Άλλα', + 'shared.totalBudget': 'Συνολικός Προϋπολογισμός', + 'shared.messages': 'μηνύματα', + 'shared.sharedVia': 'Κοινοποιήθηκε μέσω', + 'shared.confirmed': 'Επιβεβαιωμένο', + 'shared.pending': 'Σε εκκρεμότητα', +}; +export default shared; diff --git a/shared/src/i18n/gr/stats.ts b/shared/src/i18n/gr/stats.ts new file mode 100644 index 00000000..e68e220a --- /dev/null +++ b/shared/src/i18n/gr/stats.ts @@ -0,0 +1,13 @@ +import type { TranslationStrings } from '../types'; + +const stats: TranslationStrings = { + 'stats.countries': 'Χώρες', + 'stats.cities': 'Πόλεις', + 'stats.trips': 'Ταξίδια', + 'stats.places': 'Τοποθεσίες', + 'stats.worldProgress': 'Παγκόσμια Πρόοδος', + 'stats.visited': 'επισκέφθηκα', + 'stats.remaining': 'απομένουν', + 'stats.visitedCountries': 'Χώρες που Επισκέφτηκα', +}; +export default stats; diff --git a/shared/src/i18n/gr/system_notice.ts b/shared/src/i18n/gr/system_notice.ts new file mode 100644 index 00000000..d23f89c9 --- /dev/null +++ b/shared/src/i18n/gr/system_notice.ts @@ -0,0 +1,45 @@ +import type { TranslationStrings } from '../types'; + +const system_notice: TranslationStrings = { + 'system_notice.v3_photos.title': 'Οι Φωτογραφίες μετακινήθηκαν στην 3.0', + 'system_notice.v3_photos.body': 'Οι **Φωτογραφίες** στον Σχεδιαστή Ταξιδιού έχουν αφαιρεθεί. Οι φωτογραφίες σας είναι ασφαλείς — το TREK δεν τροποποίησε ποτέ τη βιβλιοθήκη σας Immich ή Synology.\n\nΟι φωτογραφίες τώρα βρίσκονται στο πρόσθετο **Journey**. Το Journey είναι προαιρετικό — αν δεν είναι ακόμα διαθέσιμο, ζητήστε από τον διαχειριστή σας να το ενεργοποιήσει από το Διαχειριστής → Πρόσθετα.', + 'system_notice.v3_journey.title': 'Γνωρίστε το Journey — ημερολόγιο ταξιδιών', + 'system_notice.v3_journey.body': 'Καταγράψτε τα ταξίδια σας ως πλούσιες ταξιδιωτικές ιστορίες με χρονολόγια, συλλογές φωτογραφιών και διαδραστικούς χάρτες.', + 'system_notice.v3_journey.cta_label': 'Άνοιγμα Journey', + 'system_notice.v3_journey.highlight_timeline': 'Χρονολόγιο ανά ημέρα & συλλογή', + 'system_notice.v3_journey.highlight_photos': 'Εισαγωγή από Immich ή Synology', + 'system_notice.v3_journey.highlight_share': 'Δημόσια κοινοποίηση — δεν χρειάζεται σύνδεση', + 'system_notice.v3_journey.highlight_export': 'Εξαγωγή ως βιβλίο φωτογραφιών PDF', + 'system_notice.v3_features.title': 'Περισσότερα αξιοσημείωτα στην 3.0', + 'system_notice.v3_features.body': 'Μερικά ακόμα πράγματα που αξίζει να γνωρίζετε για αυτή την έκδοση.', + 'system_notice.v3_features.highlight_dashboard': 'Σχεδιασμός πίνακα ελέγχου πρώτα για κινητά', + 'system_notice.v3_features.highlight_offline': 'Πλήρης λειτουργία εκτός σύνδεσης ως PWA', + 'system_notice.v3_features.highlight_search': 'Αυτόματη συμπλήρωση αναζήτησης τοποθεσιών σε πραγματικό χρόνο', + 'system_notice.v3_features.highlight_import': 'Εισαγωγή τοποθεσιών από αρχεία KMZ/KML', + 'system_notice.v3_mcp.title': 'MCP: Αναβάθμιση OAuth 2.1', + 'system_notice.v3_mcp.body': 'Η ενσωμάτωση MCP ανασχεδιάστηκε πλήρως. Το OAuth 2.1 είναι τώρα η συνιστώμενη μέθοδος αυθεντικοποίησης. Τα παλιά στατικά tokens (trek_…) είναι παρωχημένα και θα αφαιρεθούν σε μελλοντική έκδοση.', + 'system_notice.v3_mcp.highlight_oauth': 'Συνιστάται OAuth 2.1 (mcp-remote)', + 'system_notice.v3_mcp.highlight_scopes': '24 λεπτομερή εύρη δικαιωμάτων', + 'system_notice.v3_mcp.highlight_deprecated': 'Στατικά tokens trek_ παρωχημένα', + 'system_notice.v3_mcp.highlight_tools': 'Επεκτεταμένο σύνολο εργαλείων & προτροπών', + 'system_notice.v3_thankyou.title': 'Μια προσωπική σημείωση από εμένα', + 'system_notice.v3_thankyou.body': 'Πριν φύγετε — θέλω να αφιερώσω μια στιγμή.\n\nΤο TREK ξεκίνησε ως ένα δευτερεύον έργο που έφτιαξα για τα δικά μου ταξίδια. Ποτέ δεν φαντάστηκα ότι θα γινόταν κάτι που 4.000 από εσάς εμπιστεύεστε τώρα για να σχεδιάσετε τις περιπέτειές σας. Κάθε αστέρι, κάθε αναφορά, κάθε αίτημα χαρακτηριστικού — τα διαβάζω όλα, και με κρατούν να συνεχίζω τις ξενύχτιες ανάμεσα σε δουλειά πλήρους απασχόλησης και πανεπιστήμιο.\n\nΘέλω να ξέρετε: το TREK θα είναι πάντα ανοιχτού κώδικα, πάντα self-hosted, πάντα δικό σας. Χωρίς παρακολούθηση, χωρίς συνδρομές, χωρίς δεσμεύσεις. Απλώς ένα εργαλείο φτιαγμένο από κάποιον που λατρεύει τα ταξίδια όσο κι εσείς.\n\nΙδιαίτερες ευχαριστίες στον [jubnl](https://github.com/jubnl) — έγινες ένας απίστευτος συνεργάτης. Πολλά από αυτά που κάνουν την 3.0 σπουδαία φέρουν τα δαχτυλικά σου αποτυπώματα. Σε ευχαριστώ που πίστεψες σε αυτό το έργο όταν ήταν ακόμα ατελές.\n\nΚαι σε κάθε έναν από εσάς που αναφέρατε ένα σφάλμα, μεταφράσατε ένα κείμενο, μοιραστήκατε το TREK με έναν φίλο, ή απλώς το χρησιμοποιήσατε για να σχεδιάσετε ένα ταξίδι — **σας ευχαριστώ**. Είστε ο λόγος που υπάρχει αυτό.\n\nΕις πολλές ακόμα περιπέτειες μαζί.\n\n— Maurice\n\n---\n\n[Γίνετε μέλος της κοινότητας στο Discord](https://discord.gg/7Q6M6jDwzf)\n\nΑν το TREK κάνει τα ταξίδια σας καλύτερα, ένας [μικρός καφές](https://ko-fi.com/mauriceboe) πάντα κρατά τα φώτα αναμμένα.', + + 'system_notice.v3014_whitespace_collision.title': 'Απαιτείται ενέργεια: σύγκρουση λογαριασμού χρήστη', + 'system_notice.v3014_whitespace_collision.body': 'Η αναβάθμιση 3.0.14 εντόπισε μία ή περισσότερες συγκρούσεις ονομάτων χρήστη ή email που προκλήθηκαν από κενά στην αρχή/τέλος αποθηκευμένων λογαριασμών. Οι επηρεαζόμενοι λογαριασμοί μετονομάστηκαν αυτόματα. Ελέγξτε τα logs του server για γραμμές που ξεκινούν με **[migration] WHITESPACE COLLISION** για να εντοπίσετε ποιοι λογαριασμοί χρειάζονται έλεγχο.', + 'system_notice.welcome_v1.title': 'Καλώς ήρθατε στο TREK', + 'system_notice.welcome_v1.body': 'Ο πλήρης ταξιδιωτικός σας σχεδιαστής. Δημιουργήστε δρομολόγια, μοιραστείτε ταξίδια με φίλους και μείνετε οργανωμένοι — συνδεδεμένοι ή εκτός σύνδεσης.', + 'system_notice.welcome_v1.cta_label': 'Σχεδιάστε ένα ταξίδι', + 'system_notice.welcome_v1.hero_alt': 'Ένας γραφικός ταξιδιωτικός προορισμός με επικάλυψη περιβάλλοντος σχεδιασμού TREK', + 'system_notice.welcome_v1.highlight_plan': 'Δρομολόγια ανά ημέρα για κάθε ταξίδι', + 'system_notice.welcome_v1.highlight_share': 'Συνεργαστείτε με συνταξιδιώτες', + 'system_notice.welcome_v1.highlight_offline': 'Λειτουργεί εκτός σύνδεσης σε κινητά', + 'system_notice.dev_test_modal.title': '[Dev] Δοκιμαστική ειδοποίηση', + 'system_notice.dev_test_modal.body': 'Αυτή είναι μια δοκιμαστική ειδοποίηση μόνο για ανάπτυξη.', + 'system_notice.pager.prev': 'Προηγούμενη ειδοποίηση', + 'system_notice.pager.next': 'Επόμενη ειδοποίηση', + 'system_notice.pager.counter': '{current} / {total}', + 'system_notice.pager.goto': 'Μετάβαση στην ειδοποίηση {n}', + 'system_notice.pager.position': 'Ειδοποίηση {current} από {total}', +}; +export default system_notice; diff --git a/shared/src/i18n/gr/todo.ts b/shared/src/i18n/gr/todo.ts new file mode 100644 index 00000000..3a558d0f --- /dev/null +++ b/shared/src/i18n/gr/todo.ts @@ -0,0 +1,40 @@ +import type { TranslationStrings } from '../types'; + +const todo: TranslationStrings = { + 'todo.subtab.packing': 'Λίστα Αποσκευών', + 'todo.subtab.todo': 'Εργασίες', + 'todo.completed': 'ολοκληρώθηκαν', + 'todo.filter.all': 'Όλα', + 'todo.filter.open': 'Ανοιχτά', + 'todo.filter.done': 'Ολοκληρωμένα', + 'todo.uncategorized': 'Χωρίς κατηγορία', + 'todo.namePlaceholder': 'Όνομα εργασίας', + 'todo.descriptionPlaceholder': 'Περιγραφή (προαιρετικό)', + 'todo.unassigned': 'Χωρίς ανάθεση', + 'todo.noCategory': 'Χωρίς κατηγορία', + 'todo.hasDescription': 'Έχει περιγραφή', + 'todo.addItem': 'Προσθήκη νέας εργασίας', + 'todo.sidebar.sortBy': 'Ταξινόμηση κατά', + 'todo.priority': 'Προτεραιότητα', + 'todo.newCategoryLabel': 'νέο', + 'todo.newCategory': 'Όνομα κατηγορίας', + 'todo.addCategory': 'Προσθήκη κατηγορίας', + 'todo.newItem': 'Νέα εργασία', + 'todo.empty': 'Δεν υπάρχουν εργασίες ακόμα. Προσθέστε μία για να ξεκινήσετε!', + 'todo.filter.my': 'Οι Εργασίες μου', + 'todo.filter.overdue': 'Εκπρόθεσμα', + 'todo.sidebar.tasks': 'Εργασίες', + 'todo.sidebar.categories': 'Κατηγορίες', + 'todo.detail.title': 'Εργασία', + 'todo.detail.description': 'Περιγραφή', + 'todo.detail.category': 'Κατηγορία', + 'todo.detail.dueDate': 'Ημερομηνία λήξης', + 'todo.detail.assignedTo': 'Ανατεθειμένο σε', + 'todo.detail.delete': 'Διαγραφή', + 'todo.detail.save': 'Αποθήκευση αλλαγών', + 'todo.sortByPrio': 'Προτεραιότητα', + 'todo.detail.priority': 'Προτεραιότητα', + 'todo.detail.noPriority': 'Καμία', + 'todo.detail.create': 'Δημιουργία εργασίας', +}; +export default todo; diff --git a/shared/src/i18n/gr/transport.ts b/shared/src/i18n/gr/transport.ts new file mode 100644 index 00000000..c6106a64 --- /dev/null +++ b/shared/src/i18n/gr/transport.ts @@ -0,0 +1,10 @@ +import type { TranslationStrings } from '../types'; + +const transport: TranslationStrings = { + 'transport.addTransport': 'Προσθήκη μεταφοράς', + 'transport.modalTitle.create': 'Προσθήκη μεταφοράς', + 'transport.modalTitle.edit': 'Επεξεργασία μεταφοράς', + 'transport.title': 'Μεταφορές', + 'transport.addManual': 'Χειροκίνητη Μεταφορά', +}; +export default transport; diff --git a/shared/src/i18n/gr/trip.ts b/shared/src/i18n/gr/trip.ts new file mode 100644 index 00000000..7fb3fd3c --- /dev/null +++ b/shared/src/i18n/gr/trip.ts @@ -0,0 +1,31 @@ +import type { TranslationStrings } from '../types'; + +const trip: TranslationStrings = { + 'trip.tabs.plan': 'Πλάνο', + 'trip.tabs.transports': 'Μεταφορές', + 'trip.tabs.reservations': 'Κρατήσεις', + 'trip.tabs.reservationsShort': 'Κράτ.', + 'trip.tabs.packing': 'Λίστα Αποσκευών', + 'trip.tabs.packingShort': 'Αποσκευές', + 'trip.tabs.lists': 'Λίστες', + 'trip.tabs.listsShort': 'Λίστες', + 'trip.tabs.budget': 'Προϋπολογισμός', + 'trip.tabs.files': 'Αρχεία', + 'trip.loading': 'Φόρτωση ταξιδιού...', + 'trip.loadingPhotos': 'Φόρτωση φωτογραφιών μέρους...', + 'trip.mobilePlan': 'Πλάνο', + 'trip.mobilePlaces': 'Μέρη', + 'trip.toast.placeUpdated': 'Το μέρος ενημερώθηκε', + 'trip.toast.placeAdded': 'Το μέρος προστέθηκε', + 'trip.toast.placeDeleted': 'Το μέρος διαγράφηκε', + 'trip.toast.selectDay': 'Παρακαλώ επιλέξτε πρώτα μια ημέρα', + 'trip.toast.assignedToDay': 'Το μέρος ανατέθηκε στην ημέρα', + 'trip.toast.reorderError': 'Η αναδιάταξη απέτυχε', + 'trip.toast.reservationUpdated': 'Η κράτηση ενημερώθηκε', + 'trip.toast.reservationAdded': 'Η κράτηση προστέθηκε', + 'trip.toast.deleted': 'Διαγράφηκε', + 'trip.confirm.deletePlace': 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μέρος;', + 'trip.confirm.deletePlaces': 'Διαγραφή {count} μερών;', + 'trip.toast.placesDeleted': '{count} μέρη διαγράφηκαν', +}; +export default trip; diff --git a/shared/src/i18n/gr/trips.ts b/shared/src/i18n/gr/trips.ts new file mode 100644 index 00000000..fa8a04b0 --- /dev/null +++ b/shared/src/i18n/gr/trips.ts @@ -0,0 +1,16 @@ +import type { TranslationStrings } from '../types'; + +const trips: TranslationStrings = { + 'trips.memberRemoved': '{username} διαγράφηκε', + 'trips.memberRemoveError': 'Αποτυχία διαγραφής', + 'trips.memberAdded': '{username} προστέθηκε', + 'trips.memberAddError': 'Αποτυχία προσθήκης', + 'trips.reminder': 'Ειδοποίηση', + 'trips.reminderNone': 'Κανένα', + 'trips.reminderDay': 'ημέρα', + 'trips.reminderDays': 'ημέρες', + 'trips.reminderCustom': 'Προσαρμοσμένη', + 'trips.reminderDaysBefore': 'ημέρες πριν από την αναχώση', + 'trips.reminderDisabledHint': 'Η ειδοποίηση για τις υπενθυμήσεις είναι απενεργοποιημένη. Ενεργοποιήστε την στο Διαχείριση > Ρυθμίσεις > Ανακοινώσεις.', +}; +export default trips; diff --git a/shared/src/i18n/gr/undo.ts b/shared/src/i18n/gr/undo.ts new file mode 100644 index 00000000..8bcf71cc --- /dev/null +++ b/shared/src/i18n/gr/undo.ts @@ -0,0 +1,21 @@ +import type { TranslationStrings } from '../types'; + +const undo: TranslationStrings = { + 'undo.button': 'Αναίρεση', + 'undo.tooltip': 'Αναίρεση: {action}', + 'undo.assignPlace': 'Η τοποθεσία ανατέθηκε στην ημέρα', + 'undo.removeAssignment': 'Η τοποθεσία αφαιρέθηκε από την ημέρα', + 'undo.reorder': 'Οι τοποθεσίες αναδιατάχθηκαν', + 'undo.optimize': 'Η διαδρομή βελτιστοποιήθηκε', + 'undo.deletePlace': 'Η τοποθεσία διαγράφηκε', + 'undo.deletePlaces': 'Οι τοποθεσίες διαγράφηκαν', + 'undo.moveDay': 'Η τοποθεσία μεταφέρθηκε σε άλλη ημέρα', + 'undo.lock': 'Το κλείδωμα τοποθεσίας εναλλάχθηκε', + 'undo.importGpx': 'Εισαγωγή GPX', + 'undo.importKeyholeMarkup': 'Εισαγωγή KMZ/KML', + 'undo.importGoogleList': 'Εισαγωγή Google Maps', + 'undo.importNaverList': 'Εισαγωγή Naver Maps', + 'undo.addPlace': 'Η τοποθεσία προστέθηκε', + 'undo.done': 'Αναιρέθηκε: {action}', +}; +export default undo; diff --git a/shared/src/i18n/gr/vacay.ts b/shared/src/i18n/gr/vacay.ts new file mode 100644 index 00000000..a23424c9 --- /dev/null +++ b/shared/src/i18n/gr/vacay.ts @@ -0,0 +1,93 @@ +import type { TranslationStrings } from '../types'; + +const vacay: TranslationStrings = { + 'vacay.subtitle': 'Σχεδιάστε και διαχειριστείτε ημέρες διακοπών', + 'vacay.settings': 'Ρυθμίσεις', + 'vacay.year': 'Έτος', + 'vacay.addYear': 'Προσθήκη επόμενου έτους', + 'vacay.addPrevYear': 'Προσθήκη προηγούμενου έτους', + 'vacay.removeYear': 'Αφαίρεση έτους', + 'vacay.removeYearConfirm': 'Αφαίρεση {year};', + 'vacay.removeYearHint': 'Όλες οι καταχωρήσεις διακοπών και οι αργίες της εταιρείας για αυτό το έτος θα διαγραφούν οριστικά.', + 'vacay.remove': 'Αφαίρεση', + 'vacay.persons': 'Άτομα', + 'vacay.noPersons': 'Δεν έχουν προστεθεί άτομα', + 'vacay.addPerson': 'Προσθήκη Ατόμου', + 'vacay.editPerson': 'Επεξεργασία Ατόμου', + 'vacay.removePerson': 'Αφαίρεση Ατόμου', + 'vacay.removePersonConfirm': 'Αφαίρεση {name};', + 'vacay.removePersonHint': 'Όλες οι καταχωρήσεις διακοπών για αυτό το άτομο θα διαγραφούν οριστικά.', + 'vacay.personName': 'Όνομα', + 'vacay.personNamePlaceholder': 'Εισαγάγετε όνομα', + 'vacay.color': 'Χρώμα', + 'vacay.add': 'Προσθήκη', + 'vacay.legend': 'Υπόμνημα', + 'vacay.publicHoliday': 'Δημόσια Αργία', + 'vacay.companyHoliday': 'Αργία Εταιρείας', + 'vacay.weekend': 'Σαββατοκύριακο', + 'vacay.modeVacation': 'Διακοπές', + 'vacay.modeCompany': 'Αργία Εταιρείας', + 'vacay.entitlement': 'Δικαίωμα', + 'vacay.entitlementDays': 'Ημέρες', + 'vacay.used': 'Χρησιμοποιημένες', + 'vacay.remaining': 'Υπόλοιπο', + 'vacay.carriedOver': 'από {year}', + 'vacay.blockWeekends': 'Αποκλεισμός Σαββατοκύριακων', + 'vacay.blockWeekendsHint': 'Αποτρέψτε καταχωρήσεις διακοπών σε ημέρες σαββατοκύριακου', + 'vacay.weekendDays': 'Ημέρες σαββατοκύριακου', + 'vacay.mon': 'Δευ', + 'vacay.tue': 'Τρι', + 'vacay.wed': 'Τετ', + 'vacay.thu': 'Πεμ', + 'vacay.fri': 'Παρ', + 'vacay.sat': 'Σαβ', + 'vacay.sun': 'Κυρ', + 'vacay.publicHolidays': 'Δημόσιες Αργίες', + 'vacay.publicHolidaysHint': 'Σήμανση δημόσιων αργιών στο ημερολόγιο', + 'vacay.selectCountry': 'Επιλογή χώρας', + 'vacay.selectRegion': 'Επιλογή περιοχής (προαιρετικό)', + 'vacay.addCalendar': 'Προσθήκη ημερολογίου', + 'vacay.calendarLabel': 'Ετικέτα (προαιρετικό)', + 'vacay.calendarColor': 'Χρώμα', + 'vacay.noCalendars': 'Δεν έχουν προστεθεί ημερολόγια αργιών ακόμη', + 'vacay.companyHolidays': 'Αργίες Εταιρείας', + 'vacay.companyHolidaysHint': 'Επιτρέψτε τη σήμανση αργιών για όλη την εταιρεία', + 'vacay.companyHolidaysNoDeduct': 'Οι αργίες της εταιρείας δεν προσμετρώνται στις ημέρες διακοπών.', + 'vacay.weekStart': 'Η εβδομάδα ξεκινά την', + 'vacay.weekStartHint': 'Επιλέξτε αν η εβδομάδα του ημερολογίου ξεκινά Δευτέρα ή Κυριακή', + 'vacay.carryOver': 'Μεταφορά', + 'vacay.carryOverHint': 'Αυτόματη μεταφορά των υπολοίπων ημερών διακοπών στο επόμενο έτος', + 'vacay.sharing': 'Κοινή Χρήση', + 'vacay.sharingHint': 'Μοιραστείτε το πλάνο διακοπών σας με άλλους χρήστες TREK', + 'vacay.owner': 'Κάτοχος', + 'vacay.shareEmailPlaceholder': 'Email χρήστη TREK', + 'vacay.shareSuccess': 'Το πλάνο μοιράστηκε επιτυχώς', + 'vacay.shareError': 'Δεν ήταν δυνατή η κοινοποίηση του πλάνου', + 'vacay.dissolve': 'Διάλυση Συγχώνευσης', + 'vacay.dissolveHint': 'Διαχωρίστε ξανά τα ημερολόγια. Οι καταχωρήσεις σας θα διατηρηθούν.', + 'vacay.dissolveAction': 'Διάλυση', + 'vacay.dissolved': 'Το ημερολόγιο διαχωρίστηκε', + 'vacay.fusedWith': 'Συγχωνευμένο με', + 'vacay.you': 'εσείς', + 'vacay.noData': 'Δεν υπάρχουν δεδομένα', + 'vacay.changeColor': 'Αλλαγή χρώματος', + 'vacay.inviteUser': 'Πρόσκληση Χρήστη', + 'vacay.inviteHint': 'Προσκαλέστε έναν άλλο χρήστη TREK για να μοιραστείτε ένα κοινό ημερολόγιο διακοπών.', + 'vacay.selectUser': 'Επιλογή χρήστη', + 'vacay.sendInvite': 'Αποστολή Πρόσκλησης', + 'vacay.inviteSent': 'Η πρόσκληση στάλθηκε', + 'vacay.inviteError': 'Δεν ήταν δυνατή η αποστολή της πρόσκλησης', + 'vacay.pending': 'εκκρεμεί', + 'vacay.noUsersAvailable': 'Δεν υπάρχουν διαθέσιμοι χρήστες', + 'vacay.accept': 'Αποδοχή', + 'vacay.decline': 'Απόρριψη', + 'vacay.acceptFusion': 'Αποδοχή & Συγχώνευση', + 'vacay.inviteTitle': 'Αίτημα Συγχώνευσης', + 'vacay.inviteWantsToFuse': 'θέλει να μοιραστεί ένα ημερολόγιο διακοπών μαζί σας.', + 'vacay.fuseInfo1': 'Και οι δύο θα βλέπετε όλες τις καταχωρήσεις διακοπών σε ένα κοινό ημερολόγιο.', + 'vacay.fuseInfo2': 'Και τα δύο μέρη μπορούν να δημιουργούν και να επεξεργάζονται καταχωρήσεις ο ένας για τον άλλο.', + 'vacay.fuseInfo3': 'Και τα δύο μέρη μπορούν να διαγράφουν καταχωρήσεις και να αλλάζουν τα δικαιώματα διακοπών.', + 'vacay.fuseInfo4': 'Ρυθμίσεις όπως δημόσιες αργίες και αργίες εταιρείας μοιράζονται.', + 'vacay.fuseInfo5': 'Η συγχώνευση μπορεί να διαλυθεί ανά πάσα στιγμή από οποιοδήποτε μέρος. Οι καταχωρήσεις σας θα διατηρηθούν.', +}; +export default vacay; diff --git a/shared/src/i18n/languages.ts b/shared/src/i18n/languages.ts index ff17ef3b..b55d6d14 100644 --- a/shared/src/i18n/languages.ts +++ b/shared/src/i18n/languages.ts @@ -18,6 +18,7 @@ export const SUPPORTED_LANGUAGES = [ { value: 'ja', label: '日本語', locale: 'ja-JP' }, { value: 'ko', label: '한국어', locale: 'ko-KR' }, { value: 'uk', label: 'Українська', locale: 'uk-UA' }, + { value: 'gr', label: 'Ελληνικά', locale: 'el-GR' }, ] as const; export type SupportedLanguageCode =