diff --git a/scripts/check-i18n.mjs b/scripts/check-i18n.mjs index 1054d3b..b4b1d22 100644 --- a/scripts/check-i18n.mjs +++ b/scripts/check-i18n.mjs @@ -130,7 +130,7 @@ async function main() { const jaCoverage = en.size ? Math.round(((en.size - missingJa) / en.size) * 100) : 100; // 5. Additional partial locales (same rules as th/ja). - const extraLocales = ['pt', 'fr', 'de', 'it', 'nl', 'pl', 'ru', 'ko']; + const extraLocales = ['pt', 'fr', 'de', 'it', 'nl', 'pl', 'ru', 'ko', 'zh-CN', 'zh-TW', 'uk', 'tr', 'vi', 'id', 'sv', 'cs', 'ro', 'el']; const extraStats = []; for (const lang of extraLocales) { const dict = flatten(await loadTranslations(join(SRC, `i18n/${lang}/index.ts`))); diff --git a/src/contexts/LanguageContext.tsx b/src/contexts/LanguageContext.tsx index fdff6ce..8e7ae0d 100644 --- a/src/contexts/LanguageContext.tsx +++ b/src/contexts/LanguageContext.tsx @@ -34,6 +34,18 @@ function detectLanguage(): Language { if (tags.some((t) => t.startsWith('nl'))) return 'nl'; if (tags.some((t) => t.startsWith('pl'))) return 'pl'; if (tags.some((t) => t.startsWith('ru'))) return 'ru'; + if (tags.some((t) => t.startsWith('ko'))) return 'ko'; + if (tags.some((t) => t.startsWith('zh'))) { + return tags.some((t) => /^zh-(tw|hk|hant)/.test(t)) ? 'zh-TW' : 'zh-CN'; + } + if (tags.some((t) => t.startsWith('uk'))) return 'uk'; + if (tags.some((t) => t.startsWith('tr'))) return 'tr'; + if (tags.some((t) => t.startsWith('vi'))) return 'vi'; + if (tags.some((t) => t.startsWith('id'))) return 'id'; + if (tags.some((t) => t.startsWith('sv'))) return 'sv'; + if (tags.some((t) => t.startsWith('cs'))) return 'cs'; + if (tags.some((t) => t.startsWith('ro'))) return 'ro'; + if (tags.some((t) => t.startsWith('el'))) return 'el'; if (tags.some((t) => t.startsWith('es'))) return 'es'; return 'en'; } diff --git a/src/contexts/language.ts b/src/contexts/language.ts index 3881d84..3e55aad 100644 --- a/src/contexts/language.ts +++ b/src/contexts/language.ts @@ -7,7 +7,7 @@ import en from '@/i18n/en'; * `react-refresh/only-export-components` rule. */ -export type Language = 'en' | 'es' | 'th' | 'ja' | 'pt' | 'fr' | 'de' | 'it' | 'nl' | 'pl' | 'ru' | 'ko' | 'ko-KP'; +export type Language = 'en' | 'es' | 'th' | 'ja' | 'pt' | 'fr' | 'de' | 'it' | 'nl' | 'pl' | 'ru' | 'ko' | 'ko-KP' | 'zh-CN' | 'zh-TW' | 'uk' | 'tr' | 'vi' | 'id' | 'sv' | 'cs' | 'ro' | 'el'; type TranslationKey = string; type TranslationValue = string | { [key: string]: TranslationValue }; @@ -51,6 +51,16 @@ export const LANGUAGE_LOADERS: Record Promise> = { ko: () => import('@/i18n/ko').then((m) => m.default), // North Korean option reuses the same Korean dictionary (mutually intelligible). 'ko-KP': () => import('@/i18n/ko').then((m) => m.default), + 'zh-CN': () => import('@/i18n/zh-CN').then((m) => m.default), + 'zh-TW': () => import('@/i18n/zh-TW').then((m) => m.default), + uk: () => import('@/i18n/uk').then((m) => m.default), + tr: () => import('@/i18n/tr').then((m) => m.default), + vi: () => import('@/i18n/vi').then((m) => m.default), + id: () => import('@/i18n/id').then((m) => m.default), + sv: () => import('@/i18n/sv').then((m) => m.default), + cs: () => import('@/i18n/cs').then((m) => m.default), + ro: () => import('@/i18n/ro').then((m) => m.default), + el: () => import('@/i18n/el').then((m) => m.default), }; /** Get a nested value from an object using dot notation (`nav.home`). */ diff --git a/src/i18n/cs/batch1.ts b/src/i18n/cs/batch1.ts new file mode 100644 index 0000000..a49cb74 --- /dev/null +++ b/src/i18n/cs/batch1.ts @@ -0,0 +1,4 @@ +/** cs — batch 1. Filled by the translation pass; empty until then. */ +const csBatch1 = {}; + +export default csBatch1; diff --git a/src/i18n/cs/batch2.ts b/src/i18n/cs/batch2.ts new file mode 100644 index 0000000..f189138 --- /dev/null +++ b/src/i18n/cs/batch2.ts @@ -0,0 +1,4 @@ +/** cs — batch 2. Filled by the translation pass; empty until then. */ +const csBatch2 = {}; + +export default csBatch2; diff --git a/src/i18n/cs/batch3.ts b/src/i18n/cs/batch3.ts new file mode 100644 index 0000000..dce6f4a --- /dev/null +++ b/src/i18n/cs/batch3.ts @@ -0,0 +1,4 @@ +/** cs — batch 3. Filled by the translation pass; empty until then. */ +const csBatch3 = {}; + +export default csBatch3; diff --git a/src/i18n/cs/batch4.ts b/src/i18n/cs/batch4.ts new file mode 100644 index 0000000..467e6d5 --- /dev/null +++ b/src/i18n/cs/batch4.ts @@ -0,0 +1,4 @@ +/** cs — batch 4. Filled by the translation pass; empty until then. */ +const csBatch4 = {}; + +export default csBatch4; diff --git a/src/i18n/cs/batch5.ts b/src/i18n/cs/batch5.ts new file mode 100644 index 0000000..d5fb2e2 --- /dev/null +++ b/src/i18n/cs/batch5.ts @@ -0,0 +1,4 @@ +/** cs — batch 5. Filled by the translation pass; empty until then. */ +const csBatch5 = {}; + +export default csBatch5; diff --git a/src/i18n/cs/batch6.ts b/src/i18n/cs/batch6.ts new file mode 100644 index 0000000..3f3e69f --- /dev/null +++ b/src/i18n/cs/batch6.ts @@ -0,0 +1,4 @@ +/** cs — batch 6. Filled by the translation pass; empty until then. */ +const csBatch6 = {}; + +export default csBatch6; diff --git a/src/i18n/cs/batch7.ts b/src/i18n/cs/batch7.ts new file mode 100644 index 0000000..3e02c3d --- /dev/null +++ b/src/i18n/cs/batch7.ts @@ -0,0 +1,4 @@ +/** cs — batch 7. Filled by the translation pass; empty until then. */ +const csBatch7 = {}; + +export default csBatch7; diff --git a/src/i18n/cs/batch8.ts b/src/i18n/cs/batch8.ts new file mode 100644 index 0000000..33e5e14 --- /dev/null +++ b/src/i18n/cs/batch8.ts @@ -0,0 +1,4 @@ +/** cs — batch 8. Filled by the translation pass; empty until then. */ +const csBatch8 = {}; + +export default csBatch8; diff --git a/src/i18n/cs/index.ts b/src/i18n/cs/index.ts new file mode 100644 index 0000000..5eb5ff7 --- /dev/null +++ b/src/i18n/cs/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const cs = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default cs; diff --git a/src/i18n/el/batch1.ts b/src/i18n/el/batch1.ts new file mode 100644 index 0000000..f802661 --- /dev/null +++ b/src/i18n/el/batch1.ts @@ -0,0 +1,4 @@ +/** el — batch 1. Filled by the translation pass; empty until then. */ +const elBatch1 = {}; + +export default elBatch1; diff --git a/src/i18n/el/batch2.ts b/src/i18n/el/batch2.ts new file mode 100644 index 0000000..2858f6c --- /dev/null +++ b/src/i18n/el/batch2.ts @@ -0,0 +1,1652 @@ +/** el — batch 2: mapUi, mapPage, spotUi, diyUi, labelsUi, feesUi, cardUi, routeUi, sasquatchUi, sasquatchChat. */ +const elBatch2 = { + mapUi: { + mapFooter: { + links: "Σύνδεσμοι", + hide: "Απόκρυψη γραμμής συνδέσμων χάρτη", + }, + findingSpots: "Εύρεση spot", + loadingSpots: "Φόρτωση spot", + loadingMap: "Φόρτωση χάρτη...", + mapViewAria: "Προβολή χάρτη", + listViewAria: "Προβολή λίστας", + layers: "Επίπεδα", + mapLayers: "Επίπεδα χάρτη", + showOnMap: "Εμφάνιση στον χάρτη", + showResults: "Εμφάνιση αποτελεσμάτων", + quickActions: "Γρήγορες ενέργειες", + spots: "Spots", + shops: "Καταστήματα", + gear: "Εξοπλισμός", + tours: "Περιηγήσεις", + events: "Εκδηλώσεις", + crews: "Crews", + spotType: "Τύπος spot", + sortBy: "Ταξινόμηση κατά", + trustLevel: "Επίπεδο εμπιστοσύνης", + weather: "Καιρός", + buySellGear: "Αγορά/Πώληση εξοπλισμού", + stash: "Stash", + more: "Περισσότερα", + newHere: "Νέος εδώ;", + welcomeDesc: "Ανακάλυψε skate spot, εκδηλώσεις και την κοινότητα.", + getOnZapstore: "Απόκτησέ το στο Zapstore", + dismiss: "Απόρριψη", + addedBy: "Προστέθηκε από", + directions: "Οδηγίες", + viewDetails: "Προβολή λεπτομερειών", + viewDetailsArrow: "Προβολή λεπτομερειών →", + spotDetails: "Λεπτομέρειες spot", + skateShop: "Skate Shop", + skateSpot: "Skate Spot", + youAreHere: "Είσαι εδώ", + conditions: "Συνθήκες", + weatherScoreSuffix: "{{score}}/100 καιρός", + wind: "Άνεμος", + humidity: "Υγρασία", + airQuality: "Ποιότητα αέρα", + threeDayForecast: "Πρόγνωση 3 ημερών", + gearForSale: "Εξοπλισμός προς πώληση ({{count}})", + viewItems: "Προβολή αντικειμένων →", + viewAllItems: "Προβολή όλων των {{count}} αντικειμένων →", + viewGear: "Προβολή εξοπλισμού →", + localTour: "Τοπική περιήγηση", + meetAt: "Συνάντηση: {{place}}", + hours: "{{count}} ώρες", + level: "Επίπεδο {{level}}", + viewTour: "Προβολή περιήγησης →", + upcomingEvent: "Επερχόμενη εκδήλωση", + viewEvent: "Προβολή εκδήλωσης →", + skateCrew: "Skate Crew", + members: "{{count}} μέλη", + since: "Από το {{year}}", + viewCrew: "Προβολή crew →", + acceptsBitcoin: "Δέχεται Bitcoin", + boosted: "Προωθημένο", + website: "Ιστότοπος", + offlineSavedSpots: "Εκτός σύνδεσης · εμφάνιση αποθηκευμένων spot", + cantReachRelays: "Δεν είναι δυνατή η πρόσβαση στα Relay", + relayOnlineNoAnswer: "Είσαι συνδεδεμένος, αλλά το Relay της κοινότητας δεν απαντά αυτή τη στιγμή.", + youreOffline: "Είσαι εκτός σύνδεσης.", + savedOnDevice: "Τα spot που έχεις ήδη δει είναι αποθηκευμένα σε αυτή τη συσκευή και θα εμφανίζονται εδώ.", + noSpotsMatchTitle: "Κανένα spot δεν ταιριάζει", + noSpotsMatchDesc: "Δοκίμασε διαφορετική αναζήτηση ή καθάρισε τα φίλτρα σου.", + noSpotsMappedYet: "Δεν έχουν καταχωρηθεί ακόμη spot", + noSpotsMappedDesc: "Γίνε ο πρώτος που θα καταχωρήσει το park του — παίρνει ένα λεπτό, είναι δικό σου, και ο επόμενος skater που θα περάσει θα σε ευχαριστήσει.", + addFirstSpot: "Πρόσθεσε το πρώτο spot", + findSpotsNearMe: "Βρες spot κοντά μου", + locating: "Εντοπισμός…", + refiningLocation: "Βελτιστοποίηση τοποθεσίας…", + refiningLocationDesc: "Κεντραρισμένο στο τελευταίο spot σου — βελτιώνουμε το στίγμα GPS.", + locatingYou: "Σε εντοπίζουμε…", + locatingDesc: "Λήψη στίγματος GPS. Μπορεί να πάρει έως ένα λεπτό την πρώτη φορά.", + foundYou: "Σε βρήκαμε", + foundYouDesc: "Ο χάρτης κεντραρίστηκε στην τοποθεσία σου.", + locationPermissionNeeded: "Απαιτείται άδεια τοποθεσίας", + permissionNeededDesc: "Επίτρεψε την τοποθεσία για το SkateSpots στις Ρυθμίσεις της συσκευής σου → Εφαρμογές → SkateSpots → Άδειες, και μετά πάτησε ξανά Κοντά μου.", + locationTimedOut: "Το χρονικό όριο τοποθεσίας έληξε", + timeoutNativeDesc: "Δεν ήταν δυνατή η λήψη τοποθεσίας εγκαίρως. Αν είσαι σε εσωτερικό χώρο, το GPS δεν βλέπει δορυφόρους — ενεργοποίησε την Τοποθεσία Δικτύου (Ρυθμίσεις → Τοποθεσία) ή βγες έξω και δοκίμασε ξανά.", + timeoutWebDesc: "Δεν ήταν δυνατή η λήψη της τοποθεσίας σου εγκαίρως. Έλεγξε το σήμα και δοκίμασε ξανά.", + noLocationProvider: "Δεν υπάρχει πάροχος τοποθεσίας", + noProviderNativeDesc: "Το τηλέφωνό σου δεν παρέχει τοποθεσία. Σε ROM με έμφαση στην ιδιωτικότητα (π.χ. GrapheneOS) ενεργοποίησε την Τοποθεσία Δικτύου στις Ρυθμίσεις → Τοποθεσία, ή βεβαιώσου ότι το GPS είναι αναμμένο και δοκίμασε σε εξωτερικό χώρο.", + noProviderWebDesc: "Δεν είναι διαθέσιμος πάροχος τοποθεσίας. Ενεργοποίησε τις υπηρεσίες τοποθεσίας και δοκίμασε ξανά.", + locationUnavailable: "Η τοποθεσία δεν είναι διαθέσιμη", + unavailableNativeDesc: "Ενεργοποίησε την Τοποθεσία/GPS στις ρυθμίσεις του τηλεφώνου σου, επίτρεψε την τοποθεσία για το SkateSpots (Ρυθμίσεις → Εφαρμογές → SkateSpots → Άδειες), και δοκίμασε ξανά.", + unavailableWebDesc: "Δεν ήταν δυνατός ο προσδιορισμός της τοποθεσίας σου. Βεβαιώσου ότι οι υπηρεσίες τοποθεσίας είναι ενεργοποιημένες.", + locationBlocked: "Η τοποθεσία αποκλείστηκε", + locationBlockedDesc: "Ο περιηγητής σου απέκλεισε την πρόσβαση στην τοποθεσία για αυτόν τον ιστότοπο. Ο τρόπος επανενεργοποίησης:", + locationPlatformAndroid: "Android Chrome", + locationPlatformIos: "iOS Safari", + locationPlatformDesktop: "Desktop Chrome", + locationPlatformFirefox: "Firefox", + locationStepsAndroid: "Πάτησε το εικονίδιο λουκέτου στη γραμμή διευθύνσεων → Ρυθμίσεις ιστότοπου → Τοποθεσία → Να επιτρέπεται", + locationStepsIos: "Εφαρμογή Ρυθμίσεις → Safari → Τοποθεσία → Να επιτρέπεται (ή πάτησε το κουμπί \"AA\" στη γραμμή διευθύνσεων του Safari)", + locationStepsDesktop: "Κάνε κλικ στο εικονίδιο λουκέτου → Ρυθμίσεις ιστότοπου → Τοποθεσία → Να επιτρέπεται", + locationStepsFirefox: "Κάνε κλικ στο εικονίδιο λουκέτου → Ασφαλής σύνδεση → Περισσότερες πληροφορίες → Άδειες → Πρόσβαση στην τοποθεσία σου → Να επιτρέπεται", + gotIt: "Το κατάλαβα", + addSpot: "Προσθήκη Spot", + addShop: "Προσθήκη καταστήματος", + addEvent: "Προσθήκη εκδήλωσης", + addSpotHereTitle: "Προσθήκη spot εδώ;", + addSpotHereDesc: "Βάλε μια πινέζα εκεί που πάτησες", + sellGear: "Πώληση εξοπλισμού", + offerTour: "Πρόσφερε περιήγηση", + closeAddMenu: "Κλείσιμο μενού προσθήκης", + addMenuAria: "Προσθήκη spot, καταστήματος, εκδήλωσης, εξοπλισμού ή περιήγησης", + localChat: "Τοπική συνομιλία", + localChatDesc: "Ζωντανή συνομιλία για όπου είναι κεντραρισμένος ο χάρτης. Διάλεξε πόσο μακριά φτάνει το κανάλι.", + btcMapShowing: "Εμφάνιση {{count}} τοποθεσιών όπου μπορείς να ξοδέψεις τα sats σου κοντά (μέσω BTC Map)", + btcMapShow: "Εμφάνιση τοποθεσιών όπου μπορείς να ξοδέψεις τα sats σου (μέσω BTC Map)", + yourPrivateStash: "Το Ιδιωτικό σου Stash", + stashIntro: "Παρακολούθησε τον εξοπλισμό σου, όρισε τιμές και βρες ανταλλαγές με άλλους skater.", + encryptionRequired: "Απαιτείται κρυπτογράφηση", + encryptionRequiredDesc: "Χρησιμοποίησε έναν signer με υποστήριξη NIP-44 (Alby, nos2x, Amber).", + myStash: "Το Stash μου", + encrypted: "Κρυπτογραφημένο", + itemsCount: "{{count}} αντικείμενα", + items: "Αντικείμενα", + wishlist: "Λίστα επιθυμιών", + types: "Τύποι", + stashEmpty: "Το Stash σου είναι άδειο", + addFirstItem: "Πρόσθεσε το πρώτο αντικείμενο", + wishlistCount: "Λίστα επιθυμιών ({{count}})", + myGearCount: "Ο εξοπλισμός μου ({{count}})", + openFullStash: "Άνοιγμα πλήρους Stash", + addItem: "Προσθήκη αντικειμένου", + searchSpotsPlaceholder: "Αναζήτηση spot...", + selected: "Επιλεγμένο", + noSpotsFound: "Δεν βρέθηκαν spot. Δοκίμασε διαφορετική αναζήτηση.", + addingSpotsHint: "Η προσθήκη spot βοηθά τους χρήστες να σε βρουν όταν περιηγούνται σε συγκεκριμένες τοποθεσίες", + report: "Αναφορά", + spotSingular: "1 spot", + spotPlural: "{{count}} spot", + view: "Προβολή", + myCollections: "Οι συλλογές μου", + collectionsSubtitle: "Οργάνωσε τα αγαπημένα σου spot σε εξατομικευμένες λίστες", + newCollection: "Νέα συλλογή", + loginToCreate: "Συνδέσου για να δημιουργήσεις συλλογές", + loginToCreateDesc: "Αποθήκευσε τα αγαπημένα σου spot σε εξατομικευμένες λίστες όπως \"Ταξίδι Βαρκελώνη 2024\" ή \"Καλύτερα Rail στο LA\"", + noCollections: "Δεν υπάρχουν συλλογές ακόμη", + noCollectionsDesc: "Δημιούργησε την πρώτη σου συλλογή για να αρχίσεις να οργανώνεις spot", + createFirstCollection: "Δημιούργησε την πρώτη σου συλλογή", + createNewCollection: "Δημιουργία νέας συλλογής", + createCollectionDesc: "Δώσε στη συλλογή σου ένα όνομα και προαιρετική περιγραφή", + collectionName: "Όνομα συλλογής", + collectionNamePlaceholder: "Ταξίδι Βαρκελώνη 2024", + descriptionOptional: "Περιγραφή (προαιρετική)", + descriptionPlaceholder: "Τα αγαπημένα μου spot από το ταξίδι μου στη Βαρκελώνη...", + creating: "Δημιουργία...", + createCollection: "Δημιουργία συλλογής", + editCollection: "Επεξεργασία συλλογής", + saving: "Αποθήκευση...", + saveChanges: "Αποθήκευση αλλαγών", + deleteCollectionTitle: "Διαγραφή συλλογής;", + deleteCollectionDesc: "Αυτό θα διαγράψει οριστικά το \"{{title}}\". Τα ίδια τα spot δεν θα επηρεαστούν.", + deleting: "Διαγραφή...", + collectionCreated: "Η συλλογή δημιουργήθηκε!", + collectionCreatedDesc: "\"{{title}}\" είναι έτοιμη για spot", + collectionCreateFailed: "Αποτυχία δημιουργίας συλλογής", + collectionUpdated: "Η συλλογή ενημερώθηκε!", + changesSaved: "Οι αλλαγές σου αποθηκεύτηκαν", + collectionUpdateFailed: "Αποτυχία ενημέρωσης συλλογής", + collectionDeleted: "Η συλλογή διαγράφηκε", + collectionDeletedDesc: "\"{{title}}\" αφαιρέθηκε", + collectionDeleteFailed: "Αποτυχία διαγραφής συλλογής", + somethingWentWrong: "Κάτι πήγε στραβά", + }, + mapPage: { + title: "Καταστήματα & Spot", + spots: "Spot", + shops: "Καταστήματα", + filters: "Φίλτρα", + listView: "Λίστα", + mapView: "Χάρτης", + nearMe: "Κοντά μου", + searchPlaceholder: "Αναζήτηση spot...", + noSpotsInArea: "Δεν υπάρχουν spot σε αυτή την περιοχή", + zoomIn: "Μεγέθυνση", + zoomOut: "Σμίκρυνση", + myLocation: "Η τοποθεσία μου", + locationsFound: "Βρέθηκαν {{count}} τοποθεσίες", + spotsOnly: "Μόνο spot", + shopsOnly: "Μόνο καταστήματα", + spotsAndShops: "Spot & Καταστήματα", + noSpotsMatch: "Κανένα spot δεν ταιριάζει με τα φίλτρα σου.", + noSpotsYet: "Δεν έχει προστεθεί ακόμη κανένα spot.", + addFirstSpot: "Πρόσθεσε το πρώτο spot", + }, + spotUi: { + claim: { + areYouOwner: "Είναι αυτό το spot σου;", + privateDesc: "Αυτό το spot έχει επισημανθεί ως ιδιωτικό. Αν σου ανήκει ή το διαχειρίζεσαι, διεκδίκησέ το — ένας moderator του SkateSpots επιβεβαιώνει την ιδιοκτησία και μετά αναλαμβάνεις την καταχώριση.", + claimSpot: "Διεκδίκησε αυτό το spot", + nip05Required: "Χρειάζεσαι επαληθευμένο handle NIP-05 για να διεκδικήσεις ένα ιδιωτικό spot (απόδειξη ότι ελέγχεις μια ταυτότητα Nostr). Πρόσθεσε ένα στο προφίλ σου και επέστρεψε.", + addNip05: "Προσθήκη NIP-05 στις Ρυθμίσεις", + pendingTitle: "Η διεκδίκηση εκκρεμεί προς έλεγχο", + pendingDesc: "Η διεκδίκησή σου υποβλήθηκε. Ένας moderator του SkateSpots θα την ελέγξει — μπορείς να ολοκληρώσεις τη διεκδίκηση του spot μόλις εγκριθεί.", + approvedTitle: "Η διεκδίκηση εγκρίθηκε", + approvedDesc: "Ένας moderator ενέκρινε τη διεκδίκησή σου. Ολοκλήρωσε για να γίνεις ιδιοκτήτης αυτού του spot.", + complete: "Ολοκλήρωση διεκδίκησης", + submitted: "Η διεκδίκηση υποβλήθηκε", + submittedDesc: "Ένας moderator θα ελέγξει τη διεκδίκησή σου. Θα αναλάβεις το spot μόλις εγκριθεί.", + submitFailed: "Δεν ήταν δυνατή η υποβολή της διεκδίκησης", + submit: "Υποβολή διεκδίκησης", + submitting: "Υποβολή…", + confirmTitle: "Διεκδίκηση του \"{{title}}\";", + confirmIntro: "Ζητάς να γίνεις ιδιοκτήτης αυτού του ιδιωτικού spot.", + confirmBullet1: "Ένας moderator του SkateSpots ελέγχει το αίτημα (δεν μπορούμε να επαληθεύσουμε ιδιοκτησία, μόνο κλειδιά Nostr)", + confirmBullet2: "Αν εγκριθεί, ολοκληρώνεις τη διεκδίκηση για να γίνεις ιδιοκτήτης και να μπορείς να επεξεργάζεσαι το spot", + confirmBullet3: "Το αρχικό spot παραμένει στο Nostr — το δίκτυο είναι αποκεντρωμένο", + adminTitle: "Εκκρεμείς διεκδικήσεις ιδιοκτησίας", + adminApprove: "Έγκριση", + adminApproved: "Εγκρίθηκε", + adminApprovedDesc: "Μπορούν πλέον να ολοκληρώσουν τη διεκδίκηση του spot.", + adminApproveFailed: "Δεν ήταν δυνατή η έγκριση της διεκδίκησης", + loginRequired: "Συνδέσου για να διεκδικήσεις αυτό το ιδιωτικό spot ή για να ζητήσεις την ιδιοκτησία.", + }, + abandonedDesc: "Τελευταία ενημέρωση {{time}}. Αν ο αρχικός ιδιοκτήτης είναι ανενεργός, μπορείς να διεκδικήσεις αυτό το spot για να το συντηρήσεις και να το βελτιώσεις.", + claimedNotice: "Διεκδικημένη καταχώριση", + claimedNoticeDesc: "Αυτό το spot επαναδημοσιεύτηκε από νέο ιδιοκτήτη μετά από διεκδίκηση. Η αρχική καταχώριση μπορεί να υπάρχει ακόμη ξεχωριστά.", + abandonedLoginDesc: "Τελευταία ενημέρωση {{time}}. Συνδέσου για να διεκδικήσεις και να συντηρήσεις αυτό το spot.", + accessDeniedDesc: "Μπορείς να επεξεργάζεσαι μόνο τα spot που δημιούργησες.", + accessDeniedTitle: "Δεν επιτρέπεται η πρόσβαση", + addAtLeastOneTag: "Πρόσθεσε τουλάχιστον μία ετικέτα.", + additionalDetails: "Πρόσθετες λεπτομέρειες (προαιρετικό)", + additionalDetailsPlaceholder: "Δώσε οποιοδήποτε επιπλέον πλαίσιο μπορεί να βοηθήσει...", + addNewTags: "Προσθήκη νέων ετικετών:", + addNip05InSettings: "Προσθήκη NIP-05 στις Ρυθμίσεις", + addPhoto: "Προσθήκη φωτογραφίας", + addPhotoDesc: "Συνέβαλε με μια φωτογραφία για να βοηθήσεις άλλους να ανακαλύψουν αυτό το spot.", + addPhotoOrDescription: "Πρόσθεσε φωτογραφία ή περιγραφή", + addPhotoOrDescriptionDesc: "Δώσε στους skater κάτι να βασιστούν — μια εικόνα ή μια γραμμή για το μέρος.", + addPhotos: "Προσθήκη φωτογραφιών", + addPhotoToSpot: "Προσθήκη φωτογραφίας στο spot", + adminDeleteDialogDesc: "Ως admin του SkateSpots κατεβάζεις το \"{{title}}\". Θα κρυφτεί σε όλη την εφαρμογή για όλους και θα σταλεί αίτημα διαγραφής στα relays.", + adminDeleteReason: "Ο admin του SkateSpots αφαίρεσε το spot \"{{title}}\"", + airQuality: "Ποιότητα αέρα", + altSkateSpot: "Skate spot: {{title}}", + areYouShopOwner: "Είσαι ο ιδιοκτήτης του καταστήματος;", + askBeforeSkating: "Ρώτα πριν κάνεις skate", + backToSpot: "Πίσω στο spot", + beFirstToListGear: "Γίνε ο πρώτος που θα καταχωρήσει εξοπλισμό σε αυτό το spot!", + beFirstToSay: "Γίνε ο πρώτος που θα πει κάτι.", + byAuthor: "από {{name}}", + captionPlaceholder: "Πρόσθεσε λεζάντα (προαιρετικό) - περιγράψε τι δείχνει η φωτογραφία, πότε τραβήχτηκε, κ.λπ.", + chatPublicNote: "Ο καθένας μπορεί να το διαβάσει — τα μηνύματα είναι δημόσια και εφήμερα. Για ιδιωτικές συνομιλίες, χρησιμοποίησε τα Άμεσα Μηνύματα.", + checkPinBelow: "Έλεγξε την πινέζα παρακάτω πριν προσθέσεις διπλότυπο.", + claimBullet1: "Γίνεσαι ιδιοκτήτης και μπορείς να επεξεργάζεσαι το spot", + claimBullet2: "Το αρχικό spot παραμένει (το Nostr είναι αποκεντρωμένο)", + claimBullet3: "Η εκδοχή σου μπορεί να εμφανιστεί δίπλα στην αρχική", + claimFailed: "Η διεκδίκηση απέτυχε", + claiming: "Διεκδίκηση...", + claimIntro: "Πρόκειται να διεκδικήσεις την ιδιοκτησία αυτού του spot. Αυτό θα δημιουργήσει τη δική σου εκδοχή του spot που μπορείς να επεξεργάζεσαι και να συντηρείς.", + claimSpot: "Διεκδίκηση spot", + claimThisSpot: "Διεκδίκηση αυτού του spot", + claimTitle: "Διεκδίκηση του \"{{title}}\";", + claimWhatHappens: "Τι συμβαίνει όταν διεκδικήσεις:", + coachesAndFilmersAvailable: "Προπονητές και filmers διαθέσιμοι σε αυτό το spot", + coachesCount: "Προπονητές ({{count}})", + coachHere: "Προπονητής εδώ", + community: "Κοινότητα", + communityVerified: "Επαληθευμένο από την κοινότητα", + communityVerifiedTitle: "Ένας άλλος skater συνέβαλε εδώ (φωτογραφία ή αναφορά κατάστασης).", + conditions: "Συνθήκες", + contactForPermission: "Επικοινωνία για άδεια", + contactInfo: "Στοιχεία επικοινωνίας", + contributePhoto: "Συνεισφορά φωτογραφίας", + contributing: "Συνεισφορά...", + couldNotSendMessage: "Δεν ήταν δυνατή η αποστολή μηνύματος.", + couldNotSubmit: "Δεν ήταν δυνατή η υποβολή", + couldNotUploadPhoto: "Δεν ήταν δυνατή η μεταφόρτωση της φωτογραφίας. Μπορείς να προσθέσεις μία παρακάτω.", + crewsThatSkateHere: "Crews που κάνουν skate εδώ", + current: "Τρέχον:", + currentTags: "Τρέχουσες ετικέτες σε αυτό το spot:", + daysAgo: "πριν {{count}} ημέρα", + daysAgoPlural: "πριν {{count}} ημέρες", + deleteDialogDesc: "Αυτό θα διαγράψει οριστικά το \"{{title}}\" από όλα τα relays. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", + deletedSpotReason: "Διαγραμμένο spot", + deleteFailed: "Η διαγραφή απέτυχε", + deleteSpot: "Διαγραφή spot", + deleteSpotTitle: "Διαγραφή spot;", + differentSpotPublishAnyway: "Είναι διαφορετικό spot — δημοσίευσε ούτως ή άλλως", + dragDropOrClick: "Σύρε & άφησε ή κάνε κλικ", + dropPhotos: "Άφησε φωτογραφίες", + duplicateOne: "Υπάρχει ένα spot εντός 60 m από την πινέζα σου. Αν είναι το ίδιο μέρος, πρόσθεσε εκεί τη φωτογραφία ή την αναφορά κατάστασής σου αντί να δημιουργήσεις διπλότυπο.", + duplicateOther: "Υπάρχουν spot εντός 60 m από την πινέζα σου. Αν είναι το ίδιο μέρος, πρόσθεσε εκεί τη φωτογραφία ή την αναφορά κατάστασής σου αντί να δημιουργήσεις διπλότυπο.", + editSpotSeoDesc: "Επεξεργάσου το skate spot σου.", + failedToContribute: "Αποτυχία συνεισφοράς", + failedToPublish: "Αποτυχία δημοσίευσης", + failedToPublishDesc: "Κάτι πήγε στραβά. Έλεγξε την κονσόλα για λεπτομέρειες.", + failedToSubmitReport: "Αποτυχία υποβολής αναφοράς", + failedToSuggestTags: "Αποτυχία πρότασης ετικετών", + failedToUpdate: "Αποτυχία ενημέρωσης", + failedToUploadImage: "Αποτυχία μεταφόρτωσης εικόνας", + failedToUploadPhoto: "Αποτυχία μεταφόρτωσης φωτογραφίας", + feelsLikeTemp: "Αίσθηση {{temp}}°C", + filmersCount: "Filmers ({{count}})", + filmHere: "Film εδώ", + gearSwap: "Ανταλλαγή εξοπλισμού", + geolocationNotSupported: "Ο γεωεντοπισμός δεν υποστηρίζεται", + geolocationNotSupportedDesc: "Ο περιηγητής σου δεν υποστηρίζει γεωεντοπισμό.", + getDirections: "Λήψη οδηγιών", + hangTight: "Κάνε υπομονή", + hangTightDesc: "Η φωτογραφία σου μεταφορτώνεται ακόμη. Θα επισυναφθεί σε λίγο.", + helpImproveSpot: "Βοήθησε να βελτιωθεί αυτό το spot προσθέτοντας φωτογραφίες ή προτείνοντας ετικέτες", + hiddenByModerator: "Κρυμμένο από moderator", + hiddenByModeratorDesc: "Αυτό το spot δεν εμφανίζεται στον χάρτη ή στην αναζήτηση. Μπορείς να το βλέπεις επειδή είναι δικό σου. Η επεξεργασία του δεν θα το εμφανίσει — παραμένει κρυμμένο μέχρι ένας moderator να ανακαλέσει την απόφαση.", + humidity: "Υγρασία", + imageUploaded: "Η εικόνα μεταφορτώθηκε", + imageUploadedDesc: "Η εικόνα σου μεταφορτώθηκε με επιτυχία.", + imHere: "Είμαι εδώ", + invalidCoordinates: "Μη έγκυρες συντεταγμένες", + invalidCoordinatesDesc: "Εισάγετε έγκυρο γεωγραφικό πλάτος (-90 έως 90) και μήκος (-180 έως 180).", + invalidNpub: "Μη έγκυρο npub", + invalidNpubDesc: "Εισάγετε μια έγκυρη διεύθυνση npub.", + lastReported: "τελευταία {{time}}", + listGear: "Καταχώριση εξοπλισμού", + listYourGearHere: "Καταχώρισε τον εξοπλισμό σου εδώ", + loadingChat: "Φόρτωση συνομιλίας…", + locationError: "Σφάλμα τοποθεσίας", + locationFound: "Η τοποθεσία βρέθηκε", + locationFoundDesc: "Η τρέχουσα τοποθεσία σου ορίστηκε.", + locationRequired: "Απαιτείται τοποθεσία", + locationRequiredDesc: "Εισάγετε συντεταγμένες ή χρησιμοποιήστε την τρέχουσα τοποθεσία σας.", + loginRequiredTitle: "Απαιτείται σύνδεση", + logInToChat: "Συνδέσου για να συμμετάσχεις στην τοπική συνομιλία.", + logInToContributePhotos: "Συνδέσου για να συνεισφέρεις φωτογραφίες", + loginToEditSpot: "Πρέπει να συνδεθείς για να επεξεργαστείς αυτό το spot.", + logInToReport: "Πρέπει να είσαι συνδεδεμένος για να αναφέρεις περιεχόμενο.", + logInToReportStatus: "Συνδέσου για να αναφέρεις την κατάσταση αυτού του spot.", + logInToSuggestTags: "Συνδέσου για να προτείνεις ετικέτες", + manageNip05ToClaim: "Διαχείριση NIP-05 για διεκδίκηση", + meetAtSpotForPickup: "💡 Συναντήσου σε αυτό το spot για ασφαλή παραλαβή", + memberOne: "{{count}} μέλος", + memberOther: "{{count}} μέλη", + messageFailed: "Το μήνυμα απέτυχε", + messageMapper: "Χαρτογράφηση μηνυμάτων", + messagePlaceholder: "Στείλε μήνυμα σε αυτό το spot… (δοκίμασε /me ή /who)", + messagesHiddenOne: "{{count}} μήνυμα κρυμμένο από το φίλτρο εμπιστοσύνης σου. Χαμήλωσε το φίλτρο για να δεις περισσότερα.", + messagesHiddenOther: "{{count}} μηνύματα κρυμμένα από το φίλτρο εμπιστοσύνης σου. Χαμήλωσε το φίλτρο για να δεις περισσότερα.", + messagesHiddenShortOne: "{{count}} μήνυμα κρυμμένο από το φίλτρο εμπιστοσύνης σου", + messagesHiddenShortOther: "{{count}} μηνύματα κρυμμένα από το φίλτρο εμπιστοσύνης σου", + metresAway: "{{distance}} m μακριά", + moderatorVouchedDesc: "Ένας moderator έλεγξε αυτό το spot και το επιβεβαίωσε. Μπράβο.", + monthsAgo: "πριν {{count}} μήνα", + monthsAgoPlural: "πριν {{count}} μήνες", + newOwnerNpub: "Το npub του νέου ιδιοκτήτη", + newOwnerNpubHint: "Εισάγετε το npub του χρήστη στον οποίο θέλετε να μεταφέρετε αυτό το spot.", + nip05RequiredToClaim: "⚠️ Απαιτείται επαλήθευση NIP-05 για τη διεκδίκηση καταστημάτων", + noCommunitySignalTitle: "Δεν υπάρχει ακόμη φωτογραφία ή αναφορά κατάστασης από την κοινότητα — κανείς δεν έχει επιβεβαιώσει αυτό το μέρος.", + breakdownPhotos: "{{count}} φωτογραφία(-ες)", + breakdownStatus: "{{count}} αναφορά(-ές) κατάστασης", + breakdownComments: "{{count}} σχόλιο(-α)", + breakdownReactions: "{{count}} αντίδραση(-εις)", + breakdownCollections: "{{count}} αποθήκευση(-εις)", + breakdownZaps: "{{count}} zap", + breakdownTags: "{{count}} πρόταση(-εις) ετικέτας", + breakdownCrews: "{{count}} crew", + breakdownLab: "{{count}} pro σύνδεσμος(-οι)", + verifyNudgeTitle: "Γίνε ο πρώτος που θα επιβεβαιώσει αυτό το spot", + verifyNudgeBody: "Μια φωτογραφία ή ένα «έκανα skate εδώ» είναι το πώς ένα spot επαληθεύεται — βοήθησε τον επόμενο skater.", + verifyNudgeStatus: "Έκανα skate εδώ", + communityChip: "Κοινότητα", + seenChip: "Visto", + noGearListedYet: "Δεν έχει καταχωρηθεί ακόμη εξοπλισμός", + noMessagesYet: "Δεν υπάρχουν ακόμη μηνύματα σε αυτό το τοπικό κανάλι. Πες ένα γεια — «κανείς για skate απόψε;»", + noPhoto: "Χωρίς φωτογραφία", + noReportsYet: "Δεν υπάρχουν ακόμη αναφορές", + noTags: "Χωρίς ετικέτες", + notASkateSpot: "Δεν είναι skate spot", + offerServicesHere: "💡 Πρόσφερε τις υπηρεσίες σου σε αυτό το spot", + photoCaptured: "Η φωτογραφία τραβήχτηκε!", + photoCapturedDesc: "Η φωτογραφία σου μεταφορτώθηκε με επιτυχία.", + photoContributed: "Η φωτογραφία συνεισφέρθηκε!", + photoContributedDesc: "Η φωτογραφία σου προστέθηκε σε αυτό το spot.", + photosAdded: "Οι φωτογραφίες σου προστέθηκαν.", + photosRecommended: "συνιστάται ανεπιφύλακτα — τα spot χωρίς φωτογραφία παραμένουν επισημασμένα ως Μη επαληθευμένα", + photosUploaded: "{{count}} φωτογραφίες μεταφορτώθηκαν", + photoUploaded: "Η φωτογραφία μεταφορτώθηκε", + photoUploadedDesc: "Πρόσθεσε λεζάντα και υπέβαλε για να συνεισφέρεις!", + photoUploadFailed: "Η μεταφόρτωση φωτογραφίας απέτυχε", + pleaseTryAgain: "Προσπάθησε ξανά", + public: "Δημόσιο", + publicChatTitle: "Ο καθένας μπορεί να διαβάσει τα μηνύματα σε αυτό το κανάλι — είναι δημόσιο και μη κρυπτογραφημένο.", + recentReports: "Πρόσφατες αναφορές", + recipientRequired: "Απαιτείται παραλήπτης", + recipientRequiredDesc: "Εισάγετε το npub του νέου ιδιοκτήτη.", + removeAdmin: "Αφαίρεση (admin)", + removeSpot: "Αφαίρεση spot", + removeSpotAdminTitle: "Αφαίρεση αυτού του spot; (admin)", + reportOne: "αναφορά", + reportContent: "Αναφορά περιεχομένου", + reportContentDesc: "Βοήθησε να παραμείνει ασφαλής η κοινότητα αναφέροντας ακατάλληλο περιεχόμενο.", + reportedBySkaters: " από {{count}} skater — υπό έλεγχο. Αν αυτό είναι πραγματικό spot, πρόσθεσε φωτογραφία ή αναφορά κατάστασης για να το επιβεβαιώσεις.", + reportedNotASpot: "Αναφέρθηκε ως μη skate spot", + reportingType: "Αναφορά {{type}}", + reports: "αναφορές", + reportShop: "Αναφορά καταστήματος", + reportSpot: "Αναφορά spot", + reportStatus: "Αναφορά κατάστασης", + reportSubmitted: "Η αναφορά υποβλήθηκε", + reportSubmittedDesc: "Ευχαριστούμε που βοηθάς να παραμείνει ασφαλές το SkateSpots.", + reportSubmittedLong: "Ευχαριστούμε που βοηθάς να παραμείνει ασφαλές και ακριβές το SkateSpots. Η αναφορά σου θα ελεγχθεί από έμπιστα μέλη της κοινότητας.", + reportSubmittedTitle: "Η αναφορά υποβλήθηκε", + report: { + notASkateSpot: { + label: "Δεν είναι skate spot", + description: "Δοκιμαστική καταχώριση ή μέρος που δεν είναι καθόλου για skate", + }, + fakeSpot: { + label: "Ψεύτικο/Ανύπαρκτο spot", + description: "Αυτό το spot δεν υπάρχει ή η τοποθεσία είναι λάθος", + }, + stolenPhotos: { + label: "Κλεμμένες/Ψεύτικες φωτογραφίες", + description: "Οι φωτογραφίες είναι stock ή κλεμμένες από αλλού", + }, + spamAd: { + label: "Spam ή διαφήμιση", + description: "Προωθητικό περιεχόμενο ή διπλές καταχωρίσεις", + }, + dangerousLocation: { + label: "Επικίνδυνη τοποθεσία", + description: "Ιδιωτική ιδιοκτησία, μη ασφαλής ή παράνομη πρόσβαση", + }, + inappropriateContent: { + label: "Ακατάλληλο περιεχόμενο", + description: "Περιέχει προσβλητικό ή ενήλικο περιεχόμενο", + }, + impersonation: { + label: "Πλαστοπροσωπία", + description: "Κάποιος προσποιείται ότι είναι κάποιος άλλος", + }, + other: { + label: "Άλλο", + description: "Κάτι άλλο που δεν αναφέρεται παραπάνω", + }, + }, + targetType: { + spot: "Spot", + event: "Εκδήλωση", + tour: "Περιήγηση", + shop: "Κατάστημα", + user: "Χρήστης", + listing: "Καταχώριση", + coach: "Προπονητής", + filmer: "Filmer", + }, + sameOwner: "Ίδιος ιδιοκτήτης", + sameOwnerDesc: "Δεν είναι δυνατή η μεταφορά στον τρέχοντα ιδιοκτήτη.", + saveChanges: "Αποθήκευση αλλαγών", + saving: "Αποθήκευση...", + services: "Υπηρεσίες", + shareSpotText: "Δες αυτό το skate spot: {{title}}", + shelter: "Καταφύγιο", + shelterHint: "Είναι αυτό το spot εκτεθειμένο στον καιρό; Βοηθά τους skater να βρουν στεγνά spot όταν βρέχει.", + shopClaimDesc: "Αν σου ανήκει ή το διαχειρίζεσαι αυτό το κατάστημα, μπορείς να το διεκδικήσεις για να επαληθεύσεις την ιδιοκτησία και να διαχειρίζεσαι την καταχώριση.", + shopClaimNip05Hint: "Για να διεκδικήσεις αυτό το κατάστημα, πρόσθεσε ένα αναγνωριστικό NIP-05 που ταιριάζει με τον τομέα του ιστότοπου του καταστήματος.", + skatersActiveDesc: "Άτομα που δημοσίευσαν σε αυτό το κανάλι τις τελευταίες 24 ώρες.", + skatersActiveOne: "{{count}} skater ενεργός εδώ", + skatersActiveOther: "{{count}} skater ενεργοί εδώ", + skatersSellingGear: "Skaters σε αυτό το spot πουλάνε εξοπλισμό", + skateSpot: "Skate Spot", + somethingWentWrong: "Κάτι πήγε στραβά", + spot: "Spot", + spotAdded: "Το spot προστέθηκε!", + spotAddedDesc: "Το skate spot σου δημοσιεύτηκε στο δίκτυο.", + spotAddedNoPhoto: "Δημοσιεύτηκε — και επισημάνθηκε ως Μη επαληθευμένο μέχρι κάποιος να προσθέσει φωτογραφία. Μια εικόνα του spot βοηθά πολύ.", + spotChat: "Συνομιλία spot", + spotClaimed: "Το spot διεκδικήθηκε!", + spotClaimedDesc: "Είσαι πλέον ο ιδιοκτήτης αυτού του spot. Μπορείς να το επεξεργαστείς από το προφίλ σου.", + spotDeleted: "Το spot διαγράφηκε", + spotDeletedDesc: "Στάλθηκε αίτημα διαγραφής στα relays. Τα περισσότερα relays θα αφαιρέσουν αυτό το περιεχόμενο.", + spotMayAlreadyBeOnMap: "Αυτό το spot μπορεί να είναι ήδη στον χάρτη", + spotMayAlreadyExist: "Αυτό το spot μπορεί να υπάρχει ήδη", + spotMayBeAbandoned: "Το spot μπορεί να είναι εγκαταλελειμμένο", + spotPhotoAlt: "Spot", + spotRemoved: "Το spot αφαιρέθηκε", + spotRemovedDesc: "Αυτό το spot κατέβηκε και θα κρυφτεί σε όλο το SkateSpots.", + spotSeoDesc: "Δες αυτό το skateboarding spot στο SkateSpots.", + spotStatus: "Κατάσταση spot", + spotStatusDesc: "Είναι το \"{{title}}\" ακόμη κατάλληλο για skate; Ενημέρωσε την κοινότητα για την τρέχουσα κατάστασή του.", + spotTypeRequired: "Απαιτείται τύπος spot", + spotTypeRequiredDesc: "Διάλεξε έναν τύπο spot για να ξέρουν οι skater σε τι πάνε.", + spotUpdated: "Το spot ενημερώθηκε!", + spotUpdatedDesc: "Οι αλλαγές σου δημοσιεύτηκαν στο δίκτυο.", + staffVerifiedTitle: "Ένας admin του SkateSpots έλεγξε και επιβεβαίωσε αυτό το spot.", + statusNotePlaceholder: "Προαιρετικό: πρόσθεσε λεπτομέρειες (π.χ. \"νέα knobs στο ledge\", \"ο φύλακας διώχνει μετά τις 6μμ\")", + statusReported: "Η κατάσταση αναφέρθηκε", + statusReportedDesc: "Ευχαριστούμε που κρατάς τον χάρτη φρέσκο. Η αναφορά σου είναι ενεργή.", + submitReport: "Υποβολή αναφοράς", + submitting: "Υποβολή...", + suggestedByUser: "Προτάθηκε από {{count}} χρήστη", + suggestedByUsers: "Προτάθηκε από {{count}} χρήστες", + suggestedTagsContent: "Προτεινόμενες ετικέτες για {{title}}: {{tags}}", + suggestNTags: "Πρότεινε {{count}} ετικέτες", + suggestOneTag: "Πρότεινε 1 ετικέτα", + suggestTags: "Πρότεινε ετικέτες", + suggestTagsDesc: "Βοήθησε να κατηγοριοποιηθεί αυτό το spot προτείνοντας σχετικές ετικέτες.", + tags: "Ετικέτες", + tagsHint: "Πρόσθεσε ετικέτες για χαρακτηριστικά, επιφάνειες, ατμόσφαιρα (μέγιστο {{max}})", + tagsSuggested: "Οι ετικέτες προτάθηκαν!", + tagsSuggestedDesc: "Οι προτάσεις ετικετών σου υποβλήθηκαν.", + takePhoto: "Τράβηξε φωτογραφία", + threeDayForecast: "Πρόγνωση 3 ημερών", + tipTheMapper: "Φιλοδώρησε τον χαρτογράφο", + tipTheMapperDesc: "Βρήκες αυτό το spot χρήσιμο; Στείλε ένα zap για να ευχαριστήσεις τον χαρτογράφο!", + titleRequired: "Απαιτείται τίτλος", + titleRequiredDesc: "Εισάγετε ένα όνομα για αυτό το spot.", + today: "Σήμερα", + tomorrow: "Αύριο", + transferDesc: "Μεταφορά του \"{{title}}\" σε άλλον χρήστη. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", + transferFailed: "Η μεταφορά απέτυχε", + transferOwnership: "Μεταφορά ιδιοκτησίας", + transferRequestContent: "Αίτημα μεταφοράς ιδιοκτησίας για το spot \"{{title}}\"", + transferRequested: "Η μεταφορά ζητήθηκε", + transferRequestedDesc: "Ο νέος ιδιοκτήτης θα πρέπει να διεκδικήσει το spot για να ολοκληρώσει τη μεταφορά.", + transferring: "Μεταφορά...", + transferSpotOwnership: "Μεταφορά ιδιοκτησίας spot", + transferWarningDesc: "Μετά τη μεταφορά, δεν θα μπορείς πλέον να επεξεργάζεσαι ή να διαγράφεις αυτό το spot.", + typeToSearchTags: "Πληκτρολόγησε για αναζήτηση ή προσθήκη ετικετών...", + underReview: " — υπό έλεγχο. Αν αυτό είναι πραγματικό spot, πρόσθεσε φωτογραφία ή αναφορά κατάστασης για να το επιβεβαιώσεις.", + untitledSpot: "Spot χωρίς τίτλο", + unverified: "Μη επαληθευμένο", + updateDetailsFor: "Ενημέρωση λεπτομερειών για {{title}}", + updateSpotDesc: "Ενημέρωσε τις πληροφορίες για αυτό το spot. Όλα τα πεδία με * είναι υποχρεωτικά.", + uploadAPhoto: "Μεταφόρτωση φωτογραφίας", + uploadAPhotoHint: "Σύρε & άφησε ή κάνε κλικ · JPG, PNG, WebP", + uploadedAlt: "Μεταφορτώθηκε", + uploadFailed: "Η μεταφόρτωση απέτυχε", + uploadingPhoto: "Μεταφόρτωση φωτογραφίας…", + uploadPhotoFirst: "Μεταφόρτωσε πρώτα μια φωτογραφία.", + uvIndex: "Δείκτης UV", + verifiedBySkateSpots: "Επαληθευμένο από το SkateSpots", + viewPhotoFullScreen: "Προβολή φωτογραφίας πλήρους οθόνης", + viewPhotoOf: "Προβολή φωτογραφίας {{n}} από {{total}}", + warning: "Προειδοποίηση", + weatherConditions: "Συνθήκες καιρού", + weatherOnly: "μόνο καιρός", + weatherOnlyUnconfirmed: "Μόνο καιρός. Κανείς δεν έχει επιβεβαιώσει ότι είναι skate spot ακόμη, οπότε δεν υπάρχει βαθμολογία συνθηκών — πρόσθεσε φωτογραφία ή αναφορά κατάστασης για να το επιβεβαιώσεις.", + whyReporting: "Γιατί το αναφέρεις;", + wind: "Άνεμος", + yearsAgo: "πριν {{count}} έτος", + yearsAgoPlural: "πριν {{count}} έτη", + }, + diyUi: { + title: "DIY — Φτιάξε το δικό σου", + tagline: "Οδηγοί, ανοιχτά εργαλεία και σχέδια για να φτιάξεις τα δικά σου deck, ράμπες και τσιμεντένια spot — και μετά βρες τους ανθρώπους, τα μέρη και την αγορά που ταιριάζουν.", + doItWithPeople: "Κάν' το με παρέα", + backToDiy: "Πίσω στο DIY", + calc: { + title: "Υπολογιστής κόστους deck", + intro: "Τι κοστίζει να φτιαχτεί ένα deck — εργασία, εξοπλισμός, υλικά, χρόνος διεργασίας, συσκευασία και περιθώριο — και μια δίκαιη τιμή πώλησης. Αποθηκεύεται σε αυτή τη συσκευή.", + }, + designer: { + title: "Σχεδιαστής deck", + intro: "Σχημάτισε το περίγραμμα ενός skateboard ή longboard και μετά εξήγαγε ένα εκτυπώσιμο πρότυπο 1:1, ένα SVG ή ένα DXF για CNC. Αποθηκεύεται σε αυτή τη συσκευή.", + presets: "Προεπιλογές", + dimensions: "Διαστάσεις", + shape: "Σχήμα", + kicks: "Kicks", + hardware: "Τρύπες Trucks", + width: "Μέγιστο πλάτος", + wheelbase: "Wheelbase", + nose: "Μήκος nose", + tail: "Μήκος tail", + length: "Συνολικό μήκος", + waist: "Waist", + endRound: "Στρογγυλότητα άκρων", + concave: "Concave", + thickness: "Πάχος", + tailKick: "Tail kick", + noseKick: "Nose kick", + holeNew: "New school (2.125″)", + holeOld: "Old school (2.5″)", + holeSpacing: "Το New school είναι 2.125″ × 1.625″ (54 × 41 mm)· το old school είναι 2.5″ × 1.625″. Τρύπες στήριξης 3/16″.", + topView: "Κάτοψη", + sideView: "Πλαϊνή όψη", + concaveSection: "Τομή concave", + export: "Εξαγωγή", + pdfA4: "1:1 PDF · A4", + pdfLetter: "1:1 PDF · Letter", + printNote: "Εκτύπωσε το PDF στο 100% (χωρίς «προσαρμογή στη σελίδα») και μετά ένωσε τα φύλλα χρησιμοποιώντας τους σταυρούς στις γωνίες. Το SVG είναι επίσης σε πραγματικό μέγεθος.", + note: "Αυτό είναι το 2D περίγραμμα που χαράζεις και κόβεις. Για πλήρη 3D σχήματα και σχεδιασμό καλουπιών, ένα πραγματικό εργαλείο CAD παραμένει η σωστή επιλογή.", + }, + source: "Πηγή", + comingSoon: "Έρχεται σύντομα", + footer: "Οι οδηγοί βήμα-βήμα έρχονται. Προς το παρόν: βρες τους ανθρώπους που φτιάχνουν στο The Lab, καταχώρησε το spot σου και αγόρασε ή πούλησε στο Marketplace. Δούλευε με ασφάλεια — προστατευτικά, γάντια και προστασία ματιών.", + categories: { + boards: "Boards", + ramps: "Ράμπες & ξύλινα εμπόδια", + concrete: "Τσιμέντο & spot DIY", + repairs: "Επισκευές & συντήρηση", + tools: "Εργαλεία & σχέδια", + }, + cards: { + ossBuild: { + title: "Φτιάξε ένα skateboard", + blurb: "Κατασκευή deck βήμα-βήμα — veneer, καλούπια, πρέσες και φινίρισμα.", + }, + sk8cad: { + title: "SK8CAD", + blurb: "CAD ανοιχτού κώδικα για σχήματα deck, concave και σχεδιασμό καλουπιών.", + }, + deckCost: { + title: "Κόστος & τιμολόγηση deck", + blurb: "Υπολόγισε υλικά, εργασία και μια δίκαιη τιμή πώλησης πριν κατασκευάσεις.", + }, + deckDesigner: { + title: "Σχεδιαστής deck", + blurb: "Σχημάτισε ένα περίγραμμα και τύπωσε ένα πρότυπο 1:1 — ή εξήγαγε SVG/DXF για CNC.", + }, + ledgeBox: { + title: "Φτιάξε ένα ledge ή box", + blurb: "Ένα φιλικό για αρχάριους ξύλινο εμπόδιο που φτιάχνεις σε ένα σαββατοκύριακο.", + }, + quarterpipe: { + title: "Φτιάξε ένα quarterpipe", + blurb: "Σχέδια ράμπας, transition και coping για ένα backyard mini.", + }, + flatbar: { + title: "Φτιάξε ένα flatbar", + blurb: "Φθηνό, φορητό και ο καλύτερος τρόπος να μάθεις rails.", + }, + concreteBasics: { + title: "Βασικά του τσιμέντου", + blurb: "Ανάμιξη, καλούπια και φινίρισμα ενός ledge ή bank που διαρκεί.", + }, + coping: { + title: "Coping & άκρες", + blurb: "Πώς να τοποθετήσεις coping και να τελειώσεις ένα transition για ομαλό grind.", + }, + buyParts: { + title: "Αγόρασε ανταλλακτικά & εξοπλισμό", + blurb: "Βρες deck, hardware και εργαλεία από πωλητές στο Marketplace.", + }, + mapSpot: { + title: "Καταχώρησε το DIY spot σου", + blurb: "Έφτιαξες κάτι; Πρόσθεσέ το στον χάρτη για να το βρουν και να κάνουν skate άλλοι.", + }, + regrip: { + title: "Ξαναβάλε grip σε σανίδα", + blurb: "Αφαίρεσε το παλιό grip και βάλε καινούργιο καθαρά.", + }, + tune: { + title: "Συντήρησε bearings & trucks", + blurb: "Καθάρισε bearings, άλλαξε bushings και ρύθμισε τη γεωμετρία των truck σου.", + }, + printMolds: { + title: "3D-printed καλούπια", + blurb: "Εκτυπώσιμα αρχεία καλουπιών και βάσεων ευθυγράμμισης από την κοινότητα.", + }, + sk8cadTools: { + title: "Εργαλεία καλουπιών & ευθυγράμμισης", + blurb: "Σχεδίασε καλούπια με ενσωματωμένες βάσεις ευθυγράμμισης.", + }, + }, + actions: { + findBuilder: { + title: "Βρες έναν Builder", + blurb: "Κατασκευαστές ραμπών και DIY στο The Lab που μπορούν να το σχεδιάσουν ή να το χύσουν για σένα.", + }, + findCrew: { + title: "Βρες ένα DIY crew", + blurb: "Crews με επίκεντρο την κατασκευή — μπες σε αυτά που κάνουν τα spot πραγματικότητα.", + }, + mapSpot: { + title: "Καταχώρησε ένα DIY spot", + blurb: "Πρόσθεσε το spot που έφτιαξες για να ζει στον χάρτη.", + }, + sellBuilds: { + title: "Πούλησε τις κατασκευές σου", + blurb: "Καταχώρισε deck, ράμπες ή ανταλλακτικά που φτιάχνεις στο Marketplace.", + }, + findCoach: { + title: "Βρες προπονητή", + blurb: "Προπονητές που διδάσκουν DIY skate modules και κατασκευή spot.", + }, + }, + }, + labelsUi: { + spotCategory: { + street: { + label: "Street", + description: "Τυχαία spot που βρέθηκαν, αστικό έδαφος", + }, + transition: { + label: "Transition", + description: "Καμπύλες/ράμπες επιφάνειες", + }, + park: { + label: "Park", + description: "Κατασκευασμένα skatepark", + }, + plaza: { + label: "Plaza", + description: "Αστικές πλατείες (όπως MACBA, Love Park)", + }, + }, + spotFeature: { + wallrides: "Wallrides", + stairs: "Σκάλες & Handrails", + rails: "Rails", + ledges: "Ledges & Κράσπεδα", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Ramps", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Pyramids / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + }, + spotType: { + street: "Street", + transition: "Transition", + park: "Park", + plaza: "Plaza", + wallrides: "Wallrides", + stairs: "Σκάλες & Handrails", + rails: "Rails", + ledges: "Ledges & Κράσπεδα", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Ramps", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Pyramids / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + diy: "DIY", + rail: "Rail", + ledge: "Ledge", + gap: "Gap", + bowl: "Bowl", + stall: "Stall", + slappy: "Slappy", + }, + access: { + public: { + label: "Δημόσιο - Ανοιχτό σε όλους", + }, + private: { + label: "Ιδιωτική ιδιοκτησία - Απαιτείται άδεια", + }, + locals: { + label: "Ρώτα πρώτα τους ντόπιους", + }, + }, + shelter: { + outdoor: { + label: "Εξωτερικός", + short: "Έξω", + description: "Πλήρως εκτεθειμένο — η βροχή σταματά το παιχνίδι", + }, + partial: { + label: "Μερικώς καλυμμένο", + short: "Μερικώς καλυμμένο", + description: "Κάποια εμπόδια μένουν στεγνά", + }, + covered: { + label: "Καλυμμένο / με στέγη", + short: "Καλυμμένο", + description: "Εξωτερικός αλλά κάτω από στέγη", + }, + indoor: { + label: "Εσωτερικός", + short: "Μέσα", + description: "Πλήρως κλειστό — skate με βροχή ή λιακάδα", + }, + }, + eventType: { + contest: "Διαγωνισμός", + demo: "Demo", + session: "Session", + workshop: "Workshop", + premiere: "Πρεμιέρα", + tradeshow: "Έκθεση", + gameskate: "Game of Skate", + concert: "🎸 Συναυλία", + jam: "🎵 Jam", + festival: "🎪 Φεστιβάλ", + popup: "🎯 Pop-Up", + }, + gearCategory: { + deck: "Deck", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + shoes: "Skate Παπούτσια", + clothing: "Ρούχα", + protective: "Προστατευτικός εξοπλισμός", + stickers: "Αυτοκόλλητα", + wax: "Wax", + tools: "Εργαλεία", + griptape: "Griptape", + rubbrick: "Rub Brick", + }, + gearCondition: { + new: { + label: "Καινούργιο", + description: "Ποτέ χρησιμοποιημένο, ακόμη στη συσκευασία", + }, + like_new: { + label: "Σαν καινούργιο", + description: "Ελάχιστα χρησιμοποιημένο, άριστη κατάσταση", + }, + good: { + label: "Καλό", + description: "Κανονική φθορά, λειτουργεί τέλεια", + }, + well_used: { + label: "Πολυχρησιμοποιημένο", + description: "Δείχνει φθορά αλλά ακόμη λειτουργεί", + }, + }, + priceType: { + fixed: { + label: "Σταθερή τιμή", + description: "Ορισμός τιμής σε USD ή sats", + }, + free: { + label: "Δωρεάν", + description: "Το χαρίζω", + }, + trade: { + label: "Ανταλλαγή", + description: "Ψάχνω να κάνω swap", + }, + offer: { + label: "Κάνε προσφορά", + description: "Η τιμή είναι διαπραγματεύσιμη", + }, + }, + listingType: { + selling: { + label: "Πώληση", + description: "Καταχώριση εξοπλισμού προς πώληση", + }, + wtb: { + label: "Θέλω να αγοράσω", + description: "Ψάχνω συγκεκριμένο εξοπλισμό", + }, + }, + tour: { + spotType: { + street: "Street", + park: "Park", + diy: "DIY", + transition: "Transition", + hidden: "Κρυμμένα διαμάντια", + }, + category: { + local: { + label: "Τοπική περιήγηση", + description: "Δείξε κρυμμένα spot στην πόλη σου", + }, + national: { + label: "Εθνική περιήγηση", + description: "Road trips πολλών πόλεων σε όλη τη χώρα", + }, + international: { + label: "Διεθνής περιήγηση", + description: "Διασυνοριακές περιπέτειες σε πολλές χώρες", + }, + destruction: { + label: "World Destruction", + description: "Παγκόσμιος διαγωνισμός ομάδων στυλ KOTR", + }, + }, + }, + crew: { + vibe: { + street: "Street", + transition: "Transition / Vert", + park: "Park", + diy: "DIY", + cruising: "Cruising / Filming", + oldschool: "Old School", + allterrain: "All Terrain", + girls: "Girl / Woman", + youth: "Youth / Groms", + adaptive: "Adaptive", + punk: "Punk", + hiphop: "Rap / Hip-Hop", + }, + focus: { + mixed: "Μικτό / Γενικό", + builder: "DIY & Builders", + photo: "Φωτογραφία & Film", + coaching: "Coaching", + art: "Τέχνη & Σχέδιο", + music: "Band & Μουσική", + wellness: "Προπόνηση & Φυσικοθεραπεία", + }, + focusDescription: { + mixed: "Ένα συνηθισμένο skate crew — εμφανίζεται μόνο στη σελίδα Crews.", + builder: "Ένα DIY / park-building crew — εμφανίζεται επίσης στο The Lab στους Builders.", + photo: "Ένα crew film, φωτογραφίας ή μοντάζ — εμφανίζεται επίσης στο The Lab στο Φωτογραφία & Film.", + coaching: "Ένα crew προπόνησης / μαθημάτων — εμφανίζεται επίσης στο The Lab στο Coaching.", + art: "Μια συλλογικότητα τέχνης, σχεδίου, graffiti ή tattoo — εμφανίζεται επίσης στο The Lab στην Τέχνη & Σχέδιο.", + music: "Ένα συγκρότημα ή μουσική συλλογικότητα — εμφανίζεται επίσης στο The Lab στη Μουσική.", + wellness: "Ένα crew προπόνησης, φυσικής κατάστασης ή φυσικοθεραπείας — εμφανίζεται επίσης στο The Lab στην Προπόνηση.", + }, + lookingFor: { + filmer: "Filmer", + photographer: "Φωτογράφος", + editor: "Video Editor", + coach: "Προπονητής", + builder: "Κατασκευαστής ραμπών", + artist: "Καλλιτέχνης / Σχεδιαστής", + musician: "Μουσικός / Band", + members: "Νέα μέλη", + }, + role: { + filmer: "Filmer", + photographer: "Φωτογράφος", + editor: "Editor", + coach: "Προπονητής", + builder: "Builder", + artist: "Καλλιτέχνης", + graffiti: "Graffiti", + tattoo: "Tattoo", + trainer: "Trainer", + musician: "Μουσικός", + judge: "Κριτής", + manager: "Team Manager", + og: "OG", + }, + }, + memberVisibility: { + public: { + label: "Δημόσιο", + description: "Ο καθένας μπορεί να σε δει σε αυτό το crew — στη δημόσια σελίδα του crew και στην ανακάλυψη crew-mate.", + }, + crew: { + label: "Μόνο για το crew", + description: "Μόνο επιβεβαιωμένοι crew-mates και ο founder σε βλέπουν εδώ. Για όλους τους άλλους εμφανίζεσαι ως ανώνυμο «κρυμμένο μέλος». Σημείωση: αυτό είναι ιδιωτικότητα σε επίπεδο εφαρμογής — η ετικέτα μέλους σου εξακολουθεί να υπάρχει δημόσια στα relays, απλώς δεν εμφανίζεται ποτέ σε τρίτους.", + }, + }, + tagCategory: { + features: { + name: "Χαρακτηριστικά", + description: "Εμπόδια και έδαφος", + }, + surfaces: { + name: "Επιφάνειες", + description: "Υλικά και υφές", + }, + sizes: { + name: "Μεγέθη", + description: "Διαστάσεις και κλίμακα", + }, + stairs: { + name: "Αριθμός σκαλιών", + description: "Αριθμός σκαλιών", + }, + vibes: { + name: "Ατμόσφαιρα", + description: "Ατμόσφαιρα και κατάσταση", + }, + location: { + name: "Τοποθεσία", + description: "Πλαίσιο τοποθεσίας", + }, + tricks: { + name: "Tricks", + description: "Καλό για συγκεκριμένα tricks", + }, + }, + spotTagCategory: { + street: { + label: "Street", + description: "Spot δρόμου - σκάλες, rails, ledges", + }, + park: { + label: "Park", + description: "Skatepark - δημόσια ή ιδιωτικά", + }, + diy: { + label: "DIY", + description: "DIY/χειροποίητα spot", + }, + plaza: { + label: "Plaza", + description: "Δημόσιες πλατείες με αρχιτεκτονική φιλική για skate", + }, + }, + status: { + active: { + label: "Ενεργό", + description: "Έτοιμο — κάνε skate.", + }, + bust: { + label: "Bust", + description: "Υψηλός κίνδυνος αποβολής — security ή αστυνομία.", + }, + skate_stopped: { + label: "Skate-stopped", + description: "Με knobs / καλυμμένο, αλλά μερικώς κατάλληλο για skate.", + }, + closed: { + label: "Κλειστό", + description: "Προσωρινά κλειστό — κατασκευές ή εκδήλωση.", + }, + gone: { + label: "Χάθηκε", + description: "Κατεδαφίστηκε, ασφαλτοστρώθηκε ή περιφράχτηκε οριστικά.", + }, + }, + price: { + free: "ΔΩΡΕΑΝ", + trade: "Ανταλλαγή", + makeOffer: "Κάνε προσφορά", + offer: "Προσφορά", + }, + }, + feesUi: { + feeFeaturedEventLabel: "Προωθημένη εκδήλωση", + feeFeaturedEventDesc: "Προώθησε την εκδήλωσή σου στο SkateSpots", + feeFeaturedEventBenefit: "Η εκδήλωσή σου εμφανίζεται στην κορυφή της σελίδας εκδηλώσεων", + feeLabProfileLabel: "Lab Pro Profile", + feeLabProfileDesc: "Προώθησε τις υπηρεσίες σου στο The Lab", + feeLabProfileBenefit: "Pro badge + προωθημένη τοποθέτηση όταν οι skater περιηγούνται στο The Lab", + feeFeaturedShopLabel: "Προωθημένο κατάστημα", + feeFeaturedShopDesc: "Προώθησε το skate shop σου στον χάρτη και τον κατάλογο", + feeFeaturedShopBenefit: "Επαληθευμένο badge + προωθημένη πινέζα στον χάρτη", + feeFeaturedTourLabel: "Προωθημένη περιήγηση", + feeFeaturedTourDesc: "Προώθησε την περιήγησή σου στο SkateSpots", + feeFeaturedTourBenefit: "Pro badge + κορυφαία τοποθέτηση όταν οι skater περιηγούνται στις περιηγήσεις", + duration7d: "7 ημέρες", + duration30d: "1 μήνας", + duration90d: "3 μήνες", + duration365d: "12 μήνες", + metaActive: "{{label}} — Ενεργό", + daysRemainingOne: "{{count}} ημέρα απομένει", + daysRemainingMany: "{{count}} ημέρες απομένουν", + zapRequestContent: "SkateSpots {{label}} ({{tier}})", + errGenerate: "Αποτυχία δημιουργίας τιμολογίου", + paymentReceived: "⚡ Η πληρωμή ελήφθη!", + paymentReceivedDesc: "{{amount}} sats — το {{label}} είναι πλέον ενεργό.", + autoPayFailed: "Η αυτόματη πληρωμή απέτυχε", + autoPayFailedDesc: "Πλήρωσε χειροκίνητα χρησιμοποιώντας το QR ή το τιμολόγιο παρακάτω.", + payStatusUnknown: "Άγνωστη κατάσταση πληρωμής — η πληρωμή μπορεί να ολοκληρώθηκε. Έλεγξε το πορτοφόλι σου πριν ξαναπληρώσεις.", + invoiceCopied: "Το τιμολόγιο αντιγράφηκε!", + activeBang: "{{label}} Ενεργό!", + chooseDuration: "Διάλεξε διάρκεια", + bestValue: "Καλύτερη αξία", + perDay: "{{price}}/ημέρα", + validFor: "Ισχύει για", + amountLine: "~${{usd}} USD · προς {{name}} · {{tier}}", + payToContinue: "Πλήρωσε {{amount}} sats για να συνεχίσεις", + generating: "Δημιουργία τιμολογίου…", + processing: "Επεξεργασία πληρωμής…", + invoiceQrAlt: "QR τιμολογίου Lightning", + copyInvoice: "Αντιγραφή τιμολογίου", + openWallet: "Άνοιγμα πορτοφολιού", + payConnected: "Πληρωμή με συνδεδεμένο πορτοφόλι", + scanAny: "Σάρωσε με οποιοδήποτε πορτοφόλι Lightning", + tryAgain: "Δοκίμασε ξανά", + proReceiptTitle: "🦧⚡ Sasquatch Pro — είσαι μέσα!", + proReceiptPass: "Πάσο: {{pass}} ({{sats}} sats)", + proReceiptActiveUntil: "Ενεργό έως: {{until}}", + proReceiptUnlocked: "Τι ξεκλείδωσες:", + proReceiptBullet1: "• Προσωπικός βοηθός — διαβάζω το Stash, τα crews, τα spot & τις καταχωρίσεις σου", + proReceiptBullet2: "• Πρόχειρες ενέργειες — καταχώρισε εξοπλισμό, δημοσίευσε κατάσταση spot, σχεδίασε ταξίδια (εσύ επιβεβαιώνεις)", + proReceiptBullet3: "• Απαντήσεις που χρησιμοποιούν το προσωπικό σου πλαίσιο, όχι μόνο δημόσια δεδομένα", + proReceiptBullet4: "• ⚡ Υποστηρίζεις άμεσα το SkateSpots & το κρατάς δωρεάν + χωρίς διαφημίσεις", + proReceiptThanks: "Ευχαριστούμε που κρατάς το SkateSpots δωρεάν & χωρίς διαφημίσεις. Πάμε για skate. 🛹", + proReceiptSubject: "Απόδειξη Sasquatch Pro", + receiptContent: "Sasquatch Pro — πάσο υποστηρικτή {{tier}} 🦧⚡", + receiptAlt: "Πάσο υποστηρικτή Sasquatch Pro ({{tier}}), ισχύει έως {{until}}", + purchaseComment: "Sasquatch Pro — {{tier}} 🦧", + errLogin: "Συνδέσου για αναβάθμιση σε Pro.", + errStart: "Δεν ήταν δυνατή η έναρξη της αγοράς.", + errRecord: "Δεν ήταν δυνατή η καταγραφή του πάσου σου.", + }, + cardUi: { + save: "Αποθήκευση κάρτας στο Nostr", + saved: "Η κάρτα αποθηκεύτηκε", + savedDesc: "Η κάρτα σου είναι πλέον υπογεγραμμένη και επαληθεύσιμη.", + saveFailed: "Δεν ήταν δυνατή η αποθήκευση της κάρτας", + notPublished: "Μη δημοσιευμένη", + titleNeon: "Rider", + titleRest: "Card", + saveFrontPng: "Αποθήκευση μπροστινής όψης (PNG)", + expired: "ΕΛΗΞΕ", + logoUploaded: "Το λογότυπο μεταφορτώθηκε", + logoUploadFailed: "Δεν ήταν δυνατή η μεταφόρτωση του λογότυπου", + venue: "Συνδεδεμένος χώρος (προαιρετικό)", + venueNone: "Χωρίς χώρο", + venueHint: "Διάλεξε ένα από τα δικά σου spot για να δεσμεύσεις αυτό το πάσο σε έναν χώρο. Ένας verifier θα επιβεβαιώσει ότι σου ανήκει.", + venuePick: "Διάλεξε τον χώρο σου", + parkNoVenue: "Ένα πάσο Park μπορεί να εκδοθεί μόνο από τον ιδιοκτήτη του χώρου — καταχώρησε πρώτα ένα spot που σου ανήκει.", + parkAddVenue: "Πρόσθεσε spot", + parkNeedsVenue: "Διάλεξε έναν χώρο που σου ανήκει", + parkIssued: "Εκδοθέντα πάσα", + parkRevoke: "Ανάκληση", + parkRevoked: "Ανακλήθηκε", + parkRevokeFailed: "Δεν ήταν δυνατή η ανάκληση", + v: { + valid: "Έγκυρο", + validDesc: "Η υπογραφή είναι έγκυρη και εκδόθηκε από τον χώρο.", + expired: "Έληξε", + expiredDesc: "Πέρασε από την ημερομηνία λήξης.", + revoked: "Ανακλήθηκε", + revokedDesc: "Ο εκδότης ακύρωσε αυτό το πάσο — μην το δεχτείς.", + invalid: "Μη έγκυρο", + invalidDesc: "Η υπογραφή δεν επαληθεύεται. Μην την εμπιστεύεσαι.", + notFound: "Δεν βρέθηκε", + notFoundDesc: "Δεν υπάρχει αντίστοιχη εγγραφή στα relays.", + unverifiedIssuer: "Μη επαληθευμένος εκδότης", + unverifiedIssuerDesc: "Αυτό το πάσο αναφέρει έναν χώρο που δεν ανήκει στο κλειδί του εκδότη.", + notBound: "Μη δεσμευμένο", + notBoundDesc: "Δεν είναι δεσμευμένο σε χώρο — δεν αποδεικνύει τίποτα για την πρόσβαση.", + noRsvp: "Χωρίς RSVP", + noRsvpDesc: "Ο κάτοχος δεν έχει καταγεγραμμένο RSVP για αυτή την εκδήλωση.", + admitted: "Έγινε δεκτός", + admittedDesc: "Η εκδήλωση του διοργανωτή + ο κάτοχος έκανε RSVP.", + noHolder: "Δεν υπάρχει κάτοχος στον σύνδεσμο", + noHolderDesc: "Αυτό το QR δεν έχει κάτοχο εισιτηρίου (`?h=`), οπότε ο κάτοχος δεν μπορεί να ελεγχθεί.", + }, + passes: { + tab: "Τα πάσα μου", + pass: "Πάσο πρόσβασης", + none: "Δεν υπάρχουν πάσα ακόμη. Όταν ένας χώρος ή διοργανωτής σου εκδώσει ένα, θα εμφανιστεί εδώ.", + }, + facets: { + title: "Εμφάνιση πτυχών ταυτότητας", + crews: "Crews", + local: "Τοπικός", + roles: "Ρόλοι Lab", + }, + roles: { + coach: "Προπονητής", + filmer: "Filmer", + editor: "Editor", + photographer: "Φωτογράφος", + builder: "Builder", + artist: "Καλλιτέχνης", + graffiti: "Graffiti", + tattoo: "Tattoo", + trainer: "Trainer", + musician: "Μουσικός", + judge: "Κριτής", + organizer: "Διοργανωτής", + barber: "Κουρέας", + }, + crew: { + crewCard: "CREW CARD", + crewSub: "Το crew σου, σε μια κάρτα", + pick: "Διάλεξε crew", + none: "Δεν είσαι ακόμη σε crew — μπες ή ξεκίνα ένα πρώτα.", + hint: "Η κάρτα χτίζεται από τα δικά του υπογεγραμμένα δεδομένα του crew. Επεξεργάσου το crew στη σελίδα του για να το αλλάξεις.", + members: "ΜΕΛΗ", + spots: "SPOTS", + est: "Από το {{year}}", + openCall: "Ανοιχτό κάλεσμα", + verifiedCrew: "Επαληθευμένο crew", + viewCrew: "Δες το crew", + }, + event: { + pass: "EVENT PASS", + passSub: "Πάσο για μια εκδήλωση στην οποία πηγαίνεις", + pick: "Διάλεξε εκδήλωση", + none: "Δεν υπάρχουν εκδηλώσεις ακόμη — δημιούργησε μία ή κάνε RSVP σε μία πρώτα.", + hint: "Το πάσο χτίζεται από τα δικά της υπογεγραμμένα δεδομένα της εκδήλωσης. Μόνο ο διοργανωτής μπορεί να το αλλάξει.", + admits: "ΔΕΧΕΤΑΙ", + going: "{{count}} πάνε", + verifiedEvent: "Επαληθευμένη εκδήλωση", + viewEvent: "Δες την εκδήλωση", + issuePass: "Έκδοση πάσου check-in", + issuePassBtn: "Έκδοση πάσου", + issuePassHint: "Ένα υπογεγραμμένο πάσο για συγκεκριμένο συμμετέχοντα — το δείχνει στην είσοδο.", + notOrganiser: "Μόνο ο διοργανωτής μπορεί να εκδίδει πάσα", + passIssued: "Το πάσο εκδόθηκε", + issueFailed: "Δεν ήταν δυνατή η έκδοση του πάσου", + issuedPasses: "Εκδοθέντα πάσα check-in", + }, + studio: { + unsaved: "Μη αποθηκευμένες αλλαγές", + saved: "Αποθηκευμένο", + saveChanges: "Αποθήκευση αλλαγών", + allSaved: "Αποθηκευμένο — ενημερωμένο", + showOnCard: "Εμφάνιση στην κάρτα", + derived: "Από το προφίλ σου Skater", + noSkaterProfile: "Δεν υπάρχει ακόμη προφίλ Skater —", + editSkaterProfile: "πρόσθεσε τα στυλ & το επίπεδό σου", + noPhoto: "Δεν υπάρχει ακόμη φωτογραφία προφίλ —", + addPhoto: "πρόσθεσε μία στο προφίλ σου", + finishTitle: "Ολοκλήρωσε την κάρτα σου", + finishDesc: "Μια φωτογραφία και ένα προφίλ Skater την κάνουν να φαίνεται αληθινή.", + checkPhoto: "Φωτογραφία προφίλ", + checkName: "Εμφανιζόμενο όνομα", + checkProfile: "Στυλ & επίπεδο", + checkCrew: "Μπες σε crew", + moreTypes: "Περισσότεροι τύποι καρτών ξεκλειδώνονται καθώς καταχωρείς spot που σου ανήκουν, μπαίνεις σε crews ή κάνεις RSVP σε εκδηλώσεις.", + accent: "Χρώμα έμφασης", + accentHint: "Υπερισχύει του θέματος", + accentClear: "Χρήση χρώματος θέματος", + logo: "Προσαρμοσμένο λογότυπο / έμβλημα", + logoAdd: "Μεταφόρτωση", + logoChange: "Αλλαγή", + logoClear: "Αφαίρεση", + }, + back: { + title: "Εκτυπώσιμη πίσω όψη", + desc: "Crews, ρόλοι, χορηγοί & σύνδεσμοι στο πίσω μέρος", + showBack: "Εμφάνιση πίσω", + showFront: "Εμφάνιση μπροστά", + empty: "Τίποτα εδώ ακόμη — πρόσθεσε crews, ρόλους ή χορηγούς.", + }, + verify: { + checking: "Έλεγχος της κάρτας…", + notFound: "Η κάρτα δεν βρέθηκε", + notFoundDesc: "Δεν βρέθηκε αντίστοιχη εκδήλωση στα relays. Μπορεί να διαγράφηκε ή ο σύνδεσμος είναι λάθος.", + invalid: "Μη έγκυρη υπογραφή", + invalidDesc: "Αυτή η εκδήλωση υπάρχει αλλά η υπογραφή της δεν επαληθεύεται. Μην την εμπιστεύεσαι.", + authentic: "Αυθεντικό", + authenticDesc: "Η υπογραφή του εκδότη είναι έγκυρη.", + kind: "Τύπος", + kindPark: "Κάρτα πρόσβασης Park", + kindRider: "Κάρτα Rider", + kindCrew: "Κάρτα Crew", + kindEvent: "Πάσο εκδήλωσης", + organiser: "Διοργανωτής", + expired: "Έληξε", + valid: "Έγκυρο", + holder: "Κάτοχος", + ticketHolder: "Κάτοχος εισιτηρίου", + rsvp: "RSVP", + rsvpGoing: "Πάει", + rsvpInterested: "Ενδιαφέρεται", + rsvpNone: "Δεν βρέθηκε RSVP", + revoked: "Το πάσο ανακλήθηκε", + revokedDesc: "Ο εκδότης ακύρωσε αυτό το πάσο — μην το δεχτείς.", + issuedBy: "Εκδόθηκε από", + accessLevel: "Επίπεδο πρόσβασης", + validThru: "Ισχύει έως", + selfIssued: "Κατάσταση", + selfIssuedDesc: "Αυτοεκδοθείσα κάρτα ταυτότητας", + venue: "Χώρος", + venueVerified: "Επαληθευμένο — το κλειδί του ιδιοκτήτη αυτού του χώρου ταιριάζει με του εκδότη.", + venueMismatch: "Αυτό το πάσο αναφέρει έναν χώρο που δεν ανήκει στο κλειδί του εκδότη.", + venueNone: "Δεν είναι δεσμευμένο σε χώρο.", + viewCard: "Δες την κάρτα", + disclaimer: "Μια έγκυρη υπογραφή αποδεικνύει ποιος υπέγραψε αυτή την κάρτα — δεν είναι απόδειξη δεξιότητας ή δικαιωμάτων πρόσβασης πέρα από αυτά που εξέδωσε ο χώρος.", + details: "Λεπτομέρειες", + invalidLink: "Μη έγκυρος σύνδεσμος", + invalidLinkDesc: "Αυτό δεν μοιάζει με έγκυρο σύνδεσμο κάρτας.", + }, + public: { + invalid: "Αυτό δεν μοιάζει με έγκυρο σύνδεσμο κάρτας.", + createYourOwn: "Φτιάξε τη δική σου κάρτα", + editYourCard: "Επεξεργάσου την κάρτα σου", + backToEditor: "Πίσω στον επεξεργαστή", + backHome: "Πίσω στην αρχική", + notCustomised: "Αυτός ο skater δεν έχει προσαρμόσει ακόμη την κάρτα του — αυτή είναι η προεπιλεγμένη εμφάνιση.", + verifyNote: "Σάρωσε το QR στην κάρτα για να την επαληθεύσεις.", + }, + }, + routeUi: { + destination: "Προορισμός", + routeTo: "Διαδρομή προς {{label}}", + routeToLabel: "Διαδρομή προς", + search: "Αναζήτηση", + description: "Επιλογές διαδρομής και οδηγίες εντός εφαρμογής.", + routeMapAria: "Χάρτης διαδρομής", + findingLocation: "Εύρεση της τοποθεσίας σου…", + plottingRoute: "Σχεδίαση της διαδρομής σου…", + refiningLocation: "Βελτιστοποίηση τοποθεσίας…", + offlineSavedRoute: "Εκτός σύνδεσης · αποθηκευμένη διαδρομή {{age}}", + tapMapStart: "Πάτησε τον χάρτη για να ορίσεις το σημείο εκκίνησης", + fitRouteAria: "Προσαρμογή όλης της διαδρομής στον χάρτη", + wholeRoute: "Ολόκληρη η διαδρομή", + next: "Επόμενο", + nextStep: "Επόμενο · βήμα {{n}}", + followTheLine: "Ακολούθησε τη γραμμή", + toTheTurn: "μέχρι τη στροφή", + toGo: "απομένουν", + tryAgain: "Δοκίμασε ξανά", + mode: { + foot: "Skate / Περπάτημα", + bike: "Ποδήλατο", + moto: "Μηχανή", + car: "Αυτοκίνητο", + transit: "Μέσα μεταφοράς", + }, + from: "Από", + myLocation: "Η τοποθεσία μου", + tapTheMap: "Πάτησε τον χάρτη…", + chooseOnMap: "Διάλεξε στον χάρτη", + direct: "απευθείας", + transferOne: "1 μετεπιβίβαση", + transfers: "{{count}} μετεπιβιβάσεις", + options: "{{count}} επιλογές", + ride: "διαδρομή", + arrive: "άφιξη", + speedAvg: "{{speed}} km/h μέση", + stepsCount: "{{count}} βήματα", + onABoard: "πάνω σε σανίδα", + usesDrivingRoads: "χρησιμοποιεί δρόμους οχημάτων", + drivingEstimate: "εκτίμηση οδήγησης", + updating: "ενημέρωση…", + pickMode: "Διάλεξε μέσο για να δεις τη διαδρομή σου.", + waitingLocation: "Αναμονή για την τοποθεσία σου…", + routeSteps: "Βήματα διαδρομής", + walkingRoute: "πεζή διαδρομή — πιο γρήγορη πάνω σε σανίδα", + planningView: "Προβολή σχεδιασμού — πάτησε Έναρξη για ζωντανές στροφές, φωνή και άφιξη.", + leaveNow: "Φύγε τώρα", + departAt: "Αναχώρηση στις", + arriveBy: "Άφιξη έως", + departureTime: "Ώρα αναχώρησης", + arrivalTime: "Ώρα άφιξης", + only: "Μόνο", + clear: "καθαρισμός", + itinerary: "Δρομολόγιο", + group: { + bus: "Λεωφορείο", + tram: "Τραμ", + metro: "Μετρό", + train: "Τρένο", + ferry: "Πλοίο", + }, + walk: "Περπάτημα", + rideVerb: "Οδήγηση", + walkLower: "περπάτημα", + rideLower: "διαδρομή", + toStop: "προς", + track: "γραμμή {{track}}", + stopOne: "1 στάση", + stopsCount: "{{count}} στάσεις", + tickets: "εισιτήρια ↗", + done: "Τέλος", + stop: "Διακοπή", + start: "Έναρξη", + arrived: "Έφτασες. 🛹", + voiceOnNote: "Η οθόνη μένει ανοιχτή · φωνή ενεργή — στροφές και άφιξη εκφωνούνται.", + voiceOffNote: "Η οθόνη μένει ανοιχτή · φωνή ανενεργή.", + followNote: "Στροφές, φωνή και άφιξη καθώς κυλάς. Κρατά την οθόνη ανοιχτή.", + voiceOffAria: "Απενεργοποίηση φωνητικής καθοδήγησης", + voiceOnAria: "Ενεργοποίηση φωνητικής καθοδήγησης", + voiceStart: "Έναρξη πλοήγησης", + voiceArrived: "Έφτασες", + voiceIn: "Σε {{metres}} μέτρα, {{instruction}}", + voiceContinue: "συνέχισε", + voiceContinueCaps: "Συνέχισε", + errPermissionDenied: "Η άδεια τοποθεσίας απορρίφθηκε.", + errWaitingGps: "Αναμονή για στίγμα GPS…", + errPermissionDeniedLong: "Η άδεια τοποθεσίας απορρίφθηκε. Ενεργοποίησε την τοποθεσία για να βρεις διαδρομή από όπου είσαι.", + errNoLocation: "Δεν ήταν δυνατή η λήψη της τοποθεσίας σου. Δοκίμασε ξανά.", + errNoLocationShort: "Δεν ήταν δυνατή η λήψη της τοποθεσίας σου.", + errTransitNoRouteFiltered: "Δεν υπάρχει διαδρομή για αυτή την ώρα ή μέσο μεταφοράς — δοκίμασε άλλη ώρα ή συμπερίλαβε περισσότερα μέσα.", + errTransitNoRoute: "Δεν βρέθηκε διαδρομή μέσων μεταφοράς εδώ — αυτή η περιοχή μπορεί να μην δημοσιεύει ανοιχτά δρομολόγια.", + errTransitUnreachable: "Δεν ήταν δυνατή η πρόσβαση στην υπηρεσία μέσων μεταφοράς. Έλεγξε τη σύνδεσή σου και δοκίμασε ξανά.", + errRoutingBusy: "Η υπηρεσία δρομολόγησης είναι απασχολημένη αυτή τη στιγμή — δοκίμασε ξανά σε λίγο.", + errNoRouteMode: "Δεν υπάρχει διαδρομή για αυτό το μέσο — ο προορισμός μπορεί να είναι εκτός οδικού δικτύου. Δοκίμασε άλλο μέσο.", + errRoutingUnreachable: "Δεν ήταν δυνατή η πρόσβαση στην υπηρεσία δρομολόγησης. Έλεγξε τη σύνδεσή σου και δοκίμασε ξανά.", + departures: "Αναχωρήσεις", + upcomingFrom: "Επερχόμενες αναχωρήσεις από {{stop}}", + loadingDepartures: "Φόρτωση αναχωρήσεων…", + noDepartures: "Δεν βρέθηκαν επερχόμενες αναχωρήσεις σε αυτή τη στάση.", + live: "ζωντανά", + cancelled: "ακυρώθηκε", + refresh: "Ανανέωση", + tripLoginTitle: "Συνδέσου για αποθήκευση", + tripLoginDesc: "Συνδέσου για να κρατήσεις αυτό το ταξίδι ως Συλλογή.", + tripCollectionTitle: "{{destination}} skate ταξίδι 🛹", + tripCollectionDesc: "Σχέδιο ταξιδιού από τον The Sasquatch — {{count}} ημέρες στο {{destination}}.", + tripCollectionDescOne: "Σχέδιο ταξιδιού από τον The Sasquatch — {{count}} ημέρα στο {{destination}}.", + tripSavedTitle: "Αποθηκεύτηκε στις Συλλογές 🦧", + tripSavedDesc: "Το ταξίδι σου στο {{destination}} είναι αποθηκευμένο.", + tripSaveFailed: "Δεν ήταν δυνατή η αποθήκευση", + tripSaveFailedDesc: "Δοκίμασε ξανά σε λίγο.", + daysInDestinationOne: "{{count}} ημέρα στο {{destination}}", + daysInDestination: "{{count}} ημέρες στο {{destination}}", + wetForecast: "Βροχερή πρόγνωση — βρες τοπικό crew για καλυμμένες/εσωτερικές επιλογές.", + dayLabel: "Ημέρα {{n}}", + freeSkate: "Ελεύθερο skate — εξερεύνησε & film. 🎥", + tapToBook: "πάτησε για κράτηση / zap ⚡", + localCrews: "Τοπικά crews", + saving: "Αποθήκευση…", + savedToCollections: "Αποθηκεύτηκε στις Συλλογές", + saveSpotOne: "Αποθήκευση {{count}} spot σε μια Συλλογή", + saveSpots: "Αποθήκευση {{count}} spot σε μια Συλλογή", + flights: "Πτήσεις", + stays: "Διαμονή", + gettingAround: "Μετακινήσεις", + noMiddleman: "Εγώ σχεδιάζω το skate — οι πτήσεις & η διαμονή ανοίγουν στους πραγματικούς ιστότοπους (χωρίς KYC, χωρίς μεσάζοντα).", + ageJustNow: "μόλις τώρα", + ageMinAgo: "πριν {{count}} λεπ", + ageHourAgo: "πριν {{count}} ώ", + ageDayAgo: "πριν {{count}} ημ", + skateRightHere: "ακριβώς εδώ", + skateMin: "~{{count}} λεπ βόλτα", + skateHours: "~{{hours}} ώ βόλτα", + maneuver: { + headOut: "Ξεκίνα", + arrive: "Φτάσε στο spot", + continueStraight: "Συνέχισε", + bearLeft: "Αριστερά", + bearRight: "Δεξιά", + turnLeft: "Στρίψε αριστερά", + turnRight: "Στρίψε δεξιά", + sharpLeft: "Απότομα αριστερά", + sharpRight: "Απότομα δεξιά", + turn: "Στρίψε", + keepLeft: "Μείνε αριστερά", + keepRight: "Μείνε δεξιά", + takeFork: "Πάρε τον κλάδο", + merge: "Συνενώσου", + roundabout: "Πάρε τον κυκλικό κόμβο", + takeRamp: "Πάρε τη ράμπα", + takeExit: "Πάρε την έξοδο", + }, + maneuverOnto: "{{instruction}} προς {{road}}", + }, + sasquatchUi: { + live: "ζωντανά", + offline: "εκτός σύνδεσης", + genericTitle: "Βοηθός SkateSpots 🦧", + genericGreeting: "Γεια! Είμαι ο The Sasquatch. Ρώτησέ με για spot, εκδηλώσεις, προπονητές, εξοπλισμό ή πώς λειτουργεί η εφαρμογή. Έχω ζωντανά δεδομένα από το Relay του SkateSpots!", + q1: "Σχεδίασέ μου 3 ημέρες στη Λισαβόνα", + q2: "Βρες spot κοντά μου", + q3: "Καμιά επερχόμενη εκδήλωση;", + q4: "Τι είναι τα crews;", + q5: "Πώς δουλεύουν τα zap;", + q6: "Τι είναι το Nostr;", + q7: "Τι είναι το Stash μου;", + q8: "Είναι δωρεάν;", + bubbleTitle: "Πάτησε και σύρε για μετακίνηση · Πάτησε για άνοιγμα", + openGuideAria: "Άνοιγμα οδηγού Sasquatch", + hideAria: "Απόκρυψη του βοηθού Sasquatch", + hide: "Απόκρυψη βοηθού", + showAria: "Εμφάνιση του βοηθού Sasquatch", + activeUntil: "Ενεργό έως {{date}}", + platformOwner: "Ιδιοκτήτης πλατφόρμας", + upgradeTitle: "Αναβάθμιση σε Sasquatch Pro", + goPro: "Go Pro", + goProBlurb: "Προσωπικό AI · από 2k sats", + aiBalanceTitle: "Υπόλοιπο πίστωσης Sasquatch AI (μόνο για τον ιδιοκτήτη) — ανανέωση στο {{provider}}", + aiChip: "⚡ AI {{balance}}", + minimizeToBubbleAria: "Ελαχιστοποίηση σε φούσκα", + minimize: "Ελαχιστοποίηση", + closePanelAria: "Κλείσιμο πίνακα", + close: "Κλείσιμο", + askLab: "Ρώτησε για Coaching & Filming", + askMap: "Ρώτησε για Spot, Καταστήματα & Εξοπλισμό", + askAnything: "Ρώτησέ με ό,τι θέλεις 🛹", + quickQuestions: "Γρήγορες ερωτήσεις:", + you: "🧑 Εσύ", + thinking: "σκέφτομαι...", + inputPlaceholder: "Ρώτησε για spot, εκδηλώσεις, προπονητές...", + liveDataFrom: "Ζωντανά δεδομένα από", + nostrRelays: "Nostr relays", + clear: "καθαρισμός", + gettingLocation: "📍 Λήψη της τοποθεσίας σου…", + findingClosest: "🔍 Εύρεση των πιο κοντινών spot…", + checkingLive: "🔍 Έλεγχος ζωντανών δεδομένων…", + planningTrip: "🗺️ Σχεδιασμός του ταξιδιού σου στο {{destination}}...", + searchingRelays: "🔍 Αναζήτηση στα relays για {{tool}}...", + perk1: "Προσωπικός βοηθός — ο Sasquatch διαβάζει το Stash, τα crews, τα spot & τις καταχωρίσεις σου", + perk2: "Πρόχειρες ενέργειες: καταχώρισε εξοπλισμό, δημοσίευσε κατάσταση skate, σχεδίασε ταξίδι — εσύ επιβεβαιώνεις πριν δημοσιευτεί οτιδήποτε", + perk3: "Οι απαντήσεις χρησιμοποιούν το προσωπικό σου πλαίσιο, όχι μόνο δημόσια δεδομένα", + perk4: "⚡ Υποστηρίζεις άμεσα το SkateSpots & το κρατάς δωρεάν και χωρίς διαφημίσεις", + welcomeTitle: "Ευχαριστούμε που υποστηρίζεις το Sasquatch Pro! 🦧⚡", + welcomeDesc: "Η πληρωμή στάλθηκε — το πάσο σου ενεργοποιείται μόλις το επιβεβαιώσει ο πάροχος (συνήθως εντός ενός λεπτού). Ευχαριστούμε που κρατάς τους δρόμους ελεύθερους.", + invoiceCopied: "Το τιμολόγιο αντιγράφηκε", + dialogDesc: "Ενίσχυσε τον AI skate οδηγό σου. 100% χρηματοδοτεί μια δωρεάν, χωρίς διαφημίσεις εφαρμογή κοινότητας.", + proSupporter: "Είσαι υποστηρικτής Pro ⚡", + extendPrompt: "Θέλεις να το επεκτείνεις; Διάλεξε ένα πακέτο παρακάτω για περισσότερο χρόνο.", + scanToPayPre: "Σάρωσε για πληρωμή", + scanToPayAmount: "{{sats}} sats", + scanToPayPost: "για {{label}} του Pro", + invoiceQrAlt: "QR τιμολογίου Lightning", + copyInvoice: "Αντιγραφή τιμολογίου", + ivePaid: "Πλήρωσα", + ivePaidHint: "Πάτησε «Πλήρωσα» αφού επιβεβαιώσει το πορτοφόλι σου — αυτό καταγράφει το πάσο σου στην ταυτότητά σου Nostr.", + freeStaysPre: "Το δωρεάν Sasquatch παραμένει δωρεάν — δημόσια αναζήτηση spot/εκδήλωσης/προπονητή, σχεδιασμός ταξιδιού + το πλήρες γλωσσάρι tricks. Το Pro προσθέτει το ", + freeStaysEmphasis: "προσωπικό + ενέργειες", + freeStaysPost: " επίπεδο.", + loginFirst: "Συνδέσου πρώτα για αναβάθμιση.", + paysTo: "Πληρώνει σε", + overLightning: "μέσω Lightning. Δεσμευμένο στο npub σου.", + popular: "Δημοφιλές", + sats: "sats", + extend: "Επέκταση", + done: "Έγινε!", + cancelledNothing: "Ακυρώθηκε — δεν δημοσιεύτηκε τίποτα.", + draftReview: "Πρόχειρο — έλεγξε & επιβεβαίωσε", + statusTextPlaceholder: "Κείμενο κατάστασης", + titlePlaceholder: "Τίτλος", + priceSatsPlaceholder: "Τιμή (sats)", + conditionPlaceholder: "Κατάσταση", + cancel: "Άκυρο", + aiTitle: "Sasquatch AI", + owner: "Ιδιοκτήτης", + notConfigured: "δεν έχει ρυθμιστεί", + unavailable: "μη διαθέσιμο", + satsValue: "{{balance}} sats", + theNode: "ο κόμβος", + lowBalance: "Χαμηλό υπόλοιπο — ανανέωσε στο {{provider}} ή το AI θα επιστρέψει στον πάροχο χωρίς κλειδί.", + aiDesc: "AI πληρωμής ανά αίτημα, χρηματοδοτούμενο σε sats μέσω Routstr. Ανανεώνεται όταν είναι χαμηλό.", + tier7d: "7 ημέρες", + tier1m: "1 μήνας", + tier3m: "3 μήνες", + tier1y: "1 χρόνος", + badgeTry: "Δοκίμασέ το", + badgeOff20: "20% έκπτωση", + badgeBest: "Καλύτερη αξία · 40% έκπτωση", + draftPostStatusTitle: "Δημοσίευσε κατάσταση skate", + draftAutoExpires: "Λήγει αυτόματα σε {{count}} λεπ", + draftPostStatusCta: "Δημοσίευση κατάστασης", + draftCategory: "Κατηγορία: {{value}}", + draftSize: "Μέγεθος: {{value}}", + draftCondition: "Κατάσταση: {{value}}", + draftMaxPrice: "Μέγιστη τιμή: {{price}} {{currency}}", + draftPriceOpen: "Τιμή: ανοιχτή", + draftLookingForTitle: "Ψάχνω για \"{{title}}\"", + draftWantedCta: "Δημοσίευση αγγελίας ζήτησης", + draftPrice: "Τιμή: {{price}} {{currency}}", + draftPriceOffer: "Τιμή: κάνε προσφορά", + draftListTitle: "Καταχώρισε το \"{{title}}\" προς πώληση", + draftPublishCta: "Δημοσίευση καταχώρισης", + statusPosted: "Η κατάσταση δημοσιεύτηκε 🛹", + wantedPublished: "Η αγγελία ζήτησης δημοσιεύτηκε 🔎", + listingPublished: "Η καταχώριση δημοσιεύτηκε 💸", + mustBeLoggedIn: "Πρέπει να είσαι συνδεδεμένος.", + }, + sasquatchChat: { + faq: { + hi: "Γεια! Είμαι ο The Sasquatch 🦧 Ο AI skate οδηγός σου. Ρώτησέ με για spot, εκδηλώσεις, προπονητές, εξοπλισμό — ή ό,τι θέλεις για την εφαρμογή. Τι χρειάζεσαι;", + hello: "Τι κάνουμε! 🛹 Είμαι ο The Sasquatch. Ρώτησέ με για skate spot, εκδηλώσεις, προπονητές ή πώς λειτουργεί η εφαρμογή. Τι παίζει;", + hey: "Γεια skater! 🤙 Ρώτησέ με για spot κοντά σου, επερχόμενες εκδηλώσεις, προπονητές ή ό,τι άλλο SkateSpots.", + whoAreYou: "Είμαι ο The Sasquatch 🦧 — ο AI οδηγός για το SkateSpots. Μπορώ να βρω skate spot παγκοσμίως, να ψάξω εκδηλώσεις, προπονητές, filmers και καταχωρίσεις εξοπλισμού. Όλα τροφοδοτούνται από ζωντανά δεδομένα Nostr. Ρώτα ελεύθερα!", + whatCanYouDo: "Μπορώ να βρω skate spot ανά πόλη ή χώρα, να ψάξω επερχόμενες εκδηλώσεις, να βρω προπονητές και filmers στο The Lab, να αναζητήσω καταχωρίσεις εξοπλισμού και να απαντήσω σε ερωτήσεις για το πώς λειτουργεί η εφαρμογή. Δοκίμασε: 'spot στη Μπανγκόκ' ή 'βρες προπονητή'! 🛹", + whatIsNostr: "Το Nostr είναι ένα απλό, ανοιχτό πρωτόκολλο για αποκεντρωμένα κοινωνικά δίκτυα. Σκέψου το σαν Twitter, αλλά καμία εταιρεία δεν το ελέγχει — χρησιμοποιείς κρυπτογραφικά κλειδιά αντί για ονόματα χρήστη, επιλέγεις ποια relays αποθηκεύουν τα δεδομένα σου (ή τρέχεις τα δικά σου), και ένας λογαριασμός λειτουργεί σε κάθε εφαρμογή Nostr! 🔑", + isThisPrivate: "Ο ειλικρινής απολογισμός 🛡️\n\n• Η **τοποθεσία GPS σου μένει στη συσκευή σου** — το «Κοντά μου» απλώς κεντράρει τον χάρτη. Δεν αποστέλλεται ποτέ σε εμάς ούτε δημοσιεύεται.\n• **Τα spot που προσθέτεις είναι δημόσια** (αυτό είναι το νόημα ενός κοινού χάρτη) — οπότε μην βάζεις πινέζα στην πόρτα του σπιτιού σου.\n• **Τα DM & τα crew chats είναι από άκρη σε άκρη κρυπτογραφημένα** — μόνο τα μέλη μπορούν να τα διαβάσουν.\n• Όπως κάθε ιστότοπος, οι διακομιστές με τους οποίους συνδέεσαι (πλακίδια χάρτη, relays) μπορούν να δουν τη **διεύθυνση IP** σου. Θέλεις να την κρύψεις κι αυτή; Χρησιμοποίησε VPN ή Tor.\n\nΠλήρεις λεπτομέρειες στη [σελίδα Απορρήτου](/privacy). 🛹", + privacy: "Σύντομη εκδοχή 🛡️: το GPS σου δεν φεύγει ποτέ από τη συσκευή σου, τα spot που δημοσιεύεις είναι δημόσια εκ σχεδιασμού, και τα DM/crew chats είναι από άκρη σε άκρη κρυπτογραφημένα. Οι διακομιστές μπορούν ωστόσο να δουν τη διεύθυνση IP σου (φυσιολογικό για κάθε ιστότοπο) — ένα VPN ή Tor την κρύβει αν θέλεις. Πλήρης ανάλυση στη [σελίδα Απορρήτου](/privacy).", + amITracked: "Το SkateSpots δεν σε παρακολουθεί — χωρίς διαφημίσεις, χωρίς προφίλ ανάλυσης, χωρίς πώληση δεδομένων, και δεν υπάρχει διακομιστής SkateSpots που συλλέγει την τοποθεσία σου. Το GPS σου μένει στη συσκευή σου. Το μόνο που βλέπουν οι διακομιστές (πλακίδια χάρτη, relays) είναι η **διεύθυνση IP** σου — όπως σε κάθε ιστότοπο. Χρησιμοποίησε VPN ή Tor για να την κρύψεις. Περισσότερα στη [σελίδα Απορρήτου](/privacy). 🛡️", + doYouTrack: "Όχι — χωρίς παρακολούθηση, χωρίς διαφημίσεις, χωρίς συλλογή δεδομένων. Το GPS σου μένει στη συσκευή σου και δεν υπάρχει κεντρικός διακομιστής που σε καταγράφει. Οι διακομιστές με τους οποίους συνδέεσαι μπορούν να δουν τη διεύθυνση IP σου (όπως σε κάθε ιστότοπο)· ένα VPN/Tor την κρύβει. Δες τη [σελίδα Απορρήτου](/privacy). 🛹", + vpn: "Εντελώς προαιρετικό, αλλά σταθερό αν θέλεις επιπλέον ιδιωτικότητα 🛡️. Ένα VPN κρύβει τη **διεύθυνση IP** σου (κατά προσέγγιση τοποθεσία) από τους διακομιστές με τους οποίους μιλά το SkateSpots — πλακίδια χάρτη, relays κ.λπ. Διάλεξε έναν πάροχο χωρίς logs που εμπιστεύεσαι (π.χ. Mullvad)· απόφυγε ύποπτους δωρεάν.\n\nΠροσοχή: ένα VPN **δεν** κρύβει τα spot που δημοσιεύεις (αυτά είναι δημόσια), και μην ενεργοποιείς το GPS του περιηγητή αν προσπαθείς να μείνεις ανώνυμος. Πλήρεις λεπτομέρειες στη [σελίδα Απορρήτου](/privacy).", + tor: "Ο Tor Browser σου δίνει την ισχυρότερη ιδιωτικότητα IP — σε δρομολογεί μέσα από πολλά relays ώστε οι διακομιστές να μην βλέπουν την πραγματική σου IP 🧅. Το κόστος: είναι πιο αργός, και οι χάρτες + ορισμένα Nostr relays μπορεί να καθυστερούν ή να μπλοκάρουν τις εξόδους Tor. Ιδανικός για τους πιο προσεκτικούς.\n\nΘυμήσου: ο Tor κρύβει την IP σου, όχι τα spot που δημοσιεύεις, και μην ενεργοποιείς το GPS του περιηγητή αν στόχος είναι η ανωνυμία. Περισσότερα στη [σελίδα Απορρήτου](/privacy).", + hideMyIp: "Δύο δωρεάν επιλογές 🛡️: ένα **αξιόπιστο VPN** (εύκολο, γρήγορο — κρύβει την IP σου πίσω από τους διακομιστές του) ή ο **Tor Browser** (μέγιστη ιδιωτικότητα, πιο αργός). Οποιοδήποτε από τα δύο εμποδίζει τους διακομιστές με τους οποίους συνδέεται το SkateSpots να δουν την πραγματική σου IP. Σημείωση: δεν κρύβουν τα spot που δημοσιεύεις. Δες τη [σελίδα Απορρήτου](/privacy).", + isMyLocation: "Η τοποθεσία σου είναι ασφαλής 📍 — το «Κοντά μου» διαβάζει το GPS σου μόνο στη συσκευή σου, για να κεντράρει τον χάρτη και να ταξινομήσει τα κοντινά spot. Δεν δημοσιεύεται ποτέ στο Nostr, δεν αποστέλλεται ποτέ σε εμάς, δεν κοινοποιείται ποτέ. Μόνο τα spot που προσθέτεις σκόπιμα είναι δημόσια. Λεπτομέρειες στη [σελίδα Απορρήτου](/privacy).", + whatAreZaps: "Τα zap είναι άμεσα φιλοδωρήματα Bitcoin Lightning που στέλνονται μέσω Nostr! Κάνε κλικ στο ⚡ σε οποιοδήποτε περιεχόμενο, στείλε sats απευθείας στο πορτοφόλι του δημιουργού. Σαν να πατάς 'μου αρέσει' αλλά με πραγματικά χρήματα. Άμεσο, peer-to-peer, χωρίς μεσάζοντες. ⚡", + howToLogin: "Δύο τρόποι:\n1. **Επέκταση περιηγητή** (Desktop): Εγκατέστησε το Alby ή το nos2x και μετά κάνε κλικ στο 'Σύνδεση'\n2. **Νέος χρήστης**: Κάνε κλικ στο 'Εγγραφή' για να δημιουργήσεις κλειδιά. Κατέβασε το nsec σου (μυστικό κλειδί) και ΑΠΟΘΗΚΕΥΣΕ ΤΟ — αυτός είναι ο λογαριασμός σου για πάντα!", + whatIsCashu: "Ενσωματωμένο πορτοφόλι Bitcoin! Διακριτικά Cashu ecash backed by Lightning — λειτουργεί εκτός σύνδεσης στα skate spot, με έμφαση στην ιδιωτικότητα (τα mint δεν μπορούν να παρακολουθήσουν πληρωμές). Πήγαινε στο Πορτοφόλι στις Ρυθμίσεις για να το χρησιμοποιήσεις. 🥜", + whatIsNwc: "Nostr Wallet Connect — σαν USB-C για πορτοφόλια Lightning. Σύνδεσε το Alby, Minibits, Zeus ή Coinos μία φορά, και κάνε zap με ένα κλικ για πάντα. Κρυπτογραφημένο, εσύ ελέγχεις τα όρια δαπανών. 🔌⚡", + isItFree: "100% δωρεάν. Χωρίς διαφημίσεις, χωρίς συνδρομές, χωρίς εταιρικές ανοησίες. Φτιαγμένο από skater για skater. Χρηματοδοτούμενο από την κοινότητα μέσω Angor — δες τη σελίδα Υποστηρικτών. Μπορείς επίσης να κερδίσεις Bitcoin μέσω zap της κοινότητας για τη συνεισφορά ποιοτικών spot. 🛹", + whatCanIDo: "Ανακάλυψε spot παγκοσμίως στον χάρτη, προσέλαβε επαγγελματίες στο The Lab (προπονητές, filmers, φωτογράφους, editors, κατασκευαστές ραμπών), κάνε skate με ένα crew, συμμετέχε σε εκδηλώσεις, κάνε περιηγήσεις, αγόρασε/πούλησε εξοπλισμό, παρακολούθησε το ιδιωτικό σου Stash, στείλε zap σε δημιουργούς, έλεγξε τον καιρό των spot και χτίσε την αποκεντρωμένη κοινότητα skate!", + whatIsTheLab: "Το The Lab είναι όπου προσλαμβάνεις επαγγελματίες της σκηνής skate: Προπονητές, Filmers, Φωτογράφους, Video Editors και Builders ραμπών/park/DIY. Ο καθένας μπορεί να είναι μεμονωμένο άτομο ή συλλογικότητα (crew/studio) — τα μέλη επιβεβαιώνουν με τα δικά τους κλειδιά, οπότε είναι γνήσιο. Όλα στο Nostr, χωρίς ψεύτικους λογαριασμούς. 🎓", + whatIsACrew: "Τα crew είναι η οικογένειά σου στο skate, αγκυρωμένη στον χάρτη — με ποιους κάνεις skate ΜΑΖΙ, όχι ποιους προσλαμβάνεις. Κάθε crew έχει δική του περιοχή στον χάρτη (teal πινέζες), home spot, μέλη, ατμόσφαιρα και μανιφέστο. Τα μέλη επιβεβαιώνουν από το δικό τους κλειδί. Δημιούργησε ένα στα Crews → 'Δημιουργία Crew'. 🤘", + whatAreCrews: "Τα crew είναι η οικογένειά σου στο skate, αγκυρωμένη στον χάρτη — με ποιους κάνεις skate ΜΑΖΙ, όχι ποιους προσλαμβάνεις. Κάθε crew έχει δική του περιοχή στον χάρτη (teal πινέζες), home spot, μέλη και μανιφέστο. Τα μέλη επιβεβαιώνουν από το δικό τους κλειδί. Πήγαινε στην καρτέλα Crews για να ξεκινήσεις ή να μπεις σε ένα! 🤘", + howToStartACrew: "Πήγαινε στην καρτέλα Crews → 'Δημιουργία Crew'. Ονόμασέ το, βάλε την περιοχή σου στον χάρτη, πρόσθεσε ατμόσφαιρα (ή το δικό σου custom #hashtag), σύνδεσε τα home spot σου και πρόσθεσε μέλη με npub. Κάθε μέλος επιβεβαιώνει από το δικό του κλειδί ώστε το ρόστερ να είναι γνήσιο. 🤘", + whatIsMyStash: "Το Stash μου είναι το ΙΔΙΩΤΙΚΟ, κρυπτογραφημένο ντουλάπι εξοπλισμού σου (κρυπτογράφηση NIP-44). Παρακολούθησε τα deck, trucks, wheels, παπούτσια σου — με τοποθεσία αποθήκευσης, κατάσταση, σπανιότητα και τιμή. Μόνο ΕΣΥ μπορείς να το διαβάσεις εκτός αν επισημάνεις αντικείμενα ως δημόσια. Ιδανικό για ασφάλιση ή σχεδιασμό swap. 🎒", + whatIsStash: "Το Stash μου είναι το ΙΔΙΩΤΙΚΟ, κρυπτογραφημένο απόθεμα εξοπλισμού σου. Κατέγραψε ό,τι κατέχεις — κατάσταση, πού αποθηκεύεται, αξία — όλα κρυπτογραφημένα ώστε μόνο εσύ να τα βλέπεις. Σημείωσε αντικείμενα ως δημόσια αν θέλεις να τα πουλήσεις ή να τα επιδείξεις. 🎒", + whatIsABuilder: "Οι Builders είναι crew ραμπών/park/DIY στο The Lab που μπορείς να προσλάβεις για να φτιάξουν transitions, bowls, rails ή ένα ολόκληρο park. Καταχωρίζουν τι φτιάχνουν, υλικά, κλίμακα έργου και μπορεί να είναι αδειοδοτημένοι/ασφαλισμένοι. Συχνά συλλογικότητες — και μπορούν να συνδέσουν τα spot που έχτισαν με τον χάρτη. 🏗️", + whatIsANutzap: "Τα Nutzaps (NIP-61) είναι φιλοδωρήματα ecash που στέλνονται μέσω Nostr — ιδιωτικά διακριτικά Cashu zapped απευθείας σε κάποιον. Μπορείς να ρυθμίσεις τη ΛΗΨΗ nutzap στο Πορτοφόλι. (Η αποστολή πλήρων nutzaps κυκλοφορεί σταδιακά — προς το παρόν χρησιμοποίησε Lightning zaps.) 🥜⚡", + whatIsClink: "Το CLINK είναι ένας κωδικός πληρωμής Nostr-native (ένα 'noffer'). Καταστήματα, crews και επαγγελματίες του Lab μπορούν να προσθέσουν έναν ώστε να τους πληρώνεις χωρίς να χρειάζεσαι διεύθυνση Lightning — θα δεις ένα κουμπί 'Πληρωμή μέσω CLINK' με QR. Σάρωσέ το με ένα πορτοφόλι CLINK όπως το ShockWallet. 🔗⚡ [specs](https://clinkme.dev/specs.html) [apps](https://clinkme.dev/apps.html)", + whatIsNoffer: "Ένα noffer είναι ένας κωδικός πληρωμής CLINK — ένας επαναχρησιμοποιήσιμος, Nostr-native τρόπος να πληρώνεσαι χωρίς διακομιστή ή διεύθυνση Lightning. Πρόσθεσε τον δικό σου στο προφίλ του καταστήματος/crew/Lab και οι άνθρωποι μπορούν να σε πληρώσουν απευθείας. 🔗", + whatAreTours: "Τα tours είναι καθοδηγούμενα ταξίδια skate — τοπικές συνεδρίες, εθνικά road trips ή περιηγήσεις παγκόσμιας καταστροφής. Βρες τα στον χάρτη ή στην ενότητα Tours, συναντήσου και κάνε skate σε νέο έδαφος με ντόπιους. 🗺️🛹", + whatIsAShop: "Τα Skate Shops είναι τοπικά καταστήματα καταχωρημένα στον χάρτη. Ανακάλυψε και υποστήριξε πραγματικά φυσικά (ή διαδικτυακά) skate shop στην περιοχή σου — μερικά δέχονται ακόμη και Bitcoin. 🏪", + howToSellGear: "Πήγαινε στο Gear Swap / Marketplace και δημιούργησε μια καταχώριση (NIP-99). Πρόσθεσε φωτογραφίες, τιμή σε sats, κατάσταση και προαιρετικά καρφίτσωσέ την σε ένα spot ώστε να εμφανίζεται στον χάρτη. Οι αγοραστές σου στέλνουν zap ή μήνυμα απευθείας. 🛹💸", + supporters: "Το SkateSpots χρηματοδοτείται από την κοινότητα μέσω Angor (αποκεντρωμένη χρηματοδότηση Bitcoin) — χωρίς διαφημίσεις, χωρίς επενδυτές, χωρίς πώληση δεδομένων. Δες τη σελίδα Υποστηρικτών για να στηρίξεις το έργο και να κρατήσεις τους δρόμους ελεύθερους. ❤️⚡", + trustScore: "Οι βαθμολογίες εμπιστοσύνης (0-100) τροφοδοτούνται από το Relatr. Αναλύει το δίκτυό σου Nostr: followers, δραστηριότητα, αλληλεπίδραση, zaps. Υψηλότερη = πιο έμπιστος. Βοηθά στο φιλτράρισμα bots και spam. Έλεγξε οποιοδήποτε προφίλ για να δεις τη βαθμολογία του. 🛡️", + whatRelay: "Το SkateSpots χρησιμοποιεί: 🛹 goskatespots.nostr1.com (κύριο, allowlisted για ποιότητα) + relay.ditto.pub (παγκόσμιο) + purplepag.es (aggregator προφίλ). Τα δεδομένα σου αναπαράγονται σε όλα για πλεονασμό.", + tripPlanner: "Πες μου μια πόλη και θα φτιάξω ένα ταξίδι skate μέρα-μέρα 🗺️ — spot, εκδηλώσεις, προπονητές και τοπικά crews, με επίγνωση του καιρού (βροχερή μέρα = tip crew για καλυμμένα spot). Δοκίμασε 'σχεδίασέ μου 3 ημέρες στη Λισαβόνα'. Μπορώ να τα αποθηκεύσω όλα σε μια Συλλογή και να σε παραπέμψω σε πτήσεις/διαμονή στους πραγματικούς ιστότοπους (χωρίς KYC, χωρίς μεσάζοντα). 🛹", + planATrip: "Απλώς πες 'σχεδίασέ μου 3 ημέρες στη Βαρκελώνη' (ή οποιαδήποτε πόλη) και θα χαρτογραφήσω spot, συνεδρίες, προπονητές και τοπικά crews για κάθε μέρα. Αποθήκευσέ το ως Συλλογή και πάμε για skate. 🗺️🛹", + sasquatchPro: "**Sasquatch Pro** 🦧⚡ είναι ένα πάσο υποστηρικτή Lightning που ξεκλειδώνει την προσωπική πλευρά μου:\n\n• 🧠 **Προσωπικός βοηθός** — διαβάζω το Stash, τα crews, τα spot & τις καταχωρίσεις σου\n• ✨ **Πρόχειρες ενέργειες** — καταχώρισε εξοπλισμό, δημοσίευσε την κατάσταση skate σου, σχεδίασε ταξίδια (πάντα εσύ επιβεβαιώνεις πριν δημοσιευτεί κάτι)\n• 💬 **Προσωπικό πλαίσιο** — οι απαντήσεις μου χρησιμοποιούν τα δικά σου δεδομένα, όχι μόνο δημόσια αποτελέσματα\n• ⚡ **Υποστήριξε το έργο** — κρατάς το SkateSpots δωρεάν και χωρίς διαφημίσεις\n\nΤο δωρεάν Sasquatch παραμένει δωρεάν: δημόσια αναζήτηση spot/εκδήλωσης/προπονητή/crew, το γλωσσάρι & ο σχεδιασμός ταξιδιού λειτουργούν χωρίς Pro. Το Pro προσθέτει απλώς τα *προσωπικά* πράγματα. Πάτησε **⚡ Go Pro** πάνω. Πακέτα: 7 ημέρες ~2k sats, 1 μήνας ~5k, 3 μήνες ~12k, 1 χρόνος ~36k.", + proPerks: "Προνόμια Pro 🦧⚡: προσωπικός βοηθός (διαβάζει το Stash/crews/spot/καταχωρίσεις σου), πρόχειρες ενέργειες (καταχώριση εξοπλισμού, δημοσίευση κατάστασης, σχεδιασμός ταξιδιών — εσύ επιβεβαιώνεις) και απαντήσεις που χρησιμοποιούν το προσωπικό σου πλαίσιο. Επιπλέον υποστηρίζεις άμεσα το SkateSpots και το κρατάς δωρεάν + χωρίς διαφημίσεις. Το δωρεάν παραμένει δωρεάν — το Pro προσθέτει το προσωπικό επίπεδο. Πάτησε **⚡ Go Pro** πάνω.", + proVersion: "Η έκδοση Pro του εαυτού μου 🦧⚡ προσθέτει έναν **προσωπικό βοηθό**: μπορώ να διαβάζω το Stash, τα crews, τα spot & τις καταχωρίσεις σου, να συντάσσω ενέργειες για σένα (καταχώριση εξοπλισμού, δημοσίευση κατάστασης, σχεδιασμό ταξιδιού — πάντα εσύ επιβεβαιώνεις πρώτα) και να χρησιμοποιώ το προσωπικό σου πλαίσιο στις απαντήσεις μου. Υποστηρίζει επίσης άμεσα το έργο. Το δωρεάν Sasquatch (αναζήτηση spot/εκδήλωσης/προπονητή/crew, γλωσσάρι, σχεδιαστής ταξιδιού) παραμένει δωρεάν. Πάτησε **⚡ Go Pro** πάνω.", + perks: "Προνόμια Pro 🦧⚡: προσωπικός βοηθός (το Stash/crews/spot/καταχωρίσεις σου), πρόχειρες ενέργειες που επιβεβαιώνεις, και απαντήσεις που χρησιμοποιούν το δικό σου πλαίσιο — επιπλέον κρατάς την εφαρμογή δωρεάν & χωρίς διαφημίσεις. Πάτησε **⚡ Go Pro** πάνω.", + goPro: "Πάτησε το κουμπί **⚡ Go Pro** πάνω για να ανοίξεις το φύλλο αναβάθμισης. Το Pro ξεκλειδώνει τον προσωπικό μου βοηθό (Stash/crews/spot/καταχωρίσεις) και τις πρόχειρες ενέργειες, και υποστηρίζει άμεσα το έργο. Πλήρωσε με Lightning — 7 ημέρες ~2k sats έως 1 χρόνο ~36k sats. Τα δωρεάν χαρακτηριστικά παραμένουν δωρεάν. 🦧", + proPricing: "Πακέτα Pro (πληρωμή με Lightning ⚡): **7 ημέρες** ~2.000 sats (~$1.20), **1 μήνας** ~5.000 sats (~$3), **3 μήνες** ~12.000 sats (~$7, 20% έκπτωση), **1 χρόνος** ~36.000 sats (~$21, καλύτερη αξία). Πάτησε **⚡ Go Pro** πάνω.", + howMuchIsPro: "Πακέτα Pro: 7 ημέρες ~2.000 sats, 1 μήνας ~5.000 sats, 3 μήνες ~12.000 sats (20% έκπτωση), 1 χρόνος ~36.000 sats (καλύτερη αξία). Πλήρωσε με Lightning ⚡. Πάτησε **⚡ Go Pro** πάνω.", + upgrade: "Για να αναβαθμίσεις σε Sasquatch Pro, πάτησε το κουμπί **⚡ Go Pro** πάνω. Πλήρωσε με Lightning (7 ημέρες ~2k sats έως 1 χρόνο ~36k). Το Pro ξεκλειδώνει τον προσωπικό μου βοηθό και τις πρόχειρες ενέργειες, και υποστηρίζει άμεσα το έργο. 🦧⚡", + }, + statsTitle: "📊 **Το SkateSpots με αριθμούς**", + weatherTemp: "• {{temp}}°C (αίσθηση {{feels}}°C)", + weatherSkateability: "• Καταλληλότητα για skate: **{{label}}** ({{score}}/100)", + weatherError: "Δεν ήταν δυνατή η ανάγνωση του καιρού τώρα. Δοκίμασε ξανά σε λίγο. 🌧️", + labelSpots: "spot", + labelEvents: "εκδηλώσεις", + labelLabPros: "επαγγελματίες Lab", + labelCrews: "crews", + labelShops: "skate shops", + labelTours: "tours", + labelGear: "καταχωρίσεις εξοπλισμού", + unnamed: "Χωρίς όνομα", + emptyWhere: " στο **{{place}}**", + emptyResult: "Δεν βρήκα κανένα {{label}}{{where}} τώρα 🦧\n\nΑυτό μπορεί να σημαίνει ότι δεν έχει καταχωρηθεί ακόμη κανένα — ή ότι τα relays άργησαν να απαντήσουν. Δοκίμασε ξανά σε λίγο, έλεγξε την ορθογραφία ή [πρόσθεσε το πρώτο στον χάρτη](https://skate-spots.org/map). 🛹", + foundTitle: "{{emoji}} Βρήκα **{{count}}** {{label}}:\n{{lines}}{{more}}", + moreResults: "\n\n…και **{{count}}** ακόμη — [δές τα όλα στον χάρτη](https://skate-spots.org/map) 🗺️", + locationDenied: "Δεν μπορώ να δω την τοποθεσία σου — τίποτα δεν φεύγει ποτέ από τη συσκευή σου; τη διαβάζω τοπικά μόνο όταν μου το ζητήσεις, και ο περιηγητής μόλις αρνήθηκε. Πάτησε 🎯 **Κοντά μου** στον χάρτη ή πες μου μια πόλη: \"spot στη Μπανγκόκ\". 🛹", + noNearbySpots: "Δεν υπάρχουν ακόμη καταχωρημένα spot κοντά σου 🦧 — [γίνε ο πρώτος που θα βάλει ένα](https://skate-spots.org/create-spot). 🛹", + closestTitle: "Πιο κοντινά σε σένα τώρα:", + closestFooter: "_Υπολογισμένο στη συσκευή σου — η τοποθεσία σου δεν την εγκατέλειψε ποτέ._", + proNudge: "Αυτό είναι δουλειά του **Sasquatch Pro** 🦧⚡ — με το Pro μπορώ να διαβάζω το Stash, τα crews, τα spot και τις καταχωρίσεις σου, να συντάσσω καταχωρίσεις εξοπλισμού, αγγελίες ζήτησης και καταστάσεις skate, και να σχεδιάζω τα ταξίδια σου. Είναι ένα πάσο υποστηρικτή Lightning που κρατά το SkateSpots δωρεάν & χωρίς διαφημίσεις. Πάτησε το κουμπί **⚡ Go Pro** πάνω για να το ξεκλειδώσεις. 🛹", + draftingProPerk: "Η σύνταξη ενεργειών (δημοσίευση κατάστασης, καταχώριση εξοπλισμού) είναι προνόμιο του **Sasquatch Pro** 🦧⚡ — πάτησε **⚡ Go Pro** πάνω για να το ξεκλειδώσεις.", + draftIntro: "Ορίστε ένα πρόχειρο — έλεγξέ το και πάτησε για δημοσίευση. Τίποτα δεν δημοσιεύεται μέχρι να επιβεβαιώσεις. 🛹", + draftFailed: "Δεν κατάφερα να χτίσω αυτό το πρόχειρο — δοκίμασε να μου πεις ξανά τις λεπτομέρειες (π.χ. \"καταχώρισε τα Spitfire wheels μου για 8000 sats\").", + tripAskCity: "Πού πάμε; Πες μου μια πόλη (π.χ. \"σχεδίασέ μου 3 ημέρες στη Λισαβόνα\") και θα φτιάξω ένα ταξίδι. 🗺️", + tripEmptyMap: "Δεν υπάρχει ακόμη τίποτα στον χάρτη για **{{destination}}** 🦧 — γίνε ο πρώτος που θα βάλει spot στο [skate-spots.org](https://skate-spots.org). Μόλις οι ντόπιοι προσθέσουν spot, crews & εκδηλώσεις, θα σου φτιάξω ένα πλήρες ταξίδι.", + tripLocked: "Κλείδωσα μια αποστολή για **{{destination}}** 🛹 — spot, συνεδρίες και ντόπιοι παρακάτω. Τροποποίησέ το ή αποθήκευσέ το.", + tripFailed: "Δεν ήταν δυνατή η πρόσβαση στα ζωντανά δεδομένα για να το σχεδιάσω τώρα. Δοκίμασε ξανά σε λίγο! 🛹", + tripEmptyMapLocal: "Δεν υπάρχει ακόμη τίποτα στον χάρτη για **{{destination}}** 🦧 — γίνε ο πρώτος στο [skate-spots.org](https://skate-spots.org).", + tripMissionLocal: "Ορίστε μια αποστολή για **{{destination}}** 🛹 — spot, συνεδρίες & ντόπιοι παρακάτω.", + relayFailed: "Τα relays δεν απάντησαν εγκαίρως τώρα 🛰️ — συνήθως είναι αργή σύνδεση, όχι χαμένο spot. Δοκίμασε ξανά σε λίγο. 🛹", + couldNotProcess: "Χμ, δεν μπόρεσα να το επεξεργαστώ. Δοκίμασε να το επαναδιατυπώσεις!", + freeTierFallback: "Αυτό χρειάζεται συλλογισμό AI — λειτουργία **Sasquatch Pro** ⚡🦧\n\nΜπορώ ακόμη να βρω **spot, εκδηλώσεις, προπονητές, crews, καταστήματα, tours και εξοπλισμό** απευθείας από τα relays — ρώτησέ με π.χ. \"spot στη Βαρκελώνη\" — και το [Γλωσσάρι](/glossary) καλύπτει 150+ tricks & όρους. Πάτησε **⚡ Go Pro** πάνω για να ξεκλειδώσεις τις απαντήσεις AI.", + aiDownFallback: "Ο AI εγκέφαλός μου παίρνει λίγο αέρα τώρα 🦧 — αλλά σε έχω ακόμη:\n\n• 🗺️ [Χάρτης](/) — spot, καταστήματα, εκδηλώσεις κοντά σου\n• 🧪 [The Lab](/lab) — προπονητές, filmers, editors\n• 📖 [Γλωσσάρι](/glossary) — 150+ tricks & όροι\n• 👥 [Crews](/crews) — βρες τους ανθρώπους σου\n\nΉ απλώς πες μου μια **πόλη** (\"spot στη Βαρκελώνη\") ή ένα **trick** (\"τι είναι nollie\") και θα απαντήσω αμέσως. 🛹", + wentWrong: "Κάτι πήγε στραβά από τη μεριά μου. Δοκίμασε ξανά σε λίγο! 🦧", + publishError: "Δεν ήταν δυνατή η δημοσίευση: {{error}}. Δοκίμασε ξανά σε λίγο.", + unknownError: "άγνωστο σφάλμα", + }, +}; + +export default elBatch2; diff --git a/src/i18n/el/batch3.ts b/src/i18n/el/batch3.ts new file mode 100644 index 0000000..4629f0b --- /dev/null +++ b/src/i18n/el/batch3.ts @@ -0,0 +1,4 @@ +/** el — batch 3. Filled by the translation pass; empty until then. */ +const elBatch3 = {}; + +export default elBatch3; diff --git a/src/i18n/el/batch4.ts b/src/i18n/el/batch4.ts new file mode 100644 index 0000000..d778fc3 --- /dev/null +++ b/src/i18n/el/batch4.ts @@ -0,0 +1,4 @@ +/** el — batch 4. Filled by the translation pass; empty until then. */ +const elBatch4 = {}; + +export default elBatch4; diff --git a/src/i18n/el/batch5.ts b/src/i18n/el/batch5.ts new file mode 100644 index 0000000..9083f26 --- /dev/null +++ b/src/i18n/el/batch5.ts @@ -0,0 +1,1597 @@ +/** el — batch 5. Greek (el-GR) translation pass. */ +const elBatch5 = { + labUi: { + activeCount: "{{count}} ενεργά", + addMusicProfile: "Προσθήκη προφίλ μουσικής", + all: "Όλα", + clearAll: "Καθαρισμός όλων", + collective: "Κολεκτίβα", + filters: "Φίλτρα", + following: "Ακολουθείς", + getRiderCard: "Απόκτησε Rider Card", + judgeEvents: "Αξιολόγηση εκδηλώσεων", + justASkater: "Απλώς ένας", + labForServices: "Το The Lab είναι για υπηρεσίες. Περιηγήσου και μπες σε όλη την κοινότητα των skaters", + loginToOffer: "Συνδέσου για να προσφέρεις υπηρεσίες", + newest: "Νεότερα", + noResults: "Δεν βρέθηκαν αποτελέσματα", + offer: "Προσφορά", + offerBuilding: "Προσφορά κατασκευών", + offerCoaching: "Προσφορά coaching", + offerCuts: "Προσφορά μοντάζ", + offerDesignArt: "Προσφορά σχεδίου / τέχνης", + offerEditing: "Προσφορά μοντάζ βίντεο", + offerFilming: "Προσφορά βιντεοσκόπησης", + offerGraffiti: "Προσφορά graffiti", + offerPhotography: "Προσφορά φωτογραφίας", + offerServices: "Προσφορά υπηρεσιών", + yourProfiles: "Τα προφίλ σου στο The Lab", + preview: { + button: "Προεπισκόπηση", + title: "Ζωντανή προεπισκόπηση", + desc: "Έτσι θα φαίνεται το προφίλ σου {{noun}} μόλις δημοσιευτεί.", + untitled: "Το όνομά σου", + noBio: "Δεν υπάρχει βιογραφικό ακόμη — πρόσθεσε μια γραμμή για το τι προσφέρεις.", + years: "{{count}} χρόνια εμπειρίας", + portfolio: "Portfolio", + note: "Μόνο προεπισκόπηση — τίποτα δεν έχει δημοσιευτεί ακόμη." + }, + draft: { + title: "Έχεις ένα μη αποθηκευμένο πρόχειρο", + body: "Συνέχισε από εκεί που έμεινες — τίποτα δεν δημοσιεύεται μέχρι να πατήσεις Δημοσίευση.", + resume: "Συνέχεια πρόχειρου", + discard: "Απόρριψη πρόχειρου" + }, + progress: { + title: "Πληρότητα προφίλ", + count: "{{done}} από {{total}} ολοκληρώθηκαν", + photo: "Φωτογραφία", + bio: "Bio", + skills: "Δεξιότητες", + rate: "Χρέωση", + location: "Τοποθεσία", + contact: "Επικοινωνία" + }, + wizard: { + identity: "Ταυτότητα", + offer: "Τι προσφέρεις", + rates: "Χρεώσεις", + contact: "Επικοινωνία", + media: "Πολυμέσα" + }, + offerTattoo: "Προσφορά tattoo", + offerTraining: "Προσφορά προπόνησης / φυσιοθεραπείας", + organizeEvents: "Οργάνωση εκδηλώσεων", + resultsMany: "{{count}} αποτελέσματα", + resultsOne: "{{count}} αποτέλεσμα", + searchCityPlaceholder: "Πόλη…", + searchNamePlaceholder: "Όνομα, bio…", + showResults: "Εμφάνιση αποτελεσμάτων", + showResultsActive: "Εμφάνιση αποτελεσμάτων · {{count}} ενεργά", + skaterWord: "skater", + sortBy: "Ταξινόμηση κατά", + theCrew: "Το Crew", + topRated: "Κορυφαία αξιολόγηση", + trusted: "Έμπιστα", + trustLevel: "Επίπεδο εμπιστοσύνης", + yearsExp: "{{count}} έτη εμπειρίας", + tabCoaches: "Coaches", + tabFilmers: "Filmers", + tabPhoto: "Φωτογραφία", + tabEditors: "Editors", + tabBuilders: "Builders", + tabArtists: "Καλλιτέχνες", + tabGraffiti: "Graffiti", + tabTattoo: "Tattoo", + tabTrainers: "Trainers", + tabMusic: "Μουσική", + tabJudges: "Κριτές", + tabOrganizers: "Διοργανωτές", + tabBarbers: "Κουρείς", + filterSkillsToLearn: "Δεξιότητες προς εκμάθηση", + filterContentType: "Τύπος περιεχομένου", + filterEquipmentStyle: "Εξοπλισμός & στυλ", + filterServices: "Υπηρεσίες", + filterCamera: "Κάμερα", + filterLenses: "Φακοί", + filterLighting: "Φωτισμός", + filterSupportRig: "Υποστήριξη & rig", + filterStyle: "Στυλ", + filterWhatTheyBuild: "Τι κατασκευάζουν", + filterMaterialsTrade: "Υλικά & τέχνη", + filterProjectScale: "Κλίμακα έργου", + filterWhatTheyMake: "Τι φτιάχνουν", + filterMedium: "Μέσο", + filterSoftwareTools: "Λογισμικό & εργαλεία", + filterWorkContext: "Πλαίσιο εργασίας", + filterMethod: "Μέθοδος", + filterFocus: "Εστίαση", + filterInjuriesTreated: "Τραυματισμοί που αντιμετωπίζονται", + filterCredentialsSetting: "Διαπιστεύσεις & χώρος", + filterGenre: "Είδος", + filterInstrumentsRole: "Όργανα & ρόλος", + filterEventFormats: "Μορφές εκδήλωσης", + filterSpecialty: "Ειδικότητα", + filterLevelCircuit: "Επίπεδο / Circuit", + filterEventTypes: "Τύποι εκδήλωσης", + filterWhatYouHandle: "Τι αναλαμβάνεις", + filterScale: "Κλίμακα", + filterWhatTheyOffer: "Τι προσφέρουν", + filterSignatureStyles: "Χαρακτηριστικά στυλ", + filterSetting: "Χώρος", + filterEditType: "Τύπος μοντάζ", + role: { + coach: "Coach", + filmer: "Filmer", + builder: "Builder", + editor: "Video Editor", + photographer: "Photographer", + skater: "Skater" + }, + empty: { + footer: "Έχεις απορίες; Δες τις Συχνές ερωτήσεις →", + loginSuffix: "για να δημιουργήσεις προφίλ.", + coachesTitle: "Δεν υπάρχουν Coaches ακόμη", + coachesBody: "Γίνε ο πρώτος που προσφέρει coaching skateboarding στην περιοχή σου.", + filmersTitle: "Δεν υπάρχουν Filmers ακόμη", + filmersBody: "Γίνε ο πρώτος που προσφέρει skate filming — clips, ολόκληρα parts, κάλυψη αγώνων και άλλα.", + photographersTitle: "Δεν υπάρχουν Photographers ακόμη", + photographersBody: "Γίνε ο πρώτος που προσφέρει skate φωτογραφία στην περιοχή σου — action shots, sequences, editorial και άλλα.", + editorsTitle: "Δεν υπάρχουν Video Editors ακόμη", + editorsBody: "Γίνε ο πρώτος που προσφέρει υπηρεσίες μοντάζ skate βίντεο.", + buildersTitle: "Δεν υπάρχουν Builders ακόμη", + buildersBody: "Γίνε ο πρώτος που καταχωρεί κατασκευή ramp, πάρκου ή DIY — μπετόν, ξύλο, ράγες και άλλα.", + artistsTitle: "Δεν υπάρχουν καλλιτέχνες ακόμη", + artistsBody: "Γίνε ο πρώτος που προσφέρει graphics σανίδας, λογότυπα, αφίσες και merch για τη σκηνή.", + graffitiTitle: "Δεν υπάρχουν καλλιτέχνες graffiti ακόμη", + graffitiBody: "Γίνε ο πρώτος που προσφέρει pieces, τοιχογραφίες και τέχνη skatepark στην περιοχή σου.", + tattooTitle: "Δεν υπάρχουν tattoo artists ακόμη", + tattooBody: "Γίνε ο πρώτος tattoo artist της skate κουλτούρας — flash, custom, fine line και άλλα.", + trainersTitle: "Δεν υπάρχουν trainers ακόμη", + trainersBody: "Γίνε ο πρώτος trainer ή φυσιοθεραπευτής που βοηθά skaters να γίνουν δυνατοί και υγιείς.", + musiciansTitle: "Δεν υπάρχουν μουσικοί ακόμη", + musiciansBody: "Skate και μουσική; Πρόσθεσε το συγκρότημα ή το σόλο project σου — είδη, όργανα και links.", + judgesTitle: "Δεν υπάρχουν κριτές ακόμη", + judgesBody: "Διοργανώνεις δίκαιους αγώνες; Καταχώρισου για να κρίνεις Game of S.K.A.T.E., best trick jams, αγώνες και τουρνέ.", + organizersTitle: "Δεν υπάρχουν διοργανωτές ακόμη", + organizersBody: "Διοργανώνεις jams, αγώνες, meetups ή demos; Καταχώρισου ώστε οι skaters να σε βρουν και να σε κλείσουν.", + barbersTitle: "Δεν υπάρχουν κουρείς ακόμη", + barbersBody: "Κουρεύεις skaters; Καταχώρισε την καρέκλα ή την κινητή υπηρεσία σου." + }, + become: { + addNip05: "Πρόσθεσε NIP-05 στις Ρυθμίσεις", + backToLab: "Πίσω στο The Lab", + bioWorkLabel: "Bio / Σχετικά με τη δουλειά σου", + checkContact: "Έλεγξε τα στοιχεία επικοινωνίας σου", + cityArea: "Πόλη / Περιοχή", + cityCountry: "Πόλη, Χώρα", + connectWallet: "Σύνδεση πορτοφολιού", + connectWalletNwc: "Σύνδεση πορτοφολιού με NWC", + contactInfo: "Στοιχεία επικοινωνίας", + contactInfoDesc: "Πώς μπορούν να σε προσεγγίσουν οι πελάτες (όλα προαιρετικά, αλλά συνιστώνται)", + coordinatesOptional: "Συντεταγμένες (προαιρετικό)", + email: "Email", + failedToPublish: "Η δημοσίευση απέτυχε", + fromNostrProfile: "Από το προφίλ σου στο Nostr", + geolocationUnsupported: "Η γεωτοποθεσία δεν υποστηρίζεται", + getting: "Λήψη…", + headline: "Επικεφαλίδα", + headlineHint: "Εμφανίζεται ως τίτλος στην κάρτα σου στο The Lab — π.χ. “{{example}}”. Προεπιλογή: το όνομά σου.", + imageUploaded: "Η εικόνα ανέβηκε", + instagram: "Instagram", + invalidEmail: "Εισάγετε μια έγκυρη διεύθυνση email.", + invalidPortfolio: "Εισάγετε ένα έγκυρο URL portfolio.", + invalidWebsite: "Εισάγετε ένα έγκυρο URL ιστοσελίδας.", + latitude: "Γεωγραφικό πλάτος", + learnHow: "Μάθε πώς", + locationError: "Σφάλμα τοποθεσίας", + locationFound: "Η τοποθεσία βρέθηκε", + loginRequired: "Απαιτείται σύνδεση", + loginRequiredDesc: "Πρέπει να συνδεθείς για να δημιουργήσεις προφίλ {{role}}.", + loginRequiredDescCraft: "Πρέπει να συνδεθείς για να δημιουργήσεις προφίλ {{noun}}.", + longitude: "Γεωγραφικό μήκος", + nip05Recommended: "Συνιστάται επαλήθευση NIP-05", + nip05RecommendedDesc: "Επαλήθευσε την ταυτότητά σου για να χτίσεις εμπιστοσύνη με τους πελάτες.", + noWallet: "Δεν έχει συνδεθεί πορτοφόλι", + otherSocial: "Άλλα social", + paymentSetup: "⚡ Απαιτείται ρύθμιση πληρωμών", + phoneNumber: "Αριθμός τηλεφώνου", + profilePhoto: "Φωτογραφία προφίλ", + profilePublished: "Το προφίλ σου δημοσιεύτηκε.", + publishing: "Δημοσίευση...", + socialMedia: "Social media", + tip: "💡 Συμβουλή: Τα περισσότερα πορτοφόλια Lightning υποστηρίζουν NWC (Alby, Minibits, Zeus, Coinos).", + tipWithTime: "💡 Συμβουλή: Τα περισσότερα πορτοφόλια Lightning υποστηρίζουν NWC (Alby, Minibits, Zeus, Coinos). Χρειάζονται 30 δευτερόλεπτα.", + upload: "Μεταφόρτωση", + uploadFailed: "Η μεταφόρτωση απέτυχε", + uploadImage: "Μεταφόρτωση εικόνας", + uploading: "Μεταφόρτωση…", + useCurrentLocation: "Χρήση τρέχουσας τοποθεσίας", + useMyLocation: "Χρήση της τοποθεσίας μου", + usingNwc: "Χρήση Nostr Wallet Connect", + usingWebln: "Χρήση επέκτασης WebLN", + walletConnected: "Το πορτοφόλι συνδέθηκε — έτοιμο για πληρωμές!", + website: "Ιστοσελίδα", + yearsExperience: "Χρόνια εμπειρίας" + }, + coachForm: { + anonymous: "Ανώνυμος Coach", + bioLabel: "Bio / Φιλοσοφία coaching", + bioPlaceholder: "Το υπόβαθρό σου, το στυλ διδασκαλίας...", + create: "ΔΗΜΙΟΥΡΓΙΑ ΠΡΟΦΙΛ COACH", + created: "Το προφίλ Coach δημιουργήθηκε!", + createPro: "ΔΗΜΙΟΥΡΓΙΑ PRO ΠΡΟΦΙΛ COACH", + dmNote: "💬 Οι μαθητές μπορούν να σου στείλουν μήνυμα απευθείας μέσω της κρυπτογραφημένης ανταλλαγής μηνυμάτων του SkateSpots", + heading: "Γίνε Coach", + headlineExample: "Skate Coach Berlin", + hourlyRate: "Ωριαία χρέωση", + identity: "Η ταυτότητα του Coach σου", + nip05Reason: "Πρόσθεσε ένα αναγνωριστικό NIP-05 για να επαληθεύσεις την ταυτότητά σου και να χτίσεις εμπιστοσύνη με τους μαθητές — τους δείχνει ότι είσαι νόμιμος coach.", + paymentDesc: "Για να λαμβάνεις πληρωμές μαθημάτων από μαθητές, χρειάζεται να συνδέσεις ένα πορτοφόλι Lightning. Οι μαθητές θα σου στέλνουν zap απευθείας για τα μαθήματα.", + profileDesc: "Πες στους μαθητές για την εμπειρία σου", + profileTitle: "Προφίλ Coach", + ratePlaceholder: "5000 sats/hr", + selectSkill: "Επίλεξε τουλάχιστον μία δεξιότητα.", + skillsLabel: "Δεξιότητες που διδάσκω * (επίλεξε τουλάχιστον μία)", + skillsRequired: "Απαιτούνται δεξιότητες", + formatsLabel: "Μορφές μαθήματος", + formatsHint: "Πώς παρέχεις το coaching.", + levelsLabel: "Επίπεδα που διδάσκεις", + agesLabel: "Ηλικιακές ομάδες", + credentialsLabel: "Διαπιστεύσεις & ασφάλεια", + credentialsHint: "Δηλωμένες από εσένα — το SkateSpots δεν τις επαληθεύει.", + languagesLabel: "Γλώσσες που μιλάς", + languagesHint: "Πρόσθεσε τις γλώσσες στις οποίες μπορείς να κάνεις coaching.", + languagePlaceholder: "π.χ. Ελληνικά, English", + availabilityLabel: "Διαθεσιμότητα", + bookingLabel: "Σύνδεσμος κράτησης", + bookingHint: "Προαιρετικό — μια σελίδα όπου οι μαθητές μπορούν να κλείσουν και να πληρώσουν.", + galleryLabel: "Φωτογραφίες portfolio", + galleryHint: "Δείξε πραγματικά μαθήματα, μαθητές και spots (έως 12).", + galleryAdd: "Προσθήκη φωτογραφιών portfolio", + galleryUploaded: "Ανέβηκαν {{count}} φωτογραφία(-ες)", + videoLabel: "Highlight reel", + videoHint: "Προαιρετικό — ένα βίντεο YouTube ή Instagram του coaching σου.", + formatOneOnOne: "1-on-1", + formatGroup: "Group", + formatCamp: "Camp", + formatVideo: "Video analysis", + formatContestPrep: "Contest prep", + formatParkLesson: "Park lesson", + formatAdaptive: "Adaptive", + formatGirls: "Girls session", + formatAfterSchool: "After school", + levelBeginner: "Beginner", + levelIntermediate: "Intermediate", + levelAdvanced: "Advanced", + levelCompetition: "Competition", + ageKids: "Παιδιά", + ageTeens: "Έφηβοι", + ageAdults: "Ενήλικες", + ageSeniors: "Ηλικιωμένοι", + certFirstAid: "Πρώτες βοήθειες", + certCpr: "CPR", + certSafeguarding: "Διασφάλιση ανηλίκων", + certBackgroundCheck: "Ποινικό μητρώο", + certInsured: "Ασφαλισμένος", + certFederation: "Coach εθνικής ομοσπονδίας", + certQualification: "Πιστοποίηση coaching", + certJudge: "Κριτής αγώνων", + certNoteLabel: "Άλλες διαπιστεύσεις (προαιρετικό)", + certNotePlaceholder: "π.χ. Skateboard GB Level 2, 8 χρόνια coaching…", + availWeekdays: "Καθημερινές", + availWeekends: "Σαββατοκύριακα", + availEvenings: "Βράδια", + availAfterSchool: "Μετά το σχολείο", + availHolidays: "Σχολικές διακοπές", + availSeasonal: "Εποχιακά", + sectionWhatYouCoach: "Τι κάνεις coaching", + sectionCredentials: "Διαπιστεύσεις & ασφάλεια", + sectionAvailability: "Διαθεσιμότητα & κρατήσεις", + sectionWhereYouCoach: "Πού κάνεις coaching", + sectionPortfolio: "Portfolio", + rateAmountLabel: "Χρέωση", + rateCurrencySats: "sats", + rateCurrencyUsd: "USD", + rateCurrencyEur: "EUR", + rateCurrencyGbp: "GBP", + perHour: "ανά ώρα", + perSession: "ανά μάθημα", + perHalfDay: "ανά μισή μέρα", + perDay: "ανά ημέρα", + perCamp: "ανά camp", + perProject: "ανά έργο", + perEvent: "ανά εκδήλωση", + perGig: "ανά gig", + perShoot: "ανά φωτογράφιση", + perPiece: "ανά piece", + perCut: "ανά μοντάζ", + perMonth: "ανά μήνα", + availByAppointment: "Με ραντεβού", + rateNotesLabel: "Σημειώσεις χρέωσης (προαιρετικό)", + rateNotesPlaceholder: "Κυμαινόμενη κλίμακα, πρώτο μάθημα δωρεάν, περιλαμβάνονται μετακινήσεις…", + sectionPayments: "Πληρωμές", + paymentMethodsHint: "Πώς μπορούν να σε πληρώσουν οι πελάτες. Είναι δήλωση — το SkateSpots δεν κρατά ποτέ χρήματα.", + payMethodCash: "Μετρητά επιτόπου", + payMethodLightning: "Lightning", + payMethodCashu: "Cashu", + payMethodBank: "Τραπεζική μεταφορά", + payMethodOther: "Άλλο", + payWhatYouCanLabel: "Κυμαινόμενη κλίμακα / πλήρωσε ό,τι μπορείς", + bookingFeeLabel: "Χρέωση κράτησης (προαιρετικό)", + bookingFeeHint: "Ένα μικρό ποσό που πληρώνεται απευθείας σε εσένα για επιβεβαίωση κράτησης. Το SkateSpots δεν το κρατά ούτε το επιστρέφει.", + paymentNoteLabel: "Σημείωση πληρωμής (προαιρετικό)", + paymentNotePlaceholder: "Πρώτο μάθημα δωρεάν, περιλαμβάνονται μετακινήσεις, πληρωμή μετά το μάθημα…", + spotsDesc: "Επίλεξε spots όπου προσφέρεις μαθήματα coaching", + spotsLabel: "Spots όπου κάνεις coaching", + tagline: "Μοιράσου τη γνώση σου για το skateboarding", + update: "ΕΝΗΜΕΡΩΣΗ ΠΡΟΦΙΛ COACH", + updated: "Το προφίλ Coach ενημερώθηκε!" + }, + filmerForm: { + anonymous: "Ανώνυμος Filmer", + bioPlaceholder: "Το υπόβαθρό σου, το στυλ, ο εξοπλισμός...", + camerasLabel: "Κάμερες & εξοπλισμός * (επίλεξε τουλάχιστον ένα)", + create: "ΔΗΜΙΟΥΡΓΙΑ ΠΡΟΦΙΛ FILMING", + created: "Το προφίλ filming δημιουργήθηκε!", + createPro: "ΔΗΜΙΟΥΡΓΙΑ PRO ΠΡΟΦΙΛ FILMING", + dmNote: "💬 Οι πελάτες μπορούν να σου στείλουν μήνυμα απευθείας μέσω της κρυπτογραφημένης ανταλλαγής μηνυμάτων του SkateSpots", + gearHelper: "Κατέγραψε τις ακριβείς κάμερες, φακούς και rigs — οι skaters νοιάζονται για τον εξοπλισμό.", + gearLabel: "Τι έχεις στην τσάντα (προαιρετικό)", + gearPlaceholder: "π.χ. Sony VX1000 + MK1 fisheye, Panasonic HVX200, DJI RS3 gimbal, GoPro Hero 12, Sennheiser mic...", + heading: "Γίνε Filmer", + headlineExample: "Skate Filmer Berlin", + identity: "Η ταυτότητα του Filmer σου", + nip05Reason: "Πρόσθεσε ένα αναγνωριστικό NIP-05 για να επαληθεύσεις την ταυτότητά σου και να χτίσεις εμπιστοσύνη με τους πελάτες — τους δείχνει ότι είσαι νόμιμος filmer.", + paymentDesc: "Για να λαμβάνεις πληρωμές από πελάτες για υπηρεσίες filming, χρειάζεται να συνδέσεις ένα πορτοφόλι Lightning. Οι πελάτες θα σου στέλνουν zap απευθείας για τη δουλειά σου.", + profileDesc: "Πες στους πελάτες για την εξειδίκευσή σου στο filming", + profileTitle: "Προφίλ Filming", + rate: "Χρέωση", + ratePlaceholder: "10000 sats/video", + reelLabel: "Reel / Portfolio", + selectService: "Επίλεξε τουλάχιστον μία υπηρεσία.", + selectSkill: "Επίλεξε τουλάχιστον μία δεξιότητα filming.", + servicesLabel: "Υπηρεσίες που προσφέρονται * (επίλεξε τουλάχιστον μία)", + servicesRequired: "Απαιτούνται υπηρεσίες", + skillsRequired: "Απαιτούνται δεξιότητες", + spotsDesc: "Επίλεξε spots όπου προσφέρεις υπηρεσίες filming", + spotsLabel: "Spots όπου κινηματογραφείς", + tagline: "Πρόσφερε το skate βίντεό σου — clips, lines, ολόκληρα parts & κάλυψη αγώνων", + update: "ΕΝΗΜΕΡΩΣΗ ΠΡΟΦΙΛ FILMING", + updated: "Το προφίλ filming ενημερώθηκε!" + }, + editorForm: { + anonymous: "Ανώνυμος Editor", + bioPlaceholder: "Το στυλ μοντάζ σου, το υπόβαθρο, αξιοσημείωτα projects…", + contactPortfolio: "Επικοινωνία & Portfolio", + create: "Δημοσίευση προφίλ Editor", + created: "Το προφίλ Editor δημιουργήθηκε!", + createPro: "Δημοσίευση Pro προφίλ Editor", + editTypes: "Τύποι μοντάζ που προσφέρονται * (επίλεξε τουλάχιστον έναν)", + hardware: "Hardware", + hardwarePlaceholder: "π.χ. MacBook Pro M3, Sony FX3", + heading: "Γίνε Video Editor", + headlineExample: "Skate Video Editor", + identity: "Η ταυτότητά σου", + locationOptional: "Τοποθεσία (προαιρετικό)", + loginDesc: "Συνδέσου για να δημιουργήσεις το προφίλ σου ως video editor.", + phoneTelegram: "Τηλέφωνο / Telegram", + portfolioPlaceholder: "Portfolio (Vimeo, YouTube…)", + profileDesc: "Πες στην κοινότητα για το στυλ και τις δεξιότητές σου στο μοντάζ", + profileTitle: "Προφίλ Editor", + published: "Το προφίλ σου δημοσιεύτηκε στο SkateSpots.", + rate: "Χρέωση / Τιμολόγηση", + ratePlaceholder: "π.χ. 50k sats/min, DM για προσφορά", + selectService: "Επίλεξε τουλάχιστον έναν τύπο μοντάζ.", + servicesRequired: "Απαιτούνται υπηρεσίες", + socialPlaceholder: "Instagram / Social handle", + software: "Λογισμικό", + softwareHardware: "Δεξιότητες λογισμικού & hardware", + softwarePlaceholder: "π.χ. DaVinci Resolve, Premiere", + tagline: "Πρόσφερε τις υπηρεσίες μοντάζ βίντεο στην κοινότητα του skate", + thumbnail: "Μικρογραφία προφίλ / showreel", + update: "Ενημέρωση προφίλ Editor", + updated: "Το προφίλ Editor ενημερώθηκε!", + walletConnected: "Το πορτοφόλι συνδέθηκε ✓", + walletDesc: "Λάμβανε πληρωμές Bitcoin ⚡ απευθείας από πελάτες για τη δουλειά μοντάζ σου.", + walletTitle: "⚡ Πορτοφόλι Lightning για πληρωμές", + yearsExperience: "Χρόνια εμπειρίας", + yearsPlaceholder: "π.χ. 5 χρόνια" + }, + photoForm: { + anonymous: "Ανώνυμος Photographer", + bioPlaceholder: "Το υπόβαθρό σου, το στυλ, τι σου αρέσει να φωτογραφίζεις...", + cameraLabel: "Σώματα κάμερας * (επίλεξε τουλάχιστον ένα)", + cameraRequired: "Απαιτείται κάμερα", + contactDesc: "Πώς μπορούν οι riders να δουν τη δουλειά σου και να σε προσεγγίσουν (όλα προαιρετικά, αλλά συνιστώνται)", + create: "ΔΗΜΙΟΥΡΓΙΑ ΠΡΟΦΙΛ ΦΩΤΟΓΡΑΦΙΑΣ", + created: "Το προφίλ φωτογραφίας δημιουργήθηκε!", + createPro: "ΔΗΜΙΟΥΡΓΙΑ PRO ΠΡΟΦΙΛ ΦΩΤΟΓΡΑΦΙΑΣ", + dmNote: "💬 Οι riders μπορούν να σου στείλουν μήνυμα απευθείας μέσω της κρυπτογραφημένης ανταλλαγής μηνυμάτων του SkateSpots", + gearHelper: "Κατέγραψε ακριβή σώματα, φακούς και φώτα — στους riders αρέσει να ξέρουν τον εξοπλισμό.", + gearPlaceholder: "π.χ. Canon R6 II, 8-15mm fisheye, 70-200mm f/2.8, 2× Godox AD200, remote triggers, Manfrotto tripod...", + heading: "Γίνε Photographer", + headlineExample: "Skate Photography", + identity: "Η ταυτότητα του Photographer σου", + lensesLabel: "Φακοί", + lightingLabel: "Εξοπλισμός φωτισμού", + nip05Reason: "Πρόσθεσε ένα αναγνωριστικό NIP-05 για να επαληθεύσεις την ταυτότητά σου και να χτίσεις εμπιστοσύνη με τους πελάτες.", + paymentDesc: "Για να πληρωθείς για φωτογραφίσεις, σύνδεσε ένα πορτοφόλι Lightning. Οι πελάτες σου στέλνουν zap απευθείας για τη δουλειά σου.", + portfolioLabel: "Portfolio / Instagram", + profileDesc: "Πες στους riders για το μάτι σου, τον εξοπλισμό και τις υπηρεσίες σου", + profileTitle: "Προφίλ φωτογραφίας", + ratePlaceholder: "20000 sats/shoot", + selectCamera: "Επίλεξε τουλάχιστον έναν τύπο κάμερας με τον οποίο φωτογραφίζεις.", + selectService: "Επίλεξε τουλάχιστον μία υπηρεσία που προσφέρεις.", + servicesLabel: "Υπηρεσίες που προσφέρονται * (επίλεξε τουλάχιστον μία)", + servicesRequired: "Απαιτούνται υπηρεσίες", + spotsDesc: "Επίλεξε spots όπου προσφέρεις φωτογράφιση", + spotsLabel: "Spots όπου φωτογραφίζεις", + styleLabel: "Στυλ φωτογράφισης", + supportLabel: "Υποστήριξη & rig", + tagline: "Απαθανάτισε τα μαθήματα — πρόσφερε τη skate φωτογραφία σου", + update: "ΕΝΗΜΕΡΩΣΗ ΠΡΟΦΙΛ ΦΩΤΟΓΡΑΦΙΑΣ", + updated: "Το προφίλ φωτογραφίας ενημερώθηκε!" + }, + builderForm: { + anonymous: "Ανώνυμος Builder", + bioLabel: "Bio / Σχετικά με τις κατασκευές σου", + bioPlaceholder: "Το crew σου, αξιοσημείωτες κατασκευές, πώς προσεγγίζεις ένα έργο...", + buildTypesLabel: "Τι κατασκευάζεις * (επίλεξε τουλάχιστον ένα)", + buildTypesRequired: "Απαιτούνται τύποι κατασκευής", + cityBase: "Πόλη / Βάση", + contactPortfolio: "Επικοινωνία & Portfolio", + contactPortfolioDesc: "Πώς μπορεί η σκηνή να δει τις κατασκευές σου και να σε προσεγγίσει (όλα προαιρετικά, αλλά συνιστώνται)", + create: "ΔΗΜΙΟΥΡΓΙΑ ΠΡΟΦΙΛ BUILDER", + created: "Το προφίλ Builder δημιουργήθηκε!", + createPro: "ΔΗΜΙΟΥΡΓΙΑ PRO ΠΡΟΦΙΛ BUILDER", + dmNote: "💬 Οι πελάτες μπορούν να σου στείλουν μήνυμα απευθείας μέσω της κρυπτογραφημένης ανταλλαγής μηνυμάτων του SkateSpots", + gearHelper: "Στα crews και τους πελάτες αρέσει να ξέρουν τον εξοπλισμό και τη διαδικασία σου.", + gearLabel: "Πώς δουλεύεις / Εξοπλισμός (προαιρετικό)", + gearPlaceholder: "π.χ. Πλήρες συνεργείο μπετόν, δικό μας mixer + shotcrete rig, κινητή συγκόλληση, αναλαμβάνουμε άδειες και αποστράγγιση...", + heading: "Γίνε Builder", + headlineExample: "Ramp & Park Builder", + identity: "Η ταυτότητα του Builder σου", + insured: "Αδειοδοτημένος / Ασφαλισμένος", + insuredHelper: "Σχετικό για δημόσια πάρκα & δημοτικά έργα", + logoPhoto: "Λογότυπο / Φωτογραφία", + materialsLabel: "Υλικά & δεξιότητες τέχνης", + nip05Reason: "Πρόσθεσε ένα αναγνωριστικό NIP-05 για να επαληθεύσεις την ταυτότητά σου και να χτίσεις εμπιστοσύνη με τους πελάτες.", + pastBuilds: "Προηγούμενες κατασκευές / Instagram", + paymentDesc: "Για να πληρωθείς για κατασκευές, σύνδεσε ένα πορτοφόλι Lightning. Οι πελάτες σου στέλνουν zap απευθείας για τη δουλειά σου.", + profileDesc: "Πες στη σκηνή τι κατασκευάζεις και πώς δουλεύεις", + profileTitle: "Προφίλ Builder", + rateLabel: "Χρέωση / Βάση προσφοράς", + ratePlaceholder: "ανά m² / ανά έργο", + scaleLabel: "Κλίμακα έργου", + selectBuild: "Επίλεξε τουλάχιστον ένα πράγμα που κατασκευάζεις.", + serviceArea: "Περιοχή εξυπηρέτησης", + serviceAreaPlaceholder: "π.χ. Καταλονία, μετακινούμαι σε όλη την ΕΕ", + spotsDesc: "Σύνδεσε spots και πάρκα που έχτισες ώστε να δουν τη δουλειά σου στον χάρτη", + spotsLabel: "Spots που έχτισες", + tagline: "Ρίξε μπετόν, κόλλησε, χτίσε — καταχώρισε τις κατασκευές ramp & πάρκων σου", + update: "ΕΝΗΜΕΡΩΣΗ ΠΡΟΦΙΛ BUILDER", + updated: "Το προφίλ Builder ενημερώθηκε!", + yearsBuilding: "Χρόνια κατασκευών" + }, + skaterForm: { + backToSkaters: "Πίσω στους Skaters", + bioHelperPulled: "Τραβηγμένο από το προφίλ σου — προσάρμοσέ το για την κάρτα skater σου, ή άφησέ το ως έχει.", + bioHelperShort: "Μια σύντομη εισαγωγή για την κάρτα skater σου.", + bioPlaceholder: "Πόσο καιρό skate-άρεις, τι σου αρέσει, με τι ασχολείσαι…", + browseSpots: "Περιήγηση spots", + changePhoto: "Αλλαγή φωτογραφίας προφίλ", + chipBio: "Bio", + chipPhoto: "Φωτογραφία", + cityArea: "Πόλη / περιοχή", + created: "Είσαι στον χάρτη! 🛹", + custom: "Custom", + customHelper: "Η δική σου ετικέτα — εμφανίζεται στην κάρτα skater σου αντί για προεπιλογή.", + customPlaceholder: "π.χ. OG, Weekend Warrior, Retired…", + discoverable: "Άλλοι skaters μπορούν τώρα να σε ανακαλύψουν.", + editFullProfile: "επεξεργασία ολόκληρου του προφίλ σου", + fromProfile: "Από το προφίλ σου", + heroEditPrefix: "Επεξεργάσου τον", + heroJoinPrefix: "Μπες στον", + heroSuffix: "Κατάλογο", + homeHelper: "Πληκτρολόγησέ το ελεύθερα, ή σύνδεσε ένα πραγματικό spot από τον χάρτη ώστε να πάνε εκεί.", + homePlaceholder: "Τοπικό πάρκο / πλατεία — ή πάτησε “Περιήγηση spots”", + homeSpot: "Home spot", + layerEnd: "για να τα αλλάξεις παντού.", + layerIntro: "Αυτό είναι το", + layerMid: ", χτισμένο πάνω στο προφίλ σου στο Nostr. Το όνομα, η φωτογραφία, το bio, το lightning & η επαλήθευση προέρχονται από εκεί —", + layerWord: "skate layer", + level: "Επίπεδο", + linked: "Συνδεδεμένο με spot στον χάρτη", + loadingProfile: "Φόρτωση του προφίλ σου…", + loadingSpots: "Φόρτωση spots…", + locationHelper: "Βοηθά άλλους να βρουν skaters κοντά τους. Κοινοποιείται μόνο μια χονδρική περιοχή.", + loginToJoin: "Συνδέσου για να μπεις", + loginToJoinDesc: "Δημιούργησε το προφίλ skater σου ώστε να σε βρει η κοινότητα.", + mappedSpot: "Spot στον χάρτη", + noSpots: "Δεν βρέθηκαν spots ακόμη.", + noSpotsMatch: "Κανένα spot δεν ταιριάζει με την αναζήτησή σου.", + openMap: "Άνοιγμα χάρτη", + pickEverything: "Επίλεξε ό,τι ταιριάζει στο στυλ σου.", + pickHomeSpot: "Επίλεξε το home spot σου", + pickStyles: "Επίλεξε τα στυλ σου", + pickStylesDesc: "Επίλεξε τουλάχιστον ένα πράγμα που skate-άρεις.", + profilePic: "Φωτογραφία προφίλ", + profilePicHelper: "Η κάρτα skater σου χρησιμοποιεί τη φωτογραφία του προφίλ σου στο Nostr — ίδια εικόνα παντού.", + publishingAs: "Δημοσίευση ως", + putOnMap: "Βάλε με στον χάρτη", + searchSpots: "Αναζήτηση spots με όνομα ή πόλη…", + skateStory: "Η skate ιστορία σου", + stance: "Stance", + unlinkSpot: "Αποσύνδεση spot", + updateButton: "Ενημέρωση προφίλ", + updated: "Το προφίλ ενημερώθηκε!", + whatYouSkate: "Τι skate-άρεις *", + yearsPlaceholder: "π.χ. 8", + yearsSkating: "Χρόνια skating", + yourProfilePic: "Η φωτογραφία προφίλ σου", + zapsOn: "Zaps ενεργά" + }, + skaters: { + clearSearch: "Καθαρισμός αναζήτησης", + community: "Η κοινότητα", + countMany: "skaters", + countOne: "skater", + editProfile: "Επεξεργασία του προφίλ skater μου", + heroDesc: "Βρες τους δικούς σου ανθρώπους. Περιηγήσου στο crew των skaters που εκπροσωπούν το SkateSpots — κατά στυλ, stance, επίπεδο και πόλη.", + nip05Verified: "Επαληθευμένο NIP-05", + noMatches: "Κανένα ταίριασμα", + noneDesc: "Γίνε ο πρώτος που μπαίνει στον κατάλογο και βάζει το SkateSpots στον χάρτη.", + noneTitle: "Δεν υπάρχουν skaters ακόμη", + noVerifiedMatch: "Κανένας επαληθευμένος skater δεν ταιριάζει", + searchPlaceholder: "Αναζήτηση με όνομα, πόλη ή npub…", + tryDifferentSearch: "Δοκίμασε διαφορετική αναζήτηση ή καθάρισε τα φίλτρα σου.", + tryTurnOffVerified: "Δοκίμασε να απενεργοποιήσεις το φίλτρο “Επαληθευμένα” για να δεις όλους.", + verifiedFilterTitle: "Εμφάνιση μόνο skaters με επαληθευμένη ταυτότητα NIP-05" + }, + skaterCard: { + inDirectory: "Είσαι στον Κατάλογο Skaters", + joinDesc: "Πρόσθεσε το stance, τα στυλ & το επίπεδό σου ώστε να σε βρουν οι skaters.", + joinTitle: "Μπες στον Κατάλογο Skaters" + }, + crewsStrip: { + allCrews: "Όλα τα crews", + memberMany: "{{count}} μέλη", + memberOne: "{{count}} μέλος", + title: "Crews σε αυτή τη σκηνή" + }, + labLink: { + coach: "Coach", + filmer: "Filmer", + editor: "Editor", + photographer: "Photographer", + builder: "Builder", + artist: "Καλλιτέχνης", + graffiti: "Graffiti", + tattoo: "Tattoo", + trainer: "Trainer", + musician: "Μουσικός", + judge: "Κριτής", + barber: "Κουρέας", + organizer: "Διοργανωτής", + lab: "Lab", + linkedProfiles: "Συνδεδεμένα προφίλ Lab", + desc: "Διοργανώνεις κι εσύ studio, coaching ή υπηρεσία κατασκευών; Σύνδεσε τις καταχωρίσεις σου στο Lab ώστε να μπορούν να προσλάβουν το crew σου. Προαιρετικό. Όταν το προφίλ Lab συνδέεται επίσης πίσω σε αυτό το crew, και τα δύο εμφανίζουν ένα πράσινο", + descEnd: "σήμα.", + empty: "Δεν έχεις ακόμη προφίλ Lab. Δημιούργησε ένα στο The Lab για να το συνδέσεις εδώ." + }, + proUpgrade: { + goPro: "Γίνε Pro", + optional: "· προαιρετικό", + freeTo: "Δωρεάν καταχώριση. Το Pro προσθέτει ένα", + proBadge: "σήμα Pro", + featuredPlacement: "featured τοποθέτηση", + atTop: "στην κορυφή του The Lab.", + active: "Ενεργό", + benefit1: "Χρυσό σήμα \"Pro\" στο προφίλ & τις κάρτες σου", + benefit2: "Πρώτο σε προβολή όταν οι skaters περιηγούνται στο The Lab", + benefit3: "Υποστηρίζει το SkateSpots — χωρίς διαφημίσεις, χωρίς μεσάζοντες", + platformOwner: "Ιδιοκτήτης πλατφόρμας — το Pro είναι πάντα ενεργό.", + proActiveOne: "Pro ενεργό · απομένει {{count}} ημέρα. Το προφίλ σου θα προβάλλεται.", + proActiveMany: "Pro ενεργό · απομένουν {{count}} ημέρες. Το προφίλ σου θα προβάλλεται.", + context: "Το προφίλ σου παραμένει ζωντανό δωρεάν αφού λήξει το Pro — απλώς χάνεις το σήμα & την ώθηση." + }, + profilePreview: { + viewPublic: "Προβολή δημόσιου", + unnamed: "Ανώνυμος skater", + noHandle: "Δεν υπάρχει handle ακόμη" + }, + pyramid: { + pyramidWord: "PYRAMID", + rankingsWord: "RANKINGS", + subtitle: "Κορυφαίοι συνεισφέροντες στην πόλη σου", + yourRank: "Η κατάταξή σου", + keepContributing: "Συνέχισε να συνεισφέρεις για να ανέβεις ψηλότερα!", + topContributors: "Κορυφαίοι συνεισφέροντες", + noContributors: "Δεν υπάρχουν συνεισφέροντες ακόμη. Γίνε ο πρώτος που προσθέτει spot ή δημιουργεί εκδήλωση!", + spots: "Spots", + events: "Εκδηλώσεις", + total: "Σύνολο", + trust: "Εμπιστοσύνη" + }, + detail: { + joined: "Εγγράφηκε", + about: "Σχετικά", + howWeWork: "Πώς δουλεύουμε", + inTheBag: "Στην τσάντα", + hardware: "Hardware", + software: "Λογισμικό", + eventsJudged: "Εκδηλώσεις που αξιολογήθηκαν", + eventsOrganized: "Εκδηλώσεις που διοργανώθηκαν", + spots: "Spots", + viewSpot: "Προβολή spot", + credentialsTitle: "Διαπιστεύσεις & ασφάλεια", + selfAttested: "Δηλωμένα από τον coach — δεν επαληθεύονται από το SkateSpots.", + formats: "Μορφές", + levels: "Επίπεδα", + ages: "Ηλικίες", + languages: "Γλώσσες", + availability: "Διαθεσιμότητα", + bookSession: "Κλείσε μάθημα", + portfolio: "Portfolio", + watchReel: "Παρακολούθηση στο {{platform}}", + paymentsTitle: "Πληρωμές", + payWhatYouCan: "Πλήρωσε ό,τι μπορείς", + bookingFee: "Χρέωση κράτησης", + payBookingFee: "Πληρωμή χρέωσης κράτησης", + bookingFeeNote: "Πληρώνεται απευθείας στον coach. Το SkateSpots δεν το κρατά ούτε το επιστρέφει.", + bookingFeeNoRail: "Αυτός ο coach δεν έχει ορίσει διεύθυνση Lightning, οπότε η εντός εφαρμογής πληρωμή δεν είναι διαθέσιμη — επικοινώνησε μαζί του για να κανονίσετε την πληρωμή.", + serviceArea: "Περιοχή εξυπηρέτησης", + licensedInsured: "Αδειοδοτημένος / Ασφαλισμένος", + studio: "Studio", + shopStudio: "Κατάστημα / Studio", + booksOpen: "Ανοιχτές κρατήσεις", + credentials: "Διαπιστεύσεις", + remoteOnline: "Διαθέσιμο εξ αποστάσεως / online", + graffitiCrew: "Crew graffiti", + act: "Act", + listen: "Άκου", + upcomingGigs: "Επερχόμενες συναυλίες", + past: "Παρελθόν", + experience: "Εμπειρία", + yearsCount: "{{count}} χρόνια", + rate: "Χρέωση", + contact: "Επικοινωνία", + sendMessage: "Αποστολή μηνύματος", + bookGig: "Κλείσιμο για συναυλία", + portfolioDomain: "Portfolio · {{domain}}", + manage: "Διαχείριση", + admin: "Διαχειριστής", + editProfile: "Επεξεργασία προφίλ", + publishedTitle: "Είσαι live", + publishedBody: "Το προφίλ σου δημοσιεύτηκε στο The Lab. Μοιράσου το ώστε να σε βρουν οι skaters.", + manageRemove: "Αφαίρεση του προφίλ {{noun}} από το The Lab.", + adminTakeDown: "Κατέβασε αυτό το προφίλ {{noun}}. Θα κρυφτεί σε όλο το SkateSpots.", + entityLabel: "προφίλ {{noun}}", + deleteProfile: "Διαγραφή προφίλ", + location: "Τοποθεσία", + servicesSkills: "Υπηρεσίες & δεξιότητες", + noun: { + coach: "coach", + filmer: "filmer", + editor: "video editor", + photographer: "photographer", + builder: "builder", + artist: "καλλιτέχνη", + graffiti: "καλλιτέχνη graffiti", + tattoo: "tattoo artist", + trainer: "trainer", + musician: "μουσικού", + judge: "κριτή εκδηλώσεων", + organizer: "διοργανωτή εκδηλώσεων", + barber: "κουρέα", + profile: "προφίλ" + }, + skillsTitle: { + skills: "Δεξιότητες", + servicesGear: "Υπηρεσίες & εξοπλισμός", + whatWeBuild: "Τι κατασκευάζουμε", + whatTheyMake: "Τι φτιάχνουν", + stylesWork: "Στυλ & δουλειά", + styles: "Στυλ", + focusSpecialties: "Εστίαση & ειδικότητες", + genresInstruments: "Είδη & όργανα", + formatsSpecialties: "Μορφές & ειδικότητες", + servicesStyles: "Υπηρεσίες & στυλ", + eventTypesServices: "Τύποι εκδήλωσης & υπηρεσίες" + } + }, + rider: { + heroDesc: "Η επαληθεύσιμη ταυτότητα skater σου. Υπογεγραμμένη στο Nostr, έτοιμη για εκτύπωση, αδύνατο να πλαστογραφηθεί.", + heroDesc2: "Κέρδισε μαρτυρημένα σήματα δεξιοτήτων από άλλους skaters. Απόκτησε πάσα πρόσβασης σε πάρκα. Μοιράσου την κάρτα σου παντού.", + headerTagline: "Υπογεγραμμένη στο Nostr · Έτοιμη για εκτύπωση · Επαληθευμένη με QR", + tabCard: "Η κάρτα μου", + tabBadges: "Σήματα", + tabAward: "Απονομή", + rendering: "Απόδοση…", + shareCard: "Μοιρασιά κάρτας", + savePng: "Αποθήκευση PNG", + print: "Εκτύπωση", + copyId: "Αντιγραφή ID", + cardType: "Τύπος κάρτας", + licenseLabel: "Άδεια Skater", + licenseSub: "Η προσωπική ταυτότητα rider σου", + parkLabel: "Πρόσβαση πάρκου", + parkSub: "Έκδοση πασών ως ιδιοκτήτης πάρκου", + theme: "Θέμα", + holoTitle: "Ολογραφική λάμψη", + holoDesc: "Κινούμενο φαινόμενο foil", + cardDetails: "Στοιχεία κάρτας", + skateStyle: "Στυλ skating", + ridesFor: "Rides για", + ridesForPlaceholder: "Τοπικό κατάστημα…", + sponsors: "Χορηγοί", + sponsorsPlaceholder: "Μάρκες…", + showOnCard: "Εμφάνιση στην κάρτα", + zaps: "Zaps ⚡", + skills: "Δεξιότητες", + selected: "{{count}}/6 επιλεγμένα", + goldBadgesHint1: "Τα χρυσά σήματα στην κάρτα σου προέρχονται από άλλους skaters που σε μαρτύρησαν — δες", + goldBadgesHint2: ".", + parkOwnersOnly: "Μόνο για ιδιοκτήτες πάρκων.", + parkOwnersDesc: "Έκδωσε το χρησιμοποιώντας το ίδιο κλειδί Nostr που δημοσίευσε την καταχώριση του πάρκου σου. Ο καθένας μπορεί να σαρώσει το QR και να επαληθεύσει την υπογραφή — χωρίς κεντρική αρχή.", + parkDetails: "Στοιχεία πάρκου", + parkName: "Όνομα πάρκου", + parkNamePlaceholder: "The Berrics…", + riderName: "Όνομα rider", + riderNamePlaceholder: "Όνομα στην κάρτα", + riderNpub: "Nostr ID του rider (npub)", + accessLevel: "Επίπεδο πρόσβασης", + validThru: "Ισχύει έως", + publishToNostr: "Δημοσίευση στο Nostr", + badgesIntro: "Αυτά τα σήματα μαρτυρήθηκαν και υπογράφηκαν από άλλους skaters στο Nostr. Εμφανίζονται ως χρυσά τσιπ ⭐ στην κάρτα σου.", + earnMore: "Θέλεις να κερδίσεις κι άλλα; Skate-άρε μπροστά σε κάποιον και ζήτησέ του να μαρτυρήσει το trick σου.", + awardSomeone: "Απόνειμε ένα σήμα σε κάποιον άλλο", + youSawIt: "Το είδες να συμβαίνει", + youSawItDesc: "Υπόγραψε την απόδειξη στο Nostr. Γίνεται μέρος του μόνιμου αρχείου του — κρυπτογραφικά δεμένο με το κλειδί σου.", + skillsWitnessed: "Δεξιότητες που μαρτύρησες", + whereSeen: "Πού το είδες;", + optional: "(προαιρετικό)", + signingOnNostr: "Υπογραφή στο Nostr…", + awardBadge: "Απονομή σήματος", + addRiderSkill: "Πρόσθεσε npub rider + τουλάχιστον μία δεξιότητα", + invalidNpub: "Μη έγκυρο npub", + badgeAwarded: "🏅 Το σήμα απονεμήθηκε!", + badgeSent: "{{skills}} στάλθηκαν.", + failed: "Απέτυχε", + couldNotRender: "Δεν ήταν δυνατή η απόδοση της κάρτας", + popupBlocked: "Το αναδυόμενο παράθυρο αποκλείστηκε", + popupBlockedDesc: "Επίτρεψε τα αναδυόμενα παράθυρα για αυτόν τον ιστότοπο.", + linkCopied: "🔗 Ο σύνδεσμος αντιγράφηκε!", + enterRiderNpub: "Εισάγετε το npub του rider", + parkPublished: "✅ Η κάρτα πρόσβασης πάρκου δημοσιεύτηκε!", + publishFailed: "Η δημοσίευση απέτυχε", + noBadges: "Δεν υπάρχουν σήματα ακόμη. Skate-άρε μπροστά σε κάποιον και ζήτησέ του να μαρτυρήσει τα tricks σου!", + showMore: "Εμφάνιση {{count}} περισσότερων", + witnessedBy: "Μαρτυρήθηκε από", + at: "στο", + previewLicense: "Άδεια Skater", + previewSince: "Από το {{year}}", + previewEvts: "Γεγον.", + previewScan: "Σάρωσε για επαλήθευση", + previewSkatepark: "Skatepark", + previewAccessPass: "Πάσα πρόσβασης", + previewMemberName: "Όνομα μέλους", + previewIssuedBy: "Εκδόθηκε από ιδιοκτήτη πάρκου · Υπογεγραμμένο στο Nostr", + previewValidThru: "Ισχύει έως", + previewNostrVerified: "Επαληθευμένο στο Nostr" + }, + craftFields: { + detailsTitle: "Πρόσθετα στοιχεία", + deliverables: "Παραδοτέα", + turnaround: "Χρόνος παράδοσης", + surfaces: "Επιφάνειες / Τοίχοι", + maxSize: "Μέγιστο μέγεθος", + setLength: "Διάρκεια σετ", + techRider: "Tech rider", + travel: "Μετακινήσεις", + certifications: "Πιστοποιήσεις", + insurance: "Ασφάλιση", + permits: "Άδειες", + deposit: "Προκαταβολή", + minimum: "Ελάχιστο", + modalities: "Μέθοδοι", + duration: "Διάρκεια ραντεβού", + drone: "Drone", + leadTime: "Χρόνος προετοιμασίας", + warranty: "Εγγύηση" + }, + craftForm: { + profileImage: "Εικόνα προφίλ", + nameHeadline: "Όνομα / επικεφαλίδα", + about: "Σχετικά", + aboutPlaceholder: "Πες στους skaters για τη δουλειά σου {{noun}}…", + required: "απαιτείται", + nip05Title: "Πρόσθεσε NIP-05 για να χτίσεις εμπιστοσύνη", + nip05Desc: "Ένα αναγνωριστικό NIP-05 βοηθά τους skaters να επαληθεύσουν ότι είσαι αυθεντικός. Συνιστάται ιδιαίτερα πριν την καταχώριση.", + editingNote: "Επεξεργάζεσαι το υπάρχον προφίλ σου {{noun}} — η δημοσίευση το αντικαθιστά.", + location: "Τοποθεσία", + pinned: "📍 Καρφιτσωμένο στον χάρτη ({{lat}}, {{lng}})", + experienceYears: "Εμπειρία (χρόνια)", + expPlaceholder: "π.χ. 5", + ratePlaceholder: "π.χ. 20k sats / ανά έργο", + contactLinks: "Επικοινωνία & σύνδεσμοι", + phoneOptional: "Τηλέφωνο (προαιρετικό)", + emailOptional: "Email (προαιρετικό)", + socialPlaceholder: "Social (Instagram, κ.λπ.)", + gettingPaid: "Πληρωμή", + updateProfile: "Ενημέρωση προφίλ", + publishProfile: "Δημοσίευση προφίλ", + rateLeftBlankNote: "Προαιρετικό — άφησέ το κενό αν η χρέωση παραπάνω αρκεί.", + sectionRequired: "Απαιτείται {{section}}", + sectionRequiredDesc: "Επίλεξε τουλάχιστον μία επιλογή στο \"{{section}}\".", + updated: "Το προφίλ ενημερώθηκε!", + created: "Το προφίλ δημιουργήθηκε!", + headlineExample: "Skate Coach Berlin" + } + }, + socialUi: { + agentPanel: { + spot: "Spot", + event: "Εκδήλωση", + labPro: "Lab pro", + gear: "Εξοπλισμός", + crew: "Crew", + description: "Ξέρει αυτό το crew — τα jams, το ρόστερ & το open call του — συν την ευρύτερη σκηνή με ζωντανά δεδομένα.", + greeting: "Γεια! Είμαι ο Sasquatch, ο οδηγός του {{crew}}. Ρώτησέ με για το crew — το επόμενο jam μας, ποιοι το τρέχουν, τι ψάχνουμε — ή για την ευρύτερη σκηνή.", + suggestion1: "Ποιο είναι το επόμενο jam μας;", + suggestion2: "Ποιοι τρέχουν αυτό το crew;", + suggestion3: "Τι ψάχνουμε;", + suggestion4: "Τα καλύτερα spots κοντά μας;", + suggestion5: "Τι καιρό έχει για skating;", + thinking: "Ο Sasquatch σκέφτεται…", + placeholder: "Ρώτησε για την τοπική σκηνή σου…", + disclaimer: "Το AI μπορεί να κάνει λάθη — οι σύνδεσμοι οδηγούν σε πραγματικές καταχωρίσεις." + }, + badge: { + upcomingOne: "{{count}} επερχόμενη εκδήλωση", + upcomingMany: "{{count}} επερχόμενες εκδηλώσεις", + comingOne: "{{count}} εκδήλωση έρχεται", + comingMany: "{{count}} εκδηλώσεις έρχονται" + }, + bell: { + youAreIn: "Είσαι στο {{crew}}! 🛹", + membershipConfirmed: "Η συμμετοχή επιβεβαιώθηκε.", + couldNotConfirm: "Δεν ήταν δυνατή η επιβεβαίωση", + addedYouTo: "σε πρόσθεσε στο", + confirmToAppear: "Επιβεβαίωσε για να εμφανιστείς ως μέλος.", + notifications: "Ειδοποιήσεις", + notificationsNew: "Ειδοποιήσεις ({{count}} νέες)", + unreadCount: "{{count}} μη αναγνωσμένες ειδοποιήσεις", + markRead: "Σήμανση ως αναγνωσμένων", + allClear: "Όλα εντάξει", + tabAll: "Όλα", + tabTrades: "Συναλλαγές", + tabSocial: "Social", + tabNews: "Νέα", + tabCrews: "Crews", + checkingUpdates: "Έλεγχος για ενημερώσεις…", + checkingTrades: "Έλεγχος προσφορών και συναλλαγών…", + loadingDrops: "Φόρτωση των τελευταίων νέων…", + emptyAll: "Προσφορές, συναλλαγές, zaps, απαντήσεις, newsletter και δραστηριότητα crews θα εμφανίζονται εδώ.", + emptyTrades: "Προσφορές, αντιπροσφορές και επιβεβαιώσεις συναλλαγών φτάνουν όλα εδώ — είτε πουλάς, είτε αγοράζεις, είτε ανταλλάσσεις.", + emptySocial: "Zaps, αντιδράσεις, reposts, mentions, απαντήσεις, RSVP εκδηλώσεων και ενημερώσεις διοργανωτών φτάνουν όλα εδώ.", + emptyNews: "Τα newsletter του SkateSpots θα φτάνουν εδώ. Εγγράψου στη σελίδα Newsletter.", + emptyCrews: "Προσκλήσεις crew, αιτήματα κολεκτίβας και αιτήματα συμμετοχής θα εμφανίζονται εδώ.", + subscribeBanner: "Εγγράψου για να λαμβάνεις νέα στο κουδούνι σου", + read: "Αναγνωσμένο", + allCaughtUp: "Είσαι ενημερωμένος" + }, + chat: { + hidden: "Κρυφό", + hideMessageAria: "Απόκρυψη αυτού του μηνύματος", + hideMessageTitle: "Απόκρυψη μηνύματος (διαχειριστής)", + messageHidden: "Το μήνυμα κρύφτηκε", + messageHiddenDesc: "Κρύφτηκε από το crew chat για όλους.", + messageHideFailed: "Αποτυχία απόκρυψης μηνύματος", + encryptionUnavailable: "Η κρυπτογράφηση δεν είναι διαθέσιμη", + encryptionUnavailableDesc: "Ο signer σου δεν υποστηρίζει κρυπτογράφηση NIP-44. Αναβάθμισε την επέκτασή σου.", + messageFailed: "Το μήνυμα απέτυχε", + couldNotSend: "Δεν ήταν δυνατή η αποστολή μηνύματος.", + noOneToMessage: "Κανείς για μήνυμα ακόμη", + noOneToMessageDesc: "Αυτό το crew δεν έχει άλλα μέλη για συνομιλία.", + subject: "crew chat {{crew}}", + title: "Crew Chat", + cordnBadgeTitle: "Δρομολογείται μέσω του Cordn coordinator αυτού του crew πάνω από ContextVM. Κρυπτογραφημένο από άκρη σε άκρη.", + private: "Ιδιωτικό", + privateBadgeTitle: "Κρυπτογραφημένο από άκρη σε άκρη — μόνο τα μέλη του crew μπορούν να διαβάσουν αυτά τα μηνύματα.", + encryptedCordn: "Κρυπτογραφημένο & δρομολογημένο μέσω του coordinator του crew (Cordn) — κανένα μήνυμα δεν φτάνει σε δημόσιους relays.", + encryptedNip17: "Κρυπτογραφημένο group chat για τον ιδρυτή & όλα τα καταχωρισμένα μέλη του crew.", + moderatorNote: " Μπορείς να κρύψεις μηνύματα από το crew ως moderator.", + loginToSee: "Συνδέσου για να δεις αν μπορείς να μπεις στο crew chat.", + membersOnly: "Αυτό το chat είναι ιδιωτικό για τα μέλη του crew. Ζήτησε από τον ιδρυτή να σε προσθέσει στο crew για να συμμετάσχεις.", + noMessages: "Δεν υπάρχουν μηνύματα ακόμη. Ξεκίνα το crew chat — κανονίστε ένα μάθημα, μοιραστείτε ένα spot, ανεβάστε ένα clip.", + newMessages: "Νέα μηνύματα", + new: "Νέο", + placeholder: "Στείλε μήνυμα στο crew σου…", + sendAria: "Αποστολή μηνύματος" + }, + collectiveJoinRequest: { + addedTitle: "Ο/Η {{name}} προστέθηκε στο {{collective}} 🛹", + addedDesc: "Θα επιβεβαιώσει από την πλευρά του/της για να εμφανιστεί ως επαληθευμένο μέλος.", + couldNotAdd: "Δεν ήταν δυνατή η προσθήκη μέλους", + couldNotDismiss: "Δεν ήταν δυνατή η απόρριψη", + addedDone: "Προστέθηκε", + addedTo: "στο", + dismissedDone: "Το αίτημα του/της {{name}} απορρίφθηκε", + wantsToJoin: "θέλει να μπει", + alreadyOnRoster: "Ήδη στο ρόστερ", + openCollective: "Άνοιγμα κολεκτίβας", + dismiss: "Απόρριψη", + addToCollective: "Προσθήκη στην κολεκτίβα" + }, + collectiveMembers: { + confirmed: "Επιβεβαιωμένο", + pending: "Σε εκκρεμότητα", + pendingTooltip: "Καταχωρήθηκε από την κολεκτίβα — αναμένει την επιβεβαίωση αυτού του μέλους.", + crewOnly: "Μόνο για το crew", + crewOnlyTooltip: "Αυτό το μέλος επέλεξε να είναι ορατό μόνο στους συμμαθητές του crew. Τον βλέπεις επειδή είσαι στο crew.", + hiddenMember: "Κρυφό μέλος", + title: "Μέλη", + verifiedOf: "{{confirmed}} από {{total}} επαληθευμένα — κάθε επιβεβαιωμένο μέλος υπέγραψε με το δικό του κλειδί Nostr.", + verifiedPerMember: "Η συμμετοχή επαληθεύεται ανά μέλος. Κάθε μέλος επιβεβαιώνει με το δικό του κλειδί Nostr.", + adminsOne: "{{count}} διαχειριστής βοηθά στη λειτουργία του crew.", + adminsMany: "{{count}} διαχειριστές βοηθούν στη λειτουργία του crew." + }, + confirmMembership: { + public: "Δημόσιο", + crewOnly: "Μόνο για το crew", + confirmedTitle: "Η συμμετοχή επιβεβαιώθηκε!", + confirmedCrew: "Είσαι επαληθευμένος στο {{name}} — ορατός μόνο στους συμμαθητές του crew.", + confirmedPublic: "Εμφανίζεσαι πλέον ως επαληθευμένο μέλος του {{name}}.", + failed: "Αποτυχία επιβεβαίωσης", + addedTo: "Προστέθηκες στο {{name}}", + addedDesc: "Επιβεβαίωσε τη συμμετοχή σου ώστε να εμφανίζεται ως επαληθευμένη στο προφίλ σου και στο δικό τους.", + yourVisibility: "Η ορατότητά σου", + confirming: "Επιβεβαίωση…", + confirmButton: "Επιβεβαίωση συμμετοχής" + }, + contacts: { + message: "Μήνυμα", + removePrivate: "Αφαίρεση από ιδιωτικές επαφές", + savePrivate: "Αποθήκευση στις ιδιωτικές επαφές", + seoTitle: "Επαφές - SkateSpots", + seoDescription: "Η σκηνή σου — συμμαθητές crew, άτομα που ακολουθείς και πρόσφατες συνομιλίες, με ιδιωτικές κρυπτογραφημένες επαφές.", + encryptionUnavailableDesc: "Ο signer σου δεν υποστηρίζει κρυπτογράφηση NIP-44.", + removed: "Αφαιρέθηκε από τις ιδιωτικές επαφές", + saved: "Αποθηκεύτηκε στις ιδιωτικές επαφές", + savedDesc: "Μόνο εσύ μπορείς να δεις αυτή τη λίστα.", + updateFailed: "Δεν ήταν δυνατή η ενημέρωση των επαφών", + loginTitle: "Η σκηνή σου, σε ένα μέρος", + loginDesc: "Συνδέσου για να δεις τους συμμαθητές του crew σου, τα άτομα που ακολουθείς και τις πρόσφατες συνομιλίες — και να κρατάς μια ιδιωτική, κρυπτογραφημένη λίστα επαφών.", + title: "Επαφές", + subtitle: "Η σκηνή σου — συμμαθητές crew, follows & συνομιλίες", + filterPlaceholder: "Φιλτράρισμα με npub…", + tabCrew: "Crew", + tabFollows: "Follows", + tabDms: "DMs", + tabSaved: "Αποθηκευμένα", + emptyCrewmates: "Δεν υπάρχουν συμμαθητές crew ακόμη. Μπες ή ξεκίνα ένα crew για να χτίσεις το δίκτυο της σκηνής σου.", + emptyFollowing: "Δεν ακολουθείς κανέναν ακόμη.", + emptyDms: "Δεν υπάρχουν συνομιλίες ακόμη. Στείλε μήνυμα σε έναν skater για να ξεκινήσεις.", + savedHint: "Αυτή η λίστα είναι κρυπτογραφημένη με το κλειδί σου — μόνο εσύ μπορείς να τη διαβάσεις. Πάτησε το αστέρι σε οποιονδήποτε για να τον προσθέσεις.", + emptySaved: "Δεν υπάρχουν αποθηκευμένες επαφές ακόμη. Βάλε αστέρι σε άτομα από οποιαδήποτε καρτέλα για να χτίσεις το ιδιωτικό σου βιβλίο διευθύνσεων." + }, + conversation: { + unknown: "Άγνωστο", + seoTitle: "Συνομιλία με {{name}} - SkateSpots", + seoDescription: "Ιδιωτική κρυπτογραφημένη συνομιλία", + sendFailed: "Αποτυχία αποστολής μηνύματος", + sendFailedDesc: "Δοκίμασε ξανά σε λίγο.", + tradeConfirmed: "Η συναλλαγή επιβεβαιώθηκε", + tradeConfirmedDesc: "Η φήμη ενημερώθηκε και για τους δύο.", + tradeConfirmFailed: "Δεν ήταν δυνατή η επιβεβαίωση της συναλλαγής", + somethingWrong: "Κάτι πήγε στραβά.", + soldNote: "Πουλήθηκε στον/στην {{name}}.", + saleConfirmed: "Η πώληση επιβεβαιώθηκε", + saleConfirmedDesc: "Ο/Η {{name}} μπορεί τώρα να επιβεβαιώσει τη δική του/της πλευρά.", + saleConfirmFailed: "Δεν ήταν δυνατή η επιβεβαίωση της πώλησης", + escrowRedeemed: "Το escrow εξαργυρώθηκε", + escrowRedeemedDesc: "Τα χρήματα βρίσκονται τώρα στο πορτοφόλι σου Cashu.", + escrowRedeemFailed: "Δεν ήταν δυνατή η εξαργύρωση του escrow", + loginTitle: "Συνδέσου για να δεις τα μηνύματα", + secureLoginTitle: "Απαιτείται ασφαλής σύνδεση", + secureLoginDesc: "Τα μηνύματα απαιτούν μια ασφαλή εφαρμογή signer.", + encrypted: "Κρυπτογραφημένο", + refresh: "Ανανέωση", + didCompleteTrade: "Ολοκλήρωσες αυτή τη συναλλαγή;", + recordedSale: "Ο/Η {{name}} κατέγραψε την πώληση. Επιβεβαίωσε για να ενημερωθεί η φήμη και για τους δύο.", + confirm: "Επιβεβαίωση", + confirmSale: "Επιβεβαίωση αυτής της πώλησης;", + askedToRecord: "Ο/Η {{name}} σου ζήτησε να την καταγράψεις. Η επιβεβαίωση χτίζει φήμη και για τους δύο.", + confirmSaleButton: "Επιβεβαίωση πώλησης", + redeemEscrow: "Εξαργύρωση escrow", + escrowAppOnly: "Το Cashu escrow είναι μόνο για την εφαρμογή — άνοιξε το SkateSpots στο τηλέφωνό σου για εξαργύρωση.", + startThread: "Στείλε ένα μήνυμα για να ξεκινήσεις τη συνομιλία", + placeholder: "Πληκτρολόγησε μήνυμα...", + e2eeNote: "Τα μηνύματα είναι κρυπτογραφημένα από άκρη σε άκρη με NIP-17" + }, + coordinator: { + secondsAgo: "πριν {{count}}δ", + minutesAgo: "πριν {{count}}λ", + hoursAgo: "πριν {{count}}ω", + daysAgo: "πριν {{count}}η", + statusIdle: "Δεν ελέγχθηκε", + statusChecking: "Έλεγχος…", + statusOnline: "Συνδεδεμένο", + statusStale: "Ήσυχο", + statusOffline: "Δεν εθεάθη", + statusError: "Μη προσβάσιμο", + notACoordinator: "Αυτό δεν είναι coordinator", + notACoordinatorDesc: "Επικόλλησε ένα nprofile, ένα npub, ή έναν σύνδεσμο cordn.net.", + added: "Ο coordinator προστέθηκε", + relayOne: "{{count}} relay", + relayMany: "{{count}} relays", + lastSeen: "τελευταία εμφάνιση {{time}}", + onlineDesc: "Ανακοινώνεται. Τα groups που το χρησιμοποιούν μπορούν να παραδίδουν μηνύματα τώρα.", + staleDesc: "Βρέθηκε, αλλά δεν έχει ανακοινωθεί πρόσφατα — μπορεί να κοιμάται.", + offlineDesc: "Δεν εθεάθη ανακοίνωση. Μπορεί να είναι ιδιωτικό (αυτό είναι εντάξει), ή απλώς εκτός σύνδεσης.", + errorDesc: "Δεν ήταν δυνατή η πρόσβαση στα relays.", + idleDesc: "Έλεγχος…", + checkingDesc: "Αναζήτηση της ανακοίνωσής του…", + eventFoundOne: "Βρέθηκε {{count}} event.", + eventFoundMany: "Βρέθηκαν {{count}} events.", + check: "Έλεγχος", + addLinkCopied: "Ο σύνδεσμος προσθήκης αντιγράφηκε", + copyFailed: "Η αντιγραφή απέτυχε", + copyManually: "Αντιγράψε το χειροκίνητα.", + addLink: "Προσθήκη συνδέσμου", + removeConfirm: "Αφαίρεση αυτού του coordinator από αυτή τη συσκευή;", + scanToJoin: "Σάρωσε στο Cordn για να μπεις σε αυτόν τον coordinator.", + noCoordinator: "Δεν υπάρχει coordinator ακόμη", + noCoordinatorDescA: "Ένας coordinator παραδίδει τα", + encryptedWord: "κρυπτογραφημένα", + noCoordinatorDescB: "group μηνύματα του crew σου με σειρά. Βλέπει ποιος, πότε και ποιο group — ποτέ το περιεχόμενο. Διάλεξε έναν, ή τρέξε τον δικό σου.", + change: "Αλλαγή coordinator", + addTitle: "Προσθήκη coordinator", + add: "Προσθήκη", + scanQR: "Σάρωση QR coordinator", + inputPlaceholder: "nprofile… ή σύνδεσμος cordn.net", + runOwn: "Τρέξε τον δικό σου", + runOwnDesc: "Μπορεί να ζει σε ένα παλιό τηλέφωνο, ένα Raspberry Pi, ή οποιοδήποτε μικρό κουτί αφήνεις ανοιχτό. Το group σου συνεχίζει να δουλεύει όσο είναι ενεργό — και μπορείς να μετακινήσεις το group όποτε θέλεις.", + onPhone: "Σε ένα τηλέφωνο", + onPhoneDesc: "Χρησιμοποίησε την εφαρμογή Cordn Coordinator, και σάρωσε το QR της εδώ για να την προσθέσεις.", + openCordn: "Άνοιγμα Cordn", + scanItsQR: "Σάρωση του QR της", + onServer: "Σε έναν server", + commandCopied: "Η εντολή αντιγράφηκε", + copyCommand: "Αντιγραφή εντολής", + androidSleep: "Το Android μπορεί να βάλει σε νάρκη έναν coordinator σε τηλέφωνο. Περίμενε να μετακινείς ένα group πού και πού.", + privacyNote: "🔒 Ένας coordinator βλέπει μόνο κρυπτοκείμενο και metadata — ποτέ το περιεχόμενο των μηνυμάτων. Τρέξε τον δικό σου για να κρατήσεις ακόμη και τα metadata δικά σου.", + customTitle: "Custom Chat Coordinator", + customBadge: "· πειραματικό · δικό σου relay", + customDescShort: "Προαιρετικό — το crew σου έχει ήδη ενσωματωμένο κρυπτογραφημένο chat, οπότε δεν το χρειάζεσαι. Όρισέ το μόνο αν τρέχεις τον δικό σου", + remove: "Αφαίρεση", + pointerNote: "Μόνο δείκτης προς το παρόν: ένα wss:// endpoint χρησιμοποιείται ως chat relay του crew· ένα https:// μέσω του κοινού relay ContextVM. Το πραγματικό Cordn MLS δεν είναι ακόμη συνδεδεμένο.", + cordnCoordinator: "Cordn coordinator", + invalid: "Αυτό δεν μοιάζει με coordinator. Επικόλλησε ένα nprofile, έναν σύνδεσμο cordn.net, ή ένα https/wss URL.", + useMine: "Χρήση του coordinator μου" + }, + createCrew: { + seoTitle: "Δημιουργία Crew - SkateSpots", + seoDescription: "Δημιούργησε το skate crew σου — home turf, μέλη και spots.", + loginRequired: "Απαιτείται σύνδεση", + loginRequiredDesc: "Πρέπει να συνδεθείς για να δημιουργήσεις ένα crew.", + backToCrews: "Πίσω στα Crews", + title: "Δημιούργησε ένα Crew", + intro: "Η skate οικογένειά σου — τα άτομα με τα οποία skate-άρεις. Ένα όνομα αρκεί για να ξεκινήσεις· όλα τα άλλα είναι προαιρετικά." + }, + crew: { + seoTitleNamed: "{{name}} - SkateSpots Crew", + seoTitle: "Crew - SkateSpots", + seoDescription: "Ένα skate crew στο SkateSpots.", + postHidden: "Η δημοσίευση κρύφτηκε", + postHiddenDesc: "Αφαιρέθηκε από τη ροή του crew για όλους.", + postHideFailed: "Αποτυχία απόκρυψης δημοσίευσης", + backToCrews: "Πίσω στα Crews", + disband: "Διάλυση", + youAreCaptain: "Είσαι captain", + member: "Μέλος", + askSasquatch: "Ρώτησε τον Sasquatch", + agent: "Crew Agent", + agentDesc: "Ο AI οδηγός του crew σου — κοντινά spots, εκδηλώσεις, coaches & εξοπλισμός, με ζωντανά δεδομένα.", + eventsTab: "Εκδηλώσεις", + chatTab: "Chat", + newMessages: "Νέα μηνύματα", + hostJam: "Διοργάνωσε jam", + noEvents: "Δεν υπάρχουν εκδηλώσεις crew ακόμη. Διοργάνωσε ένα jam, αγώνα ή meetup ως crew — συνδέει το crew σου με το ημερολόγιο εκδηλώσεων και επιτρέπει σε άτομα να το κάνουν zap.", + support: "Υποστήριξη", + zapCrew: "Κάνε zap στο Crew", + bandTitle: "Crew Band", + bandTagline: "Ζωντανή μουσική · skate & ήχος", + listenTitle: "Άκου: {{domain}}", + listen: "Άκου τα κομμάτια", + setUpGig: "Κανόνισε μια συναυλία", + bookGigMessage: "Γεια {{crew}} — ενδιαφέρομαι να κλείσω τους {{band}} για μια συναυλία. Είσαι διαθέσιμος να μιλήσουμε για ημερομηνίες;", + messageAboutGig: "Μήνυμα για συναυλία", + gigHintA: "προσθέτει μια μουσική εκδήλωση στο ημερολόγιο, με διοργανωτή αυτό το crew.", + messageShort: "Μήνυμα", + gigHintB: "ανοίγει ένα κρυπτογραφημένο DM στο crew για να κανονίσετε ημερομηνίες & λεπτομέρειες.", + homeSpots: "Home Spots", + viewSpot: "Προβολή spot", + seeOnMap: "Δες στον χάρτη →", + founderLinks: "Ιδρυτής & σύνδεσμοι", + startedBy: "Ξεκίνησε από {{name}}", + opens: "Ανοίγει: {{domain}}" + }, + crews: { + seoTitle: "Crews - SkateSpots", + seoDescription: "Βρες τους δικούς σου ανθρώπους. Ανακάλυψε τοπικά skate crews, κολεκτίβες και κοινότητες κοντά σου.", + videoPartTooltip: "Αυτό το crew έχει video part", + part: "Part", + bandTooltip: "Crew band: {{name}}", + band: "Band", + focusAll: "Όλα", + focusAllShort: "Όλα", + focusDiy: "DIY", + focusPhoto: "Φωτογραφία", + focusCoaching: "Coaching", + focusArt: "Τέχνη", + focusMusic: "Μουσική", + focusPhysio: "Φυσιοθεραπεία", + focusMixed: "Μεικτό", + title: "Crews", + heroLine: "Η skate οικογένειά σου, αγκυρωμένη στον χάρτη — τα άτομα με τα οποία skate-άρεις", + heroWith: "μαζί", + heroRest: ", όχι αυτούς που προσλαμβάνεις (αυτό είναι το The Lab).", + crewCountOne: "{{count}} crew", + crewCountMany: "{{count}} crews", + cityCountOne: "{{count}} πόλη", + cityCountMany: "{{count}} πόλεις", + createCrew: "Δημιουργία Crew", + create: "Δημιουργία", + searchPlaceholder: "Αναζήτηση crews με όνομα ή πόλη…", + filterTitle: "Φιλτράρισμα crews", + filterDesc: "Τι αρέσει στο crew.", + nearMe: "Κοντά μου", + emptySearchTitle: "Κανένα crew δεν ταιριάζει με την αναζήτησή σου", + emptySearchHint: "Δεν βρέθηκε τίποτα για “{{query}}”. Δοκίμασε άλλο όνομα ή πόλη.", + clearSearch: "Καθαρισμός αναζήτησης", + emptyFocusTitle: "Δεν υπάρχουν crews {{label}} ακόμη", + emptyFocusHint: "Κανείς δεν κυματίζει ακόμη τη σημαία “{{label}}” εδώ. Δείξε κάθε crew, ή ξεκίνα το δικό σου.", + showAll: "Εμφάνιση όλων των crews", + claimTitle: "Διεκδίκησε την τοπική σου σκηνή", + claimHint: "Δεν έχουν φυτευτεί crews εδώ ακόμη. Γίνε ο πρώτος — ξεκίνα το crew σου, σύνδεσε τα home spots σου, και βάλε τη σκηνή σου στον χάρτη για να τη βρουν όλοι." + }, + crewCoordinator: { + privateChat: "Ιδιωτικό Crew Chat", + on: "Ενεργό", + defaultA: "Η καρτέλα", + chatWord: "Chat", + defaultB: "είναι", + e2ee: "κρυπτογραφημένη από άκρη σε άκρη", + defaultC: "για τον ιδρυτή και όλα τα καταχωρισμένα μέλη — τίποτα να ρυθμίσεις. Τα μηνύματα σφραγίζονται με το κλειδί κάθε μέλους (NIP-17), ώστε μόνο το crew σου να μπορεί να τα διαβάσει.", + advancedA: "Για προχωρημένους: τρέξε τον δικό σου", + cordnCoordinator: "Cordn coordinator", + routeThrough: "Δρομολόγηση chat μέσω αυτού", + coordinator: "Coordinator", + deliveredOver: "Παραδίδεται μέσω", + sharedRelay: "— του κοινού relay ContextVM.", + ownRelay: "— του δικού σου relay του crew.", + chatLive: "Το ιδιωτικό chat είναι ζωντανό", + routesA: "Η καρτέλα", + routesB: "δρομολογεί μέσω αυτού του coordinator: τα μηνύματα είναι κρυπτογραφημένα από άκρη σε άκρη (NIP-44, σφραγισμένα σε κάθε μέλος), οπότε χειρίζεται πάντα μόνο σφραγισμένη κίνηση.", + publicWarning: "Προσοχή: απευθύνεται μέσω του κοινού relay ContextVM, οπότε το κρυπτοκείμενο και τα metadata του (ποιο crew, και πότε) είναι δημόσια ορατά — απλώς όχι αναγνώσιμα. Στρέψε το crew σε ένα ιδιωτικό wss:// relay για να κρατήσεις ακόμη και αυτό ιδιωτικό.", + ownRelaySafe: "Τίποτα ειδικό για το crew δεν φεύγει από το δικό του relay.", + manage: "Διαχείριση coordinator", + open: "Άνοιγμα {{domain}}", + runBy: "Ο coordinator τρέχει από" + }, + dms: { + securityReminder: "Υπενθύμιση ασφαλείας", + phishingStrong: "Το SkateSpots δεν θα σου στείλει ποτέ DM", + phishingRest: "ζητώντας να επαληθεύσεις τον λογαριασμό σου, να μοιραστείς τα κλειδιά σου, ή να στείλεις πληρωμές. Αν κάποιος ισχυρίζεται ότι είναι υποστήριξη του SkateSpots μέσω DM — είναι απάτη.", + dismissReminder: "Απόκρυψη υπενθύμισης ασφαλείας", + peopleCount: "{{count}} άτομα", + youPrefix: "Εσύ: ", + unreadMessages: "Μη αναγνωσμένα μηνύματα", + seoTitle: "Μηνύματα - SkateSpots", + seoDescription: "Ιδιωτικά κρυπτογραφημένα μηνύματα με την κοινότητα του skateboarding", + loginTitle: "Συνδέσου για πρόσβαση στα μηνύματα", + loginDesc: "Ιδιωτική, κρυπτογραφημένη ανταλλαγή μηνυμάτων με skaters της κοινότητας", + secureLoginTitle: "Απαιτείται ασφαλής σύνδεση", + secureLoginDesc: "Τα ιδιωτικά μηνύματα απαιτούν μια ασφαλή εφαρμογή signer για την κρυπτογράφηση των συνομιλιών σου.", + onAndroid: "Στο Android:", + useAmber: "Χρησιμοποίησε την εφαρμογή Amber", + getAmber: "Απόκτησε το Amber →", + onIOS: "Στο iOS:", + iosHint: "Δοκίμασε να συνδεθείς με σύνδεση bunker (nsec.app) από τις Ρυθμίσεις", + browserHint: "Δοκίμασε να συνδεθείς με επέκταση περιηγητή όπως το Alby ή το nos2x που υποστηρίζει κρυπτογράφηση.", + title: "Μηνύματα", + subtitleFull: "Κρυπτογραφημένα από άκρη σε άκρη με NIP-17", + subtitleShort: "Κρυπτογραφημένα", + newMessage: "Νέο μήνυμα", + groups: "Groups", + loadFailed: "Αποτυχία φόρτωσης μηνυμάτων", + emptyTitle: "Δεν υπάρχουν μηνύματα ακόμη", + emptyDesc: "Ξεκίνα μια συνομιλία με κάποιον στην κοινότητα", + startConversation: "Ξεκίνα μια συνομιλία", + undecryptableOne: "{{count}} κρυπτογραφημένο μήνυμα δεν μπόρεσε να ανοίξει ο signer σου.", + undecryptableMany: "{{count}} κρυπτογραφημένα μηνύματα δεν μπόρεσε να ανοίξει ο signer σου." + }, + editCrew: { + seoTitleNamed: "Επεξεργασία {{name}} - SkateSpots", + seoTitle: "Επεξεργασία Crew - SkateSpots", + seoDescription: "Επεξεργάσου το skate crew σου.", + loginRequired: "Απαιτείται σύνδεση", + notYours: "Δεν είναι το crew σου", + notYoursDesc: "Μόνο ο ιδρυτής του crew μπορεί να το επεξεργαστεί.", + backToCrew: "Πίσω στο Crew", + title: "Επεξεργασία Crew" + }, + form: { + add: "Προσθήκη", + added: "Προστέθηκε", + addNameInBasicsA: "Πρόσθεσε ξανά ένα όνομα crew στο", + addNameInBasicsB: "για να ολοκληρώσεις.", + adminsDescA: "Κάνε έμπιστα μέλη", + adminsWord: "διαχειριστές", + adminsDescB: "— μπορούν να προσκαλούν μέλη και να συντονίζουν τη ροή & το chat του crew με τα δικά τους κλειδιά. Εσύ (ο ιδρυτής) παραμένεις πάντα ο κάτοχος της ταυτότητας του crew.", + agentDescA: "Πρόσθεσε τον", + agentDescB: ", έναν AI οδηγό που πραγματικά ξέρει το crew σου. Τα μέλη μπορούν να ρωτήσουν για", + agentDescC: "— συν κοντινά spots, εκδηλώσεις, coaches και εξοπλισμό από ζωντανά δεδομένα του SkateSpots. Τρέχει απευθείας στον περιηγητή· χωρίς κλειδιά ή ρύθμιση. Είναι νωρίς (δωρεάν βαθμίδα AI, οπότε κατά καιρούς αργό).", + agentDescStrong: "το επόμενο jam σας, ποιοι τρέχουν το crew, τι ψάχνετε και το vibe σας", + agentEnabledNote: "Ο Sasquatch θα εμφανιστεί στη σελίδα του crew σου μόλις αποθηκεύσεις.", + bandDesc: "Έχεις συγκρότημα; Οι σκηνές του skate και η τοπική μουσική πάνε χέρι-χέρι — βάλε το όνομα του συγκροτήματός σου και έναν σύνδεσμο για τα κομμάτια.", + bandFooterA: "Για ένα πλήρες προφίλ συγκροτήματος (είδη, όργανα, συναυλίες), δημιούργησε έναν", + musicianWord: "Μουσικό", + bandFooterB: "στο The Lab, και σύνδεσέ το στην ενότητα", + linkedLabWord: "Συνδεδεμένα προφίλ Lab", + bandFooterC: "παραπάνω.", + bandMusicWord: "Συγκρότημα & μουσική", + bandName: "Όνομα συγκροτήματος", + bandNamePlaceholder: "π.χ. The Bail Outs", + bandNudgeA: "Έχεις συγκρότημα — πάτησε για να ορίσεις το", + crewTypeWord: "Τύπος Crew", + bandNudgeB: "σε", + bandNudgeC: "ώστε να εμφανίζεσαι και στη σκηνή Μουσικής του The Lab.", + beta: "Beta", + bioLabel: "Σχετικά / Μανιφέστο", + bioPlaceholder: "Ποιοι είστε, τι skate-άρετε, η ιστορία σας...", + continue: "Συνέχεια", + crewCreated: "Το crew δημιουργήθηκε!", + crewUpdated: "Το crew ενημερώθηκε!", + crewName: "Όνομα Crew", + crewOnlyWord: "Μόνο για το crew", + crewType: "Τύπος Crew", + crewTypeDescA: "Το crew σου επικεντρώνεται σε μια τέχνη; Διάλεξε μία για να εμφανίζεσαι και σε εκείνη τη σκηνή στο", + theLab: "The Lab", + crewTypeDescB: ". Τα συνηθισμένα skate crews παραμένουν", + mixedWord: "Μεικτά", + crewTypeDescC: ".", + customVibeHint: "Πρόσθεσε το δικό σου vibe ή focus με ένα #", + customVibePlaceholder: "π.χ. downhill, night-sessions, no-comply", + editDesc: "Η ταυτότητα, το home turf και τα μέλη του crew σου", + enableAgent: "Ενεργοποίηση Crew Agent", + enableTreasury: "Ενεργοποίηση Ταμείου Crew", + failed: "Απέτυχε", + founded: "Ίδρυση (Έτος)", + geolocationUnsupported: "Η γεωτοποθεσία δεν υποστηρίζεται", + gettingLocation: "Λήψη...", + goalHint: "Βεβαιώσου ότι το προφίλ σου στο Nostr έχει διεύθυνση Lightning (lud16) ώστε να φτάνουν οι συνεισφορές.", + goalPlaceholder: "π.χ. Τσιμέντο στο DIY spot", + goalTarget: "Στόχος (sats)", + goalWhat: "Ποιος είναι ο στόχος;", + homeSpots: "Home Spots", + homeSpotsDesc: "Σύνδεσε τα spots που συχνάζει το crew σου — θα συνδεθούν με το crew σου στον χάρτη", + homeTurf: "Home Turf (Πόλη / Περιοχή)", + homeTurfPlaceholder: "Θεσσαλονίκη, GR", + instagramDetected: "Εντοπίστηκε clip Instagram", + invalidMember: "Εισάγετε ένα έγκυρο npub, nprofile, ή hex pubkey.", + latitude: "Γεωγραφικό πλάτος", + leaveBlankLocation: "Άφησέ το κενό για να κρατήσεις την τρέχουσα τοποθεσία home turf.", + links: "Σύνδεσμοι", + locationError: "Σφάλμα τοποθεσίας", + locationFound: "Η τοποθεσία βρέθηκε", + logoAlt: "Crew", + logoHint: "Ένα λογότυπο κάνει το crew σου αμέσως αναγνωρίσιμο στον χάρτη και στις ροές. Το τετράγωνο ταιριάζει καλύτερα.", + logoLabel: "Λογότυπο / Φωτογραφία Crew", + logoUploaded: "Το λογότυπο ανέβηκε", + longitude: "Γεωγραφικό μήκος", + looksGood: "Φαίνεται καλό", + makeAdmin: "Κάνε διαχειριστή", + mapPin: "Pin χάρτη", + mapPinHint: "Βάλε το crew σου στον χάρτη ώστε να σε βρουν οι ντόπιοι. Πάτησε το κουμπί — χωρίς πληκτρολόγηση.", + memberAlreadyAdded: "Αυτό το μέλος έχει ήδη προστεθεί.", + members: "Μέλη", + membersDesc: "Πρόσθεσε τους λογαριασμούς Nostr του crew σου. Κάθε μέλος επιβεβαιώνει με το δικό του κλειδί — μέχρι τότε εμφανίζεται ως “σε εκκρεμότητα”.", + musicLink: "Σύνδεσμος μουσικής", + nameCrew: "Ονόμασε το crew σου", + nameCrewDesc: "Ένα crew χρειάζεται όνομα πριν συνεχίσεις.", + nameCrewFirst: "Ονόμασε πρώτα το crew σου", + nameHint: "Το μόνο πράγμα που πραγματικά χρειάζεσαι. Μπορείς να το αλλάξεις αργότερα.", + namePlaceholder: "π.χ. Backyard Bandits", + nameRequired: "Απαιτείται όνομα", + nameRequiredDesc: "Δώσε ένα όνομα στο crew σου.", + nip05DescA: "Ένα επαληθεύσιμο handle που ελέγχεις σε οποιονδήποτε domain, π.χ.", + nip05DescB: ". Επαληθεύεται έναντι του κλειδιού του ιδρυτή αυτού του crew, και μπορείς να προσθέσεις μερικά — το καθένα δείχνει ένα πράσινο τικ όταν ο domain του το επιβεβαιώσει.", + nip05Label: "NIP-05 Crew", + nip05Placeholder: "crew@yourdomain.com", + nip05Add: "Προσθήκη", + nip05Invalid: "Εισάγετε ένα handle όπως crew@yourdomain.com", + nip05TooMany: "Μπορείς να προσθέσεις έως {{count}} handles.", + nip05Unverified: "Μη ελεγμένο", + nip05Remove: "Αφαίρεση {{handle}}", + notAKeyA: "Αυτό δεν μοιάζει ακόμη με κλειδί Nostr — επικόλλησε ένα", + notAKeyB: ",", + notAKeyC: ", ή hex pubkey.", + onlyYouTubeInstagram: "Υποστηρίζονται μόνο σύνδεσμοι YouTube και Instagram.", + openCall: "Open Call", + openCallDescA: "Ψάχνεις filmer, editor ή νέο αίμα; Βγάλε ένα κάλεσμα — εμφανίζεται στη σελίδα του crew σου ώστε να σε προσεγγίσουν ταιριαστά άτομα από το", + openCallDescB: ".", + optional: "· προαιρετικό", + optionalParen: "(προαιρετικό)", + otherSocials: "Άλλα social", + otherSocialsDesc: "Πρόσθεσε όσα θέλεις — YouTube, TikTok, Discord, Telegram, κ.λπ.", + ownVisibility: "δική του ορατότητα", + progress: "Πρόοδος", + publicWord: "Δημόσιο", + publishedToScene: "Δημοσιεύτηκε στη σκηνή.", + publishFailed: "Η δημοσίευση απέτυχε", + publishing: "Δημοσίευση...", + ready: "Έτοιμο", + readyToRollA: "Έτοιμο — πάτησε", + readyToRollB: "όποτε θέλεις.", + removeAdminRole: "Αφαίρεση ρόλου διαχειριστή", + removeMember: "Αφαίρεση μέλους", + removeSocial: "Αφαίρεση social link", + removeVibe: "Αφαίρεση {{vibe}}", + roles: "Ρόλοι:", + sasquatch: "Sasquatch", + saveCrew: "Αποθήκευση Crew", + skipToEnd: "Μετάβαση στο τέλος", + socialPlaceholder: "@username ή σύνδεσμος", + sponsorDesc: "Αν ένα τοπικό κατάστημα στηρίζει το crew σου, διάλεξέ το εδώ για να εμφανιστεί ένα banner “Με χορηγία από” που οδηγεί στο κατάστημά του.", + stepAria: "Βήμα {{step}}: {{title}}", + stepBasics: "Τα βασικά", + stepBasicsShort: "Βασικά", + stepBasicsHint: "Μόνο τα απαραίτητα — μπορείς να στήσεις ένα crew μόνο με αυτό το βήμα.", + stepVibe: "Ταυτότητα & Vibe", + stepVibeShort: "Vibe", + stepVibeHint: "Πώς εμφανίζεται το crew σου στην εφαρμογή. Όλα προαιρετικά.", + stepSquad: "Ομάδα & Spots", + stepSquadShort: "Ομάδα", + stepSquadHint: "Πρόσθεσε τα άτομά σου και το home turf σου. Μπορείς πάντα να το κάνεις αργότερα.", + stepExtras: "Extras", + stepExtrasShort: "Extras", + stepExtrasHint: "Power-ups για αργότερα — παράλειψε ό,τι δεν είσαι σίγουρος.", + extrasAllOptional: "Όλα σε αυτό το βήμα είναι προαιρετικά.", + groupIdentity: "Ταυτότητα", + groupIdentityHint: "Handle, σύνδεσμοι", + groupAi: "Sasquatch AI", + groupShowcase: "Προβολή", + groupPayments: "Πληρωμές & ταμείο", + groupIntegrations: "Ενσωματώσεις", + groupAdvanced: "Για προχωρημένους", + groupAdvancedHint: "πειραματικό", + pro: "Pro", + agentProNote: "Με την υποστήριξη του Sasquatch. Το Pro παίρνει τα καλύτερα μοντέλα· χωρίς Pro χρησιμοποιεί δωρεάν εναλλακτική.", + stepOf: "Βήμα {{step}} από {{total}}", + treasuryDescA: "Συγκέντρωσε sats για έναν κοινό στόχο — επισκευή του τοπικού DIY spot, εκδρομή του crew, έπαθλο αγώνα. Είναι ένας διαφανής στόχος Lightning· τα zaps πάνε", + treasuryDescStrong: "απευθείας στο πορτοφόλι σου", + treasuryDescB: "(μέσω της διεύθυνσης Lightning του προφίλ σου). Το SkateSpots δεν κρατά ποτέ τα χρήματα.", + upload: "Μεταφόρτωση", + uploadFailed: "Η μεταφόρτωση απέτυχε", + useCurrentLocation: "Χρήση τρέχουσας τοποθεσίας", + vibeLabel: "Vibe / Focus", + videoDescA: "Το πλήρες part, το montage ή το τελευταίο clip του crew σου. Επικόλλησε έναν σύνδεσμο", + videoDescB: "— θα παίξει απευθείας στη σελίδα του crew σου.", + visibilityDescA: "Κάθε μέλος ελέγχει τη", + visibilityDescB: "— όταν επιβεβαιώσει με το κλειδί του μπορεί να διαλέξει", + visibilityDescC: "— κρυφό από εξωτερικούς). Δεν μπορείς να το ορίσεις εσύ· είναι δική του απόφαση.", + website: "Ιστοσελίδα", + yourRoles: "Οι ρόλοι σου (Team Leader)", + youtubeDetected: "Εντοπίστηκε βίντεο YouTube", + invalidUrl: "Εισάγετε έναν έγκυρο σύνδεσμο (π.χ. https://example.com)." + }, + groupConversation: { + seoTitle: "Group chat - SkateSpots", + invalidLink: "Αυτός ο σύνδεσμος group chat δεν είναι έγκυρος.", + loginTitle: "Συνδέσου για να δεις αυτό το group", + secureSignerTitle: "Απαιτείται ασφαλής signer", + secureSignerDesc: "Τα μηνύματα group χρειάζονται signer με δυνατότητα NIP-44.", + encryptedGroup: "Κρυπτογραφημένο group από άκρη σε άκρη", + empty: "Δεν υπάρχουν μηνύματα ακόμη — πες γεια στο group.", + placeholder: "Στείλε μήνυμα στο group..." + }, + hero: { + established: "Από το {{year}}", + teamLeader: "Team leader: {{name}}", + ledBy: "Με επικεφαλής" + }, + inviteCard: { + acceptedTitle: "Η πρόσκληση έγινε δεκτή 🛹", + acceptedDesc: "Ο ιδρυτής του crew επιβεβαιώνει μέλη στο {{crew}}. Θα εμφανιστείς στο ρόστερ μόλις σε εγκρίνει.", + couldNotAccept: "Δεν ήταν δυνατή η αποδοχή", + couldNotDecline: "Δεν ήταν δυνατή η απόρριψη", + acceptedDone: "Έγινε δεκτή —", + confirmsMembers: "επιβεβαιώνει μέλη", + declinedDone: "Η πρόσκληση στο {{crew}} απορρίφθηκε", + invitedYou: "σε προσκάλεσε να μπεις", + admin: "Διαχειριστής", + accept: "Αποδοχή", + decline: "Απόρριψη" + }, + inviteDialog: { + messageIntro: "Γεια — μπες στο crew {{crew}} στο SkateSpots 🛹", + messageBody: "Συνδέσου με το κλειδί σου Nostr, και μετά ζήτησε να μπεις από τη σελίδα του crew.", + copyFailed: "Η αντιγραφή απέτυχε", + shareTitle: "Μπες στο {{crew}}", + sentTitle: "Η πρόσκληση στάλθηκε! 🛹", + sentDesc: "Θα λάβουν ειδοποίηση για αποδοχή ή απόρριψη.", + couldNotSend: "Δεν ήταν δυνατή η αποστολή πρόσκλησης", + trigger: "Πρόσκληση", + title: "Πρόσκληση στο {{crew}}", + description: "Στείλε πρόσκληση στο κλειδί Nostr κάποιου, ή μοιράσου έναν σύνδεσμο.", + sendTab: "Αποστολή πρόσκλησης", + shareTab: "Μοιρασιά συνδέσμου", + npubLabel: "Npub του skater", + invalidNpub: "Αυτό δεν μοιάζει με έγκυρο npub.", + noteLabel: "Σημείωση", + optional: "(προαιρετικό)", + notePlaceholder: "Έλα να skate-άρουμε μαζί…", + inviteAsAdmin: "Πρόσκληση ως διαχειριστής", + inviteAsAdminDesc: "Μπορεί να διαχειρίζεται το crew & να προσκαλεί άλλους.", + sendButton: "Αποστολή πρόσκλησης", + sendFooter: "Θα λάβουν ειδοποίηση για αποδοχή ή απόρριψη. Η συμμετοχή μετρά μόνο όταν αποδεχτούν.", + inviteLink: "Σύνδεσμος πρόσκλησης", + messageLabel: "Μήνυμα", + copyMessage: "Αντιγραφή μηνύματος", + founderHint: "Ως ιδρυτής μπορείς επίσης να προσθέσεις απευθείας το κλειδί ενός μέλους, και μετά αυτό επιβεβαιώνει.", + addMemberSettings: "Προσθήκη μέλους στις ρυθμίσεις crew" + }, + joinRequest: { + moreCount: "+{{count}} ακόμη", + addedTitle: "Ο/Η {{name}} προστέθηκε στο {{crew}} 🛹", + addedDesc: "Θα επιβεβαιώσει από την πλευρά του/της για να εμφανιστεί ως μέλος.", + vouchedTitle: "Εγγυήθηκες για τον/την {{name}} 🤝", + vouchedDesc: "Ο ιδρυτής του {{crew}} θα δει τη σύστασή σου και μπορεί να τον/την προσθέσει.", + couldNotEndorse: "Δεν ήταν δυνατή η σύσταση", + endorsedDoneA: "Εγγυήθηκες για τον/την", + endorsedDoneB: "— ο ιδρυτής θα επιβεβαιώσει", + vouchedBy: "Με εγγύηση από", + approveAndAdd: "Έγκριση & προσθήκη", + addToCrew: "Προσθήκη στο crew", + vouchedWaiting: "Με εγγύηση — αναμονή του ιδρυτή", + vouchForThem: "Εγγυήσου γι' αυτόν/αυτήν", + leadershipOnly: "Μόνο για την ηγεσία του crew.", + adminHelp: "Οι διαχειριστές δεν μπορούν να προσθέσουν μέλη απευθείας — η εγγύηση λέει στον ιδρυτή ότι στηρίζεις αυτόν τον rider." + }, + leadership: { + teamLeader: "Team Leader", + captain: "Captain", + verifiedMember: "Επαληθευμένο μέλος", + messageName: "Μήνυμα στον/στην {{name}}", + title: "Ηγεσία", + captainsOne: "{{count}} Captain", + captainsMany: "{{count}} Captains", + footer: "Ο Team Leader τρέχει το ρόστερ· οι Captains βοηθούν στις προσκλήσεις, διοργανώνουν jams και κρατούν το crew τακτοποιημένο." + }, + linkField: { + title: "Συνδεδεμένο Crew", + description: "Τρέχεις κι εσύ ένα crew; Σύνδεσέ το ώστε να μπορούν να πηγαινοέρχονται μεταξύ του studio και του crew σου. Προαιρετικό. Σύνδεσε αυτό το crew πίσω στο προφίλ από τον editor crew και θα εμφανίσει ένα πράσινο", + descriptionRest: "σήμα και στα δύο.", + none: "Δεν έχεις crews ακόμη. Δημιούργησε ένα στη σελίδα Crews για να το συνδέσεις εδώ.", + linkedCrew: "Συνδεδεμένο crew ({{id}})" + }, + lookingFor: { + title: "Open Call", + subtitle: "Αυτό το crew ψάχνει για:" + }, + memberVisibility: { + updatedTitle: "Η ορατότητα ενημερώθηκε", + updatedCrew: "Τώρα εμφανίζεσαι μόνο στους συμμαθητές του crew.", + updatedPublic: "Τώρα εμφανίζεσαι δημόσια σε αυτό το crew.", + couldNotUpdate: "Δεν ήταν δυνατή η ενημέρωση", + title: "Η ορατότητά σου σε αυτό το crew", + save: "Αποθήκευση ορατότητας" + }, + newMessage: { + inCrew: "Στο crew σου: {{crews}}", + crewmate: "Συμμαθητής crew", + following: "Ακολουθείς", + invalidKey: "Αυτό δεν μοιάζει με έγκυρο npub ή δημόσιο κλειδί.", + description: "Αναζήτησε τα άτομά σου με όνομα, ή επικόλλησε ένα npub για να στείλεις μήνυμα σε οποιονδήποτε. Επίλεξε δύο ή περισσότερα για να ξεκινήσεις ένα group.", + searchPlaceholder: "Αναζήτηση ονόματος ή επικόλληση npub1...", + messageThisKey: "Μήνυμα σε αυτό το κλειδί", + loadingPeople: "Φόρτωση των ατόμων σου...", + noPeople: "Δεν υπάρχουν συμμαθητές crew ή follows ακόμη.", + noPeopleHint: "Επικόλλησε το npub κάποιου παραπάνω για να ξεκινήσεις μια συνομιλία.", + yourCrews: "Τα crews σου", + selected: "{{count}} επιλεγμένα", + startGroup: "Έναρξη group ({{count}})", + message: "Μήνυμα" + }, + nip05: { + mismatch: "Αυτός ο domain δείχνει το handle σε διαφορετικό κλειδί Nostr από τον ιδρυτή του crew. Μη επαληθευμένο.", + verified: "Επαληθευμένο — ο domain επιβεβαιώνει ότι αυτό το handle ανήκει στο κλειδί του ιδρυτή του crew." + }, + requestCollective: { + sentTitle: "Το αίτημα στάλθηκε 🤝", + sentDesc: "Ο/Η {{name}} θα το δει στις ειδοποιήσεις του/της και μπορεί να σε προσθέσει.", + couldNotSend: "Δεν ήταν δυνατή η αποστολή αιτήματος", + title: "Μπες σε αυτή την κολεκτίβα", + waiting: "Το αίτημα στάλθηκε — αναμονή του/της {{name}}.", + askA: "Ζήτησε από το crew πίσω από", + askB: "να σε προσθέσει στο ρόστερ. Θα λάβουν ειδοποίηση και μπορούν να σε προσθέσουν με ένα πάτημα.", + placeholder: "Προαιρετικό: πες γιατί ταιριάζεις…", + sendButton: "Αποστολή αιτήματος" + }, + requestToJoin: { + sentTitle: "Το αίτημα στάλθηκε! 🛹", + sentDesc: "Η ηγεσία του {{crew}} θα το δει στις ειδοποιήσεις της.", + couldNotSend: "Δεν ήταν δυνατή η αποστολή αιτήματος", + trigger: "Αίτημα συμμετοχής", + title: "Μπες στο {{crew}}", + description: "Ειδοποιεί τον ιδρυτή & τους διαχειριστές του crew ώστε να σε προσθέσουν.", + placeholder: "Πες γεια — πού skate-άρεις, ποιους ξέρεις, γιατί θέλεις να μπεις…", + sending: "Αποστολή…", + sendButton: "Αποστολή αιτήματος συμμετοχής" + }, + sponsorBanner: { + loading: "Φόρτωση χορηγού…", + sponsoredBy: "Με χορηγία από" + }, + sponsorPicker: { + selected: "Ο χορηγός επιλέχθηκε", + setLoading: "Ο χορηγός ορίστηκε (φόρτωση καταστήματος…)", + set: "Ο χορηγός ορίστηκε", + clearAria: "Καθαρισμός χορηγού", + searchPlaceholder: "Αναζήτηση skate shops με όνομα ή πόλη…", + loading: "Φόρτωση καταστημάτων…", + noMatch: "Κανένα κατάστημα δεν ταιριάζει — δοκίμασε διαφορετική αναζήτηση.", + none: "Δεν βρέθηκαν καταστήματα ακόμη." + }, + treasury: { + title: "Ταμείο Crew", + ofGoal: "από στόχο {{target}}", + goalReached: "Ο στόχος επιτεύχθηκε!", + funded: "{{percent}}% χρηματοδοτημένο", + contributionOne: "{{count}} συνεισφορά", + contributionMany: "{{count}} συνεισφορές", + daysLeft: "απομένουν {{days}}η", + closed: "έκλεισε", + nonCustodial: "Μη θεματοφυλακής · τα zaps πάνε απευθείας στο πορτοφόλι Lightning του crew" + }, + userStatus: { + atSpot: "📍 Σε ένα spot", + autoClears: "⏱️ Καθαρίζει αυτόματα σε {{min}} λεπτά" + }, + video: { + title: "Το Part", + fullVideo: "Πλήρες βίντεο · montage", + latestClip: "Τελευταίο clip", + watch: "Παρακολούθηση", + iframeTitle: "{{crew}} — βίντεο", + playAria: "Αναπαραγωγή βίντεο {{crew}}", + thumbAlt: "Μικρογραφία βίντεο {{crew}}", + instagramTitle: "Clip Instagram" + }, + vouch: { + removedTitle: "Η εγγύηση αφαιρέθηκε", + vouchedTitle: "Εγγυήθηκες!", + removedDesc: "Δεν εγγυάσαι πλέον για τον/την {{name}}.", + vouchedDesc: "Εγγυήθηκες για τον/την {{name}}. Η σκηνή εμπιστεύεται τα δικά της μέλη.", + couldNotVouch: "Δεν ήταν δυνατή η εγγύηση", + title: "Εγγυήσεις σκηνής", + sceneVerified: "Επαληθευμένο από τη σκηνή", + vouched: "Με εγγύηση", + newUnvouched: "Νέο · χωρίς εγγύηση", + checking: "Έλεγχος της σκηνής…", + empty: "Δεν υπάρχουν εγγυήσεις ακόμη. Οι εγγυήσεις από skaters στους κύκλους σου είναι το καλύτερο σήμα ότι κάποιος είναι αυθεντικός — όχι ένας τυχαίος που πέρασε.", + countOne: "{{count}} εγγύηση", + countMany: "{{count}} εγγυήσεις", + trusted: "{{count}} από skaters στο δίκτυο εμπιστοσύνης σου", + remove: "Αφαίρεση εγγύησης", + vouchFor: "Εγγυήσου για τον/την {{name}}", + ownerNote: "Οι skaters που ξέρουν τη δουλειά σου μπορούν να εγγυηθούν για σένα εδώ." + } + } +}; + +export default elBatch5; diff --git a/src/i18n/el/batch6.ts b/src/i18n/el/batch6.ts new file mode 100644 index 0000000..781636a --- /dev/null +++ b/src/i18n/el/batch6.ts @@ -0,0 +1,4 @@ +/** el — batch 6. Filled by the translation pass; empty until then. */ +const elBatch6 = {}; + +export default elBatch6; diff --git a/src/i18n/el/batch7.ts b/src/i18n/el/batch7.ts new file mode 100644 index 0000000..c569925 --- /dev/null +++ b/src/i18n/el/batch7.ts @@ -0,0 +1,4 @@ +/** el — batch 7. Filled by the translation pass; empty until then. */ +const elBatch7 = {}; + +export default elBatch7; diff --git a/src/i18n/el/batch8.ts b/src/i18n/el/batch8.ts new file mode 100644 index 0000000..39b7537 --- /dev/null +++ b/src/i18n/el/batch8.ts @@ -0,0 +1,4 @@ +/** el — batch 8. Filled by the translation pass; empty until then. */ +const elBatch8 = {}; + +export default elBatch8; diff --git a/src/i18n/el/index.ts b/src/i18n/el/index.ts new file mode 100644 index 0000000..d1130bb --- /dev/null +++ b/src/i18n/el/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const el = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default el; diff --git a/src/i18n/id/batch1.ts b/src/i18n/id/batch1.ts new file mode 100644 index 0000000..8bb29de --- /dev/null +++ b/src/i18n/id/batch1.ts @@ -0,0 +1,4 @@ +/** id — batch 1. Filled by the translation pass; empty until then. */ +const idBatch1 = {}; + +export default idBatch1; diff --git a/src/i18n/id/batch2.ts b/src/i18n/id/batch2.ts new file mode 100644 index 0000000..4ae9754 --- /dev/null +++ b/src/i18n/id/batch2.ts @@ -0,0 +1,4 @@ +/** id — batch 2. Filled by the translation pass; empty until then. */ +const idBatch2 = {}; + +export default idBatch2; diff --git a/src/i18n/id/batch3.ts b/src/i18n/id/batch3.ts new file mode 100644 index 0000000..fb4cd7c --- /dev/null +++ b/src/i18n/id/batch3.ts @@ -0,0 +1,4 @@ +/** id — batch 3. Filled by the translation pass; empty until then. */ +const idBatch3 = {}; + +export default idBatch3; diff --git a/src/i18n/id/batch4.ts b/src/i18n/id/batch4.ts new file mode 100644 index 0000000..0bcb324 --- /dev/null +++ b/src/i18n/id/batch4.ts @@ -0,0 +1,4 @@ +/** id — batch 4. Filled by the translation pass; empty until then. */ +const idBatch4 = {}; + +export default idBatch4; diff --git a/src/i18n/id/batch5.ts b/src/i18n/id/batch5.ts new file mode 100644 index 0000000..b12b677 --- /dev/null +++ b/src/i18n/id/batch5.ts @@ -0,0 +1,4 @@ +/** id — batch 5. Filled by the translation pass; empty until then. */ +const idBatch5 = {}; + +export default idBatch5; diff --git a/src/i18n/id/batch6.ts b/src/i18n/id/batch6.ts new file mode 100644 index 0000000..6db573a --- /dev/null +++ b/src/i18n/id/batch6.ts @@ -0,0 +1,4 @@ +/** id — batch 6. Filled by the translation pass; empty until then. */ +const idBatch6 = {}; + +export default idBatch6; diff --git a/src/i18n/id/batch7.ts b/src/i18n/id/batch7.ts new file mode 100644 index 0000000..73f241c --- /dev/null +++ b/src/i18n/id/batch7.ts @@ -0,0 +1,4 @@ +/** id — batch 7. Filled by the translation pass; empty until then. */ +const idBatch7 = {}; + +export default idBatch7; diff --git a/src/i18n/id/batch8.ts b/src/i18n/id/batch8.ts new file mode 100644 index 0000000..9a61a01 --- /dev/null +++ b/src/i18n/id/batch8.ts @@ -0,0 +1,4 @@ +/** id — batch 8. Filled by the translation pass; empty until then. */ +const idBatch8 = {}; + +export default idBatch8; diff --git a/src/i18n/id/index.ts b/src/i18n/id/index.ts new file mode 100644 index 0000000..53b6f64 --- /dev/null +++ b/src/i18n/id/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const id = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default id; diff --git a/src/i18n/ro/batch1.ts b/src/i18n/ro/batch1.ts new file mode 100644 index 0000000..57d73f1 --- /dev/null +++ b/src/i18n/ro/batch1.ts @@ -0,0 +1,4 @@ +/** ro — batch 1. Filled by the translation pass; empty until then. */ +const roBatch1 = {}; + +export default roBatch1; diff --git a/src/i18n/ro/batch2.ts b/src/i18n/ro/batch2.ts new file mode 100644 index 0000000..ed75222 --- /dev/null +++ b/src/i18n/ro/batch2.ts @@ -0,0 +1,1653 @@ +/** ro — batch 2. Filled by the Romanian translation pass. */ +const roBatch2 = { + mapUi: { + mapFooter: { + links: "Linkuri", + hide: "Ascunde bara de linkuri a hărții", + }, + findingSpots: "Se caută spoturi", + loadingSpots: "Se încarcă spoturile", + loadingMap: "Se încarcă harta...", + mapViewAria: "Vizualizare hartă", + listViewAria: "Vizualizare listă", + layers: "Straturi", + mapLayers: "Straturi hartă", + showOnMap: "Arată pe hartă", + showResults: "Arată rezultatele", + quickActions: "Acțiuni rapide", + spots: "Spoturi", + shops: "Magazine", + gear: "Echipament", + tours: "Tururi", + events: "Evenimente", + crews: "Crews", + spotType: "Tip de spot", + sortBy: "Sortează după", + trustLevel: "Nivel de încredere", + weather: "Vremea", + buySellGear: "Cumpără/vinde echipament", + stash: "Stash", + more: "Mai multe", + newHere: "Ești nou?", + welcomeDesc: "Descoperă spoturi de skate, evenimente și comunitatea.", + getOnZapstore: "Ia Zapstore", + dismiss: "Închide", + addedBy: "Adăugat de", + directions: "Indicații", + viewDetails: "Vezi detalii", + viewDetailsArrow: "Vezi detalii →", + spotDetails: "Detalii spot", + skateShop: "Skate Shop", + skateSpot: "Skate Spot", + youAreHere: "Ești aici", + conditions: "Condiții", + weatherScoreSuffix: "{{score}}/100 vremea", + wind: "Vânt", + humidity: "Umiditate", + airQuality: "Calitatea aerului", + threeDayForecast: "Prognoză pe 3 zile", + gearForSale: "Echipament de vânzare ({{count}})", + viewItems: "Vezi articole →", + viewAllItems: "Vezi toate {{count}} articolele →", + viewGear: "Vezi echipament →", + localTour: "Tur local", + meetAt: "Întâlnire la: {{place}}", + hours: "{{count}} ore", + level: "nivel {{level}}", + viewTour: "Vezi turul →", + upcomingEvent: "Eveniment viitor", + viewEvent: "Vezi evenimentul →", + skateCrew: "Skate Crew", + members: "{{count}} membri", + since: "Din {{year}}", + viewCrew: "Vezi crew-ul →", + acceptsBitcoin: "Acceptă Bitcoin", + boosted: "Promovat", + website: "Site web", + offlineSavedSpots: "Offline · se afișează spoturile salvate", + cantReachRelays: "Nu se poate ajunge la relay-uri", + relayOnlineNoAnswer: "Ești online, dar relay-ul comunității nu răspunde acum.", + youreOffline: "Ești offline.", + savedOnDevice: "Spoturile pe care le-ai văzut deja sunt salvate pe acest dispozitiv și vor apărea aici.", + noSpotsMatchTitle: "Niciun spot nu corespunde", + noSpotsMatchDesc: "Încearcă o altă căutare sau șterge filtrele.", + noSpotsMappedYet: "Niciun spot cartografiat încă", + noSpotsMappedDesc: "Fii primul care își cartografiază parkul — durează un minut, e al tău, iar următorul skater care trece pe acolo îți va mulțumi.", + addFirstSpot: "Adaugă primul spot", + findSpotsNearMe: "Găsește spoturi lângă mine", + locating: "Se localizează…", + refiningLocation: "Se rafinează locația…", + refiningLocationDesc: "Centrat pe ultimul tău spot — se obține o nouă poziție GPS.", + locatingYou: "Te localizăm…", + locatingDesc: "Se obține poziția GPS. Prima dată poate dura până la un minut.", + foundYou: "Te-am găsit", + foundYouDesc: "Harta a fost centrată pe locația ta.", + locationPermissionNeeded: "Permisiune de locație necesară", + permissionNeededDesc: "Permite locația pentru SkateSpots în Setările dispozitivului → Aplicații → SkateSpots → Permisiuni, apoi apasă din nou pe Lângă mine.", + locationTimedOut: "Locația a expirat", + timeoutNativeDesc: "Nu s-a putut obține o poziție la timp. Dacă ești în interior, GPS-ul nu poate vedea sateliții — activează Localizarea prin rețea (Setări → Locație) sau ieși afară, apoi încearcă din nou.", + timeoutWebDesc: "Nu s-a putut obține locația la timp. Verifică semnalul și încearcă din nou.", + noLocationProvider: "Niciun furnizor de locație", + noProviderNativeDesc: "Telefonul tău nu oferă o locație. Pe ROM-uri axate pe confidențialitate (de ex. GrapheneOS) activează Localizarea prin rețea în Setări → Locație, sau asigură-te că GPS-ul este pornit și încearcă afară.", + noProviderWebDesc: "Nu este disponibil niciun furnizor de locație. Activează serviciile de locație și încearcă din nou.", + locationUnavailable: "Locație indisponibilă", + unavailableNativeDesc: "Pornește Locația/GPS în setările telefonului, permite locația pentru SkateSpots (Setări → Aplicații → SkateSpots → Permisiuni), apoi încearcă din nou.", + unavailableWebDesc: "Locația ta nu a putut fi determinată. Asigură-te că serviciile de locație sunt activate.", + locationBlocked: "Locație blocată", + locationBlockedDesc: "Browserul tău a blocat accesul la locație pentru acest site. Iată cum să îl reactivezi:", + locationPlatformAndroid: "Android Chrome", + locationPlatformIos: "iOS Safari", + locationPlatformDesktop: "Desktop Chrome", + locationPlatformFirefox: "Firefox", + locationStepsAndroid: "Apasă pictograma lacăt din bara de adrese → Setări site → Locație → Permite", + locationStepsIos: "Aplicația Setări → Safari → Locație → Permite (sau apasă butonul \"AA\" din bara de adrese a Safari)", + locationStepsDesktop: "Apasă pictograma lacăt → Setări site → Locație → Permite", + locationStepsFirefox: "Apasă pictograma lacăt → Conexiune securizată → Mai multe informații → Permisiuni → Accesează locația → Permite", + gotIt: "Am înțeles", + addSpot: "Adaugă spot", + addShop: "Adaugă magazin", + addEvent: "Adaugă eveniment", + addSpotHereTitle: "Adaugi un spot aici?", + addSpotHereDesc: "Plasează un pin unde ai apăsat", + sellGear: "Vinde echipament", + offerTour: "Oferă un tur", + closeAddMenu: "Închide meniul de adăugare", + addMenuAria: "Adaugă spot, magazin, eveniment, echipament sau tur", + localChat: "Chat local", + localChatDesc: "Chat live pentru oriunde este centrată harta. Alege cât de larg ajunge canalul.", + btcMapShowing: "Se afișează {{count}} locuri unde îți poți Spedn sats în apropiere", + btcMapShow: "Arată locuri unde îți poți Spedn sats (prin BTC Map)", + yourPrivateStash: "Stash-ul tău privat", + stashIntro: "Urmărește-ți echipamentul, stabilește prețuri și găsește schimburi cu alți skateri.", + encryptionRequired: "Criptare necesară", + encryptionRequiredDesc: "Folosește un semnatar cu suport NIP-44 (Alby, nos2x, Amber).", + myStash: "Stash-ul meu", + encrypted: "Criptat", + itemsCount: "{{count}} articole", + items: "Articole", + wishlist: "Listă de dorințe", + types: "Tipuri", + stashEmpty: "Stash-ul tău este gol", + addFirstItem: "Adaugă primul articol", + wishlistCount: "Listă de dorințe ({{count}})", + myGearCount: "Echipamentul meu ({{count}})", + openFullStash: "Deschide Stash-ul complet", + addItem: "Adaugă articol", + searchSpotsPlaceholder: "Caută spoturi...", + selected: "Selectat", + noSpotsFound: "Niciun spot găsit. Încearcă o altă căutare.", + addingSpotsHint: "Adăugarea spoturilor îi ajută pe utilizatori să te găsească atunci când navighează locații specifice", + report: "Raportează", + spotSingular: "1 spot", + spotPlural: "{{count}} spoturi", + view: "Vezi", + myCollections: "Colecțiile mele", + collectionsSubtitle: "Organizează-ți spoturile preferate în liste personalizate", + newCollection: "Colecție nouă", + loginToCreate: "Autentifică-te pentru a crea colecții", + loginToCreateDesc: "Salvează-ți spoturile preferate în liste personalizate precum \"Barcelona Trip 2024\" sau \"Best Rails in LA\"", + noCollections: "Nicio colecție încă", + noCollectionsDesc: "Creează-ți prima colecție pentru a începe organizarea spoturilor", + createFirstCollection: "Creează prima colecție", + createNewCollection: "Creează colecție nouă", + createCollectionDesc: "Dă colecției un nume și o descriere opțională", + collectionName: "Numele colecției", + collectionNamePlaceholder: "Barcelona Trip 2024", + descriptionOptional: "Descriere (opțional)", + descriptionPlaceholder: "Spoturile mele preferate din călătoria la Barcelona...", + creating: "Se creează...", + createCollection: "Creează colecția", + editCollection: "Editează colecția", + saving: "Se salvează...", + saveChanges: "Salvează modificările", + deleteCollectionTitle: "Ștergi colecția?", + deleteCollectionDesc: "Aceasta va șterge definitiv \"{{title}}\". Spoturile în sine nu vor fi afectate.", + deleting: "Se șterge...", + collectionCreated: "Colecție creată!", + collectionCreatedDesc: "\"{{title}}\" este pregătită pentru spoturi", + collectionCreateFailed: "Crearea colecției a eșuat", + collectionUpdated: "Colecție actualizată!", + changesSaved: "Modificările tale au fost salvate", + collectionUpdateFailed: "Actualizarea colecției a eșuat", + collectionDeleted: "Colecție ștearsă", + collectionDeletedDesc: "\"{{title}}\" a fost eliminată", + collectionDeleteFailed: "Ștergerea colecției a eșuat", + somethingWentWrong: "Ceva a mers prost", + }, + mapPage: { + title: "Magazine și spoturi", + spots: "Spoturi", + shops: "Magazine", + filters: "Filtre", + listView: "Listă", + mapView: "Hartă", + nearMe: "Lângă mine", + searchPlaceholder: "Caută spoturi...", + noSpotsInArea: "Niciun spot în această zonă", + zoomIn: "Mărește", + zoomOut: "Micșorează", + myLocation: "Locația mea", + locationsFound: "{{count}} locații găsite", + spotsOnly: "Doar spoturi", + shopsOnly: "Doar magazine", + spotsAndShops: "Spoturi și magazine", + noSpotsMatch: "Niciun spot nu corespunde filtrelor tale.", + noSpotsYet: "Nu au fost adăugate spoturi încă.", + addFirstSpot: "Adaugă primul spot", + }, + spotUi: { + claim: { + areYouOwner: "Acesta este spotul tău?", + privateDesc: "Acest spot este marcat privat. Dacă îl deții sau îl administrezi, revendică-l — un moderator SkateSpots confirmă proprietatea, apoi preiei anunțul.", + claimSpot: "Revendică acest spot", + nip05Required: "Ai nevoie de un NIP-05 verificat pentru a revendica un spot privat (dovadă că deții o identitate Nostr). Adaugă unul în profil, apoi revino.", + addNip05: "Adaugă NIP-05 în Setări", + pendingTitle: "Revendicare în așteptarea verificării", + pendingDesc: "Revendicarea ta a fost trimisă. Un moderator SkateSpots o va verifica — poți finaliza revendicarea spotului după ce este aprobată.", + approvedTitle: "Revendicare aprobată", + approvedDesc: "Un moderator ți-a aprobat revendicarea. Finalizează pentru a deveni proprietarul acestui spot.", + complete: "Finalizează revendicarea", + submitted: "Revendicare trimisă", + submittedDesc: "Un moderator îți va verifica revendicarea. Vei prelua spotul după ce este aprobată.", + submitFailed: "Revendicarea nu a putut fi trimisă", + submit: "Trimite revendicarea", + submitting: "Se trimite…", + confirmTitle: "Revendici \"{{title}}\"?", + confirmIntro: "Cerisă devii proprietarul acestui spot privat.", + confirmBullet1: "Un moderator SkateSpots verifică cererea (nu putem verifica proprietatea, doar cheile Nostr)", + confirmBullet2: "Dacă este aprobată, finalizezi revendicarea pentru a deveni proprietar și poți edita spotul", + confirmBullet3: "Spotul original rămâne pe Nostr — rețeaua este descentralizată", + adminTitle: "Revendicări de proprietate în așteptare", + adminApprove: "Aprobă", + adminApproved: "Aprobat", + adminApprovedDesc: "Acum pot finaliza revendicarea spotului.", + adminApproveFailed: "Revendicarea nu a putut fi aprobată", + loginRequired: "Autentifică-te pentru a revendica acest spot privat sau pentru a solicita proprietatea.", + }, + abandonedDesc: "Ultima actualizare {{time}}. Dacă proprietarul original este inactiv, poți revendica acest spot pentru a-l întreține și îmbunătăți.", + claimedNotice: "Anunț revendicat", + claimedNoticeDesc: "Acest spot a fost republicat de un proprietar nou după o revendicare. Anunțul original poate exista în continuare separat.", + abandonedLoginDesc: "Ultima actualizare {{time}}. Autentifică-te pentru a revendica și întreține acest spot.", + accessDeniedDesc: "Poți edita doar spoturile pe care le-ai creat.", + accessDeniedTitle: "Acces interzis", + addAtLeastOneTag: "Te rugăm să adaugi cel puțin un tag.", + additionalDetails: "Detalii suplimentare (opțional)", + additionalDetailsPlaceholder: "Oferă orice context suplimentar care ar putea ajuta...", + addNewTags: "Adaugă taguri noi:", + addNip05InSettings: "Adaugă NIP-05 în Setări", + addPhoto: "Adaugă o fotografie", + addPhotoDesc: "Contribuie cu o fotografie pentru a-i ajuta pe alții să descopere acest spot.", + addPhotoOrDescription: "Adaugă o fotografie sau o descriere", + addPhotoOrDescriptionDesc: "Dă-le skaterilor ceva pe care să se bazeze — o poză sau o frază despre loc.", + addPhotos: "Adaugă fotografii", + addPhotoToSpot: "Adaugă fotografie la spot", + adminDeleteDialogDesc: "Ca administrator SkateSpots, elimini \"{{title}}\". Va fi ascuns în toată aplicația pentru toți, iar o cerere de ștergere va fi trimisă către relay-uri.", + adminDeleteReason: "Administratorul SkateSpots a eliminat spotul \"{{title}}\"", + airQuality: "Calitatea aerului", + altSkateSpot: "Skate spot: {{title}}", + areYouShopOwner: "Ești proprietarul magazinului?", + askBeforeSkating: "Întreabă înainte de a skata", + backToSpot: "Înapoi la spot", + beFirstToListGear: "Fii primul care listează echipament la acest spot!", + beFirstToSay: "Fii primul care spune ceva.", + byAuthor: "de {{name}}", + captionPlaceholder: "Adaugă o legendă (opțional) - descrie ce este în fotografie, când a fost făcută etc.", + chatPublicNote: "Oricine poate citi acest lucru — mesajele sunt publice și efemere. Pentru chat privat, folosește Mesajele directe.", + checkPinBelow: "Verifică pinul de mai jos înainte de a adăuga un duplicat.", + claimBullet1: "Devii proprietar și poți edita spotul", + claimBullet2: "Spotul original rămâne (Nostr este descentralizat)", + claimBullet3: "Versiunea ta poate apărea alături de original", + claimFailed: "Revendicarea a eșuat", + claiming: "Se revendică...", + claimIntro: "Ești pe punctul de a revendica proprietatea acestui spot. Aceasta va crea propria versiune a spotului, pe care o poți edita și întreține.", + claimSpot: "Revendică spotul", + claimThisSpot: "Revendică acest spot", + claimTitle: "Revendici \"{{title}}\"?", + claimWhatHappens: "Ce se întâmplă când revendici:", + coachesAndFilmersAvailable: "Antrenori și filmers disponibili la acest spot", + coachesCount: "Antrenori ({{count}})", + coachHere: "Coach aici", + community: "Comunitate", + communityVerified: "Verificat de comunitate", + communityVerifiedTitle: "Un alt skater a contribuit aici (fotografie sau raport de stare).", + conditions: "Condiții", + contactForPermission: "Contactează pentru permisiune", + contactInfo: "Informații de contact", + contributePhoto: "Contribuie cu o fotografie", + contributing: "Se contribuie...", + couldNotSendMessage: "Mesajul nu a putut fi trimis.", + couldNotSubmit: "Nu s-a putut trimite", + couldNotUploadPhoto: "Fotografia nu a putut fi încărcată. Poți adăuga una mai jos.", + crewsThatSkateHere: "Crews care skatază aici", + current: "Actual:", + currentTags: "Tagurile actuale ale acestui spot:", + daysAgo: "acum {{count}} zi", + daysAgoPlural: "acum {{count}} zile", + deleteDialogDesc: "Aceasta va șterge definitiv \"{{title}}\" de pe toate relay-urile. Această acțiune nu poate fi anulată.", + deletedSpotReason: "Spot șters", + deleteFailed: "Ștergerea a eșuat", + deleteSpot: "Șterge spotul", + deleteSpotTitle: "Ștergi spotul?", + differentSpotPublishAnyway: "Este un spot diferit — publică oricum", + dragDropOrClick: "Trage și plasează sau apasă", + dropPhotos: "Plasează fotografii", + duplicateOne: "Există un spot la mai puțin de 60 m de pinul tău. Dacă este același loc, adaugă acolo fotografia sau un raport de stare în loc să creezi un duplicat.", + duplicateOther: "Există spoturi la mai puțin de 60 m de pinul tău. Dacă este același loc, adaugă acolo fotografia sau un raport de stare în loc să creezi un duplicat.", + editSpotSeoDesc: "Editează-ți spotul de skateboarding.", + failedToContribute: "Contribuția a eșuat", + failedToPublish: "Publicarea a eșuat", + failedToPublishDesc: "Ceva a mers prost. Verifică consola pentru detalii.", + failedToSubmitReport: "Raportul nu a putut fi trimis", + failedToSuggestTags: "Sugerarea tagurilor a eșuat", + failedToUpdate: "Actualizarea a eșuat", + failedToUploadImage: "Încărcarea imaginii a eșuat", + failedToUploadPhoto: "Încărcarea fotografiei a eșuat", + feelsLikeTemp: "Se simte ca {{temp}}°C", + filmersCount: "Filmers ({{count}})", + filmHere: "Filmează aici", + gearSwap: "Schimb de echipament", + geolocationNotSupported: "Geolocația nu este acceptată", + geolocationNotSupportedDesc: "Browserul tău nu acceptă geolocația.", + getDirections: "Obține indicații", + hangTight: "Ai răbdare", + hangTightDesc: "Fotografia ta încă se încarcă. Va fi atașată într-o secundă.", + helpImproveSpot: "Ajută la îmbunătățirea acestui spot adăugând fotografii sau sugerând taguri", + hiddenByModerator: "Ascuns de un moderator", + hiddenByModeratorDesc: "Acest spot nu este afișat pe hartă sau în căutare. Îl poți vedea în continuare pentru că este al tău. Editarea lui nu îl va dezvălui — rămâne ascuns până când un moderator retrage verdictul.", + humidity: "Umiditate", + imageUploaded: "Imagine încărcată", + imageUploadedDesc: "Imaginea ta a fost încărcată cu succes.", + imHere: "Sunt aici", + invalidCoordinates: "Coordonate invalide", + invalidCoordinatesDesc: "Te rugăm să introduci latitudine (-90 până la 90) și longitudine (-180 până la 180) valide.", + invalidNpub: "npub invalid", + invalidNpubDesc: "Te rugăm să introduci o adresă npub validă.", + lastReported: "ultima dată {{time}}", + listGear: "Listează echipament", + listYourGearHere: "Listează-ți echipamentul aici", + loadingChat: "Se încarcă chatul…", + locationError: "Eroare de locație", + locationFound: "Locație găsită", + locationFoundDesc: "Locația ta actuală a fost setată.", + locationRequired: "Locație necesară", + locationRequiredDesc: "Te rugăm să introduci coordonate sau să folosești locația actuală.", + loginRequiredTitle: "Autentificare necesară", + logInToChat: "Autentifică-te pentru a te alătura chatului local.", + logInToContributePhotos: "Autentifică-te pentru a contribui cu fotografii", + loginToEditSpot: "Trebuie să te autentifici pentru a edita acest spot.", + logInToReport: "Trebuie să fii autentificat pentru a raporta conținut.", + logInToReportStatus: "Autentifică-te pentru a raporta starea acestui spot.", + logInToSuggestTags: "Autentifică-te pentru a sugera taguri", + manageNip05ToClaim: "Gestionează NIP-05 pentru a revendica", + meetAtSpotForPickup: "💡 Întâlnește-te la acest spot pentru o preluare sigură", + memberOne: "{{count}} membru", + memberOther: "{{count}} membri", + messageFailed: "Mesajul a eșuat", + messageMapper: "Message Mapper", + messagePlaceholder: "Trimite un mesaj acestui spot… (încearcă /me sau /who)", + messagesHiddenOne: "{{count}} mesaj ascuns de filtrul tău de încredere. Scade filtrul pentru a vedea mai multe.", + messagesHiddenOther: "{{count}} mesaje ascunse de filtrul tău de încredere. Scade filtrul pentru a vedea mai multe.", + messagesHiddenShortOne: "{{count}} mesaj ascuns de filtrul tău de încredere", + messagesHiddenShortOther: "{{count}} mesaje ascunse de filtrul tău de încredere", + metresAway: "{{distance}} m distanță", + moderatorVouchedDesc: "Un moderator a verificat acest spot și l-a recomandat. Bravo.", + monthsAgo: "acum {{count}} lună", + monthsAgoPlural: "acum {{count}} luni", + newOwnerNpub: "npub-ul noului proprietar", + newOwnerNpubHint: "Introdu npub-ul utilizatorului căruia vrei să transferi acest spot.", + nip05RequiredToClaim: "⚠️ Verificare NIP-05 necesară pentru a revendica magazine", + noCommunitySignalTitle: "Încă nicio fotografie sau raport de stare din comunitate — nimeni nu a confirmat acest loc.", + breakdownPhotos: "{{count}} fotografie(i)", + breakdownStatus: "{{count}} raport(uri) de stare", + breakdownComments: "{{count}} comentariu(i)", + breakdownReactions: "{{count}} reacție(i)", + breakdownCollections: "{{count}} salvare(i)", + breakdownZaps: "{{count}} zap(uri)", + breakdownTags: "{{count}} sugestie(i) de tag", + breakdownCrews: "{{count}} crew(uri)", + breakdownLab: "{{count}} link(uri) pro", + verifyNudgeTitle: "Fii primul care confirmă acest spot", + verifyNudgeBody: "O fotografie sau un „am skatat aici” este modul în care un spot devine verificat — ajută următorul skater.", + verifyNudgeStatus: "Am skatat aici", + communityChip: "Comunitate", + seenChip: "Văzut", + noGearListedYet: "Niciun echipament listat încă", + noMessagesYet: "Niciun mesaj încă în acest canal local. Salută — „skatează cineva diseară?”", + noPhoto: "Fără fotografie", + noReportsYet: "Niciun raport încă", + noTags: "Fără taguri", + notASkateSpot: "Nu este un spot de skate", + offerServicesHere: "💡 Oferă-ți serviciile la acest spot", + photoCaptured: "Fotografie capturată!", + photoCapturedDesc: "Fotografia ta a fost încărcată cu succes.", + photoContributed: "Fotografie contribuită!", + photoContributedDesc: "Fotografia ta a fost adăugată la acest spot.", + photosAdded: "Fotografiile tale au fost adăugate.", + photosRecommended: "recomandate insistent — spoturile fără fotografie rămân marcate Neverificat", + photosUploaded: "{{count}} fotografii încărcate", + photoUploaded: "Fotografie încărcată", + photoUploadedDesc: "Adaugă o legendă și trimite pentru a contribui!", + photoUploadFailed: "Încărcarea fotografiei a eșuat", + pleaseTryAgain: "Te rugăm să încerci din nou", + public: "Public", + publicChatTitle: "Oricine poate citi mesajele din acest canal — este public și necriptat.", + recentReports: "Rapoarte recente", + recipientRequired: "Destinatar necesar", + recipientRequiredDesc: "Te rugăm să introduci npub-ul noului proprietar.", + removeAdmin: "Elimină (admin)", + removeSpot: "Elimină spotul", + removeSpotAdminTitle: "Elimini acest spot? (admin)", + reportOne: "raport", + reportContent: "Raportează conținut", + reportContentDesc: "Ajută la menținerea siguranței comunității raportând conținutul nepotrivit.", + reportedBySkaters: " de {{count}} skateri — în verificare. Dacă acesta este un spot real, adaugă o fotografie sau un raport de stare pentru a-l confirma.", + reportedNotASpot: "Raportat ca nefiind spot de skate", + reportingType: "Se raportează {{type}}", + reports: "rapoarte", + reportShop: "Raportează magazinul", + reportSpot: "Raportează spotul", + reportStatus: "Raportează starea", + reportSubmitted: "Raport trimis", + reportSubmittedDesc: "Mulțumim că ajuți la menținerea SkateSpots în siguranță.", + reportSubmittedLong: "Mulțumim că ajuți la menținerea SkateSpots în siguranță și corect. Raportul tău va fi verificat de membri de încredere ai comunității.", + reportSubmittedTitle: "Raport trimis", + report: { + notASkateSpot: { + label: "Nu este un spot de skate", + description: "O intrare de test sau un loc care nu este deloc pentru skate", + }, + fakeSpot: { + label: "Spot fals/inexistent", + description: "Acest spot nu există sau locația este greșită", + }, + stolenPhotos: { + label: "Fotografii furate/false", + description: "Fotografiile sunt imagini de stoc sau furate de altundeva", + }, + spamAd: { + label: "Spam sau publicitate", + description: "Conținut promoțional sau anunțuri duplicate", + }, + dangerousLocation: { + label: "Locație periculoasă", + description: "Proprietate privată, nesigură sau ilegal de accesat", + }, + inappropriateContent: { + label: "Conținut nepotrivit", + description: "Conține conținut ofensator sau pentru adulți", + }, + impersonation: { + label: "Impersonare", + description: "Cineva care se dă drept altcineva", + }, + other: { + label: "Altele", + description: "Ceva ce nu este listat mai sus", + }, + }, + targetType: { + spot: "Spot", + event: "Eveniment", + tour: "Tur", + shop: "Magazin", + user: "Utilizator", + listing: "Anunț", + coach: "Antrenor", + filmer: "Filmer", + }, + sameOwner: "Același proprietar", + sameOwnerDesc: "Nu se poate transfera către proprietarul actual.", + saveChanges: "Salvează modificările", + saving: "Se salvează...", + services: "Servicii", + shareSpotText: "Vezi acest spot de skate: {{title}}", + shelter: "Adăpost", + shelterHint: "Este acest spot expus la vreme? Îi ajută pe skateri să găsească spoturi uscate când plouă.", + shopClaimDesc: "Dacă deții sau administrezi acest magazin, îl poți revendica pentru a verifica proprietatea și a gestiona anunțul.", + shopClaimNip05Hint: "Pentru a revendica acest magazin, adaugă un identificator NIP-05 care corespunde domeniului site-ului magazinului.", + skatersActiveDesc: "Persoane care au postat în acest canal în ultimele 24 h.", + skatersActiveOne: "{{count}} skater activ aici", + skatersActiveOther: "{{count}} skateri activi aici", + skatersSellingGear: "Skaterii de la acest spot vând echipament", + skateSpot: "Skate Spot", + somethingWentWrong: "Ceva a mers prost", + spot: "Spot", + spotAdded: "Spot adăugat!", + spotAddedDesc: "Spotul tău de skate a fost publicat în rețea.", + spotAddedNoPhoto: "Publicat — și marcat Neverificat până când cineva adaugă o fotografie. O poză a spotului face o diferență mare.", + spotChat: "Chat de spot", + spotClaimed: "Spot revendicat!", + spotClaimedDesc: "Acum ești proprietarul acestui spot. Îl poți edita din profilul tău.", + spotDeleted: "Spot șters", + spotDeletedDesc: "Cerere de ștergere trimisă către relay-uri. Majoritatea relay-urilor vor elimina acest conținut.", + spotMayAlreadyBeOnMap: "Acest spot s-ar putea să fie deja pe hartă", + spotMayAlreadyExist: "Acest spot s-ar putea să existe deja", + spotMayBeAbandoned: "Spotul ar putea fi abandonat", + spotPhotoAlt: "Spot", + spotRemoved: "Spot eliminat", + spotRemovedDesc: "Acest spot a fost eliminat și va fi ascuns în tot SkateSpots.", + spotSeoDesc: "Vezi acest spot de skateboarding pe SkateSpots.", + spotStatus: "Starea spotului", + spotStatusDesc: "Mai este \"{{title}}\" skatabil? Anunță comunitatea despre starea lui actuală.", + spotTypeRequired: "Tip de spot necesar", + spotTypeRequiredDesc: "Te rugăm să alegi un tip de spot pentru ca skaterii să știe la ce se așteaptă.", + spotUpdated: "Spot actualizat!", + spotUpdatedDesc: "Modificările tale au fost publicate în rețea.", + staffVerifiedTitle: "Un administrator SkateSpots a verificat și recomandat acest spot.", + statusNotePlaceholder: "Opțional: adaugă detalii (de ex. \"bare noi pe ledge\", \"paznicul alungă după ora 18\")", + statusReported: "Stare raportată", + statusReportedDesc: "Mulțumim că menții harta proaspătă. Raportul tău este live.", + submitReport: "Trimite raportul", + submitting: "Se trimite...", + suggestedByUser: "Sugerat de {{count}} utilizator", + suggestedByUsers: "Sugerat de {{count}} utilizatori", + suggestedTagsContent: "Taguri sugerate pentru {{title}}: {{tags}}", + suggestNTags: "Sugerează {{count}} taguri", + suggestOneTag: "Sugerează 1 tag", + suggestTags: "Sugerează taguri", + suggestTagsDesc: "Ajută la clasificarea acestui spot sugerând taguri relevante.", + tags: "Taguri", + tagsHint: "Adaugă taguri pentru caracteristici, suprafețe, atmosferă (max {{max}})", + tagsSuggested: "Taguri sugerate!", + tagsSuggestedDesc: "Sugestiile tale de taguri au fost trimise.", + takePhoto: "Fă o fotografie", + threeDayForecast: "Prognoză pe 3 zile", + tipTheMapper: "Dă bacșiș cartografului", + tipTheMapperDesc: "Ai găsit util acest spot? Trimite un zap pentru a mulțumi cartografului!", + titleRequired: "Titlu necesar", + titleRequiredDesc: "Te rugăm să introduci un nume pentru acest spot.", + today: "Astăzi", + tomorrow: "Mâine", + transferDesc: "Transferă \"{{title}}\" altui utilizator. Această acțiune nu poate fi anulată.", + transferFailed: "Transferul a eșuat", + transferOwnership: "Transferă proprietatea", + transferRequestContent: "Cerere de transfer de proprietate pentru spotul \"{{title}}\"", + transferRequested: "Transfer solicitat", + transferRequestedDesc: "Noul proprietar va trebui să revendice spotul pentru a finaliza transferul.", + transferring: "Se transferă...", + transferSpotOwnership: "Transferă proprietatea spotului", + transferWarningDesc: "După transfer, nu vei mai putea edita sau șterge acest spot.", + typeToSearchTags: "Tastează pentru a căuta sau adăuga taguri...", + underReview: " — în verificare. Dacă acesta este un spot real, adaugă o fotografie sau un raport de stare pentru a-l confirma.", + untitledSpot: "Spot fără titlu", + unverified: "Neverificat", + updateDetailsFor: "Actualizează detaliile pentru {{title}}", + updateSpotDesc: "Actualizează informațiile despre acest spot. Toate câmpurile marcate cu * sunt obligatorii.", + uploadAPhoto: "Încarcă o fotografie", + uploadAPhotoHint: "Trage și plasează sau apasă · JPG, PNG, WebP", + uploadedAlt: "Încărcat", + uploadFailed: "Încărcarea a eșuat", + uploadingPhoto: "Se încarcă fotografia…", + uploadPhotoFirst: "Te rugăm să încarci mai întâi o fotografie.", + uvIndex: "Indice UV", + verifiedBySkateSpots: "Verificat de SkateSpots", + viewPhotoFullScreen: "Vezi fotografia pe ecran complet", + viewPhotoOf: "Vezi fotografia {{n}} din {{total}}", + warning: "Avertisment", + weatherConditions: "Condiții meteo", + weatherOnly: "doar vremea", + weatherOnlyUnconfirmed: "Doar vremea. Nimeni nu a confirmat încă că acesta este un spot de skate, așa că nu există scor de condiții — adaugă o fotografie sau un raport de stare pentru a-l confirma.", + whyReporting: "De ce raportezi acest lucru?", + wind: "Vânt", + yearsAgo: "acum {{count}} an", + yearsAgoPlural: "acum {{count}} ani", + }, + diyUi: { + title: "DIY — Fă-ți singur", + tagline: "Ghiduri, instrumente deschise și planuri pentru a-ți construi propriile deck-uri, rampe și spoturi de beton — apoi găsește oamenii, locurile și piața care merg cu ele.", + doItWithPeople: "Fă-o cu oameni", + backToDiy: "Înapoi la DIY", + calc: { + title: "Calculator de cost deck", + intro: "Cât costă să faci un deck — manoperă, echipament, materiale, timp de procesare, ambalare și marjă — și un preț de vânzare corect. Salvat pe acest dispozitiv.", + }, + designer: { + title: "Designer de deck", + intro: "Modelează conturul unui skateboard sau longboard, apoi exportă un șablon imprimabil 1:1, un SVG sau un DXF pentru CNC. Salvat pe acest dispozitiv.", + presets: "Presetări", + dimensions: "Dimensiuni", + shape: "Formă", + kicks: "Kick-uri", + hardware: "Găuri pentru trucks", + width: "Lățime maximă", + wheelbase: "Wheelbase", + nose: "Lungime nose", + tail: "Lungime tail", + length: "Lungime totală", + waist: "Talie", + endRound: "Rotunjime capete", + concave: "Concave", + thickness: "Grosime", + tailKick: "Tail kick", + noseKick: "Nose kick", + holeNew: "New school (2.125″)", + holeOld: "Old school (2.5″)", + holeSpacing: "New school este 2.125″ × 1.625″ (54 × 41 mm); old school este 2.5″ × 1.625″. Găuri de montare de 3/16″.", + topView: "Vedere de sus", + sideView: "Profil lateral", + concaveSection: "Secțiune concave", + export: "Exportă", + pdfA4: "PDF 1:1 · A4", + pdfLetter: "PDF 1:1 · Letter", + printNote: "Imprimă PDF-ul la 100% (fără „potrivire la pagină”), apoi lipește dalele folosind crucile din colțuri. SVG-ul este de asemenea la dimensiune reală.", + note: "Acesta este conturul 2D pe care îl trasezi și îl decupezi. Pentru forme 3D complete și proiectarea matrițelor, un instrument CAD real rămâne alegerea potrivită.", + }, + source: "Sursă", + comingSoon: "În curând", + footer: "Ghidurile pas cu pas sunt pe drum. Deocamdată: găsește oamenii care construiesc în The Lab, cartografiază-ți spotul și cumpără sau vinde în Marketplace. Lucrează în siguranță — protecții, mănuși și protecție pentru ochi.", + categories: { + boards: "Deck-uri", + ramps: "Rampe și obstacole din lemn", + concrete: "Beton și spoturi DIY", + repairs: "Reparații și reglaje", + tools: "Instrumente și planuri", + }, + cards: { + ossBuild: { + title: "Construiește un skateboard", + blurb: "Fabricarea deck-ului pas cu pas — furnir, matrițe, prese și finisare.", + }, + sk8cad: { + title: "SK8CAD", + blurb: "CAD open-source pentru formele de deck, concave și proiectarea matrițelor.", + }, + deckCost: { + title: "Cost și preț deck", + blurb: "Calculează materialele, manopera și un preț de vânzare corect înainte de a construi.", + }, + deckDesigner: { + title: "Designer de deck", + blurb: "Modelează un contur și imprimă un șablon 1:1 — sau exportă SVG/DXF pentru CNC.", + }, + ledgeBox: { + title: "Construiește un ledge sau box", + blurb: "Un obstacol din lemn prietenos pentru începători, pe care îl poți construi într-un weekend.", + }, + quarterpipe: { + title: "Construiește un quarterpipe", + blurb: "Planuri de rampă, tranziție și coping pentru un mini de curte.", + }, + flatbar: { + title: "Construiește un flatbar", + blurb: "Ieftin, portabil și cea mai bună cale de a învăța rail-uri.", + }, + concreteBasics: { + title: "Bazele betonului", + blurb: "Amestecare, cofrare și finisare a unui ledge sau bank care rezistă.", + }, + coping: { + title: "Coping și margini", + blurb: "Cum să montezi copingul și să finisezi o tranziție pentru un grind lin.", + }, + buyParts: { + title: "Cumpără piese și echipament", + blurb: "Alege deck-uri, componente și instrumente de la vânzătorii din Marketplace.", + }, + mapSpot: { + title: "Cartografiază-ți spotul DIY", + blurb: "Ai construit ceva? Adaugă-l pe hartă pentru ca alții să îl găsească și să skateze.", + }, + regrip: { + title: "Re-grip un deck", + blurb: "Îndepărtează griptape-ul vechi și aplică griptape nou curat.", + }, + tune: { + title: "Reglează bearings și trucks", + blurb: "Curăță bearings, schimbă bushings și setează geometria trucks-urilor.", + }, + printMolds: { + title: "Matrițe imprimate 3D", + blurb: "Fișiere imprimabile de matrițe și baze de aliniere din comunitate.", + }, + sk8cadTools: { + title: "Instrumente de matrițe și aliniere", + blurb: "Proiectează matrițe cu baze de aliniere integrate.", + }, + }, + actions: { + findBuilder: { + title: "Găsește un constructor", + blurb: "Constructori de rampe și DIY în The Lab care ți-o pot proiecta sau turna.", + }, + findCrew: { + title: "Găsește un crew DIY", + blurb: "Crews axate pe construcție — alătură-te celor care transformă spoturile în realitate.", + }, + mapSpot: { + title: "Cartografiază un spot DIY", + blurb: "Adaugă spotul pe care l-ai construit ca să trăiască pe hartă.", + }, + sellBuilds: { + title: "Vinde-ți construcțiile", + blurb: "Listează deck-urile, rampele sau piesele pe care le faci în Marketplace.", + }, + findCoach: { + title: "Găsește un antrenor", + blurb: "Antrenori care predau module de skate DIY și construcție de spoturi.", + }, + }, + }, + labelsUi: { + spotCategory: { + street: { + label: "Street", + description: "Spoturi găsite aleatoriu, teren urban", + }, + transition: { + label: "Transition", + description: "Suprafețe curbate/în pantă", + }, + park: { + label: "Park", + description: "Skateparkuri construite", + }, + plaza: { + label: "Plaza", + description: "Piețe urbane (precum MACBA, Love Park)", + }, + }, + spotFeature: { + wallrides: "Wallrides", + stairs: "Scări și balustrade", + rails: "Rails", + ledges: "Ledge-uri și borduri", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Ramps", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Piramide / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + }, + spotType: { + street: "Street", + transition: "Transition", + park: "Park", + plaza: "Plaza", + wallrides: "Wallrides", + stairs: "Scări și balustrade", + rails: "Rails", + ledges: "Ledge-uri și borduri", + gaps: "Gaps", + flatground: "Flatground", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + bowls: "Bowls", + vert: "Vert Ramps", + "mega-ramps": "Mega Ramps", + hubbas: "Hubbas", + "euro-gaps": "Euro Gaps", + banks: "Banks", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + hips: "Hips", + volcano: "Volcano", + pyramids: "Piramide / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + diy: "DIY", + rail: "Rail", + ledge: "Ledge", + gap: "Gap", + bowl: "Bowl", + stall: "Stall", + slappy: "Slappy", + }, + access: { + public: { + label: "Public - Deschis pentru toți", + }, + private: { + label: "Proprietate privată - Permisiune necesară", + }, + locals: { + label: "Întreabă mai întâi localnicii", + }, + }, + shelter: { + outdoor: { + label: "Exterior", + short: "Exterior", + description: "Complet expus — ploaia oprește jocul", + }, + partial: { + label: "Parțial acoperit", + short: "Parțial acoperit", + description: "Unele obstacole rămân uscate", + }, + covered: { + label: "Acoperit / cu acoperiș", + short: "Acoperit", + description: "Exterior, dar sub un acoperiș", + }, + indoor: { + label: "Interior", + short: "Interior", + description: "Complet închis — skate ploaie sau soare", + }, + }, + eventType: { + contest: "Concurs", + demo: "Demo", + session: "Sesiune", + workshop: "Atelier", + premiere: "Premieră", + tradeshow: "Târg", + gameskate: "Game of Skate", + concert: "🎸 Concert", + jam: "🎵 Jam", + festival: "🎪 Festival", + popup: "🎯 Pop-Up", + }, + gearCategory: { + deck: "Deck", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + shoes: "Pantofi de skate", + clothing: "Îmbrăcăminte", + protective: "Echipament de protecție", + stickers: "Stickere", + wax: "Wax", + tools: "Instrumente", + griptape: "Griptape", + rubbrick: "Rub Brick", + }, + gearCondition: { + new: { + label: "Nou", + description: "Niciodată folosit, încă în ambalaj", + }, + like_new: { + label: "Ca nou", + description: "Aproape nefolosit, stare excelentă", + }, + good: { + label: "Bun", + description: "Uzură normală, funcționează perfect", + }, + well_used: { + label: "Foarte folosit", + description: "Arată uzură, dar încă funcționează", + }, + }, + priceType: { + fixed: { + label: "Preț fix", + description: "Setează prețul în USD sau sats", + }, + free: { + label: "Gratuit", + description: "Dăruiește", + }, + trade: { + label: "Schimb", + description: "Caută să faci schimb", + }, + offer: { + label: "Fă o ofertă", + description: "Preț negociabil", + }, + }, + listingType: { + selling: { + label: "De vânzare", + description: "Listează echipament de vânzare", + }, + wtb: { + label: "Caut să cumpăr", + description: "Caut echipament specific", + }, + }, + tour: { + spotType: { + street: "Street", + park: "Park", + diy: "DIY", + transition: "Transition", + hidden: "Perle ascunse", + }, + category: { + local: { + label: "Tur local", + description: "Arată spoturi ascunse din orașul tău", + }, + national: { + label: "Tur național", + description: "Deplasări în mai multe orașe prin țară", + }, + international: { + label: "Tur internațional", + description: "Aventuri transfrontaliere prin mai multe țări", + }, + destruction: { + label: "World Destruction", + description: "Competiție globală de echipe în stil KOTR", + }, + }, + }, + crew: { + vibe: { + street: "Street", + transition: "Transition / Vert", + park: "Park", + diy: "DIY", + cruising: "Cruising / Filming", + oldschool: "Old School", + allterrain: "All Terrain", + girls: "Fete / Femei", + youth: "Tineri / Groms", + adaptive: "Adaptiv", + punk: "Punk", + hiphop: "Rap / Hip-Hop", + }, + focus: { + mixed: "Mixt / General", + builder: "DIY și constructori", + photo: "Foto și film", + coaching: "Coaching", + art: "Artă și design", + music: "Trupă și muzică", + wellness: "Antrenament și fizioterapie", + }, + focusDescription: { + mixed: "Un crew obișnuit de skate — apare doar pe pagina Crews.", + builder: "Un crew DIY / de construcție de parkuri — apare și în The Lab la Builders.", + photo: "Un crew de filmare, fotografie sau montaj — apare și în The Lab la Photo & Film.", + coaching: "Un crew de coaching / lecții — apare și în The Lab la Coaching.", + art: "Un colectiv de artă, design, graffiti sau tatuaje — apare și în The Lab la Art & Design.", + music: "O trupă sau un colectiv muzical — apare și în The Lab la Music.", + wellness: "Un crew de antrenament, fitness sau fizioterapie — apare și în The Lab la Training.", + }, + lookingFor: { + filmer: "Filmer", + photographer: "Fotograf", + editor: "Editor video", + coach: "Antrenor", + builder: "Constructor de rampe", + artist: "Artist / Designer", + musician: "Muzician / Trupă", + members: "Membri noi", + }, + role: { + filmer: "Filmer", + photographer: "Fotograf", + editor: "Editor", + coach: "Antrenor", + builder: "Constructor", + artist: "Artist", + graffiti: "Graffiti", + tattoo: "Tatuaj", + trainer: "Antrenor", + musician: "Muzician", + judge: "Juri", + manager: "Manager de echipă", + og: "OG", + }, + }, + memberVisibility: { + public: { + label: "Public", + description: "Oricine te poate vedea în acest crew — pe pagina publică a crew-ului și în descoperirea colegilor de crew.", + }, + crew: { + label: "Doar crew-ul", + description: "Doar colegii confirmați de crew și fondatorul te văd aici. Pentru toți ceilalți apari ca un „membru ascuns” anonim. Notă: aceasta este confidențialitate la nivel de aplicație — tagul tău de membru există în continuare public pe relay-uri, doar că nu este niciodată arătat celor din afară.", + }, + }, + tagCategory: { + features: { + name: "Caracteristici", + description: "Obstacole și teren", + }, + surfaces: { + name: "Suprafețe", + description: "Materiale și texturi", + }, + sizes: { + name: "Dimensiuni", + description: "Dimensiuni și scară", + }, + stairs: { + name: "Număr de scări", + description: "Numărul de scări", + }, + vibes: { + name: "Atmosferă", + description: "Atmosferă și stare", + }, + location: { + name: "Locație", + description: "Context de locație", + }, + tricks: { + name: "Tricks", + description: "Bun pentru tricks specifice", + }, + }, + spotTagCategory: { + street: { + label: "Street", + description: "Spoturi de stradă - scări, rails, ledges", + }, + park: { + label: "Park", + description: "Skateparkuri - publice sau private", + }, + diy: { + label: "DIY", + description: "Spoturi DIY/făcute în casă", + }, + plaza: { + label: "Plaza", + description: "Piețe publice cu arhitectură prietenoasă pentru skate", + }, + }, + status: { + active: { + label: "Activ", + description: "Bun de plecare — skatează-l.", + }, + bust: { + label: "Bust", + description: "Risc mare de alungare — pază sau poliție.", + }, + skate_stopped: { + label: "Skate-stopped", + description: "Cu bare/capac, dar parțial skatabil.", + }, + closed: { + label: "Închis", + description: "Închis temporar — construcție sau eveniment.", + }, + gone: { + label: "Dispărut", + description: "Demolat, asfaltat peste sau împrejmuit definitiv.", + }, + }, + price: { + free: "GRATUIT", + trade: "Schimb", + makeOffer: "Fă o ofertă", + offer: "Ofertă", + }, + }, + feesUi: { + feeFeaturedEventLabel: "Eveniment promovat", + feeFeaturedEventDesc: "Promovează-ți evenimentul pe SkateSpots", + feeFeaturedEventBenefit: "Evenimentul tău apare în partea de sus a paginii de evenimente", + feeLabProfileLabel: "Profil Lab Pro", + feeLabProfileDesc: "Promovează-ți serviciile în The Lab", + feeLabProfileBenefit: "Insignă Pro + plasare promovată când skaterii navighează The Lab", + feeFeaturedShopLabel: "Magazin promovat", + feeFeaturedShopDesc: "Promovează-ți skate shopul pe hartă și în director", + feeFeaturedShopBenefit: "Insignă verificat + pin promovat pe hartă", + feeFeaturedTourLabel: "Tur promovat", + feeFeaturedTourDesc: "Promovează-ți turul pe SkateSpots", + feeFeaturedTourBenefit: "Insignă Pro + plasare de top când skaterii navighează tururile", + duration7d: "7 zile", + duration30d: "1 lună", + duration90d: "3 luni", + duration365d: "12 luni", + metaActive: "{{label}} — Activ", + daysRemainingOne: "{{count}} zi rămasă", + daysRemainingMany: "{{count}} zile rămase", + zapRequestContent: "SkateSpots {{label}} ({{tier}})", + errGenerate: "Generarea facturii a eșuat", + paymentReceived: "⚡ Plată primită!", + paymentReceivedDesc: "{{amount}} sats — {{label}} este acum activ.", + autoPayFailed: "Plata automată a eșuat", + autoPayFailedDesc: "Plătește manual folosind codul QR sau factura de mai jos.", + payStatusUnknown: "Starea plății este necunoscută — este posibil ca plata să fi trecut. Verifică-ți portofelul înainte de a plăti din nou.", + invoiceCopied: "Factură copiată!", + activeBang: "{{label}} Activ!", + chooseDuration: "Alege durata", + bestValue: "Cea mai bună valoare", + perDay: "{{price}}/zi", + validFor: "Valabil pentru", + amountLine: "~${{usd}} USD · către {{name}} · {{tier}}", + payToContinue: "Plătește {{amount}} sats pentru a continua", + generating: "Se generează factura…", + processing: "Se procesează plata…", + invoiceQrAlt: "Cod QR factură Lightning", + copyInvoice: "Copiază factura", + openWallet: "Deschide portofelul", + payConnected: "Plătește cu portofelul conectat", + scanAny: "Scanează cu orice portofel Lightning", + tryAgain: "Încearcă din nou", + proReceiptTitle: "🦧⚡ Sasquatch Pro — ești înăuntru!", + proReceiptPass: "Pass: {{pass}} ({{sats}} sats)", + proReceiptActiveUntil: "Activ până la: {{until}}", + proReceiptUnlocked: "Ce ai deblocat:", + proReceiptBullet1: "• Asistent personal — îți citesc Stash-ul, crew-urile, spoturile și anunțurile", + proReceiptBullet2: "• Ciorne de acțiuni — listează echipament, postează o stare de spot, planifică călătorii (tu confirmi)", + proReceiptBullet3: "• Răspunsuri care folosesc contextul tău personal, nu doar date publice", + proReceiptBullet4: "• ⚡ Susții direct SkateSpots și îl menții gratuit + fără reclame", + proReceiptThanks: "Mulțumim că menții SkateSpots gratuit și fără reclame. Acum du-te și dă-i bice. 🛹", + proReceiptSubject: "Chitanță Sasquatch Pro", + receiptContent: "Sasquatch Pro — pass de susținător {{tier}} 🦧⚡", + receiptAlt: "Pass de susținător Sasquatch Pro ({{tier}}), valabil până la {{until}}", + purchaseComment: "Sasquatch Pro — {{tier}} 🦧", + errLogin: "Autentifică-te pentru a face upgrade la Pro.", + errStart: "Nu s-a putut începe achiziția.", + errRecord: "Nu s-a putut înregistra pass-ul tău.", + }, + cardUi: { + save: "Salvează cardul pe Nostr", + saved: "Card salvat", + savedDesc: "Cardul tău este acum semnat și verificabil.", + saveFailed: "Cardul nu a putut fi salvat", + notPublished: "Nepublicat", + titleNeon: "Rider", + titleRest: "Card", + saveFrontPng: "Salvează fața (PNG)", + expired: "EXPIRAT", + logoUploaded: "Logo încărcat", + logoUploadFailed: "Logo-ul nu a putut fi încărcat", + venue: "Loc legat (opțional)", + venueNone: "Fără loc", + venueHint: "Alege unul dintre spoturile tale pentru a lega acest pass de un loc. Un verificator va confirma că îl deții.", + venuePick: "Alege-ți locul", + parkNoVenue: "Un pass de Park poate fi emis doar de proprietarul locului — cartografiază mai întâi un spot pe care îl deții.", + parkAddVenue: "Adaugă un spot", + parkNeedsVenue: "Alege un loc pe care îl deții", + parkIssued: "Pass-uri emise", + parkRevoke: "Revocă", + parkRevoked: "Revocat", + parkRevokeFailed: "Nu s-a putut revoca", + v: { + valid: "Valid", + validDesc: "Semnătură validă și emisă de loc.", + expired: "Expirat", + expiredDesc: "A depășit data de valabilitate.", + revoked: "Revocat", + revokedDesc: "Emitentul a anulat acest pass — nu îl accepta.", + invalid: "Invalid", + invalidDesc: "Semnătura nu se verifică. Nu te încrede în ea.", + notFound: "Negăsit", + notFoundDesc: "Nicio înregistrare potrivită pe relay-uri.", + unverifiedIssuer: "Emitent neverificat", + unverifiedIssuerDesc: "Acest pass numește un loc care nu este deținut de cheia emitentului.", + notBound: "Nelegat", + notBoundDesc: "Nu este legat de un loc — nu dovedește nimic despre acces.", + noRsvp: "Fără RSVP", + noRsvpDesc: "Deținătorul nu are niciun RSVP înregistrat pentru acest eveniment.", + admitted: "Admis", + admittedDesc: "Evenimentul organizatorului + deținătorul a dat RSVP.", + noHolder: "Niciun deținător în link", + noHolderDesc: "Acest QR nu are deținător de bilet (`?h=`), așa că deținătorul nu poate fi verificat.", + }, + passes: { + tab: "Pass-urile mele", + pass: "Pass de acces", + none: "Niciun pass încă. Când un loc sau un organizator îți emite unul, apare aici.", + }, + facets: { + title: "Arată fațetele identității", + crews: "Crews", + local: "Local", + roles: "Roluri Lab", + }, + roles: { + coach: "Antrenor", + filmer: "Filmer", + editor: "Editor", + photographer: "Fotograf", + builder: "Constructor", + artist: "Artist", + graffiti: "Graffiti", + tattoo: "Tatuaj", + trainer: "Antrenor", + musician: "Muzician", + judge: "Juri", + organizer: "Organizator", + barber: "Frizer", + }, + crew: { + crewCard: "CREW CARD", + crewSub: "Crew-ul tău, pe un card", + pick: "Alege un crew", + none: "Nu ești încă într-un crew — alătură-te sau începe unul mai întâi.", + hint: "Cardul este construit din datele semnate ale crew-ului. Editează crew-ul pe pagina lui pentru a-l schimba.", + members: "MEMBRI", + spots: "SPOTURI", + est: "Din {{year}}", + openCall: "Apel deschis", + verifiedCrew: "Crew verificat", + viewCrew: "Vezi crew-ul", + }, + event: { + pass: "EVENT PASS", + passSub: "Un pass pentru un eveniment la care mergi", + pick: "Alege un eveniment", + none: "Niciun eveniment încă — creează unul sau dă RSVP la unul mai întâi.", + hint: "Pass-ul este construit din datele semnate ale evenimentului. Doar organizatorul îl poate schimba.", + admits: "ADMITE", + going: "{{count}} participanți", + verifiedEvent: "Eveniment verificat", + viewEvent: "Vezi evenimentul", + issuePass: "Emite un pass de check-in", + issuePassBtn: "Emite pass", + issuePassHint: "Un pass semnat pentru un participant specific — îl arată la intrare.", + notOrganiser: "Doar organizatorul poate emite pass-uri", + passIssued: "Pass emis", + issueFailed: "Pass-ul nu a putut fi emis", + issuedPasses: "Pass-uri de check-in emise", + }, + studio: { + unsaved: "Modificări nesalvate", + saved: "Salvat", + saveChanges: "Salvează modificările", + allSaved: "Salvat — la zi", + showOnCard: "Arată pe card", + derived: "Din profilul tău de Skater", + noSkaterProfile: "Niciun profil de Skater încă —", + editSkaterProfile: "adaugă-ți stilurile și nivelul", + noPhoto: "Nicio fotografie de profil încă —", + addPhoto: "adaugă una în profilul tău", + finishTitle: "Finalizează-ți cardul", + finishDesc: "O fotografie și un profil de Skater îl fac să pară real.", + checkPhoto: "Fotografie de profil", + checkName: "Nume afișat", + checkProfile: "Stiluri și nivel", + checkCrew: "Alătură-te unui crew", + moreTypes: "Mai multe tipuri de card se deblochează pe măsură ce cartografiezi spoturi pe care le deții, te alături unor crews sau dai RSVP la evenimente.", + accent: "Culoare de accent", + accentHint: "Suprascrie accentul temei", + accentClear: "Folosește culoarea temei", + logo: "Logo / stemă personalizat", + logoAdd: "Încarcă", + logoChange: "Schimbă", + logoClear: "Elimină", + }, + back: { + title: "Spate imprimabil", + desc: "Crews, roluri, sponsori și linkuri pe verso", + showBack: "Arată spatele", + showFront: "Arată fața", + empty: "Nimic aici încă — adaugă crews, roluri sau sponsori.", + }, + verify: { + checking: "Se verifică cardul…", + notFound: "Cardul nu a fost găsit", + notFoundDesc: "Nu s-a găsit niciun eveniment potrivit pe relay-uri. Este posibil să fi fost șters sau linkul este greșit.", + invalid: "Semnătură invalidă", + invalidDesc: "Acest eveniment există, dar semnătura lui nu se verifică. Nu te încrede în el.", + authentic: "Autentic", + authenticDesc: "Semnătura emitentului este validă.", + kind: "Tip", + kindPark: "Card de acces Park", + kindRider: "Card Rider", + kindCrew: "Crew Card", + kindEvent: "Pass de eveniment", + organiser: "Organizator", + expired: "Expirat", + valid: "Valid", + holder: "Deținător", + ticketHolder: "Deținător de bilet", + rsvp: "RSVP", + rsvpGoing: "Participă", + rsvpInterested: "Interesat", + rsvpNone: "Niciun RSVP găsit", + revoked: "Pass revocat", + revokedDesc: "Emitentul a anulat acest pass — nu îl accepta.", + issuedBy: "Emis de", + accessLevel: "Nivel de acces", + validThru: "Valabil până la", + selfIssued: "Stare", + selfIssuedDesc: "Card de identitate auto-emis", + venue: "Loc", + venueVerified: "Verificat — cheia proprietarului acestui loc corespunde emitentului.", + venueMismatch: "Acest pass numește un loc care nu este deținut de cheia emitentului.", + venueNone: "Nelegat de un loc.", + viewCard: "Vezi cardul", + disclaimer: "O semnătură validă dovedește cine a semnat acest card — nu este dovadă de îndemânare sau de drepturi de acces dincolo de ceea ce a emis locul.", + details: "Detalii", + invalidLink: "Link invalid", + invalidLinkDesc: "Asta nu pare a fi un link de card valid.", + }, + public: { + invalid: "Asta nu pare a fi un link de card valid.", + createYourOwn: "Creează-ți propriul card", + editYourCard: "Editează-ți cardul", + backToEditor: "Înapoi la editor", + backHome: "Înapoi acasă", + notCustomised: "Acest skater nu și-a personalizat încă cardul — aceasta este imaginea implicită.", + verifyNote: "Scanează codul QR de pe card pentru a-l verifica.", + }, + }, + routeUi: { + destination: "Destinație", + routeTo: "Rută către {{label}}", + routeToLabel: "Rută către", + search: "Caută", + description: "Opțiuni de rută și indicații în aplicație.", + routeMapAria: "Hartă rută", + findingLocation: "Se caută locația ta…", + plottingRoute: "Se trasează ruta…", + refiningLocation: "Se rafinează locația…", + offlineSavedRoute: "Offline · rută salvată {{age}}", + tapMapStart: "Apasă pe hartă pentru a seta punctul de plecare", + fitRouteAria: "Potrivește toată ruta pe hartă", + wholeRoute: "Toată ruta", + next: "Următorul", + nextStep: "Următorul · pasul {{n}}", + followTheLine: "Urmează linia", + toTheTurn: "până la viraj", + toGo: "rămase", + tryAgain: "Încearcă din nou", + mode: { + foot: "Skate / Mers", + bike: "Bicicletă", + moto: "Moto", + car: "Mașină", + transit: "Transport public", + }, + from: "De la", + myLocation: "Locația mea", + tapTheMap: "Apasă pe hartă…", + chooseOnMap: "Alege pe hartă", + direct: "direct", + transferOne: "1 transfer", + transfers: "{{count}} transferuri", + options: "{{count}} opțiuni", + ride: "cursă", + arrive: "sosire", + speedAvg: "{{speed}} km/h medie", + stepsCount: "{{count}} pași", + onABoard: "pe un board", + usesDrivingRoads: "folosește drumuri pentru mașini", + drivingEstimate: "estimare pentru mașină", + updating: "se actualizează…", + pickMode: "Alege un mod pentru a-ți vedea ruta.", + waitingLocation: "Se așteaptă locația ta…", + routeSteps: "Pași de rută", + walkingRoute: "rută pietonală — mai rapid pe un board", + planningView: "Vizualizare de planificare — apasă Start pentru a urmări cu viraje live, voce și sosire.", + leaveNow: "Pleacă acum", + departAt: "Pleacă la", + arriveBy: "Sosește până la", + departureTime: "Ora plecării", + arrivalTime: "Ora sosirii", + only: "Doar", + clear: "șterge", + itinerary: "Itinerariu", + group: { + bus: "Autobuz", + tram: "Tramvai", + metro: "Metrou", + train: "Tren", + ferry: "Ferry", + }, + walk: "Mers", + rideVerb: "Cursă", + walkLower: "mers", + rideLower: "cursă", + toStop: "spre", + track: "linia {{track}}", + stopOne: "1 stație", + stopsCount: "{{count}} stații", + tickets: "bilete ↗", + done: "Gata", + stop: "Oprește", + start: "Start", + arrived: "Ai ajuns. 🛹", + voiceOnNote: "Ecranul rămâne pornit · voce pornită — virajele și sosirea sunt rostite.", + voiceOffNote: "Ecranul rămâne pornit · voce oprită.", + followNote: "Viraje, voce și sosire pe măsură ce te deplasezi. Menține ecranul pornit.", + voiceOffAria: "Oprește ghidarea vocală", + voiceOnAria: "Pornește ghidarea vocală", + voiceStart: "Se pornește navigarea", + voiceArrived: "Ai ajuns", + voiceIn: "În {{metres}} metri, {{instruction}}", + voiceContinue: "continuă", + voiceContinueCaps: "Continuă", + errPermissionDenied: "Permisiune de locație refuzată.", + errWaitingGps: "Se așteaptă o poziție GPS…", + errPermissionDeniedLong: "Permisiune de locație refuzată. Activează locația pentru a trasa ruta de unde ești.", + errNoLocation: "Nu s-a putut obține locația ta. Încearcă din nou.", + errNoLocationShort: "Nu s-a putut obține locația ta.", + errTransitNoRouteFiltered: "Nicio rută pentru acea oră sau mod de transport — încearcă altă oră sau include mai multe moduri.", + errTransitNoRoute: "Nu s-a găsit nicio rută de transport public aici — este posibil ca această zonă să nu publice orare deschise.", + errTransitUnreachable: "Serviciul de transport nu a putut fi contactat. Verifică-ți conexiunea și încearcă din nou.", + errRoutingBusy: "Serviciul de rutare este ocupat acum — încearcă din nou într-o clipă.", + errNoRouteMode: "Nicio rută pentru acest mod — destinația poate fi în afara rețelei rutiere. Încearcă alt mod.", + errRoutingUnreachable: "Serviciul de rutare nu a putut fi contactat. Verifică-ți conexiunea și încearcă din nou.", + departures: "Plecări", + upcomingFrom: "Plecări viitoare din {{stop}}", + loadingDepartures: "Se încarcă plecările…", + noDepartures: "Nu s-au găsit plecări viitoare la această stație.", + live: "live", + cancelled: "anulat", + refresh: "Reîmprospătează", + tripLoginTitle: "Autentifică-te pentru a salva", + tripLoginDesc: "Autentifică-te pentru a păstra această călătorie ca o Colecție.", + tripCollectionTitle: "Călătorie de skate în {{destination}} 🛹", + tripCollectionDesc: "Plan de călătorie de The Sasquatch — {{count}} zile în {{destination}}.", + tripCollectionDescOne: "Plan de călătorie de The Sasquatch — {{count}} zi în {{destination}}.", + tripSavedTitle: "Salvat în Colecții 🦧", + tripSavedDesc: "Călătoria ta în {{destination}} este marcată.", + tripSaveFailed: "Nu s-a putut salva", + tripSaveFailedDesc: "Încearcă din nou într-o secundă.", + daysInDestinationOne: "{{count}} zi în {{destination}}", + daysInDestination: "{{count}} zile în {{destination}}", + wetForecast: "Prognoză umedă — caută un crew local pentru opțiuni acoperite/interioare.", + dayLabel: "Ziua {{n}}", + freeSkate: "Skate liber — explorează și filmează. 🎥", + tapToBook: "apasă pentru a rezerva / zap ⚡", + localCrews: "Crews locale", + saving: "Se salvează…", + savedToCollections: "Salvat în Colecții", + saveSpotOne: "Salvează {{count}} spot într-o Colecție", + saveSpots: "Salvează {{count}} spoturi într-o Colecție", + flights: "Zboruri", + stays: "Cazări", + gettingAround: "Deplasare", + noMiddleman: "Eu planific skatingul — zborurile și cazările se deschid pe site-urile reale (fără KYC, fără intermediari).", + ageJustNow: "chiar acum", + ageMinAgo: "acum {{count}} min", + ageHourAgo: "acum {{count}} h", + ageDayAgo: "acum {{count}} z", + skateRightHere: "chiar aici", + skateMin: "~{{count}} min de cruise", + skateHours: "~{{hours}} h de cruise", + maneuver: { + headOut: "Pornește", + arrive: "Sosește la spot", + continueStraight: "Continuă", + bearLeft: "Virează ușor la stânga", + bearRight: "Virează ușor la dreapta", + turnLeft: "Virează la stânga", + turnRight: "Virează la dreapta", + sharpLeft: "Viraj strâns la stânga", + sharpRight: "Viraj strâns la dreapta", + turn: "Virează", + keepLeft: "Ține stânga", + keepRight: "Ține dreapta", + takeFork: "Ia bifurcația", + merge: "Integrează-te", + roundabout: "Ia sensul giratoriu", + takeRamp: "Ia rampa", + takeExit: "Ia ieșirea", + }, + maneuverOnto: "{{instruction}} pe {{road}}", + }, + sasquatchUi: { + live: "live", + offline: "offline", + genericTitle: "Asistentul SkateSpots 🦧", + genericGreeting: "Salut! Sunt The Sasquatch. Întreabă-mă orice despre spoturi, evenimente, antrenori, echipament sau cum funcționează aplicația. Am date live de la relay-ul SkateSpots!", + q1: "Planifică-mi 3 zile la Lisabona", + q2: "Găsește spoturi lângă mine", + q3: "Vreo evenimente viitoare?", + q4: "Ce sunt crews?", + q5: "Cum funcționează zap-urile?", + q6: "Ce este Nostr?", + q7: "Ce este Stash-ul meu?", + q8: "Este gratuit?", + bubbleTitle: "Apasă și trage pentru a muta · Apasă pentru a deschide", + openGuideAria: "Deschide ghidul Sasquatch", + hideAria: "Ascunde asistentul Sasquatch", + hide: "Ascunde asistentul", + showAria: "Arată asistentul Sasquatch", + activeUntil: "Activ până la {{date}}", + platformOwner: "Proprietarul platformei", + upgradeTitle: "Fă upgrade la Sasquatch Pro", + goPro: "Fă-ți Pro", + goProBlurb: "AI personal · de la 2k sats", + aiBalanceTitle: "Soldul de credit Sasquatch AI (doar proprietar) — reîncarcă la {{provider}}", + aiChip: "⚡ AI {{balance}}", + minimizeToBubbleAria: "Minimizează la bulă", + minimize: "Minimizează", + closePanelAria: "Închide panoul", + close: "Închide", + askLab: "Întreabă despre Coaching și Filmare", + askMap: "Întreabă despre Spoturi, Magazine și Echipament", + askAnything: "Întreabă-mă orice 🛹", + quickQuestions: "Întrebări rapide:", + you: "🧑 Tu", + thinking: "se gândește...", + inputPlaceholder: "Întreabă despre spoturi, evenimente, antrenori...", + liveDataFrom: "Date live de la", + nostrRelays: "Relay-uri Nostr", + clear: "șterge", + gettingLocation: "📍 Se obține locația ta…", + findingClosest: "🔍 Se caută cele mai apropiate spoturi…", + checkingLive: "🔍 Se verifică datele live…", + planningTrip: "🗺️ Se planifică călătoria ta în {{destination}}...", + searchingRelays: "🔍 Se caută în relay-uri {{tool}}...", + perk1: "Asistent personal — Sasquatch îți citește propriul Stash, crews, spoturi și anunțuri", + perk2: "Ciorne de acțiuni: listează echipament, postează o stare de skate, planifică o călătorie — tu confirmi înainte ca ceva să fie publicat", + perk3: "Răspunsurile folosesc contextul tău personal, nu doar date publice", + perk4: "⚡ Susții direct SkateSpots și îl menții gratuit și fără reclame", + welcomeTitle: "Mulțumim că susții Sasquatch Pro! 🦧⚡", + welcomeDesc: "Plată trimisă — pass-ul tău se activează odată ce furnizorul o confirmă (de obicei în mai puțin de un minut). Mulțumim că menții străzile libere.", + invoiceCopied: "Factură copiată", + dialogDesc: "Potentează-ți ghidul AI de skate. 100% finanțează o aplicație comunitară gratuită, fără reclame.", + proSupporter: "Ești susținător Pro ⚡", + extendPrompt: "Vrei să prelungești? Alege un nivel mai jos pentru a adăuga mai mult timp.", + scanToPayPre: "Scanează pentru a plăti", + scanToPayAmount: "{{sats}} sats", + scanToPayPost: "pentru {{label}} de Pro", + invoiceQrAlt: "Cod QR factură Lightning", + copyInvoice: "Copiază factura", + ivePaid: "Am plătit", + ivePaidHint: "Apasă \"Am plătit\" după ce portofelul tău confirmă — aceasta înregistrează pass-ul la identitatea ta Nostr.", + freeStaysPre: "Sasquatch gratuit rămâne gratuit — căutare publică de spoturi/evenimente/antrenori, planificare de călătorii + glosarul complet de tricks. Pro adaugă stratul ", + freeStaysEmphasis: "personal + acțiuni", + freeStaysPost: ".", + loginFirst: "Autentifică-te mai întâi pentru a face upgrade.", + paysTo: "Plătește către", + overLightning: "prin Lightning. Legat de npub-ul tău.", + popular: "Popular", + sats: "sats", + extend: "Prelungește", + done: "Gata!", + cancelledNothing: "Anulat — nu s-a publicat nimic.", + draftReview: "Ciornă — verifică și confirmă", + statusTextPlaceholder: "Text de stare", + titlePlaceholder: "Titlu", + priceSatsPlaceholder: "Preț (sats)", + conditionPlaceholder: "Stare", + cancel: "Anulează", + aiTitle: "Sasquatch AI", + owner: "Proprietar", + notConfigured: "neconfigurat", + unavailable: "indisponibil", + satsValue: "{{balance}} sats", + theNode: "nodul", + lowBalance: "Se termină — reîncarcă la {{provider}} sau AI-ul va reveni la furnizorul fără cheie.", + aiDesc: "AI cu plată per cerere, finanțat în sats prin Routstr. Se reîncarcă când este scăzut.", + tier7d: "7 zile", + tier1m: "1 lună", + tier3m: "3 luni", + tier1y: "1 an", + badgeTry: "Încearcă", + badgeOff20: "20% reducere", + badgeBest: "Cea mai bună valoare · 40% reducere", + draftPostStatusTitle: "Postează o stare de skate", + draftAutoExpires: "Expiră automat în {{count}} min", + draftPostStatusCta: "Postează starea", + draftCategory: "Categorie: {{value}}", + draftSize: "Mărime: {{value}}", + draftCondition: "Stare: {{value}}", + draftMaxPrice: "Preț maxim: {{price}} {{currency}}", + draftPriceOpen: "Preț: deschis", + draftLookingForTitle: "Caut \"{{title}}\"", + draftWantedCta: "Postează anunț de căutare", + draftPrice: "Preț: {{price}} {{currency}}", + draftPriceOffer: "Preț: fă o ofertă", + draftListTitle: "Listează \"{{title}}\" spre vânzare", + draftPublishCta: "Publică anunțul", + statusPosted: "Stare postată 🛹", + wantedPublished: "Anunț de căutare publicat 🔎", + listingPublished: "Anunț publicat 💸", + mustBeLoggedIn: "Trebuie să fii autentificat.", + }, + sasquatchChat: { + faq: { + hi: "Salut! Sunt The Sasquatch 🦧 Ghidul tău AI de skate. Întreabă-mă despre spoturi, evenimente, antrenori, echipament — sau orice despre aplicație. Cu ce te pot ajuta?", + hello: "Wassup! 🛹 Sunt The Sasquatch. Întreabă-mă despre spoturi de skate, evenimente, antrenori sau cum funcționează aplicația. Ce se aude?", + hey: "Salut skater! 🤙 Întreabă-mă despre spoturi lângă tine, evenimente viitoare, antrenori sau orice SkateSpots.", + whoAreYou: "Sunt The Sasquatch 🦧 — ghidul AI pentru SkateSpots. Pot găsi spoturi de skate în întreaga lume, pot căuta evenimente, antrenori, filmers și anunțuri de echipament. Toate alimentate de date Nostr live. Întreabă!", + whatCanYouDo: "Pot găsi spoturi de skate după oraș sau țară, pot căuta evenimente viitoare, pot găsi antrenori și filmers în The Lab, pot căuta anunțuri de echipament și pot răspunde la întrebări despre cum funcționează aplicația. Încearcă: 'spots in Bangkok' sau 'find a coach'! 🛹", + whatIsNostr: "Nostr este un protocol simplu și deschis pentru rețele sociale descentralizate. Gândește-te la Twitter, dar nicio companie nu îl controlează — folosești chei criptografice în loc de nume de utilizator, alegi ce relay-uri îți stochează datele (sau rulezi propriul), iar un singur cont funcționează în orice aplicație Nostr! 🔑", + isThisPrivate: "Iată prezentarea sinceră 🛡️\n\n• **Locația ta GPS rămâne pe dispozitivul tău** — 'Lângă mine' doar centrează harta. Nu ne este niciodată trimisă sau publicată.\n• **Spoturile pe care le adaugi sunt publice** (acesta este scopul unei hărți partajate) — așa că nu plasa un pin pe ușa casei tale.\n• **Mesajele private și chatul de crew sunt criptate end-to-end** — doar membrii le pot citi.\n• Ca orice site web, serverele la care te conectezi (dale de hartă, relay-uri) îți pot vedea **IP-ul**. Vrei să ascunzi și asta? Folosește un VPN sau Tor.\n\nDetalii complete pe [pagina de Confidențialitate](/privacy). 🛹", + privacy: "Varianta scurtă 🛡️: GPS-ul tău nu părăsește niciodată dispozitivul, spoturile pe care le publici sunt publice prin design, iar mesajele private/chatul de crew sunt criptate end-to-end. Serverele îți pot vedea totuși IP-ul (normal pentru orice site) — un VPN sau Tor ascunde asta dacă vrei. Detalii complete pe [pagina de Confidențialitate](/privacy).", + amITracked: "SkateSpots nu te urmărește — fără reclame, fără profilare analitică, fără vânzare de date și nu există niciun server SkateSpots care să colecteze locația ta. GPS-ul tău rămâne pe dispozitivul tău. Singurul lucru pe care îl văd serverele (dale de hartă, relay-uri) este **IP-ul** tău — la fel ca la orice site. Folosește un VPN sau Tor pentru a ascunde asta. Mai multe pe [pagina de Confidențialitate](/privacy). 🛡️", + doYouTrack: "Nu — fără urmărire, fără reclame, fără colectare de date. GPS-ul tău rămâne pe dispozitivul tău și nu există niciun server central care să te înregistreze. Serverele la care te conectezi îți pot vedea IP-ul (ca orice site); un VPN/Tor ascunde asta. Vezi [pagina de Confidențialitate](/privacy). 🛹", + vpn: "Complet opțional, dar solid dacă vrei confidențialitate suplimentară 🛡️. Un VPN ascunde **IP-ul** tău (locația aproximativă) de serverele cu care vorbește SkateSpots — dale de hartă, relay-uri etc. Alege un furnizor fără loguri în care ai încredere (de ex. Mullvad); evită pe cele gratuite dubioase.\n\nAtenție: un VPN **nu** ascunde spoturile pe care le publici (acelea sunt publice) și nu activa GPS-ul browserului dacă încerci să rămâi anonim. Detalii complete pe [pagina de Confidențialitate](/privacy).", + tor: "Tor Browser îți oferă cea mai puternică confidențialitate a IP-ului — te rutează prin mai multe relay-uri, astfel încât serverele nu îți pot vedea IP-ul real 🧅. Compromis: este mai lent, iar hărțile + unele relay-uri Nostr pot întârzia sau bloca ieșirile Tor. Excelent pentru cei foarte precauți.\n\nReține: Tor ascunde IP-ul tău, nu spoturile pe care le publici, și nu activa GPS-ul browserului dacă anonimatul este scopul. Mai multe pe [pagina de Confidențialitate](/privacy).", + hideMyIp: "Două opțiuni gratuite 🛡️: un **VPN de încredere** (ușor, rapid — îți ascunde IP-ul în spatele serverelor lor) sau **Tor Browser** (confidențialitate maximă, mai lent). Oricare oprește serverele la care se conectează SkateSpots să îți vadă IP-ul real. Notă: nu ascund spoturile pe care le publici. Vezi [pagina de Confidențialitate](/privacy).", + isMyLocation: "Locația ta este în siguranță 📍 — 'Lângă mine' citește GPS-ul doar pe dispozitivul tău, pentru a centra harta și a sorta spoturile din apropiere. Nu este niciodată publicat pe Nostr, niciodată trimis nouă, niciodată partajat. Doar spoturile pe care le adaugi intenționat sunt publice. Detalii pe [pagina de Confidențialitate](/privacy).", + whatAreZaps: "Zap-urile sunt bacșișuri instant de Bitcoin Lightning trimise prin Nostr! Apasă ⚡ pe orice conținut, trimite sats direct în portofelul creatorului. Ca un 'like', dar cu bani reali. Instant, peer-to-peer, fără intermediari. ⚡", + howToLogin: "Două moduri:\n1. **Extensie de browser** (Desktop): Instalează Alby sau nos2x, apoi apasă 'Autentificare'\n2. **Utilizator nou**: Apasă 'Înregistrare' pentru a genera chei. Descarcă nsec-ul tău (cheia secretă) și SALVEAZĂ-L — acesta este contul tău pentru totdeauna!", + whatIsCashu: "Portofel Bitcoin integrat! Jetoane ecash Cashu susținute de Lightning — funcționează offline la spoturi, axat pe confidențialitate (mint-urile nu pot urmări plățile). Mergi la Portofel în Setări pentru a-l folosi. 🥜", + whatIsNwc: "Nostr Wallet Connect — ca USB-C pentru portofelele Lightning. Conectează Alby, Minibits, Zeus sau Coinos o dată și zap cu un singur clic pentru totdeauna. Criptat, tu controlezi limitele de cheltuieli. 🔌⚡", + isItFree: "100% gratuit. Fără reclame, fără abonamente, fără prostii corporative. Construit de skateri pentru skateri. Finanțat de comunitate prin Angor — vezi pagina Susținători. Poți de asemenea să câștigi Bitcoin prin zap-uri din comunitate pentru contribuția cu spoturi de calitate. 🛹", + whatCanIDo: "Descoperă spoturi în întreaga lume pe hartă, angajează profesioniști în The Lab (antrenori, filmers, fotografi, editori, constructori de rampe), rulează cu un crew, alătură-te evenimentelor, ia tururi, cumpără/vinde echipament, urmărește-ți Stash-ul privat, dă zap creatorilor, verifică vremea spoturilor și construiește comunitatea de skate descentralizată!", + whatIsTheLab: "The Lab este locul unde angajezi profesioniști din scena de skate: antrenori, filmers, fotografi, editori video și constructori de rampe/parkuri/DIY. Fiecare poate fi o persoană solo sau un colectiv (crew/studio) — membrii confirmă cu propriile chei, deci este legitim. Totul pe Nostr, fără conturi false. 🎓", + whatIsACrew: "Crews sunt familia ta de skate ancorată pe hartă — cu cine skatază, nu pe cine angajezi. Fiecare crew are teritoriu de origine pe hartă (pinuri turcoaz), spoturi de origine, membri, vibe-uri și un manifest. Membrii confirmă cu propria cheie. Creează unul la Crews → 'Creează Crew'. 🤘", + whatAreCrews: "Crews sunt familia ta de skate ancorată pe hartă — cu cine skatază, nu pe cine angajezi. Fiecare crew are teritoriu de origine pe hartă (pinuri turcoaz), spoturi de origine, membri și un manifest. Membrii confirmă cu propria cheie. Mergi la fila Crews pentru a începe sau a te alătura unuia! 🤘", + howToStartACrew: "Mergi la fila Crews → 'Creează Crew'. Denumește-l, plasează-ți teritoriul de origine pe hartă, adaugă vibe-uri (sau propriul #hashtag personalizat), leagă-ți spoturile de origine și adaugă membri după npub. Fiecare membru confirmă cu propria cheie, astfel încât lista este legitimă. 🤘", + whatIsMyStash: "Stash-ul meu este dulapul tău PRIVAT și criptat pentru echipament (criptare NIP-44). Urmărește-ți deck-urile, trucks-urile, wheels-urile, pantofii — cu locația de depozitare, starea, raritatea și prețul. Doar TU îl poți citi, cu excepția cazului în care marchezi articole publice. Excelent pentru asigurare sau planificarea unui schimb. 🎒", + whatIsStash: "Stash-ul meu este inventarul tău PRIVAT și criptat de echipament. Înregistrează tot ce deții — stare, unde este depozitat, valoare — totul criptat, astfel încât doar tu îl poți vedea. Marchează articolele publice dacă vrei să le vinzi sau să le arăți. 🎒", + whatIsABuilder: "Constructorii sunt crews de rampe/parkuri/DIY în The Lab pe care îi poți angaja pentru a construi tranziții, bowls, rails sau un întreg park. Ei listează ce construiesc, materialele, scara proiectului și pot fi licențiați/asigurați. Adesea colectiv — și pot lega spoturile pe care le-au construit la hartă. 🏗️", + whatIsANutzap: "Nutzaps (NIP-61) sunt bacșișuri ecash trimise prin Nostr — jetoane Cashu private trimise direct cuiva prin zap. Poți configura PRIMIREA de nutzap în Portofel. (Trimiterea completă de nutzaps se implementează — deocamdată folosește zap-uri Lightning.) 🥜⚡", + whatIsClink: "CLINK este un cod de plată nativ Nostr (un 'noffer'). Magazinele, crews și profesioniștii din Lab pot adăuga unul pentru a putea fi plătiți fără a avea nevoie de o adresă Lightning — vei vedea un buton 'Plătește via CLINK' cu un cod QR. Scanează-l cu un portofel CLINK precum ShockWallet. 🔗⚡ [specs](https://clinkme.dev/specs.html) [apps](https://clinkme.dev/apps.html)", + whatIsNoffer: "Un noffer este un cod de plată CLINK — o modalitate reutilizabilă, nativă Nostr, de a fi plătit fără un server web sau o adresă Lightning. Adaugă-l pe profilul tău de magazin/crew/Lab și oamenii te pot plăti direct. 🔗", + whatAreTours: "Tururile sunt călătorii de skate ghidate — sesiuni locale, excursii naționale sau tururi world destruction. Găsește-le pe hartă sau în secțiunea Tururi, întâlnește-te și skatază teren nou cu localnicii. 🗺️🛹", + whatIsAShop: "Skate Shopurile sunt magazine locale listate pe hartă. Descoperă și susține skate shopuri reale cu sediu fizic (sau online) din zona ta — unele chiar acceptă Bitcoin. 🏪", + howToSellGear: "Mergi la Gear Swap / Marketplace și creează un anunț (NIP-99). Adaugă fotografii, preț în sats, stare și, opțional, fixează-l la un spot pentru a apărea pe hartă. Cumpărătorii îți dau zap sau îți scriu direct. 🛹💸", + supporters: "SkateSpots este finanțat de comunitate prin Angor (crowdfunding Bitcoin descentralizat) — fără reclame, fără investitori, fără vânzare de date. Verifică pagina Susținători pentru a sprijini proiectul și a menține străzile libere. ❤️⚡", + trustScore: "Scorurile de încredere (0-100) alimentate de Relatr. Analizează rețeaua ta Nostr: urmăritori, activitate, implicare, zap-uri. Mai mare = mai de încredere. Ajută la filtrarea boților și spamului. Verifică orice profil pentru a-i vedea scorul. 🛡️", + whatRelay: "SkateSpots folosește: 🛹 goskatespots.nostr1.com (principal, pe listă albă pentru calitate) + relay.ditto.pub (global) + purplepag.es (agregator de profiluri). Datele tale sunt replicate pe toate pentru redundanță.", + tripPlanner: "Spune-mi un oraș și îți construiesc o călătorie de skate zi cu zi 🗺️ — spoturi, evenimente, antrenori și crews locale, atent la vreme (zi ploioasă = sfat de crew pentru spoturi acoperite). Încearcă 'plan me 3 days in Lisbon'. Pot salva totul într-o Colecție și te pot direcționa către zboruri/cazări pe site-urile reale (fără KYC, fără intermediari). 🛹", + planATrip: "Spune doar 'plan me 3 days in Barcelona' (sau orice oraș) și îți voi schița spoturi, sesiuni, antrenori și crews locale pentru fiecare zi. Salvează-l ca o Colecție și du-te și dă-i bice. 🗺️🛹", + sasquatchPro: "**Sasquatch Pro** 🦧⚡ este un pass de susținător Lightning care deblochează latura personală a mea:\n\n• 🧠 **Asistent personal** — îți citesc propriul Stash, crews, spoturi și anunțuri\n• ✨ **Ciorne de acțiuni** — listează echipament, postează-ți starea de skate, planifică călătorii (tu confirmi mereu înainte ca ceva să fie publicat)\n• 💬 **Context personal** — răspunsurile mele folosesc propriile tale date, nu doar rezultate publice\n• ⚡ **Susții proiectul** — menții SkateSpots gratuit și fără reclame\n\nSasquatch gratuit rămâne gratuit: căutare publică de spoturi/evenimente/antrenori/crews, glosarul și planificarea de călătorii funcționează toate fără Pro. Pro adaugă doar lucrurile *personale*. Apasă **⚡ Fă-ți Pro** sus. Niveluri: 7 zile ~2k sats, 1 lună ~5k, 3 luni ~12k, 1 an ~36k.", + proPerks: "Beneficii Pro 🦧⚡: asistent personal (îți citește Stash-ul/crews/spoturile/anunțurile), ciorne de acțiuni (listează echipament, postează stare, planifică călătorii — tu confirmi) și răspunsuri care folosesc propriul tău context personal. În plus, susții direct SkateSpots și îl menții gratuit + fără reclame. Gratuitul rămâne gratuit — Pro adaugă stratul personal. Apasă **⚡ Fă-ți Pro** sus.", + proVersion: "Versiunea Pro a mea 🦧⚡ adaugă un **asistent personal**: îți pot citi propriul Stash, crews, spoturi și anunțuri, pot redacta acțiuni pentru tine (listează echipament, postează o stare, planifică o călătorie — tu confirmi mereu mai întâi) și pot folosi contextul tău personal în răspunsurile mele. De asemenea, susține direct proiectul. Sasquatch gratuit (căutare spoturi/evenimente/antrenori/crews, glosar, planificator de călătorii) rămâne gratuit. Apasă **⚡ Fă-ți Pro** sus.", + perks: "Beneficii Pro 🦧⚡: asistent personal (Stash-ul/crews/spoturile/anunțurile tale), ciorne de acțiuni pe care le confirmi și răspunsuri care folosesc propriul tău context — plus menții aplicația gratuită și fără reclame. Apasă **⚡ Fă-ți Pro** sus.", + goPro: "Apasă butonul **⚡ Fă-ți Pro** din partea de sus pentru a deschide fereastra de upgrade. Pro deblochează asistentul meu personal (Stash/crews/spoturi/anunțuri) și ciornele de acțiuni și susține direct proiectul. Plătește cu Lightning — de la 7 zile ~2k sats până la 1 an ~36k sats. Funcțiile gratuite rămân gratuite. 🦧", + proPricing: "Niveluri Pro (plătește cu Lightning ⚡): **7 zile** ~2.000 sats (~$1,20), **1 lună** ~5.000 sats (~$3), **3 luni** ~12.000 sats (~$7, 20% reducere), **1 an** ~36.000 sats (~$21, cea mai bună valoare). Apasă **⚡ Fă-ți Pro** sus.", + howMuchIsPro: "Niveluri Pro: 7 zile ~2.000 sats, 1 lună ~5.000 sats, 3 luni ~12.000 sats (20% reducere), 1 an ~36.000 sats (cea mai bună valoare). Plătește cu Lightning ⚡. Apasă **⚡ Fă-ți Pro** sus.", + upgrade: "Pentru a face upgrade la Sasquatch Pro, apasă butonul **⚡ Fă-ți Pro** din partea de sus. Plătește cu Lightning (de la 7 zile ~2k sats până la 1 an ~36k). Pro deblochează asistentul meu personal și ciornele de acțiuni și susține direct proiectul. 🦧⚡", + }, + statsTitle: "📊 **SkateSpots în cifre**", + weatherTemp: "• {{temp}}°C (se simte {{feels}}°C)", + weatherSkateability: "• Skatabilitate: **{{label}}** ({{score}}/100)", + weatherError: "Nu am putut citi vremea acum. Încearcă din nou într-o secundă. 🌧️", + labelSpots: "spoturi", + labelEvents: "evenimente", + labelLabPros: "profesioniști Lab", + labelCrews: "crews", + labelShops: "magazine de skate", + labelTours: "tururi", + labelGear: "anunțuri de echipament", + unnamed: "Fără nume", + emptyWhere: " în **{{place}}**", + emptyResult: "Nu am găsit niciun {{label}}{{where}} acum 🦧\n\nAsta poate însemna că niciunul nu este listat încă — sau relay-urile au răspuns greu. Încearcă din nou într-o clipă, verifică ortografia sau [adaugă primul pe hartă](https://skate-spots.org/map). 🛹", + foundTitle: "{{emoji}} Am găsit **{{count}}** {{label}}:\n{{lines}}{{more}}", + moreResults: "\n\n…și încă **{{count}}** — [vezi-le pe toate pe hartă](https://skate-spots.org/map) 🗺️", + locationDenied: "Nu îți pot vedea locația — nimic nu părăsește vreodată dispozitivul tău; o citesc local doar când ceri, iar browserul tocmai a refuzat. Apasă 🎯 **Lângă mine** pe hartă sau spune-mi un oraș: \"spots in Bangkok\". 🛹", + noNearbySpots: "Niciun spot cartografiat lângă tine încă 🦧 — [fii primul care pune unul](https://skate-spots.org/create-spot). 🛹", + closestTitle: "Cele mai apropiate de tine chiar acum:", + closestFooter: "_Calculat pe dispozitivul tău — locația ta nu l-a părăsit niciodată._", + proNudge: "Asta este o chestie de **Sasquatch Pro** 🦧⚡ — cu Pro pot citi Stash-ul, crews, spoturile și anunțurile tale, pot redacta anunțuri de echipament, anunțuri de căutare și stări de skate și îți pot planifica călătoriile. Este un pass de susținător Lightning care menține SkateSpots gratuit și fără reclame. Apasă butonul **⚡ Fă-ți Pro** din partea de sus pentru a-l debloca. 🛹", + draftingProPerk: "Redactarea acțiunilor (postarea unei stări, listarea echipamentului) este un beneficiu **Sasquatch Pro** 🦧⚡ — apasă **⚡ Fă-ți Pro** sus pentru a-l debloca.", + draftIntro: "Iată o ciornă — verific-o și apasă pentru a publica. Nimic nu devine live până nu confirmi. 🛹", + draftFailed: "Nu am reușit să construiesc ciorna — încearcă să-mi spui din nou detaliile (de ex. \"listează-mi wheels-urile Spitfire pentru 8000 sats\").", + tripAskCity: "Unde mergem? Spune-mi un oraș (de ex. \"plan me 3 days in Lisbon\") și îți construiesc o călătorie. 🗺️", + tripEmptyMap: "Nimic pe hartă pentru **{{destination}}** încă 🦧 — fii primul care adaugă spoturi pe [skate-spots.org](https://skate-spots.org). Odată ce localnicii adaugă spoturi, crews și evenimente, îți construiesc o călătorie completă.", + tripLocked: "Ți-am fixat o misiune în **{{destination}}** 🛹 — spoturi, sesiuni și localnici mai jos. Ajusteaz-o sau salveaz-o.", + tripFailed: "Nu am putut accesa datele live pentru a planifica asta acum. Încearcă din nou într-o clipă! 🛹", + tripEmptyMapLocal: "Nimic pe hartă pentru **{{destination}}** încă 🦧 — fii primul pe [skate-spots.org](https://skate-spots.org).", + tripMissionLocal: "Iată o misiune în **{{destination}}** 🛹 — spoturi, sesiuni și localnici mai jos.", + relayFailed: "Relay-urile nu au răspuns la timp acum 🛰️ — de obicei este o conexiune lentă, nu un spot lipsă. Mai încearcă într-o clipă. 🛹", + couldNotProcess: "Hmm, nu am putut procesa asta. Încearcă să reformulezi!", + freeTierFallback: "Aceea necesită raționament AI — o funcție **Sasquatch Pro** ⚡🦧\n\nPot în continuare să găsesc **spoturi, evenimente, antrenori, crews, magazine, tururi și echipament** direct din relay-uri — întreabă-mă de ex. \"spots in Barcelona\" — iar [Glosarul](/glossary) acoperă peste 150 de tricks și termeni. Apasă **⚡ Fă-ți Pro** sus pentru a debloca răspunsurile AI.", + aiDownFallback: "Creierul meu AI ia puțin aer acum 🦧 — dar te am în continuare:\n\n• 🗺️ [Hartă](/) — spoturi, magazine, evenimente lângă tine\n• 🧪 [The Lab](/lab) — antrenori, filmers, editori\n• 📖 [Glosar](/glossary) — peste 150 de tricks și termeni\n• 👥 [Crews](/crews) — găsește-ți oamenii\n\nSau spune-mi pur și simplu un **oraș** (\"spots in Barcelona\") sau un **trick** (\"what's a nollie\") și îți răspund direct. 🛹", + wentWrong: "Ceva a mers prost la mine. Încearcă din nou într-o secundă! 🦧", + publishError: "Nu am putut publica asta: {{error}}. Încearcă din nou într-o secundă.", + unknownError: "eroare necunoscută", + }, +}; + +export default roBatch2; +export { roBatch2 }; diff --git a/src/i18n/ro/batch3.ts b/src/i18n/ro/batch3.ts new file mode 100644 index 0000000..40d081e --- /dev/null +++ b/src/i18n/ro/batch3.ts @@ -0,0 +1,1294 @@ +/** ro — batch 3. */ +const roBatch3 = { + settingsUi: { + proSupport: { + title: "Pro & Suport", + subtitle: "Extra opționale care mențin SkateSpots gratuit", + prepaidTitle: "Preplătit, nu un abonament", + prepaidBody: "Fiecare achiziție este o plată unică în Bitcoin/Lightning — fără cont, fără taxă recurentă, fără custodie. Dacă plătești din nou, îți prelungești perioada.", + sasquatchTitle: "Sasquatch Pro", + sasquatchBenefit: "Deblochează asistentul AI personal — poate citi propriul tău Stash, echipajele și anunțurile tale — și ajută la finanțarea proiectului.", + active: "Activ", + activeUntil: "Activ până la {{date}}", + daysLeft: "{{count}} zile rămase", + notActive: "Inactiv", + goPro: "Fă-te Pro", + extend: "Prelungește Pro", + day: "zi", + featuredTitle: "Plasare promovată", + featuredBenefit: "Împinge un anunț în top cu un badge Pro — pentru profiluri Lab, evenimente, magazine și tururi.", + featuredHow: "Nivelurile de durată se aplică pentru fiecare tip; angajamentele mai lungi costă mai puțin pe zi. Promovezi un anunț atunci când îl creezi sau îl editezi.", + featuredUntil: "Până la {{date}}", + yourFeatured: "Anunțurile tale promovate", + noneFeatured: "Nicio plasare promovată activă.", + freeTitle: "Căi gratuite", + freeBody: "Întrebările frecvente AI și căutarea locală sunt întotdeauna gratuite, iar tu poți publica un anunț pe piață cu un proof-of-work gratuit în loc de taxa în sats." + }, + notFound: { + seoTitle: "404 - Pagina nu a fost găsită", + seoDescription: "Pagina pe care o cauți nu a putut fi găsită. Reveniți la pagina principală pentru a continua navigarea.", + message: "Hopa! Pagina nu a fost găsită", + returnHome: "Înapoi la pagina principală" + }, + loginArea: { + signUp: "Înregistrare", + logIn: "Autentificare" + }, + accountSwitcher: { + switchAccount: "Schimbă contul", + walletSettings: "Setări portofel", + addAccount: "Adaugă un alt cont", + logout: "Deconectare" + }, + amberHint: { + defaultAction: "trimite", + multiBefore: "Semnatarul tău îți va cere să aprobi", + multiTimes: "de {{approvals}} ori", + multiAfter: "pentru a {{action}} — este normal pentru mesajele criptate (o aprobare per destinatar). Aprobă fiecare.", + single: "Semnatarul tău îți va cere să aprobi pentru a {{action}}." + }, + amberCallback: { + processing: "Se procesează autentificarea Amber...", + gotResult: "Rezultat primit: {{result}}", + noResultDebug: "Niciun rezultat de la Amber", + noResultToast: "Nu s-a primit niciun rezultat de la Amber. Operațiunea poate a fost anulată.", + validPubkey: "Cheie publică validă! Se autentifică...", + loginSuccessful: "Autentificare reușită!", + loginErrorDebug: "Eroare de autentificare: {{error}}", + invalidResultDebug: "Format de rezultat invalid: {{result}}", + loggedInTitle: "Autentificat", + amberLoginDesc: "Te-ai autentificat cu succes cu Amber!", + loginFailedTitle: "Autentificare eșuată", + loginFailedDesc: "Nu s-a putut finaliza autentificarea Amber. Încearcă din nou.", + invalidPubkeyDesc: "Cheie publică invalidă primită de la Amber.", + sessionLostToast: "Datele sesiunii s-au pierdut. Încearcă din nou.", + eventSignedTitle: "Eveniment semnat", + eventSignedDesc: "Evenimentul tău a fost semnat de Amber.", + signingFailedTitle: "Semnare eșuată", + signingFailedDesc: "Nu s-a putut procesa evenimentul semnat de la Amber.", + operationCompleteTitle: "Operațiune finalizată", + operationCompleteDesc: "{{op}} finalizat." + }, + loginDialog: { + loginWithAmber: "Autentificare cu Amber (Android)", + welcomeTitle: "Bine ai venit la SkateSpots", + welcomeSubtitle: "Înregistrează-te sau autentifică-te pentru a continua", + newHere: "Ești nou pe aici?", + createFree: "Creează un cont gratuit. Nu este nevoie de email.", + createAccount: "Creează cont", + orLogIn: "Sau autentifică-te", + loggedInTitle: "🛹 Autentificat!", + loggedIn: "Autentificat!", + connectedAmber: "Conectat prin Amber!", + amberLoginFailed: "Autentificarea Amber a eșuat", + amberCancelled: "Autentificare anulată. Atinge \"Deschide Amber\" pentru a încerca din nou.", + amberNotFound: "Amber nu a fost găsit. Asigură-te că Amber este instalat din ZapStore.", + loginFailed: "Autentificare eșuată", + pubkeyError: "Lipește cheia ta publică hex (64 caractere) sau npub de la Amber", + pairedSigner: "Împerecheat cu semnatarul tău.", + connectFailed: "Nu s-a putut conecta la semnatarul tău.", + openedEncrypted: "Cheia ta criptată a fost deschisă.", + openKeyFailed: "Cheia respectivă nu a putut fi deschisă.", + bunkerPrefix: "Trebuie să înceapă cu bunker://", + connectedBunker: "Conectat prin bunker!", + bunkerFailed: "Eșuat: {{error}}", + checkBunkerUri: "Verifică URI-ul bunker", + nsecPrefix: "Trebuie să înceapă cu nsec1", + invalidNsec: "nsec invalid: {{error}}", + checkKey: "Verifică cheia", + noExtensionTitle: "Nicio extensie găsită", + noExtensionDesc: "Instalează Alby sau o altă extensie NIP-07.", + amberIdleDesc: "Cheia ta rămâne în Amber. O atingere — aprobi în Amber și te întorci aici, autentificat. Nimic de copiat.", + continueWithAmber: "Continuă cu Amber", + noAmberGetIt: "Nu ai Amber? Obține-l →", + waitingAmberTitle: "Se așteaptă Amber…", + waitingAmberDesc: "Aprobă cererea în Amber. Vei fi autentificat automat în momentul în care te întorci.", + openAmberAgain: "Deschide Amber din nou", + havingTrouble: "Ai probleme? Introdu cheia manual", + enterPublicKey: "Introdu cheia ta publică", + enterPublicKeyDescBefore: "Doar dacă fluxul automat nu a funcționat. În Amber: atinge profilul tău →", + copyPublicKey: "Copiază cheia publică", + enterPublicKeyDescAfter: "apoi lipește-o aici.", + connect: "Conectează", + back: "← Înapoi", + signInWithPhone: "Autentifică-te cu telefonul", + signInWithPhoneDesc: "Scanează cu o aplicație de semnare (Amber, nsec.app). Cheia ta nu părăsește niciodată telefonul.", + showPairingCode: "Afișează codul de împerechere", + waitingSigner: "Se așteaptă semnatarul tău…", + copyLink: "Copiază linkul", + orPasteBunker: "sau lipește un URL bunker", + bunkerTitle: "Bunker (NIP-46)", + bunkerPasteBefore: "Lipește", + bunkerPasteAfter: "URI.", + amberInstructions: "Setări → NIP-46 Bunker → Creare → Copiere", + nsecAppInstructions: "Conectează aplicația → Copiază URI-ul bunker", + secretKeyTitle: "Cheie secretă", + secretKeyRawDesc: "Lipește direct cheia ta secretă Nostr.", + secretKeyEncDesc: "Deschide o copie de rezervă a cheii protejată cu parolă.", + rawNsec: "nsec brut", + encryptedNip49: "Criptat (NIP-49)", + nsecWarning: "⚠️ Folosește-o doar pe un dispozitiv de încredere. Nu-ți partaja niciodată nsec-ul.", + login: "Autentificare", + encSaferDesc: "Mai sigur: cheia rămâne criptată până când introduci parola, astfel încât copia de rezervă este sigură de păstrat în stocarea cloud sau într-un manager de parole.", + password: "Parolă", + openEncryptedKey: "Deschide cheia criptată", + browserExtensionTitle: "Extensie de browser (NIP-07)", + browserExtensionDesc: "Ideal pentru desktop. Funcționează cu Alby, nos2x, Flamingo.", + loginWithExtension: "Autentificare cu extensia" + }, + signupDialog: { + download: "Descarcă", + stepChoose: "Alege", + stepProfile: "Profil", + stepSaveKey: "Salvează cheia", + somethingWrong: "Ceva a mers greșit", + createFailed: "Contul tău nu a putut fi creat. Încearcă din nou.", + keySavedTitle: "Cheie secretă salvată!", + keySavedDesc: "Cheia ta a fost stocată în siguranță.", + downloadFailedTitle: "Descărcare eșuată", + downloadFailedDesc: "Fișierul cheii nu a putut fi descărcat. Copiază-l manual.", + encSavedTitle: "Copie de rezervă criptată salvată 🔐", + encSavedDesc: "Păstrează fișierul ȘI parola — ai nevoie de ambele pentru a te autentifica din nou.", + encFailed: "Cheia respectivă nu a putut fi criptată.", + invalidFileTitle: "Tip de fișier invalid", + invalidFileDesc: "Selectează un fișier imagine pentru avatarul tău.", + fileTooLargeTitle: "Fișier prea mare", + fileTooLargeDesc: "Imaginea de avatar trebuie să fie mai mică de 5MB.", + avatarUploadedTitle: "Avatar încărcat!", + avatarUploadedDesc: "Avatarul tău a fost încărcat cu succes.", + uploadFailedTitle: "Încărcare eșuată", + uploadFailedDesc: "Încărcarea avatarului a eșuat. Încearcă din nou.", + nameRequiredTitle: "Nume de afișare necesar", + nameRequiredDesc: "Alege un nume de afișare ca ceilalți skateri să știe cine ești. Îl poți schimba oricând.", + reserveFailedTitle: "Numele respectiv nu a putut fi rezervat", + reserveFailedDesc: "{{error}} Îl poți revendica mai târziu din Setări.", + profileCreatedTitle: "Profil creat!", + profileCreatedDesc: "Profilul tău a fost configurat.", + profileFailedTitle: "Configurarea profilului a eșuat", + profileFailedDesc: "Contul tău a fost creat, dar configurarea profilului a eșuat. Îl poți actualiza mai târziu.", + welcomeToastTitle: "Bine ai venit!", + welcomeToastDesc: "Contul tău este gata.", + titleWelcome: "Alătură-te SkateSpots", + titleProfile: "Configurează-ți profilul", + titleDone: "Bine ai venit!", + createFreeAccount: "Creează-ți contul gratuit", + createFreeAccountDesc: "Fără email, fără telefon, fără parolă. Contul tău este o cheie Nostr — alege unde locuiește.", + recommended: "Recomandat", + signUpWithAmber: "Înregistrează-te cu Amber", + signUpWithAmberDesc: "Cheia ta este creată și stocată în aplicația Amber — SkateSpots nu o atinge niciodată. Cel mai sigur. O atingere pentru a aproba.", + continueWithAmber: "Continuă cu Amber", + orQuickWay: "sau calea rapidă", + quickAccount: "Cont rapid pe acest dispozitiv", + quickAccountDesc: "Generăm o cheie care locuiește pe acest dispozitiv. Cel mai rapid start — te ajutăm să salvezi o copie de rezervă imediat după.", + createQuickAccount: "Creează cont rapid", + quickReassurance: "Durează 5 secunde · locuiește pe acest dispozitiv · te ajutăm să faci o copie de rezervă în continuare", + preferAnotherSigner: "Preferi alt semnatar?", + iosDesktopNudge: "Pe iOS sau desktop? O aplicație de semnare sau o extensie de browser este cea mai sigură opțiune —", + seeAllOptions: "Vezi toate opțiunile", + youreInPickName: "Ai intrat! 🛹 Alege un nume de afișare ca skaterii să știe cine ești", + changeAnytime: "Îl poți schimba oricând mai târziu. Biografia și avatarul sunt opționale.", + publishingProfile: "Se publică profilul tău...", + displayName: "Nume de afișare", + displayNamePlaceholder: "de ex. Tony, gnarlyGrind, sau numele echipajului tău", + displayNameHint: "Necesar — cum vei apărea în tot SkateSpots. Schimbă-l oricând.", + skateName: "Numele tău SkateSpots", + skateNameHint: "Gratuit și opțional — un handle verificat care afișează un ✓ pe profilul tău.", + bio: "Bio", + bioPlaceholder: "Spune-le altora despre tine...", + avatar: "Avatar", + uploadAvatar: "Încarcă imaginea de avatar", + saving: "Se salvează...", + saveAndStart: "Salvează și începe să skateuiești", + addNameToContinue: "Adaugă un nume de afișare pentru a continua.", + savingPublishesNote: "Salvarea publică profilul tău pe Nostr — semnatarul tău îți poate cere să-l aprobi o dată.", + youreIn: "Ai intrat! 🛹", + oneQuickThing: "Un lucru rapid înainte să te lansezi…", + saveLoginKey: "Salvează-ți cheia de autentificare", + saveLoginKeyBefore: "Aceasta este", + only: "singura", + saveLoginKeyAfter: "cale înapoi în contul tău — fără email, fără resetare de parolă. Salvează-o acum și te poți autentifica pe orice dispozitiv, oriunde skateuiești.", + revealSaveKey: "Dezvăluie și salvează-mi cheia", + recoveryCopied: "Codul de recuperare a fost copiat. Păstrează-l într-un loc sigur.", + saved: "Salvat", + treatLikeBoardKeys: "Tratează-l ca pe cheile plăcii tale — oricine are acest cod îți controlează contul. Nu-l partaja niciodată.", + hideEncBackup: "Ascunde copia de rezervă criptată", + saveEncBackup: "Salvează o copie de rezervă criptată", + encBackupBefore: "O copie protejată cu parolă — sigură de păstrat în stocarea cloud sau într-un manager de parole. Vei avea nevoie de fișier", + and: "și", + encBackupAfter: "parola.", + choosePassword: "Alege o parolă", + saveEncBackupCta: "Salvează copia de rezervă criptată", + savedCodeAria: "Mi-am salvat codul de recuperare", + savedCodeLabel: "Mi-am salvat codul de recuperare într-un loc sigur — un manager de parole, sau scris pe hârtie offline.", + letsSkate: "Hai la skate", + saveLater: "Îl voi salva mai târziu din Setări", + advancedSigner: "Avansat: folosește în schimb o aplicație de semnare" + }, + mnemonic: { + generatedTitle: "Frază de recuperare generată! 🎉", + generatedDesc: "Notează aceste 12 cuvinte în ordine. Sunt cheia contului tău!", + savedTitle: "Frază de recuperare salvată!", + savedDesc: "Păstrează acest fișier într-un loc sigur.", + downloadFailedTitle: "Descărcare eșuată", + downloadFailedDesc: "Fișierul nu a putut fi descărcat. Copiază manual.", + copiedTitle: "Copiat în clipboard!", + copiedDesc: "Fraza ta de recuperare a fost copiată.", + qrWindowTitle: "Cod QR al frazei de recuperare", + qrHeading: "Codul QR al frazei tale de recuperare", + qrAlt: "Cod QR al frazei de recuperare", + qrWarning: "Păstrează acest cod QR privat și în siguranță!", + qrPrint: "Tipărește codul QR", + qrFailedTitle: "Codul QR a eșuat", + qrFailedDesc: "Codul QR nu a putut fi generat.", + accountCreatedTitle: "Cont creat! 🎉", + accountCreatedDesc: "Ești gata! Fraza ta de recuperare este în siguranță.", + loginFailedTitle: "Autentificare eșuată", + loginFailedDesc: "Crearea contului a eșuat. Încearcă din nou.", + verifyFailedTitle: "Verificare eșuată", + verifyFailedDesc: "Cuvintele nu se potrivesc. Verifică și încearcă din nou.", + titlePrefix: "Creează cont cu", + titleSuffix: "frază de recuperare", + twelveWordTitle: "Frază de recuperare de 12 cuvinte", + twelveWordDesc: "Fraza ta de recuperare este ca o parolă principală. Noteaz-o pe hârtie și păstreaz-o în siguranță. Vei avea nevoie de ea pentru a-ți accesa contul de pe alte dispozitive sau dacă ștergi datele browserului.", + generate: "Generează fraza de recuperare", + useNsecInstead: "Folosește în schimb cheia nsec avansată", + yourPhrase: "Fraza ta de recuperare", + copy: "Copiază", + download: "Descarcă", + qrCode: "Cod QR", + criticalWarning: "Avertisment critic de securitate", + warnWriteStrong: "Noteaz-o", + warnWrite: "pe hârtie și păstreaz-o în siguranță", + warnNeverShareStrong: "Nu o partaja niciodată", + warnNeverShare: "pe fraza ta de recuperare cu nimeni", + warnBackupsStrong: "Păstrează mai multe copii de rezervă", + warnBackups: "în locații sigure diferite", + warnAnyoneStrong: "Oricine are această frază", + warnAnyone: "îți controlează contul pentru totdeauna", + warnLoseStrong: "Dacă o pierzi", + warnLose: "îți pierzi contul definitiv", + savedSecurely: "Am salvat-o în siguranță", + verifyTitle: "Verifică-ți fraza de recuperare", + verifyDesc: "Pentru a te asigura că ai salvat-o corect, te rugăm să introduci aceste cuvinte:", + wordLabel: "Cuvântul #{{n}}", + wordPlaceholder: "Introdu cuvântul #{{n}}", + goBack: "Înapoi", + verifyCreate: "Verifică și creează contul", + completeTitle: "Cont creat!", + completeDesc: "Contul tău Nostr este gata!", + signerTitle: "Recomandat: configurează o aplicație de semnare", + signerSubtitle: "Păstrează-ți cheile și mai în siguranță", + signerDesc: "Pentru o securitate mai bună, folosește o aplicație dedicată de semnare în loc să lipești fraza de recuperare peste tot. Aplicațiile de semnare îți păstrează cheile în siguranță permițându-ți să folosești orice aplicație Nostr.", + signerCta: "Află despre aplicațiile de semnare", + skip: "Sari peste deocamdată" + }, + signupMethod: { + titlePrefix: "Alege-ți", + titleSuffix: "metoda de înregistrare", + subtitle: "Ambele metode sunt sigure. Alege ce ți se potrivește cel mai bine!", + recommended: "Recomandat", + mnemonicTitle: "Frază de recuperare", + mnemonicDesc: "12 cuvinte ușor de reținut. Standardul industriei folosit de Bitcoin, Ethereum și majoritatea portofelelor crypto.", + mnemonicF1: "Ușor de notat pe hârtie", + mnemonicF2: "Funcționează cu alte aplicații Nostr (NIP-06)", + mnemonicF3: "Poate genera mai multe conturi", + mnemonicF4: "Familiar utilizatorilor de crypto", + useMnemonic: "Folosește fraza de recuperare", + advanced: "Avansat", + nsecTitle: "Cheie secretă (nsec)", + nsecDesc: "Cheie criptografică brută. Mai tehnică, dar îți oferă acces direct la identitatea ta Nostr.", + nsecF1: "Control criptografic direct", + nsecF2: "Compatibilă cu toate aplicațiile Nostr", + nsecF3: "Un singur șir de backup", + nsecF4: "Fără strat de derivare", + useNsec: "Folosește cheia secretă", + footer: "🔒 Ambele metode sunt la fel de sigure. Alege după preferința ta!" + }, + skateNip05: { + placeholder: "numeletau", + claimedSuffix: "este al tău — salvează-ți profilul pentru a-l publica.", + checking: "Se verifică disponibilitatea…", + available: "{{name}}@{{domain}} este disponibil", + claim: "Revendică-l", + hint: "Litere, cifre, cratime. Gratuit și afișat ca un badge ✓ pe profilul tău." + }, + nip05Required: { + getFree: "Obține un NIP-05 gratuit / ieftin", + paid: "Contra cost", + requiredTitle: "Verificare NIP-05 necesară", + bannerReason: "Pentru a preveni spamul și a construi încredere, {{role}} au nevoie de o adresă Nostr verificată (NIP-05).", + gateReason: "Pentru a preveni spamul și a construi încredere, {{role}} trebuie să aibă verificare NIP-05.", + addInSettings: "Adaugă NIP-05 în Setări", + explainer: "NIP-05 îți dovedește identitatea asociind profilul tău Nostr cu un domeniu — precum", + updateProfile: "Actualizează-ți profilul" + }, + editProfile: { + uploadSuccessTitle: "Succes", + uploadSuccessDesc: "{{field}} a fost încărcat cu succes", + uploadErrorDesc: "Încărcarea {{field}} a eșuat. Încearcă din nou.", + mustBeLoggedIn: "Trebuie să fii autentificat pentru a-ți actualiza profilul", + invalidClinkTitle: "Cod CLINK invalid", + invalidClinkDesc: "Nu pare a fi un cod noffer1… valid. Șterge-l sau lipește unul valid.", + invalidLightningTitle: "Adresă Lightning invalidă", + invalidLightningDesc: "Folosește o adresă de tip email, precum tu@walletofsatoshi.com.", + invalidSpTitle: "Adresă Silent Payment invalidă", + invalidSpDesc: "O adresă Silent Payment începe cu \"sp1\" și este destul de lungă. Șterge-o sau lipește una validă.", + invalidCordnTitle: "Link Cordn invalid", + invalidCordnDesc: "Lipește un link de contact Cordn complet https://… .", + updateSuccessTitle: "Succes", + updateSuccessDesc: "Profilul tău a fost actualizat", + updateErrorDesc: "Publicarea profilului a eșuat. Verifică conexiunile la relay în Setări > Relay-uri", + identityTitle: "Identitate", + identityDesc: "Cum apari în tot SkateSpots.", + displayName: "Nume de afișare", + displayNamePlaceholder: "Numele tău", + bio: "Bio", + bioPlaceholder: "Câteva cuvinte despre tine și skateboardingul tău…", + profilePicture: "Poză de profil", + pictureDesc: "Încarcă sau lipește o imagine pătrată.", + bannerImage: "Imagine de banner", + bannerDesc: "O imagine lată pentru partea de sus a profilului tău.", + website: "Site web", + bitcoinTitle: "Bitcoin & Plăți", + bitcoinDesc: "Lasă oamenii să te zapeze, să te ciuplească și să te plătească direct — fără intermediari.", + lightningAddress: "Adresă Lightning", + lud16Invalid: "Folosește o adresă de tip email, de ex. tu@domeniultau.com.", + lud16Ok: "Alimentează butonul „Zap” de pe profilul tău.", + lud16Hint: "Ciupleli Bitcoin instant. Alimentează butonul „Zap” de pe profilul tău.", + silentPaymentAddress: "Adresă Silent Payment", + spInvalid: "Ar trebui să înceapă cu „sp1” și să fie destul de lungă.", + spOk: "Validă — o adresă on-chain reutilizabilă și privată.", + spHint: "Adresă on-chain statică reutilizabilă (BIP-352). Partajeaz-o o dată; fiecare plată este neliabilă.", + clinkTipCode: "Cod de ciupeală CLINK", + nofferInvalid: "Nu pare a fi un cod noffer1… valid.", + nofferOk: "Valid — un buton „Ciupeală în Bitcoin” va apărea pe profilul tău.", + nofferHint: "Cod CLINK auto-custodiat, astfel încât oricine te poate ciupli prin Nostr — fără intermediari.", + skateProfileTitle: "Profil de skate", + skateProfileDesc: "Sponsorii tăi și modul în care echipajul te contactează.", + badges: "Insigne", + badgesHint: "(etichetă + link opțional)", + badgeExample: "de ex. Independent Trucks", + badgeLabelPlaceholder: "Etichetă insignă…", + badgeUrlPlaceholder: "https://… (opțional)", + removeBadge: "Elimină insigna", + addBadge: "Adaugă insignă", + badgesDescBefore: "Sponsori, magazine sau oameni care îți susțin skateboardingul — și orice altceva vrei să arăți. Fiecare devine un chip pe care se poate da clic pe profilul tău. Insigna ta de", + badgesDescAfter: "membru este adăugată automat.", + coordinator: "Coordonator", + cordnInvalid: "Nu pare a fi un coordonator. Lipește un nprofile, un link cordn.net sau un URL https://.", + cordnOk: "Afișat pe profilul tău — ceilalți îl pot adăuga cu o atingere.", + cordnHint: "Coordonatorul Cordn pe care îl folosesc ceilalți pentru a-ți scrie. Privat, criptat, al tău.", + useMyCoordinator: "Folosește coordonatorul meu", + accountTitle: "Cont", + accountDesc: "Setări suplimentare de cont.", + botAccount: "Cont bot", + botAccountDesc: "Marchează acest cont ca automatizat sau bot.", + saving: "Se salvează…", + saveProfile: "Salvează profilul", + nip05VerifiedHandle: "Handle verificat NIP-05", + nip05How: "Cum?", + extraHandles: "Handle-uri suplimentare", + extraHandlesHint: "opțional — adaugă până la 5", + nip05HintEmpty: "Un handle verificat precum tu@domeniultau.com — versiunea Nostr a unei bife albastre. Afișează un badge ✓ pe profilul tău și deblochează filtrul „Verificat” din directorul Skateri.", + nip05Invalid: "Folosește un handle de tip email, de ex. tu@domeniultau.com — fără „https://” sau spații.", + nip05Checking: "Se verifică domeniul tău…", + nip05Verified: "Verificat — domeniul tău confirmă că acest handle îți aparține. ✓", + nip05Mismatch: "Domeniul tău asociază acest handle unei ALTE chei. Corectează-ți .well-known/nostr.json ca să indice acest cont.", + nip05Unreachable: "Domeniul tău /.well-known/nostr.json nu a putut fi accesat încă. Handle-urile salvate funcționează totuși odată ce domeniul este configurat corect.", + nip05Enter: "Introdu handle-ul tău NIP-05.", + freeHandleBefore: "Nu ai un domeniu propriu? Revendică un", + freeHandleAfter: "handle gratuit de la SkateSpots.", + uploadLabel: "Încarcă {{label}}", + previewLabel: "Previzualizare {{label}}" + }, + security: { + recoveryCopied: "Codul de recuperare a fost copiat. Păstrează-l într-un loc sigur.", + savedTitle: "Salvat!", + recoveryDownloaded: "Codul de recuperare a fost descărcat. Păstrează-l într-un loc sigur.", + downloadFailedTitle: "Descărcare eșuată", + downloadFailedDesc: "Copiază-l manual în schimb.", + loginRequired: "Autentificare necesară", + loginRequiredDesc: "Autentifică-te pentru a accesa setările de securitate.", + backupConfirmedTitle: "Copie de rezervă confirmată! ✅", + backupConfirmedDesc: "Grozav! Cheile tale sunt în siguranță.", + yourRecoveryCode: "Codul tău de recuperare", + recoveryCodeDesc: "Nu l-ai salvat la înregistrare? Îl poți lua de aici oricând.", + recoveryCodeBefore: "Acest cod este", + only: "singura", + recoveryCodeAfter: "cale de a te autentifica din nou pe un dispozitiv sau browser nou. Salvează-l într-un loc sigur (un manager de parole sau scris pe hârtie). Oricine îl are îți controlează contul — nu-l partaja niciodată.", + revealRecovery: "Dezvăluie-mi codul de recuperare", + qrHint: "Scanează cu altă aplicație Nostr pentru a te autentifica. Ține acest ecran privat.", + neverShareHide: "⚠️ Nu partaja niciodată acest lucru. Ascunde-l când ai terminat.", + hide: "Ascunde", + amberNoteBefore: "Ești autentificat cu", + amberNoteAfter: ". Codul tău de recuperare locuiește în Amber — deschide aplicația Amber pentru a-l salva. SkateSpots nu-ți vede niciodată cheia.", + bunkerNoteBefore: "Ești autentificat cu un", + remoteSigner: "semnatar la distanță (bunker)", + bunkerNoteAfter: ". Codul tău de recuperare este deținut de serviciul tău de semnare, nu de SkateSpots. Salvează-l acolo.", + extensionNoteBefore: "Ești autentificat cu o", + browserExtension: "extensie de browser", + extensionNoteAfter: ". Codul tău de recuperare locuiește în extensie — folosește opțiunea ei de backup/export. SkateSpots nu-ți vede niciodată cheia.", + otherNote: "Codul tău de recuperare este gestionat de aplicația ta de semnare, nu de SkateSpots. Salvează-l acolo.", + backupWarningTitle: "⚠️ Ți-ai salvat fraza de recuperare sau cheia secretă?", + backupWarningBody: "Cheile tale sunt SINGURA cale de a-ți accesa contul. Dacă le pierzi, pierzi totul - nu există resetare de parolă!", + iveBackedUp: "Mi-am salvat cheile", + backupConfirmed: "✅ Copie de rezervă confirmată", + backupNotConfirmed: "⚠️ Copie de rezervă neconfirmată", + backupConfirmedStatusDesc: "Ai confirmat că cheile tale sunt salvate în siguranță.", + backupNotConfirmedDesc: "Asigură-te că îți salvezi fraza de recuperare sau cheia secretă!", + notSavedYetBefore: "Nu ți-ai salvat încă codul de recuperare? Nicio problemă — ia-l din", + notSavedYetAfter: "secțiunea de mai sus, păstrează-l într-un loc sigur, apoi confirmă mai jos.", + yesBackedUp: "Da, mi-am salvat cheile", + bestPracticesTitle: "Cele mai bune practici pentru securitatea cheilor", + bestPracticesDesc: "Cum să-ți păstrezi contul Nostr în siguranță", + bp1Title: "Noteaz-o pe hârtie", + bp1Desc: "Backup-ul fizic este cel mai sigur. Păstrează-l într-un loc securizat, cum ar fi un seif.", + bp2Title: "Mai multe copii de rezervă", + bp2Desc: "Păstrează copii în locații sigure diferite (seif acasă, casetă de valori la bancă etc.)", + bp3Title: "Nu-ți partaja niciodată cheile", + bp3Desc: "Aplicațiile Nostr reale nu îți cer NICIODATĂ nsec-ul sau fraza de recuperare după autentificarea inițială", + bp4Title: "Nu le stoca necriptat în cloud", + bp4Desc: "Evită Google Docs, ciorne de email sau stocarea în cloud în text simplu", + bp5Title: "Ia în considerare o extensie de browser", + bp5Desc: "Alby, nos2x sau Flamingo îți păstrează cheile în siguranță și nu le expun niciodată site-urilor", + importantReminders: "⚠️ Memento-uri importante", + rem1: "Dacă îți pierzi cheile, îți pierzi contul definitiv", + rem2: "Nicio companie sau persoană nu îți poate reseta parola - nici măcar noi", + rem3: "Oricine are cheile tale are control deplin asupra contului tău", + rem4: "Cheile tale controlează toate datele tale Nostr în TOATE aplicațiile", + recommendedSigners: "🔌 Semnatari Nostr recomandați", + recommendedSignersDesc: "Folosește un semnatar Nostr pentru securitate și confort mai bune", + recommended: "Recomandat", + amberDesc: "Semnatar Nostr sigur pentru Android. Îți păstrează cheile în siguranță pe telefon și semnează evenimente fără a le expune.", + albyDesc: "Extensie completă cu portofel Lightning, WebLN și suport NWC.", + flamingoDesc: "Interfață simplă și curată. Se concentrează pe semnarea Nostr fără funcții de portofel.", + nos2xDesc: "Extensie minimală și ușoară pentru utilizatori avansați.", + nostrConnectTitle: "☁️ Nostr Connect (semnatari la distanță)", + nostrConnectDesc: "Folosește un semnatar la distanță pentru a-ți accesa contul de pe orice dispozitiv", + nostrConnectBody: "Nostr Connect (numit și \"bunkers\") îți permite să-ți stochezi cheile pe un server sigur și să te autentifici de pe orice dispozitiv. Cheile tale nu părăsesc niciodată serverul, dar îți poți folosi contul oriunde!", + nsecAppDesc: "Semnatar la distanță gratuit și sigur. Creează URI bunker:// și lipește-l la autentificare.", + nostrumDesc: "O altă opțiune de semnatar la distanță cu suport mobil.", + howToUse: "💡 Cum se folosește:", + howToUseDesc: "Creează un cont pe unul dintre aceste servicii, obține șirul tău de conexiune bunker://, apoi lipește-l în fila \"Nostr Connect\" la autentificare." + }, + relayList: { + connected: "Conectat", + connecting: "Se conectează…", + offline: "Offline", + removeUrl: "Elimină {{url}}", + add: "Adaugă", + publishedTitle: "Listă de relay publicată", + publishedDesc: "Sincronizat pe Nostr (kind 10002).", + publishFailedTitle: "Publicarea listei de relay a eșuat", + invalidUrlTitle: "URL de relay invalid", + invalidUrlDesc: "Încearcă ceva de genul wss://relay.example.com", + alreadyInList: "Relay-ul este deja în lista ta", + keepReadWriteTitle: "Păstrează citirea sau scrierea pe", + keepReadWriteDesc: "Un relay are nevoie de cel puțin una dintre citire/scriere.", + alreadyInThisList: "Relay-ul este deja în această listă", + dmPublishedTitle: "Relay-uri DM publicate", + dmPublishedDesc: "Inbox NIP-17 actualizat.", + dmPublishFailedTitle: "Publicarea relay-urilor DM a eșuat", + nip65Title: "Relay-uri (NIP-65)", + nip65DescUser: "Atinge Citire / Scriere pentru a comuta. Publicat pe Nostr ca lista ta kind 10002.", + nip65DescLoggedOut: "Atinge Citire / Scriere pentru a comuta. Autentifică-te pentru a-ți publica lista pe Nostr.", + noRelays: "Niciun relay încă — adaugă unul mai jos.", + local: "Local", + read: "Citire", + readHint: "Obține conținut de la acest relay", + write: "Scriere", + writeHint: "Publică-ți evenimentele pe acest relay", + dmTitle: "Relay-uri pentru inbox DM", + dmDesc: "Unde primești mesaje directe NIP-17 (kind 10050). Revine la relay-urile tale de scriere când este gol.", + localTitle: "Relay-uri locale", + localDesc: "Doar în aplicație (de ex. un nod LAN). Folosite pentru citiri și scrieri; niciodată publicate.", + blockedTitle: "Relay-uri blocate", + blockedDesc: "Nu te conecta niciodată la acestea — excluse din fiecare citire și scriere." + }, + relatr: { + searchingTitle: "Se caută serviciul Relatr...", + searchingDesc: "Se interoghează Nostr pentru profiluri Relatr", + foundTitle: "Serviciu Relatr găsit!", + foundDesc: "Serviciu: {{name}}", + unknown: "Necunoscut", + notFoundTitle: "Niciun serviciu Relatr găsit", + notFoundDesc: "Încearcă să introduci cheia publică manual sau verifică https://www.relatr.xyz/", + searchFailedTitle: "Căutare eșuată", + searchFailedDesc: "Nostr nu a putut fi interogat pentru profiluri Relatr", + invalidPubkeyTitle: "Cheie publică invalidă", + invalidPubkeyDesc: "Introdu o cheie publică hex validă de 64 de caractere", + enabledTitle: "Relatr activat!", + enabledDesc: "Scorurile de încredere globale sunt acum active.", + disabledTitle: "Relatr dezactivat", + disabledDesc: "Scorurile de încredere nu mai sunt preluate.", + title: "Scoruri de încredere Relatr", + desc: "Scorurile de încredere globale ajută la identificarea utilizatorilor de încredere și reduc spamul", + status: "Stare", + active: "Activ", + disabled: "Dezactivat", + activeStrong: "Relatr este activ.", + activeDesc: "Scorurile de încredere din analiza rețelei globale a ContextVM ajută la identificarea skaterilor de încredere și reduc spamul.", + disabledStrong: "Relatr este dezactivat.", + disabledHint: "Activează-l pentru a obține scoruri de încredere din rețeaua globală Nostr.", + disable: "Dezactivează Relatr", + enable: "Activează Relatr", + advancedSettings: "Setări avansate", + servicePubkey: "Cheie publică serviciu Relatr", + pubkeyPlaceholder: "Introdu cheia publică hex de 64 de caractere...", + searching: "Se caută...", + autoDiscover: "Descoperire automată", + pubkeyDefault: "Implicit: serviciul Relatr oficial al ContextVM (npub1dvmc...)", + relayLabel: "Relay (unde Relatr publică scoruri)", + relayDefault: "Implicit: wss://relay.contextvm.org (relay-ul oficial al ContextVM)", + applyChanges: "Aplică modificările", + learnMore: "Află mai multe:", + website: "Site-ul Relatr", + github: "GitHub Relatr", + nip85Spec: "Specificația NIP-85" + }, + followList: { + unfollow: "Nu mai urmări", + title: "Rețeaua ta Nostr", + desc: "Gestionează pe cine urmărești. Urmărirea utilizatorilor ajută la construirea Web of Trust și determină ce spoturi afișează insigne de încredere.", + following: "Urmărești ({{count}})", + followers: "Urmăritori ({{count}})", + follow: "Urmărește", + followHint: "💡 Lipește o cheie publică Nostr (npub1...), o adresă NIP-05 (user@domain.com) sau o cheie publică hex", + notFollowing: "Nu urmărești încă pe nimeni", + notFollowingHint: "Urmărește skateri pentru a le vedea spoturile cu insigne ✅ VERIFICAT", + trustActiveStrong: "✅ Insigne de încredere active:", + trustActive: "Spoturile create de persoanele pe care le urmărești vor afișa acum insigne VERIFICAT. Spoturile create de prietenii lor vor afișa insigne DE ÎNCREDERE.", + noFollowers: "Niciun urmăritor încă", + noFollowersHint: "Partajează-ți profilul Nostr pentru a câștiga urmăritori!", + howTitle: "💡 Cum afectează urmărirea insignele de încredere", + verifiedStrong: "✅ VERIFICAT (verde):", + verifiedDesc: "Spoturi create de persoanele pe care le urmărești direct", + trustedStrong: "🟡 DE ÎNCREDERE (galben):", + trustedDesc: "Spoturi create de persoanele pe care le urmăresc prietenii tăi (2 salturi)", + unverifiedStrong: "⚪ Neverificat:", + unverifiedDesc: "Spoturi de la utilizatori fără nicio legătură cu rețeaua ta", + tip: "💡 Sfat: Urmărește skateboarderi activi pentru a vedea mai multe spoturi verificate și a-ți construi rețeaua de încredere!" + }, + notify: { + enableTitle: "Activează notificările", + enableDesc: "Fă acest dispozitiv să bâzâie când ceva are nevoie de tine.", + checkingPermission: "Se verifică permisiunea…", + unsupported: "Acest dispozitiv nu acceptă notificări aici. Reconstruiește aplicația Android pentru a le activa pe telefon.", + denied: "Notificările sunt blocate pentru acest site. Permite-le în setările browserului/OS-ului, apoi încearcă din nou.", + backgroundTitle: "Notificări în fundal", + backgroundDesc: "Fii anunțat despre mesaje și tranzacții chiar și când SkateSpots este închis.", + pushUnsupported: "Acest browser nu acceptă push în fundal. Pe mobil, adaugă SkateSpots pe ecranul principal.", + pushPrivacy: "Pentru a te contacta cât timp este închis, un server de notificări SkateSpots primește un ping de la relay-ul tău când sosește ceva pentru cheia ta și îl transmite serviciului de push al telefonului. Nu vede decât că cheia ta are ceva — niciodată cine a trimis sau ce spune, și nu poate decripta mesajele tale. Optează per dispozitiv.", + bgDeliveryTitle: "Livrare în fundal (Android)", + bgDeliveryDesc: "Verifică mesaje, oferte și tranzacții noi cât timp aplicația este închisă — fără servicii Google.", + off: "Oprit", + standard: "Standard (~15 min)", + fast: "Rapid (~5 min)", + bgDeliveryNote: "Standardul este best-effort — Android îl poate amâna în modul Doze. Rapidul afișează o notificare persistentă și consumă mai multă baterie. Nimic nu este decriptat pe serverul nostru.", + notifyMeAbout: "Anunță-mă despre", + couldNotEnable: "Nu s-a putut activa", + sendTest: "Trimite o notificare de test", + testTitle: "Notificările SkateSpots sunt pornite 🛹", + testBody: "Așa va arăta un DM, un zap sau o invitație de echipaj.", + footerBefore: "Alertele sunt construite pe dispozitivul tău din datele pe care aplicația le are deja, iar alertele de mesaje directe nu decriptează niciodată mesajele — astfel încât Amber nu este niciodată rugat să deschidă unul. Cu", + footerAfter: "oprit, o aplicație complet închisă nu poate fi contactată, așa că alertele sosesc data viitoare când deschizi SkateSpots.", + cat_dms_label: "Mesaje directe", + cat_dms_hint: "Cineva îți trimite un mesaj privat", + cat_crew_label: "Echipaje", + cat_crew_hint: "Invitații, cereri de alăturare și confirmări de membru", + cat_social_label: "Zap-uri, răspunsuri & mențiuni", + cat_social_hint: "Reacții, repostări, zap-uri, răspunsuri și actualizări de evenimente", + cat_newsletter_label: "Newsletter", + cat_newsletter_hint: "Noutăți SkateSpots (doar abonați)", + cat_trades_label: "Oferte & tranzacții", + cat_trades_hint: "Oferte, contraoferte și confirmări de tranzacții", + cat_reminders_label: "Memento-uri de evenimente", + cat_reminders_hint: "Un memento cu o oră înainte de evenimentele la care mergi (aplicația Android)" + }, + regionBackfill: { + taggedTitle: "{{count}} locații etichetate{{s}}", + taggedSkipped: "{{count}} omise (fără coordonate sau fără potrivire geocoder).", + taggedOk: "Etichetele de regiune au fost scrise pe relay-ul comunității.", + nothingTitle: "Nimic de etichetat", + nothingDesc: "Nicio pin nu a putut fi geocodificat. Încearcă din nou mai târziu.", + failedTitle: "Completarea a eșuat", + title: "Completează etichetele de regiune", + admin: "Admin", + descBefore: "Pinii făcuți înainte de existența geocodării au coordonate, dar nu au etichetă de oraș/țară, așa că harta îi desenează în timp ce Statisticile comunității pot spune doar „Necategorizat”. Aceasta re-derivă etichetele din fiecare pin și republică", + descStrong: "propriile tale", + descAfter: "spoturi și magazine neetichetate.", + scanning: "Se scanează spoturile tale…", + allTagged: "Fiecare spot și magazin pe care îl deții are deja o etichetă de regiune. 🎉 Orice pin „Necategorizat” rămas aparține altor cartografi — doar propriile lor chei le pot eticheta.", + countLine: "{{count}} dintre spot{{s}}/magazinele tale nu au etichetă de regiune. Semnatarul tău poate cere să aprobi fiecare.", + tagging: "Se etichetează {{done}}/{{total}}…", + run: "Completează etichetele de regiune", + summary: "{{updated}} actualizate · {{skipped}} omise · {{failed}} eșuate" + }, + adminReview: { + title: "Coadă de revizuire", + flagged: "{{count}} spoturi{{s}} declanșează semnalele de junk — ascunde sau respinge.", + clean: "Spoturi care par intrări de test sau pinuri irelevante." + }, + grantPro: { + invalidNpub: "Introdu un npub valid (sau cheie publică hex)", + invalidDays: "Zilele trebuie să fie un număr pozitiv", + grantedTitle: "Pro acordat ⚡", + grantedDesc: "{{npub}} până la {{date}}", + failedTitle: "Acordarea a eșuat", + title: "Acordă Sasquatch Pro", + owner: "Proprietar", + desc: "Rezervă manuală pentru o plată verificată pe care chitanța de zap a omis-o. Publică o acordare semnată de proprietar; utilizatorul nu o poate falsifica.", + targetPlaceholder: "npub1… (sau hex)", + grant: "Acordă" + }, + myData: { + reactionTitle: "Reacție {{emoji}}", + deleting: "Se șterge...", + requestDeletion: "Solicită ștergerea", + selectContentTitle: "Selectează conținutul de șters", + selectContentDesc: "Selectează elementele specifice pentru care vrei să soliciți ștergerea.", + all: "Toate", + spots: "Spoturi", + events: "Evenimente", + shops: "Magazine", + listings: "Anunțuri", + collections: "Colecții", + lab: "Lab", + posts: "Postări", + reactions: "Reacții", + selectAll: "Selectează tot", + selectAllVisible: "Selectează tot ce este vizibil", + selectedCount: "{{count}} selectate", + noItemsCategory: "Niciun element în această categorie", + decentralizedStrong: "Important:", + decentralizedNote: "Nostr este descentralizat. Relay-urile ar trebui să onoreze cererile de ștergere, dar unele s-ar putea să nu. Aceasta nu este o ștergere permanentă garantată.", + deleteCount: "Șterge {{count}} element{{s}}", + noDataTitle: "Nu există date de exportat", + noDataDesc: "Nu ai publicat încă niciun eveniment.", + exportedTitle: "Date exportate!", + exportedDesc: "{{count}} evenimente descărcate ca JSON.", + deletionRequestedTitle: "Ștergere solicitată", + deletionRequestedDesc: "Cererea de ștergere a fost publicată pe relay-uri.", + deletionRequestedMany: "S-a solicitat ștergerea a {{count}} elemente. Notă: unele relay-uri s-ar putea să nu onoreze această cerere.", + deletionFailedTitle: "Ștergerea a eșuat", + deletionFailedDesc: "Cererea de ștergere nu a putut fi publicată. Încearcă din nou.", + loginRequired: "Autentificare necesară", + loginRequiredDesc: "Autentifică-te pentru a-ți vedea și gestiona datele.", + title: "Datele mele", + desc: "Conținutul tău din rețeaua Nostr. Deții aceste date - exportă-le oricând sau solicită ștergerea.", + coachFilmer: "Antrenor/Filmer", + zaps: "Zap-uri", + received: "Primite", + exportAll: "Exportă toate datele", + recentActivity: "Activitate recentă", + viewAll: "Vezi tot ({{count}})", + noDataPublished: "Nicio dată publicată încă", + startBy: "Începe prin a", + addingASpot: "adăuga un spot", + aboutYourData: "Despre datele tale", + ownDataStrong: "Deții datele tale.", + ownData: "Tot conținutul este semnat cu cheile tale criptografice și stocat pe relay-uri Nostr. Nicio companie nu îl controlează.", + exportAnytimeStrong: "Exportă oricând", + exportAnytime: "- Descarcă toate evenimentele tale ca JSON", + portableStrong: "Portabil", + portable: "- Folosește-ți cheile în orice aplicație Nostr", + selectiveStrong: "Ștergere selectivă", + selective: "- Alege exact ce să ștergi", + caveatStrong: "Avertisment descentralizat", + caveat: "- Unele relay-uri pot păstra datele în ciuda cererilor de ștergere" + }, + settingsPage: { + seoTitle: "Setări - SkateSpots", + seoDescription: "Gestionează setările contului tău SkateSpots.", + heading: "SETĂRI", + subtitle: "Preferințe de cont și aplicație", + editProfile: "Editează profilul", + profileRefreshed: "Profil reîmprospătat!", + found: "Găsit: {{name}}", + unnamed: "fără nume", + profileNotFound: "Profil negăsit", + notFoundOnRelay: "Negăsit pe niciun relay.", + refreshFailed: "Reîmprospătarea a eșuat", + refreshFailedDesc: "Nu s-a putut conecta la relay-uri.", + loginToEdit: "Autentifică-te pentru a-ți edita profilul", + noProfileRelays: "Nu am putut găsi un profil pe relay-uri. Dacă ai setat unul înainte, încearcă să reîmprospătezi.", + checkDisplayName: "un nume de afișare", + checkPhoto: "o poză de profil", + checkBio: "o scurtă biografie", + checkLightning: "o adresă Lightning ca oamenii să te poată zapa", + checkHandle: "un handle gratuit @skate-spots.org", + finishProfile: "Finalizează-ți profilul", + addItem: "Adaugă {{item}}", + nip05Title: "Verificare NIP-05", + nip05Desc: "Obține o adresă Nostr verificată (precum name@domain.com) pentru a construi încredere. Necesară pentru a crea evenimente, profiluri de antrenor și magazine.", + freeFromSkateSpots: "Gratuit de la SkateSpots", + claimHandleBefore: "Revendică un handle precum", + claimHandleAfter: "— fără înregistrare, fără cost, fără domeniu de administrat. Revendică-l în fila Profil, apoi salvează.", + claimInProfile: "Revendică în Profil", + nip05Footer: "După ce obții NIP-05, adaugă-l în câmpul Profil și salvează.", + localRelayOn: "Relay local pornit", + localRelayOff: "Relay local oprit", + lookingForCitrine: "Se caută Citrine pe acest dispozitiv…", + noLongerUsing: "Nu mai folosești relay-ul de pe dispozitiv.", + localRelay: "Relay local", + citrineOff: "Citiri mai rapide și backup offline pe acest dispozitiv", + citrineSearching: "Se caută Citrine pe acest dispozitiv…", + citrineLive: "Conectat — citește și face backup local", + citrineWaiting: "Activat — pornește Citrine pentru a te conecta", + toggleCitrine: "Comută relay-ul Citrine local", + citrineDetected: "Relay Citrine detectat", + citrineLooking: "Se caută Citrine…", + citrineNotDetected: "Citrine nedetectat", + recheckCitrine: "Reverifică relay-ul Citrine", + checking: "Se verifică", + recheck: "Reverifică", + chipInstantReads: "Citiri instant", + chipWorksOffline: "Funcționează offline", + chipOnDeviceBackup: "Backup pe dispozitiv", + cantReachStrong: "Citrine nu poate fi accesat.", + cantReachBefore: "Asigură-te că aplicația gratuită Citrine este instalată și relay-ul ei este", + started: "pornit", + cantReachAfter: ", apoi atinge Reverifică. Rulează un relay Nostr privat pe telefon pentru citiri instant și un backup offline.", + citrineStep1Before: "Deschide Citrine → atinge", + start: "Pornește", + citrineStep2Before: "Revino aici → atinge", + getCitrine: "Obține Citrine", + citrinePrivacy: "Stash-ul și mesajele tale rămân criptate end-to-end aici, exact ca peste tot. Relay-ul local doar accelerează lucrurile și păstrează o copie pe dispozitivul tău — nu înlocuiește niciodată criptarea.", + communityRelayDisabled: "Relay-ul comunității dezactivat", + communityRelayEnabled: "Relay-ul comunității activat", + usingOnlyPersonal: "Se folosesc doar relay-urile tale configurate.", + skateRelayIncluded: "Relay-ul SkateSpots inclus.", + relays: "Relay-uri", + relayPrivacyBefore: "Relay-urile îți pot vedea", + ipAddress: "adresa IP", + relayPrivacyAfter: "când te conectezi. Tor o ascunde — și tratează un VPN „gratuit” ca pe un semnal de alarmă; de obicei îți monetizează traficul.", + communityRelay: "Relay-ul comunității", + syncingGlobal: "Se sincronizează cu comunitatea globală de skate", + usingOnlyPersonalShort: "Se folosesc doar relay-uri personale", + appearance: "Aspect", + language: "Limbă", + darkModeOnly: "Doar mod întunecat", + darkModeDesc: "SkateSpots rulează o estetică neon întunecată inspirată de cultura skate. Fundal negru, roz neon, lime și portocaliu.", + navigation: "Navigare", + sasquatchExpanded: "Sasquatch a fost extins! 🦧 Reîmprospătează pagina pentru a-l vedea.", + advanced: "Avansat", + sasquatchGuide: "🦧 Ghid Sasquatch", + sasquatchResetDesc: "Resetează ghidul de onboarding la vizualizarea extinsă", + expandSasquatch: "Extinde Sasquatch", + wallet: "Portofel", + loginToWallet: "Autentifică-te pentru a-ți gestiona portofelul", + openWallet: "Deschide portofelul", + balanceSendReceive: "Sold, trimite, primește", + connectNwc: "Conectează portofelul NWC", + account: "Cont", + security: "Securitate", + securitySub: "Chei, semnare, Amber", + nip05Sub: "Obține o adresă Nostr verificată", + app: "Aplicație", + myStash: "Stash-ul meu", + myStashSub: "Inventar privat de echipament", + relaysSub: "Conexiuni la relay-uri Nostr", + appearanceSub: "Limbă și temă", + assistant: "Asistent", + showSasquatch: "Arată asistentul Sasquatch", + showSasquatchDesc: "Arată butonul flotant Sasquatch pe hartă și pe alte ecrane.", + showMapFooter: "Arată bara de linkuri a hărții", + showMapFooterDesc: "Arată banda subțire de linkuri în partea de jos a hărții.", + notifications: "Notificări", + notificationsSub: "Alerte pentru DM-uri, echipaje și zap-uri", + coordinator: "Coordonator", + coordinatorSub: "Serverul tău de grup Cordn", + data: "Date", + myData: "Datele mele", + myDataSub: "Exportă, importă, gestionează", + advancedSub: "Relatr, Sasquatch, instrumente", + notLoaded: "Neîncărcat", + notLoggedIn: "Neautentificat" + }, + onboarding: { + seoTitle: "Începe — SkateSpots", + seoDescription: "Alătură-te comunității descentralizate de skateboarding. Găsește spoturi, conectează-te cu antrenori, trimite zap-uri. Gratuit pentru totdeauna.", + homeSetTitle: "Casă setată 🛹", + homeSetDesc: "Harta se va deschide acum pe zona ta.", + locationFailedTitle: "Locația ta nu a putut fi obținută", + locationFailedDesc: "Verifică permisiunile de locație sau alege zona ta de pe hartă.", + niceTitle: "🎉 Frumos!", + niceDesc: "Acum înțelegi cum funcționează Nostr. Hai la skate!", + npubCopied: "npub copiat în clipboard.", + saveLoginNow: "Salvează-ți autentificarea — fă asta acum", + saveLoginNowDesc: "Codul tău de recuperare este singura cale înapoi în contul tău. Fără email, fără resetare de parolă.", + betaBadge: "Beta — Deschis skaterilor din întreaga lume", + headline1: "SKATEAZĂ", + headline2: "LUMEA TA", + heroBefore: "O", + decentralized: "comunitate descentralizată de skate", + heroAfter: ". Nicio companie nu o deține. Niciun algoritm nu-ți îngroapă spoturile. Fără ciocan de ban. Doar skateri.", + pillMap: "Harta spoturilor", + pillCoaches: "Antrenori & filmeri", + pillEvents: "Evenimente", + pillGear: "Cumpără/vinde echipament", + pillZaps: "Zap-uri Bitcoin", + pillStash: "Stash de echipament", + pillCrews: "Echipaje", + createFreeAccount: "Creează-ți contul gratuit", + noEmailNoPassword: "Fără email. Fără parolă. Deții-ți identitatea pentru totdeauna.", + findSpots: "Găsește spoturi lângă tine", + addFirstSpot: "Adaugă primul tău spot", + accountCreated: "Ai intrat! Cont creat ✓", + identityYours: "Identitatea ta este a ta — stocată în cheia ta, nu pe serverele noastre.", + whereSkate: "Unde skateuiești?", + whereSkateDesc: "Setează-ți zona de domiciliu o dată și harta se deschide pe spoturile tale de fiecare dată. GPS-ul tău nu părăsește niciodată dispozitivul.", + useMyLocation: "Folosește locația mea", + pickOnMap: "Alege pe hartă", + loginSaved: "Autentificare salvată — contul tău este în siguranță și recuperabil.", + whyBother: "De ce să te deranjezi?", + why1Title: "Fiecare spot, o hartă", + why1Body: "Borduri, șine, DIY, parcuri — cartografiate de skateri care chiar le patinează. Verifică starea înainte să pleci ca să nu pierzi o sesiune degeaba.", + why2Title: "Construit de skateri, nu de costumați", + why2Body: "Fără reclame, fără algoritm care să-ți bage gunoi în față, fără colectare de date. Open source. Harta aparține comunității — inclusiv ție.", + why3Title: "Fii plătit să pui", + why3Body: "Cartografiază o bijuterie, filmează o bombă, organizează o sesiune — și primești zap-uri cu Bitcoin real direct în portofel. Fără comision de platformă, fără intermediari.", + why4Title: "Contul tău este cu adevărat al tău", + why4Body: "O cheie te autentifică în fiecare aplicație Nostr. Nicio companie nu te poate bloca sau șterge contul după bunul plac. Ia-ți identitatea oriunde.", + everythingFree: "Tot ce poți face — gratuit", + featSpots: "Descoperă spoturi", + featSpotsDesc: "Hartă interactivă cu mii de spoturi din întreaga lume", + featLab: "The Lab", + featLabDesc: "Găsește antrenori, filmeri și editori video lângă tine", + featEvents: "Evenimente", + featEventsDesc: "Competiții, sesiuni, întâlniri", + featGear: "Cumpără / vinde echipament", + featGearDesc: "Piață peer-to-peer pentru echipament de skate second-hand", + featStash: "Stash-ul meu", + featStashDesc: "Inventar privat criptat cu tot ce deții", + featCrews: "Echipaje", + featCrewsDesc: "Rulează cu echipajul tău — spoturi partajate, chat și sesiuni", + whatIsNostr: "Ce este Nostr?", + whatIsNostrSub: "Protocolul care alimentează SkateSpots", + nostrBefore: "Nostr este un protocol deschis — ca emailul, dar pentru aplicații sociale. Contul tău este o", + cryptoKeyPair: "pereche de chei criptografice", + nostrAfter: "pe care o deții. Nicio companie nu-ți controlează contul sau datele — tu alegi ce relay-uri le stochează și poți chiar să rulezi propriul relay. Identitatea ta funcționează în fiecare aplicație Nostr.", + nostrPoint1: "Deții datele și cheile tale", + nostrPoint2: "Nicio companie nu te poate interzice", + nostrPoint3: "Identitatea funcționează peste tot", + nostrPoint4: "Ciupleli Bitcoin directe", + deepDive: "Analiză aprofundată: Cum funcționează Nostr", + privacyTip: "Sfat de confidențialitate: GPS-ul tău nu părăsește niciodată dispozitivul. Serverele la care te conectezi (precum tile-urile de hartă) îți pot vedea totuși IP-ul — dacă vrei să ascunzi și asta, un VPN sau Tor funcționează. Complet opțional.", + readPrivacy: "Citește pagina noastră de confidențialitate", + zapsWallet: "⚡ Zap-uri & Portofel", + optional: "Opțional", + walletDesc: "Zap-urile sunt ciupleli Bitcoin pe care le trimiți direct unui skater care a descoperit un spot mișto, a filmat un clip bombă sau a organizat o sesiune grozavă. Fără taxă de platformă. Fără intermediari. 100% ajunge la el.", + builtInWallet: "Portofel Cashu integrat", + builtInWalletDesc: "Primește plăți Lightning direct în aplicație. Fără configurare.", + balance: "Sold", + connectExternal: "Conectează un portofel extern", + connectExternalDesc: "Ai Alby, Mutiny sau alt portofel? Conectează-l prin NWC.", + connectViaNwc: "Conectează prin NWC", + loginToConnect: "Autentifică-te pentru a-ți conecta propriul portofel.", + fiveDollars: "💡 5$ de Bitcoin = sute de zap-uri de împărțit în comunitate", + commonQuestions: "Întrebări frecvente", + faq1Q: "SkateSpots este gratuit?", + faq1A: "100% gratuit. Răsfoiește spoturi, adaugă locații, găsește antrenori, creează evenimente, alătură-te sesiunilor — toate gratuit, pentru totdeauna. Bitcoin (zap-urile) este opțional dacă vrei să ciuplești creatorii.", + faq2Q: "Ce este Nostr și de ce îl folosește SkateSpots?", + faq2Before: "Nostr este un protocol deschis pentru aplicații descentralizate — gândește-te la el ca la internetul însuși, nefiind deținut de nicio companie. Contul tău SkateSpots este o pereche de chei criptografice pe care", + faq2Strong: "o deții", + faq2After: ". Nicio companie nu-ți poate interzice contul sau ține datele ostatice — tu alegi ce relay-uri stochează datele tale și poți chiar să rulezi propriul relay. Identitatea ta funcționează și pe alte aplicații Nostr precum Primal, Damus sau Amethyst.", + faq3Q: "Ce este un nsec și de ce este important?", + faq3Before: "Al", + faq3Mid: "este cheia ta privată — este singura dovadă că deții contul. Spre deosebire de parole, nu există", + faq3Strong: "„am uitat parola”", + faq3After: ". Dacă îți pierzi nsec-ul, contul tău dispare pentru totdeauna. Când îți creezi un cont, descarcă imediat backup-ul și păstrează-l într-un loc sigur (manager de parole, scris offline).", + faq4Q: "Ce semnatari / aplicații funcționează cu SkateSpots?", + faq4Desktop: "Pe desktop:", + faq4Extensions: "extensii de browser.", + faq4Android: "Pe Android:", + faq4AndroidAfter: "(cea mai bună experiență cu aplicația nativă).", + faq4Ios: "Pe iOS:", + faq4IosAfter: "sau lipește direct nsec-ul (mai puțin sigur).", + faq4Note: "Te poți autentifica și lipind direct nsec-ul — dar folosirea unei extensii de semnare este mai sigură.", + faq5Q: "Pot folosi SkateSpots pe telefon?", + faq5Before: "Da! SkateSpots este o PWA (Progressive Web App). Vizitează", + faq5Mid: "în browserul telefonului și atinge", + faq5Em: "„Adaugă pe ecranul principal”", + faq5After: "pentru o experiență completă de aplicație. Sau descarcă-o din", + faq5End: "— un magazin de aplicații descentralizat.", + faq6Q: "Ce este un zap?", + faq6A: "Un zap este o ciupeală Bitcoin instant trimisă prin rețeaua Lightning. Când zapezi un skater, sats-ii ajung în portofelul lui în câteva secunde — fără PayPal, fără Venmo, fără comision. Persoana care a filmat acea scară de 4 primește plata direct de la fani.", + faq7Q: "Vor fi șterse spoturile mele dacă SkateSpots se închide?", + faq7A: "Nu. Spoturile tale sunt publicate pe relay-uri Nostr — servere distribuite pe care oricine le poate rula. Chiar dacă SkateSpots ca produs ar dispărea mâine, datele tale ar exista în continuare pe relay-uri și orice client Nostr le-ar putea afișa.", + faq8Q: "Pot adăuga un spot care este pe proprietate privată?", + faq8A: "Poți, dar folosește bunul simț. Spoturile de pe proprietăți private ar trebui marcate corespunzător, ca skaterii să știe situația. SkateSpots nu este responsabil pentru intrusiune — fii întotdeauna respectuos față de proprietari și localnici.", + faq9Q: "Cum raportez o eroare sau ofer feedback?", + faq9Before: "Scrie-i echipei SkateSpots direct pe Nostr sau contactează coordonatorul nostru beta:", + faq9Link: "Feedback beta → cordn.net", + readyToShred: "GATA DE SHRED?", + stopScrolling: "Nu mai derula. Ia aplicația. Găsește un spot. Skatează-l.", + exploreSpots: "Explorează spoturi", + betaFeedbackTitle: "Beta — Vrem feedback-ul tău", + betaFeedbackDesc: "SkateSpots este în dezvoltare activă. S-ar putea să dai de asperități — este responsabilitatea noastră, nu a ta. Raportează erori, sugerează funcții, spune-ne ce nu merge.", + betaCoordinator: "Coordonator beta", + betaCoordinatorDesc: "cordn.net → scrie-ne", + dmOnNostr: "DM pe Nostr", + fixSameDay: "Ai găsit o eroare? O reparăm în aceeași zi. Rapoartele tale fac aplicația mai bună pentru fiecare skater.", + relaySetup: "Configurare relay" + }, + relayEdu: { + understandingNostr: "Înțelegerea Nostr", + stepOf: "Pasul {{current}} din {{total}}", + step1Title: "Înțelegerea relay-urilor", + step1Desc: "Gândește-te la relay-uri ca la magazinele de skate care împărtășesc noutăți despre spoturi", + you: "Tu", + relays: "Relay-uri", + skaters: "Skateri", + s1Good1: "Nicio companie nu-ți deține contul", + s1Good1Desc: "Identitatea ta trăiește pe mai multe servere relay", + s1Good2: "Tu controlezi unde trăiesc datele tale", + s1Good2Desc: "Postările tale se sincronizează între relay-urile pe care le alegi — alege-le pe ale tale sau rulează unul singur", + s1Warn: "Operatorii de relay pot vedea postările publice", + s1WarnDesc: "Gândește-te ca la a posta pe un panou de anunțuri", + step2Title: "Public vs Privat", + step2Desc: "Află ce este vizibil și ce este criptat", + publicTitle: "Public (oricine poate vedea)", + pub1: "Spoturile pe care le adaugi pe hartă", + pub2: "Recenzii și comentarii", + pub3: "Informațiile profilului tău (nume, poză)", + pub4: "Pe cine urmărești", + privateTitle: "Privat (criptat)", + priv1: "Mesaje directe", + priv2: "Comunicări cu portofelul", + noteStrong: "Notă:", + note: "Postările pot fi stocate permanent pe relay-uri. Gândește-te înainte să postezi - exact ca în viața reală!", + step3Title: "Cheile tale = Contul tău", + step3Desc: "Acesta este cel mai important lucru de înțeles", + secretKeyTitle: "Cheia ta secretă (nsec)", + secretKeyDesc: "Gândește-te la ea ca la placa ta de skate - nu o împrumuta niciodată nimănui. Dovedește că deții contul.", + s3Bad1: "Dacă o pierzi, contul tău nu poate fi recuperat", + s3Bad2: "Fără \"am uitat parola\" - nimeni nu o poate reseta", + s3Good: "Fă-i backup și păstreaz-o în siguranță", + publicKeyTitle: "Cheia ta publică (npub)", + publicKeyDesc: "Aceasta este ca numele tău de utilizator - partajeaz-o liber ca alții să te găsească!", + inControl: "🔐 Tu deții controlul - nicio companie nu te poate bloca!", + skip: "Sari peste", + gotIt: "Am înțeles!" + }, + about: { + seoTitle: "Despre - SkateSpots", + seoDescription: "Află despre SkateSpots și misiunea noastră de a construi o comunitate descentralizată de skateboarding.", + npubCopied: "npub copiat în clipboard. Lipește-l în clientul tău Nostr preferat pentru a trimite un DM.", + bugReport: "🐛 Raportare eroare", + bugWhatHappened: "Ce s-a întâmplat:", + bugExpected: "Ce mă așteptam:", + bugSteps: "Pași de reproducere:", + aboutWord: "DESPRE", + heroBefore: "Conectează-te cu scene de skate locale din întreaga lume.", + skaterOwned: "Date deținute de skateri", + heroAfter: ", relay-uri gestionate de comunitate.", + viewStats: "Vezi statisticile comunității", + missionTitle: "Misiunea noastră", + mission1: "SkateSpots ajută skateboarderii să descopere spoturi, să se conecteze cu profesioniști la The Lab și să organizeze sesiuni - toate fără control corporativ. Skateboardingul real se întâmplă offline, acest instrument doar te conectează la el.", + mission2: "Cunoștințele de skateboarding ar trebui să trăiască împreună cu comunitatea, nu închise în aplicații corporative. De aceea SkateSpots rulează pe Nostr - un sistem bazat pe relay-uri în care skaterii își controlează propriile date, aleg ce relay-uri le stochează și pot chiar să ruleze propriul relay. Nicio companie nu deține harta.", + whyNostr: "De ce Nostr?", + why1Title: "Controlat de comunitate", + why1Desc: "Spoturile tale trăiesc pe relay-uri comunitare. Skaterii rulează serverele, nu corporațiile.", + why2Title: "Deții datele tale", + why2Desc: "Identitatea ta Nostr este a ta. Ia-o în orice aplicație Nostr - fără blocare.", + why3Title: "Integrare Bitcoin", + why3Desc: "Zapează creatorii direct cu Bitcoin. Fără platformă care ia 30%.", + why4Title: "Open Source", + why4Desc: "Construit în mod deschis. Oricine poate contribui sau bifurca codul.", + getInvolved: "Implică-te", + getInvolvedDesc: "SkateSpots este open source și condus de comunitate. Contribuie cu cod, partajează spoturi sau ajută-i pe alții să înceapă.", + betaTitle: "Testare beta", + betaDesc: "Dragă utilizatorule! Mulțumim că testezi SkateSpots în beta. Reține că aplicația este încă în beta și pot exista erori sau probleme de securitate. Dacă întâmpini probleme sau vrei să raportezi o eroare/probleme, te rugăm să ne contactezi!", + giveFeedback: "Dă-ne feedback:", + copyNpub: "Copiază npub", + reportBug: "Raportează eroare", + viewProfile: "Vezi profilul", + downloadApp: "Descarcă aplicația", + downloadAppDesc: "Instalează SkateSpots pe Android prin Zapstore — magazinul de aplicații open-source, nativ Bitcoin.", + getOnZapstore: "Ia-o de pe Zapstore", + credits: "Credite", + creditPoweredBy: "Alimentat de", + creditNostr: "Protocol descentralizat", + creditCrewChat: "Chat de echipaj prin", + creditCordn: "Chat de grup criptat end-to-end", + creditEcash: "Ecash prin", + creditCashu: "Chaumian ecash pentru Lightning", + creditWalletConnect: "Conectare portofel prin", + creditNwc: "Nostr Wallet Connect (NIP-47)", + creditSigning: "Semnare pe Android cu", + creditAmber: "Semnatar Nostr pentru Android", + creditMapData: "Date de hartă Bitcoin de la", + creditBtcmap: "Locuri care acceptă Bitcoin", + creditCrowdfunding: "Finanțare participativă", + creditAngor: "Finanțare participativă Bitcoin descentralizată", + creditDistributed: "Distribuit pe", + creditZapstore: "Magazin de aplicații open-source", + creditTrust: "Încredere și chat de echipaj prin", + creditContextvm: "Scoruri de încredere Relatr și coordonare criptată a chat-ului de echipaj", + stillQuestions: "Mai ai întrebări?", + stillQuestionsDesc: "Sasquatch este ghidul nostru AI — alimentat de date live SkateSpots. Întreabă-l despre spoturi, evenimente, antrenori, echipament sau cum funcționează orice.", + askSasquatch: "Întreabă-l pe Sasquatch", + poweredBy: "Alimentat de", + decentralized: "Descentralizat", + communityOwned: "Deținut de comunitate" + }, + faq: { + seoTitle: "Întrebări frecvente - SkateSpots", + seoDescription: "Întreabă-l pe Sasquatch orice despre SkateSpots.", + greeting: "Salut! Sunt Sasquatch 🦧 — întreabă-mă orice despre SkateSpots. Spoturi, evenimente, echipament, portofele, confidențialitate, Nostr — te acopăr. Ce vrei să știi?", + gotQuestions: "Ai întrebări?", + heroDesc: "Întreabă-l pe Sasquatch — știe totul despre SkateSpots, Nostr, Bitcoin și skateboarding.", + askTitle: "Întreabă-l pe Sasquatch", + askDesc: "Sasquatch este deschis în colțul din stânga jos al ecranului — dă clic pe el și tastează întrebarea. Are acces live la spoturi, evenimente, antrenori și vreme.", + askQuestion: "Cu ce te pot ajuta pe SkateSpots?", + openSasquatch: "Deschide Sasquatch", + commonQuestions: "Întrebări frecvente — atinge pentru a întreba", + quickAnswers: "Răspunsuri rapide", + footerHint: "Sasquatch folosește date Nostr live de la relay-ul SkateSpots + AI pentru a răspunde întrebărilor tale. 🛹", + chip1Label: "Ce este SkateSpots?", + chip1Q: "Ce este SkateSpots și cum funcționează?", + chip2Label: "Cum adaug un spot?", + chip2Q: "Cum adaug un spot de skate pe hartă?", + chip3Label: "Ce sunt zap-urile?", + chip3Q: "Ce sunt zap-urile?", + chip4Label: "Este gratuit?", + chip4Q: "SkateSpots este gratuit de folosit?", + chip5Label: "Ce este My Stash?", + chip5Q: "Ce este My Stash?", + chip6Label: "Cum mă autentific?", + chip6Q: "Cum mă autentific sau îmi creez un cont?", + chip7Label: "Ce este Nostr?", + chip7Q: "Ce este Nostr?", + chip8Label: "Confidențialitate & date", + chip8Q: "Ce date sunt publice și ce date sunt private pe SkateSpots?", + chip9Label: "Cum vând echipament?", + chip9Q: "Cum vând echipament pe SkateSpots?", + chip10Label: "Ce este The Lab?", + chip10Q: "Ce este The Lab?", + fact1Label: "Spoturi de skate în întreaga lume", + fact1Value: "Descoperă & adaugă", + fact2Label: "Zap-uri Bitcoin Lightning", + fact2Value: "100% gratuit", + fact3Label: "Descentralizat pe Nostr", + fact3Value: "Deții datele tale", + fact4Label: "Inventar privat de echipament", + fact4Value: "Stash criptat", + s1Q: "Ce este SkateSpots?", + s1A: "O hartă descentralizată și o comunitate pentru skateboarding, construită pe Nostr. Descoperă spoturi, găsește antrenori și filmeri, alătură-te echipajelor, listează evenimente și cumpără/vinde echipament — fără nicio companie la mijloc.", + s2Q: "Cum adaug un spot?", + s2A: "Atinge harta sau folosește butonul + / \"Adaugă spot\", apoi plasează un pin și completează detaliile. Ai nevoie de un cont Nostr gratuit (atinge Autentificare → Creează cont — fără email).", + s3Q: "Ce sunt zap-urile?", + s3A: "Zap-urile sunt ciupleli Bitcoin Lightning. Poți zapa spoturi, evenimente, echipaje și persoane pe care le apreciezi. Ajung direct la destinatar prin Lightning — SkateSpots nu-ți ține niciodată fondurile.", + s4Q: "Este gratuit?", + s4A: "Da. Crearea unui cont, adăugarea de spoturi și navigarea sunt gratuite. Extraurile opționale plătite (precum anunțurile promovate) și ciuplelile (zap-urile) se plătesc direct între persoane.", + s5Q: "Ce date sunt publice?", + s5A: "Orice publici — spoturi, evenimente, profilul tău — este public pe relay-urile Nostr. Mesajele tale private și Stash-ul tău sunt criptate end-to-end. Vezi pagina Confidențialitate pentru detalii.", + s6Q: "Ce este The Lab?", + s6A: "The Lab este locul unde găsești persoane pe care să le angajezi sau de la care să înveți: antrenori, instructori, filmeri, editori video, fotografi, constructori, artiști și mulți alții." + }, + privacy: { + seoTitle: "Confidențialitate — SkateSpots", + seoDescription: "Cum gestionează SkateSpots datele tale: GPS-ul rămâne pe dispozitivul tău, spoturile pe care le publici sunt publice și cum să-ți ascunzi IP-ul cu un VPN sau Tor dacă vrei.", + heroBefore: "Confidențialitatea", + heroHighlight: "ta", + heroDesc: "Fără urmărire, fără reclame, fără vânzare de date. Iată exact ce rămâne pe dispozitivul tău, ce este public și cum să securizezi lucrurile și mai mult dacă vrei.", + locationTitle: "Locația ta rămâne pe dispozitivul tău", + locationBefore: "Când atingi", + nearMe: "„Lângă mine,”", + locationAfter: "locația ta GPS este citită pe dispozitivul tău și folosită doar pentru a centra harta și a sorta spoturile din apropiere.", + locationGood1: "Nu este niciodată publicată pe Nostr.", + locationGood2: "Nu este niciodată trimisă către SkateSpots — nu există niciun server SkateSpots care să o colecteze.", + locationGood3: "Nu este niciodată partajată cu nicio terță parte.", + locationGood4: "În aplicația nativă folosim direct sistemul de locație al telefonului tău și omitem Google Play Services — astfel funcționează pe telefoane fără Google (GrapheneOS, /e/OS) și Google nu o vede niciodată.", + weatherBefore: "Vremea este oprită implicit. Când o activezi, caută condițiile pentru locația publică a", + weatherEm: "spotului", + weatherAfter: "— nu a ta.", + publicTitle: "Ce este public prin design", + publicDesc: "SkateSpots este o hartă partajată, deci unele lucruri sunt menite să fie văzute de toată lumea. Când alegi să le publici, acestea sunt publice în rețeaua Nostr:", + public1Strong: "Spoturile pe care le adaugi", + public1: "— inclusiv coordonatele lor. Dacă adaugi un spot la locația ta exactă, acea locație devine publică. Gândește-te înainte să plasezi un pin pe propria ta alee.", + public2Strong: "Recenzii, comentarii și profilul tău public", + public2: "(nume, poză).", + public3: "Pe cine urmărești și reacțiile publice.", + public4Strong: "Zap-urile", + public4: "sunt publice implicit: un zap leagă contul tău — adesea adresa ta Lightning — de postarea pe care ai plătit-o și de ciupeala în sine. Portofelul tău o poate trimite anonim dacă preferi să nu.", + publicNoteBefore: "Un VPN sau Tor", + notWord: "nu", + publicNoteAfter: "ascunde conținutul a ceea ce publici — coordonatele unui spot sunt publice indiferent. Instrumentele de confidențialitate îți ascund identitatea de rețea (IP-ul), nu lucrurile pe care alegi să le postezi.", + encryptedTitle: "Ce este privat & criptat", + enc1Strong: "Mesajele directe", + enc1Mid: "și", + enc1Strong2: "chat-urile de echipaj", + enc1: "sunt criptate end-to-end (NIP-17). Doar participanții le pot citi.", + enc2Strong: "My Stash", + enc2: "— inventarul tău privat de echipament — este criptat cu propria ta cheie.", + enc3Strong: "Membrii doar-ai-echipajului", + enc3: "pot alege să fie vizibili doar colegilor de echipaj.", + ipTitle: "Ce părăsește dispozitivul tău: IP-ul", + ipBefore: "Ca orice site web, serverele cu care vorbește SkateSpots îți pot vedea", + ipAddress: "adresa IP", + ipAfter: "(un indicator aproximativ al regiunii tale). Acest lucru este normal pentru orice aplicație web sau de hartă și nu este unic pentru noi. Acele servere sunt:", + ipTileStrong: "Tile-uri de hartă", + ipTile: "(OpenStreetMap) — îți văd IP-ul și ce zonă a hărții privești.", + ipGeoStrong: "Geocodificarea spoturilor/magazinelor", + ipGeo: "— când creezi sau editezi un spot sau magazin, coordonatele lui merg la OpenStreetMap Nominatim pentru a completa eticheta de oraș/țară. Când deschizi Statisticile comunității, coordonatele pinilor fără etichetă de locație merg la BigDataCloud pentru a fi grupate pe regiuni (stocate în cache pe dispozitivul tău — cel mult o dată per pin). Ambele îți văd IP-ul. Acestea sunt pinul pe care l-ai plasat / coordonatele pinilor publici, niciodată GPS-ul live al dispozitivului tău.", + ipPushStrong: "Notificări în fundal", + ipPush: "(opțional) — dacă le activezi, un server de push SkateSpots vede că cheia ta a primit ceva și când (niciodată cine a trimis sau ce spune — mesajele rămân criptate), iar serviciul de push al OS-ului tău (Google/Mozilla/Apple) livrează alerta.", + ipBtcStrong: "Locuri Bitcoin", + ipBtc: "(BTCMap, când activezi acel strat) — îți văd IP-ul și zona pe care o privești.", + ipRelayStrong: "Relay-uri Nostr", + ipRelay: "— îți văd IP-ul când aplicația citește sau publică.", + ipMintStrong: "Mint-uri Cashu", + ipMint: "— îți văd IP-ul ori de câte ori portofelul tău trimite, primește sau topește.", + ipRouteStrong: "Indicații", + ipRoute: "(OSRM și Transitous pentru tranzit) — primesc începutul și sfârșitul oricărei rute pe care o ceri, nu doar IP-ul tău. Rutarea rămâne în aplicație: începutul și destinația ta nu sunt predate niciodată către Google sau Apple Maps.", + ipWeatherStrong: "Vremea", + ipWeatherMid: "(Open-Meteo, opțional) și", + ipUploadStrong: "încărcările de imagini", + ipWeather: "(Blossom), când le folosești.", + ipAiStrong: "Sasquatch AI", + ipAi: "— mesajul tău merge pe serverul nostru, apoi la furnizorul de model.", + ipLink1: "Pentru că îți trimiți cheia publică (npub) pe aceeași conexiune, un relay poate asocia IP-ul tău cu tine — nu doar „cineva conectat”, ci „această persoană, de la această adresă”.", + ipShieldBefore: "Un singur lucru pe care îl protejăm:", + ipMintsStrong: "directorul de mint-uri", + ipShieldAfter: "este preluat prin serverul nostru, astfel încât MintRadar nu-ți vede niciodată IP-ul.", + vpnTitle: "Vrei mai multă confidențialitate? VPN sau Tor (opțional)", + vpnDesc: "Pentru majoritatea skaterilor acest lucru nu este necesar — dar dacă vrei să-ți ascunzi IP-ul și locația aproximativă de serverele de mai sus, ai două opțiuni gratuite:", + vpnReputable: "🛡️ Un VPN de încredere", + vpnReputableDesc: "Îți ascunde IP-ul în spatele serverelor VPN. Ușor și rapid. Folosește unul pentru care plătești și în care ai încredere; VPN-urile gratuite de obicei îți monetizează traficul, așa că tratează „gratuit” ca pe un semnal de alarmă.", + torBrowser: "🧅 Tor Browser", + torDesc: "Gratuit, confidențialitate maximă a IP-ului, rutează prin mai multe relay-uri. Mai lent — hărțile și unele relay-uri Nostr pot întârzia sau bloca nodurile de ieșire Tor. Ideal pentru cei foarte precauți.", + readThis: "Citește asta ca să nu fii păcălit", + caveat1Before: "Un VPN/Tor îți ascunde", + ipWord: "IP-ul", + caveat1: "— nu spoturile pe care le publici. Un pin la casa ta este public indiferent dacă folosești un VPN sau nu.", + caveat2Before: "Nu activa", + nearMeGps: "„Lângă mine” / GPS-ul browserului", + caveat2: "dacă scopul tău este să rămâi anonim — GPS-ul precis anulează orice ascundere a IP-ului.", + caveat3: "Niciun instrument nu te face complet „anonim”. Acestea reduc ceea ce pot deduce serverele despre locația ta de rețea — atât.", + keysTitle: "Cheile tale, contul tău", + keysBefore: "Contul tău este o pereche de chei criptografice pe care o deții. Cea mai sigură modalitate de a te autentifica este un", + signer: "semnatar", + keysAfter: "(Alby, nos2x sau Amber pe Android) astfel încât cheia ta secretă să nu fie niciodată lipită în aplicație.", + keysCaveatBefore: "Dacă îți lipești", + keysCaveatAfter: "direct, acesta este stocat în browserul tău. Folosește în schimb o extensie de semnare când poți și păstrează backup-ul nsec într-un loc sigur offline.", + footerBefore: "Întrebări? Întreabă-l pe", + sasquatchName: "Sasquatch", + footerMid: "în aplicație, sau citește", + gettingStarted: "ghidul de început", + about: "Despre" + }, + license: { + seoTitle: "Licență - SkateSpots", + seoDescription: "Licența SkateSpots. Ești liber să skateuiești.", + tagline: "Skatează, câștigă, distrează-te și cheltuie Sats oriunde ai fi.", + copyright: "Contribuitorii SkateSpots și comunitatea", + licenseLabel: "Licență", + freeLine1: "EȘTI LIBER", + freeLine2: "SĂ SKATEUIEȘTI", + body: "Acest proiect este deschis. Partajează-l, bifurcă-l, construiește pe el, skatează-l. Străzile aparțin tuturor. La fel și acest cod. Continuă să skateuiești, distrează-te, învață trucuri, susține constructorii și skatează din nou.", + builtBefore: "Construit cu ❤️ pe", + builtMid: "· Alimentat de", + lightning: "Bitcoin Lightning ⚡", + viewSource: "Vezi sursa", + aboutSkateSpots: "Despre SkateSpots", + supporters: "Susținători" + }, + glossary: { + seoTitle: "Glosar de trucuri · SkateSpots", + seoDescription: "Glosarul complet de skateboarding — {{count}} intrări care acoperă flip-uri, grind-uri, slide-uri, grab-uri, airs, lip tricks, handplants, freestyle, termeni de tranziție, stance & hardware, cu denumiri alternative.", + heading: "GLOSAR DE TRUCURI", + subheading: "{{count}} intrări · trucuri, tranziție, freestyle, stance & hardware", + searchPlaceholder: "Caută trucuri sau porecle — tre flip, crooks, method…", + clearSearch: "Șterge căutarea", + all: "Toate", + results: "{{count}} rezultat{{s}} pentru", + noMatch: "Niciun truc nu se potrivește. Încearcă o poreclă precum „tre flip”, „crooks” sau „melon”.", + tricksCount: "{{count}} trucuri", + footerBefore: "Cunoști un truc sau o poreclă pe care am omis-o? Trucurile capătă nume diferite în fiecare scenă — scrie-i lui", + sasquatch: "The Sasquatch 🦧", + footerAfter: "și anunță-ne." + }, + signers: { + seoTitle: "Aplicații de semnare - Securizează-ți cheile Nostr | SkateSpots", + seoDescription: "Află despre aplicațiile de semnare care îți păstrează cheile Nostr în siguranță. Găsește cea mai bună opțiune pentru Android, iOS sau browsere desktop.", + securityGuide: "Ghid de securitate", + protect: "Protejează-ți", + nostrKeys: "cheile Nostr", + heroDesc: "Aplicațiile de semnare îți păstrează cheile private în siguranță semnând evenimente fără a le expune. În loc să lipești cheia în fiecare aplicație, lasă un semnatar să o gestioneze în siguranță.", + whySignerStrong: "De ce să folosești un semnatar?", + whySigner: "Cheia ta privată Nostr este ca o parolă care nu poate fi schimbată niciodată. O aplicație de semnare o păstrează în siguranță permițându-ți să folosești orice aplicație Nostr.", + androidTitle: "Semnatari Android", + androidDesc: "Aplicații native de semnare pentru dispozitive Android, inclusiv GrapheneOS.", + iosTitle: "Semnatari iOS", + iosDesc: "Opțiuni de semnare pentru utilizatorii de iPhone și iPad.", + browserTitle: "Extensii de browser", + browserDesc: "Extensii de browser desktop pentru semnare în aplicații web.", + recommended: "Recomandat", + yourPlatform: "Platforma ta", + get: "Obține {{name}}", + protocolsTitle: "Înțelegerea protocoalelor", + nip07Desc: "Standard pentru extensii de browser. Extensia injectează capabilități de semnare în aplicațiile web. Folosit de Alby, nos2x, Flamingo și extensii similare.", + nip46Desc: "Protocol de semnare la distanță (\"bunker\"). Aplicația ta de semnare aprobă cereri de la alte aplicații fără a-ți partaja cheile. Folosit de Nsec.app, Nostria și Nowser.", + nip55Desc: "Protocol de semnare specific Android. Aplicațiile native pot cere semnături de la Amber fără a expune cheile. Cea mai fluidă experiență pe Android.", + whichChoose: "Ce să alegi?", + chooseAndroid: "Android:", + chooseAndroidDesc: "Amber (NIP-55) pentru aplicații native", + chooseIos: "iOS:", + chooseIosDesc: "Nsec.app (NIP-46) pentru cea mai bună compatibilitate", + chooseDesktop: "Desktop:", + chooseDesktopDesc: "Alby, nos2x sau Flamingo (NIP-07)", + amberDesc: "Semnatar nativ Android axat pe securitate și ușurință în utilizare. Cea mai bună alegere pentru utilizatorii Android.", + nsecAppDesc: "Semnatar la distanță multiplatformă care acționează ca un seif sigur pentru cheile tale.", + nostriaDesc: "Aplicație de semnare la distanță cu chei stocate în stocarea securizată a dispozitivului.", + nowserDesc: "Semnatar multi-autentificare care acceptă atât extensia de browser, cât și protocoalele de semnare la distanță.", + nsecAppIosDesc: "Cea mai bună opțiune pentru iOS. Folosește-o ca semnatar la distanță cu orice client Nostr.", + nowserTfDesc: "Semnatar iOS disponibil prin TestFlight cu capabilități de semnare similare cu Android.", + nostriaIosDesc: "Semnatar la distanță cu stocare securizată a cheilor pe dispozitivul tău.", + nos2xDesc: "Extensie de browser simplă și fiabilă pentru semnarea evenimentelor Nostr.", + albyDesc: "Portofel Bitcoin Lightning cu gestionare integrată a cheilor Nostr și WebLN.", + flamingoDesc: "Extensie de browser axată pe Nostr, cu interfață curată.", + kiwiDesc: "Pe Android/GrapheneOS, folosește Kiwi Browser pentru a încărca extensiile nos2x sau Alby.", + fNativeApp: "Aplicație nativă", + fMultiKey: "Suport pentru mai multe chei", + fEventSigning: "Semnare de evenimente", + fSecureStorage: "Stocare securizată a cheilor", + fRemoteSigning: "Semnare la distanță", + fAnyClient: "Funcționează cu orice client", + fCrossDevice: "Sincronizare între dispozitive", + fMultiKeySupport: "Suport pentru mai multe chei", + fNip07: "Suport NIP-07", + fNip46: "Suport NIP-46", + fFlexibleSigning: "Semnare flexibilă", + fNativeIos: "Aplicație nativă iOS", + fLightweight: "Ușor", + fEasyToUse: "Ușor de folosit", + fChromeSupport: "Suport Chrome/Brave/Edge", + fLightningPayments: "Plăți Lightning", + fNostrSigning: "Semnare Nostr", + fWebln: "Suport WebLN", + fNwc: "Suport NWC", + fCleanUi: "Interfață curată", + fPrivacyFocused: "Axat pe confidențialitate", + fExtensionMobile: "Suport pentru extensii pe mobil", + fFullBrowser: "Experiență completă de browser", + fGraphene: "Funcționează pe GrapheneOS" + }, + betaDisclaimer: { + title: "Atenție — aceasta este beta", + subtitle: "Câteva cuvinte înainte să te lansezi.", + ossTitle: "Open-source & experimental", + ossBody: "Construit în mod deschis de comunitate. Bâjbâie prin el, bifurcă-l, strică-l.", + betaTitle: "În beta — neauditat", + betaBody: "Codul nu a fost supus încă unui audit formal de securitate. Erorile se întâmplă.", + moneyTitle: "Gestionează Bitcoin & Lightning real", + moneyBody: "Folosește bani pe el pe propriul risc. Încarcă doar cât îți permiți să pierzi.", + finePrint: "Fără garanție de niciun fel. Ești singurul responsabil pentru fondurile și cheile tale.", + viewCode: "Vezi codul", + accept: "Am înțeles, lasă-mă înăuntru" + } + } +}; + +export default roBatch3; diff --git a/src/i18n/ro/batch4.ts b/src/i18n/ro/batch4.ts new file mode 100644 index 0000000..2dcdb51 --- /dev/null +++ b/src/i18n/ro/batch4.ts @@ -0,0 +1,1115 @@ +/** ro — batch 4. Romanian translation of the `walletUi` namespace. */ +const roBatch4 = { + walletUi: { + page: { + title: 'Portofel', + subtitle: 'Bitcoin Lightning + Cashu', + manage: 'Gestionează', + getAWallet: 'Obține un portofel', + learnPlanB: 'Află mai multe la Plan B Academy', + walletMinibits: 'Cashu mobil · NWC', + walletAlby: 'Extensie de browser · WebLN + NWC', + walletZeus: 'Lightning autocustodiat', + walletCoinos: 'Bazat pe web · funcționează oriunde', + whatAreZaps: 'Ce sunt zap-urile?', + whatAreZapsShort: 'Ce sunt zap-urile?', + zapsDesc: 'Plăți Bitcoin Lightning instantanee. Trimite sats oricărui skater, creator de spoturi sau antrenor — fără intermediari, fără comision de platformă.', + instant: 'Instantanee', + instantDesc: 'Se decontează în câteva secunde', + flexible: 'Flexibile', + flexibleDesc: 'Portofelul tău, cheile tale', + private: 'Private', + privateDesc: 'Cashu ascunde cine plătește', + direct: 'Directe', + directDesc: 'Valoarea ajunge la creator', + loginRequired: 'Autentificare necesară', + loginRequiredDesc: 'Autentifică-te cu contul tău Nostr pentru a-ți conecta portofelul Lightning și a începe să trimiți zap-uri.', + browseMints: 'Răsfoiește mint-urile Cashu', + }, + modal: { + walletName: 'Numele portofelului (opțional)', + walletNamePlaceholder: 'Portofelul meu Lightning', + connectionUri: 'URI de conexiune', + spendLimitTitle: 'Setează mai întâi o limită de cheltuieli', + spendLimitBody1: 'Acest șir îi permite SkateSpots să plătească facturi Lightning din portofelul tău. În aplicația portofelului, dă acestei conexiuni un mic', + dailyBudget: 'buget zilnic', + spendLimitBody2: '(de exemplu, câteva mii de sats) și activează doar', + spendLimitBody3: 'Nu lipi niciodată o conexiune cu buget nelimitat. O poți revoca oricând din portofel.', + addWallet: 'Adaugă portofel', + nwcConnection: 'Conexiune NWC', + lightningWallet: 'Portofel Lightning', + pasteNwc: 'Lipește șirul de conexiune NWC pentru a trimite zap-uri', + connectWallet: 'Conectează portofelul', + browserExtension: 'Extensie de browser (WebLN)', + autoDetected: 'Detectată automat dacă este instalată', + ready: 'Pregătit', + notFound: 'Negăsit', + getNwcFrom: 'Obține NWC de la:', + connectionRequired: 'URI de conexiune obligatoriu', + connectionRequiredDesc: 'Te rugăm să introduci un URI de conexiune NWC valid.', + activeChanged: 'Portofelul activ s-a schimbat', + activeChangedDesc: 'Portofelul selectat este acum activ pentru zap-uri.', + connectNwc: 'Conectează portofelul NWC', + connectNwcDesc: 'Introdu șirul de conexiune de la un portofel compatibil.', + connect: 'Conectează', + connecting: 'Se conectează...', + walletSettings: 'Setări portofel', + connectDesc: 'Conectează-ți portofelul Lightning pentru a trimite zap-uri instant.', + }, + cashu: { + title: 'Portofel Cashu', + desc: 'Portofel ecash integrat — nu necesită configurare externă', + initializing: 'Se inițializează portofelul...', + walletError: 'Eroare de portofel', + balance: 'Sold', + balanceAria: 'Soldul portofelului {{amount}} sats', + activeMint: 'Mint activ', + selectMint: 'Selectează un mint', + receive: 'Primește', + send: 'Trimite', + receiveViaLightning: '⚡ Primește prin Lightning', + amountSats: 'Sumă în sats', + generateInvoice: 'Generează factură', + generating: 'Se generează…', + or: 'Sau', + receiveCashu: '🥜 Primește token Cashu', + scanQr: 'Scanează codul QR', + pasteCashu: 'Lipește tokenul Cashu (cashu...)', + receiveToken: 'Primește token', + receiving: 'Se primește…', + createCashu: '🥜 Creează token Cashu', + createToken: 'Creează token', + creating: 'Se creează…', + payInvoice: '⚡ Plătește factura Lightning', + pasteInvoice: 'Lipește factura Lightning (lnbc...)', + payInvoiceBtn: 'Plătește factura', + processing: 'Se procesează...', + payAddress: '📧 Plătește Lightning Address', + sendToAddress: 'Trimite la adresă', + sending: 'Se trimite…', + recentActivity: 'Activitate recentă', + receivedLightning: 'Primit ⚡ Lightning', + sentLightning: 'Trimis ⚡ Lightning', + sentToken: 'Trimis 🥜 token', + receivedToken: 'Primit 🥜 token', + whatIsCashu: 'Ce este Cashu?', + whatIsCashuDesc: 'Cashu este bani digitali garantați de Bitcoin Lightning. Gândește-te la el ca la niște tokenuri Bitcoin pe care le ții în browser.', + benefitOffline: 'Funcționează offline la spoturi', + benefitInstant: 'Plăți instant de la persoană la persoană', + benefitPrivacy: 'Orientat spre confidențialitate (mint-urile nu te pot urmări)', + benefitRedeemable: 'Întotdeauna răscumpărabil pentru sats Lightning', + findMints: 'Găsește mint-uri pe mintradar.pedani.eu', + backupTitle: 'Fă o copie de siguranță a portofelului', + backupDesc: 'Portofelul tău este protejat de o frază de recuperare de 12 cuvinte. Păstreaz-o în siguranță — vei avea nevoie de ea pentru a-ți restaura soldul dacă ștergi datele browserului.', + viewRecovery: 'Vezi fraza de recuperare', + backupNote: 'Este ca nsec-ul tău Nostr — ține-o secretă și fă o copie de siguranță!', + tokenReceived: 'Token primit', + tokenReceivedDesc: 'Tokenul Cashu a fost răscumpărat cu succes!', + receiveFailed: 'Primirea a eșuat', + unknownError: 'Eroare necunoscută', + requestUnsupported: 'Cererea Cashu nu este încă acceptată', + requestUnsupportedDesc: 'Acest portofel nu poate plăti încă o cerere Cashu (creq) — cere mai bine o factură sau o adresă Lightning.', + onchainUnsupported: 'On-chain nu este acceptat aici', + onchainUnsupportedDesc: 'Aceasta este o adresă Bitcoin. Acest portofel trimite doar tokenuri Cashu și plăți Lightning.', + nostrProfile: 'Acesta este un profil Nostr', + nostrProfileDesc: 'Scanează un token Cashu, o factură Lightning sau o adresă Lightning pentru a plăti.', + clinkUnsupported: 'Codul de plată nu este încă acceptat', + clinkUnsupportedDesc: 'Acest portofel nu poate plăti încă coduri CLINK. Folosește în schimb o factură sau o adresă Lightning.', + unrecognizedQr: 'Cod QR nerecunoscut', + unrecognizedQrDesc: 'Scanează un token Cashu, o factură Lightning sau o adresă Lightning.', + invalidAmount: 'Sumă invalidă', + invalidAmountDesc: 'Te rugăm să introduci o sumă validă', + paymentSent: 'Plată trimisă', + paymentSentDesc: 'Am trimis {{amount}} sats la {{address}}', + paymentFailed: 'Plata a eșuat', + copied: 'Copiat', + copiedDesc: '{{label}} a fost copiat în clipboard', + receiveSats: 'Primește {{amount}} sats', + payInvoiceHint: 'Plătește această factură din orice portofel Lightning', + invoiceQrAlt: 'Cod QR al facturii', + lightningInvoice: 'Factură Lightning', + invoiceLabel: 'Factură', + waiting: '⏳ Se așteaptă plata...', + tokenReady: 'Token pregătit de trimitere', + shareToken: 'Partajează acest token cu destinatarul', + tokenQrAlt: 'Cod QR al tokenului', + cashuToken: 'Token Cashu', + tokenLabel: 'Token', + copyToken: 'Copiază tokenul', + tokenWarning: 'Oricine are acest token îl poate revendica — tratează-l ca pe bani cash!', + browser: { + title: 'Portofel ecash integrat', + appOnly: 'Doar în aplicație', + desc: 'Ecash Cashu autocustodiat, alimentat de Bitcoin Lightning', + unlockTitle: 'Deblochează portofelul complet în aplicația SkateSpots', + unlockDesc: 'Portofelul ecash integrat îți permite să emiți, să trimiți și să răscumperi tokenuri Cashu chiar la spot. Trăiește în aplicația nativă, unde poate comunica direct cu mint-urile — browserele izolează acele conexiuni pentru siguranța ta.', + zapTipTitle: 'Zap & bacșiș — funcționează acum în browser', + zapTipDesc: 'Trimiterea de sats către spoturi, evenimente, antrenori și echipe funcționează chiar aici. Doar conectează un portofel Lightning mai jos — Nostr Wallet Connect sau o extensie de browser precum Alby. Nu e nevoie de un mint Cashu.', + }, + }, + escrow: { + title: 'Depozit în garanție', + desc: 'Vinde în siguranță: activează depozitul în garanție și un cumpărător își poate bloca sats pentru tine într-un schimb. Îi eliberezi când livrezi — dacă nu o faci, cumpărătorul îi poate recupera după timpul convenit.', + active: 'Depozitul în garanție este activ', + publish: 'Activează depozitul în garanție', + published: 'Depozitul în garanție este activ', + publishedDesc: 'Cumpărătorii își pot bloca acum fonduri pentru tine într-un schimb.', + failed: 'Nu s-a putut activa depozitul în garanție', + }, + escrowSettings: { + title: 'Setări depozit în garanție', + desc: 'Valori implicite pentru schimburile cu depozit Cashu. Local pe dispozitiv.', + lockWindow: 'Fereastră de blocare implicită', + lockWindowHint: 'Cât timp rămân blocate fondurile înainte ca cumpărătorul să le poată recupera. Mai lung este mai sigur pentru vânzător.', + days: 'zile', + preferredMint: 'Mint pentru depozit', + activeMint: 'Mint activ', + preferredMintHint: 'Ce mint finanțează depozitul. Folosește unul de încredere.', + requireListings: 'Cere depozit în garanție la anunțurile noi', + requireListingsHint: 'Preselectează „Cere depozit în garanție” când listezi un articol.', + }, + privacy: { + title: 'Sfaturi de confidențialitate', + subtitle: 'Învață cum să-ți protejezi confidențialitatea financiară', + cashuRecommended: 'CASHU (RECOMANDAT)', + anon: 'Tranzacții anonime', + blind: 'Semnăturile oarbe ascund activitatea', + noIp: 'Fără expunerea IP-ului', + trustMint: 'Ai încredere în mint cu fondurile', + lightningAddress: 'LIGHTNING ADDRESS', + linked: 'Poate fi asociată cu identitatea', + traceable: 'Istoricul plăților poate fi urmărit', + ipVisible: 'IP-ul este vizibil la emiterea facturii', + selfCustody: 'Autocustodie posibilă', + bestPractices: 'Cele mai bune practici', + tip1Title: 'Folosește Cashu pentru a primi bacșișuri', + tip1Desc: 'Portofelul Cashu integrat este cea mai privată modalitate de a primi zap-uri', + tip2Title: 'Folosește un portofel separat pentru SkateSpots', + tip2Desc: 'Nu folosi portofelul tău principal de economii — ține fondurile aplicației separate', + tip3Title: 'Ia în considerare folosirea unui VPN sau Tor', + tip3Desc: 'Ascunde-ți adresa IP atunci când faci tranzacții', + tip4Title: 'Evită adresele Lightning asociate cu identitatea', + tip4Desc: 'Folosește adrese pseudonime, care nu sunt legate de numele tău real', + proTip: 'Sfat pro:', + proTipDesc: 'Primește plățile mai întâi în portofelul tău Cashu, apoi mută periodic sume mai mari în portofelul personal folosind un VPN pentru transfer.', + warnTitle: 'Notă de confidențialitate', + warnDesc: 'Adresele Lightning pot asocia potențial activitatea ta pe SkateSpots cu identitatea ta reală.', + betterPrivacy: 'Pentru mai multă confidențialitate:', + bullet1: 'Folosește un portofel dedicat pentru această aplicație', + bullet2: 'Ia în considerare folosirea portofelului Cashu în schimb', + bullet3: 'Folosește VPN/Tor pentru tranzacții', + useCashu: 'Folosește Cashu în schimb', + understand: 'Am înțeles', + }, + mintPrivacy: { + title: 'Confidențialitatea mint-urilor', + desc: 'Folosirea mai multor mint-uri îmbunătățește confidențialitatea, împiedicând un singur mint să vadă toate tranzacțiile tale', + distribution: 'Distribuția fondurilor', + singleWarning: 'Folosirea unui singur mint înseamnă că acel mint poate vedea toate sumele și momentele tranzacțiilor tale. Ia în considerare adăugarea mai multor mint-uri pentru mai multă confidențialitate.', + yourMints: 'Mint-urile tale ({{count}})', + default: 'Implicit', + addMint: 'Adaugă mint', + addMintDesc: 'Adaugă un mint Cashu nou în portofelul tău', + mintUrl: 'URL mint', + add: 'Adaugă', + adding: 'Se adaugă...', + orChoose: 'Sau alege din listă', + recommended: 'Mint-uri recomandate', + allMints: 'Toate mint-urile (director)', + searchMints: 'Caută mint-uri…', + noDirectoryMints: 'Niciun mint nu corespunde căutării tale.', + directoryHint: 'Din directorul comunitar MintRadar — neoficial și posibil învechit.', + added: 'Adăugat', + soon: 'În curând', + autoDistribute: 'Distribuie automat fondurile', + autoDesc: 'Împrăștie fondurile primite între mai multe mint-uri', + autoAria: 'Distribuie automat fondurile (în curând)', + tip1: 'Folosește minim 2-3 mint-uri diferite pentru mai multă confidențialitate', + tip2: 'Nu ține toate fondurile într-un singur mint — împrăștie-le', + tip3: 'Ia în considerare jurisdicția mint-ului (țări diferite = acces legal diferit)', + tip4: 'Mint-urile văd momentul tranzacțiilor, dar NU cui plătești (semnături oarbe)', + future: 'Funcții viitoare: rotația mint-urilor și scor de confidențialitate — rămâi aproape!', + findMore: 'Găsește mai multe mint-uri pe mintradar.pedani.eu', + trustWarning: 'Avertisment de încredere:', + trustWarningDesc: 'Mint-urile sunt custodiabile — ele îți țin fondurile. Folosește doar mint-uri în care ai încredere. Dacă un mint dispare, fondurile tale se pot pierde. Împrăștierea fondurilor între mai multe mint-uri reduce riscul.', + removeTitle: 'Elimini mint-ul?', + removeDesc: 'Sigur vrei să elimini {{name}}?', + removeMint: 'Elimină mint-ul', + warning: 'Avertisment:', + withdrawWarning: 'Acest mint are {{amount}} sats. Retrage-ți fondurile înainte de a-l elimina!', + invalidUrl: 'URL invalid', + invalidUrlDesc: 'URL-ul mint-ului trebuie să înceapă cu https://', + mintAdded: 'Mint adăugat', + mintAddedDesc: 'Mint nou adăugat cu succes', + mintAddedNamed: '{{name}} a fost adăugat cu succes', + failedAdd: 'Adăugarea mint-ului a eșuat', + failed: 'Eșuat', + noMints: 'Niciun mint', + singleMint: 'Un singur mint', + concentrated: 'Concentrat', + moderate: 'Moderat', + wellDistributed: 'Bine distribuit', + mintCoinosWebDesc: 'Mint prietenos cu webul (recomandat pentru browsere)', + mintMinibitsWebDesc: '⚠ Doar în aplicația nativă — inaccesibil din browserele web', + mintMinibitsNativeDesc: 'Mint SkateSpots — recomandat', + mintCoinosDesc: 'Mint prietenos cu webul', + mintLnbitsDesc: 'Mint comunitar pe LNbits', + }, + nwc: { + title: 'Portofel Lightning', + noConnection: 'Portofel NWC', + refresh: 'Reîmprospătează soldul', + createInvoice: 'Creează factură', + copyInvoice: 'Copiază factura', + pasteInvoice: 'Lipește o factură Lightning (lnbc…)', + amount: 'Sumă: {{amount}} sats', + pasteToSee: 'Lipește o factură pentru a vedea suma', + pay: 'Plătește', + invoiceQrAlt: 'Cod QR al facturii Lightning', + enterAmount: 'Introdu o sumă în sats', + readBalanceFailed: 'Nu s-a putut citi soldul', + readBalanceFailedDesc: 'Portofelul tău nu a răspuns.', + createInvoiceFailed: 'Nu s-a putut crea factura', + createInvoiceFailedDesc: 'Încearcă din nou într-o clipă.', + paymentSent: 'Plată trimisă', + paidAmount: 'Am plătit {{amount}} sats.', + paid: 'Plătit.', + paymentRejected: 'Portofelul a respins plata.', + }, + qr: { + title: 'Scanează codul QR', + desc: 'Poziționează codul QR în cadrul camerei pentru a-l scana', + paste: 'Lipește din clipboard', + hint: 'Scanează un token Cashu, o factură Lightning sau o adresă Lightning', + clipboardEmpty: 'Clipboard gol', + clipboardEmptyDesc: 'Nu s-a găsit text în clipboard', + pasteFailed: 'Lipirea a eșuat', + pasteFailedDesc: 'Nu s-a putut citi din clipboard', + }, + recovery: { + title: 'Frază de recuperare', + desc: 'Aceste 12 cuvinte sunt singura modalitate de a-ți restaura soldul ecash. Scrie-le în ordine și păstrează-le offline — nu le împărtăși niciodată nimănui.', + tapReveal: 'Atinge pentru a dezvălui', + noWatching: 'Asigură-te că nu te privește nimeni', + hide: 'Ascunde', + reveal: 'Dezvăluie', + paperHint: 'Cel mai sigur este să o scrii pe hârtie — copierea în clipboard se poate scurge către alte aplicații.', + written: 'Am scris-o', + revealFirst: 'Dezvăluie mai întâi cuvintele', + copiedDesc: 'Fraza de recuperare a fost copiată — lipește-o într-un loc sigur, apoi golește clipboardul.', + copyFailed: 'Copierea a eșuat', + copyFailedDesc: 'Te rugăm să scrii cuvintele pe hârtie în schimb.', + }, + guide: { + quickGuide: 'Ghid rapid', + fullGuide: 'Ghidul portofelului (ediția skater)', + cashuSummary: 'Confidențialitate + confort', + mintHoldsFunds: '(mint-ul deține fondurile)', + lightningSummary: 'Control + siguranță', + youHoldKeys: '(tu deții cheile)', + useBoth: 'Folosește-le pe amândouă: Cashu pentru bacșișuri, Lightning pentru economii', + cashuTitle: 'PORTOFEL CASHU', + cashuTagline: 'Ca banii cash din buzunar, la skatepark', + cashuBullet1: 'Rapid de scos pentru un bacșiș', + cashuBullet2: 'Nu-ți ține economiile de-o viață aici', + cashuBullet3: 'Dacă mint-ul dispare, fondurile se pot pierde', + cashuBullet4: 'Nimeni nu știe cât ai (confidențialitate!)', + cashuPerfectFor: 'Gustări de sesiune, zap-uri la clipuri, bacșișuri mici', + lightningTitle: 'PORTOFEL LIGHTNING', + lightningTagline: 'Ca contul tău bancar — tu ești la control', + lightningBullet1: 'Sigur, tu controlezi cheile', + lightningBullet2: 'Durează puțin să-l configurezi', + lightningBullet3: 'Istoric complet al tranzacțiilor', + lightningBullet4: 'Mai bun pentru sume mari', + lightningPerfectFor: 'Achiziții de echipament, economii, zap-uri mari', + perfectFor: 'Perfect pentru:', + proTips: 'SFATURI PRO', + tip1Title: 'Folosește ambele portofele', + tip1Desc: 'Ține banii de sesiune în Cashu, economiile în Lightning', + tip2Title: 'Încearcă portofele diferite', + tip2Desc: 'Experimentează pentru a găsi ce ți se potrivește. Fiecare are funcții și compromisuri diferite', + tip3Title: 'Mai multă confidențialitate', + tip3Desc: 'Folosirea mai multor portofele înseamnă că nicio aplicație nu-ți vede toată activitatea', + tip4Title: 'Acumulează experiență', + tip4Desc: 'Cu cât cunoști mai multe instrumente, cu atât ai mai multe opțiuni. Începe cu pași mici, învață pe parcurs', + tldr: 'Pe scurt:', + tldrDesc: 'Nu există un portofel „cel mai bun” — depinde de nevoile tale. Încearcă-le pe amândouă, folosește ce ți se pare potrivit și nu-ți ține toți sats într-un singur loc!', + }, + zap: { + count: '{{count}} zap-uri', + connectFirst: 'Conectează mai întâi portofelul', + connectFirstDesc: 'Pentru a trimite zap-uri (bacșișuri Bitcoin), trebuie să conectezi un portofel Lightning.', + quickSetup: 'Configurare rapidă (30 de secunde)', + quickSetupDesc: 'Conectează-ți portofelul Lightning existent cu Nostr Wallet Connect (NWC). Nu e nevoie de conturi suplimentare.', + connectNwc: 'Conectează portofelul cu NWC', + noWallet: 'Nu ai un portofel? Află cum', + skip: 'Sari peste deocamdată (factură manuală)', + note: 'ℹ️ Notă:', + noteDesc: 'Poți crea în continuare o factură fără să conectezi un portofel, dar va trebui să o copiezi manual pentru a plăti.', + payWithWebln: 'Plătește cu WebLN', + processing: 'Se procesează...', + openInWallet: 'Deschide în portofelul Lightning', + scanHint: 'Scanează codul QR sau copiază factura pentru a plăti cu orice portofel Lightning.', + cashuInstant: 'Plătește instant cu portofelul tău integrat', + satsAvailable: 'sats disponibili', + or: 'SAU', + customAmount: 'Sumă personalizată', + addComment: 'Adaugă un comentariu (opțional)', + insufficientBanner: '⚠️ Sold Cashu insuficient. Ai nevoie de încă {{amount}} sats. Treci la Lightning sau alimentează-ți portofelul Cashu.', + creatingInvoice: 'Se creează factura...', + zapAmount: 'Trimite zap {{amount}} sats', + zapAmountCashu: 'Trimite zap {{amount}} sats cu Cashu', + lightningInvoice: 'Factură Lightning', + qrAlt: 'Cod QR al facturii Lightning', + enterAmount: 'Introdu o sumă', + enterAmountDesc: 'Alege o valoare prestabilită sau scrie un număr valid de sats.', + cashuUnavailable: 'Portofelul Cashu nu este disponibil', + cashuUnavailableDesc: 'Portofelul tău Cashu nu este pregătit. Treci la Lightning sau deschide mai întâi portofelul.', + insufficientCashu: 'Sold Cashu insuficient', + insufficientCashuDesc: 'Ai nevoie de încă {{amount}} sats. Treci la Lightning sau alimentează.', + zapSentCashu: 'Zap trimis! 🥜', + zapSentCashuDesc: 'Ai trimis {{amount}} sats din portofelul tău Cashu.', + cashuFailed: 'Plata Cashu a eșuat', + cashuFailedDesc: 'Plata cu portofelul tău Cashu a eșuat.', + invoiceCopied: 'Factură copiată', + invoiceCopiedDesc: 'Factura Lightning a fost copiată în clipboard', + defaultComment: 'Zap pe SkateSpots! 🛹', + titleConnect: 'Conectează portofelul', + titlePayment: 'Plată Lightning', + titleZap: 'Trimite un zap', + descConnect: 'Conectează-ți portofelul Lightning pentru a trimite zap-uri', + descPayment: 'Plătește cu rețeaua Bitcoin Lightning', + descZap: 'Zap-urile sunt plăți Bitcoin mici care susțin creatorul acestui articol. Dacă ți-a plăcut, ia în considerare să trimiți un zap!', + descZapShort: 'Zap-urile sunt plăți Bitcoin mici care susțin creatorii. Ia în considerare să trimiți un zap!', + }, + zapCrew: { + title: 'Zap pentru echipă', + desc: 'Împarte un zap în mod egal între {{count}} membri ai echipei cu o adresă Lightning.', + noMembers: 'Momentan nu există alți membri ai echipei cărora să le trimiți zap-uri.', + totalAmount: 'Sumă totală', + customTotal: 'Total personalizat', + each: 'sats fiecare', + rounded: '(rotunjit)', + noWallet: 'Niciun portofel conectat — vei primi o factură pentru fiecare membru, de plătit manual. Conectează un portofel pentru împărțire cu o singură atingere.', + zapAcross: 'Trimite zap {{amount}} sats către {{count}}', + sentTo: '⚡ Trimis către {{done}}/{{total}}', + none: 'Nicio plată automată finalizată', + copyPending: 'Copiază facturile în așteptare pentru a finaliza plata manual.', + thanks: 'Mulțumim pentru că susții echipa!', + payingCrew: 'Se plătește echipa…', + defaultComment: 'Zap pentru echipa {{crew}}! 🤘', + sent: 'Trimis', + paying: 'Se plătește', + resolving: 'Se rezolvă', + skipped: 'Omis', + failed: 'Eșuat', + waiting: 'În așteptare', + copyInvoice: 'Copiază factura', + invoiceCopied: 'Factură copiată', + invoiceCopiedDesc: 'Lipește-o în orice portofel Lightning', + }, + zapBadges: { + title: 'Insigne de zap', + zaps: 'zap-uri', + satsSent: 'sats trimiși', + rank: 'rang', + footnote: 'Pe baza ultimelor 30 de zile de zap-uri.', + first: 'Primul zap', + firstHint: 'Trimite primul tău zap', + regular: 'Constant', + regularHint: 'Trimite 10 zap-uri', + generous: 'Generos', + generousHint: 'Trimite 10.000 sats', + patron: 'Patron', + patronHint: 'Trimite 100.000 sats', + top10: 'Top 10', + top10Hint: 'Atinge primii 10 susținători', + }, + trust: { + unavailable: 'Scor de încredere indisponibil', + yourContent: 'Acesta este conținutul tău', + following: 'Urmărești acest utilizator', + friendOfFriend: 'Prieten al unui prieten (2 hopuri)', + nip05: 'Utilizator verificat NIP-05', + unknown: 'Utilizator necunoscut', + help: 'Scorurile de încredere ajută la identificarea contribuitorilor de încredere din comunitatea de skateboarding.', + }, + share: { + title: 'Partajează profilul', + desc: 'Îndreaptă camera telefonului spre cod pentru a deschide profilul lui {{name}}.', + qrAlt: 'Cod QR al profilului', + copyLink: 'Copiază linkul', + copyFailed: 'Copierea a eșuat', + copyFailedDesc: 'Nu s-a putut copia linkul.', + shareEllipsis: 'Partajează…', + }, + addToCollection: { + title: 'Salvează în colecție', + desc: 'Salvează „{{spot}}” într-una dintre colecțiile tale', + loginRequired: 'Autentifică-te pentru a salva spoturi în colecții', + noCollections: 'Nu ai încă nicio colecție', + createFirst: 'Creează-ți prima mai jos!', + spotCount: '{{count}} spoturi', + alreadySavedTag: 'Deja salvat', + alreadySaved: 'Deja salvat', + alreadySavedDesc: '„{{spot}}” este deja în „{{collection}}”', + saved: 'Spot salvat!', + savedDesc: 'Am adăugat „{{spot}}” în „{{collection}}”', + saveFailed: 'Salvarea a eșuat', + somethingWrong: 'Ceva a mers greșit', + created: 'Colecție creată!', + createdDesc: 'Am adăugat „{{spot}}” în noua ta colecție „{{collection}}”', + createFailed: 'Crearea colecției a eșuat', + name: 'Numele colecției', + descriptionOptional: 'Descriere (opțional)', + creating: 'Se creează...', + createAndSave: 'Creează și salvează', + createNew: 'Creează o colecție nouă', + }, + collection: { + back: 'Înapoi la colecții', + created: 'Creată {{date}}', + deleteTitle: 'Ștergi colecția?', + deleteDesc: 'Aceasta va șterge definitiv „{{title}}”. Spoturile în sine nu vor fi afectate.', + deleting: 'Se șterge...', + deleteFailed: 'Ștergerea colecției a eșuat', + deleted: 'Colecție ștearsă', + deletedDesc: '„{{title}}” a fost eliminată', + empty: 'Niciun spot în această colecție', + emptyOwner: 'Adaugă spoturi în colecția ta dând clic pe „Salvează în colecție” la orice spot', + emptyOther: 'Această colecție este goală', + browseSpots: 'Răsfoiește spoturile', + linkCopied: 'Link copiat!', + linkCopiedDesc: 'Linkul colecției a fost copiat în clipboard', + map: 'Harta colecției', + removeFailed: 'Eliminarea spotului a eșuat', + shareText: 'Aruncă o privire la această colecție de spoturi: {{title}}', + spotRemoved: 'Spot eliminat', + spotRemovedDesc: '„{{title}}” a fost eliminat din această colecție', + }, + mints: { + title: 'Mint-uri', + subtitle: 'Răsfoiește mint-urile Cashu și starea lor. Operațiunile portofelului Cashu rulează în aplicația SkateSpots.', + searchPlaceholder: 'Caută mint-uri după nume sau URL…', + onlineOnly: 'Doar online', + count: '{{filtered}} din {{total}} mint-uri', + directoryError: 'Nu s-a putut încărca directorul de mint-uri.', + directoryHint: 'Directorul este administrat de comunitate și are limită de acces — poate fi temporar indisponibil.', + goToWallet: 'Mergi la portofel', + appOnly: 'Adăugarea unui mint se face în aplicația SkateSpots (Cashu este doar în aplicație).', + noMatch: 'Niciun mint nu corespunde cu „{{query}}”.', + footer: 'Date de stare de la proiectul comunitar MintRadar — neoficial și posibil învechit. Verifică întotdeauna termenii unui mint înainte de a-i încredința fonduri.', + archived: 'Arhivat', + degraded: 'Degradat', + offline: 'Offline', + online: 'Online', + terms: 'Termeni', + reliability: 'fiabilitate', + add: 'Adaugă', + addToWallet: 'Adaugă în portofel', + copyUrl: 'Copiază URL-ul', + openMint: 'Deschide mint-ul', + inWallet: 'În portofelul tău', + addedBadge: 'Adăugat', + urlCopied: 'URL mint copiat', + added: 'Mint adăugat', + addedDesc: '{{host}} este acum în portofelul tău.', + couldNotAdd: 'Nu s-a putut adăuga mint-ul', + communityRating: 'Evaluare comunitară', + reliabilityLabel: 'Fiabilitate', + uptime: 'Disponibilitate 24h / 7z', + location: 'Locație', + latency: 'Latență', + nuts: 'NUT-uri acceptate', + units: 'Unități', + version: 'Versiune', + ratedBy: 'Evaluat {{rating}}/5 de {{count}} persoane pe MintRadar.', + noRating: 'Încă nicio evaluare comunitară pe MintRadar.', + reviewsNote1: 'Recenziile scrise nu fac parte din director —', + openMintRadar: 'deschide MintRadar', + reviewsNote2: 'pentru a citi sau a lăsa una.', + liveness: 'Audit de funcționare: {{mints}} mint-uri și {{melts}} melt-uri testate', + livenessErrors: ' · {{errors}}/{{total}} erori recente', + whatsAMint: 'Ce este un mint?', + whatsAMintDesc: 'Un mint Cashu emite și răscumpără ecash-ul din portofelul tău. Deține Bitcoinul care garantează tokenurile tale — așa că un mint pe care nu îl rulezi singur este unul în care trebuie să ai încredere.', + mintWarning: 'Mint-urile pot intra offline, își pot schimba termenii sau pot dispărea cu fondurile. Ține doar solduri mici dacă nu ai încredere în operator.', + healthDisclaimer: 'Datele de stare sunt administrate de comunitate (MintRadar) — neoficiale și posibil învechite.', + }, + appShop: { + title: 'Magazinul aplicației', + subtitle: 'Marfă SkateSpots pentru oamenii care țin scena în mișcare.', + comingSoon: 'În curând', + wearThe: 'Poartă', + scene: 'scena', + heroDesc1: 'Marfă pentru oamenii care țin treaba asta în mișcare — vândută', + locally: 'local, la cerere', + heroDesc2: '. Îmi scrii, punem la punct detaliile, iar tu plătești în', + heroDesc3: '— Lightning sau Cashu — când o ridici. Fără carduri, fără conturi, fără robot de checkout, fără intermediar care să ia din drop.', + requestItem: 'Cere un articol', + dmHint: 'Deschide un DM privat și criptat cu mine.', + lightning: 'Lightning', + cashu: 'Cashu', + localHandover: 'Predare locală', + inTheWorks: 'În pregătire', + notForSale: 'încă nu este de vânzare', + soon: 'în curând', + tees: 'Tricouri & hanorace', + decks: 'Plăci', + shopTools: 'Scule de atelier', + stickerPacks: 'Pachete de stickere', + stickerPacksDesc: 'Pachetele vin. Designurile nu — tipărește-le pe acestea două chiar acum, gratuit.', + sticker: 'Sticker', + stickerTip: 'Decupat negru. Tipărește pe hârtie de stickere, taie de-a lungul marginii negre.', + poster: 'Poster', + posterTip: 'Se tipărește pe A3; micșorează la A4 (50%) și încă se scanează bine.', + printableAlt: 'SkateSpots {{title}} — imprimabil', + print: 'Tipărește', + printNote1: 'Tipărește la', + actualSize: '100% / „Mărime reală”', + printNote2: 'astfel încât mărimea să fie exactă și codul QR să rămână clar — indică spre skate-spots.org. Fișiere vectoriale, deci se scalează fără să se estompeze.', + howBuying: 'Cum funcționează cumpărarea', + dmNotCart: 'este un DM, nu un coș', + step1Title: 'Scrie-mi', + step1Desc: 'Trimite un DM cu ce vrei — articol, mărime, culoare, orice cauți.', + step2Title: 'Punem la punct', + step2Desc: 'Preț în sats și unde și când să ne întâlnim. Este o conversație, nu un checkout.', + step3Title: 'Plătește în sats', + step3Desc: 'Lightning sau Cashu la predare, apoi este al tău. Fără livrare, fără săli de așteptare.', + }, + newsletter: { + newIssue: 'Număr nou', + composerTitle: 'Publică un număr de newsletter', + composerDesc: 'Publicat ca articol NIP-23 (kind 30023) pe relay-ul comunității. Abonații îl primesc în clopoțelul de notificări. Corpul acceptă Markdown.', + fieldTitle: 'Titlu', + identifier: 'Identificator (slug)', + leaveBlank: 'lasă gol pentru generare automată', + reusingSlug: 'Refolosirea unui slug existent editează acel număr în loc să creeze unul nou.', + summary: 'Rezumat', + optional: 'opțional', + coverImage: 'URL imagine de copertă', + bodyMarkdown: 'Corp (Markdown)', + characters: '{{count}} caractere', + publishIssue: 'Publică numărul', + issuePublished: 'Număr publicat! 🛹', + issuePublishedDesc: 'Abonații îl vor vedea în clopoțelul de notificări.', + publishFailed: 'Publicarea a eșuat', + couldNotReachRelay: 'Nu s-a putut ajunge la niciun relay — verifică conexiunea și încearcă din nou.', + tryAgain: 'Te rugăm să încerci din nou.', + publishedToNostr: 'Publicat pe Nostr', + publishedToast: 'Publicat!', + postedToNostr: 'Drop-ul {{number}} a fost postat pe Nostr.', + postToNostr: 'Postează pe Nostr', + previewLabel: 'Previzualizare', + editFirst: 'Editează mai întâi', + previewNoteDesc: 'Așa va apărea nota pe majoritatea clienților Nostr. Formatarea variază de la client la client.', + editNoteDesc: 'Editează textul notei mai jos. Modificările afectează doar această publicare — fișierul sursă rămâne neschimbat.', + dropNumber: 'Drop-ul {{number}}', + publish: 'Publică', + publishing: 'Se publică...', + dropIsOut: 'Drop-ul {{number}} a apărut', + daysAgo: 'acum {{count}}z', + dismiss: 'Închide', + itsMonday: 'Este luni', + mondayDesc: 'E timpul pentru newsletterul săptămânal. Un clic și AI-ul îl scrie din git log.', + writeDrop: 'Scrie drop-ul {{number}}', + dismissReminder: 'Închide memento-ul', + loginPrompt: 'Autentifică-te cu Nostr pentru a primi drop-uri noi în căsuța ta.', + subscribedToast: 'Te-ai abonat! 🛹', + subscribedToastDesc: 'Drop-urile noi vor ajunge în clopoțelul tău de notificări, la „Noutăți”.', + unsubscribed: 'Abonare anulată', + unsubscribedDesc: 'Poți citi în continuare fiecare număr aici, oricând.', + checking: 'Se verifică…', + subscribed: 'Abonat', + unsubscribe: 'Anulează abonarea', + subscribeCta: 'Abonează-te la newsletter', + archiveSynced: 'Arhivă sincronizată cu Nostr', + missingCount: '{{count}} numere din arhivă nu sunt încă pe Nostr', + backfillDesc: 'Publică {{list}} ca articole NIP-23, astfel încât abonații și cititorii de texte lungi să vadă întreaga arhivă. Pagina își păstrează aspectul bogat indiferent de asta.', + backfill: 'Completează {{count}} pe Nostr', + publishing2: 'Se publică…', + publishingLabel: 'Se publică…', + backfilled: '{{count}} numere completate 🛹', + backfilledDesc: 'Arhiva trăiește acum pe Nostr pentru abonați și cititori.', + partialBackfill: 'Publicate {{published}}, {{failed}} eșuate', + retryFinish: 'Reîncearcă pentru a finaliza: {{list}}.', + notLoggedIn: 'Nu ești autentificat', + allIssues: 'Toate numerele', + brand: 'Newsletter SkateSpots', + digTheDrop: 'Îți place drop-ul? Trimite un zap și nu rata următorul.', + sectionStats: 'Comunitatea în cifre', + sectionWhatsNew: 'Ce e nou', + sectionSpotOfWeek: 'Spotul săptămânii', + sectionCommunity: 'Comunitate', + sectionSupport: 'Susține proiectul', + sectionLatestDrops: 'Ultimele drop-uri · Live de pe Nostr', + mappedBy: 'Cartografiat de', + viewOnMap: 'Vezi pe hartă', + noSpotPicked: 'Niciun spot ales săptămâna aceasta. Trimite-l pe al tău și s-ar putea să apară în următorul drop.', + browseMap: 'Răsfoiește harta', + spotMap: 'Harta spoturilor', + statsBadge: 'Statistici', + supportDesc: '100% open source, finanțat de comunitate, fără reclame, fără investitori. Dacă îți este util, trimite un zap sau susține-l pe Angor.', + readFull: 'Citește numărul complet', + joinSkaters: 'Alătură-te celor {{count}} skateri care primesc drop-urile', + weeklyDrops: 'Drop-uri săptămânale', + tagline: 'Un newsletter săptămânal · livrat când vrem noi', + freeNote: 'Gratuit. Alimentat de Nostr — abonamentul tău trăiește pe cheile tale și te urmează pe toate dispozitivele. Drop-urile noi ajung în clopoțelul tău de notificări.', + live: 'Live', + builtOn: 'Construit pe', + openSource: 'Open source', + supportUs: 'Susține-ne', + freeToSkate: 'Ești liber să faci skateboarding', + }, + stats: { + subtitle: 'Statistici live extrase direct din rețeaua Nostr. Transparente, descentralizate, verificabile de oricine.', + dataSource: 'Sursa datelor:', + updated: 'actualizat {{age}}', + refresh: 'Reîmprospătează', + partial: 'Nu s-a putut ajunge la fiecare relay — aceste cifre pot fi incomplete.', + error: 'Nu s-a putut ajunge la relay momentan. Statisticile se vor încărca odată ce conexiunea este restabilită.', + atAGlance: 'Comunitatea dintr-o privire', + skateSpots: 'Spoturi de skate', + listedShops: 'Magazine listate', + events: 'Evenimente', + mappers: 'Cartografi', + uniqueContributors: 'contribuitori unici', + labHeader: 'The Lab · Creatori & servicii', + total: '{{count}} în total', + coaches: 'Antrenori', + filmers: 'Filmeri', + editors: 'Editori', + photographers: 'Fotografi', + builders: 'Constructori', + artists: 'Artiști', + graffiti: 'Graffiti', + tattoo: 'Tatuaje', + trainers: 'Instructori', + musicians: 'Muzicieni', + judges: 'Juri', + organizers: 'Organizatori', + barbers: 'Frizeri', + showFewer: 'Arată mai puține', + showAllCrafts: 'Arată toate cele 13 meserii', + community: 'Comunitate', + tours: 'Tururi', + crews: 'Echipe', + marketplace: 'Marketplace', + liveListings: 'Anunțuri active', + tradesRecorded: 'Schimburi înregistrate', + satsTraded: 'Sats tranzacționați', + zapsToMappers: 'Zap-uri către cartografi', + tradesNote1: 'schimburi reciproce între', + tradesNote2: 'persoane. Sats sunt auto-raportați de comercianți — aplicația nu poate observa o plată din afara ei — așa că titlul numără doar', + mutual: 'reciproce', + tradesNote3: 'schimburi cu un plafon per pereche; afirmația brută este', + tradesNote4: 'sats. „Zap-uri către cartografi” numără doar chitanțele adresate principalilor noștri contribuitori — NU este', + not: 'nu', + tradesNote5: 'volumul global de zap-uri.', + byRegion: 'Spoturi & magazine pe regiuni', + resolving: 'Se rezolvă {{count}} locații fără etichetă din coordonatele lor… o singură dată, apoi memorate pe acest dispozitiv.', + topCountries: 'Țări de top', + topCities: 'Orașe de top', + other: 'Altele', + otherCountriesTitle: 'Țări din afara topului 6', + otherCitiesTitle: 'Orașe din afara topului 6', + uncategorised: 'Fără categorie', + uncategorisedTitle: 'Fără etichetă de oraș/țară', + regionNote1: 'Numără', + spotsAndShops: 'spoturi & magazine', + regionNote2: ', nu skateri — din eticheta proprie de oraș/țară a fiecăruia sau derivată din coordonatele pinului său când nu are niciuna (memorată pe dispozitivul tău; țările grupate după codul ISO când există), doar relay-ul comunității, cu conținutul ascuns de moderare exclus.', + ofTotal: '{{count}} din {{total}}', + regionNote3: 'locații nu au etichetă de locație și apar ca „Fără categorie”.', + growth: 'Creștere în timp', + chartCumulativeTitle: 'Spoturi cartografiate (cumulat)', + chartCumulativeDesc: 'Total spoturi adăugate pe hartă în timp', + chartMonthlyTitle: 'Activitate lunară', + chartMonthlyDesc: 'Conținut nou publicat în fiecare lună', + chartMappersTitle: 'Cartografi activi / lună', + chartMappersDesc: 'Contribuitori unici care publică în fiecare lună', + chartMixTitle: 'Mix de conținut', + chartMixDesc: 'Defalcare pe tip de conținut (din totdeauna)', + noData: 'Încă nu există date', + topMappers: 'Top cartografi', + mostSpots: '— cele mai multe spoturi adăugate', + noMapperData: 'Încă nu există date despre cartografi', + topShops: 'Top magazine', + mostShops: '— cele mai multe magazine adăugate', + shopCount: '{{count}} magazine', + noShopData: 'Încă nu există date despre magazine', + supporters: 'Susținători ai comunității', + fundedTitle: 'Finanțat de comunitate', + fundedDesc1: 'Finanțare Bitcoin descentralizată prin Angor.', + fundedDesc2: 'Fără reclame, fără investitori, fără vânzare de date.', + backAngor: 'Susține-ne pe Angor', + communityLink: 'Comunitate →', + footer1: 'Toate datele sunt extrase live din', + footer2: '— un relay Nostr public.', + footer3: 'Fiecare eveniment este semnat de creatorul său și verificabil criptografic.', + footer4: 'Nicio cifră nu poate fi falsificată.', + spots: 'Spoturi', + shops: 'Magazine', + lab: 'Lab', + thisMonth: '+{{count}} luna aceasta', + fromActive: '{{count}} de la conturi active', + viewAll: 'Vezi tot', + spotCount: '{{count}} spoturi', + }, + leaderboard: { + mapEarn: 'Cartografiază & câștigă', + helpMap: 'AJUTĂ LA CARTOGRAFIEREA LUMII', + intro: 'Adaugă spoturi și magazine, primești zap-uri de la skateri recunoscători. Principalii contribuitori pot primi recompense bonus!', + howItWorks: 'Cum funcționează', + step1Title: '1. Cartografiază', + step1Desc: 'Adaugă spoturi & magazine cu poze și detalii', + step2Title: '2. Câștigă zap-uri', + step2Desc: 'Skaterii care consideră utile spoturile tale îți vor da bacșiș', + step3Title: '3. Recompense bonus', + step3Desc: 'Top cartografii pot primi recompense bonus din fondul nostru', + proTips: '💡 Sfaturi pro pentru mai multe zap-uri:', + tipPhotos: 'Adaugă 3+ poze', + tipDescriptions: 'Scrie descrieri detaliate', + tipLocation: 'Locație exactă', + mapShop: 'Cartografiază un magazin', + mapShopDesc: 'Magazine de skate, magazine de plăci', + mapSpot: 'Cartografiază un spot', + mapSpotDesc: 'Parcuri, spoturi de stradă, DIY', + shops: 'Magazine', + spotsLower: 'spoturi', + shopsLower: 'magazine', + contributions: 'contribuții', + yourRanking: 'Clasamentul tău', + spotsShops: '{{spots}} spoturi • {{shops}} magazine', + totalLower: 'total', + overall: 'General', + noContributions: 'Încă nicio contribuție. Fii primul!', + addFirstSpot: 'Adaugă primul spot', + noShops: 'Încă niciun magazin cartografiat', + addFirstShop: 'Adaugă primul magazin', + noSpots: 'Încă niciun spot cartografiat', + poweredBy: 'Alimentat de zap-urile comunității', + poweredByDesc: 'Când găsești un spot util, trimite un zap cartografului! Este cea mai bună modalitate de a mulțumi și de a încuraja mai multe contribuții.', + you: 'Tu', + zapTitle: 'Clasamente de zap-uri', + zapSubtitle: 'Spoturile care primesc cea mai multă dragoste — și skaterii care o oferă.', + thisWeek: 'Săptămâna aceasta', + thisMonth: 'Luna aceasta', + allTime: 'Din totdeauna', + topZappedSpots: 'Cele mai zap-uite spoturi', + noZaps: 'Încă niciun zap în această perioadă. Fii primul — apasă ⚡ la un spot care îți place.', + topSupporters: 'Top susținători', + noZapsSent: 'Încă niciun zap trimis în această perioadă.', + fromTop10: '⚡ {{amount}} sats de la top 10', + supporter: 'Susținător', + skateShop: 'Magazin de skate', + skateSpot: 'Spot de skate', + }, + supporters: { + our: 'COMUNITATEA', + community: 'NOASTRĂ', + heroDesc: 'SkateSpots este construit de și pentru comunitate. Susținători, colaboratori, parteneri și prieteni care îl țin gratuit și descentralizat.', + backAngor: 'Susține-ne pe Angor', + backers: 'Susținători', + backersDesc: 'Skateri care au susținut SkateSpots — finanțare on-chain prin Angor și zap-uri Lightning către proiect.', + sourceAngor: 'Angor', + supportersTotals: '{{count}} susținători · {{angor}} sats prin Angor · {{zap}} sats prin zap-uri', + quietNote: 'Plus toți cei care au dat în tăcere — mulțumim. ❤️', + silentTitle: 'Privat on-chain (plăți silențioase)', + silentDesc: 'Un nume, o adresă nouă pentru fiecare plată — on-chain prin plăți silențioase sau Lightning din același înregistrare. Nimic de refolosit, nimic de asociat.', + silentCopyName: 'Copiază numele', + silentCopied: 'Copiat', + silentWallets: 'Necesită un portofel care acceptă nume de plată / plăți silențioase: Sparrow, Cake, Dana, Phoenix, BlueWallet, Wasabi, Nunchuk sau BitBox02.', + wayLightningTitle: 'Instant & public', + wayLightningDesc: 'Trimite un zap SkateSpots sau plătește în liniște. Funcționează și fără autentificare.', + waySilentTitle: 'Privat on-chain', + waySilentDesc: 'Un nume de plăți silențioase — o adresă nouă pentru fiecare plată.', + wayAngorTitle: 'Finanțează construcția', + wayAngorDesc: 'Angor — lansare etapizată, rambursabil peste 100k sats.', + donateTitle: 'Susține SkateSpots', + donateDesc: 'Trei căi, trei motive — alege ce ți se potrivește. Fiecare sat menține harta gratuită, fără reclame și open-source.', + donatePageLink: 'Deschide pagina simplă de donații', + updatedAt: 'Actualizat {{when}}', + tiersNote: 'Niveluri: Susținător sub 100k sats · Patron 100k–1M · Legendă 1M+', + tierEmpty: 'Încă nimeni — fii primul.', + joinSupporters: 'Alătură-te celor {{count}} susținători', + showAll: 'Arată toți {{count}}', + showLess: 'Arată mai puțin', + impactSeeStats: 'Vezi tabloul complet →', + impactAsOf: 'live de pe relay-urile comunității', + anonymousBacker: 'Susținător anonim', + beFirstBacker: 'Încă niciun susținător public — fii primul.', + backersTotal: '{{count}} susținători · {{amount}} sats strânși', + verifiedOnChain: 'Verificat on-chain', + supportedBy: 'Susținut de {{count}}', + tierSupporter: 'Susținător', + tierPatron: 'Patron', + tierLegend: 'Legendă', + topZappers: 'Au zap-uit SkateSpots', + topZappersDesc: 'Skateri care au trimis un zap public direct proiectului. Plățile în liniște nu sunt listate.', + paysFor: 'Ce finanțează sprijinul tău', + paysForDesc: 'Unde ajunge fiecare sat — fără salarii, fără birouri, fără reclame.', + payRelay: 'Găzduirea relay-ului', + payDomain: 'Domeniu & TLS', + payAi: 'Nod AI / ContextVM', + payDev: 'Timp de dezvoltare', + payOps: 'Operațiuni', + payMarketing: 'Marketing', + payRelayDesc: 'Menține harta online și rezistentă.', + payDomainDesc: 'Numele, certificatul, conexiunea securizată.', + payAiDesc: 'Sasquatch, ghidul comunității.', + payDevDesc: 'Construirea și repararea SkateSpots.', + payOpsDesc: 'Munca nepretențioasă care îl ține în funcțiune.', + payMarketingDesc: 'Ajungerea la scene locale și magazine de skate noi.', + impact: 'Impactul de până acum', + impactDesc: 'Ce a construit comunitatea — finanțat de skateri.', + impactSpots: 'Spoturi', + impactCrews: 'Echipe', + impactEvents: 'Evenimente', + impactLab: 'Profesioniști din Lab', + impactShops: 'Magazine', + impactMappers: 'Cartografi', + support: 'Susține', + supportDesc: 'Finanțează SkateSpots pe Angor — finanțare Bitcoin descentralizată, on-chain. Fără intermediari, fără KYC.', + collaborators: 'Colaboratori', + collaboratorsDesc: 'Oameni care construiesc activ SkateSpots — dezvoltatori, designeri, operatori de relay.', + partners: 'Parteneri', + partnersDesc: 'Organizații și proiecte cu care lucrăm îndeaproape.', + friends: 'Prieteni', + friendsDesc: 'Oameni cu care rezonăm.', + backTitle: 'Susține proiectul pe Angor', + backDesc: 'Angor este o finanțare Bitcoin descentralizată, on-chain, construită pe Nostr — fondurile tale rămân sub controlul tău, eliberate în etape, fără un custode care să țină potul. Contribuțiile până la 100.000 sats funcționează ca o donație (fără handshake de recuperare); sumele mai mari sunt investiții ale căror fonduri necheltuite pot fi recuperate. Fiecare sat merge către dezvoltare, găzduirea relay-ului și menținerea SkateSpots gratuit pentru fiecare skater de pe pământ.', + donateNote: 'Preferi o donație directă? ⚡ Trimite un zap mai jos — nimic de rambursat, nimic de recuperat.', + openAngor: 'Deschide Angor', + orZap: 'sau ⚡ trimite un zap direct oricărui spot, echipă sau creator din aplicație', + wantCollaborate: 'Vrei să colaborezi?', + wantCollaborateDesc: 'Dezvoltatori, designeri, skateri cu competențe — scrie-ne.', + viewNostrHub: 'Vezi pe NostrHub', + wantPartner: 'Vrei să fii partener SkateSpots? Scrie-ne pe Nostr.', + comingSoon: 'În curând', + wantListed: 'Vrei să apari aici?', + wantListedDesc: 'Trimite un logo (PNG/WebP, fundal transparent, minim 200×200px) și URL-ul tău printr-un DM pe Nostr, doar dacă ai vibrația potrivită.', + whyTitle1: 'De ce avem nevoie de', + whyTitle2: 'sprijin', + whyDesc: 'SkateSpots este 100% gratuit, open-source și construit pe Nostr — un protocol descentralizat fără server central care să îl închidă. Fără reclame, fără vânzare de date, fără investitori. Fiecare sat merge direct către dezvoltare, găzduirea relay-ului și menținerea acestui lucru gratuit pentru fiecare skater de pe pământ.', + why1Title: 'Nativ Nostr', + why1Desc: 'Fără server central. Datele tale trăiesc pe relay-urile pe care le alegi.', + why2Title: 'Alimentat de Bitcoin', + why2Desc: 'Câștigă sats pentru cartografierea spoturilor. Cheltuiește-i la magazinele locale.', + why3Title: 'Gratuit pentru totdeauna', + why3Desc: 'Open source, fără paywall-uri, fără urmărire, fără finanțare VC.', + thankYou: 'Mulțumim. Fiecare sat ține spoturile pe hartă. 🛹⚡', + license: 'Licență', + faq: 'Întrebări frecvente', + }, + admin: { + confirmed: 'Confirmat', + title: 'Coadă de verificare', + subtitle: 'Spoturi, magazine, evenimente, tururi și echipament care declanșează semnalele de junk. Ascunde și Confirmă sunt etichete blânde, reversibile; raportările au prioritate. Nimic nu este șters.', + tabReports: 'Raportări', + tabSpots: 'Spoturi', + tabShops: 'Magazine', + tabEvents: 'Evenimente', + tabTours: 'Tururi', + tabGear: 'Echipament', + tabCrews: 'Echipe', + tabLab: 'Lab', + tabClaims: 'Revendicări', + nothingToReview: 'Nimic de verificat — nimic de acest tip nu declanșează semnalele de junk.', + hideActioned: 'Ascunde procesate', + showActioned: 'Arată procesate ({{count}})', + undoAll: 'Anulează toate {{count}}', + undoAllTitle: 'Anulezi fiecare verdict din acest tab?', + undoAllDesc: 'Aceasta readuce fiecare element la neutru — nici ascuns, nici confirmat. Publică o etichetă publică per element, așa că cu Amber vei primi {{count}} ecrane de aprobare.', + undoCount: 'Anulează {{count}}', + undo: 'Anulează', + confirm: 'Confirmă', + hide: 'Ascunde', + hideIt: 'Ascunde-l', + hideForEveryone: 'Ascunzi asta pentru toată lumea?', + hideForEveryoneDesc: 'Aceasta elimină elementul din răsfoire și căutare pentru fiecare utilizator SkateSpots. Este o etichetă publică și reversibilă — o poți anula din această coadă.', + hidden: 'Ascuns', + hiddenDesc: 'Eliminat din aplicație printr-o etichetă publică. Reversibil.', + couldNotHide: 'Nu s-a putut ascunde', + notASpot: 'Nu este un spot de skate', + lookAtIt: 'Privește-l', + }, + profile: { + nip05Verified: 'Verificat NIP-05', + nip05NotVerified: 'NIP-05 neverificat pentru această cheie', + message: 'Mesaj', + zapsReceived: 'zap-uri primite', + memberSince: 'Membru din', + badges: 'Insigne', + sponsorsSupport: 'Sponsori & sprijin', + skater: 'Skater', + stance: 'Postură', + skating: 'Skateboarding', + homeSpot: 'Spotul de acasă', + basedIn: 'Bazat în', + addSkateDetails: 'Adaugă detaliile tale de skate', + addSkateDetailsDesc: 'Setează-ți postura, stilurile & nivelul pentru a apărea în directorul de skateri.', + spotsAdded: 'Spoturi adăugate', + shopsAdded: 'Magazine adăugate', + noSpots: 'Nu ai adăugat încă niciun spot', + noSpotsDesc: 'Pune-ți spotul local pe hartă →', + stash: 'Stash', + gear: 'Echipament', + crews: 'Echipe', + info: 'Informații', + lightning: 'Lightning', + silentPayment: 'Plată silențioasă', + coordinator: 'Coordinator', + coordinatorAdded: 'Coordinator adăugat', + add: 'Adaugă', + messagePrivately: 'Trimite mesaj privat', + founder: 'Fondator', + member: 'Membru', + supportSkater: 'Susține acest skater', + supportSkaterDesc: 'Trimite un bacșiș pentru a le mulțumi pentru contribuțiile lor', + }, + index: { + joinCommunity: 'Alătură-te comunității pentru a adăuga spoturi, a crea evenimente & multe altele', + topZapped: 'CELE MAI ZAP-UITE', + topZappedDesc: 'Cele mai susținute spoturi luna aceasta', + leaderboard: 'Clasament', + newHere: 'NOU PE AICI?', + newHereDesc: 'Creează un cont gratuit pentru a adăuga spoturi, a te alătura evenimentelor, a comunica cu skateri și a deveni parte din comunitate. Nu e nevoie de email.', + followFounder: 'Urmărește fondatorul', + followFounderDesc: 'Ține apăsat pe avatar 3 secunde pentru a urmări și a rămâne la curent cu funcțiile și evenimentele noi!', + createAccount: 'Creează cont', + accountWorks: 'Contul tău funcționează în toate aplicațiile din rețea', + footerTagline: 'Open Source • Deținut de comunitate • Fără reclame', + }, + stash: { + title: 'Stash-ul meu', + loginDesc: 'Inventarul tău privat de echipament. Urmărește ce deții, setează prețuri și partajează selectiv cu alți comercianți.', + encrypted: 'Criptat', + syncsEverywhere: 'Se sincronizează peste tot', + p2pTrading: 'Schimb P2P', + encryptionRequired: 'Criptare necesară', + encryptionRequiredDesc: 'Stash-ul tău este criptat pentru confidențialitate. Te rugăm să folosești un semnatar care acceptă criptarea NIP-44 (precum Alby, nos2x sau Amber).', + learnSigners: 'Află despre semnatari', + select: 'Selectează', + stash: 'Stash', + wishlist: 'Listă de dorințe', + allCategories: 'Toate categoriile', + sortNewest: 'Cele mai noi', + sortValue: 'Valoare', + sortCondition: 'Stare', + sortAz: 'A–Z', + friendsOnly: 'Doar prieteni', + addToWishlist: 'Adaugă la lista de dorințe', + addItemToStash: 'Adaugă articol în Stash', + addItem: 'Adaugă articol', + editItem: 'Editează articolul', + publicStash: 'Stash public', + listView: 'Vizualizare listă', + gridView: 'Vizualizare grilă', + uploading: 'Se încarcă...', + addPhotos: 'Adaugă poze', + wishlistReqPlaceholder: 'Orice cerințe specifice...', + itemDescPlaceholder: 'Descrie articolul, eventuale deteriorări...', + itemsCount: '{{count}} articol(e)', + wishlistEmpty: 'Lista de dorințe este goală', + wishlistEmptyDesc: 'Adaugă echipamentul pe care îl cauți — te vom potrivi cu stash-urile prietenilor.', + stashEmpty: 'Stash-ul tău este gol', + stashEmptyDesc: 'Începe să-ți urmărești echipamentul. Plăci, axe, pantofi — adaugă o dată, accesează peste tot prin Nostr.', + noMatch: 'Niciun articol nu corespunde', + noMatchDesc: 'Încearcă să ajustezi filtrele.', + backupTransfer: 'Copie de siguranță & transfer', + backupDesc: 'Stash-ul tău este criptat pe Nostr. Păstrează o copie pe care o controlezi — un relay mort sau un cont nou nu-ți pot pierde lista de echipament.', + exportTitle: 'Copie de siguranță criptată', + exportDialogDesc: 'Salvează {{count}} articol(e) într-un fișier. Criptează-l, astfel încât un fișier scurs să nu fie o scurgere.', + modePassword: 'Parolă', + modeKey: 'Cheia mea', + password: 'Parolă', + confirmPassword: 'Confirmă parola', + passwordHint: 'Folosește cel puțin 8 caractere. Nu există recuperare — nu o uita.', + keyModeHint: 'Criptat cu cheia ta Nostr. Doar acea cheie îl poate deschide — nimic de reținut.', + exportPlaintext: 'Exportă fără criptare', + pwTooShort: 'Folosește cel puțin 8 caractere.', + pwMismatch: 'Parolele nu se potrivesc.', + exportFailed: 'Nu s-a putut crea copia de siguranță.', + unlockTitle: 'Deblochează copia de siguranță', + unlockDesc: 'Această copie de siguranță este protejată cu parolă.', + unlock: 'Deblochează', + unlockFailed: 'Nu s-a putut debloca copia de siguranță.', + show: 'Arată', + hide: 'Ascunde', + strength: 'Puterea parolei', + strengthWeak: 'Slabă', + strengthFair: 'Acceptabilă', + strengthGood: 'Bună', + strengthStrong: 'Puternică', + filenameWillSave: 'Se va salva ca {{name}}', + export: 'Exportă', + import: 'Importă', + exported: 'Stash exportat', + exportedDesc: '{{count}} articole salvate într-un fișier.', + noItemsInFile: 'Nu s-a găsit niciun articol în acel fișier.', + noValidItems: 'Nu s-a găsit niciun articol valid în acel fișier.', + imported: 'Am importat {{count}} articole', + importSkipped: '{{count}} omise (deja în stash-ul tău).', + importAdded: 'Adăugat în stash-ul tău.', + importFailed: 'Importul a eșuat', + couldNotRead: 'Nu s-a putut citi acel fișier.', + updateFailed: 'Nu s-a putut actualiza stash-ul', + updatedCount: 'Am actualizat {{count}} articole', + markedForSale: 'Am marcat {{count}} pentru vânzare', + unmarkedCount: 'Am demarcat {{count}}', + removedCount: 'Am eliminat {{count}} articole', + selectedCount: '{{count}} selectate', + selectAll: 'Selectează tot', + visibilityPublic: 'Public', + visibilityPrivate: 'Privat', + forSale: 'De vânzare', + remove: 'Elimină', + bulkDeleteTitle: 'Elimini {{count}} articole?', + bulkDeleteDesc: 'Aceasta rescrie stash-ul tău criptat într-o singură semnătură și nu poate fi anulată aici. Exportă mai întâi o copie de siguranță dacă nu ești sigur.', + deleteTitle: 'Elimini din stash-ul tău?', + deleteDesc: '„{{title}}” va fi eliminat din stash-ul tău', + deleteDescPublic: ' și scos din vitrina ta publică', + deleteUndone: '. Aceasta nu poate fi anulată.', + deleteDescGeneric: 'Acest articol va fi eliminat din stash-ul tău. Aceasta nu poate fi anulată.', + listOnMarketplace: 'Listează pe Marketplace', + noPriceSet: 'Niciun preț setat', + categoryLabel: 'Categorie', + photosLabel: 'Poze', + willingToSell: 'Dispus să vândă', + willingToTrade: 'Dispus să facă schimb', + whereIsThisItem: 'Unde este acest articol?', + visibilityLabel: 'Vizibilitate', + visibilityPrivateOnlyYou: 'Privat - Doar tu', + visibilityFriendsMutual: 'Prieteni - Urmăriri reciproce', + visibilityPublicAnyone: 'Public - Oricine', + visibilityFriends: 'Prieteni', + brandLabel: 'Brand', + sizeLabel: 'Mărime', + descriptionLabel: 'Descriere', + conditionLabel: 'Stare', + itemName: 'Numele articolului', + saveChanges: 'Salvează modificările', + listItemDialogTitle: 'Listează „{{title}}”', + pickUpWhere: 'De unde pot ridica cumpărătorii acest articol?', + linkToSpot: 'Leagă de un spot de skate', + linkToSpotDesc: 'Ideal pentru vânzări locale • Apare pe pagina spotului & pe hartă', + recommended: 'Recomandat', + noSpecificSpot: 'Niciun spot specific', + noSpecificSpotDesc: 'Vizibil doar pe pagina Marketplace', + tipLinkedSpots: '💡 Sfat: anunțurile legate de spoturi sunt mai ușor de găsit pentru skaterii locali.', + anyoneCanSee: 'Oricine le poate vedea pe profilul tău.', + seeWhatOthersSee: 'Vezi ce văd ceilalți', + inventory: 'Inventar', + publicWantsNote: 'Dorințele publice sunt postate pe Marketplace ca anunțuri „căut”, astfel încât vânzătorii să te poată găsi.', + howItWorks: 'Cum funcționează', + tapToMarketplace: 'Atinge pentru a merge la Marketplace →', + viewWishlist: 'Vezi lista de dorințe', + tipEditItems: 'Editează articolele cu butonul creion', + tipListForSale: 'Listează pentru vânzare cu butonul magazin', + tipAddPhotos: 'Adaugă poze pentru oferte de schimb mai bune', + tipKeySyncs: 'Cheia Nostr se sincronizează pe toate dispozitivele', + itemsReadyToSell: '{{count}} articol(e) gata de vânzare', + }, + }, +}; + +export default roBatch4; diff --git a/src/i18n/ro/batch5.ts b/src/i18n/ro/batch5.ts new file mode 100644 index 0000000..e037e5e --- /dev/null +++ b/src/i18n/ro/batch5.ts @@ -0,0 +1,4 @@ +/** ro — batch 5. Filled by the translation pass; empty until then. */ +const roBatch5 = {}; + +export default roBatch5; diff --git a/src/i18n/ro/batch6.ts b/src/i18n/ro/batch6.ts new file mode 100644 index 0000000..a02ec83 --- /dev/null +++ b/src/i18n/ro/batch6.ts @@ -0,0 +1,4 @@ +/** ro — batch 6. Filled by the translation pass; empty until then. */ +const roBatch6 = {}; + +export default roBatch6; diff --git a/src/i18n/ro/batch7.ts b/src/i18n/ro/batch7.ts new file mode 100644 index 0000000..ae5f540 --- /dev/null +++ b/src/i18n/ro/batch7.ts @@ -0,0 +1,4 @@ +/** ro — batch 7. Filled by the translation pass; empty until then. */ +const roBatch7 = {}; + +export default roBatch7; diff --git a/src/i18n/ro/batch8.ts b/src/i18n/ro/batch8.ts new file mode 100644 index 0000000..d3f60cd --- /dev/null +++ b/src/i18n/ro/batch8.ts @@ -0,0 +1,4 @@ +/** ro — batch 8. Filled by the translation pass; empty until then. */ +const roBatch8 = {}; + +export default roBatch8; diff --git a/src/i18n/ro/index.ts b/src/i18n/ro/index.ts new file mode 100644 index 0000000..cc91aff --- /dev/null +++ b/src/i18n/ro/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const ro = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default ro; diff --git a/src/i18n/sv/batch1.ts b/src/i18n/sv/batch1.ts new file mode 100644 index 0000000..69e36c1 --- /dev/null +++ b/src/i18n/sv/batch1.ts @@ -0,0 +1,4 @@ +/** sv — batch 1. Filled by the translation pass; empty until then. */ +const svBatch1 = {}; + +export default svBatch1; diff --git a/src/i18n/sv/batch2.ts b/src/i18n/sv/batch2.ts new file mode 100644 index 0000000..8bfe339 --- /dev/null +++ b/src/i18n/sv/batch2.ts @@ -0,0 +1,4 @@ +/** sv — batch 2. Filled by the translation pass; empty until then. */ +const svBatch2 = {}; + +export default svBatch2; diff --git a/src/i18n/sv/batch3.ts b/src/i18n/sv/batch3.ts new file mode 100644 index 0000000..5d32de2 --- /dev/null +++ b/src/i18n/sv/batch3.ts @@ -0,0 +1,4 @@ +/** sv — batch 3. Filled by the translation pass; empty until then. */ +const svBatch3 = {}; + +export default svBatch3; diff --git a/src/i18n/sv/batch4.ts b/src/i18n/sv/batch4.ts new file mode 100644 index 0000000..2e7df49 --- /dev/null +++ b/src/i18n/sv/batch4.ts @@ -0,0 +1,4 @@ +/** sv — batch 4. Filled by the translation pass; empty until then. */ +const svBatch4 = {}; + +export default svBatch4; diff --git a/src/i18n/sv/batch5.ts b/src/i18n/sv/batch5.ts new file mode 100644 index 0000000..fda8a79 --- /dev/null +++ b/src/i18n/sv/batch5.ts @@ -0,0 +1,4 @@ +/** sv — batch 5. Filled by the translation pass; empty until then. */ +const svBatch5 = {}; + +export default svBatch5; diff --git a/src/i18n/sv/batch6.ts b/src/i18n/sv/batch6.ts new file mode 100644 index 0000000..163bf15 --- /dev/null +++ b/src/i18n/sv/batch6.ts @@ -0,0 +1,4 @@ +/** sv — batch 6. Filled by the translation pass; empty until then. */ +const svBatch6 = {}; + +export default svBatch6; diff --git a/src/i18n/sv/batch7.ts b/src/i18n/sv/batch7.ts new file mode 100644 index 0000000..ea8294f --- /dev/null +++ b/src/i18n/sv/batch7.ts @@ -0,0 +1,4 @@ +/** sv — batch 7. Filled by the translation pass; empty until then. */ +const svBatch7 = {}; + +export default svBatch7; diff --git a/src/i18n/sv/batch8.ts b/src/i18n/sv/batch8.ts new file mode 100644 index 0000000..3bd2aec --- /dev/null +++ b/src/i18n/sv/batch8.ts @@ -0,0 +1,4 @@ +/** sv — batch 8. Filled by the translation pass; empty until then. */ +const svBatch8 = {}; + +export default svBatch8; diff --git a/src/i18n/sv/index.ts b/src/i18n/sv/index.ts new file mode 100644 index 0000000..c22a7e7 --- /dev/null +++ b/src/i18n/sv/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const sv = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default sv; diff --git a/src/i18n/tr/batch1.ts b/src/i18n/tr/batch1.ts new file mode 100644 index 0000000..29cbb0d --- /dev/null +++ b/src/i18n/tr/batch1.ts @@ -0,0 +1,4 @@ +/** tr — batch 1. Filled by the translation pass; empty until then. */ +const trBatch1 = {}; + +export default trBatch1; diff --git a/src/i18n/tr/batch2.ts b/src/i18n/tr/batch2.ts new file mode 100644 index 0000000..94a8005 --- /dev/null +++ b/src/i18n/tr/batch2.ts @@ -0,0 +1,4 @@ +/** tr — batch 2. Filled by the translation pass; empty until then. */ +const trBatch2 = {}; + +export default trBatch2; diff --git a/src/i18n/tr/batch3.ts b/src/i18n/tr/batch3.ts new file mode 100644 index 0000000..7aba7b9 --- /dev/null +++ b/src/i18n/tr/batch3.ts @@ -0,0 +1,4 @@ +/** tr — batch 3. Filled by the translation pass; empty until then. */ +const trBatch3 = {}; + +export default trBatch3; diff --git a/src/i18n/tr/batch4.ts b/src/i18n/tr/batch4.ts new file mode 100644 index 0000000..3ae1d28 --- /dev/null +++ b/src/i18n/tr/batch4.ts @@ -0,0 +1,4 @@ +/** tr — batch 4. Filled by the translation pass; empty until then. */ +const trBatch4 = {}; + +export default trBatch4; diff --git a/src/i18n/tr/batch5.ts b/src/i18n/tr/batch5.ts new file mode 100644 index 0000000..51b691b --- /dev/null +++ b/src/i18n/tr/batch5.ts @@ -0,0 +1,4 @@ +/** tr — batch 5. Filled by the translation pass; empty until then. */ +const trBatch5 = {}; + +export default trBatch5; diff --git a/src/i18n/tr/batch6.ts b/src/i18n/tr/batch6.ts new file mode 100644 index 0000000..dbd9289 --- /dev/null +++ b/src/i18n/tr/batch6.ts @@ -0,0 +1,4 @@ +/** tr — batch 6. Filled by the translation pass; empty until then. */ +const trBatch6 = {}; + +export default trBatch6; diff --git a/src/i18n/tr/batch7.ts b/src/i18n/tr/batch7.ts new file mode 100644 index 0000000..9560e59 --- /dev/null +++ b/src/i18n/tr/batch7.ts @@ -0,0 +1,4 @@ +/** tr — batch 7. Filled by the translation pass; empty until then. */ +const trBatch7 = {}; + +export default trBatch7; diff --git a/src/i18n/tr/batch8.ts b/src/i18n/tr/batch8.ts new file mode 100644 index 0000000..866bd1c --- /dev/null +++ b/src/i18n/tr/batch8.ts @@ -0,0 +1,4 @@ +/** tr — batch 8. Filled by the translation pass; empty until then. */ +const trBatch8 = {}; + +export default trBatch8; diff --git a/src/i18n/tr/index.ts b/src/i18n/tr/index.ts new file mode 100644 index 0000000..4ab9fc9 --- /dev/null +++ b/src/i18n/tr/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const tr = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default tr; diff --git a/src/i18n/uk/batch1.ts b/src/i18n/uk/batch1.ts new file mode 100644 index 0000000..825bb7e --- /dev/null +++ b/src/i18n/uk/batch1.ts @@ -0,0 +1,4 @@ +/** uk — batch 1. Filled by the translation pass; empty until then. */ +const ukBatch1 = {}; + +export default ukBatch1; diff --git a/src/i18n/uk/batch2.ts b/src/i18n/uk/batch2.ts new file mode 100644 index 0000000..02f75bd --- /dev/null +++ b/src/i18n/uk/batch2.ts @@ -0,0 +1,4 @@ +/** uk — batch 2. Filled by the translation pass; empty until then. */ +const ukBatch2 = {}; + +export default ukBatch2; diff --git a/src/i18n/uk/batch3.ts b/src/i18n/uk/batch3.ts new file mode 100644 index 0000000..f1bee88 --- /dev/null +++ b/src/i18n/uk/batch3.ts @@ -0,0 +1,4 @@ +/** uk — batch 3. Filled by the translation pass; empty until then. */ +const ukBatch3 = {}; + +export default ukBatch3; diff --git a/src/i18n/uk/batch4.ts b/src/i18n/uk/batch4.ts new file mode 100644 index 0000000..1106ecb --- /dev/null +++ b/src/i18n/uk/batch4.ts @@ -0,0 +1,4 @@ +/** uk — batch 4. Filled by the translation pass; empty until then. */ +const ukBatch4 = {}; + +export default ukBatch4; diff --git a/src/i18n/uk/batch5.ts b/src/i18n/uk/batch5.ts new file mode 100644 index 0000000..96cf6aa --- /dev/null +++ b/src/i18n/uk/batch5.ts @@ -0,0 +1,4 @@ +/** uk — batch 5. Filled by the translation pass; empty until then. */ +const ukBatch5 = {}; + +export default ukBatch5; diff --git a/src/i18n/uk/batch6.ts b/src/i18n/uk/batch6.ts new file mode 100644 index 0000000..c3e2cbf --- /dev/null +++ b/src/i18n/uk/batch6.ts @@ -0,0 +1,4 @@ +/** uk — batch 6. Filled by the translation pass; empty until then. */ +const ukBatch6 = {}; + +export default ukBatch6; diff --git a/src/i18n/uk/batch7.ts b/src/i18n/uk/batch7.ts new file mode 100644 index 0000000..6a5398a --- /dev/null +++ b/src/i18n/uk/batch7.ts @@ -0,0 +1,4 @@ +/** uk — batch 7. Filled by the translation pass; empty until then. */ +const ukBatch7 = {}; + +export default ukBatch7; diff --git a/src/i18n/uk/batch8.ts b/src/i18n/uk/batch8.ts new file mode 100644 index 0000000..8e157fe --- /dev/null +++ b/src/i18n/uk/batch8.ts @@ -0,0 +1,4 @@ +/** uk — batch 8. Filled by the translation pass; empty until then. */ +const ukBatch8 = {}; + +export default ukBatch8; diff --git a/src/i18n/uk/index.ts b/src/i18n/uk/index.ts new file mode 100644 index 0000000..0dc6d51 --- /dev/null +++ b/src/i18n/uk/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const uk = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default uk; diff --git a/src/i18n/vi/batch1.ts b/src/i18n/vi/batch1.ts new file mode 100644 index 0000000..7850130 --- /dev/null +++ b/src/i18n/vi/batch1.ts @@ -0,0 +1,4 @@ +/** vi — batch 1. Filled by the translation pass; empty until then. */ +const viBatch1 = {}; + +export default viBatch1; diff --git a/src/i18n/vi/batch2.ts b/src/i18n/vi/batch2.ts new file mode 100644 index 0000000..2f5dc2e --- /dev/null +++ b/src/i18n/vi/batch2.ts @@ -0,0 +1,4 @@ +/** vi — batch 2. Filled by the translation pass; empty until then. */ +const viBatch2 = {}; + +export default viBatch2; diff --git a/src/i18n/vi/batch3.ts b/src/i18n/vi/batch3.ts new file mode 100644 index 0000000..e8cf8d2 --- /dev/null +++ b/src/i18n/vi/batch3.ts @@ -0,0 +1,4 @@ +/** vi — batch 3. Filled by the translation pass; empty until then. */ +const viBatch3 = {}; + +export default viBatch3; diff --git a/src/i18n/vi/batch4.ts b/src/i18n/vi/batch4.ts new file mode 100644 index 0000000..2793db8 --- /dev/null +++ b/src/i18n/vi/batch4.ts @@ -0,0 +1,4 @@ +/** vi — batch 4. Filled by the translation pass; empty until then. */ +const viBatch4 = {}; + +export default viBatch4; diff --git a/src/i18n/vi/batch5.ts b/src/i18n/vi/batch5.ts new file mode 100644 index 0000000..7489991 --- /dev/null +++ b/src/i18n/vi/batch5.ts @@ -0,0 +1,4 @@ +/** vi — batch 5. Filled by the translation pass; empty until then. */ +const viBatch5 = {}; + +export default viBatch5; diff --git a/src/i18n/vi/batch6.ts b/src/i18n/vi/batch6.ts new file mode 100644 index 0000000..aa02432 --- /dev/null +++ b/src/i18n/vi/batch6.ts @@ -0,0 +1,4 @@ +/** vi — batch 6. Filled by the translation pass; empty until then. */ +const viBatch6 = {}; + +export default viBatch6; diff --git a/src/i18n/vi/batch7.ts b/src/i18n/vi/batch7.ts new file mode 100644 index 0000000..ee76955 --- /dev/null +++ b/src/i18n/vi/batch7.ts @@ -0,0 +1,4 @@ +/** vi — batch 7. Filled by the translation pass; empty until then. */ +const viBatch7 = {}; + +export default viBatch7; diff --git a/src/i18n/vi/batch8.ts b/src/i18n/vi/batch8.ts new file mode 100644 index 0000000..783b409 --- /dev/null +++ b/src/i18n/vi/batch8.ts @@ -0,0 +1,4 @@ +/** vi — batch 8. Filled by the translation pass; empty until then. */ +const viBatch8 = {}; + +export default viBatch8; diff --git a/src/i18n/vi/index.ts b/src/i18n/vi/index.ts new file mode 100644 index 0000000..2523ec2 --- /dev/null +++ b/src/i18n/vi/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const vi = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default vi; diff --git a/src/i18n/zh-CN/batch1.ts b/src/i18n/zh-CN/batch1.ts new file mode 100644 index 0000000..53c01d3 --- /dev/null +++ b/src/i18n/zh-CN/batch1.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 1. Filled by the translation pass; empty until then. */ +const zhCNBatch1 = {}; + +export default zhCNBatch1; diff --git a/src/i18n/zh-CN/batch2.ts b/src/i18n/zh-CN/batch2.ts new file mode 100644 index 0000000..d174e55 --- /dev/null +++ b/src/i18n/zh-CN/batch2.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 2. Filled by the translation pass; empty until then. */ +const zhCNBatch2 = {}; + +export default zhCNBatch2; diff --git a/src/i18n/zh-CN/batch3.ts b/src/i18n/zh-CN/batch3.ts new file mode 100644 index 0000000..48b2da1 --- /dev/null +++ b/src/i18n/zh-CN/batch3.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 3. Filled by the translation pass; empty until then. */ +const zhCNBatch3 = {}; + +export default zhCNBatch3; diff --git a/src/i18n/zh-CN/batch4.ts b/src/i18n/zh-CN/batch4.ts new file mode 100644 index 0000000..ae2e2f6 --- /dev/null +++ b/src/i18n/zh-CN/batch4.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 4. Filled by the translation pass; empty until then. */ +const zhCNBatch4 = {}; + +export default zhCNBatch4; diff --git a/src/i18n/zh-CN/batch5.ts b/src/i18n/zh-CN/batch5.ts new file mode 100644 index 0000000..e207b13 --- /dev/null +++ b/src/i18n/zh-CN/batch5.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 5. Filled by the translation pass; empty until then. */ +const zhCNBatch5 = {}; + +export default zhCNBatch5; diff --git a/src/i18n/zh-CN/batch6.ts b/src/i18n/zh-CN/batch6.ts new file mode 100644 index 0000000..1d444d5 --- /dev/null +++ b/src/i18n/zh-CN/batch6.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 6. Filled by the translation pass; empty until then. */ +const zhCNBatch6 = {}; + +export default zhCNBatch6; diff --git a/src/i18n/zh-CN/batch7.ts b/src/i18n/zh-CN/batch7.ts new file mode 100644 index 0000000..616fc0c --- /dev/null +++ b/src/i18n/zh-CN/batch7.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 7. Filled by the translation pass; empty until then. */ +const zhCNBatch7 = {}; + +export default zhCNBatch7; diff --git a/src/i18n/zh-CN/batch8.ts b/src/i18n/zh-CN/batch8.ts new file mode 100644 index 0000000..229629a --- /dev/null +++ b/src/i18n/zh-CN/batch8.ts @@ -0,0 +1,4 @@ +/** zh-CN — batch 8. Filled by the translation pass; empty until then. */ +const zhCNBatch8 = {}; + +export default zhCNBatch8; diff --git a/src/i18n/zh-CN/index.ts b/src/i18n/zh-CN/index.ts new file mode 100644 index 0000000..51216f5 --- /dev/null +++ b/src/i18n/zh-CN/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const zhCN = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default zhCN; diff --git a/src/i18n/zh-TW/batch1.ts b/src/i18n/zh-TW/batch1.ts new file mode 100644 index 0000000..4b0fe76 --- /dev/null +++ b/src/i18n/zh-TW/batch1.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 1. Filled by the translation pass; empty until then. */ +const zhTWBatch1 = {}; + +export default zhTWBatch1; diff --git a/src/i18n/zh-TW/batch2.ts b/src/i18n/zh-TW/batch2.ts new file mode 100644 index 0000000..19ca8cf --- /dev/null +++ b/src/i18n/zh-TW/batch2.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 2. Filled by the translation pass; empty until then. */ +const zhTWBatch2 = {}; + +export default zhTWBatch2; diff --git a/src/i18n/zh-TW/batch3.ts b/src/i18n/zh-TW/batch3.ts new file mode 100644 index 0000000..60b3253 --- /dev/null +++ b/src/i18n/zh-TW/batch3.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 3. Filled by the translation pass; empty until then. */ +const zhTWBatch3 = {}; + +export default zhTWBatch3; diff --git a/src/i18n/zh-TW/batch4.ts b/src/i18n/zh-TW/batch4.ts new file mode 100644 index 0000000..56570b9 --- /dev/null +++ b/src/i18n/zh-TW/batch4.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 4. Filled by the translation pass; empty until then. */ +const zhTWBatch4 = {}; + +export default zhTWBatch4; diff --git a/src/i18n/zh-TW/batch5.ts b/src/i18n/zh-TW/batch5.ts new file mode 100644 index 0000000..5f82a2e --- /dev/null +++ b/src/i18n/zh-TW/batch5.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 5. Filled by the translation pass; empty until then. */ +const zhTWBatch5 = {}; + +export default zhTWBatch5; diff --git a/src/i18n/zh-TW/batch6.ts b/src/i18n/zh-TW/batch6.ts new file mode 100644 index 0000000..731ee3b --- /dev/null +++ b/src/i18n/zh-TW/batch6.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 6. Filled by the translation pass; empty until then. */ +const zhTWBatch6 = {}; + +export default zhTWBatch6; diff --git a/src/i18n/zh-TW/batch7.ts b/src/i18n/zh-TW/batch7.ts new file mode 100644 index 0000000..a85a08a --- /dev/null +++ b/src/i18n/zh-TW/batch7.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 7. Filled by the translation pass; empty until then. */ +const zhTWBatch7 = {}; + +export default zhTWBatch7; diff --git a/src/i18n/zh-TW/batch8.ts b/src/i18n/zh-TW/batch8.ts new file mode 100644 index 0000000..7e0db86 --- /dev/null +++ b/src/i18n/zh-TW/batch8.ts @@ -0,0 +1,4 @@ +/** zh-TW — batch 8. Filled by the translation pass; empty until then. */ +const zhTWBatch8 = {}; + +export default zhTWBatch8; diff --git a/src/i18n/zh-TW/index.ts b/src/i18n/zh-TW/index.ts new file mode 100644 index 0000000..e7fdae3 --- /dev/null +++ b/src/i18n/zh-TW/index.ts @@ -0,0 +1,21 @@ +import batch1 from './batch1'; +import batch2 from './batch2'; +import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; +import batch8 from './batch8'; + +const zhTW = { + ...batch1, + ...batch2, + ...batch3, + ...batch4, + ...batch5, + ...batch6, + ...batch7, + ...batch8, +}; + +export default zhTW; diff --git a/src/lib/dateFnsI18n.ts b/src/lib/dateFnsI18n.ts index a6d1dd6..815365b 100644 --- a/src/lib/dateFnsI18n.ts +++ b/src/lib/dateFnsI18n.ts @@ -32,6 +32,16 @@ import { pl as plLocale, ru as ruLocale, ko as koLocale, + zhCN as zhCNLocale, + zhTW as zhTWLocale, + uk as ukLocale, + tr as trLocale, + vi as viLocale, + id as idLocale, + sv as svLocale, + cs as csLocale, + ro as roLocale, + el as elLocale, } from 'date-fns/locale'; import type { Locale } from 'date-fns'; import type { Language } from '@/contexts/language'; @@ -74,6 +84,36 @@ export function setDateLocale(language: Language): void { } else if (language === 'ko' || language === 'ko-KP') { activeLocale = koLocale; activeCode = 'ko-KR'; + } else if (language === 'zh-CN') { + activeLocale = zhCNLocale; + activeCode = 'zh-CN'; + } else if (language === 'zh-TW') { + activeLocale = zhTWLocale; + activeCode = 'zh-TW'; + } else if (language === 'uk') { + activeLocale = ukLocale; + activeCode = 'uk-UA'; + } else if (language === 'tr') { + activeLocale = trLocale; + activeCode = 'tr-TR'; + } else if (language === 'vi') { + activeLocale = viLocale; + activeCode = 'vi-VN'; + } else if (language === 'id') { + activeLocale = idLocale; + activeCode = 'id-ID'; + } else if (language === 'sv') { + activeLocale = svLocale; + activeCode = 'sv-SE'; + } else if (language === 'cs') { + activeLocale = csLocale; + activeCode = 'cs-CZ'; + } else if (language === 'ro') { + activeLocale = roLocale; + activeCode = 'ro-RO'; + } else if (language === 'el') { + activeLocale = elLocale; + activeCode = 'el-GR'; } else { activeLocale = enUS; activeCode = 'en-US';